:- load_files([flags,lists,about],[silent(true),if(not_loaded)]). %%%% define score about(abcde, (Col,Target,EffortTarget,MaxEffort,AC,BD), [ column=Col,target=Target, effortTarget=EffortTarget, maxEffort=MaxEffort, ac=AC,bd=BD,c=C,d=D, effort=Effort ], abcde(Col,Target,EffortTarget,MaxEffort,AC,BD,C,D,Effort), abcde(Col,Target,EffortTarget,MaxEffort,AC,BD,0,0,0 ) ). %%%% selectors effort(abcde(_,_,_,MaxEffort,_,_,_,_,E),Effort) :- Effort is E/MaxEffort. abcd(abcde(_,_,_,_,AC,BD,C,D,_),A,B,C,D) :- B is BD - D, A is AC - C. accuracy( S,Acc ) :- abcd(S,A,B,C,D), Acc is (A+D)/(A+B+C+D). precision(S,Prec ) :- abcd(S,_,_,C,D), (C+D > 0 -> Prec is D /(C+D); Prec = 0). pf( S,Pf ) :- abcd(S,A,_,C,_), (A+C > 0 -> Pf is C /(A+C); Pf = 0). pd( S,Recall ) :- abcd(S,_,B,_,D), (B+D > 0 -> Recall is D /(B+D); Recall=0). notPf(S,NotPf ) :- pf(S,Pf), NotPf is 1 - Pf. recall( S,Prec ) :- pd(S,Prec). support(S,Support ) :- abcd(S,A,B,C,D), Support is (C + D)/(A+B+C+D). balance(S,B ) :- PfGoal = 0, EffortGoal = 0, PdGoal = 1, SupportGoal= 1, pd(S,Pd), pf(S,Pf), effort(S,Effort), support(S,Support), B0 is 1 - sqrt((PfGoal - Pf )^2 + (PdGoal - Pd )^2 + (EffortGoal - Effort)^2 + (SupportGoal - Support)^2 ) / sqrt(4), B is round(B0 * 1000)/1000. %%%% update abcdes([]) --> []. abcdes([H|T]) --> abcde1(H),abcdes(T). abcde1(I, abcde(Col,Target,EffortTarget,MaxEffort,AC,BD,C,D0,Effort0), abcde(Col,Target,EffortTarget,MaxEffort,AC,BD,C,D ,Effort )) :- memo(I,Col,Target),!, D is D0 + 1, memo(I,EffortTarget,Effort1), Effort is Effort0 + Effort1. abcde1(I, abcde(Col,Target,EffortTarget,MaxEffort,AC,BD,C0,D,Effort0), abcde(Col,Target,EffortTarget,MaxEffort,AC,BD,C ,D,Effort )) :- memo(I,EffortTarget,Effort1), Effort is Effort0 + Effort1, C is C0 + 1.