:- dynamic item_stat/6.
parse_items:-
	t(N,Marker,Sen),length(Sen,Length),
	((\+ \+(rec(Sen,_,_,_,ItemParseTime,_)))-> true
	;(\+ (rec(Sen,_,_,_,ItemParseTime,_)))
	),
	edgenum(NumberOfEdges),
	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_items.


bpd:-
   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_items, 	
   tell(OutputFile),
   findall(N,item_stat(N,_,_,_,_,_),Ns),
   sort(Ns,NSs),
   write_parse_results_with_time_chart(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_chart([],_).
write_parse_results_with_time_chart([N|T],Cnt):-
	NewCnt is Cnt+1,
	item_stat(N,Marker,Sen,ItemParseTime,NumberOfEdges,NumParses),
	nl,
	write('------------'),
	write(NewCnt),write(' '),
	write(Marker),write_sen(Sen),write(' '),
	write(NumParses),write(' '),
	write(NumberOfEdges),write(' '),
	write(ItemParseTime),write(' '),
	nl,
	print_chart,
	write_parse_results_with_time_chart(T,NewCnt).

print_chart :-
	write(' > chart dump:'),nl,
	findall(
        1,
        ( edge(Index,From,To,_,Dtrs,RuleName),
          write(From),write('-'),write(To),
          write(' ['),
          write(Index),
          write('] '),
          write(RuleName),
          write(' '),
          write('=>'),
          write(' (string) '),
          write(Dtrs),nl
        ),
        _Es
	),
	nl.

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