[PPL-devel] [GIT] ppl/ppl(pip): Improved the documentation of the PIP solver.
François Galea
francois.galea at uvsq.fr
Mon Nov 30 17:14:51 CET 2009
Module: ppl/ppl
Branch: pip
Commit: 4394384f20722ac901f4b934780238580eae1767
URL: http://www.cs.unipr.it/git/gitweb.cgi?p=ppl/ppl.git;a=commit;h=4394384f20722ac901f4b934780238580eae1767
Author: François Galea <francois.galea at uvsq.fr>
Date: Mon Nov 30 17:08:59 2009 +0100
Improved the documentation of the PIP solver.
---
src/PIP_Problem.defs.hh | 86 +++++++++++++++++++++++++++++++++++++++++------
1 files changed, 75 insertions(+), 11 deletions(-)
diff --git a/src/PIP_Problem.defs.hh b/src/PIP_Problem.defs.hh
index d080e3c..e6768bb 100644
--- a/src/PIP_Problem.defs.hh
+++ b/src/PIP_Problem.defs.hh
@@ -88,7 +88,10 @@ operator<<(std::ostream& s, const PIP_Problem& p);
“false” child;
- solution nodes, encoding the solution of the problem in the current
context subset, where each variable is defined in terms of a linear
- expression of the parameters.
+ expression of the parameters. Solution nodes also embed an optionally
+ not empty set of parameter constraints, meaning if all constraint tests
+ are true, the solution is described by the node, otherwise the problem
+ is empty.
Concerning the decision nodes, it may happen that a decision node has no
“false” or “true” child. This means the
@@ -186,25 +189,86 @@ operator<<(std::ostream& s, const PIP_Problem& p);
values.
\par Solution tree spanning
- Retrieve the optimized decision tree:
+ Retrieve the optimized solution decision tree:
\code
const PIP_Tree_Node* node = solution();
\endcode
If the pointer designates a \f$\perp\f$ solution (infeasible), its value
is \c 0.\n
- FIXME: insert_artificials()
-
To check whether a non-null tree node pointer designates a solution or a
- decision node, you can call the as_decision() and as_solution() virtual
- methods:
+ decision node, you can call the PIP_Tree_Node::as_decision() and
+ PIP_Tree_Node::as_solution() virtual methods:
\code
const PIP_Solution_Node* sol = node->as_solution();
- const PIP_Decision_Node* dec = node->as_decision();
+ if (sol != 0) {
+ // The node is a solution node
+ ...
+ }
+ else {
+ // The node is a decision node
+ const PIP_Decision_Node* dec = node->as_decision();
+ ...
+ }
\endcode
- Exactly one of the \c sol and \c dec pointers will be \c 0. Then the
- node type is of the kind of the non-null pointer.\n
- FIXME: list of decision node tests, get true and false children
- FIXME: list expressions of variables.
+
+ \par
+ To access the two child nodes of a Decision Node, use the
+ PIP_Tree_Node::child_node(bool) method, using \b true or \b false as an
+ argument to access the child node you want.
+
+ \par Artificial parameters
+ The expression of an artificial parameter is stored in an
+ PIP_Tree_Node::Artificial_Parameter object, which encodes the integer
+ division of a Linear_Expression (only expressed in terms of the other
+ parameters, including the previously-defined artificials) by a
+ denominator Coefficient.
+ To get the effective value of an artificial parameter, just divide the
+ result of the Linear_Expression applied to the effective values of the
+ other parameters by the value of the denominator.
+ The dimensions of the artificial parameters in a node can be computed as
+ <tt>dim</tt>, <tt>dim+1</tt>, ... where <tt>dim</tt>'s value is computed
+ the following way:
+ - for the root node \c dim is the maximum space dimension of the
+ original problem, plus one.
+ - for any other node of the tree, it is the sum of the \c dim value
+ computed for the parent node, plus the total number of artificial
+ parameters in the parent node.
+ \par
+ The definition of artificial parameters' dimension values always follow
+ this rule. If you choose to add a new variable or parameter on a problem
+ which already has a solution (incremental solving), all artificial
+ parameters in the solution will have their dimension values incremented.
+
+ \par Node constraints
+ All node types can embed parameter-only constraints. Decision nodes
+ contain at least one of them. You can access the node's constraints set
+ using the PIP_Tree_Node::constraints() method.
+ The signification of the node constraints is the following:
+ - On a decision node, if all tests in the constraints are true, then the
+ solution is the “true” child; otherwise it is the
+ “false” child. If the number of constraints is greater than
+ one, the “false” child is always infeasible.
+ - On a solution node, if the constraint set is empty or all tests in the
+ constraints are true, then the solution is described by the node;
+ otherwise the solution is \f$\perp\f$ (infeasible problem).
+ \par
+ Node constraints always are defined in terms of the parameters, including
+ those from the original problem and any of the artificial parameters
+ defined in nodes which belong to the path from the root to the concerned
+ node.
+
+ \par Getting the optimal values for the variables
+ Once having spanned the solution tree using the actual values of the
+ parameters, and having ended at a solution node, you can fetch the
+ parametric expression of any of the variables using the
+ PIP_Solution_Node::parametric_values() method.
+ \par
+ Variable expressions always are defined in terms of the parameters,
+ including those from the original problem and any of the artificial
+ parameters defined in nodes which belong to the path from the root to the
+ concerned node.
+
+ FIXME: different uses of the big parameter.
*/
class Parma_Polyhedra_Library::PIP_Problem {
More information about the PPL-devel
mailing list