using Rocket, ReactiveMP, RxInfer, LinearAlgebra, PyPlot include("scripts/cart_tracking_helpers.jl") # Specify the model parameters Δt = 1.0 # assume the time steps to be equal in size A = [1.0 Δt; 0.0 1.0] b = [0.5*Δt^2; Δt] Σz = convert(Matrix,Diagonal([0.2*Δt; 0.1*Δt])) # process noise covariance Σx = convert(Matrix,Diagonal([1.0; 2.0])) # observation noise covariance; # Generate noisy observations n = 10 # perform 10 timesteps z_start = [10.0; 2.0] # initial state u = 0.2 * ones(n) # constant input u noisy_x = generateNoisyMeasurements(z_start, u, A, b, Σz, Σx); m_z = noisy_x[1] # initial predictive mean V_z = A * (1e8*Diagonal(I,2) * A') + Σz # initial predictive covariance for t = 2:n global m_z, V_z, m_pred_z, V_pred_z #predict m_pred_z = A * m_z + b * u[t] # predictive mean V_pred_z = A * V_z * A' + Σz # predictive covariance #update gain = V_pred_z * inv(V_pred_z + Σx) # Kalman gain m_z = m_pred_z + gain * (noisy_x[t] - m_pred_z) # posterior mean update V_z = (Diagonal(I,2)-gain)*V_pred_z # posterior covariance update end println("Prediction: ",MvNormalMeanCovariance(m_pred_z,V_pred_z)) println("Measurement: ", MvNormalMeanCovariance(noisy_x[n],Σx)) println("Posterior: ", MvNormalMeanCovariance(m_z,V_z)) plotCartPrediction(m_pred_z[1], V_pred_z[1], m_z[1], V_z[1], noisy_x[n][1], Σx[1][1]); @model function cart_tracking(n, A, b, Σz, Σx, z_prev_m_0, z_prev_v_0, u) # We create constvar references for better efficiency cA = constvar(A) cB = constvar(b) cΣz = constvar(Σz) cΣx = constvar(Σx) znodes = Vector{Any}(undef, n) # `z` is a sequence of hidden states z = randomvar(n) # `x` is a sequence of "clamped" observations x = datavar(Vector{Float64}, n) z_prior ~ MvNormalMeanCovariance(z_prev_m_0, z_prev_v_0) z_prev = z_prior for i in 1:n znodes[i],z[i] ~ MvNormalMeanCovariance(cA * z_prev + cB*u[i], cΣz) x[i] ~ MvNormalMeanCovariance(z[i], cΣx) z_prev = z[i] end return z, x, znodes end z_prev_m_0 = noisy_x[1] z_prev_v_0 = A * (1e8*Diagonal(I,2) * A') + Σz ; result = inference(model=cart_tracking(n, A,b, Σz, Σx, z_prev_m_0, z_prev_v_0,u), data=(x=noisy_x,), free_energy=true); μz_posterior, Σz_posterior = mean.(result.posteriors[:z])[end], cov.(result.posteriors[:z])[end]; prediction_z_1 = ReactiveMP.messageout(ReactiveMP.getinterface(result.returnval[end][end], :out)) prediction = ReactiveMP.materialize!(Rocket.getrecent(prediction_z_1)); println("Prediction: ",MvNormalMeanCovariance(mean(prediction), cov(prediction))) println("Measurement: ", MvNormalMeanCovariance(noisy_x[n], Σx)) println("Posterior: ", MvNormalMeanCovariance(μz_posterior, Σz_posterior)) plotCartPrediction(mean(prediction)[1], cov(prediction)[1], μz_posterior[1], Σz_posterior[1], noisy_x[n][1], Σx[1][1]); open("../../styles/aipstyle.html") do f display("text/html", read(f, String)) end