[PPL-devel] [GIT] ppl/ppl(pip): Improved consistency checks in method PIP_Solution_Node ::Tableau::OK().

Enea Zaffanella zaffanella at cs.unipr.it
Sat Jan 30 20:41:55 CET 2010


Module: ppl/ppl
Branch: pip
Commit: d11a14fc05769502dcb4332b2d2336681e57f229
URL:    http://www.cs.unipr.it/git/gitweb.cgi?p=ppl/ppl.git;a=commit;h=d11a14fc05769502dcb4332b2d2336681e57f229

Author: Enea Zaffanella <zaffanella at cs.unipr.it>
Date:   Sat Jan 30 20:39:36 2010 +0100

Improved consistency checks in method PIP_Solution_Node::Tableau::OK().
Prefer using Coefficient_traits::const_reference in parameter passing.

---

 src/PIP_Tree.cc         |   39 +++++++++++++++++++++++++--------------
 src/PIP_Tree.defs.hh    |   16 +++++++++-------
 src/PIP_Tree.inlines.hh |   12 +++++-------
 3 files changed, 39 insertions(+), 28 deletions(-)

diff --git a/src/PIP_Tree.cc b/src/PIP_Tree.cc
index 36a60a8..800992b 100644
--- a/src/PIP_Tree.cc
+++ b/src/PIP_Tree.cc
@@ -32,9 +32,10 @@ namespace {
 
 // Calculate positive modulo of x % y
 void
-mod_assign(Coefficient &z, Coefficient_traits::const_reference x,
+mod_assign(Coefficient &z,
+           Coefficient_traits::const_reference x,
            Coefficient_traits::const_reference y) {
-  z = x%y;
+  z = x % y;
   if (z < 0)
     z += y;
 }
@@ -79,7 +80,7 @@ merge_assign(Matrix& x,
 
 // Tranform expression "expr" into "-expr-1", using scaling
 void
-negate_assign(Row& x, const Row& y, const Coefficient& sc) {
+negate_assign(Row& x, const Row& y, Coefficient_traits::const_reference sc) {
   PPL_ASSERT(x.size() == y.size());
   for (dimension_type i = x.size(); i-- > 0; )
     x[i] = -y[i];
@@ -125,8 +126,8 @@ column_lower(const Matrix& tableau,
              dimension_type ja,
              const Row& pivot_b,
              dimension_type jb,
-             const Coefficient& cst_a = -1,
-             const Coefficient& cst_b = -1) {
+             Coefficient_traits::const_reference cst_a = -1,
+             Coefficient_traits::const_reference cst_b = -1) {
   PPL_DIRTY_TEMP_COEFFICIENT(cij_a);
   PPL_DIRTY_TEMP_COEFFICIENT(cij_b);
   const Coefficient& sij_a = pivot_a[ja];
@@ -237,7 +238,8 @@ PIP_Tree_Node::Artificial_Parameter::Artificial_Parameter()
 }
 
 PIP_Tree_Node::Artificial_Parameter
-::Artificial_Parameter(const Linear_Expression &e, const Coefficient &d)
+::Artificial_Parameter(const Linear_Expression &e,
+                       Coefficient_traits::const_reference d)
   : Linear_Expression(e), denominator(d) {
 }
 
@@ -424,20 +426,29 @@ PIP_Tree_Node::insert_artificials(Variables_Set &params,
 
 bool
 PIP_Solution_Node::Tableau::OK() const {
+  if (s.num_rows() != t.num_rows()) {
 #ifndef NDEBUG
-  using std::endl;
-  using std::cerr;
+    std::cerr << "PIP_Solution_Node::Tableau matrices "
+              << "have a different number of rows.\n";
 #endif
+    return false;
+  }
 
-  const dimension_type num_rows = s.num_rows();
-  if (num_rows != t.num_rows()) {
+  if (!s.OK() || !t.OK()) {
 #ifndef NDEBUG
-    cerr << "The PIP_Solution_Node::Tableau matrices do not have the "
-         << "same number of rows."
-         << endl;
+    std::cerr << "A PIP_Solution_Node::Tableau matrix is broken.\n";
 #endif
     return false;
   }
+
+  if (denominator <= 0) {
+#ifndef NDEBUG
+    std::cerr << "PIP_Solution_Node::Tableau with non-positive denominator.\n";
+#endif
+    return false;
+  }
+
+  // All tests passed.
   return true;
 }
 
@@ -688,7 +699,7 @@ PIP_Solution_Node::Tableau::normalize() {
 }
 
 void
-PIP_Solution_Node::Tableau::scale(const Coefficient &ratio) {
+PIP_Solution_Node::Tableau::scale(Coefficient_traits::const_reference ratio) {
   dimension_type i, j, k;
   dimension_type i_max = s.num_rows();
   dimension_type j_max = s.num_columns();
diff --git a/src/PIP_Tree.defs.hh b/src/PIP_Tree.defs.hh
index d984fea..9c07242 100644
--- a/src/PIP_Tree.defs.hh
+++ b/src/PIP_Tree.defs.hh
@@ -90,10 +90,11 @@ public:
   class Artificial_Parameter : public Linear_Expression {
   public:
     Artificial_Parameter();
-    Artificial_Parameter(const Linear_Expression &e, const Coefficient &d);
+    Artificial_Parameter(const Linear_Expression &e,
+                         Coefficient_traits::const_reference d);
     Artificial_Parameter(const Artificial_Parameter &x);
 
-    const Coefficient& get_denominator() const;
+    Coefficient_traits::const_reference get_denominator() const;
 
     //! Returns \b true if \p x and \p y are equal.
     friend bool operator==(const Artificial_Parameter& x,
@@ -296,14 +297,14 @@ private:
     //! Tests whether the matrix is integer, \e ie. the denominator is 1.
     bool is_integer() const;
     //! Multiplies all coefficients and denominator with ratio.
-    void scale(const Coefficient &ratio);
+    void scale(Coefficient_traits::const_reference ratio);
     //! Normalizes the modulo of coefficients so that they are mutually prime.
     /*!
       Computes the Greatest Common Divisor (GCD) among the elements of
       the matrices and normalizes them and the denominator by the GCD itself.
     */
     void normalize();
-    //!
+
     /*! \brief
       Compares two pivot row and column pairs before pivoting.
 
@@ -358,15 +359,16 @@ private:
                          const dimension_type j,
                          const dimension_type i_,
                          const dimension_type j_) const;
+
     //! Returns the value of the denominator.
-    const Coefficient &get_denominator() const;
+    Coefficient_traits::const_reference get_denominator() const;
 
     void ascii_dump(std::ostream& s) const;
     bool ascii_load(std::istream& s);
 
     //! Returns \c true if and only if \p *this is well formed.
-    virtual bool OK() const;
-  };
+    bool OK() const;
+  }; // struct Tableau
 
   //! The parametric simplex tableau.
   Tableau tableau;
diff --git a/src/PIP_Tree.inlines.hh b/src/PIP_Tree.inlines.hh
index d436da9..0449a2e 100644
--- a/src/PIP_Tree.inlines.hh
+++ b/src/PIP_Tree.inlines.hh
@@ -27,16 +27,14 @@ namespace Parma_Polyhedra_Library {
 
 inline
 PIP_Solution_Node::Tableau::Tableau()
-  : s(),
-    t(),
-    denominator(1) {
+  : s(), t(), denominator(1) {
+  PPL_ASSERT(OK());
 }
 
 inline
 PIP_Solution_Node::Tableau::Tableau(const Tableau& y)
-  : s(y.s),
-    t(y.t),
-    denominator(y.denominator) {
+  : s(y.s), t(y.t), denominator(y.denominator) {
+  PPL_ASSERT(OK());
 }
 
 inline
@@ -48,7 +46,7 @@ PIP_Solution_Node::Tableau::is_integer() const {
   return denominator == 1;
 }
 
-inline const Coefficient&
+inline Coefficient_traits::const_reference
 PIP_Solution_Node::Tableau::get_denominator() const {
   return denominator;
 }




More information about the PPL-devel mailing list