[PPL-devel] [GIT] ppl/ppl(pip): Improved class PIP_Tree_Node::Artificial_Parameter.

Enea Zaffanella zaffanella at cs.unipr.it
Thu Feb 4 16:40:24 CET 2010


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

Author: Enea Zaffanella <zaffanella at cs.unipr.it>
Date:   Thu Feb  4 16:39:39 2010 +0100

Improved class PIP_Tree_Node::Artificial_Parameter.

---

 src/PIP_Tree.cc         |   13 +++++--
 src/PIP_Tree.defs.hh    |   93 ++++++++++++++++++++++++++++++++---------------
 src/PIP_Tree.inlines.hh |   15 ++++++--
 3 files changed, 84 insertions(+), 37 deletions(-)

diff --git a/src/PIP_Tree.cc b/src/PIP_Tree.cc
index 1194450..423ab70 100644
--- a/src/PIP_Tree.cc
+++ b/src/PIP_Tree.cc
@@ -300,23 +300,28 @@ operator==(const PIP_Tree_Node::Artificial_Parameter& x,
 
 void
 PIP_Tree_Node::Artificial_Parameter::ascii_dump(std::ostream& s) const {
-  s << "\ndenominator " << denominator << "\n";
+  s << "artificial_parameter ";
   Linear_Expression::ascii_dump(s);
+  s << " / " << denominator << "\n";
 }
 
 bool
 PIP_Tree_Node::Artificial_Parameter::ascii_load(std::istream& s) {
   std::string str;
-  if (!(s >> str) || str != "denominator")
-    return false;
-  if (!(s >> denominator))
+  if (!(s >> str) || str != "artificial_parameter")
     return false;
   if (!Linear_Expression::ascii_load(s))
     return false;
+  if (!(s >> str) || str != "/")
+    return false;
+  if (!(s >> denominator))
+    return false;
   PPL_ASSERT(OK());
   return true;
 }
 
+PPL_OUTPUT_DEFINITIONS(PIP_Tree_Node::Artificial_Parameter)
+
 PIP_Decision_Node::~PIP_Decision_Node() {
   delete true_child;
   delete false_child;
diff --git a/src/PIP_Tree.defs.hh b/src/PIP_Tree.defs.hh
index 9c9f412..6bfa57d 100644
--- a/src/PIP_Tree.defs.hh
+++ b/src/PIP_Tree.defs.hh
@@ -79,36 +79,7 @@ public:
   */
   const Constraint_System& constraints() const;
 
-  /*! \brief
-    A class to store the expession of artificial parameters in solution trees.
-
-    These locally new parameters are of the form of the integer division of a
-    linear expression of the other parameters (constant term included), by a
-    coefficient. Coefficients at indexes corresponding to variables always are
-    zero.
-  */
-  class Artificial_Parameter : public Linear_Expression {
-  public:
-    Artificial_Parameter();
-    Artificial_Parameter(const Linear_Expression& e,
-                         Coefficient_traits::const_reference d);
-    Artificial_Parameter(const Artificial_Parameter& y);
-
-    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,
-                           const Artificial_Parameter& y);
-
-    void ascii_dump(std::ostream& s) const;
-    bool ascii_load(std::istream& s);
-
-    //! Returns \c true if and only if the parameter is well-formed.
-    bool OK() const;
-
-  private:
-    Coefficient denominator;
-  }; // class Artificial_Parameter
+  class Artificial_Parameter;
 
   //! A type alias for a sequence of Artificial_Parameter's.
   typedef std::vector<Artificial_Parameter> Artificial_Parameter_Sequence;
@@ -232,6 +203,68 @@ protected:
 }; // class PIP_Tree_Node
 
 
+/*! \brief
+  Artificial parameters in PIP solution trees.
+
+  These parameters are built from a linear expression combining other
+  parameters (constant term included) divided by a positive integer
+  denominator. Coefficients at variables indices corresponding to
+  PIP problem variables are always zero.
+*/
+class PIP_Tree_Node::Artificial_Parameter
+  : public Linear_Expression {
+public:
+  //! Default constructor: builds a zero artificial parameter.
+  Artificial_Parameter();
+
+  //! Constructor.
+  /*!
+    Builds artificial parameter \f$\frac{\mathit{expr}}{\mathit{den}}\f$.
+
+    \param expr
+    The expression that, after normalization, will form the numerator of
+    the artificial parameter.
+
+    \param den
+    The integer constant thatm after normalization, will form the
+    denominator of the artificial parameter.
+
+    \exception std::invalid_argument
+    Thrown if \p den is zero.
+
+    Normalization will ensure that the denominator is positive.
+  */
+  Artificial_Parameter(const Linear_Expression& expr,
+                       Coefficient_traits::const_reference den);
+
+  //! Copy constructor.
+  Artificial_Parameter(const Artificial_Parameter& y);
+
+  //! Returns the normalized (i.e., positive) denominator.
+  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,
+                         const Artificial_Parameter& y);
+
+  PPL_OUTPUT_DECLARATIONS
+
+  /*! \brief
+    Loads from \p s an ASCII representation (as produced by
+    ascii_dump(std::ostream&) const) and sets \p *this accordingly.
+    Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+  */
+  bool ascii_load(std::istream& s);
+
+  //! Returns \c true if and only if the parameter is well-formed.
+  bool OK() const;
+
+private:
+  //! The normalized (i.e., positive) denominator.
+  Coefficient denominator;
+}; // class PIP_Tree_Node::Artificial_Parameter
+
+
 //! A tree node representing part of the space of solutions.
 class PIP_Solution_Node : public PIP_Tree_Node {
 public:
diff --git a/src/PIP_Tree.inlines.hh b/src/PIP_Tree.inlines.hh
index 2ea2d93..6544e59 100644
--- a/src/PIP_Tree.inlines.hh
+++ b/src/PIP_Tree.inlines.hh
@@ -118,9 +118,18 @@ PIP_Tree_Node::Artificial_Parameter::Artificial_Parameter()
 
 inline
 PIP_Tree_Node::Artificial_Parameter
-::Artificial_Parameter(const Linear_Expression &e,
-                       Coefficient_traits::const_reference d)
-  : Linear_Expression(e), denominator(d) {
+::Artificial_Parameter(const Linear_Expression& expr,
+                       Coefficient_traits::const_reference den)
+  : Linear_Expression(expr), denominator(den) {
+  if (denominator == 0)
+    throw std::invalid_argument("PIP_Tree_Node::Artificial_Parameter(e, d): "
+                                "denominator d is zero.");
+  // Normalize if needed.
+  if (denominator < 0) {
+    neg_assign(denominator);
+    Linear_Expression& expr = *this;
+    expr *= -1;
+  }
   PPL_ASSERT(OK());
 }
 




More information about the PPL-devel mailing list