1/*****************************************************************************
    2 * This file is part of the Prolog Development Tool (PDT)
    3 * 
    4 * WWW: http://sewiki.iai.uni-bonn.de/research/pdt/start
    5 * Mail: pdt@lists.iai.uni-bonn.de
    6 * Copyright (C): 2004-2012, CS Dept. III, University of Bonn
    7 * 
    8 * All rights reserved. This program is  made available under the terms
    9 * of the Eclipse Public License v1.0 which accompanies this distribution,
   10 * and is available at http://www.eclipse.org/legal/epl-v10.html
   11 * 
   12 ****************************************************************************/
   13
   14:- module(edge_counter,[count_call_edges_between_predicates/0,
   15						call_edges_for_predicates/3]).   16
   17:- ensure_loaded('../pdt_factbase').   18
   19%:- dynamic call_edges_for_predicates/3. %call_edges_for_predicates(SourceID,TargetID,Counter)
   20%count_call_edges_between_predicates:-
   21%    retractall(call_edges_for_predicates(_,_,_)),
   22%	forall(	call_edge(TargetId, SourceLiteralId),
   23%			(	(	literalT(SourceLiteralId,_,SourceRule,_,_,_),
   24%    				pred_edge(SourceRule,SourceId)
   25%   				)
   26%			->	inc_call_edges_for_predicates(SourceId,TargetId)
   27%			;	(	predicateT(TargetId,_,TFunctor,TArity,TModule),
   28%					format('Problem with call-edge: ~w -> ~w (~w:~w/~w)~n',[SourceLiteralId, TargetId, TModule, TFunctor, TArity])
   29%				)
   30%			)
   31%		).	
   32%
   33%inc_call_edges_for_predicates(SourceID,TargetID):-
   34%    call_edges_for_predicates(SourceID,TargetID,Counter),
   35%	retract(call_edges_for_predicates(SourceID,TargetID,Counter)),
   36% 	New_Counter is (Counter + 1),
   37%    assert(call_edges_for_predicates(SourceID,TargetID,New_Counter)).
   38%inc_call_edges_for_predicates(SourceID,TargetID):-  
   39%    assert(call_edges_for_predicates(SourceID,TargetID,1)).
   40
   41:- use_module(pdt_common_pl('callgraph/pdt_call_graph')).   42
   43count_call_edges_between_predicates :-
   44	ensure_call_graph_generated.
   45
   46call_edges_for_predicates(CallerId, CalleeId, NumberOfCalls) :-
   47	var(CallerId),
   48	var(CalleeId),
   49	!,
   50	calls(CalleeModule, CalleeName, CalleeArity, CallerModule, CallerName, CallerArity, NumberOfCalls),
   51	predicateT(CallerId, _, CallerName, CallerArity, CallerModule),
   52	predicateT(CalleeId, _, CalleeName, CalleeArity, CalleeModule).
   53call_edges_for_predicates(CallerId, CalleeId, NumberOfCalls) :-
   54	var(CallerId),
   55	nonvar(CalleeId),
   56	!,
   57	predicateT(CalleeId, _, CalleeName, CalleeArity, CalleeModule),
   58	calls(CalleeModule, CalleeName, CalleeArity, CallerModule, CallerName, CallerArity, NumberOfCalls),
   59	predicateT(CallerId, _, CallerName, CallerArity, CallerModule).
   60call_edges_for_predicates(CallerId, CalleeId, NumberOfCalls) :-
   61	nonvar(CallerId),
   62	var(CalleeId),
   63	!,
   64	predicateT(CallerId, _, CallerName, CallerArity, CallerModule),
   65	calls(CalleeModule, CalleeName, CalleeArity, CallerModule, CallerName, CallerArity, NumberOfCalls),
   66	predicateT(CalleeId, _, CalleeName, CalleeArity, CalleeModule).
   67call_edges_for_predicates(CallerId, CalleeId, NumberOfCalls) :-
   68%	nonvar(CallerId),
   69%	nonvar(CalleeId),
   70%	!,
   71	predicateT(CallerId, _, CallerName, CallerArity, CallerModule),
   72	predicateT(CalleeId, _, CalleeName, CalleeArity, CalleeModule),
   73	calls(CalleeModule, CalleeName, CalleeArity, CallerModule, CallerName, CallerArity, NumberOfCalls)