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

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
   ).

bp4:-
   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),
	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 time : '),write(TotalTime),nl,
	nl,write(';**********************************************'),nl.

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

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

calc_summary_act([N|Rest],TotalParseAcc,TotalTimeAcc,TotalEdgeAcc,TotalParse,TotalTime,TotalEdge):-
	item_stat(N,_,_,ItemParseTime,NumberOfEdges,NumParses),
	NewTotalParseAcc is TotalParseAcc + NumParses ,
	NewTotalTimeAcc is TotalTimeAcc + ItemParseTime,
	NewTotalEdgeAcc is TotalEdgeAcc + NumberOfEdges,
 	calc_summary_act(Rest,NewTotalParseAcc,NewTotalTimeAcc,NewTotalEdgeAcc,TotalParse,TotalTime,TotalEdge).


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),
	write(NewCnt),write(' '),
	write(Marker),write_sen(Sen),write(' '),
	write(NumParses),write(' '),
	write(NumberOfEdges),write(' '),
	write(ItemParseTime),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).	
