This repository has been archived on 2023-08-20. You can view files and clone it, but cannot push or open issues or pull requests.
yap-6.3/packages/ProbLog/problog_learning/logger.yap

312 lines
8.1 KiB
Plaintext
Raw Normal View History

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