[PPL-devel] [GIT] ppl/ppl(pip): More functions for the C interface to the PIP Tree class

Patricia Hill p.m.hill at leeds.ac.uk
Sat Oct 10 00:28:08 CEST 2009


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

Author: Patricia Hill <p.m.hill at leeds.ac.uk>
Date:   Fri Oct  9 23:25:07 2009 +0100

More functions for the C interface to the PIP Tree class
- in particular, corresponding to the PIP_Solution_Node and
PIP_Decision_Node C++ methods.

Various small bugs fixed in the PIP_Problem C interface code.

---

 interfaces/C/ppl_c_header.h                 |   91 ++++++++++++++++++++-------
 interfaces/C/ppl_c_implementation_common.cc |   59 +++++++++++++++++
 2 files changed, 127 insertions(+), 23 deletions(-)

diff --git a/interfaces/C/ppl_c_header.h b/interfaces/C/ppl_c_header.h
index 142431c..8d48fbe 100644
--- a/interfaces/C/ppl_c_header.h
+++ b/interfaces/C/ppl_c_header.h
@@ -2768,7 +2768,7 @@ int
 ppl_PIP_Problem_solve PPL_PROTO((ppl_const_PIP_Problem_t pip));
 
   /*! \relates ppl_PIP_Problem_tag \brief
-    Returns a feasible solution for \p *this, if it exists.
+    Writes to \p pip_tree a solution for \p pip, if it exists.
 
     \param pip
     The PIP problem;
@@ -2784,7 +2784,7 @@ ppl_PPL_Problem_solution PPL_PROTO((ppl_const_PIP_Problem_t pip,
                                     ppl_const_PIP_Tree_Node_t* pip_tree));
 
   /*! \relates ppl_PIP_Problem_tag \brief
-    Returns an optimizing solution for \p *this, if it exists.
+    Writes to \p pip_tree an optimizing solution for \p pip, if it exists.
 
     \param pip
     The PIP problem;
@@ -2793,7 +2793,7 @@ ppl_PPL_Problem_solution PPL_PROTO((ppl_const_PIP_Problem_t pip,
     The PIP tree;
 
     \exception std::domain_error
-    Thrown if \p *this doesn't not have an optimizing point, i.e.,
+    Thrown if \p pip does not not have an optimizing point, i.e.,
     if the PIP problem is unbounded or not satisfiable.
   */
 int
@@ -2803,25 +2803,9 @@ PPL_PROTO((ppl_const_PIP_Problem_t pip,
 
 /*@}*/ /* Computing the Solution of the PIP_Problem */
 
-/*! \brief \name Querying/Setting Control Parameters */
-/*@{*/
-
-/*! \relates ppl_PIP_Problem_tag \brief
-  Returns the value of control parameter \p name in problem \p pip.
-*/
-int
-ppl_PIP_Problem_get_control_parameter
-PPL_PROTO((ppl_const_PIP_Problem_t pip, int name));
-
-/*! \relates ppl_PIP_Problem_tag \brief
-  Sets control parameter \p value in problem \p pip.
-*/
-int
-ppl_PIP_Problem_set_control_parameter
-PPL_PROTO((ppl_PIP_Problem_t pip, int value));
-
 /*! \relates ppl_PIP_Problem_tag \brief
-  Returns \p this if \p *this is a solution node, 0 otherwise.
+  Writes to \p dpip_tree the solution node if \p spip_tree is
+  a solution node, and 0 otherwise.
 */
 int
 ppl_PIP_Tree_Node_as_solution
@@ -2829,7 +2813,8 @@ PPL_PROTO((ppl_const_PIP_Tree_Node_t spip_tree,
            ppl_const_PIP_Solution_Node_t* dpip_tree));
 
 /*! \relates ppl_PIP_Problem_tag \brief
-  Returns \p this if \p *this is a decision node, 0 otherwise.
+  Writes to \p dpip_tree the decision node if \p spip_tree
+  is a decision node, and 0 otherwise.
 */
 int
 ppl_PIP_Tree_Node_as_decision
@@ -2837,7 +2822,8 @@ PPL_PROTO((ppl_const_PIP_Tree_Node_t spip_tree,
            ppl_const_PIP_Decision_Node_t* dpip_tree));
 
 /*! \relates ppl_PIP_Problem_tag \brief
-  Returns the value of control parameter \p name in problem \p pip.
+  Writes to \p pcs the local system of parameter constraints
+  at the pip tree node \p pip_tree.
 */
 int
 ppl_PIP_Tree_Node_get_constraints
@@ -2899,6 +2885,61 @@ PPL_PROTO((ppl_const_PIP_Tree_Node_t pip_tree,
            ppl_dimension_type inserted));
 
 /*! \relates ppl_PIP_Problem_tag \brief
+  Builds a trivial PIP problem of dimension \p d and writes an
+  handle to it at address \p pmip.
+*/
+int
+ppl_new_PIP_Solution_Node PPL_PROTO((ppl_PIP_Solution_Node_t* ppip_sol));
+
+/*! \relates ppl_PIP_Problem_tag \brief
+  Invalidates the handle \p pip_sol: this makes sure the corresponding
+  resources will eventually be released.
+*/
+int
+ppl_delete_PIP_Solution_Node PPL_PROTO((ppl_const_PIP_Solution_Node_t pip_sol));
+
+/*! \relates ppl_PIP_Problem_tag \brief
+  Writes to \p le a parametric expression of the values of variable \p v.
+
+  The returned linear expression only involves parameters.
+
+  \param v
+  the variable which is queried about
+
+  \param pars
+  a \c std::set of indices of the parameters in the constraints
+
+  \exception std::invalid_argument
+  Thrown if \p v is dimension-incompatible with \p *this
+  or if \p v is a parameter.
+*/
+int
+ppl_PIP_Solution_Node_get_parametric_values
+PPL_PROTO((ppl_const_PIP_Solution_Node_t pip_sol,
+           ppl_dimension_type v,
+           ppl_dimension_type pars[],
+           size_t n,
+           ppl_Linear_Expression_t le));
+
+
+/*! \relates ppl_PIP_Problem_tag \brief
+  Invalidates the handle \p pip_dec: this makes sure the corresponding
+  resources will eventually be released.
+*/
+int
+ppl_delete_PIP_Decision_Node PPL_PROTO((ppl_const_PIP_Decision_Node_t pip_dec));
+
+/*! \relates ppl_PIP_Problem_tag \brief
+  Writes to \p pip_tree a const pointer to the \p b (true or false) branch
+  of \p pip_dec.
+*/
+int
+ppl_PIP_Decision_Node_get_child_node
+PPL_PROTO((ppl_const_PIP_Decision_Node_t pip_dec,
+           int b,
+           ppl_const_PIP_Tree_Node_t* pip_tree));
+
+/*! \relates ppl_PIP_Problem_tag \brief
   Creates a new artificial parameter corresponding to the constant 0 in a
   zero-dimensional space; writes a handle for the new artificial
   parameter at address \p pap.
@@ -2942,6 +2983,10 @@ PPL_DECLARE_AND_DOCUMENT_IO_FUNCTIONS(PIP_Problem)
 
 PPL_DECLARE_AND_DOCUMENT_IO_FUNCTIONS(PIP_Tree_Node)
 
+PPL_DECLARE_AND_DOCUMENT_IO_FUNCTIONS(PIP_Solution_Node)
+
+PPL_DECLARE_AND_DOCUMENT_IO_FUNCTIONS(PIP_Decision_Node)
+
 PPL_DECLARE_AND_DOCUMENT_IO_FUNCTIONS(Artificial_Parameter)
 
 #include "ppl_c_domains.h"
diff --git a/interfaces/C/ppl_c_implementation_common.cc b/interfaces/C/ppl_c_implementation_common.cc
index 9ff417c..e1201b8 100644
--- a/interfaces/C/ppl_c_implementation_common.cc
+++ b/interfaces/C/ppl_c_implementation_common.cc
@@ -2321,6 +2321,65 @@ ppl_PIP_Tree_Node_insert_artificials(ppl_const_PIP_Tree_Node_t pip_tree,
 CATCH_ALL
 
 int
+ppl_new_PIP_Solution_Node(ppl_PIP_Solution_Node_t* ppip_sol) try {
+  *ppip_sol = to_nonconst(new PIP_Solution_Node());
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_delete_PIP_Solution_Node(ppl_const_PIP_Solution_Node_t pip_sol) try {
+  delete to_const(pip_sol);
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_PIP_Solution_Node_get_parametric_values
+  (ppl_const_PIP_Solution_Node_t pip_sol,
+   ppl_dimension_type v,
+   ppl_dimension_type pars[],
+   size_t n,
+   ppl_const_Linear_Expression_t* le) try {
+  const PIP_Solution_Node& spip_sol = *to_const(pip_sol);
+  Variables_Set vars;
+  for (ppl_dimension_type i = n; i-- > 0; )
+    vars.insert(pars[i]);
+  const Linear_Expression& lle = spip_sol.parametric_values(Variable(v),vars);
+  *le = to_const(&lle);
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_PIP_Solution_Node_OK(ppl_const_PIP_Solution_Node_t pip_sol) try {
+  return to_const(pip_sol)->OK() ? 1 : 0;
+}
+CATCH_ALL
+
+int
+ppl_delete_PIP_Decision_Node(ppl_const_PIP_Decision_Node_t pip_dec) try {
+  delete to_const(pip_dec);
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_PIP_Decision_Node_OK(ppl_const_PIP_Decision_Node_t pip_dec) try {
+  return to_const(pip_dec)->OK() ? 1 : 0;
+}
+CATCH_ALL
+
+int
+ppl_PIP_Decision_Node_get_child_node(ppl_const_PIP_Decision_Node_t pip_dec,
+                                     int b,
+                                     ppl_const_PIP_Tree_Node_t* pip_tree) try {
+  *pip_tree = to_const(to_const(pip_dec)->child_node(b));
+  return 0;
+}
+CATCH_ALL
+
+int
 ppl_new_Artificial_Parameter(ppl_Artificial_Parameter_t* pap) try {
   *pap = to_nonconst(new Artificial_Parameter());
   return 0;




More information about the PPL-devel mailing list