312 lines
		
	
	
		
			8.1 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
		
		
			
		
	
	
			312 lines
		
	
	
		
			8.1 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
|   | %%% -*- Mode: Prolog; -*- | ||
|  | 
 | ||
|  | 
 | ||
|  | :- module(logger,[logger_define_variable/2, | ||
|  | 	          logger_define_variables/2, | ||
|  | 	          logger_set_filename/1, | ||
|  | 		  logger_set_delimiter/1, | ||
|  | 		  logger_set_variable/2, | ||
|  | 		  logger_set_variable_again/2, | ||
|  | 		  logger_get_variable/2, | ||
|  | 		  logger_start_timer/1, | ||
|  | 		  logger_stop_timer/1, | ||
|  | 		  logger_write_data/0, | ||
|  | 		  logger_write_header/0]). | ||
|  | 
 | ||
|  | :- use_module(library(system),[datime/1,mktime/2]). | ||
|  | :- use_module(library(lists),[append/3,member/2]). | ||
|  | 
 | ||
|  | :- yap_flag(unknown,error). | ||
|  | :- style_check(single_var). | ||
|  | 
 | ||
|  | :- bb_put(logger_filename,'out.dat'). | ||
|  | :- bb_put(logger_delimiter,';'). | ||
|  | :- bb_put(logger_variables,[]). | ||
|  | 
 | ||
|  | 
 | ||
|  | %======================================================================== | ||
|  | %= Defines a new variable, possible types are: int, float and time | ||
|  | %= | ||
|  | %= +Name, +Type | ||
|  | %======================================================================== | ||
|  | 
 | ||
|  | logger_define_variable(Name,int) :- | ||
|  | 	!, | ||
|  | 	is_variable_already_defined(Name), | ||
|  | 	bb_delete(logger_variables,OldVariables), | ||
|  | 	append(OldVariables,[(Name,int)],NewVariables), | ||
|  | 	bb_put(logger_variables,NewVariables), | ||
|  | 	atom_concat(logger_data_,Name,Key), | ||
|  | 	bb_put(Key,null). | ||
|  | logger_define_variable(Name,float) :- | ||
|  | 	!, | ||
|  | 	is_variable_already_defined(Name), | ||
|  | 	bb_delete(logger_variables,OldVariables), | ||
|  | 	append(OldVariables,[(Name,float)],NewVariables), | ||
|  | 	bb_put(logger_variables,NewVariables), | ||
|  | 	atom_concat(logger_data_,Name,Key), | ||
|  | 	bb_put(Key,null). | ||
|  | logger_define_variable(Name,time) :- | ||
|  | 	!, | ||
|  | 	is_variable_already_defined(Name), | ||
|  | 	bb_delete(logger_variables,OldVariables), | ||
|  | 	append(OldVariables,[(Name,time)],NewVariables), | ||
|  | 	bb_put(logger_variables,NewVariables), | ||
|  | 	atom_concat(logger_data_,Name,Key), | ||
|  | 	atom_concat(logger_start_time_,Name,Key2), | ||
|  | 	bb_put(Key,null), | ||
|  | 	bb_put(Key2,null). | ||
|  | logger_define_variable(Name,Unknown) :- | ||
|  | 	is_variable_already_defined(Name), | ||
|  | 	write('logger_define_variable, unknown type '), | ||
|  | 	write(Unknown), | ||
|  | 	write(' for variable '), | ||
|  | 	write(Name), | ||
|  | 	nl, | ||
|  | 	fail. | ||
|  | 
 | ||
|  | is_variable_already_defined(Name) :- | ||
|  | 	bb_get(logger_variables,Variables), | ||
|  | 	member((Name,_),Variables),!, | ||
|  | 	write('logger_define_variable, Variable '), | ||
|  | 	write(Name), | ||
|  | 	write(' is already defined!\n'), | ||
|  | 	fail; | ||
|  | 	true. | ||
|  | 
 | ||
|  | %======================================================================== | ||
|  | %=  | ||
|  | %= | ||
|  | %= +ListOfNames, +Type | ||
|  | %======================================================================== | ||
|  | 
 | ||
|  | logger_define_variables([],_). | ||
|  | logger_define_variables([H|T],Type) :- | ||
|  | 	logger_define_variable(H,Type), | ||
|  | 	logger_define_variables(T,Type). | ||
|  | 
 | ||
|  | %======================================================================== | ||
|  | %= Set the filename, to which the output should be appended | ||
|  | %= | ||
|  | %= +Name | ||
|  | %======================================================================== | ||
|  | 
 | ||
|  | logger_set_filename(Name) :- | ||
|  | 	bb_put(logger_filename,Name). | ||
|  | 
 | ||
