/* Noisy OR in Picat. From https://github.com/SHoltzen/dice/blob/master/benchmarks/baselines/noisyOr.psi https://github.com/SHoltzen/dice/blob/master/benchmarks/baselines/noisyOr.dice Cf my Gamble model gamble_noisy_or.rkt This program was created by Hakan Kjellerstrand, hakank@gmail.com See also my Picat page: http://www.hakank.org/picat/ */ import ppl_distributions, ppl_utils. import util. main => go. /* var : expected value: Probabilities: 0.814419: 0.8169000000000000 0.185581: 0.1831000000000000 mean = 0.699279 var : n3 Probabilities: true: 0.8169000000000000 false: 0.1831000000000000 mean = [true = 0.8169,false = 0.1831] */ go ?=> reset_store, run_model(10_000,$model,[show_probs_trunc,mean]), nl, % show_store_lengths, % fail, nl. go => true. model() => N0 = flip(), N4 = flip(), N1 = condt(N0,flip(4/5), flip(1/10)), N21 = condt(N0,flip(4/5),flip(1/10)), N22 = condt(N4,flip(4/5),flip(1/10)), N33 = condt(N4,flip(4/5),flip(1/10)), N2 = check((N21 ; N22)), N31 = condt(N1,flip(4/5),flip(1/10)), N32 = condt(N2,flip(4/5),flip(1/10)), N3 = check((N31 ; N32 ; N33)), % return n3 ;; PSI: expected: 130307/160000·δ(1)(n3)+29693/160000·δ(0)(n3) add("n3",N3), add("expected value:", ((130307/160000)*condt(N3,1,0)) + ((29693/160000) * condt(N3,0,1)) % the expected value ).