% this original version is paired with simply count the head

trainANDcount(PosEIs,FinalTI):-
	genAll_EIsigned(PosEIs,AllTs,TotalNum),write('Total is '), write(TotalNum),nl,
	print_list(AllTs),nl,

	lazyAllTsTranslation(AllTs,NewAllClas),
	length(AllTs,K),write('Number generalized is'), write(K),nl,

	rb_new(Tree0),
	counting(NewAllClas,Tree0,Tree),
	rb_visit(Tree,Ts),%print_list(Ts),nl,

	sort(PosEIs,PosEIs1),
	chooseH(PosEIs1,Ts,[],FinalTI).
	%print_list(FinalTI),nl.

	


chooseH([],_,FinalH,FinalH):-!.
chooseH(UncoverExs,Hs,HSofar,FinalH):-
	maplist(scoreCountedT,Hs,ScoredHs0), % score Hs
	sort(ScoredHs0,ScoredHs),
	nl,write('--------New Round--------'),nl,
	print_list(ScoredHs),

	getLast(ScoredHs,RestHs,ExNum-Score-(Cla-ExList)), % check when you record
	
	portray_clause(ExNum-Score-(Cla-ExList)),nl,
	
	extractCoveredEx(ExList,CoveredExs0), 

	sort(CoveredExs0,CoveredExs), %ordered setsubstract
	ord_subtract(UncoverExs,CoveredExs,NewUncoverExs),

	updataHcovergae(CoveredExs0,RestHs,NewRestHs), % remove covered
	
	chooseH(NewUncoverExs,NewRestHs,[Cla|HSofar],FinalH).	


getLast([LastEle],[],LastEle).
getLast([Coverage-Score-T|List],[T|Rest],LastEle):-
	getLast(List,Rest,LastEle).

extractCoveredEx(ExList,CoveredExs):-
	maplist(extractEI,ExList,CoveredExs).

extractEI({EI,Length},EI).


%updataHcovergae(CoveredExs0,RestHs,NewRestHs):- 
%	maplist(updateEIList(CoveredExs0),RestHs,NewRestHs).


updataHcovergae(CoveredExs,[],[]).
updataHcovergae(CoveredExs,[Cla-LengthedEI|Hs],NewHs):-
	updataHcovergae(CoveredExs,Hs,HsSoFar),
	updateEIList(CoveredExs,Cla-LengthedEI,Cla-NewLengthedEI),
	(NewLengthedEI==[] ->
		NewHs=HsSoFar;
		NewHs=[Cla-NewLengthedEI|HsSoFar]
	).
	


updateEIList(CoveredExs,[enzyme_state-{Sign,EC_Number,Change}]-LengthedEI,[enzyme_state-{Sign,EC_Number,Change}]-NewLengthedEI):-
	removeCoveredEx(CoveredExs,LengthedEI,[],NewLengthedEI).


removeCoveredEx(CoveredExs,[],Final,Final).

removeCoveredEx(CoveredExs,[{EI,ExNum}|Rest],Sofar,Final):-
	member(EI,CoveredExs), !,  
	removeCoveredEx(CoveredExs,Rest,Sofar,Final).

removeCoveredEx(CoveredExs,[{EI,ExNum}|Rest],Sofar,Final):-
	removeCoveredEx(CoveredExs,Rest,[{EI,ExNum}|Sofar],Final).	

/*
removeCoveredEx([],_,Final,Final):- !.
removeCoveredEx(CoveredExs,[],Final,Final):- !.
removeCoveredEx(CoveredExs,[{EI,ExNum}|Rest],Sofar,Final):-
	append(Pre,[EI|Post],CoveredExs), !, %member(EI,CoveredExs), 
	removeCoveredEx(Post,Rest,Sofar,Final).
removeCoveredEx(CoveredExs,[{EI,ExNum}|Rest],Sofar,Final):-
	removeCoveredEx(CoveredExs,Rest,[{EI,ExNum}|Sofar],Final).
*/



