diff --git a/prism/src/dd/dd_info.cc b/prism/src/dd/dd_info.cc index 97ff46cf..c5a7df9b 100644 --- a/prism/src/dd/dd_info.cc +++ b/prism/src/dd/dd_info.cc @@ -34,6 +34,8 @@ extern FILE *dd_out; +extern void DD_PrintTerminals(DdManager *ddman, DdNode *dd, int num_vars, bool and_numbers); + //------------------------------------------------------------------------------ int DD_GetNumNodes @@ -156,76 +158,46 @@ DdNode *dd //------------------------------------------------------------------------------ -void DD_PrintTerminals -( -DdManager *ddman, -DdNode *dd -) -{ - DdNode *tmp; - double max; - int count = 0; - - Cudd_Ref(dd); - tmp = dd; +void DD_PrintTerminals(DdManager *ddman, DdNode *dd) { DD_PrintTerminals(ddman, dd, 0, false); } - // remove any negative terminals (if any) - // and warn the user - if (Cudd_V(Cudd_addFindMin(ddman, tmp)) < 0) { - fprintf(dd_out, "Warning: DD_PrintTerminals is ignoring negative terminals.\n"); - Cudd_Ref(tmp); - tmp = DD_Apply(ddman, APPLY_TIMES, DD_GreaterThan(ddman, tmp, 0), tmp); - } - - while (tmp != Cudd_addConst(ddman, 0)) { - max = Cudd_V(Cudd_addFindMax(ddman, tmp)); - fprintf(dd_out, "%f ", max); - count++; - Cudd_Ref(tmp); - tmp = DD_ITE(ddman, DD_Equals(ddman, tmp, max), DD_Constant(ddman, 0), tmp); - } - Cudd_RecursiveDeref(ddman, tmp); - if (count < Cudd_CountLeaves(dd)) { - fprintf(dd_out, "%f", 0.0); - } - fprintf(dd_out, "\n"); -} - -//------------------------------------------------------------------------------ +void DD_PrintTerminalsAndNumbers(DdManager *ddman, DdNode *dd, int num_vars) { DD_PrintTerminals(ddman, dd, num_vars, true); } -void DD_PrintTerminalsAndNumbers +void DD_PrintTerminals ( DdManager *ddman, DdNode *dd, -int num_vars) +int num_vars, +bool and_numbers) { DdNode *tmp, *tmp2; - double max, num, count = 0.0; - + double min, max, num, count = 0.0; + + // Take a copy of dd Cudd_Ref(dd); tmp = dd; - - // remove any negative terminals (if any) - // and warn the user - if (Cudd_V(Cudd_addFindMin(ddman, tmp)) < 0) { - fprintf(dd_out, "Warning: DD_PrintTerminals is ignoring negative terminals.\n"); - Cudd_Ref(tmp); - tmp = DD_Apply(ddman, APPLY_TIMES, DD_GreaterThan(ddman, tmp, 0), tmp); - } - - while (tmp != Cudd_addConst(ddman, 0)) { + // Check the min (will use at end) + min = Cudd_V(Cudd_addFindMin(ddman, dd)); + // Loop through terminals in descending order + while (tmp != Cudd_ReadMinusInfinity(ddman)) { + // Find next (max) terminal and display max = Cudd_V(Cudd_addFindMax(ddman, tmp)); fprintf(dd_out, "%f ", max); + // Remove the terminals, counting/displaying number if required Cudd_Ref(tmp); tmp2 = DD_Equals(ddman, tmp, max); - num = Cudd_CountMinterm(ddman, tmp2, num_vars); - count += num; - fprintf(dd_out, "(%.0f) ", num); - tmp = DD_ITE(ddman, tmp2, DD_Constant(ddman, 0), tmp); + if (and_numbers) { + num = Cudd_CountMinterm(ddman, tmp2, num_vars); + count += num; + fprintf(dd_out, "(%.0f) ", num); + } + tmp = DD_ITE(ddman, tmp2, DD_MinusInfinity(ddman), tmp); } Cudd_RecursiveDeref(ddman, tmp); - if (count < pow(2, num_vars)) { - fprintf(dd_out, "%f (%.0f)", 0.0, pow(2, num_vars) - count); + // Finally, print if there are (and possibly how many) minus infinities + if (and_numbers) { + if (count < pow(2, num_vars)) fprintf(dd_out, "-inf (%.0f)", pow(2, num_vars) - count); + } else { + if (min == -HUGE_VAL) fprintf(dd_out, "-inf"); } fprintf(dd_out, "\n"); }