:- dynamic item_stat/7.
parse:-
	t(N,Marker,Sen,IsLimit,PEdgeNum),
	length(Sen,Length),
	((IsLimit == yes) -> set_edge_limit(PEdgeNum)
			; set_edge_limit(inf)
	),
	statistics(walltime, [Start,_]),
	(time(Sen,Time,Result)-> 
	 (
		ItemParseTime = Time,
		NumberOfEdges = Result,
		Status = ok
	 );true	 
	),
	statistics(walltime, [End,_]),
	(var(ItemParseTime)->
         (
        	ItemParseTime is End - Start,
       		edgenum(NumberOfEdges),
		Status = fail
	 );true
	),
	findall(1,edge(_,0,Length,_,_,_),Os),
	length(Os,NumParses),
	((Marker == no) -> 
	  assert(item_stat(N,'*',Sen,ItemParseTime,NumberOfEdges,NumParses,Status))
	  ;assert(item_stat(N,'',Sen,ItemParseTime,NumberOfEdges,NumParses,Status))
	),
	fail.
parse.

set_edge_limit(NewLimit) :-
	retract(ale_flag(edgelimit,_)),
	assert(ale_flag(edgelimit,NewLimit)).

time(Ws,Time,Result) :-
   clear,
   assert(parsing(Ws)),
   reverse_count_lex_check(Ws,[],WsRev,0,Length),
   rec_chart_init(Length,Chart),
   statistics(walltime,_),
   ( on_exception(_,build(WsRev,Length,Chart),
                  (statistics(walltime,[_,Time]),
                   Result = exception))
   -> statistics(walltime,[_,Time]),
      edgenum(Result)
   ; statistics(walltime,[_,Time]),
     Result = fail
   ).

bp5:-
   use_module(library(system)),
   retractall(item_stat(_,_,_,_,_,_,_)), 	
   see(user), 
   nl,write('*******************************************************'),
   nl,write('Batch Parsing ...'),
   nl,write('Enter the input file name : '),
   read(InputFile),	
   nl,write('Enter the output file name : '),
   read(OutputFile),
   compile(InputFile),	
   parse, 	
   tell(OutputFile),
   findall(N,item_stat(N,_,_,_,_,_,_),Ns),
   sort(Ns,NSs),
   write_parse_results_with_time(Ns,0),
   write_summary(NSs),	
   told,
   !.
  	

write_summary(Ns):-
	calc_summary(Ns,TotalParse,TotalTime,TotalEdge,TotalFailed),
	length(Ns,TotalItem),
	nl,write(';**********************************************'),nl,
	write('  ;Total number of items parsed : '),write(TotalItem),nl,
	write('  ;Total spanning parses : '),write(TotalParse),nl,
	write('  ;Total number of edges: '),write(TotalEdge),nl,
	write('  ;Total number of failed parses: '),write(TotalFailed),nl,
	write('  ;Total time : '),write(TotalTime),nl,
	nl,write(';**********************************************'),nl.

calc_summary(Ns,TotalParse,TotalTime,TotalEdge, TotalFailed):-
	calc_summary_act(Ns,0,0,0,0,TotalParse,TotalTime,TotalEdge,TotalFailed).

calc_summary_act([],NewTotalParseAcc,NewTotalTimeAcc,NewTotalEdgeAcc,NewTotalFailedAcc,TotalParse,TotalTime,TotalEdge,TotalFailed):-
	TotalParse is NewTotalParseAcc,
	TotalTime is NewTotalTimeAcc,
	TotalEdge is NewTotalEdgeAcc,
	TotalFailed is NewTotalFailedAcc.

calc_summary_act([N|Rest],TotalParseAcc,TotalTimeAcc,TotalEdgeAcc,TotalFailedAcc,TotalParse,TotalTime,TotalEdge, TotalFailed):-
	item_stat(N,_,_,ItemParseTime,NumberOfEdges,NumParses,Status),
	NewTotalParseAcc is TotalParseAcc + NumParses ,
	NewTotalTimeAcc is TotalTimeAcc + ItemParseTime,
	NewTotalEdgeAcc is TotalEdgeAcc + NumberOfEdges,
	(
	   (Status == fail) -> NewTotalFailedAcc is TotalFailedAcc +1
			; NewTotalFailedAcc is TotalFailedAcc
	),
 	calc_summary_act(Rest,NewTotalParseAcc,NewTotalTimeAcc,NewTotalEdgeAcc,NewTotalFailedAcc,TotalParse,TotalTime,TotalEdge,TotalFailed).


write_parse_results_with_time([],_).
write_parse_results_with_time([N|T],Cnt):-
	NewCnt is Cnt+1,
	item_stat(N,Marker,Sen,ItemParseTime,NumberOfEdges,NumParses,Status),
	write(NewCnt),write(' '),
	write(Marker),write_sen(Sen),write(' '),
	write(NumParses),write(' '),
	write(NumberOfEdges),write(' '),
	write(ItemParseTime),write(' '),
	write(Status),write(' '),nl,
	write_parse_results_with_time(T,NewCnt).

write_sen([Word]):- write(Word),write('. ').
write_sen([Word|Rest]):-
        write(Word),write(' '),
        write_sen(Rest).	
