diff --git a/docs/.DS_Store b/docs/.DS_Store new file mode 100644 index 0000000..4e59802 Binary files /dev/null and b/docs/.DS_Store differ diff --git a/src/GaussianEP.jl b/src/GaussianEP.jl old mode 100644 new mode 100755 diff --git a/src/ProgressReporter.jl b/src/ProgressReporter.jl old mode 100644 new mode 100755 diff --git a/src/Term.jl b/src/Term.jl old mode 100644 new mode 100755 diff --git a/src/expectation_propagation.jl b/src/expectation_propagation.jl old mode 100644 new mode 100755 index d0efa4e..1fa3063 --- a/src/expectation_propagation.jl +++ b/src/expectation_propagation.jl @@ -153,7 +153,7 @@ function expectation_propagation(H::AbstractVector{Term{T}}, P0::AbstractVector{ for i in 1:length(H) updateβ(H[i], av[1:Nx]) end - ret = callback(av,Δav,epsconv,maxiter,H,P0) + ret = callback(iter,state,Δav,Δva,epsconv,maxiter,H,P0) if ret === true || (Δav < epsconv && norm(F*av[1:Nx]+d-av[Nx+1:end]) < 1e-4) return EPOut(state, :converged) end diff --git a/src/priors.jl b/src/priors.jl old mode 100644 new mode 100755 index 83d35cf..1d7ad2c --- a/src/priors.jl +++ b/src/priors.jl @@ -298,3 +298,34 @@ function moments(::ThetaPrior,μ,σ) return av,var end +""" +A mixture of theta priors: p_0(x)=η*Θ(x)+(1-η)*Θ(-x) +""" +mutable struct ThetaMixturePrior{T<:Real} <: Prior + η::T + δη::T +end + +function theta_mixt_factor(x,η) + f=exp(-0.5*x^2.0)/(η*erfc(-sqrt(0.5)*x)+(1.0-η)*erfc(sqrt(0.5)*x)) + return f +end + +function moments(p0::ThetaMixturePrior,μ,σ) + η=p0.η + α=μ/σ + f=theta_mixt_factor(α,η) + χ=sqrt(2.0/π)*(2.0*η-1.0)*f + av=μ+σ*χ + va=σ^2.0*(1-χ^2.0)-μ*σ*χ + return av,va +end + +function gradient(p0::ThetaMixturePrior,μ,σ) + η=p0.η + x=μ/σ/sqrt(2) + num=2*erf(x) + den=η*erfc(-x)+(1-η)*erfc(x) + p0.η+=p0.δη*num/den + p0.η=clamp(p0.η,0,1) +end