dwww Home | Manual pages | Find package

libppl(3)                       libppl overview                      libppl(3)

NAME
       libppl - the C++ interface of the Parma Polyhedra Library

SYNOPSIS
       #include <ppl.hh>

       c++ file.cc -lppl

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 The Parma  Polyhedra  Library
       User's Manual (version 1.2) for this kind of information.

INCLUDING THE HEADER FILE
       The  C++  interface  of the PPL has only one header file, named ppl.hh.
       So your program should contain a directive of the form

       #include <ppl.hh>

       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 suit-
       able -Idir command line option (see the file INSTALL for information on
       how  to  configure  the library so that it is installed in the place of
       your choice).

INITIALIZING AND FINALIZING THE LIBRARY
       The mere inclusion of ppl.hh 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 fi-
       nalization  is not desirable (e.g., if the application fiddles with the
       GMP's memory allocation functions).  In those cases, every inclusion of
       ppl.hh must take the form

       #define PPL_NO_AUTOMATIC_INITIALIZATION
       #include <ppl.hh>

       When automatic initialization and finalization is disabled you must ab-
       solutely call the function

       void Parma_Polyhedra_Library::initialize()

       before using the library.  It is also a good norm to call the function

       void Parma_Polyhedra_Library::finalize()

       when you are done with the library.

USING THE LIBRARY
       Keeping in mind that there is no substitute for a  careful  reading  of
       The  Parma  Polyhedra Library User's Manual (version 1.2), you can find
       many examples of use in the directories tests (see the README  file  in
       that directory) and demos/ppl_lcdd of the source distribution.

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 -lppl  com-
       mand  line  option  is enough.  In fact, if you use a shared version of
       the library, this automatically records the dependency from the GMP li-
       brary, something that the linker ought to deal with gracefully.  Other-
       wise you will have to add -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 -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
       Program Library HOWTO is especially valuable for GNU/Linux users).

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  std::bad_alloc  ex-
       ception.   Since the library is exception-safe, you can take the appro-
       priate corrective measures (e.g., simplify the polyhedra and/or  select
       less  precise though less complex algorithms), and restart the computa-
       tion.  In order to do that, you should define alternative memory  allo-
       cation  functions for GMP that throw std::bad_alloc upon memory exhaus-
       tion.  For instance:

       #include <new>
       #include <cstdlib>

       extern "C" void*
       cxx_malloc(size_t size) {
         void* p = malloc(size);
         if (p != 0 || size == 0)
           return p;

         throw std::bad_alloc();
       }

       extern "C" void*
       cxx_realloc(void* q, size_t, size_t new_size) {
         void* p = realloc(q, new_size);
         if (p != 0 || new_size == 0)
           return p;

         throw std::bad_alloc();
       }

       extern "C" void
       cxx_free(void* p, size_t) {
         free(p);
       }

       Then you must install these functions and this can be done in two  dif-
       ferent ways:

       (1)    If  your C++ compiler supports __attribute__ ((weak)) and you do
              not have any other special needs, then you can  simply  link  to
              your   application   a   C  function  ppl_set_GMP_memory_alloca-
              tion_functions(void) such as

              extern "C" void
              ppl_set_GMP_memory_allocation_functions(void) {
                mp_set_memory_functions(cxx_malloc, cxx_realloc, cxx_free);
              }

              This is all that you have to do, whether or not you use the  au-
              tomatic  initialization  feature  of the library (see above): in
              any case the initialization procedure  will  automatically  call
              ppl_set_GMP_memory_allocation_functions(void).

       (2)    If  your  C++  compiler  does not support __attribute__ ((weak))
              then you cannot use the automatic initialization feature of  the
              library (see above) and should write a main program of the form

              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();
                ...

USING NATIVE FLOATING POINT NUMBERS
       At initialization time, the Parma Polyhedra Library sets the FPU round-
       ing mode in a way that allows its floating-point-based computations  to
       be  conservative  (i.e., possibly approximated but correct) and reason-
       ably 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

       void Parma_Polyhedra_Library::restore_pre_PPL_rounding()

       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

       void Parma_Polyhedra_Library::set_rounding_for_PPL()

       before invoking any PPL interface related to such abstractions.

SEE ALSO
       ppl-config(1)

       Roberto Bagnara, Patricia M. Hill,  and  Enea  Zaffanella.   The  Parma
       Polyhedra  Library  User's  Manual (version 1.2), available (in several
       formats) at http://bugseng.com/products/ppl/ .

       David A. Wheeler.  Program Library HOWTO, available  (in  several  for-
       mats) at http://www.dwheeler.com/program-library/ .

AVAILABILITY
       The  latest version of the Parma Polyhedra Library and all the documen-
       tation is available at http://bugseng.com/products/ppl/ .

AUTHOR
       See the file CREDITS in the source  distribution  or  use  the  command
       ppl-config --credits for a list of contributors.

REPORTING BUGS
       Report bugs to <ppl-devel@cs.unipr.it>.

COPYRIGHT AND NO WARRANTY
       Copyright (C) 2001-2010 Roberto Bagnara <bagnara@cs.unipr.it> Copyright
       (C) 2010-2016 BUGSENG srl (http://bugseng.com)
       This is free software; see the file COPYING in the source  distribution
       or  use  the  command ppl-config --copying to obtain the copying condi-
       tions.  There is NO warranty; not even for MERCHANTABILITY  or  FITNESS
       FOR A PARTICULAR PURPOSE.

PPL 1.2                          February 2016                       libppl(3)

Generated by dwww version 1.15 on Fri Jun 21 07:44:28 CEST 2024.