[PPL-devel] [GIT] ppl/ppl(pip): Implemented an example of solution tree spanning and display using
François Galea
francois.galea at uvsq.fr
Tue Nov 3 10:29:33 CET 2009
Module: ppl/ppl
Branch: pip
Commit: f09897ddab17ad111ac6a79d4334cee8256f73fa
URL: http://www.cs.unipr.it/git/gitweb.cgi?p=ppl/ppl.git;a=commit;h=f09897ddab17ad111ac6a79d4334cee8256f73fa
Author: François Galea <francois.galea at uvsq.fr>
Date: Tue Nov 3 09:54:58 2009 +0100
Implemented an example of solution tree spanning and display using
the C interface.
---
interfaces/C/tests/pip_test.c | 121 ++++++++++++++++++++++++++++++++++++++++-
1 files changed, 120 insertions(+), 1 deletions(-)
diff --git a/interfaces/C/tests/pip_test.c b/interfaces/C/tests/pip_test.c
index ab56dbf..60471a1 100644
--- a/interfaces/C/tests/pip_test.c
+++ b/interfaces/C/tests/pip_test.c
@@ -25,6 +25,7 @@ site: http://www.cs.unipr.it/ppl/ . */
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
+#include <string.h>
static const char* program_name = 0;
@@ -45,6 +46,124 @@ fatal(const char* format, ...) {
my_exit(1);
}
+static void
+display_solution_i(ppl_const_PIP_Tree_Node_t node,
+ ppl_dimension_type n_vars,
+ ppl_dimension_type n_params,
+ const ppl_dimension_type vars[],
+ const ppl_dimension_type params[],
+ int indent) {
+ if (!node) {
+ printf("%*s_|_\n", indent*2, "");
+ } else {
+ ppl_dimension_type space_dimension = n_vars + n_params;
+ ppl_dimension_type new_params;
+ ppl_dimension_type* parameters;
+ ppl_const_Constraint_System_t constraints;
+ ppl_const_PIP_Decision_Node_t dn;
+ int constraints_empty;
+ ppl_PIP_Tree_Node_number_of_artificials(node, &new_params);
+ parameters = malloc((n_params+new_params)*sizeof(ppl_dimension_type));
+ memcpy(parameters, params, n_params*sizeof(ppl_dimension_type));
+ if (new_params > 0) {
+ ppl_Artificial_Parameter_Sequence_const_iterator_t i, i_end;
+ ppl_PIP_Tree_Node_insert_artificials(node, parameters, n_params,
+ space_dimension);
+ ppl_new_Artificial_Parameter_Sequence_const_iterator(&i);
+ ppl_new_Artificial_Parameter_Sequence_const_iterator(&i_end);
+ ppl_PIP_Tree_Node_begin(node, i);
+ ppl_PIP_Tree_Node_end(node, i_end);
+ while (!ppl_Artificial_Parameter_Sequence_const_iterator_equal_test
+ (i,i_end)) {
+ ppl_const_Artificial_Parameter_t ap;
+ ppl_Artificial_Parameter_Sequence_const_iterator_dereference(i, &ap);
+ printf("%*sParameter ", indent*2, "");
+ ppl_io_print_variable(space_dimension++);
+ printf(" = ");
+ ppl_io_print_Artificial_Parameter(ap);
+ printf("\n");
+ ppl_Artificial_Parameter_Sequence_const_iterator_increment(i);
+ }
+ ppl_delete_Artificial_Parameter_Sequence_const_iterator(i_end);
+ ppl_delete_Artificial_Parameter_Sequence_const_iterator(i);
+ }
+
+ ppl_PIP_Tree_Node_get_constraints(node, &constraints);
+ constraints_empty = ppl_Constraint_System_empty(constraints);
+ if (!constraints_empty) {
+ int notfirst = 0;
+ ppl_Constraint_System_const_iterator_t end, i;
+ ppl_new_Constraint_System_const_iterator(&i);
+ ppl_new_Constraint_System_const_iterator(&end);
+ ppl_Constraint_System_begin(constraints, i);
+ ppl_Constraint_System_end(constraints, end);
+ printf("%*sif ", indent*2, "");
+ for (; !ppl_Constraint_System_const_iterator_equal_test(i,end);
+ ppl_Constraint_System_const_iterator_increment(i)) {
+ ppl_const_Constraint_t c;
+ if (notfirst)
+ printf(" and ");
+ ppl_Constraint_System_const_iterator_dereference(i, &c);
+ ppl_io_print_Constraint(c);
+ notfirst = 1;
+ }
+ printf(" then\n");
+ }
+ ppl_PIP_Tree_Node_as_decision(node, &dn);
+ n_params += new_params;
+ if (dn) {
+ ppl_const_PIP_Tree_Node_t child;
+ ppl_PIP_Decision_Node_get_child_node(dn, 1, &child);
+ display_solution_i(child, n_vars, n_params, vars, parameters, indent+1);
+ printf("%*selse\n", indent*2, "");
+ ppl_PIP_Decision_Node_get_child_node(dn, 0, &child);
+ display_solution_i(child, n_vars, n_params, vars, parameters, indent+1);
+ } else {
+ int notfirst = 0;
+ ppl_const_PIP_Solution_Node_t sn;
+ ppl_dimension_type i;
+ ppl_const_Linear_Expression_t le;
+ ppl_PIP_Tree_Node_as_solution(node, &sn);
+ printf("%*s{", indent*2+(constraints_empty?0:2), "");
+ for (i=0; i<n_vars; ++i) {
+ if (notfirst)
+ printf(" ; ");
+ ppl_PIP_Solution_Node_get_parametric_values(sn, vars[i], parameters,
+ n_params, &le);
+ ppl_io_print_Linear_Expression(le);
+ notfirst = 1;
+ }
+ printf("}\n");
+ if (!constraints_empty)
+ printf("%*selse\n%*s_|_\n", indent*2, "", indent*2+2, "");
+ }
+ free(parameters);
+ }
+}
+
+void
+display_solution(ppl_const_PIP_Tree_Node_t node,
+ ppl_dimension_type n_vars,
+ ppl_dimension_type n_params,
+ const ppl_dimension_type params[]) {
+ ppl_dimension_type* vars;
+ ppl_dimension_type i, j, k, dim;
+ vars = malloc(n_vars*sizeof(ppl_dimension_type));
+ dim = n_vars+n_params;
+
+ /* construct the array of variable space indices. This requires the params
+ array to be sorted in ascending order.
+ */
+ for (i=0, j=0, k=0; i<dim; ++i) {
+ if (k == n_params || i < params[k])
+ vars[j++] = i;
+ else
+ ++k;
+ }
+ display_solution_i(node, n_vars, n_params, vars, params, 0);
+ free(vars);
+}
+
#define N_VARS 2
#define N_PARAMETERS 2
#define N_CONSTRAINTS 4
@@ -105,7 +224,7 @@ main(int argc, char **argv) {
ppl_const_PIP_Tree_Node_t solution;
ppl_PIP_Problem_space_dimension(pip, &dim);
ppl_PIP_Problem_solution(pip, &solution);
- /* display_solution(solution, N_VARS, N_PARAMETERS, parameter_dim); */
+ display_solution(solution, N_VARS, N_PARAMETERS, parameter_dim);
}
ppl_delete_PIP_Problem(pip);
More information about the PPL-devel
mailing list