|  | %======================================================================== | ||
|  | %= Set the delimiter for the fields | ||
|  | %=  | ||
|  | %= +Delimiter | ||
|  | %======================================================================== | ||
|  | 
 | ||
|  | logger_set_delimiter(Delimiter) :- | ||
|  | 	bb_put(logger_delimiter,Delimiter). | ||
|  | %======================================================================== | ||
|  | %= Set the value of the variable name. If the value is already set or | ||
|  | %= if the variable does not exists, an error will be displayed and the | ||
|  | %= Prolog will be halted.  | ||
|  | %= | ||
|  | %= +Name, +Value | ||
|  | %======================================================================== | ||
|  | 
 | ||
|  | logger_set_variable(Name,Value) :- | ||
|  | 	atom_concat(logger_data_,Name,Key), | ||
|  | 	( | ||
|  | 	    bb_get(Key,null) | ||
|  | 	-> | ||
|  | 	    ( | ||
|  | 		bb_put(Key,Value) | ||
|  | 	    );( | ||
|  | 	         bb_get(Key,_) | ||
|  | 	      -> | ||
|  | 	         ( | ||
|  | 		     write('logger_set_variable, Variable '), | ||
|  | 		     write(Name), | ||
|  | 		     write(' is already set'), | ||
|  | 		     nl, | ||
|  | 		     fail | ||
|  | 		 ) ; ( | ||
|  | 		     write('logger_set_variable, unknown variable '), | ||
|  | 		     write(Name), | ||
|  | 		     nl, | ||
|  | 		     fail | ||
|  | 		     ) | ||
|  | 		 )	  | ||
|  | 	),!. | ||
|  | 
 | ||
|  | %======================================================================== | ||
|  | %= Set the value of the variable name. If the value is already set or | ||
|  | %= the old value is overwritten. If the variable does not exists, an | ||
|  | %= error will be displayed and the Prolog will be halted.  | ||
|  | %= | ||
|  | %= +Name, +Value | ||
|  | %======================================================================== | ||
|  | 
 | ||
|  | logger_set_variable_again(Name,Value) :- | ||
|  | 	atom_concat(logger_data_,Name,Key), | ||
|  | 	( | ||
|  | 	    bb_get(Key,_) | ||
|  | 	-> | ||
|  | 	    ( | ||
|  | 		bb_put(Key,Value) | ||
|  | 	    );( | ||
|  | 	         write('logger_set_variable, unknown variable '), | ||
|  |                  write(Name), | ||
|  |      		 nl, | ||
|  | 		 fail | ||
|  |                ) | ||
|  | 	),!. | ||
|  | 
 | ||
|  | 
 | ||
|  | logger_variable_is_set(Name) :- | ||
|  | 	atom_concat(logger_data_,Name,Key), | ||
|  | 	bb_get(Key,X), | ||
|  | 	X \= null. | ||
|  | 
 | ||
|  | %======================================================================== | ||
|  | %= Get the value of the variable name. If the value is not yet set or | ||
|  | %= if the variable does not exists, an error will be displayed and the | ||
|  | %= Prolog will be halted.  | ||
|  | %= | ||
|  | %= +Name, +Value | ||
|  | %======================================================================== | ||
|  | 
 | ||
|  | logger_get_variable(Name,Value) :- | ||
|  | 	atom_concat(logger_data_,Name,Key), | ||
|  | 	( | ||
|  | 	    bb_get(Key,null) | ||
|  | 	-> | ||
|  | 	    ( | ||
|  | 		write('logger_get_variable, Variable '), | ||
|  | 		write(Name), | ||
|  | 		write(' is not yet set'), | ||
|  | 		nl, | ||
|  | 		fail | ||
|  | 	    );( | ||
|  | 	         bb_get(Key,Value) | ||
|  | 	         ;  | ||
|  | 		  ( | ||
|  | 		      write('logger_set_variable, unknown variable '), | ||
|  | 		      write(Name), | ||
|  | 		      nl, | ||
|  | 		      fail | ||
|  | 		   )	  | ||
|  | 	) | ||
|  |         ),!. | ||
|  | %======================================================================== | ||
|  | %=  | ||
|  | %=  | ||
|  | %= +Name | ||
|  | %======================================================================== | ||
|  | 
 | ||
