Skip to content
Snippets Groups Projects
Commit a90b2eda authored by Bentriou Mahmoud's avatar Bentriou Mahmoud
Browse files

Pretty print for synchronized period automaton trajectories

parent 575ef324
No related branches found
No related tags found
No related merge requests found
import Plots: plot, plot!, scatter!, Shape import Plots: plot, plot!, scatter!, hline!, Shape, text
import Plots: current, palette, display, png, close import Plots: current, palette, display, png, close
""" """
...@@ -54,15 +54,73 @@ function plot(σ::AbstractTrajectory, vars::VariableModel...; plot_transitions:: ...@@ -54,15 +54,73 @@ function plot(σ::AbstractTrajectory, vars::VariableModel...; plot_transitions::
end end
function plot!(A::LHA) function plot!(A::LHA)
if haskey(A.constants, "x1") && haskey(A.constants, "x2") && haskey(A.constants, "t1") && haskey(A.constants, "t2") if A.name in ["F property", "G property"]
x1, x2, t1, t2 = A.constants["x1"], A.constants["x2"], A.constants["t1"], A.constants["t2"] if haskey(A.constants, "x1") && haskey(A.constants, "x2") && haskey(A.constants, "t1") && haskey(A.constants, "t2")
plot!(Shape([(t1,x1), (t1,x2), (t2,x2), (t2,x1), (t1,x1)]), opacity = 0.5, label = "Region LHA") x1, x2, t1, t2 = A.constants["x1"], A.constants["x2"], A.constants["t1"], A.constants["t2"]
plot!(Shape([(t1,x1), (t1,x2), (t2,x2), (t2,x1), (t1,x1)]), opacity = 0.5, label = "Region LHA")
end
end
if A.name in ["G and F property"]
if haskey(A.constants, "x1") && haskey(A.constants, "x2") && haskey(A.constants, "t1") && haskey(A.constants, "t2")
x1, x2, t1, t2 = A.constants["x1"], A.constants["x2"], A.constants["t1"], A.constants["t2"]
plot!(Shape([(t1,x1), (t1,x2), (t2,x2), (t2,x1), (t1,x1)]), opacity = 0.5, label = "Region LHA")
end
if haskey(A.constants, "x3") && haskey(A.constants, "x4") && haskey(A.constants, "t3") && haskey(A.constants, "t4")
x3, x4, t3, t4 = A.constants["x3"], A.constants["x4"], A.constants["t3"], A.constants["t4"]
plot!(Shape([(t3,x3), (t3,x4), (t4,x4), (t4,x3), (t3,x3)]), opacity = 0.5, label = "Region LHA")
end
end
if A.name == "Period"
hline!([A.constants[:L], A.constants[:H]], label = "L, H", linestyle = :dot)
end
end
# For tests purposes
function plot_periodic_trajectory(A::LHA, σ::SynchronizedTrajectory, sym_obs::Symbol; verbose = false)
@assert (σ.m).dim_state == σ.m.dim_obs_state # Model should be entirely obserbed
@assert A.name in ["Period"]
A_new = LHA(A, (σ.m)._map_obs_var_idx)
p_sim = (σ.m).p
l_t = times(σ)
l_tr = transitions(σ)
Sn = init_state(A_new, σ[1], l_t[1])
Snplus1 = copy(Sn)
nbr_states = length_states(σ)
locations_trajectory = Vector{Location}(undef, nbr_states)
locations_trajectory[1] = Sn.loc
idx_n = [1]
values_n = [Sn[:n]]
if verbose println("Init: ") end
if verbose @show Sn end
for n in 2:nbr_states
next_state!(Snplus1, A_new, σ[n], l_t[n], l_tr[n], Sn, σ[n-1], p_sim; verbose = verbose)
copyto!(Sn, Snplus1)
locations_trajectory[n] = Sn.loc
if Sn[:n] != values_n[end]
push!(idx_n, n)
push!(values_n, Sn[:n])
end
if Snplus1.loc in A_new.locations_final
break
end
end end
if haskey(A.constants, "x3") && haskey(A.constants, "x4") && haskey(A.constants, "t3") && haskey(A.constants, "t4") p = plot(title = "Oscillatory trajectory of $(σ.m.name) model",
x3, x4, t3, t4 = A.constants["x3"], A.constants["x4"], A.constants["t3"], A.constants["t4"] background_color_legend=:transparent, dpi = 480, legend = :outertopright) #legendfontsize, legend
plot!(Shape([(t3,x3), (t3,x4), (t4,x4), (t4,x3), (t3,x3)]), opacity = 0.5, label = "Region LHA") colors_loc = Dict(:l0 => :silver, :l0prime => :silver, :final => :black,
:low => :skyblue2, :mid => :orange, :high => :red)
loc_to_color(loc::Symbol) = colors_loc[loc]
for loc in A.locations
idx_locations = findall(x->x==loc, locations_trajectory)
label_state = (loc in [:low, :mid, :high]) ? "State $sym_obs ($loc loc)" : ""
scatter!(p, times(σ)[idx_locations], σ[sym_obs][idx_locations], color = colors_loc[loc],
markersize = 1.0, markershape = :cross,
label = label_state)
end end
annot_n = [(times(σ)[idx_n[i]], σ[sym_obs][idx_n[i]] - 10, text("n = $(values_n[i])", 6, :bottom)) for i = eachindex(idx_n)]
scatter!(p, times(σ)[idx_n], σ[sym_obs][idx_n], annotations = annot_n,
markershape = :utriangle, markersize = 3, label = "n")
hline!(p, [A.constants[:L], A.constants[:H]], label = "L, H", color = :grey; linestyle = :dot)
end end
export plot, plot! export plot, plot!, plot_periodic_trajectory
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment