/* Printing Subsumed Calls ----------------------- */ void sfPrintConsGoals(FILE *fp, SubProdSF pProd) { SubConsSF pCons; fprintf(fp, "Producer:\n "); sfPrintGoal(fp, (VariantSF)pProd, YES); fprintf(fp, "\nConsumers:\n"); for ( pCons = subg_consumers(pProd); IsNonNULL(pCons); pCons = conssf_consumers(pCons) ) { fprintf(fp, " "); sfPrintGoal(fp, (VariantSF)pCons, YES); fprintf(fp, "\n"); } }
NodeStats subgoal_statistics(CTXTdeclc Structure_Manager *sm) { NodeStats sg_stats; TIFptr tif; int nSubgoals; VariantSF pProdSF; SubConsSF pConsSF; sg_stats = node_statistics(sm); nSubgoals = 0; SYS_MUTEX_LOCK( MUTEX_TABLE ); if ( sm == &smVarSF ) { for ( tif = tif_list.first; IsNonNULL(tif); tif = TIF_NextTIF(tif) ) if ( IsVariantPredicate(tif) ) for ( pProdSF = TIF_Subgoals(tif); IsNonNULL(pProdSF); pProdSF = (VariantSF)subg_next_subgoal(pProdSF) ) nSubgoals++; } /* No shared smProdSF or smConsSF in MT engine */ else if ( sm == &smProdSF ) { for ( tif = tif_list.first; IsNonNULL(tif); tif = TIF_NextTIF(tif) ) if ( IsSubsumptivePredicate(tif) ) for ( pProdSF = TIF_Subgoals(tif); IsNonNULL(pProdSF); pProdSF = (VariantSF)subg_next_subgoal(pProdSF) ) nSubgoals++; } else if ( sm == &smConsSF ) { for ( tif = tif_list.first; IsNonNULL(tif); tif = TIF_NextTIF(tif) ) if ( IsSubsumptivePredicate(tif) ) for ( pProdSF = TIF_Subgoals(tif); IsNonNULL(pProdSF); pProdSF = (VariantSF)subg_next_subgoal(pProdSF) ) for ( pConsSF = subg_consumers(pProdSF); IsNonNULL(pConsSF); pConsSF = conssf_consumers(pConsSF) ) nSubgoals++; } else { SYS_MUTEX_UNLOCK( MUTEX_TABLE ); xsb_dbgmsg((LOG_DEBUG, "Incorrect use of subgoal_statistics()\n" "SM does not contain subgoal frames")); return sg_stats; } SYS_MUTEX_UNLOCK( MUTEX_TABLE ); if ( NodeStats_NumUsedNodes(sg_stats) != (counter) nSubgoals ) xsb_warn(CTXTc "Inconsistent Subgoal Frame Usage Calculations:\n" "\tSubgoal Frame count mismatch"); return sg_stats; }