PPL  1.2
Parma_Polyhedra_Library::Grid_Certificate Class Reference

The convergence certificate for the Grid widening operator. More...

#include <Grid_Certificate_defs.hh>

Classes

struct  Compare
 A total ordering on Grid certificates. More...
 

Public Member Functions

 Grid_Certificate ()
 Default constructor. More...
 
 Grid_Certificate (const Grid &gr)
 Constructor: computes the certificate for gr. More...
 
 Grid_Certificate (const Grid_Certificate &y)
 Copy constructor. More...
 
 ~Grid_Certificate ()
 Destructor. More...
 
int compare (const Grid_Certificate &y) const
 The comparison function for certificates. More...
 
int compare (const Grid &gr) const
 Compares *this with the certificate for grid gr. More...
 
bool is_stabilizing (const Grid &gr) const
 Returns true if and only if the certificate for grid gr is strictly smaller than *this. More...
 
bool OK () const
 Check if gathered information is meaningful. More...
 

Private Attributes

dimension_type num_equalities
 
dimension_type num_proper_congruences
 

Detailed Description

The convergence certificate for the Grid widening operator.

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.

Definition at line 43 of file Grid_Certificate_defs.hh.

Constructor & Destructor Documentation

Parma_Polyhedra_Library::Grid_Certificate::Grid_Certificate ( )
inline

Default constructor.

Definition at line 32 of file Grid_Certificate_inlines.hh.

References OK().

34  // This is the certificate for a zero-dim universe grid.
35  PPL_ASSERT(OK());
36 }
bool OK() const
Check if gathered information is meaningful.
Parma_Polyhedra_Library::Grid_Certificate::Grid_Certificate ( const Grid gr)

Constructor: computes the certificate for gr.

Definition at line 33 of file Grid_Certificate.cc.

References Parma_Polyhedra_Library::Grid::con_sys, Parma_Polyhedra_Library::Grid::congruences_are_minimized(), Parma_Polyhedra_Library::Grid::congruences_are_up_to_date(), Parma_Polyhedra_Library::Grid::dim_kinds, Parma_Polyhedra_Library::Implementation::BD_Shapes::empty, Parma_Polyhedra_Library::Grid_Generator_System::empty(), Parma_Polyhedra_Library::Grid::gen_sys, Parma_Polyhedra_Library::Grid::generators_are_minimized(), Parma_Polyhedra_Library::Grid::generators_are_up_to_date(), Parma_Polyhedra_Library::Grid::marked_empty(), num_equalities, Parma_Polyhedra_Library::Congruence_System::num_equalities(), Parma_Polyhedra_Library::Grid_Generator_System::num_parameters(), num_proper_congruences, Parma_Polyhedra_Library::Congruence_System::num_proper_congruences(), Parma_Polyhedra_Library::Grid_Generator_System::num_rows(), PPL_USED, Parma_Polyhedra_Library::Grid::set_congruences_minimized(), Parma_Polyhedra_Library::Grid::set_generators_minimized(), Parma_Polyhedra_Library::Grid::simplify(), and Parma_Polyhedra_Library::Grid::space_dimension().

