312 lines
8.1 KiB
Prolog
312 lines
8.1 KiB
Prolog
%%% -*- 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).
|