Main Page | Modules | Namespace List | Class Hierarchy | Class List | Namespace Members | Class Members | Related Pages

Parma_Polyhedra_Library::Constraint Class Reference

A linear equality or inequality. More...

List of all members.

Public Types

enum  Type { EQUALITY, NONSTRICT_INEQUALITY, STRICT_INEQUALITY }
 The constraint type. More...

Public Member Functions

 Constraint (const Constraint &c)
 Ordinary copy-constructor.
 ~Constraint ()
 Destructor.
Constraintoperator= (const Constraint &c)
 Assignment operator.
dimension_type space_dimension () const
 Returns the dimension of the vector space enclosing *this.
Type type () const
 Returns the constraint type of *this.
bool is_equality () const
 Returns true if and only if *this is an equality constraint.
bool is_inequality () const
 Returns true if and only if *this is an inequality constraint (either strict or non-strict).
bool is_nonstrict_inequality () const
 Returns true if and only if *this is a non-strict inequality constraint.
bool is_strict_inequality () const
 Returns true if and only if *this is a strict inequality constraint.
const Integercoefficient (Variable v) const
 Returns the coefficient of v in *this.
const Integerinhomogeneous_term () const
 Returns the inhomogeneous term of *this.
bool OK () const
 Checks if all the invariants are satisfied.

Static Public Member Functions

const Constraintzero_dim_false ()
 The unsatisfiable (zero-dimension space) constraint $0 = 1$.
const Constraintzero_dim_positivity ()
 The true (zero-dimension space) constraint $0 \leq 1$, also known as positivity constraint.

Related Functions

(Note that these are not member functions.)

std::ostream & operator<< (std::ostream &s, const Constraint &c)
 Output operator.
Constraint operator== (const LinExpression &e1, const LinExpression &e2)
 Returns the constraint e1 = e2.
Constraint operator== (const LinExpression &e, const Integer &n)
 Returns the constraint e = n.
Constraint operator== (const Integer &n, const LinExpression &e)
 Returns the constraint n = e.
Constraint operator<= (const LinExpression &e1, const LinExpression &e2)
 Returns the constraint e1 <= e2.
Constraint operator<= (const LinExpression &e, const Integer &n)
 Returns the constraint e <= n.
Constraint operator<= (const Integer &n, const LinExpression &e)
 Returns the constraint n <= e.
Constraint operator>= (const LinExpression &e1, const LinExpression &e2)
 Returns the constraint e1 >= e2.
Constraint operator>= (const LinExpression &e, const Integer &n)
 Returns the constraint e >= n.
Constraint operator>= (const Integer &n, const LinExpression &e)
 Returns the constraint n >= e.
Constraint operator< (const LinExpression &e1, const LinExpression &e2)
 Returns the constraint e1 < e2.
Constraint operator< (const LinExpression &e, const Integer &n)
 Returns the constraint e < n.
Constraint operator< (const Integer &n, const LinExpression &e)
 Returns the constraint n < e.
Constraint operator> (const LinExpression &e1, const LinExpression &e2)
 Returns the constraint e1 > e2.
Constraint operator> (const LinExpression &e, const Integer &n)
 Returns the constraint e > n.
Constraint operator> (const Integer &n, const LinExpression &e)
 Returns the constraint n > e.
void swap (Parma_Polyhedra_Library::Constraint &x, Parma_Polyhedra_Library::Constraint &y)
 Specializes std::swap.


Detailed Description

A linear equality or inequality.

An object of the class Constraint is either:

where $n$ is the dimension of the space, $a_i$ is the integer coefficient of variable $x_i$ and $b$ is the integer inhomogeneous term.

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.
In the following examples it is assumed that variables x, y and z are defined as follows:
  Variable x(0);
  Variable y(1);
  Variable z(2);
Example 1
The following code builds the equality constraint $3x + 5y - z = 0$, having space-dimension $3$:
  Constraint eq_c(3*x + 5*y - z == 0);
The following code builds the (non-strict) inequality constraint $4x \geq 2y - 13$, having space-dimension $2$:
  Constraint ineq_c(4*x >= 2*y - 13);
The corresponding strict inequality constraint $4x > 2y - 13$ is obtained as follows:
  Constraint strict_ineq_c(4*x > 2*y - 13);
An unsatisfiable constraint on the zero-dimension space $\Rset^0$ can be specified as follows:
  Constraint false_c = Constraint::zero_dim_false();
Equivalent, but more involved ways are the following:
  Constraint false_c1(LinExpression::zero() == 1);
  Constraint false_c2(LinExpression::zero() >= 1);
  Constraint false_c3(LinExpression::zero() > 0);
In contrast, the following code defines an unsatisfiable constraint having space-dimension $3$:
  Constraint false_c(0*z == 1);
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.
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 $x - 5y + 3z <= 4$), we construct a new constraint corresponding to its complement (thus, in this case we want to obtain the strict inequality constraint $x - 5y + 3z > 4$).
  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 {
    LinExpression e;
    for (int i = c1.space_dimension() - 1; i >= 0; i--)
      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;
  }
The actual output is the following:
  Constraint c1: -A + 5*B - 3*C >= -4
  Complement c2: A - 5*B + 3*C > 4
Note that, in general, the particular output obtained can be syntactically different from the (semantically equivalent) constraint considered.


Member Enumeration Documentation

enum Parma_Polyhedra_Library::Constraint::Type
 

The constraint type.

Enumeration values:
EQUALITY  The constraint is an equality.
NONSTRICT_INEQUALITY  The constraint is a non-strict inequality.
STRICT_INEQUALITY  The constraint is a strict inequality.


Member Function Documentation

const Integer& Parma_Polyhedra_Library::Constraint::coefficient Variable  v  )  const
 

Returns the coefficient of v in *this.

Exceptions:
std::invalid_argument thrown if the index of v is greater than or equal to the space-dimension of *this.


Generated on Fri Aug 20 20:04:45 2004 for PPL by doxygen 1.3.8-20040812