[PPL-devel] [GIT] ppl/ppl(pip): Prefer not_a_dimension() as a marker if the big parameter is not set.
Enea Zaffanella
zaffanella at cs.unipr.it
Tue Nov 24 12:10:48 CET 2009
Module: ppl/ppl
Branch: pip
Commit: 06c6a3408fb5967bb29230306b4f71f02120dbd0
URL: http://www.cs.unipr.it/git/gitweb.cgi?p=ppl/ppl.git;a=commit;h=06c6a3408fb5967bb29230306b4f71f02120dbd0
Author: Enea Zaffanella <zaffanella at cs.unipr.it>
Date: Tue Nov 24 12:09:20 2009 +0100
Prefer not_a_dimension() as a marker if the big parameter is not set.
---
src/PIP_Problem.cc | 18 ++++++++++--------
src/PIP_Problem.defs.hh | 11 +++++++++--
src/PIP_Problem.inlines.hh | 2 --
src/PIP_Problem.templates.hh | 2 +-
src/PIP_Tree.cc | 7 ++++---
src/PIP_Tree.defs.hh | 6 ++++--
tests/PIP_Problem/pipproblem2.cc | 18 ++++++++++++++++++
7 files changed, 46 insertions(+), 18 deletions(-)
diff --git a/src/PIP_Problem.cc b/src/PIP_Problem.cc
index 6f4c01c..687f3e6 100644
--- a/src/PIP_Problem.cc
+++ b/src/PIP_Problem.cc
@@ -42,7 +42,7 @@ PPL::PIP_Problem::PIP_Problem(const dimension_type dim)
first_pending_constraint(0),
parameters(),
initial_context(),
- big_parameter_dimension(0) {
+ big_parameter_dimension(not_a_dimension()) {
// Check for space dimension overflow.
if (dim > max_space_dimension())
throw std::length_error("PPL::PIP_Problem::PIP_Problem(dim):\n"
@@ -247,7 +247,7 @@ PPL::PIP_Problem::OK() const {
return false;
}
- if (big_parameter_dimension != 0
+ if (big_parameter_dimension != not_a_dimension()
&& parameters.count(big_parameter_dimension) == 0) {
#ifndef NDEBUG
cerr << "The current value for the big parameter is not a parameter "
@@ -323,7 +323,9 @@ PPL::PIP_Problem::ascii_dump(std::ostream& s) const {
s << "\n";
}
- s << "\nbig_parameter_dimension: " << big_parameter_dimension << " \n";
+ s << "\nbig_parameter_dimension: "
+ << big_parameter_dimension
+ << "\n";
}
PPL_OUTPUT_DEFINITIONS(PIP_Problem)
@@ -447,7 +449,7 @@ PPL::PIP_Problem::clear() {
parameters.clear();
initial_context.clear();
control_parameters_init();
- big_parameter_dimension = 0;
+ big_parameter_dimension = not_a_dimension();
}
void
@@ -557,12 +559,12 @@ PPL::PIP_Problem::set_control_parameter(Control_Parameter_Value value) {
void
PPL::PIP_Problem::set_big_parameter_dimension(dimension_type x) {
if (parameters.count(x) == 0)
- throw std::invalid_argument("PPL::PIP_Problem::set_big_parameter_dimension"
- "(x):\n"
+ throw std::invalid_argument("PPL::PIP_Problem::"
+ "set_big_parameter_dimension(x):\n"
"dimension 'x' is not a parameter.");
if (x < internal_space_dim)
- throw std::invalid_argument("PPL::PIP_Problem::set_big_parameter_dimension"
- "(x):\n"
+ throw std::invalid_argument("PPL::PIP_Problem::"
+ "set_big_parameter_dimension(x):\n"
"only newly-added parameters can be"
"converted into the big parameter.");
big_parameter_dimension = x;
diff --git a/src/PIP_Problem.defs.hh b/src/PIP_Problem.defs.hh
index af6941f..e075acd 100644
--- a/src/PIP_Problem.defs.hh
+++ b/src/PIP_Problem.defs.hh
@@ -318,7 +318,11 @@ public:
//! Sets the dimension for the big parameter
void set_big_parameter_dimension(dimension_type x);
- //! Gets the dimension for the big parameter
+ /*! \brief
+ Returns the space dimension for the big parameter.
+
+ If a big parameter was not set, returns \c not_a_dimension().
+ */
dimension_type get_big_parameter_dimension() const;
private:
@@ -389,7 +393,10 @@ private:
Control_Parameter_Value
control_parameters[CONTROL_PARAMETER_NAME_SIZE];
- //! The dimension for the big parameter, or zero if not set.
+ /*! \brief
+ The dimension for the big parameter, or \c not_a_dimension()
+ if not set.
+ */
dimension_type big_parameter_dimension;
};
diff --git a/src/PIP_Problem.inlines.hh b/src/PIP_Problem.inlines.hh
index cd052a6..b2f3bc3 100644
--- a/src/PIP_Problem.inlines.hh
+++ b/src/PIP_Problem.inlines.hh
@@ -73,14 +73,12 @@ PIP_Problem::operator=(const PIP_Problem& y) {
return *this;
}
-//! Returns the control parameter value for parameter name \p n.
inline PIP_Problem::Control_Parameter_Value
PIP_Problem::get_control_parameter(Control_Parameter_Name n) const {
assert(n >= 0 && n < CONTROL_PARAMETER_NAME_SIZE);
return control_parameters[n];
}
-//! Gets the dimension for the big parameter
inline dimension_type
PIP_Problem::get_big_parameter_dimension() const {
return big_parameter_dimension;
diff --git a/src/PIP_Problem.templates.hh b/src/PIP_Problem.templates.hh
index 6fe4579..f5fc761 100644
--- a/src/PIP_Problem.templates.hh
+++ b/src/PIP_Problem.templates.hh
@@ -41,7 +41,7 @@ PIP_Problem::PIP_Problem(dimension_type dim,
first_pending_constraint(0),
parameters(p_vars),
initial_context(),
- big_parameter_dimension(0) {
+ big_parameter_dimension(not_a_dimension()) {
// Check that integer Variables_Set does not exceed the space dimension
// of the problem.
if (p_vars.space_dimension() > external_space_dim) {
diff --git a/src/PIP_Tree.cc b/src/PIP_Tree.cc
index 1fcb98e..de77be6 100644
--- a/src/PIP_Tree.cc
+++ b/src/PIP_Tree.cc
@@ -230,7 +230,7 @@ PIP_Solution_Node::PIP_Solution_Node()
var_row(),
var_column(),
special_equality_row(0),
- big_dimension(0),
+ big_dimension(not_a_dimension()),
sign(),
solution(),
solution_valid(false) {
@@ -923,7 +923,7 @@ PIP_Solution_Node
PIP_Solution_Node::Row_Sign
PIP_Solution_Node::row_sign(const Row &x, dimension_type big_dimension) {
- if (big_dimension > 0) {
+ if (big_dimension != not_a_dimension()) {
/* If a big parameter has been set and its coefficient is not zero,
just return the sign of the coefficient */
const Coefficient &c = x[big_dimension];
@@ -1173,7 +1173,8 @@ PIP_Solution_Node::update_tableau(const PIP_Problem& problem,
}
}
internal_space_dim = external_space_dim;
- if (big_dimension == 0 && problem.big_parameter_dimension > 0) {
+ if (big_dimension == not_a_dimension()
+ && problem.big_parameter_dimension != not_a_dimension()) {
// Compute the column number of big parameter in tableau.t matrix
Variables_Set::const_iterator begin = parameters.begin();
Variables_Set::const_iterator pos
diff --git a/src/PIP_Tree.defs.hh b/src/PIP_Tree.defs.hh
index 3de1cb6..955c100 100644
--- a/src/PIP_Tree.defs.hh
+++ b/src/PIP_Tree.defs.hh
@@ -372,8 +372,10 @@ private:
*/
dimension_type special_equality_row;
- /*! \brief The column number in the parametric part of the simplex tableau
- which corresponds to the big parameter
+ /*! \brief
+ The column number in the parametric part of the simplex tableau
+ which corresponds to the big parameter; \c not_a_dimension()
+ if not set.
*/
dimension_type big_dimension;
diff --git a/tests/PIP_Problem/pipproblem2.cc b/tests/PIP_Problem/pipproblem2.cc
index 068e20d..a6b5b8c 100644
--- a/tests/PIP_Problem/pipproblem2.cc
+++ b/tests/PIP_Problem/pipproblem2.cc
@@ -92,10 +92,28 @@ test03() {
return ok;
}
+bool
+test04() {
+ PIP_Problem pip(6);
+ Variables_Set params(Variable(3), Variable(5));
+ pip.add_to_parameter_space_dimensions(params);
+
+ bool ok = (pip.get_big_parameter_dimension() == not_a_dimension());
+
+ pip.set_big_parameter_dimension(3);
+ ok &= (pip.get_big_parameter_dimension() == 3);
+
+ pip.set_big_parameter_dimension(5);
+ ok &= (pip.get_big_parameter_dimension() == 5);
+
+ return ok;
+}
+
} // namespace
BEGIN_MAIN
DO_TEST(test01);
DO_TEST(test02);
DO_TEST(test03);
+ DO_TEST(test04);
END_MAIN
More information about the PPL-devel
mailing list