-
Notifications
You must be signed in to change notification settings - Fork 14
Support of message passing for Boolean functions #170
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from 15 commits
8b4b755
082065c
74ddf64
b7548ec
37e4706
6446033
7b01a64
082a5a8
eec109f
a3ed124
ed56cba
fca65ef
547df59
b14b302
03d9233
52025ae
b07e976
5d58184
6f68b7e
b142440
d91613d
19449ff
08d406d
6d07229
1ef5b94
581dd8b
afa9870
8a435ad
8ec8000
4bfdba3
9cda713
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,5 @@ | ||
| export AND | ||
|
|
||
| struct AND end | ||
|
|
||
| @node AND Deterministic [out, in1, in2] | ||
albertpod marked this conversation as resolved.
Show resolved
Hide resolved
|
||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,5 @@ | ||
| export IMPL | ||
|
|
||
| struct IMPL end | ||
|
|
||
| @node IMPL Deterministic [out, in1, in2] | ||
|
||
| Original file line number | Diff line number | Diff line change | ||||
|---|---|---|---|---|---|---|
| @@ -0,0 +1,5 @@ | ||||||
| export NOT | ||||||
|
|
||||||
| struct NOT end | ||||||
|
|
||||||
| @node NOT Deterministic [out, in1] | ||||||
bartvanerp marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
albertpod marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||||||
| @node NOT Deterministic [out, in1] | |
| @node NOT Deterministic [out, in] |
This change also requires to fix all rules from :in1 to :in
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,5 @@ | ||
| export OR | ||
|
|
||
| struct OR end | ||
|
|
||
| @node OR Deterministic [out, in1, in2] | ||
albertpod marked this conversation as resolved.
Show resolved
Hide resolved
|
||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,8 @@ | ||
| @rule AND(:in1, Marginalisation) ( | ||
| m_out::Bernoulli, | ||
| m_in2::Bernoulli | ||
| ) = begin | ||
| pout, pin2 = mean(m_out), mean(m_in2) | ||
|
|
||
| return Bernoulli((1 - pout - pin2 + 2 * pout * pin2) / (2 - 2 * pout - pin2 + 2 * pout * pin2)) | ||
| end |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,3 @@ | ||
| @rule AND(:in2, Marginalisation) (m_out::Bernoulli, m_in1::Bernoulli, meta::Any) = begin | ||
| return @call_rule AND(:in1, Marginalisation) (m_out = m_out, m_in2 = m_in1, meta = meta) | ||
| end |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,8 @@ | ||
| @marginalrule AND(:in1_in2) ( | ||
| m_out::Bernoulli, | ||
| m_in1::Bernoulli, | ||
| m_in2::Bernoulli | ||
| ) = begin | ||
| pin1, pin2, pout = mean(m_in1), mean(m_in2), mean(m_out) | ||
| return Contingency([(1-pin1)*(1-pin2)*(1-pout) (1-pin1)*pin2*(1-pout); pin1*(1-pin2)*(1-pout) pin1*pin2*pout]) | ||
bartvanerp marked this conversation as resolved.
Show resolved
Hide resolved
albertpod marked this conversation as resolved.
Show resolved
Hide resolved
|
||
| end | ||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,8 @@ | ||
| @rule AND(:out, Marginalisation) ( | ||
| m_in1::Bernoulli, | ||
| m_in2::Bernoulli | ||
| ) = begin | ||
| pin1, pin2 = mean(m_in1), mean(m_in2) | ||
|
|
||
| return Bernoulli(pin1 * pin2) | ||
| end |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,8 @@ | ||
| @rule typeof(IMPL)(:in1, Marginalisation) ( | ||
| m_out::Bernoulli, | ||
| m_in2::Bernoulli | ||
| ) = begin | ||
| pout, pin2 = mean(m_out), mean(m_in2) | ||
|
|
||
| return Bernoulli((1 - pout - pin2 + 2 * pout * pin2) / (1 - pin2 + 2 * pout * pin2)) | ||
| end |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,8 @@ | ||
| @rule typeof(IMPL)(:in2, Marginalisation) ( | ||
| m_out::Bernoulli, | ||
| m_in1::Bernoulli | ||
| ) = begin | ||
| pout, pin1 = mean(m_out), mean(m_in1) | ||
|
|
||
| return Bernoulli((pout) / (2 * pout + pin1 - 2 * pout * pin1)) | ||
| end |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,8 @@ | ||
| @marginalrule IMPL(:in1_in2) ( | ||
| m_out::Bernoulli, | ||
| m_in1::Bernoulli, | ||
| m_in2::Bernoulli | ||
| ) = begin | ||
| pin1, pin2, pout = mean(m_in1), mean(m_in2), mean(m_out) | ||
| return Contingency([(1-pin1)*pout*(1-pin2) (1-pin1)*pin2*pout; pin1*(1-pin2)*(1-pout) pin1*pin2*pout]) | ||
| end |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,8 @@ | ||
| @rule typeof(IMPL)(:out, Marginalisation) ( | ||
| m_in1::Bernoulli, | ||
| m_in2::Bernoulli | ||
| ) = begin | ||
| pin1, pin2 = mean(m_in1), mean(m_in2) | ||
|
|
||
| return Bernoulli(1 - pin1 + pin1 * pin2) | ||
| end |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,3 @@ | ||
| export rule | ||
|
|
||
| @rule NOT(:in1, Marginalisation) (m_out::Bernoulli,) = Bernoulli(1 - mean(m_out)) |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,7 @@ | ||
| @marginalrule NOT(:in1) ( | ||
| m_out::Bernoulli, | ||
| m_in1::Bernoulli | ||
| ) = begin | ||
| pin, pout = mean(m_in1), mean(m_out) | ||
| return Bernoulli(pin * (1 - pout) / (pin * (1 - pout) + pout * (1 - pin))) | ||
| end |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,3 @@ | ||
| export rule | ||
|
|
||
| @rule NOT(:out, Marginalisation) (m_in1::Bernoulli,) = Bernoulli(1 - mean(m_in1)) |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,7 @@ | ||
| @rule OR(:in1, Marginalisation) ( | ||
| m_out::Bernoulli, | ||
| m_in2::Bernoulli | ||
| ) = begin | ||
| pin2, pout = mean(m_in2), mean(m_out) | ||
| return Bernoulli(pout / (1 - pin2 + 2 * pin2 * pout)) | ||
| end |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,3 @@ | ||
| @rule OR(:in2, Marginalisation) (m_out::Bernoulli, m_in1::Bernoulli) = begin | ||
| return @call_rule typeof(OR)(:in1, Marginalisation) (m_out = m_out, m_in2 = m_in1, meta = meta) | ||
| end |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,8 @@ | ||
| @marginalrule OR(:in1_in2) ( | ||
| m_out::Bernoulli, | ||
| m_in1::Bernoulli, | ||
| m_in2::Bernoulli | ||
| ) = begin | ||
| pin1, pin2, pout = mean(m_in1), mean(m_in2), mean(m_out) | ||
| return Contingency([(1-pin1)*(1-pin2)*(1-pout) (1-pin1)*pin2*pout; pin1*(1-pin2)*pout pin1*pin2*pout]) | ||
| end |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,8 @@ | ||
| @rule OR(:out, Marginalisation) ( | ||
| m_in1::Bernoulli, | ||
| m_in2::Bernoulli | ||
| ) = begin | ||
| pin1, pin2 = mean(m_in1), mean(m_in2) | ||
|
|
||
| return Bernoulli(pin1 + pin2 - pin1 * pin2) | ||
bartvanerp marked this conversation as resolved.
Show resolved
Hide resolved
|
||
| end | ||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,20 @@ | ||
| module OrNodeTest | ||
|
|
||
| using Test | ||
| using ReactiveMP | ||
| using Random | ||
| import ReactiveMP: @test_rules | ||
|
|
||
| @testset "AndNode" begin | ||
| @testset "Creation" begin | ||
| node = make_node(AND) | ||
|
|
||
| @test functionalform(node) === AND | ||
| @test sdtype(node) === Deterministic() | ||
| @test name.(interfaces(node)) === (:out, :in1, :in2) | ||
| @test factorisation(node) === ((1, 2, 3),) | ||
| @test localmarginalnames(node) === (:out_in1_in2,) | ||
| @test metadata(node) === nothing | ||
| end | ||
| end | ||
| end |
| Original file line number | Diff line number | Diff line change | ||||
|---|---|---|---|---|---|---|
| @@ -0,0 +1,20 @@ | ||||||
| module OrNodeTest | ||||||
|
||||||
| module OrNodeTest | |
| module ImplicationNodeTest |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,19 @@ | ||
| module NotNodeTest | ||
|
|
||
| using Test | ||
| using ReactiveMP | ||
| using Random | ||
| import ReactiveMP: @test_rules | ||
|
|
||
| @testset "NotNode" begin | ||
| @testset "Creation" begin | ||
| node = make_node(NOT) | ||
|
|
||
| @test functionalform(node) === NOT | ||
| @test sdtype(node) === Deterministic() | ||
| @test name.(interfaces(node)) === (:out, :in) | ||
| @test factorisation(node) === ((1, 2),) | ||
| @test metadata(node) === nothing | ||
| end | ||
| end | ||
| end |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,20 @@ | ||
| module OrNodeTest | ||
|
|
||
| using Test | ||
| using ReactiveMP | ||
| using Random | ||
| import ReactiveMP: @test_rules | ||
|
|
||
| @testset "OrNode" begin | ||
| @testset "Creation" begin | ||
| node = make_node(OR) | ||
|
|
||
| @test functionalform(node) === OR | ||
| @test sdtype(node) === Deterministic() | ||
| @test name.(interfaces(node)) === (:out, :in1, :in2) | ||
| @test factorisation(node) === ((1, 2, 3),) | ||
| @test localmarginalnames(node) === (:out_in1_in2,) | ||
| @test metadata(node) === nothing | ||
| end | ||
| end | ||
| end |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,22 @@ | ||
| module RulesANDIn1Test | ||
|
|
||
| using Test | ||
| using ReactiveMP | ||
| using Random | ||
| import ReactiveMP: @test_rules | ||
|
|
||
| @testset "rules:AND:in1" begin | ||
| @testset "Belief Propagation: (m_out::Bernoulli, m_in2::Bernoulli)" begin | ||
| @test_rules [with_float_conversions = true] AND(:in1, Marginalisation) [ | ||
| ( | ||
| input = (m_out = Bernoulli(0.6), m_in2 = Bernoulli(0.5)), | ||
| output = Bernoulli(0.5 / 0.9) | ||
| ), | ||
| ( | ||
| input = (m_out = Bernoulli(0.3), m_in2 = Bernoulli(0.4)), | ||
| output = Bernoulli(0.54 / 1.24) | ||
| ) | ||
| ] | ||
| end | ||
| end | ||
| end |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,22 @@ | ||
| module RulesANDIn2Test | ||
|
|
||
| using Test | ||
| using ReactiveMP | ||
| using Random | ||
| import ReactiveMP: @test_rules | ||
|
|
||
| @testset "rules:AND:in2" begin | ||
| @testset "Belief Propagation: (m_out::Bernoulli, m_in1::Bernoulli)" begin | ||
| @test_rules [with_float_conversions = true] AND(:in2, Marginalisation) [ | ||
| ( | ||
| input = (m_out = Bernoulli(0.6), m_in1 = Bernoulli(0.5)), | ||
| output = Bernoulli(0.5 / 0.9) | ||
| ), | ||
| ( | ||
| input = (m_out = Bernoulli(0.3), m_in1 = Bernoulli(0.4)), | ||
| output = Bernoulli(0.54 / 1.24) | ||
| ) | ||
| ] | ||
| end | ||
| end | ||
| end |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,32 @@ | ||
| module RulesANDMarginalsTest | ||
|
|
||
| using Test | ||
| using ReactiveMP | ||
| using Random | ||
| import ReactiveMP: @test_rules, @test_marginalrules | ||
|
|
||
| @testset "rules:AND:marginals" begin | ||
| @testset ":in1_in2 (m_out::Bernoulli, m_in1::Bernoulli, m_in2::Bernoulli)" begin | ||
| @test_marginalrules [with_float_conversions = false] AND(:in1_in2) [ | ||
| ( | ||
| input = ( | ||
| m_out = Bernoulli(0.5), | ||
| m_in1 = Bernoulli(0.5), | ||
| m_in2 = Bernoulli(0.5) | ||
| ), | ||
| output = (Contingency([0.5^3 0.5^3; 0.5^3 0.5^3]) | ||
| ) | ||
| ), | ||
| ( | ||
| input = ( | ||
| m_out = Bernoulli(0.2), | ||
| m_in1 = Bernoulli(0.8), | ||
| m_in2 = Bernoulli(0.4) | ||
| ), | ||
| output = (Contingency([0.2*0.8*0.6 0.2*0.8*0.4; 0.8*0.8*0.6 0.2*0.8*0.4]) | ||
| ) | ||
| ) | ||
| ] | ||
| end | ||
| end | ||
| end |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,22 @@ | ||
| module RulesANDOutTest | ||
|
|
||
| using Test | ||
| using ReactiveMP | ||
| using Random | ||
| import ReactiveMP: @test_rules | ||
|
|
||
| @testset "rules:AND:out" begin | ||
| @testset "Belief Propagation: (m_in1::Bernoulli, m_in2::Bernoulli)" begin | ||
| @test_rules [with_float_conversions = true] AND(:out, Marginalisation) [ | ||
| ( | ||
| input = (m_in1 = Bernoulli(0.3), m_in2 = Bernoulli(0.5)), | ||
| output = Bernoulli(0.15) | ||
| ), | ||
| ( | ||
| input = (m_in1 = Bernoulli(0.4), m_in2 = Bernoulli(0.3)), | ||
| output = Bernoulli(0.12) | ||
| ) | ||
| ] | ||
| end | ||
| end | ||
| end |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,22 @@ | ||
| module RulesImplicationIn1Test | ||
|
|
||
| using Test | ||
| using ReactiveMP | ||
| using Random | ||
| import ReactiveMP: @test_rules | ||
|
|
||
| @testset "rules:IMPL:in1" begin | ||
| @testset "Belief Propagation: (m_out::Bernoulli, m_in2::Bernoulli)" begin | ||
| @test_rules [with_float_conversions = true] IMPL(:in1, Marginalisation) [ | ||
| ( | ||
| input = (m_out = Bernoulli(0.6), m_in2 = Bernoulli(0.5)), | ||
| output = Bernoulli(0.5 / 1.1) | ||
| ), | ||
| ( | ||
| input = (m_out = Bernoulli(0.2), m_in2 = Bernoulli(0.5)), | ||
| output = Bernoulli(0.5 / 0.7) | ||
| ) | ||
| ] | ||
| end | ||
| end | ||
| end |
Uh oh!
There was an error while loading. Please reload this page.