
Module: ppl/ppl Branch: master Commit: f7c33880fca5903781922d35eb284d4e8e44c623 URL: http://www.cs.unipr.it/git/gitweb.cgi?p=ppl/ppl.git;a=commit;h=f7c33880fca59...
Author: Enea Zaffanella zaffanella@cs.unipr.it Date: Mon Mar 29 10:08:20 2010 +0200
Added to Prolog interface the predicates for quasi-ranking functions.
---
.../ppl_interface_generator_prolog_cc_code.m4 | 124 ++++++++++++++++---- .../ppl_interface_generator_prolog_hh_code.m4 | 19 +++ ...erface_generator_prolog_procedure_generators.m4 | 2 + 3 files changed, 121 insertions(+), 24 deletions(-)
diff --git a/interfaces/Prolog/ppl_interface_generator_prolog_cc_code.m4 b/interfaces/Prolog/ppl_interface_generator_prolog_cc_code.m4 index 39dcd33..de6a103 100644 --- a/interfaces/Prolog/ppl_interface_generator_prolog_cc_code.m4 +++ b/interfaces/Prolog/ppl_interface_generator_prolog_cc_code.m4 @@ -1243,7 +1243,7 @@ m4_define(`ppl_termination_test_@TERMINATION_ID@_@TOPOLOGY@@CLASS@_code', @TOPOLOGY@@CPP_CLASS@* pset = term_to_handle<@TOPOLOGY@@CPP_CLASS@ >(t_pset, where); PPL_CHECK(pset); if (Parma_Polyhedra_Library::termination_test_@TERMINATION_ID@(*pset)) - return PROLOG_SUCCESS; + return PROLOG_SUCCESS; } CATCH_ALL; } @@ -1265,7 +1265,7 @@ m4_define(`ppl_termination_test_@TERMINATION_ID@_@TOPOLOGY@@CLASS@_2_code', PPL_CHECK(pset_after); if (Parma_Polyhedra_Library ::termination_test_@TERMINATION_ID@_2(*pset_before, *pset_after)) - return PROLOG_SUCCESS; + return PROLOG_SUCCESS; } CATCH_ALL; } @@ -1285,8 +1285,8 @@ m4_define(`ppl_one_affine_ranking_function_@TERMINATION_ID@_@TOPOLOGY@@CLASS@_co PPL_CHECK(pset); if (Parma_Polyhedra_Library ::one_affine_ranking_function_@TERMINATION_ID@(*pset, gg) - && Prolog_unify(t_g, generator_term(gg))) - return PROLOG_SUCCESS; + && Prolog_unify(t_g, generator_term(gg))) + return PROLOG_SUCCESS; } CATCH_ALL; } @@ -1310,16 +1310,17 @@ m4_define(`ppl_one_affine_ranking_function_@TERMINATION_ID@_@TOPOLOGY@@CLASS@_2_ PPL_CHECK(pset_before); PPL_CHECK(pset_after); if (Parma_Polyhedra_Library - ::one_affine_ranking_function_@TERMINATION_ID@_2(*pset_before, - *pset_after, - gg) + ::one_affine_ranking_function_@TERMINATION_ID@_2(*pset_before, + *pset_after, + gg) && Prolog_unify(t_g, generator_term(gg))) - return PROLOG_SUCCESS; + return PROLOG_SUCCESS; } CATCH_ALL; }
') + m4_define(`ppl_all_affine_ranking_functions_@TERMINATION_ID@_@TOPOLOGY@@CLASS@_code', `extern "C" Prolog_foreign_return_type ppl_all_affine_ranking_functions_@TERMINATION_ID@_@TOPOLOGY@@CLASS@ @@ -1333,15 +1334,14 @@ m4_define(`ppl_all_affine_ranking_functions_@TERMINATION_ID@_@TOPOLOGY@@CLASS@_c @A_TERMINATION_ID@Polyhedron* ph = new @A_TERMINATION_ID@Polyhedron(); Parma_Polyhedra_Library ::all_affine_ranking_functions_@TERMINATION_ID@(*pset, *ph); - Prolog_term_ref tmp = Prolog_new_term_ref(); - Prolog_put_address(tmp, ph); - if (Prolog_unify(t_ph, tmp)) { - PPL_REGISTER(ph); - return PROLOG_SUCCESS; - } - else + Prolog_term_ref tmp = Prolog_new_term_ref(); + Prolog_put_address(tmp, ph); + if (Prolog_unify(t_ph, tmp)) { + PPL_REGISTER(ph); + return PROLOG_SUCCESS; + } + else delete ph; - return PROLOG_SUCCESS; } CATCH_ALL; } @@ -1368,15 +1368,91 @@ m4_define(`ppl_all_affine_ranking_functions_@TERMINATION_ID@_@TOPOLOGY@@CLASS@_2 ::all_affine_ranking_functions_@TERMINATION_ID@_2(*pset_before, *pset_after, *ph); - Prolog_term_ref tmp = Prolog_new_term_ref(); - Prolog_put_address(tmp, ph); - if (Prolog_unify(t_ph, tmp)) { - PPL_REGISTER(ph); - return PROLOG_SUCCESS; - } - else + Prolog_term_ref tmp = Prolog_new_term_ref(); + Prolog_put_address(tmp, ph); + if (Prolog_unify(t_ph, tmp)) { + PPL_REGISTER(ph); + return PROLOG_SUCCESS; + } + else delete ph; - return PROLOG_SUCCESS; + } + CATCH_ALL; +} + +') + +m4_define(`ppl_all_affine_quasi_ranking_functions_MS_@TOPOLOGY@@CLASS@_code', + `extern "C" Prolog_foreign_return_type + ppl_all_affine_quasi_ranking_functions_MS_@TOPOLOGY@@CLASS@ + (Prolog_term_ref t_pset, + Prolog_term_ref t_ph_decreasing, + Prolog_term_ref t_ph_bounded) { + static const char* where = + "ppl_all_affine_quasi_ranking_functions_MS_@TOPOLOGY@@CLASS@/3"; + try { + @TOPOLOGY@@CPP_CLASS@* pset = term_to_handle<@TOPOLOGY@@CPP_CLASS@ >(t_pset, where); + PPL_CHECK(pset); + C_Polyhedron* ph_decreasing = new C_Polyhedron(); + C_Polyhedron* ph_bounded = new C_Polyhedron(); + Parma_Polyhedra_Library + ::all_affine_quasi_ranking_functions_MS(*pset, + *ph_decreasing, *ph_bounded); + Prolog_term_ref tmp_decreasing = Prolog_new_term_ref(); + Prolog_put_address(tmp_decreasing, ph_decreasing); + Prolog_term_ref tmp_bounded = Prolog_new_term_ref(); + Prolog_put_address(tmp_bounded, ph_bounded); + if (Prolog_unify(t_ph_decreasing, tmp_decreasing) + && Prolog_unify(t_ph_bounded, tmp_bounded)) { + PPL_REGISTER(ph_decreasing); + PPL_REGISTER(ph_bounded); + return PROLOG_SUCCESS; + } + else { + delete ph_decreasing; + delete ph_bounded; + } + } + CATCH_ALL; +} + +') + +m4_define(`ppl_all_affine_quasi_ranking_functions_MS_@TOPOLOGY@@CLASS@_2_code', + `extern "C" Prolog_foreign_return_type + ppl_all_affine_quasi_ranking_functions_MS_@TOPOLOGY@@CLASS@_2 + (Prolog_term_ref t_pset_before, + Prolog_term_ref t_pset_after, + Prolog_term_ref t_ph_decreasing, + Prolog_term_ref t_ph_bounded) { + static const char* where = + "ppl_all_affine_quasi_ranking_functions_MS_@TOPOLOGY@@CLASS@_2/4"; + try { + @TOPOLOGY@@CPP_CLASS@* pset_before + = term_to_handle<@TOPOLOGY@@CPP_CLASS@ >(t_pset_before, where); + @TOPOLOGY@@CPP_CLASS@* pset_after + = term_to_handle<@TOPOLOGY@@CPP_CLASS@ >(t_pset_after, where); + PPL_CHECK(pset_before); + PPL_CHECK(pset_after); + C_Polyhedron* ph_decreasing = new C_Polyhedron(); + C_Polyhedron* ph_bounded = new C_Polyhedron(); + Parma_Polyhedra_Library + ::all_affine_quasi_ranking_functions_MS_2(*pset_before, *pset_after, + *ph_decreasing, *ph_bounded); + Prolog_term_ref tmp_decreasing = Prolog_new_term_ref(); + Prolog_put_address(tmp_decreasing, ph_decreasing); + Prolog_term_ref tmp_bounded = Prolog_new_term_ref(); + Prolog_put_address(tmp_bounded, ph_bounded); + if (Prolog_unify(t_ph_decreasing, tmp_decreasing) + && Prolog_unify(t_ph_bounded, tmp_bounded)) { + PPL_REGISTER(ph_decreasing); + PPL_REGISTER(ph_bounded); + return PROLOG_SUCCESS; + } + else { + delete ph_decreasing; + delete ph_bounded; + } } CATCH_ALL; } diff --git a/interfaces/Prolog/ppl_interface_generator_prolog_hh_code.m4 b/interfaces/Prolog/ppl_interface_generator_prolog_hh_code.m4 index 846fe05..2ffaf4b 100644 --- a/interfaces/Prolog/ppl_interface_generator_prolog_hh_code.m4 +++ b/interfaces/Prolog/ppl_interface_generator_prolog_hh_code.m4 @@ -573,6 +573,25 @@ m4_define(`ppl_all_affine_ranking_functions_@TERMINATION_ID@_@TOPOLOGY@@CLASS@_2
')
+m4_define(`ppl_all_affine_quasi_ranking_functions_MS_@TOPOLOGY@@CLASS@_code', + `extern "C" Prolog_foreign_return_type + ppl_all_affine_quasi_ranking_functions_MS_@TOPOLOGY@@CLASS@ + (Prolog_term_ref t_pset, + Prolog_term_ref t_ph_decreasing, + Prolog_term_ref t_ph_bounded); + +') + +m4_define(`ppl_all_affine_quasi_ranking_functions_MS_@TOPOLOGY@@CLASS@_2_code', + `extern "C" Prolog_foreign_return_type + ppl_all_affine_quasi_ranking_functions_MS_@TOPOLOGY@@CLASS@_2 + (Prolog_term_ref t_pset_before, + Prolog_term_ref t_pset_after, + Prolog_term_ref t_ph_decreasing, + Prolog_term_ref t_ph_bounded); + +') + m4_define(`ppl_@CLASS@_wrap_assign_code', `extern "C" Prolog_foreign_return_type ppl_@CLASS@_wrap_assign diff --git a/interfaces/Prolog/ppl_interface_generator_prolog_procedure_generators.m4 b/interfaces/Prolog/ppl_interface_generator_prolog_procedure_generators.m4 index 685844f..e8b76b7 100644 --- a/interfaces/Prolog/ppl_interface_generator_prolog_procedure_generators.m4 +++ b/interfaces/Prolog/ppl_interface_generator_prolog_procedure_generators.m4 @@ -90,8 +90,10 @@ m4_define(`m4_procedure_list', ppl_termination_test_@TERMINATION_ID@_@TOPOLOGY@@CLASS@/1 +simple, ppl_one_affine_ranking_function_@TERMINATION_ID@_@TOPOLOGY@@CLASS@/2 +simple, ppl_all_affine_ranking_functions_@TERMINATION_ID@_@TOPOLOGY@@CLASS@/2 +simple, +ppl_all_affine_quasi_ranking_functions_MS_@TOPOLOGY@@CLASS@/3 +simple, ppl_termination_test_@TERMINATION_ID@_@TOPOLOGY@@CLASS@_2/2 +simple, ppl_one_affine_ranking_function_@TERMINATION_ID@_@TOPOLOGY@@CLASS@_2/3 +simple, ppl_all_affine_ranking_functions_@TERMINATION_ID@_@TOPOLOGY@@CLASS@_2/3 +simple, +ppl_all_affine_quasi_ranking_functions_MS_@TOPOLOGY@@CLASS@_2/4 +simple, ) ')