% compared to b_noCycle0.pl, this one removes those about no_change
% both Substrate and Enzyme Limiting -- no conditions to guide the road
% indirect mapping from reaction to EC via enzymes's ecClass
% terminology -- catINcreased, catDEcreased






% catalyzed_by_ECclass -- move to network/a.pl




concentration(X,Change,Time,VisitedNodes):-	% using other examples
	write('try to use old'),
	ex(EI,concentration(X,Change,Time),1),!,write('-=-=-=-=-=-=-=-=-old do exit-----------------'),
	write('***using this example***'), writeq(EI-X), write(' and '), write(VisitedNodes),nl.
% won't be used in reasoning, but used in T for excluding those useless

concentration(X,Change,Time,VisitedNodes):- 
	length(VisitedNodes,K),K>1,
	threeStatesOpposite(Change,Opp1,Opp2),
	(ex(EI,concentration(X,Opp1,Time),1);ex(EI,concentration(X,Opp2,Time),1)),
	write('!!! this metabolite is measured to be '), ex0(EI,concentration(Xname,ActualChange,Time),1),write({Xname,ActualChange}),nl,
	!,
	fail.





/****************** Direct Effect ******************/
/*---------- Blocked/Slower down ----------*/
% 12,15,18 enzyme inhibited
concentration(PID,down,Time,VisitedNodes):-				%concept_name(P,PID,true),	
	produced_by(PID,ReactionID,'IMPD'),	%reaction(ReactionID,'','LycoCyc','IMPD'),
	reaction_state(ReactionID,enzymeLimiting,cataDecreased,Time).
	%enzyme_state(EC_Number,inhibited),portray_clause(VisitedNodes),write({EC_Number,inhibited}).


% enzyme inhibited
concentration(SID,up,Time,VisitedNodes):-				%concept_name(S,SID,true),	
	length(VisitedNodes,K),K<3,
	consumed_by(SID,ReactionID,'IMPD'),	%reaction(ReactionID,'','LycoCyc','IMPD'),
	reaction_state(ReactionID,enzymeLimiting,cataDecreased,Time).
	%enzyme_state(EC_Number,inhibited),portray_clause(VisitedNodes),write(' weird if long effect'),write({EC_Number,inhibited}).



/*---------- Speeded Up ----------*/
% 10,13,16 enzyme activated
concentration(PID,up,Time,VisitedNodes):-				%concept_name(P,PID,true),	
	produced_by(PID,ReactionID,'IMPD'),	%reaction(ReactionID,'','LycoCyc','IMPD'),
	reaction_state(ReactionID,enzymeLimiting,cataIncreased,Time).


% enzyme activated
concentration(SID,down,Time,VisitedNodes):-				%concept_name(S,SID,true),	
	length(VisitedNodes,K),K<3,
	consumed_by(SID,ReactionID,'IMPD'),	%reaction(ReactionID,'','LycoCyc','IMPD'),
	reaction_state(ReactionID,enzymeLimiting,cataIncreased,Time).


/*---------- No change----------*/
/*concentration(PID,no_change,Time,VisitedNodes):-				%concept_name(P,PID,true),	
	produced_by(PID,ReactionID,'IMPD'),	%reaction(ReactionID,'','LycoCyc','IMPD'),
	reaction_state(ReactionID,enzymeLimiting,cataNoChange,Time).	


concentration(SID,no_change,Time,VisitedNodes):-				%concept_name(S,SID,true),	
	length(VisitedNodes,K),K<3,
	consumed_by(SID,ReactionID,'IMPD'),	%reaction(ReactionID,'','LycoCyc','IMPD'),
	reaction_state(ReactionID,enzymeLimiting,cataNoChange,Time).

concentration(SID,no_change,Time,VisitedNodes):-				%concept_name(S,SID,true),	
	length(VisitedNodes,K),K<3,
	consumed_by(SID,ReactionID,'IMPD'),	%reaction(ReactionID,'','LycoCyc','IMPD'),
	\+produced_by(SID,ReactionID_Any,'IMPD'),
	reaction_state(ReactionID,enzymeLimiting,cataNoChange,Time).
*/

/****************** Indirect Effect -- Substrate Limiting ******************/

% S up
concentration(PID,up,Time,VisitedNodes):-				%concept_name(P,PID,true),	
	produced_by(PID,ReactionID,'IMPD'),	%reaction(ReactionID,'','LycoCyc','IMPD'),
	reaction_state(ReactionID,substrateLimiting,sUp,Time),
	consumed_by(SID,ReactionID,'IMPD'),\+member(SID,VisitedNodes),
	concentration(SID,up,Time,[SID|VisitedNodes]).

% S down
concentration(PID,down,Time,VisitedNodes):-				%concept_name(P,PID,true),	
	produced_by(PID,ReactionID,'IMPD'),	%reaction(ReactionID,'','LycoCyc','IMPD'),
	reaction_state(ReactionID,substrateLimiting,sDown,Time),
	consumed_by(SID,ReactionID,'IMPD'),\+member(SID,VisitedNodes),
	concentration(SID,down,Time,[SID|VisitedNodes]).


/*% S no change
concentration(PID,no_change,Time,VisitedNodes):-				%concept_name(P,PID,true),	
	produced_by(PID,ReactionID,'IMPD'),	%reaction(ReactionID,'','LycoCyc','IMPD'),
	reaction_state(ReactionID,substrateLimiting,*,Time),
	consumed_by(SID,ReactionID,'IMPD'),\+member(SID,VisitedNodes),
	concentration(SID,no_change,Time,[SID|VisitedNodes]).
*/




/************ Integrity Constraint **************/
integrityConstraint:-
	reaction_state(ReactionID,LimitingType1,Change1,Time),reaction_state(ReactionID,LimitingType2,Change2,Time),
	Change1\==Change2. % this include the case that their limiting types are different.


/****************** Simple direct rules ******************/
%This integrity constraint can be put into top theory directly.
/* this can be transform into integrity constraint 
enzyme_state(EC_Number,activated):- concentration_enzClass(EC_Number,up).
enzyme_state(EC_Number,no_change):- concentration_enzClass(EC_Number,no_change).
enzyme_state(EC_Number,inhibited):- concentration_enzClass(EC_Number,down).
*/

set(specificScore,no).

scoreSpecific(T,Coverage,Score):-
	tCompScore(T,TComplex),
	%Score is TComplex+Coverage.
	scoreOneTheoryByGE(T,GEscore),
	CoverageScore is 2*Coverage,
	Score is GEscore*(TComplex+CoverageScore).

% This is to say, ignore the no_change
tCompScore([],0).
tCompScore([ClaI|T],NTScore):-
	tCompScore(T,TScore), 
	nl,write(ClaI),nl,
	(ClaI=[enzyme_state-{EC_Number,no_change}]->
		NTScore=TScore;
		claInterpreter(ClaI,Cla),
		length(Cla,HL),
		NTScore is TScore+HL
	).	


