% classifier_utilities.pl

%---------------------------------------------------------------

:- module(classifier_utilities,
	  [is_alist/1,
           check_alists_are_compatible/1,
	   open_alist/3,
	   close_alist/1,
	   read_alist/2,
	   is_end_of_file_alist/1,
           make_tmp_file/2,
	   get_default_confidence_threshold/1,
	   set_default_confidence_threshold/1]
      ).

%---------------------------------------------------------------

:- use_module('$REGULUS/PrologLib/utilities').

:- use_module(library(system)).
:- use_module(library(lists)).
:- use_module(library(terms)).

%------------------------------------------------------------------------------------

:- dynamic default_confidence_threshold/1.

%------------------------------------------------------------------------------------

is_alist(X) :-
	is_list(X),
	is_alist1(X).

is_alist1([]).
is_alist1([F | R]) :-
	subsumes_chk(_-_, F),
	!,
	is_alist1(R).

%------------------------------------------------------------------------------------

check_alists_are_compatible([]) :-
	!.
check_alists_are_compatible([F | R]) :-
	is_alist(F),
	get_keys_from_alist(F, Keys),
	no_doubles(Keys),
	check_alists_are_compatible1(Keys, R),
	!.
check_alists_are_compatible(Other) :-
	format('~N*** Error: bad call: ~w~n', [check_alists_are_compatible(Other)]),
	fail.

check_alists_are_compatible1(_Keys, []) :-
	!.
check_alists_are_compatible1(Keys, [F | R]) :-
	get_keys_from_alist(F, Keys1),
	permutation(Keys, Keys1),
	!,
	check_alists_are_compatible1(Keys, R).

%------------------------------------------------------------------------------------

% open_alist(+FileAlist, +Mode, -StreamAlist)

open_alist([], _Mode, []) :-
	!.
open_alist([Key-File | Files], Mode, [Key-Stream | Streams]) :-
	open(File, Mode, Stream),
	!,
	open_alist(Files, Mode, Streams).
open_alist(FileAlist, Mode, StreamAlist) :-
	format('~N*** Error: bad call: ~w~n', [open_alist(FileAlist, Mode, StreamAlist)]),
	fail.

%------------------------------------------------------------------------------------

% close_alist(+StreamAlist)

close_alist([]) :-
	!.
close_alist([_Key-Stream | Streams]) :-
	close(Stream),
	!,
	close_alist(Streams).
close_alist(Other) :-
	format('~N*** Error: bad call: ~w~n', [close_alist(Other)]),
	fail.

%------------------------------------------------------------------------------------

% read_alist(+StreamAlist, -TermAlist)

read_alist([], []) :-
	!.
read_alist([Key-Stream | Streams], [Key-Term | Terms]) :-
	read(Stream, Term),
	read_alist(Streams, Terms),
	!.
read_alist(StreamAlist, TermAlist) :-
	format('~N*** Error: bad call: ~w~n', [read_alist(StreamAlist, TermAlist)]),
	fail.

%------------------------------------------------------------------------------------

is_end_of_file_alist([]) :-
	!.
is_end_of_file_alist([_Key-Term | R]) :-
	Term == end_of_file,
	!,
	is_end_of_file_alist(R).

%------------------------------------------------------------------------------------

make_tmp_file(File0, File) :-
	absolute_file_name(alterf_generated_files(File0), File).

%--------------------------------------------------------------------------------------------

get_default_confidence_threshold(Value) :-
	default_confidence_threshold(Value1),
	!,
	Value = Value1.
get_default_confidence_threshold(Value) :-
	Value = 45.

set_default_confidence_threshold(Value) :-
	retractall(default_confidence_threshold(_)),
	assertz(default_confidence_threshold(Value)).

%--------------------------------------------------------------------------------------------

get_keys_from_alist([], []).
get_keys_from_alist([Key-_ | R], [Key | R1]) :-
	get_keys_from_alist(R, R1).