2:- use_module(library(lists),[max_list/2]).    3:- ['working/rte.mod'].    4
    5model(T,dabs,I,Gold,V):- mod(_,T,I,Gold,V,_,_,_).
    6model(T,drel,I,Gold,V):- mod(_,T,I,Gold,_,V,_,_).
    7model(T,fabs,I,Gold,V):- mod(_,T,I,Gold,_,_,V,_).
    8model(T,frel,I,Gold,V):- mod(_,T,I,Gold,_,_,_,V).
    9
   10model(T,aabs,I,Gold,V):- alt(_,T,I,Gold,V,_).
   11model(T,arel,I,Gold,V):- alt(_,T,I,Gold,_,V).
   12
   13model(T,wabs,I,Gold,V):- mwn(_,T,I,Gold,V,_).
   14model(T,wrel,I,Gold,V):- mwn(_,T,I,Gold,_,V).
   15
   16model(T,dabs,fabs,I,Gold,V1,V2):- mod(_,T,I,Gold,V1,_,V2,_).
   17model(T,dabs,frel,I,Gold,V1,V2):- mod(_,T,I,Gold,V1,_,_,V2).
   18model(T,dabs,drel,I,Gold,V1,V2):- mod(_,T,I,Gold,V1,V2,_,_).
   19model(T,frel,dabs,I,Gold,V1,V2):- mod(_,T,I,Gold,V2,_,_,V1).
   20model(T,drel,fabs,I,Gold,V1,V2):- mod(_,T,I,Gold,_,V1,V2,_).
   21model(T,fabs,drel,I,Gold,V1,V2):- mod(_,T,I,Gold,_,V2,V1,_).
   22model(T,drel,frel,I,Gold,V1,V2):- mod(_,T,I,Gold,_,V1,_,V2).
   23model(T,frel,drel,I,Gold,V1,V2):- mod(_,T,I,Gold,_,V2,_,V1).
   24
   25estimate(Task,Fea,Acc):-
   26   findall(gold(V,Gold,I),model(Task,Fea,I,Gold,V),L),
   27   est1(L,Fea,0,best(0,0,[]),Acc).
   28
   29est1(_,F,T1,Best,Acc):- 
   30   \+ ( model(_,F,_,_,T2) ,T2 > T1), !, 
   31   Best = best(Tau,Acc,Evidence),
   32   length(Evidence,Len),
   33   format('informative if ~p diff >= ~p (accuracy: ~p, n=~p)~n',[F,Tau,Acc,Len]).
   34%   write(Evidence), nl.
   35
   36est1(L,F,T1,best(T,Best,IDs),Max):-
   37   calc1(L,informative,T1,0,0,Acc,NewIDs),
   38   ( Acc > Best, !, NewBest = best(T1,Acc,NewIDs); NewBest = best(T,Best,IDs) ),
   39   step(F,T1,T2),
   40   est1(L,F,T2,NewBest,Max).
   41
   42
   43estimate(Task,F1,F2,Acc):-
   44   findall(gold(V1,V2,Gold,I),model(Task,F1,F2,I,Gold,V1,V2),L),
   45   est2(L,F1,F2,0,0,best(0,0,0,[]),Acc).
   46
   47est2(_,FD,FF,TauD,TauF,Best,Acc):- 
   48   \+ (model(_,FD,FF,_,_,DTau,_), DTau > TauD), 
   49   \+ (model(_,FD,FF,_,_,_,FTau), FTau > TauF), !,
   50   Best = best(Tau1,Tau2,Acc,_Evidence),
   51   format('informative if ~p diff >= ~p OR ~p diff >= ~p (accuracy ~p)~n',[FD,Tau1,FF,Tau2,Acc]).
   52%   write(Evidence), nl.
   53
   54est2(L,FD,FF,TauD1,TauF1,best(TauD,TauF,Best,IDs),Max):-
   55   calc2(L,informative,TauD1,TauF1,0,0,Acc,NewIDs),
   56   ( Acc > Best, !, NewBest = best(TauD1,TauF1,Acc,NewIDs); NewBest = best(TauD,TauF,Best,IDs) ),
   57   ( 
   58     model(_,FD,FF,_,_,_,FTau), FTau > TauF1, !,
   59     step(FF,TauF1,TauF2),
   60     TauD2 = TauD1
   61   ;
   62     step(FD,TauD1,TauD2),
   63     TauF2 = 0
   64   ),
   65   est2(L,FD,FF,TauD2,TauF2,NewBest,Max).
   66
   67
   68step(dabs,T1,T2):- !, T2 is T1 + 1.
   69step(fabs,T1,T2):- !, T2 is T1 + 1.
   70step(wabs,T1,T2):- !, T2 is T1 + 1.
   71step(aabs,T1,T2):- !, T2 is T1 + 1.
   72
   73step(drel,T1,T2):- !, T2 is T1 + 0.001.
   74step(frel,T1,T2):- !, T2 is T1 + 0.001.
   75step(wrel,T1,T2):- !, T2 is T1 + 0.001.
   76step(arel,T1,T2):- !, T2 is T1 + 0.001.
   77
   78
   79calc1([],_,_,C,N,Acc,[]):-
   80   Acc is C/N.
   81
   82calc1([gold(Delta,Gold,Id)|L],F,Tau,C,M,Acc,[i:Id|IDs]):- 
   83   Gold = F, Delta >= Tau, !,
   84   N is M + 1,
   85   D is C + 1,
   86   calc1(L,F,Tau,D,N,Acc,IDs).
   87
   88calc1([gold(Delta,Gold,Id)|L],F,Tau,C,M,Acc,[e:Id|IDs]):- 
   89   \+ Gold = F, Delta < Tau, !,
   90   N is M + 1,
   91   D is C + 1,
   92   calc1(L,F,Tau,D,N,Acc,IDs).
   93
   94calc1([_|L],F,Tau,C,M,Acc,IDs):- 
   95   N is M + 1,
   96   calc1(L,F,Tau,C,N,Acc,IDs).
   97
   98
   99calc2([],_,_,_,C,N,Acc,[]):-
  100   Acc is C/N.
  101
  102calc2([gold(DeltaD,_DeltaF,Gold,Id)|L],F,TauD,TauF,C,M,Acc,[i:Id|IDs]):- 
  103   Gold = F, DeltaD >= TauD, !,
  104   N is M + 1,
  105   D is C + 1,
  106   calc2(L,F,TauD,TauF,D,N,Acc,IDs).
  107
  108calc2([gold(DeltaD,DeltaF,Gold,Id)|L],F,TauD,TauF,C,M,Acc,[i:Id|IDs]):- 
  109   Gold = F, DeltaD < TauD, DeltaF >= TauF, !,
  110   N is M + 1,
  111   D is C + 1,
  112   calc2(L,F,TauD,TauF,D,N,Acc,IDs).
  113
  114calc2([gold(DeltaD,DeltaF,Gold,Id)|L],F,TauD,TauF,C,M,Acc,[e:Id|IDs]):- 
  115   \+ Gold = F, DeltaD < TauD, DeltaF < TauF, !,
  116   N is M + 1,
  117   D is C + 1,
  118   calc2(L,F,TauD,TauF,D,N,Acc,IDs).
  119
  120calc2([_|L],F,TauD,TauF,C,M,Acc,IDs):- 
  121   N is M + 1,
  122   calc2(L,F,TauD,TauF,C,N,Acc,IDs).
  123   
  124   
  125estimate(T,Max):-
  126   nl,write('---TASK---':T), nl,
  127   estimate(T,dabs,Accdabs),
  128   estimate(T,aabs,Accaabs),
  129   estimate(T,dabs,fabs,Accdabsfabs),
  130   estimate(T,dabs,drel,Accdabsdrel),
  131   estimate(T,dabs,frel,Accdabsfrel), nl,
  132   estimate(T,drel,Accdrel),
  133   estimate(T,arel,Accarel),
  134   estimate(T,drel,fabs,Accdrelfabs),
  135   estimate(T,drel,frel,Accdrelfrel), nl,
  136   estimate(T,fabs,Accfabs),
  137   estimate(T,frel,Accfrel), nl,
  138   estimate(T,wabs,Accwabs),
  139   estimate(T,wrel,Accwrel),
  140   max_list([Accdabs,Accaabs,Accdabsfabs,Accdabsfrel,Accdabsdrel,
  141             Accdrel,Accarel,Accdrelfabs,Accdrelfrel,
  142             Accfabs,Accfrel,Accwabs,Accwrel],Max).
  143
  144:- estimate('IE',Max1),
  145   write(best:Max1),nl,
  146   estimate('IR',Max2), 
  147   write(best:Max2),nl,
  148   estimate('QA',Max3), 
  149   write(best:Max3),nl,
  150   estimate('SUM',Max4), 
  151   write(best:Max4),nl,
  152   estimate(_,Max), 
  153   write(best:Max),nl,
  154   Task is ((Max1+Max2+Max3+Max4)/4),
  155   write(task:Task),nl.  156   
  157:- halt.