summaryrefslogtreecommitdiff
path: root/interfaces/C/C_interface.dox
diff options
context:
space:
mode:
Diffstat (limited to 'interfaces/C/C_interface.dox')
-rw-r--r--interfaces/C/C_interface.dox1754
1 files changed, 1754 insertions, 0 deletions
diff --git a/interfaces/C/C_interface.dox b/interfaces/C/C_interface.dox
new file mode 100644
index 000000000..df185b37b
--- /dev/null
+++ b/interfaces/C/C_interface.dox
@@ -0,0 +1,1754 @@
+/* Doxumentation for the C language interface.
+ Copyright (C) 2001-2010 Roberto Bagnara <bagnara@cs.unipr.it>
+ Copyright (C) 2010-2011 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, 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 <em>creating</em> or <em>assigning</em> a polyhedron object,
+ by means of one of the functions <code>ppl_new_*</code> and
+ <code>ppl_assign_*</code>.
+
+ Having a single datatype does not mean that C and NNC polyhedra can be
+ freely interchanged: as specified in the main manual, most library
+ functions require their arguments to be topologically and/or
+ space-dimension compatible.
+*/
+
+#if !defined(PPL_DOXYGEN_CONFIGURED_MANUAL)
+
+/*! \brief Opaque pointer \ingroup Datatypes */
+typedef struct ppl_Polyhedron_tag* ppl_Polyhedron_t;
+
+/*! \brief Opaque pointer to const object \ingroup Datatypes */
+typedef struct ppl_Polyhedron_tag const* ppl_const_Polyhedron_t;
+
+#endif /* !defined(PPL_DOXYGEN_CONFIGURED_MANUAL) */
+
+/*! \brief \name Constructors and Assignment for C_Polyhedron */
+/*@{*/
+
+/*! \relates ppl_Polyhedron_tag \brief
+ Builds a C polyhedron of dimension \p d and writes an handle to it
+ at address \p pph. If \p empty is different from zero, the newly created
+ polyhedron will be empty; otherwise, it will be a universe polyhedron.
+*/
+int
+ppl_new_C_Polyhedron_from_space_dimension
+(ppl_Polyhedron_t* pph, ppl_dimension_type d, int empty);
+
+/*! \relates ppl_Polyhedron_tag \brief
+ Builds a C polyhedron that is a copy of \p ph; writes a handle
+ for the newly created polyhedron at address \p pph.
+*/
+int
+ppl_new_C_Polyhedron_from_C_Polyhedron
+(ppl_Polyhedron_t* pph, ppl_const_Polyhedron_t ph);
+
+/*! \relates ppl_Polyhedron_tag \brief
+ Builds a C polyhedron that is a copy of \p ph;
+ writes a handle for the newly created polyhedron at address \p pph.
+
+ \note
+ The complexity argument is ignored.
+*/
+int
+ppl_new_C_Polyhedron_from_C_Polyhedron_with_complexity
+(ppl_Polyhedron_t* pph, ppl_const_Polyhedron_t ph, int complexity);
+
+/*! \relates ppl_Polyhedron_tag \brief
+ Builds a new C polyhedron from the system of constraints
+ \p cs and writes a handle for the newly created polyhedron at
+ address \p pph.
+
+ The new polyhedron will inherit the space dimension of \p cs.
+*/
+int
+ppl_new_C_Polyhedron_from_Constraint_System
+(ppl_Polyhedron_t* pph, ppl_const_Constraint_System_t cs);
+
+/*! \relates ppl_Polyhedron_tag \brief
+ Builds a new C polyhedron recycling the system of constraints
+ \p cs and writes a handle for the newly created polyhedron at
+ address \p pph.
+
+ The new polyhedron will inherit the space dimension of \p cs.
+
+ \warning
+ This function modifies the constraint system referenced by \p cs:
+ upon return, no assumption can be made on its value.
+*/
+int
+ppl_new_C_Polyhedron_recycle_Constraint_System
+(ppl_Polyhedron_t* pph, ppl_Constraint_System_t cs);
+
+/*! \relates ppl_Polyhedron_tag \brief
+ Builds a new C polyhedron from the system of congruences \p cs
+ and writes a handle for the newly created polyhedron at address \p pph.
+
+ The new polyhedron will inherit the space dimension of \p cs.
+*/
+int
+ppl_new_C_Polyhedron_from_Congruence_System
+(ppl_Polyhedron_t* pph, ppl_const_Congruence_System_t cs);
+
+/*! \relates ppl_Polyhedron_tag \brief
+ Builds a new C polyhedron recycling the system of congruences
+ \p cs and writes a handle for the newly created polyhedron at
+ address \p pph.
+
+ The new polyhedron will inherit the space dimension of \p cs.
+
+ \warning
+ This function modifies the congruence system referenced by \p cs:
+ upon return, no assumption can be made on its value.
+*/
+int
+ppl_new_C_Polyhedron_recycle_Congruence_System
+(ppl_Polyhedron_t* pph, ppl_Congruence_System_t cs);
+
+/*! \relates ppl_Polyhedron_tag \brief
+ Assigns a copy of the C polyhedron \p src to the C polyhedron \p dst.
+*/
+int
+ppl_assign_C_Polyhedron_from_C_Polyhedron
+(ppl_Polyhedron_t dst, ppl_const_Polyhedron_t src);
+
+/*@}*/ /* Constructors and Assignment for C_Polyhedron */
+
+/*! \brief \name Constructors and Assignment for NNC_Polyhedron */
+/*@{*/
+
+/*! \relates ppl_Polyhedron_tag \brief
+ Builds an NNC polyhedron of dimension \p d and writes an handle to it
+ at address \p pph. If \p empty is different from zero, the newly created
+ polyhedron will be empty; otherwise, it will be a universe polyhedron.
+*/
+int
+ppl_new_NNC_Polyhedron_from_space_dimension
+(ppl_Polyhedron_t* pph, ppl_dimension_type d, int empty);
+
+/*! \relates ppl_Polyhedron_tag \brief
+ Builds an NNC polyhedron that is a copy of \p ph; writes a handle
+ for the newly created polyhedron at address \p pph.
+*/
+int
+ppl_new_NNC_Polyhedron_from_NNC_Polyhedron
+(ppl_Polyhedron_t* pph, ppl_const_Polyhedron_t ph);
+
+/*! \relates ppl_Polyhedron_tag \brief
+ Builds an NNC polyhedron that is a copy of \p ph;
+ writes a handle for the newly created polyhedron at address \p pph.
+
+ \note
+ The complexity argument is ignored.
+*/
+int
+ppl_new_NNC_Polyhedron_from_NNC_Polyhedron_with_complexity
+(ppl_Polyhedron_t* pph, ppl_const_Polyhedron_t ph, int complexity);
+
+/*! \relates ppl_Polyhedron_tag \brief
+ Builds a new NNC polyhedron from the system of constraints
+ \p cs and writes a handle for the newly created polyhedron at
+ address \p pph.
+
+ The new polyhedron will inherit the space dimension of \p cs.
+*/
+int
+ppl_new_NNC_Polyhedron_from_Constraint_System
+(ppl_Polyhedron_t* pph, ppl_const_Constraint_System_t cs);
+
+/*! \relates ppl_Polyhedron_tag \brief
+ Builds a new NNC polyhedron recycling the system of constraints
+ \p cs and writes a handle for the newly created polyhedron at
+ address \p pph.
+
+ The new polyhedron will inherit the space dimension of \p cs.
+
+ \warning
+ This function modifies the constraint system referenced by \p cs:
+ upon return, no assumption can be made on its value.
+*/
+int
+ppl_new_NNC_Polyhedron_recycle_Constraint_System
+(ppl_Polyhedron_t* pph, ppl_Constraint_System_t cs);
+
+/*! \relates ppl_Polyhedron_tag \brief
+ Builds a new NNC polyhedron from the system of congruences
+ \p cs and writes a handle for the newly created polyhedron at
+ address \p pph.
+
+ The new polyhedron will inherit the space dimension of \p cs.
+*/
+int
+ppl_new_NNC_Polyhedron_from_Congruence_System
+PPL_PROTO((ppl_Polyhedron_t* pph, ppl_const_Congruence_System_t cs));
+
+/*! \relates ppl_Polyhedron_tag \brief
+ Builds a new NNC polyhedron recycling the system of congruences
+ \p cs and writes a handle for the newly created polyhedron at
+ address \p pph.
+
+ The new polyhedron will inherit the space dimension of \p cs.
+
+ \warning
+ This function modifies the congruence system referenced by \p cs:
+ upon return, no assumption can be made on its value.
+*/
+int
+ppl_new_NNC_Polyhedron_recycle_Congruence_System
+PPL_PROTO((ppl_Polyhedron_t* pph, ppl_Congruence_System_t cs));
+
+/*! \relates ppl_Polyhedron_tag \brief
+ Assigns a copy of the NNC polyhedron \p src to the NNC
+ polyhedron \p dst.
+*/
+int
+ppl_assign_NNC_Polyhedron_from_NNC_Polyhedron
+(ppl_Polyhedron_t dst, ppl_const_Polyhedron_t src);
+
+/*@}*/ /* Constructors and Assignment for NNC Polyhedron */
+
+/*! \name Constructors Behaving as Conversion Operators
+ Besides the conversions listed here below, the library also
+ provides conversion operators that build a semantic geometric
+ description starting from \b any other semantic geometric
+ description (e.g., ppl_new_Grid_from_C_Polyhedron,
+ ppl_new_C_Polyhedron_from_BD_Shape_mpq_class, etc.).
+ Clearly, the conversion operators are only available if both
+ the source and the target semantic geometric descriptions have
+ been enabled when configuring the library.
+ The conversions also taking as argument a complexity class
+ sometimes provide non-trivial precision/efficiency trade-offs.
+*/
+/*@{*/
+
+/*! \relates ppl_Polyhedron_tag \brief
+ Builds a C polyhedron that is a copy of the topological closure
+ of the NNC polyhedron \p ph; writes a handle for the newly created
+ polyhedron at address \p pph.
+*/
+int
+ppl_new_C_Polyhedron_from_NNC_Polyhedron(ppl_Polyhedron_t* pph,
+ ppl_const_Polyhedron_t ph);
+
+/*! \relates ppl_Polyhedron_tag \brief
+ Builds a C polyhedron that approximates NNC_Polyhedron \p ph,
+ using an algorithm whose complexity does not exceed \p complexity;
+ writes a handle for the newly created polyhedron at address \p pph.
+
+ \note
+ The complexity argument, which can take values
+ \c PPL_COMPLEXITY_CLASS_POLYNOMIAL, \c PPL_COMPLEXITY_CLASS_SIMPLEX
+ and \c PPL_COMPLEXITY_CLASS_ANY, is ignored since the exact constructor
+ has polynomial complexity.
+*/
+int
+ppl_new_C_Polyhedron_from_NNC_Polyhedron_with_complexity
+(ppl_Polyhedron_t* pph, ppl_const_Polyhedron_t ph, int complexity);
+
+/*! \relates ppl_Polyhedron_tag \brief
+ Builds an NNC polyhedron that is a copy of the C polyhedron \p ph;
+ writes a handle for the newly created polyhedron at address \p pph.
+*/
+int
+ppl_new_NNC_Polyhedron_from_C_Polyhedron(ppl_Polyhedron_t* pph,
+ ppl_const_Polyhedron_t ph);
+
+/*! \relates ppl_Polyhedron_tag \brief
+ Builds an NNC polyhedron that approximates C_Polyhedron \p ph,
+ using an algorithm whose complexity does not exceed \p complexity;
+ writes a handle for the newly created polyhedron at address \p pph.
+
+ \note
+ The complexity argument, which can take values
+ \c PPL_COMPLEXITY_CLASS_POLYNOMIAL, \c PPL_COMPLEXITY_CLASS_SIMPLEX
+ and \c PPL_COMPLEXITY_CLASS_ANY, is ignored since the exact constructor
+ has polynomial complexity.
+*/
+int
+ppl_new_NNC_Polyhedron_from_C_Polyhedron_with_complexity
+(ppl_Polyhedron_t* pph, ppl_const_Polyhedron_t ph, int complexity);
+
+/*@}*/ /* Constructors Behaving as Conversion Operators */
+
+/*! \brief \name Destructor for (C or NNC) Polyhedra */
+/*@{*/
+
+/*! \relates ppl_Polyhedron_tag \brief
+ Invalidates the handle \p ph: this makes sure the corresponding
+ resources will eventually be released.
+*/
+int
+ppl_delete_Polyhedron(ppl_const_Polyhedron_t ph);
+
+/*@}*/ /* Destructor for (C or NNC) Polyhedra */
+
+/*! \brief \name Functions that Do Not Modify the Polyhedron */
+/*@{*/
+
+/*! \relates ppl_Polyhedron_tag \brief
+ Writes to \p m the dimension of the vector space enclosing \p ph.
+*/
+int
+ppl_Polyhedron_space_dimension
+(ppl_const_Polyhedron_t ph, ppl_dimension_type* m);
+
+/*! \relates ppl_Polyhedron_tag \brief
+ Writes to \p m the affine dimension of \p ph (not to be confused with the
+ dimension of its enclosing vector space) or 0, if \p ph is empty.
+*/
+int
+ppl_Polyhedron_affine_dimension
+(ppl_const_Polyhedron_t ph, ppl_dimension_type* m);
+
+/*! \relates ppl_Polyhedron_tag \brief
+ Checks the relation between the polyhedron \p ph and the constraint \p c.
+
+ If successful, returns a non-negative integer that is
+ obtained as the bitwise or of the bits (chosen among
+ PPL_POLY_CON_RELATION_IS_DISJOINT
+ PPL_POLY_CON_RELATION_STRICTLY_INTERSECTS,
+ PPL_POLY_CON_RELATION_IS_INCLUDED, and
+ PPL_POLY_CON_RELATION_SATURATES) that describe the relation between
+ \p ph and \p c.
+*/
+int
+ppl_Polyhedron_relation_with_Constraint
+(ppl_const_Polyhedron_t ph, ppl_const_Constraint_t c);
+
+/*! \relates ppl_Polyhedron_tag \brief
+ Checks the relation between the polyhedron \p ph and the generator \p g.
+
+ If successful, returns a non-negative integer that is
+ obtained as the bitwise or of the bits (only
+ PPL_POLY_GEN_RELATION_SUBSUMES, at present) that describe the
+ relation between \p ph and \p g.
+*/
+int
+ppl_Polyhedron_relation_with_Generator
+(ppl_const_Polyhedron_t ph, ppl_const_Generator_t g);
+
+int
+ppl_Polyhedron_relation_with_Congruence
+(ppl_const_Polyhedron_t ph, ppl_const_Congruence_t c);
+
+/*! \relates ppl_Polyhedron_tag \brief
+ Writes a const handle to the constraint system defining the
+ polyhedron \p ph at address \p pcs.
+*/
+int
+ppl_Polyhedron_get_constraints
+(ppl_const_Polyhedron_t ph, ppl_const_Constraint_System_t* pcs);
+
+/*! \relates ppl_Polyhedron_tag \brief
+ Writes at address \p pcs a const handle to a system of congruences
+ approximating the polyhedron \p ph.
+*/
+int
+ppl_Polyhedron_get_congruences
+(ppl_const_Polyhedron_t ph, ppl_const_Congruence_System_t* pcs);
+
+/*! \relates ppl_Polyhedron_tag \brief
+ Writes a const handle to the minimized constraint system defining the
+ polyhedron \p ph at address \p pcs.
+*/
+int
+ppl_Polyhedron_get_minimized_constraints
+(ppl_const_Polyhedron_t ph, ppl_const_Constraint_System_t* pcs);
+
+/*! \relates ppl_Polyhedron_tag \brief
+ Writes at address \p pcs a const handle to a system of minimized
+ congruences approximating the polyhedron \p ph.
+*/
+int
+ppl_Polyhedron_get_minimized_congruences
+(ppl_const_Polyhedron_t ph, ppl_const_Congruence_System_t* pcs);
+
+/*! \relates ppl_Polyhedron_tag \brief
+ Returns a positive integer if \p ph is empty; returns 0 if \p ph is
+ not empty.
+*/
+int
+ppl_Polyhedron_is_empty(ppl_const_Polyhedron_t ph);
+
+/*! \relates ppl_Polyhedron_tag \brief
+ Returns a positive integer if \p ph is a universe polyhedron;
+ returns 0 if it is not.
+*/
+int
+ppl_Polyhedron_is_universe(ppl_const_Polyhedron_t ph);
+
+/*! \relates ppl_Polyhedron_tag \brief
+ Returns a positive integer if \p ph is bounded; returns 0 if \p ph is
+ unbounded.
+*/
+int
+ppl_Polyhedron_is_bounded(ppl_const_Polyhedron_t ph);
+
+/*! \relates ppl_Polyhedron_tag \brief
+ Returns a positive integer if \p ph contains at least one integer
+ point; returns 0 otherwise.
+*/
+int
+ppl_Polyhedron_contains_integer_point(ppl_const_Polyhedron_t ph);
+
+/*! \relates ppl_Polyhedron_tag \brief
+ Returns a positive integer if \p ph is topologically closed;
+ returns 0 if \p ph is not topologically closed.
+*/
+int
+ppl_Polyhedron_is_topologically_closed(ppl_const_Polyhedron_t ph);
+
+/*! \relates ppl_Polyhedron_tag \brief
+ Returns a positive integer if \p ph is a discrete set;
+ returns 0 if \p ph is not a discrete set.
+*/
+int
+ppl_Polyhedron_is_discrete(ppl_const_Polyhedron_t ph);
+
+/*! \relates ppl_Polyhedron_tag \brief
+ Returns a positive integer if \p ph constrains \p var;
+ returns 0 if \p ph does not constrain \p var.
+*/
+int
+ppl_Polyhedron_constrains
+(ppl_Polyhedron_t ph, ppl_dimension_type var);
+
+/*! \relates ppl_Polyhedron_tag \brief
+ Returns a positive integer if \p le is bounded from above in \p ph;
+ returns 0 otherwise.
+*/
+int
+ppl_Polyhedron_bounds_from_above
+(ppl_const_Polyhedron_t ph, ppl_const_Linear_Expression_t le);
+
+/*! \relates ppl_Polyhedron_tag \brief
+ Returns a positive integer if \p le is bounded from below in \p ph;
+ returns 0 otherwise.
+*/
+int
+ppl_Polyhedron_bounds_from_below
+(ppl_const_Polyhedron_t ph, ppl_const_Linear_Expression_t le);
+
+/*! \relates ppl_Polyhedron_tag \brief
+ Returns a positive integer if \p ph is not empty
+ and \p le is bounded from above in \p ph, in which case
+ the supremum value and a point where \p le reaches it are computed.
+
+ \param ph
+ The polyhedron constraining \p le;
+
+ \param le
+ The linear expression to be maximized subject to \p ph;
+
+ \param sup_n
+ Will be assigned the numerator of the supremum value;
+
+ \param sup_d
+ Will be assigned the denominator of the supremum value;
+
+ \param pmaximum
+ Will store 1 in this location if the supremum is also the maximum,
+ will store 0 otherwise;
+
+ \param point
+ Will be assigned the point or closure point where \p le reaches the
+ extremum value.
+
+ If \p ph is empty or \p le is not bounded from above,
+ 0 will be returned and \p sup_n, \p sup_d, \p *pmaximum and \p point
+ will be left untouched.
+*/
+int
+ppl_Polyhedron_maximize_with_point
+(ppl_const_Polyhedron_t ph,
+ ppl_const_Linear_Expression_t le,
+ ppl_Coefficient_t sup_n,
+ ppl_Coefficient_t sup_d,
+ int* pmaximum,
+ ppl_Generator_t point);
+
+/*! \relates ppl_Polyhedron_tag \brief
+ The same as ppl_Polyhedron_maximize_with_point, but without the
+ output argument for the location where the supremum value is reached.
+*/
+int
+ppl_Polyhedron_maximize
+(ppl_const_Polyhedron_t ph,
+ ppl_const_Linear_Expression_t le,
+ ppl_Coefficient_t sup_n,
+ ppl_Coefficient_t sup_d,
+ int* pmaximum);
+
+/*! \relates ppl_Polyhedron_tag \brief
+ Returns a positive integer if \p ph is not empty
+ and \p le is bounded from below in \p ph, in which case
+ the infimum value and a point where \p le reaches it are computed.
+
+ \param ph
+ The polyhedron constraining \p le;
+
+ \param le
+ The linear expression to be minimized subject to \p ph;
+
+ \param inf_n
+ Will be assigned the numerator of the infimum value;
+
+ \param inf_d
+ Will be assigned the denominator of the infimum value;
+
+ \param pminimum
+ Will store 1 in this location if the infimum is also the minimum,
+ will store 0 otherwise;
+
+ \param point
+ Will be assigned the point or closure point where \p le reaches the
+ extremum value.
+
+ If \p ph is empty or \p le is not bounded from below,
+ 0 will be returned and \p sup_n, \p sup_d, \p *pmaximum and \p point
+ will be left untouched.
+*/
+int
+ppl_Polyhedron_minimize_with_point
+(ppl_const_Polyhedron_t ph,
+ ppl_const_Linear_Expression_t le,
+ ppl_Coefficient_t inf_n,
+ ppl_Coefficient_t inf_d,
+ int* pminimum,
+ ppl_Generator_t point);
+
+/*! \relates ppl_Polyhedron_tag \brief
+ The same as ppl_Polyhedron_minimize_with_point, but without the
+ output argument for the location where the infimum value is reached.
+*/
+int
+ppl_Polyhedron_minimize_with_point
+(ppl_const_Polyhedron_t ph,
+ ppl_const_Linear_Expression_t le,
+ ppl_Coefficient_t inf_n,
+ ppl_Coefficient_t inf_d,
+ int* pminimum);
+
+/*! \relates ppl_Polyhedron_tag \brief
+ Returns a positive integer if \p x contains or is equal to \p y;
+ returns 0 if it does not.
+*/
+int
+ppl_Polyhedron_contains_Polyhedron
+(ppl_const_Polyhedron_t x, ppl_const_Polyhedron_t y);
+
+/*! \relates ppl_Polyhedron_tag \brief
+ Returns a positive integer if \p x strictly contains \p y; returns 0
+ if it does not.
+*/
+int
+ppl_Polyhedron_strictly_contains_Polyhedron
+(ppl_const_Polyhedron_t x, ppl_const_Polyhedron_t y);
+
+/*! \relates ppl_Polyhedron_tag \brief
+ Returns a positive integer if \p x and \p y are disjoint; returns 0
+ if they are not.
+*/
+int
+ppl_Polyhedron_is_disjoint_from_Polyhedron
+(ppl_const_Polyhedron_t x, ppl_const_Polyhedron_t y);
+
+/*! \relates ppl_Polyhedron_tag \brief
+ Returns a positive integer if \p x and \p y are the same polyhedron;
+ returns 0 if they are different.
+
+ Note that \p x and \p y may be topology- and/or dimension-incompatible
+ polyhedra: in those cases, the value 0 is returned.
+*/
+int
+ppl_Polyhedron_equals_Polyhedron
+(ppl_const_Polyhedron_t x, ppl_const_Polyhedron_t y);
+
+/*! \relates ppl_Polyhedron_tag \brief
+ Returns a positive integer if \p ph is well formed, i.e., if it
+ satisfies all its implementation invariants; returns 0 and perhaps
+ makes some noise if \p ph is broken. Useful for debugging purposes.
+*/
+int
+ppl_Polyhedron_OK(ppl_const_Polyhedron_t ph);
+
+/*! \relates ppl_Polyhedron_tag \brief
+ Writes to \p sz a lower bound to the size in bytes of the memory
+ managed by \p ph.
+*/
+int
+ppl_Polyhedron_external_memory_in_bytes
+(ppl_const_Polyhedron_t ph, size_t* sz);
+
+/*! \relates ppl_Polyhedron_tag \brief
+ Writes to \p sz a lower bound to the size in bytes of the memory
+ managed by \p ph.
+*/
+int
+ppl_Polyhedron_total_memory_in_bytes
+(ppl_const_Polyhedron_t ph, size_t* sz);
+
+/*@}*/ /* Functions that Do Not Modify the Polyhedron */
+
+
+/*! \brief \name Space Dimension Preserving Functions that May Modify the Polyhedron */
+/*@{*/
+
+/*! \relates ppl_Polyhedron_tag \brief
+ Adds a copy of the constraint \p c to the system of constraints of \p ph.
+*/
+int
+ppl_Polyhedron_add_constraint
+(ppl_Polyhedron_t ph, ppl_const_Constraint_t c);
+
+/*! \relates ppl_Polyhedron_tag \brief
+ Adds a copy of the congruence \p c to polyhedron of \p ph.
+*/
+int
+ppl_Polyhedron_add_congruence
+(ppl_Polyhedron_t ph, ppl_const_Congruence_t c);
+
+/*! \relates ppl_Polyhedron_tag \brief
+ Adds a copy of the system of constraints \p cs to the system of
+ constraints of \p ph.
+*/
+int
+ppl_Polyhedron_add_constraints
+(ppl_Polyhedron_t ph, ppl_const_Constraint_System_t cs);
+
+/*! \relates ppl_Polyhedron_tag \brief
+ Adds a copy of the system of congruences \p cs to the polyhedron \p ph.
+*/
+int
+ppl_Polyhedron_add_congruences
+(ppl_Polyhedron_t ph, ppl_const_Congruence_System_t cs);
+
+/*! \relates ppl_Polyhedron_tag \brief
+ Adds the system of constraints \p cs to the system of constraints of
+ \p ph.
+
+ \warning
+ This function modifies the constraint system referenced by \p cs:
+ upon return, no assumption can be made on its value.
+*/
+int
+ppl_Polyhedron_add_recycled_constraints
+(ppl_Polyhedron_t ph, ppl_Constraint_System_t cs);
+
+/*! \relates ppl_Polyhedron_tag \brief
+ Adds the system of congruences \p cs to the polyhedron \p ph.
+
+ \warning
+ This function modifies the congruence system referenced by \p cs:
+ upon return, no assumption can be made on its value.
+*/
+int
+ppl_Polyhedron_add_recycled_congruences
+(ppl_Polyhedron_t ph, ppl_Congruence_System_t cs);
+
+/*! \relates ppl_Polyhedron_tag \brief
+ Refines \p ph using constraint \p c.
+*/
+int
+ppl_Polyhedron_refine_with_constraint
+(ppl_Polyhedron_t ph, ppl_const_Constraint_t c);
+
+/*! \relates ppl_Polyhedron_tag \brief
+ Refines \p ph using congruence \p c.
+*/
+int
+ppl_Polyhedron_refine_with_congruence
+(ppl_Polyhedron_t ph, ppl_const_Congruence_t c);
+
+/*! \relates ppl_Polyhedron_tag \brief
+ Refines \p ph using the constraints in \p cs.
+*/
+int
+ppl_Polyhedron_refine_with_constraints
+(ppl_Polyhedron_t ph, ppl_const_Constraint_System_t cs);
+
+/*! \relates ppl_Polyhedron_tag \brief
+ Refines \p ph using the congruences in \p cs.
+*/
+int
+ppl_Polyhedron_refine_with_congruences
+(ppl_Polyhedron_t ph, ppl_const_Congruence_System_t cs);
+
+/*! \relates ppl_Polyhedron_tag \brief
+ Intersects \p x with polyhedron \p y and assigns the result to \p x.
+*/
+int
+ppl_Polyhedron_intersection_assign
+(ppl_Polyhedron_t x, ppl_const_Polyhedron_t y);
+
+/*! \relates ppl_Polyhedron_tag \brief
+ Assigns to \p x an upper bound of \p x and \p y.
+
+ For the domain of polyhedra, this is the same as
+ <CODE>ppl_Polyhedron_poly_hull_assign(x, y)</CODE>.
+*/
+int
+ppl_Polyhedron_upper_bound_assign
+(ppl_Polyhedron_t x, ppl_const_Polyhedron_t y);
+
+/*! \relates ppl_Polyhedron_tag \brief
+ Same as ppl_Polyhedron_poly_difference_assign(x, y).
+*/
+int
+ppl_Polyhedron_difference_assign
+(ppl_Polyhedron_t x, ppl_const_Polyhedron_t y);
+
+/*! \relates ppl_Polyhedron_tag \brief
+ Assigns to \p x the
+ \extref{Meet_Preserving_Simplification, meet-preserving simplification}
+ of \p x with respect to context \p y. Returns a positive integer if
+ \p x and \p y have a nonempty intersection; returns \c 0 if they
+ are disjoint.
+*/
+int
+ppl_Polyhedron_simplify_using_context_assign
+(ppl_Polyhedron_t x, ppl_const_Polyhedron_t y);
+
+/*! \relates ppl_Polyhedron_tag \brief
+ Assigns to \p x the \extref{Time_Elapse_Operator, time-elapse} between
+ the polyhedra \p x and \p y.
+*/
+int
+ppl_Polyhedron_time_elapse_assign
+(ppl_Polyhedron_t x, ppl_const_Polyhedron_t y);
+
+/*! \relates ppl_Polyhedron_tag \brief
+ Assigns to \p ph its topological closure.
+*/
+int
+ppl_Polyhedron_topological_closure_assign(ppl_Polyhedron_t ph);
+
+/*! \relates ppl_Polyhedron_tag \brief
+ Modifies \p ph by \extref{Cylindrification, unconstraining}
+ the space dimension \p var.
+*/
+int
+ppl_Polyhedron_unconstrain_space_dimension
+(ppl_Polyhedron_t ph, ppl_dimension_type var);
+
+/*! \relates ppl_Polyhedron_tag \brief
+ Modifies \p ph by \extref{Cylindrification, unconstraining}
+ the space dimensions that are specified in the first \p n positions
+ of the array \p ds.
+ The presence of duplicates in \p ds is a waste but an innocuous one.
+*/
+int
+ppl_Polyhedron_unconstrain_space_dimensions
+(ppl_Polyhedron_t ph, ppl_dimension_type ds[], size_t n);
+
+/*! \relates ppl_Polyhedron_tag \brief
+ Transforms the polyhedron \p ph, assigning an affine expression
+ to the specified variable.
+
+ \param ph
+ The polyhedron that is transformed;
+
+ \param var
+ The variable to which the affine expression is assigned;
+
+ \param le
+ The numerator of the affine expression;
+
+ \param d
+ The denominator of the affine expression.
+*/
+int
+ppl_Polyhedron_affine_image
+(ppl_Polyhedron_t ph,
+ ppl_dimension_type var,
+ ppl_const_Linear_Expression_t le,
+ ppl_const_Coefficient_t d);
+
+/*! \relates ppl_Polyhedron_tag \brief
+ Transforms the polyhedron \p ph, substituting an affine expression
+ to the specified variable.
+
+ \param ph
+ The polyhedron that is transformed;
+
+ \param var
+ The variable to which the affine expression is substituted;
+
+ \param le
+ The numerator of the affine expression;
+
+ \param d
+ The denominator of the affine expression.
+*/
+int
+ppl_Polyhedron_affine_preimage
+(ppl_Polyhedron_t ph,
+ ppl_dimension_type var,
+ ppl_const_Linear_Expression_t le,
+ ppl_const_Coefficient_t d);
+
+/*! \relates ppl_Polyhedron_tag \brief
+ Assigns to \p ph the image of \p ph with respect to the
+ \extref{Generalized_Affine_Relations, generalized affine transfer relation}
+ \f$\frac{\mathrm{lb}}{\mathrm{d}}
+ \leq \mathrm{var}'
+ \leq \frac{\mathrm{ub}}{\mathrm{d}}\f$.
+
+ \param ph
+ The polyhedron that is transformed;
+
+ \param var
+ The variable bounded by the generalized affine transfer relation;
+
+ \param lb
+ The numerator of the lower bounding affine expression;
+
+ \param ub
+ The numerator of the upper bounding affine expression;
+
+ \param d
+ The (common) denominator of the lower and upper bounding affine expressions.
+*/
+int
+ppl_Polyhedron_bounded_affine_image
+(ppl_Polyhedron_t ph,
+ ppl_dimension_type var,
+ ppl_const_Linear_Expression_t lb,
+ ppl_const_Linear_Expression_t ub,
+ ppl_const_Coefficient_t d);
+
+/*! \relates ppl_Polyhedron_tag \brief
+ Assigns to \p ph the preimage of \p ph with respect to the
+ \extref{Generalized_Affine_Relations, generalized affine transfer relation}
+ \f$\frac{\mathrm{lb}}{\mathrm{d}}
+ \leq \mathrm{var}'
+ \leq \frac{\mathrm{ub}}{\mathrm{d}}\f$.
+
+ \param ph
+ The polyhedron that is transformed;
+
+ \param var
+ The variable bounded by the generalized affine transfer relation;
+
+ \param lb
+ The numerator of the lower bounding affine expression;
+
+ \param ub
+ The numerator of the upper bounding affine expression;
+
+ \param d
+ The (common) denominator of the lower and upper bounding affine expressions.
+*/
+int
+ppl_Polyhedron_bounded_affine_preimage
+(ppl_Polyhedron_t ph,
+ ppl_dimension_type var,
+ ppl_const_Linear_Expression_t lb,
+ ppl_const_Linear_Expression_t ub,
+ ppl_const_Coefficient_t d);
+
+/*! \relates ppl_Polyhedron_tag \brief
+ Assigns to \p ph the image of \p ph with respect to the
+ \extref{Generalized_Affine_Relations, generalized affine transfer relation}
+ \f$\mathrm{var}' \relsym \frac{\mathrm{le}}{\mathrm{d}}\f$,
+ where \f$\mathord{\relsym}\f$ is the relation symbol encoded
+ by \p relsym.
+
+ \param ph
+ The polyhedron that is transformed;
+
+ \param var
+ The left hand side variable of the generalized affine transfer relation;
+
+ \param relsym
+ The relation symbol;
+
+ \param le
+ The numerator of the right hand side affine expression;
+
+ \param d
+ The denominator of the right hand side affine expression.
+*/
+int
+ppl_Polyhedron_generalized_affine_image
+(ppl_Polyhedron_t ph,
+ ppl_dimension_type var,
+ enum ppl_enum_Constraint_Type relsym,
+ ppl_const_Linear_Expression_t le,
+ ppl_const_Coefficient_t d);
+
+/*! \relates ppl_Polyhedron_tag \brief
+ Assigns to \p ph the preimage of \p ph with respect to the
+ \extref{Generalized_Affine_Relations, generalized affine transfer relation}
+ \f$\mathrm{var}' \relsym \frac{\mathrm{le}}{\mathrm{d}}\f$,
+ where \f$\mathord{\relsym}\f$ is the relation symbol encoded
+ by \p relsym.
+
+ \param ph
+ The polyhedron that is transformed;
+
+ \param var
+ The left hand side variable of the generalized affine transfer relation;
+
+ \param relsym
+ The relation symbol;
+
+ \param le
+ The numerator of the right hand side affine expression;
+
+ \param d
+ The denominator of the right hand side affine expression.
+*/
+int
+ppl_Polyhedron_generalized_affine_preimage
+(ppl_Polyhedron_t ph,
+ ppl_dimension_type var,
+ enum ppl_enum_Constraint_Type relsym,
+ ppl_const_Linear_Expression_t le,
+ ppl_const_Coefficient_t d);
+
+/*! \relates ppl_Polyhedron_tag \brief
+ Assigns to \p ph the image of \p ph with respect to the
+ \extref{Generalized_Affine_Relations, generalized affine transfer relation}
+ \f$\mathrm{lhs}' \relsym \mathrm{rhs}\f$, where
+ \f$\mathord{\relsym}\f$ is the relation symbol encoded by \p relsym.
+
+ \param ph
+ The polyhedron that is transformed;
+
+ \param lhs
+ The left hand side affine expression;
+
+ \param relsym
+ The relation symbol;
+
+ \param rhs
+ The right hand side affine expression.
+*/
+int
+ppl_Polyhedron_generalized_affine_image_lhs_rhs
+(ppl_Polyhedron_t ph,
+ ppl_const_Linear_Expression_t lhs,
+ enum ppl_enum_Constraint_Type relsym,
+ ppl_const_Linear_Expression_t rhs);
+
+/*! \relates ppl_Polyhedron_tag \brief
+ Assigns to \p ph the preimage of \p ph with respect to the
+ \extref{Generalized_Affine_Relations, generalized affine transfer relation}
+ \f$\mathrm{lhs}' \relsym \mathrm{rhs}\f$, where
+ \f$\mathord{\relsym}\f$ is the relation symbol encoded by \p relsym.
+
+ \param ph
+ The polyhedron that is transformed;
+
+ \param lhs
+ The left hand side affine expression;
+
+ \param relsym
+ The relation symbol;
+
+ \param rhs
+ The right hand side affine expression.
+*/
+int
+ppl_Polyhedron_generalized_affine_preimage_lhs_rhs
+(ppl_Polyhedron_t ph,
+ ppl_const_Linear_Expression_t lhs,
+ enum ppl_enum_Constraint_Type relsym,
+ ppl_const_Linear_Expression_t rhs);
+
+/*@}*/ /* Space Dimension Preserving Functions that May Modify [...] */
+
+
+/*! \brief \name Functions that May Modify the Dimension of the Vector Space */
+/*@{*/
+
+/*! \relates ppl_Polyhedron_tag \brief
+ Seeing a polyhedron as a set of tuples (its points), assigns
+ to \p x all the tuples that can be obtained by concatenating,
+ in the order given, a tuple of \p x with a tuple of \p y.
+*/
+int
+ppl_Polyhedron_concatenate_assign
+(ppl_Polyhedron_t x, ppl_const_Polyhedron_t y);
+
+/*! \relates ppl_Polyhedron_tag \brief
+ Adds \p d new dimensions to the space enclosing the polyhedron \p ph
+ and to \p ph itself.
+*/
+int
+ppl_Polyhedron_add_space_dimensions_and_embed
+(ppl_Polyhedron_t ph, ppl_dimension_type d);
+
+/*! \relates ppl_Polyhedron_tag \brief
+ Adds \p d new dimensions to the space enclosing the polyhedron \p ph.
+*/
+int
+ppl_Polyhedron_add_space_dimensions_and_project
+(ppl_Polyhedron_t ph, ppl_dimension_type d);
+
+/*! \relates ppl_Polyhedron_tag \brief
+ Removes from the vector space enclosing \p ph the space dimensions that
+ are specified in first \p n positions of the array \p ds. The presence
+ of duplicates in \p ds is a waste but an innocuous one.
+*/
+int
+ppl_Polyhedron_remove_space_dimensions
+(ppl_Polyhedron_t ph, ppl_dimension_type ds[], size_t n);
+
+/*! \relates ppl_Polyhedron_tag \brief
+ Removes the higher dimensions from the vector space enclosing \p ph
+ so that, upon successful return, the new space dimension is \p d.
+*/
+int
+ppl_Polyhedron_remove_higher_space_dimensions
+(ppl_Polyhedron_t ph, ppl_dimension_type d);
+
+/*! \relates ppl_Polyhedron_tag \brief
+ Remaps the dimensions of the vector space according to a
+ \extref{Mapping_the_Dimensions_of_the_Vector_Space, partial function}.
+ This function is specified by means of the \p maps array,
+ which has \p n entries.
+
+ The partial function is defined on dimension <CODE>i</CODE>
+ if <CODE>i < n</CODE> and <CODE>maps[i] != ppl_not_a_dimension</CODE>;
+ otherwise it is undefined on dimension <CODE>i</CODE>.
+ If the function is defined on dimension <CODE>i</CODE>, then dimension
+ <CODE>i</CODE> is mapped onto dimension <CODE>maps[i]</CODE>.
+
+ The result is undefined if \p maps does not encode a partial
+ function with the properties described in the
+ \extref{Mapping_the_Dimensions_of_the_Vector_Space,
+ specification of the mapping operator}.
+*/
+int
+ppl_Polyhedron_map_space_dimensions
+(ppl_Polyhedron_t ph, ppl_dimension_type maps[], size_t n);
+
+/*! \relates ppl_Polyhedron_tag \brief
+ \extref{expand_space_dimension, Expands} the \f$d\f$-th dimension of
+ the vector space enclosing \p ph to \p m new space dimensions.
+*/
+int
+ppl_Polyhedron_expand_space_dimension
+(ppl_Polyhedron_t ph, ppl_dimension_type d, ppl_dimension_type m);
+
+/*! \relates ppl_Polyhedron_tag \brief
+ Modifies \p ph by \extref{fold_space_dimensions, folding} the
+ space dimensions contained in the first \p n positions of the array \p ds
+ into dimension \p d. The presence of duplicates in \p ds is a waste
+ but an innocuous one.
+*/
+int
+ppl_Polyhedron_fold_space_dimensions
+(ppl_Polyhedron_t ph,
+ ppl_dimension_type ds[],
+ size_t n,
+ ppl_dimension_type d);
+
+/*@}*/ /* Functions that May Modify the Dimension of the Vector Space */
+
+/*! \brief \name Input/Output Functions */
+/*@{*/
+
+/*! \relates ppl_Polyhedron_tag
+ \brief Prints \p x to \c stdout.
+*/
+int
+ppl_io_print_Polyhedron(ppl_const_Polyhedron_t x);
+
+/*! \relates ppl_Polyhedron_tag
+ \brief Prints \p x to the given output \p stream.
+*/
+int
+ppl_io_fprint_Polyhedron(FILE* stream, ppl_const_Polyhedron_t x);
+
+/*! \relates ppl_Polyhedron_tag \brief
+ Prints \p x to a malloc-allocated string, a pointer to which
+ is returned via \p strp.
+*/
+int
+ppl_io_asprint_Polyhedron(char** strp, ppl_const_Polyhedron_t x);
+
+/*! \relates ppl_Polyhedron_tag
+ \brief Dumps an ascii representation of \p x on \p stream.
+*/
+int
+ppl_Polyhedron_ascii_dump(ppl_const_Polyhedron_t x, FILE* stream);
+
+/*! \relates ppl_Polyhedron_tag
+ \brief Loads an ascii representation of \p x from \p stream.
+*/
+int
+ppl_Polyhedron_ascii_load(ppl_Polyhedron_t x, FILE* stream);
+
+/*@}*/ /* Input-Output Functions */
+
+
+/*! \name Ad Hoc Functions for (C or NNC) Polyhedra
+ The functions listed here below, being specific of the polyhedron domains,
+ do not have a correspondence in other semantic geometric descriptions.
+*/
+/*@{*/
+
+/*! \relates ppl_Polyhedron_tag \brief
+ Builds a new C polyhedron from the system of generators
+ \p gs and writes a handle for the newly created polyhedron at
+ address \p pph.
+
+ The new polyhedron will inherit the space dimension of \p gs.
+*/
+int
+ppl_new_C_Polyhedron_from_Generator_System
+(ppl_Polyhedron_t* pph, ppl_const_Generator_System_t gs);
+
+/*! \relates ppl_Polyhedron_tag \brief
+ Builds a new C polyhedron recycling the system of generators
+ \p gs and writes a handle for the newly created polyhedron at
+ address \p pph.
+
+ The new polyhedron will inherit the space dimension of \p gs.
+
+ \warning
+ This function modifies the generator system referenced by \p gs:
+ upon return, no assumption can be made on its value.
+*/
+int
+ppl_new_C_Polyhedron_recycle_Generator_System
+(ppl_Polyhedron_t* pph, ppl_Generator_System_t gs);
+
+/*! \relates ppl_Polyhedron_tag \brief
+ Builds a new NNC polyhedron from the system of generators
+ \p gs and writes a handle for the newly created polyhedron at
+ address \p pph.
+
+ The new polyhedron will inherit the space dimension of \p gs.
+*/
+int
+ppl_new_NNC_Polyhedron_from_Generator_System
+(ppl_Polyhedron_t* pph, ppl_const_Generator_System_t gs);
+
+/*! \relates ppl_Polyhedron_tag \brief
+ Builds a new NNC polyhedron recycling the system of generators
+ \p gs and writes a handle for the newly created polyhedron at
+ address \p pph.
+
+ The new polyhedron will inherit the space dimension of \p gs.
+
+ \warning
+ This function modifies the generator system referenced by \p gs:
+ upon return, no assumption can be made on its value.
+*/
+int
+ppl_new_NNC_Polyhedron_recycle_Generator_System
+(ppl_Polyhedron_t* pph, ppl_Generator_System_t gs);
+
+/*! \relates ppl_Polyhedron_tag \brief
+ Writes a const handle to the generator system defining the
+ polyhedron \p ph at address \p pgs.
+*/
+int
+ppl_Polyhedron_get_generators
+(ppl_const_Polyhedron_t ph, ppl_const_Generator_System_t* pgs);
+
+/*! \relates ppl_Polyhedron_tag \brief
+ Writes a const handle to the minimized generator system defining the
+ polyhedron \p ph at address \p pgs.
+*/
+int
+ppl_Polyhedron_get_minimized_generators
+(ppl_const_Polyhedron_t ph, ppl_const_Generator_System_t* pgs);
+
+/*! \relates ppl_Polyhedron_tag \brief
+ Adds a copy of the generator \p g to the system of generators of \p ph.
+*/
+int
+ppl_Polyhedron_add_generator
+(ppl_Polyhedron_t ph, ppl_const_Generator_t g);
+
+/*! \relates ppl_Polyhedron_tag \brief
+ Adds a copy of the system of generators \p gs to the system of
+ generators of \p ph.
+*/
+int
+ppl_Polyhedron_add_generators
+(ppl_Polyhedron_t ph, ppl_const_Generator_System_t gs);
+
+/*! \relates ppl_Polyhedron_tag \brief
+ Adds the system of generators \p gs to the system of generators of
+ \p ph.
+
+ \warning
+ This function modifies the generator system referenced by \p gs:
+ upon return, no assumption can be made on its value.
+*/
+int
+ppl_Polyhedron_add_recycled_generators
+(ppl_Polyhedron_t ph, ppl_Generator_System_t gs);
+
+/*! \relates ppl_Polyhedron_tag \brief
+ Assigns to \p x the poly-hull of \p x and \p y.
+*/
+int
+ppl_Polyhedron_poly_hull_assign
+(ppl_Polyhedron_t x, ppl_const_Polyhedron_t y);
+
+/*! \relates ppl_Polyhedron_tag \brief
+ Assigns to \p x the \extref{Convex_Polyhedral_Difference, poly-difference}
+ of \p x and \p y.
+*/
+int
+ppl_Polyhedron_poly_difference_assign
+(ppl_Polyhedron_t x, ppl_const_Polyhedron_t y);
+
+/*! \relates ppl_Polyhedron_tag \brief
+ Assigns to \p ph the polyhedron obtained from \p ph by "wrapping" the vector
+ space defined by the first \p n space dimensions in \p ds[].
+
+ \param ph
+ The polyhedron that is transformed;
+
+ \param ds[]
+ Specifies the space dimensions to be wrapped.
+
+ \param n
+ The first \p n space dimensions in the array \p ds[] will be wrapped.
+
+ \param w
+ The width of the bounded integer type corresponding to
+ all the dimensions to be wrapped.
+
+ \param r
+ The representation of the bounded integer type corresponding to
+ all the dimensions to be wrapped.
+
+ \param o
+ The overflow behavior of the bounded integer type corresponding to
+ all the dimensions to be wrapped.
+
+ \param pcs
+ Possibly null pointer to a constraint system whose space dimensions
+ are the first \p n dimensions in \p ds[]. If <CODE>*pcs</CODE>
+ depends on variables not in \p vars, the behavior is undefined.
+ When non-null, the constraint system is assumed to
+ represent the conditional or looping construct guard with respect
+ to which wrapping is performed. Since wrapping requires the
+ computation of upper bounds and due to non-distributivity of
+ constraint refinement over upper bounds, passing a constraint
+ system in this way can be more precise than refining the result of
+ the wrapping operation with the constraints in <CODE>cs</CODE>.
+
+ \param complexity_threshold
+ A precision parameter where higher values result in possibly improved
+ precision.
+
+ \param wrap_individually
+ Non-zero if the dimensions should be wrapped individually
+ (something that results in much greater efficiency to the detriment of
+ precision).
+ */
+ int wrap_assign(ppl_Polyhedron_t ph,
+ ppl_dimension_type ds[],
+ size_t n,
+ ppl_enum_Bounded_Integer_Type_Width w,
+ ppl_enum_Bounded_Integer_Type_Representation r,
+ ppl_enum_Bounded_Integer_Type_Overflow o,
+ const ppl_const_Constraint_System_t* pcs,
+ unsigned complexity_threshold,
+ int wrap_individually);
+
+/*! \relates ppl_Polyhedron_tag \brief
+ If the polyhedron \p y is contained in (or equal to) the polyhedron
+ \p x, assigns to \p x the \extref{BHRZ03_widening, BHRZ03-widening} of
+ \p x and \p y. If \p tp is not the null pointer, the
+ \extref{Widening_with_Tokens, widening with tokens} delay technique
+ is applied with <CODE>*tp</CODE> available tokens.
+*/
+int
+ppl_Polyhedron_BHRZ03_widening_assign_with_tokens
+(ppl_Polyhedron_t x, ppl_const_Polyhedron_t y, unsigned* tp);
+
+/*! \relates ppl_Polyhedron_tag \brief
+ If the polyhedron \p y is contained in (or equal to) the polyhedron
+ \p x, assigns to \p x the \extref{H79_widening, H79-widening} of \p x
+ and \p y. If \p tp is not the null pointer, the
+ \extref{Widening_with_Tokens, widening with tokens} delay technique is
+ applied with <CODE>*tp</CODE> available tokens.
+*/
+int
+ppl_Polyhedron_H79_widening_assign_with_tokens
+(ppl_Polyhedron_t x, ppl_const_Polyhedron_t y, unsigned* tp);
+
+/*! \relates ppl_Polyhedron_tag \brief
+ If the polyhedron \p y is contained in (or equal to) the polyhedron
+ \p x, assigns to \p x the \extref{BHRZ03_widening, BHRZ03-widening} of
+ \p x and \p y.
+*/
+int
+ppl_Polyhedron_BHRZ03_widening_assign
+(ppl_Polyhedron_t x, ppl_const_Polyhedron_t y);
+
+/*! \relates ppl_Polyhedron_tag \brief
+ If the polyhedron \p y is contained in (or equal to) the polyhedron
+ \p x, assigns to \p x the \extref{H79_widening, H79-widening} of \p x
+ and \p y.
+*/
+int
+ppl_Polyhedron_H79_widening_assign
+(ppl_Polyhedron_t x, ppl_const_Polyhedron_t y);
+
+/*! \relates ppl_Polyhedron_tag \brief
+ If the polyhedron \p y is contained in (or equal to) the polyhedron
+ \p x, assigns to \p x the \extref{BHRZ03_widening, BHRZ03-widening} of
+ \p x and \p y intersected with the constraints in \p cs that are
+ satisfied by all the points of \p x. If \p tp is not the null pointer,
+ the \extref{Widening_with_Tokens, widening with tokens} delay technique
+ is applied with <CODE>*tp</CODE> available tokens.
+*/
+int
+ppl_Polyhedron_limited_BHRZ03_extrapolation_assign_with_tokens
+(ppl_Polyhedron_t x,
+ ppl_const_Polyhedron_t y,
+ ppl_const_Constraint_System_t cs,
+ unsigned* tp);
+
+/*! \relates ppl_Polyhedron_tag \brief
+ If the polyhedron \p y is contained in (or equal to) the polyhedron
+ \p x, assigns to \p x the \extref{H79_widening, H79-widening} of \p x
+ and \p y intersected with the constraints in \p cs that are
+ satisfied by all the points of \p x. If \p tp is not the null
+ pointer, the \extref{Widening_with_Tokens, widening with tokens} delay
+ technique is applied with <CODE>*tp</CODE> available tokens.
+*/
+int
+ppl_Polyhedron_limited_H79_extrapolation_assign_with_tokens
+(ppl_Polyhedron_t x,
+ ppl_const_Polyhedron_t y,
+ ppl_const_Constraint_System_t cs,
+ unsigned* tp);
+
+/*! \relates ppl_Polyhedron_tag \brief
+ If the polyhedron \p y is contained in (or equal to) the polyhedron
+ \p x, assigns to \p x the \extref{BHRZ03_widening, BHRZ03-widening} of
+ \p x and \p y intersected with the constraints in \p cs that are
+ satisfied by all the points of \p x.
+*/
+int
+ppl_Polyhedron_limited_BHRZ03_extrapolation_assign
+(ppl_Polyhedron_t x,
+ ppl_const_Polyhedron_t y,
+ ppl_const_Constraint_System_t cs);
+
+/*! \relates ppl_Polyhedron_tag \brief
+ If the polyhedron \p y is contained in (or equal to) the polyhedron
+ \p x, assigns to \p x the \extref{H79_widening, H79-widening} of \p x
+ and \p y intersected with the constraints in \p cs that are
+ satisfied by all the points of \p x.
+*/
+int
+ppl_Polyhedron_limited_H79_extrapolation_assign
+(ppl_Polyhedron_t x,
+ ppl_const_Polyhedron_t y,
+ ppl_const_Constraint_System_t cs);
+
+/*! \relates ppl_Polyhedron_tag \brief
+ If the polyhedron \p y is contained in (or equal to) the polyhedron
+ \p x, assigns to \p x the \extref{BHRZ03_widening, BHRZ03-widening} of
+ \p x and \p y intersected with the constraints in \p cs that are
+ satisfied by all the points of \p x, further intersected with all
+ the constraints of the form \f$\pm v \leq r\f$ and \f$\pm v < r\f$,
+ with \f$r \in \Qset\f$, that are satisfied by all the points of \p
+ x. If \p tp is not the null pointer,
+ the \extref{Widening_with_Tokens, widening with tokens} delay technique
+ is applied with <CODE>*tp</CODE> available tokens.
+*/
+int
+ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign_with_tokens
+(ppl_Polyhedron_t x,
+ ppl_const_Polyhedron_t y,
+ ppl_const_Constraint_System_t cs,
+ unsigned* tp);
+
+/*! \relates ppl_Polyhedron_tag \brief
+ If the polyhedron \p y is contained in (or equal to) the polyhedron
+ \p x, assigns to \p x the \extref{H79_widening, H79-widening} of \p x
+ and \p y intersected with the constraints in \p cs that are
+ satisfied by all the points of \p x, further intersected with all
+ the constraints of the form \f$\pm v \leq r\f$ and \f$\pm v < r\f$,
+ with \f$r \in \Qset\f$, that are satisfied by all the points of \p x.
+ If \p tp is not the null pointer,
+ the \extref{Widening_with_Tokens, widening with tokens} delay technique
+ is applied with <CODE>*tp</CODE> available tokens.
+*/
+int
+ppl_Polyhedron_bounded_H79_extrapolation_assign_with_tokens
+(ppl_Polyhedron_t x,
+ ppl_const_Polyhedron_t y,
+ ppl_const_Constraint_System_t cs,
+ unsigned* tp);
+
+/*! \relates ppl_Polyhedron_tag \brief
+ If the polyhedron \p y is contained in (or equal to) the polyhedron
+ \p x, assigns to \p x the \extref{BHRZ03_widening, BHRZ03-widening} of
+ \p x and \p y intersected with the constraints in \p cs that are
+ satisfied by all the points of \p x, further intersected with all
+ the constraints of the form \f$\pm v \leq r\f$ and \f$\pm v < r\f$,
+ with \f$r \in \Qset\f$, that are satisfied by all the points of \p x.
+*/
+int
+ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign
+(ppl_Polyhedron_t x,
+ ppl_const_Polyhedron_t y,
+ ppl_const_Constraint_System_t cs);
+
+/*! \relates ppl_Polyhedron_tag \brief
+ If the polyhedron \p y is contained in (or equal to) the polyhedron
+ \p x, assigns to \p x the \extref{H79_widening, H79-widening} of \p x
+ and \p y intersected with the constraints in \p cs that are
+ satisfied by all the points of \p x, further intersected with all
+ the constraints of the form \f$\pm v \leq r\f$ and \f$\pm v < r\f$,
+ with \f$r \in \Qset\f$, that are satisfied by all the points of \p x.
+*/
+int
+ppl_Polyhedron_bounded_H79_extrapolation_assign
+(ppl_Polyhedron_t x,
+ ppl_const_Polyhedron_t y,
+ ppl_const_Constraint_System_t cs);
+
+/*@}*/ /* Ad Hoc Functions for (C or NNC) Polyhedra */
+
+/*! \interface ppl_Pointset_Powerset_C_Polyhedron_tag
+ \brief
+ Types and functions for the Pointset_Powerset of C_Polyhedron objects.
+
+ The powerset domains can be instantiated by taking as a base domain
+ any fixed semantic geometric description
+ (C and NNC polyhedra, BD and octagonal shapes, boxes and grids).
+ An element of the powerset domain represents a disjunctive collection
+ of base objects (its disjuncts), all having the same space dimension.
+
+ Besides the functions that are available in all semantic geometric
+ descriptions (whose documentation is not repeated here),
+ the powerset domain also provides several ad hoc functions.
+ In particular, the iterator types allow for the examination and
+ manipulation of the collection of disjuncts.
+*/
+
+#if !defined(PPL_DOXYGEN_CONFIGURED_MANUAL)
+
+/*! \brief Opaque pointer \ingroup Datatypes */
+typedef struct ppl_Pointset_Powerset_C_Polyhedron_tag*
+ ppl_Pointset_Powerset_C_Polyhedron_t;
+
+/*! \brief Opaque pointer to const object \ingroup Datatypes */
+typedef struct ppl_Pointset_Powerset_C_Polyhedron_tag const*
+ ppl_const_Pointset_Powerset_C_Polyhedron_t;
+
+/*! \interface ppl_Pointset_Powerset_C_Polyhedron_iterator_tag
+ \brief
+ Types and functions for iterating on the disjuncts of a
+ ppl_Pointset_Powerset_C_Polyhedron_tag.
+*/
+
+/*! \brief Opaque pointer \ingroup Datatypes */
+typedef struct ppl_Pointset_Powerset_C_Polyhedron_iterator_tag*
+ ppl_Pointset_Powerset_C_Polyhedron_iterator_t;
+
+/*! \brief Opaque pointer to const object \ingroup Datatypes */
+typedef struct ppl_Pointset_Powerset_C_Polyhedron_iterator_tag const*
+ ppl_const_Pointset_Powerset_C_Polyhedron_iterator_t;
+
+/*! \interface ppl_Pointset_Powerset_C_Polyhedron_const_iterator_tag
+ \brief
+ Types and functions for iterating on the disjuncts of a
+ const ppl_Pointset_Powerset_C_Polyhedron_tag.
+*/
+
+/*! \brief Opaque pointer \ingroup Datatypes */
+typedef struct ppl_Pointset_Powerset_C_Polyhedron_const_iterator_tag*
+ ppl_Pointset_Powerset_C_Polyhedron_const_iterator_t;
+
+/*! \brief Opaque pointer to const object \ingroup Datatypes */
+typedef struct ppl_Pointset_Powerset_C_Polyhedron_const_iterator_tag const*
+ ppl_const_Pointset_Powerset_C_Polyhedron_const_iterator_t;
+
+#endif /* !defined(PPL_DOXYGEN_CONFIGURED_MANUAL) */
+
+/*! \brief \name Construction, Initialization and Destruction */
+/*@{*/
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_iterator_tag \brief
+ Builds a new `iterator' and writes a handle to it
+ at address \p pit.
+*/
+int
+ppl_new_Pointset_Powerset_C_Polyhedron_iterator
+(ppl_Pointset_Powerset_C_Polyhedron_iterator_t* pit);
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_iterator_tag \brief
+ Builds a copy of \p y and writes a handle to it at address \p pit.
+*/
+int
+ppl_new_Pointset_Powerset_C_Polyhedron_iterator_from_iterator
+(ppl_Pointset_Powerset_C_Polyhedron_iterator_t* pit,
+ ppl_const_Pointset_Powerset_C_Polyhedron_iterator_t y);
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_const_iterator_tag \brief
+ Builds a new `const iterator' and writes a handle to it
+ at address \p pit.
+*/
+int
+ppl_new_Pointset_Powerset_C_Polyhedron_const_iterator
+(ppl_Pointset_Powerset_C_Polyhedron_const_iterator_t* pit);
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_const_iterator_tag \brief
+ Builds a copy of \p y and writes a handle to it at address \p pit.
+*/
+int
+ppl_new_Pointset_Powerset_C_Polyhedron_const_iterator_from_const_iterator
+(ppl_Pointset_Powerset_C_Polyhedron_const_iterator_t* pit,
+ ppl_const_Pointset_Powerset_C_Polyhedron_const_iterator_t y);
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_iterator_tag \brief
+ Assigns to \p psit an iterator "pointing" to the beginning of
+ the sequence of disjuncts of \p ps.
+*/
+int
+ppl_Pointset_Powerset_C_Polyhedron_iterator_begin
+(ppl_Pointset_Powerset_C_Polyhedron_t ps,
+ ppl_Pointset_Powerset_C_Polyhedron_iterator_t psit);
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_const_iterator_tag \brief
+ Assigns to \p psit a const iterator "pointing" to the beginning of
+ the sequence of disjuncts of \p ps.
+*/
+int
+ppl_Pointset_Powerset_C_Polyhedron_const_iterator_begin
+(ppl_const_Pointset_Powerset_C_Polyhedron_t ps,
+ ppl_Pointset_Powerset_C_Polyhedron_const_iterator_t psit);
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_iterator_tag \brief
+ Assigns to \p psit an iterator "pointing" past the end of
+ the sequence of disjuncts of \p ps.
+*/
+int
+ppl_Pointset_Powerset_C_Polyhedron_iterator_end
+(ppl_Pointset_Powerset_C_Polyhedron_t ps,
+ ppl_Pointset_Powerset_C_Polyhedron_iterator_t psit);
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_const_iterator_tag \brief
+ Assigns to \p psit a const iterator "pointing" past the end of
+ the sequence of disjuncts of \p ps.
+*/
+int
+ppl_Pointset_Powerset_C_Polyhedron_const_iterator_end
+(ppl_const_Pointset_Powerset_C_Polyhedron_t ps,
+ ppl_Pointset_Powerset_C_Polyhedron_const_iterator_t psit);
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_iterator_tag \brief
+ Invalidates the handle \p it: this makes sure the corresponding
+ resources will eventually be released.
+*/
+int
+ppl_delete_Pointset_Powerset_C_Polyhedron_iterator
+(ppl_const_Pointset_Powerset_C_Polyhedron_iterator_t it);
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_const_iterator_tag \brief
+ Invalidates the handle \p it: this makes sure the corresponding
+ resources will eventually be released.
+*/
+int
+ppl_delete_Pointset_Powerset_C_Polyhedron_const_iterator
+(ppl_const_Pointset_Powerset_C_Polyhedron_const_iterator_t it);
+
+/*@}*/ /* Construction, Initialization and Destruction */
+
+/*! \brief \name Dereferencing, Increment, Decrement and Equality Testing */
+/*@{*/
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_iterator_tag \brief
+ Dereferences \p it writing a const handle to the resulting disjunct
+ at address \p d.
+
+ \note
+ Even though \p it is an non-const iterator, dereferencing it results
+ in a handle to a \b const disjunct. This is because mutable iterators
+ are meant to allow for the modification of the sequence of disjuncts
+ (e.g., by dropping elements), while preventing direct modifications
+ of the disjuncts they point to.
+
+ \warning
+ On exit, the disjunct \p d is still owned by the powerset object:
+ any function call on the owning powerset object may invalidate it.
+ Moreover, \p d should \b not be deleted directly: its resources will
+ be released when deleting the owning powerset.
+*/
+int
+ppl_Pointset_Powerset_C_Polyhedron_iterator_dereference
+(ppl_const_Pointset_Powerset_C_Polyhedron_iterator_t it,
+ ppl_const_Polyhedron_t* d);
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_const_iterator_tag \brief
+ Dereferences \p it writing a const handle to the resulting disjunct
+ at address \p d.
+
+ \warning
+ On exit, the disjunct \p d is still owned by the powerset object:
+ any function call on the owning powerset object may invalidate it.
+ Moreover, \p d should \b not be deleted directly: its resources will
+ be released when deleting the owning powerset.
+*/
+int
+ppl_Pointset_Powerset_C_Polyhedron_const_iterator_dereference
+(ppl_const_Pointset_Powerset_C_Polyhedron_const_iterator_t it,
+ ppl_const_Polyhedron_t* d);
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_iterator_tag \brief
+ Increments \p it so that it "points" to the next disjunct.
+*/
+int
+ppl_Pointset_Powerset_C_Polyhedron_iterator_increment
+(ppl_Pointset_Powerset_C_Polyhedron_iterator_t it);
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_const_iterator_tag \brief
+ Increments \p it so that it "points" to the next disjunct.
+*/
+int
+ppl_Pointset_Powerset_C_Polyhedron_const_iterator_increment
+(ppl_Pointset_Powerset_C_Polyhedron_const_iterator_t it);
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_iterator_tag \brief
+ Decrements \p it so that it "points" to the previous disjunct.
+*/
+int
+ppl_Pointset_Powerset_C_Polyhedron_iterator_decrement
+(ppl_Pointset_Powerset_C_Polyhedron_iterator_t it);
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_const_iterator_tag \brief
+ Decrements \p it so that it "points" to the previous disjunct.
+*/
+int
+ppl_Pointset_Powerset_C_Polyhedron_const_iterator_decrement
+(ppl_Pointset_Powerset_C_Polyhedron_const_iterator_t it);
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_iterator_tag \brief
+ Returns a positive integer if the iterators corresponding to \p x and
+ \p y are equal; returns 0 if they are different.
+*/
+int
+ppl_Pointset_Powerset_C_Polyhedron_iterator_equal_test
+(ppl_const_Pointset_Powerset_C_Polyhedron_iterator_t x,
+ ppl_const_Pointset_Powerset_C_Polyhedron_iterator_t y);
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_const_iterator_tag \brief
+ Returns a positive integer if the iterators corresponding to \p x and
+ \p y are equal; returns 0 if they are different.
+*/
+int
+ppl_Pointset_Powerset_C_Polyhedron_const_iterator_equal_test
+(ppl_const_Pointset_Powerset_C_Polyhedron_const_iterator_t x,
+ ppl_const_Pointset_Powerset_C_Polyhedron_const_iterator_t y);
+
+/*@}*/ /* Dereferencing, Increment, Decrement and Equality Testing */
+
+
+/*! \brief \name Ad Hoc Functions for Pointset_Powerset domains */
+/*@{*/
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_tag \brief
+ Drops from the sequence of disjuncts in \p ps all the
+ non-maximal elements so that \p ps is non-redundant.
+*/
+int
+ppl_Pointset_Powerset_C_Polyhedron_omega_reduce
+(ppl_const_Pointset_Powerset_C_Polyhedron_t ps);
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_tag \brief
+ Writes to \p sz the number of disjuncts in \p ps.
+
+ \note
+ If present, Omega-redundant elements will be counted too.
+*/
+int
+ppl_Pointset_Powerset_C_Polyhedron_size
+(ppl_const_Pointset_Powerset_C_Polyhedron_t ps, size_t* sz);
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_tag \brief
+ Returns a positive integer if powerset \p x geometrically covers
+ powerset \p y; returns 0 otherwise.
+*/
+int
+ppl_Pointset_Powerset_C_Polyhedron_geometrically_covers_Pointset_Powerset_C_Polyhedron
+(ppl_const_Pointset_Powerset_C_Polyhedron_t x,
+ ppl_const_Pointset_Powerset_C_Polyhedron_t y);
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_tag \brief
+ Returns a positive integer if powerset \p x is geometrically
+ equal to powerset \p y; returns 0 otherwise.
+*/
+int
+ppl_Pointset_Powerset_C_Polyhedron_geometrically_equals_Pointset_Powerset_C_Polyhedron
+(ppl_const_Pointset_Powerset_C_Polyhedron_t x,
+ ppl_const_Pointset_Powerset_C_Polyhedron_t y);
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_tag \brief
+ Adds to \p ps a copy of disjunct \p d.
+*/
+int
+ppl_Pointset_Powerset_C_Polyhedron_add_disjunct
+(ppl_Pointset_Powerset_C_Polyhedron_t ps, ppl_const_Polyhedron_t d);
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_tag \brief
+ Drops from \p ps the disjunct pointed to by \p cit,
+ assigning to \p it an iterator to the disjunct following \p cit.
+*/
+int
+ppl_Pointset_Powerset_C_Polyhedron_drop_disjunct
+(ppl_Pointset_Powerset_C_Polyhedron_t ps,
+ ppl_const_Pointset_Powerset_C_Polyhedron_iterator_t cit,
+ ppl_Pointset_Powerset_C_Polyhedron_iterator_t it);
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_tag \brief
+ Drops from \p ps all the disjuncts from \p first to \p last (excluded).
+*/
+int
+ppl_Pointset_Powerset_C_Polyhedron_drop_disjuncts
+(ppl_Pointset_Powerset_C_Polyhedron_t ps,
+ ppl_const_Pointset_Powerset_C_Polyhedron_iterator_t first,
+ ppl_const_Pointset_Powerset_C_Polyhedron_iterator_t last);
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_tag \brief
+ Modifies \p ps by (recursively) merging together the pairs of
+ disjuncts whose upper-bound is the same as their set-theoretical union.
+*/
+int
+ppl_Pointset_Powerset_C_Polyhedron_pairwise_reduce
+(ppl_Pointset_Powerset_C_Polyhedron_t ps);
+
+/*@}*/ /* Ad Hoc Functions for Pointset_Powerset domains */