66 lines
2.0 KiB
Plaintext
66 lines
2.0 KiB
Plaintext
%%%%
|
|
%%%% Library for generic noisy OR predicates --- noisy_or.psm
|
|
%%%%
|
|
%%%% Copyright (C) 2007,2008
|
|
%%%% Sato Laboratory, Dept. of Computer Science,
|
|
%%%% Tokyo Institute of Technology
|
|
|
|
%% When this file included, the following predicates will be available:
|
|
%%
|
|
%% - cpt(X,PaVs,V) represents a probabilistic choice where a
|
|
%% random variable X given instantiations PaVs of parents
|
|
%% takes a value V. If X is an ordinary node, a random
|
|
%% switch bn(X,PaVs) will be used. On the other hand, if
|
|
%% X is a noisy-OR node, switch cause(X,Y) will be used,
|
|
%% where Y is one of parents of X.
|
|
%%
|
|
%% - set_nor_params/0 sets inhibition probabilisties (i.e.
|
|
%% the parameters of switches cause(X,Y)) according to
|
|
%% the specifications for noisy-OR nodes with noisy_or/3.
|
|
|
|
%%---------------------------------------
|
|
%% Declarations:
|
|
|
|
% added just for making the results of probabilistic inference
|
|
% simple and readable:
|
|
:- p_not_table choose_noisy_or/4, choose_noisy_or/6.
|
|
|
|
%%---------------------------------------
|
|
%% Modeling part:
|
|
|
|
cpt(X,PaVs,V):-
|
|
( noisy_or(X,Pa,_) -> choose_noisy_or(X,Pa,PaVs,V) % for noisy OR nodes
|
|
; msw(bn(X,PaVs),V) % for ordinary nodes
|
|
).
|
|
|
|
choose_noisy_or(X,Pa,PaVs,V):- choose_noisy_or(X,Pa,PaVs,no,no,V).
|
|
|
|
choose_noisy_or(_,[],[],yes,V,V).
|
|
choose_noisy_or(_,[],[],no,_,no).
|
|
choose_noisy_or(X,[Y|Pa],[PaV|PaVs],PaHasYes0,ValHasYes0,V):-
|
|
( PaV=yes ->
|
|
msw(cause(X,Y),V0),
|
|
PaHasYes=yes,
|
|
( ValHasYes0=no, V0=no -> ValHasYes=no
|
|
; ValHasYes=yes
|
|
)
|
|
; PaHasYes=PaHasYes0,
|
|
ValHasYes=ValHasYes0
|
|
), % do not insert the cut symbol here
|
|
choose_noisy_or(X,Pa,PaVs,PaHasYes,ValHasYes,V).
|
|
|
|
|
|
%%---------------------------------------
|
|
%% Utility part:
|
|
|
|
set_nor_params:-
|
|
( noisy_or(X,Pa,DistList), % spec for a noisy OR node
|
|
set_nor_params(X,Pa,DistList),
|
|
fail
|
|
; true
|
|
).
|
|
set_nor_params(_,[],[]).
|
|
set_nor_params(X,[Y|Pa],[Dist|DistList]):-
|
|
set_sw(cause(X,Y),Dist),!,
|
|
set_nor_params(X,Pa,DistList).
|