% notice, this leaveOneTrain is restricted to PosOnly

% setting()


leaveOneTrain(TrainPE0,TestID,Result):-
		TrainPE0=TrainPE, %permutateList(TrainPE0,TrainPE),write('(((( Positive Exs to learn '), write(TrainPE), 	% otherwise each fold give nearly the same result
		%learnAll(TrainPE,FinalTI),	
TrainNE=[],		
%learn(TrainPE,TrainNE,FinalT), % please notice, it is not TI, but translated T
FinalT=[], %*** here to change if computing the defaul without learning

% select final hypothesis by counting	
		%trainANDcount(TrainPE,FinalTI),

% Covering Algorithm
%		%multiCovering(TrainPE,TrainNE,[],FinalTI), 
%		TrainNE=[],
%		cover(TrainPE,TrainNE,[],FinalTI), 

		%tInterpreter(FinalTI,FinalT),
		%write('*** Learning Result is'), nl,print_list(FinalT),nl,write('Above is learning result'),


		%addTI(FinalTI,[],Ref), %write(??????????),nl,
addT(FinalT,Ref),
		%listing,

forAll(closedWorldAssumption(Cla),(assertz(Cla,ClaRef),assertz(assertedCla(ClaRef)))),

		predictTestData(TestID,Result),
		write('--------------------Test'),write({[TestID],Result}), %ex0(TestID,concentration(M_Name,Change,Degree,Time),PosNegSign),write(M_Name),nl,nl,nl,
forAll(assertedCla(Ref),erase(Ref)),

removeT(Ref).






percentage(Record,All,P):-
	length(Record,K),
	length(All,AllK),
	P is (K*100)/AllK.


% only one test--either pos or neg
% no need for weight--just average finally.
leaveOneOut([],_,[]).
leaveOneOut([TestID|Folds],Data,Results):-
	leaveOneOut(Folds,Data,PreResults),

	append(Da,[TestID|Db],Data),append(Da,Db,Rest),%sepPN_ID(Rest,TrainPE,TrainNE),
	write('Training data are '), write(Rest),nl,%write(TrainPE), write(TrainNE),nl,
	leaveOneTrain(Rest,TestID,OneResult), write('finish over training'),
	append(OneResult,PreResults,Results).
	%Results= [OneResult|PreResults].	






predictTestData(TestID,Result):-
		unCoverRecord([TestID],CoverResult), % need to deal with evaluation Depth and e to b problem 
		ex(TestID,E,PosNegSign),
		trueCheck(CoverResult,PosNegSign,CorrectSign),
		(CorrectSign=[1] ->
			Result=[TestID];
			Result=[]
		).


trueCheck([],1,[1]).
trueCheck([E],0,[1]).
trueCheck([],0,[]).
trueCheck([E],1,[]).
% TruePositive, FalsePos,
% TrueNeg, FalseNeg








lv_readFile:-
	yap_flag(argv,[InputFile]),
  	consult(InputFile), 
	%tell('grammarLeaveOneOut.txt'),	
	findall(EIp,ex(EIp,Ep,1),PosEI0s), % full size learning
	findall(EIn,ex(EIn,En,0),NegEIs),
	length(NegEIs,NK),

	unCoverRecord(PosEI0s,PosEIs), % reduce = remove those already explained by the examples
	length(PosEIs,PK),
	append(PosEIs,NegEIs,AllEI),
	write({PK,NK}),write('Totally '),nl,
	leaveOneOut(AllEI,AllEI,Results),
	
	% Results is a list of Uncovered test data -- you may trace the learning result and see why
	percentage(Results,AllEI,PA),
	write('Predictive Accuracy is'),write(PA),nl,
	nl.%told.