|  | logger_start_timer(Name) :- | ||
|  | 	atom_concat(logger_start_time_,Name,Key), | ||
|  | 	( | ||
|  | 	    bb_get(Key,null) | ||
|  | 	-> | ||
|  | 	    ( | ||
|  | 		statistics(walltime,[StartTime,_]), | ||
|  | 		bb_put(Key,StartTime) | ||
|  | 	    );( | ||
|  | 	        bb_get(Key,_) | ||
|  | 	    -> | ||
|  | 	       ( | ||
|  | 		   write('logger_start_timer, timer '), | ||
|  | 		   write(Name), | ||
|  | 		   write(' is already started'), | ||
|  | 		   nl, | ||
|  | 		   fail | ||
|  | 	       );( | ||
|  | 	           write('logger_start_timer, timer '), | ||
|  | 		   write(Name), | ||
|  | 		   write(' is not defined'), | ||
|  | 		   nl, | ||
|  | 		   fail | ||
|  | 	         ) | ||
|  | 	      ) | ||
|  | 	  ),!. | ||
|  | 	 | ||
|  | 
 | ||
|  | logger_stop_timer(Name) :- | ||
|  | 	atom_concat(logger_start_time_,Name,Key), | ||
|  | 
 | ||
|  | 	bb_delete(Key,StartTime), | ||
|  | 	statistics(walltime,[StopTime,_]), | ||
|  | 
 | ||
|  | 	bb_put(Key,null), | ||
|  | 
 | ||
|  | 	Duration is StopTime-StartTime, | ||
|  | 
 | ||
|  | 	( | ||
|  | 	    logger_variable_is_set(Name) | ||
|  |         -> | ||
|  | 	    ( | ||
|  | 		logger_get_variable(Name,OldDuration), | ||
|  | 		NewDuration is Duration+OldDuration, | ||
|  | 	        logger_set_variable_again(Name,NewDuration) | ||
|  | 	    ); logger_set_variable(Name,Duration) | ||
|  | 	),!. | ||
|  | 
 | ||
|  | %======================================================================== | ||
|  | %= write a new line to the log file, which contains all the | ||
|  | %= values of the variables. afterwards, reset all variables to null. | ||
|  | %=  | ||
|  | %======================================================================== | ||
|  | 
 | ||
|  | logger_write_data :- | ||
|  | 	bb_get(logger_filename,FName), | ||
|  | 	bb_get(logger_variables,Variables), | ||
|  | 	open(FName,'append',Handle), | ||
|  | 	logger_write_data_intern(Variables,Handle), | ||
|  | 	close(Handle), | ||
|  | 
 | ||
|  | 	% reset variables | ||
|  | 	findall(_,(member((Name,_),Variables),atom_concat(logger_data_,Name,Key),bb_put(Key,null)),_), | ||
|  | 	findall(_,(member((Name,time),Variables),atom_concat(logger_start_time_,Name,Key2),bb_put(Key2,null)),_). | ||
|  | 	 | ||
|  | logger_write_data_intern([],_). | ||
|  | logger_write_data_intern([(Name,_Type)],Handle) :- | ||
|  | 	variablevalue_with_nullcheck(Name,Value), | ||
|  | 	write(Handle,Value), | ||
|  | 	write(Handle,'\n'). | ||
|  | logger_write_data_intern([(Name,_Type),Next|T],Handle) :- | ||
|  | 	variablevalue_with_nullcheck(Name,Value), | ||
|  | 	bb_get(logger_delimiter,D), | ||
|  | 	write(Handle,Value), | ||
|  | 	write(Handle,D), | ||
|  | 	logger_write_data_intern([Next|T],Handle). | ||
|  | 
 | ||
|  | variablevalue_with_nullcheck(Name,Result) :- | ||
|  | 	atom_concat(logger_data_,Name,Key), | ||
|  | 	bb_get(Key,Value), | ||
|  | 	( | ||
|  | 	    Value=null | ||
|  | 	->  | ||
|  | 	    Result = '' ;  | ||
|  | 	    Result=Value | ||
|  | 	). | ||
|  | %======================================================================== | ||
|  | %=  | ||
|  | %=  | ||
|  | %=  | ||
|  | %======================================================================== | ||
|  | 
 | ||
|  | logger_write_header :- | ||
|  | 	bb_get(logger_filename,FName), | ||
|  | 	bb_get(logger_variables,Variables), | ||
|  | 	open(FName,'append',Handle), | ||
|  | 	write(Handle,'# '), | ||
|  | 	logger_write_header_intern(Variables,Handle), | ||
|  | 	write(Handle,'\n'), | ||
|  | 	close(Handle). | ||
|  | 	 | ||
|  | logger_write_header_intern([],_). | ||
|  | logger_write_header_intern([(Name,_Type)],Handle) :- | ||
|  | 	write(Handle,Name). | ||
|  | logger_write_header_intern([(Name,_Type),Next|T],Handle) :- | ||
|  | 	bb_get(logger_delimiter,D), | ||
|  | 	write(Handle,Name), | ||
|  | 	write(Handle,D), | ||
|  | 	logger_write_header_intern([Next|T],Handle). |