:- 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.