35 
36  // As in Polyhedron assume that `gr' contains at least one point.
37  PPL_ASSERT(!gr.marked_empty());
38  if (gr.space_dimension() == 0) {
39  return;
40  }
41  // One of the systems must be in minimal form.
42  if (gr.congruences_are_up_to_date()) {
43  if (gr.congruences_are_minimized()) {
44  num_proper_congruences = gr.con_sys.num_proper_congruences();
45  num_equalities = gr.con_sys.num_equalities();
46  }
47  else {
48  if (gr.generators_are_up_to_date() && gr.generators_are_minimized()) {
49  // Calculate number of congruences from generators.
51  = gr.gen_sys.num_parameters() + 1 /* Integrality cg. */;
52  num_equalities = gr.space_dimension() + 1 - gr.gen_sys.num_rows();
53  }
54  else {
55  // Minimize `gr' congruence system. As in Polyhedron assume
56  // that `gr' contains at least one point.
57  Grid& mgr = const_cast<Grid&>(gr);
58  const bool empty = Grid::simplify(mgr.con_sys, mgr.dim_kinds);
59  // Avoid possible compiler warning.
60  PPL_USED(empty);
61  PPL_ASSERT(!empty);
62  mgr.set_congruences_minimized();
63 
64  num_proper_congruences = mgr.con_sys.num_proper_congruences();
65  num_equalities = mgr.con_sys.num_equalities();
66  }
67  }
68  }
69  else {
70  if (!gr.generators_are_minimized()) {
71  // Minimize `gr' generator system. As in Polyhedron assume that
72  // `gr' contains at least one point.
73  Grid& mgr = const_cast<Grid&>(gr);
74  Grid::simplify(mgr.gen_sys, mgr.dim_kinds);
75  // If gen_sys contained rows before being reduced, it should
76  // contain at least a single point afterward.
77  PPL_ASSERT(!mgr.gen_sys.empty());
78  mgr.set_generators_minimized();
79  }
80  // Calculate number of congruences from generators.
82  = gr.gen_sys.num_parameters() + 1 /* Integrality cg. */;
84  = gr.space_dimension() + 1 - gr.gen_sys.num_rows();
85  }
86 }
static bool simplify(Congruence_System &cgs, Dimension_Kinds &dim_kinds)
Converts cgs to upper triangular (i.e. minimized) form.
#define PPL_USED(v)
No-op macro that allows to avoid unused variable warnings from the compiler.
Definition: compiler.hh:39
Parma_Polyhedra_Library::Grid_Certificate::Grid_Certificate ( const Grid_Certificate y)
inline

Copy constructor.

Definition at line 39 of file Grid_Certificate_inlines.hh.

40  : num_equalities(y.num_equalities),
41  num_proper_congruences(y.num_proper_congruences) {
42 }
Parma_Polyhedra_Library::Grid_Certificate::~Grid_Certificate ( )
inline

Destructor.

Definition at line 45 of file Grid_Certificate_inlines.hh.

45  {
46 }

Member Function Documentation

int Parma_Polyhedra_Library::Grid_Certificate::compare ( const Grid_Certificate y) const

The comparison function for certificates.

Returns
$-1$, $0$ or $1$ depending on whether *this is smaller than, equal to, or greater than y, respectively.

Definition at line 89 of file Grid_Certificate.cc.

References num_equalities, num_proper_congruences, and OK().

Referenced by is_stabilizing(), and Parma_Polyhedra_Library::Grid_Certificate::Compare::operator()().

89  {
90  PPL_ASSERT(OK() && y.OK());
91  if (num_equalities == y.num_equalities) {
92  if (num_proper_congruences == y.num_proper_congruences) {
93  return 0;
94  }
95  else {
96  return (num_proper_congruences > y.num_proper_congruences) ? 1 : -1;
97  }
98  }
99  return (num_equalities > y.num_equalities) ? 1 : -1;
100 }
bool OK() const
Check if gathered information is meaningful.
int Parma_Polyhedra_Library::Grid_Certificate::compare ( const Grid gr) const

Compares *this with the certificate for grid gr.

Definition at line 103 of file Grid_Certificate.cc.

References Parma_Polyhedra_Library::compare().

103  {
104  const Grid_Certificate gc(gr);
105  return compare(gc);
106 }
int compare(const Grid_Certificate &y) const
The comparison function for certificates.
bool Parma_Polyhedra_Library::Grid_Certificate::is_stabilizing ( const Grid gr) const
inline

Returns true if and only if the certificate for grid gr is strictly smaller than *this.

Definition at line 49 of file Grid_Certificate_inlines.hh.

References compare().

49  {
50  return compare(gr) == 1;
51 }
int compare(const Grid_Certificate &y) const
The comparison function for certificates.
bool Parma_Polyhedra_Library::Grid_Certificate::OK ( ) const

Check if gathered information is meaningful.

Definition at line 109 of file Grid_Certificate.cc.

Referenced by compare(), and Grid_Certificate().

109  {
110  // There is nothing to test.
111  return true;
112 }

Member Data Documentation

dimension_type Parma_Polyhedra_Library::Grid_Certificate::num_equalities
private

Number of a equalities in a minimized congruence system for the grid.

Definition at line 95 of file Grid_Certificate_defs.hh.

Referenced by compare(), and Grid_Certificate().

dimension_type Parma_Polyhedra_Library::Grid_Certificate::num_proper_congruences
private

Number of a proper congruences in a minimized congruence system for the grid.

Definition at line 98 of file Grid_Certificate_defs.hh.

Referenced by compare(), and Grid_Certificate().


The documentation for this class was generated from the following files: