last fixes of ProbLog
This commit is contained in:
311
packages/ProbLog/problog_learning/logger.yap
Normal file
311
packages/ProbLog/problog_learning/logger.yap
Normal file
@@ -0,0 +1,311 @@
|
||||
%%% -*- 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).
|
Reference in New Issue
Block a user