From b310e3aebb018f11c8bab3d250762bc363ab2ca7 Mon Sep 17 00:00:00 2001 From: Albert Podusenko Date: Tue, 24 Jan 2023 16:11:50 +0100 Subject: [PATCH 01/24] Modify inference for predictions functionality --- src/inference.jl | 75 ++++++++++++++++++++++++++++++++++++------------ src/model.jl | 2 ++ 2 files changed, 58 insertions(+), 19 deletions(-) diff --git a/src/inference.jl b/src/inference.jl index 167f7bbad..ee533772e 100644 --- a/src/inference.jl +++ b/src/inference.jl @@ -12,6 +12,9 @@ import ReactiveMP: CountingReal import ProgressMeter +obtain_prediction(variable::AbstractVariable) = getprediction(variable) +obtain_prediction(variables::AbstractArray{<:AbstractVariable}) = getpredictions(variables) + obtain_marginal(variable::AbstractVariable, strategy = SkipInitial()) = getmarginal(variable, strategy) obtain_marginal(variables::AbstractArray{<:AbstractVariable}, strategy = SkipInitial()) = getmarginals(variables, strategy) @@ -24,19 +27,19 @@ assign_message!(variable::AbstractVariable, message) = setmes struct KeepEach end struct KeepLast end -make_actor(::RandomVariable, ::KeepEach) = keep(Marginal) -make_actor(::Array{<:RandomVariable, N}, ::KeepEach) where {N} = keep(Array{Marginal, N}) -make_actor(x::AbstractArray{<:RandomVariable}, ::KeepEach) = keep(typeof(similar(x, Marginal))) +make_actor(::AbstractVariable, ::KeepEach) = keep(Marginal) +make_actor(::Array{<:AbstractVariable, N}, ::KeepEach) where {N} = keep(Array{Marginal, N}) +make_actor(x::AbstractArray{<:AbstractVariable}, ::KeepEach) = keep(typeof(similar(x, Marginal))) -make_actor(::RandomVariable, ::KeepEach, capacity::Integer) = circularkeep(Marginal, capacity) -make_actor(::Array{<:RandomVariable, N}, ::KeepEach, capacity::Integer) where {N} = circularkeep(Array{Marginal, N}, capacity) -make_actor(x::AbstractArray{<:RandomVariable}, ::KeepEach, capacity::Integer) = circularkeep(typeof(similar(x, Marginal)), capacity) +make_actor(::AbstractVariable, ::KeepEach, capacity::Integer) = circularkeep(Marginal, capacity) +make_actor(::Array{<:AbstractVariable, N}, ::KeepEach, capacity::Integer) where {N} = circularkeep(Array{Marginal, N}, capacity) +make_actor(x::AbstractArray{<:AbstractVariable}, ::KeepEach, capacity::Integer) = circularkeep(typeof(similar(x, Marginal)), capacity) -make_actor(::RandomVariable, ::KeepLast) = storage(Marginal) -make_actor(x::AbstractArray{<:RandomVariable}, ::KeepLast) = buffer(Marginal, size(x)) +make_actor(::AbstractVariable, ::KeepLast) = storage(Marginal) +make_actor(x::AbstractArray{<:AbstractVariable}, ::KeepLast) = buffer(Marginal, size(x)) -make_actor(::RandomVariable, ::KeepLast, capacity::Integer) = storage(Marginal) -make_actor(x::AbstractArray{<:RandomVariable}, ::KeepLast, capacity::Integer) = buffer(Marginal, size(x)) +make_actor(::AbstractVariable, ::KeepLast, capacity::Integer) = storage(Marginal) +make_actor(x::AbstractArray{<:AbstractVariable}, ::KeepLast, capacity::Integer) = buffer(Marginal, size(x)) ## Inference ensure update @@ -173,15 +176,16 @@ This structure is used as a return value from the [`inference`](@ref) function. See also: [`inference`](@ref) """ -struct InferenceResult{P, F, M, R} +struct InferenceResult{P, A, F, M, R} posteriors :: P + predictions :: A free_energy :: F model :: M returnval :: R end -Base.iterate(results::InferenceResult) = iterate((getfield(results, :posteriors), getfield(results, :free_energy), getfield(results, :model), getfield(results, :returnval))) -Base.iterate(results::InferenceResult, any) = iterate((getfield(results, :posteriors), getfield(results, :free_energy), getfield(results, :model), getfield(results, :returnval)), any) +Base.iterate(results::InferenceResult) = iterate((getfield(results, :posteriors), getfield(results, :predictions), getfield(results, :free_energy), getfield(results, :model), getfield(results, :returnval))) +Base.iterate(results::InferenceResult, any) = iterate((getfield(results, :posteriors), getfield(results, :predictions), getfield(results, :free_energy), getfield(results, :model), getfield(results, :returnval)), any) function Base.show(io::IO, result::InferenceResult) print(io, "Inference results:\n") @@ -193,6 +197,13 @@ function Base.show(io::IO, result::InferenceResult) join(io, keys(getfield(result, :posteriors)), ", ") print(io, ")\n") + if !isnothing(getfield(result, :predictions)) + print(io, rpad(" Predictions", lcolumnlen), " | ") + print(io, "available for (") + join(io, keys(getfield(result, :predictions)), ", ") + print(io, ")\n") + end + if !isnothing(getfield(result, :free_energy)) print(io, rpad(" Free Energy:", lcolumnlen), " | ") print(IOContext(io, :compact => true, :limit => true, :displaysize => (1, 80)), result.free_energy) @@ -431,6 +442,8 @@ function inference(; model::ModelGenerator, # NamedTuple or Dict with data, required data, + # NamedTuple or Dict with predictions + predictions = nothing, # optional # NamedTuple or Dict with initial marginals, optional, defaults to empty initmarginals = nothing, # NamedTuple or Dict with initial messages, optional, defaults to empty @@ -443,6 +456,8 @@ function inference(; options = nothing, # Return structure info, optional, defaults to return everything at each iteration returnvars = nothing, + # Return structure info, optional, defaults to return everything at each iteration + predictvars = nothing, # Number of iterations, defaults to 1, we do not distinguish between VMP or Loopy belief or EP iterations iterations = nothing, # Do we compute FE, optional, defaults to false @@ -462,6 +477,7 @@ function inference(; warn = true ) __inference_check_dicttype(:data, data) + __inference_check_dicttype(:predictions, predictions) __inference_check_dicttype(:initmarginals, initmarginals) __inference_check_dicttype(:initmessages, initmessages) __inference_check_dicttype(:callbacks, callbacks) @@ -508,7 +524,13 @@ function inference(; returnvars = Dict(variable => returnoption for (variable, value) in pairs(vardict) if (israndom(value) && !isanonymous(value))) end + # Check if `predictvars` is nothing but `data` has missing values + if predictvars === nothing + predictvars = Dict(variable => KeepLast() for (variable, value) in pairs(vardict) if (isdata(value) && !isempty(findall(ismissing, data[variable])) && !isanonymous(value))) + end + __inference_check_dicttype(:returnvars, returnvars) + __inference_check_dicttype(:predictvars, predictvars) # Use `__check_has_randomvar` to filter out unknown or non-random variables in the `returnvar` specification __check_has_randomvar(vardict, variable) = begin @@ -522,11 +544,24 @@ function inference(; return haskey_check && israndom_check end + __check_has_prediction(vardict, variable) = begin + haskey_check = haskey(vardict, variable) + isdata_check = haskey_check ? isdata(vardict[variable]) : false + if warn && !haskey_check + @warn "`predictvars` object has `$(variable)` specification, but model has no variable named `$(variable)`. The `$(variable)` specification is ignored. Use `warn = false` to suppress this warning." + elseif warn && haskey_check && !isdata_check + @warn "`predictvars` object has `$(variable)` specification, but model has no **data** variable named `$(variable)`. The `$(variable)` specification is ignored. Use `warn = false` to suppress this warning." + end + return haskey_check && isdata_check + end + # Second, for each random variable entry we create an actor - actors = Dict(variable => make_actor(vardict[variable], value) for (variable, value) in pairs(returnvars) if __check_has_randomvar(vardict, variable)) + actors_rv = Dict(variable => make_actor(vardict[variable], value) for (variable, value) in pairs(returnvars) if __check_has_randomvar(vardict, variable)) + actors_pr = Dict(variable => make_actor(vardict[variable], value) for (variable, value) in pairs(predictvars) if __check_has_prediction(vardict, variable)) # At third, for each random variable entry we create a boolean flag to track their updates - updates = Dict(variable => MarginalHasBeenUpdated(false) for (variable, _) in pairs(actors)) + updates = Dict(variable => MarginalHasBeenUpdated(false) for (variable, _) in pairs(merge(actors_rv, actors_pr))) + # updates = Dict(variable => MarginalHasBeenUpdated(false) for (variable, _) in pairs(actors_pr)) _iterations = something(iterations, 1) _iterations isa Integer || error("`iterations` argument must be of type Integer or `nothing`") @@ -534,7 +569,8 @@ function inference(; try on_marginal_update = inference_get_callback(callbacks, :on_marginal_update) - subscriptions = Dict(variable => subscribe!(obtain_marginal(vardict[variable]) |> ensure_update(fmodel, on_marginal_update, variable, updates[variable]), actor) for (variable, actor) in pairs(actors)) + subscriptions_rv = Dict(variable => subscribe!(obtain_marginal(vardict[variable]) |> ensure_update(fmodel, on_marginal_update, variable, updates[variable]), actor) for (variable, actor) in pairs(actors_rv)) + subscriptions_pr = Dict(variable => subscribe!(obtain_prediction(vardict[variable]) |> ensure_update(fmodel, on_marginal_update, variable, updates[variable]), actor) for (variable, actor) in pairs(actors_pr)) fe_actor = nothing fe_subscription = VoidTeardown() @@ -607,7 +643,7 @@ function inference(; inference_invoke_callback(callbacks, :after_iteration, fmodel, iteration) end - for (_, subscription) in pairs(subscriptions) + for (_, subscription) in pairs(merge(subscriptions_pr, subscriptions_rv)) unsubscribe!(subscription) end @@ -617,12 +653,13 @@ function inference(; unsubscribe!(fe_subscription) - posterior_values = Dict(variable => __inference_postprocess(postprocess, getvalues(actor)) for (variable, actor) in pairs(actors)) + posterior_values = Dict(variable => __inference_postprocess(postprocess, getvalues(actor)) for (variable, actor) in pairs(actors_rv)) + predicted_values = Dict(variable => __inference_postprocess(postprocess, getvalues(actor)) for (variable, actor) in pairs(actors_pr)) fe_values = !isnothing(fe_actor) ? score_snapshot_iterations(fe_actor) : nothing inference_invoke_callback(callbacks, :after_inference, fmodel) - return InferenceResult(posterior_values, fe_values, fmodel, freturval) + return InferenceResult(posterior_values, predicted_values, fe_values, fmodel, freturval) catch error __inference_process_error(error) end diff --git a/src/model.jl b/src/model.jl index 409be054b..5d94f1464 100644 --- a/src/model.jl +++ b/src/model.jl @@ -180,7 +180,9 @@ function ReactiveMP.activate!(model::FactorGraphModel) filter!(c -> isconnected(c), getconstant(model)) foreach(r -> activate!(r, options), getrandom(model)) + foreach(d -> activate!(d, options), getdata(model)) foreach(n -> activate!(n, options), getnodes(model)) + end ## constraints From abc5edbf286c87604627c0acbfe265ff3dc5edbe Mon Sep 17 00:00:00 2001 From: Albert Podusenko Date: Tue, 24 Jan 2023 17:23:19 +0100 Subject: [PATCH 02/24] Make format --- src/inference.jl | 2 +- src/model.jl | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/src/inference.jl b/src/inference.jl index 9cedb21c6..7ad574763 100644 --- a/src/inference.jl +++ b/src/inference.jl @@ -545,7 +545,7 @@ function inference(; end __check_has_prediction(vardict, variable) = begin - haskey_check = haskey(vardict, variable) + haskey_check = haskey(vardict, variable) isdata_check = haskey_check ? isdata(vardict[variable]) : false if warn && !haskey_check @warn "`predictvars` object has `$(variable)` specification, but model has no variable named `$(variable)`. The `$(variable)` specification is ignored. Use `warn = false` to suppress this warning." diff --git a/src/model.jl b/src/model.jl index 5d94f1464..1fcd0024f 100644 --- a/src/model.jl +++ b/src/model.jl @@ -182,7 +182,6 @@ function ReactiveMP.activate!(model::FactorGraphModel) foreach(r -> activate!(r, options), getrandom(model)) foreach(d -> activate!(d, options), getdata(model)) foreach(n -> activate!(n, options), getnodes(model)) - end ## constraints From b67474ca99e3cd48282f1dd5455b2d26b7885540 Mon Sep 17 00:00:00 2001 From: Albert Podusenko Date: Mon, 30 Jan 2023 15:29:04 +0100 Subject: [PATCH 03/24] WIP: update inference function --- src/inference.jl | 42 ++++++++++++++++++++++++++++++------------ 1 file changed, 30 insertions(+), 12 deletions(-) diff --git a/src/inference.jl b/src/inference.jl index 7ad574763..ee38cb7a7 100644 --- a/src/inference.jl +++ b/src/inference.jl @@ -133,6 +133,8 @@ function __inference_check_dicttype(keyword::Symbol, ::T) where {T} """) end +__inference_check_dataismissing(d) = (ismissing(d) || !isempty(findall(ismissing, d))) + ## Inference results postprocessing # TODO: Make this function a part of the public API? @@ -197,7 +199,7 @@ function Base.show(io::IO, result::InferenceResult) join(io, keys(getfield(result, :posteriors)), ", ") print(io, ")\n") - if !isnothing(getfield(result, :predictions)) + if !isempty(getfield(result, :predictions)) print(io, rpad(" Predictions", lcolumnlen), " | ") print(io, "available for (") join(io, keys(getfield(result, :predictions)), ", ") @@ -440,10 +442,8 @@ See also: [`InferenceResult`](@ref), [`rxinference`](@ref) function inference(; # `model`: specifies a model generator, with the help of the `Model` function model::ModelGenerator, - # NamedTuple or Dict with data, required - data, - # NamedTuple or Dict with predictions - predictions = nothing, # optional + # NamedTuple or Dict with data, optional if predictvars are specified + data = nothing, # NamedTuple or Dict with initial marginals, optional, defaults to empty initmarginals = nothing, # NamedTuple or Dict with initial messages, optional, defaults to empty @@ -476,8 +476,9 @@ function inference(; # warn, optional, defaults to true warn = true ) - __inference_check_dicttype(:data, data) - __inference_check_dicttype(:predictions, predictions) + if isnothing(data) && isnothing(predictvars) + error("""One of keyword arguments `data` or predictvars must be specified""") + end __inference_check_dicttype(:initmarginals, initmarginals) __inference_check_dicttype(:initmessages, initmessages) __inference_check_dicttype(:callbacks, callbacks) @@ -523,10 +524,28 @@ function inference(; returnoption = something(returnvars, iterations isa Number ? KeepEach() : KeepLast()) returnvars = Dict(variable => returnoption for (variable, value) in pairs(vardict) if (israndom(value) && !isanonymous(value))) end - + + # Assuming that the prediction variables are specified as datavars inside @model, e.g. pred = datavar(Float64, n) # Check if `predictvars` is nothing but `data` has missing values if predictvars === nothing - predictvars = Dict(variable => KeepLast() for (variable, value) in pairs(vardict) if (isdata(value) && !isempty(findall(ismissing, data[variable])) && !isanonymous(value))) + predictvars = Dict(variable => KeepLast() for (variable, value) in pairs(vardict) if (isdata(value) && __inference_check_dataismissing(data[variable]) && !isanonymous(value))) + else # iterate through vardict and find corresponding variables in predictvars + for (variable, value) in pairs(vardict) + # this logic creates and adds predictions into the data as missings + if isdata(value) && haskey(predictvars, variable) + # TODO: how to check the size of datavar + if value isa Vector + predictions = NamedTuple{Tuple([variable])}([repeat([missing], length(value))]) + else + predictions = NamedTuple{Tuple([variable])}([missing]) + end + data = isnothing(data) ? predictions : merge(data, predictions) + end + end + # in case predictvars are empty, then the only place to look for predictions are `missings` of data + # we extract datavars keys to add them to predictvars + data_missing = Dict(variable => KeepLast() for (variable, value) in pairs(vardict) if (isdata(value) && haskey(data, variable) && __inference_check_dataismissing(data[variable]) && !isanonymous(value))) + predictvars = merge(predictvars, data_missing) end __inference_check_dicttype(:returnvars, returnvars) @@ -555,13 +574,12 @@ function inference(; return haskey_check && isdata_check end - # Second, for each random variable entry we create an actor + # Second, for each random variable and predicting variable entry we create an actor actors_rv = Dict(variable => make_actor(vardict[variable], value) for (variable, value) in pairs(returnvars) if __check_has_randomvar(vardict, variable)) actors_pr = Dict(variable => make_actor(vardict[variable], value) for (variable, value) in pairs(predictvars) if __check_has_prediction(vardict, variable)) - # At third, for each random variable entry we create a boolean flag to track their updates + # At third, for each variable entry we create a boolean flag to track their updates updates = Dict(variable => MarginalHasBeenUpdated(false) for (variable, _) in pairs(merge(actors_rv, actors_pr))) - # updates = Dict(variable => MarginalHasBeenUpdated(false) for (variable, _) in pairs(actors_pr)) _iterations = something(iterations, 1) _iterations isa Integer || error("`iterations` argument must be of type Integer or `nothing`") From 5fe1ac680fcad8ffb00cb8f6ad1e580ad23f8139 Mon Sep 17 00:00:00 2001 From: Albert Podusenko Date: Mon, 30 Jan 2023 15:32:03 +0100 Subject: [PATCH 04/24] Make format --- src/inference.jl | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/src/inference.jl b/src/inference.jl index ee38cb7a7..ae538d290 100644 --- a/src/inference.jl +++ b/src/inference.jl @@ -476,9 +476,9 @@ function inference(; # warn, optional, defaults to true warn = true ) - if isnothing(data) && isnothing(predictvars) + if isnothing(data) && isnothing(predictvars) error("""One of keyword arguments `data` or predictvars must be specified""") - end + end __inference_check_dicttype(:initmarginals, initmarginals) __inference_check_dicttype(:initmessages, initmessages) __inference_check_dicttype(:callbacks, callbacks) @@ -524,11 +524,13 @@ function inference(; returnoption = something(returnvars, iterations isa Number ? KeepEach() : KeepLast()) returnvars = Dict(variable => returnoption for (variable, value) in pairs(vardict) if (israndom(value) && !isanonymous(value))) end - + # Assuming that the prediction variables are specified as datavars inside @model, e.g. pred = datavar(Float64, n) # Check if `predictvars` is nothing but `data` has missing values if predictvars === nothing - predictvars = Dict(variable => KeepLast() for (variable, value) in pairs(vardict) if (isdata(value) && __inference_check_dataismissing(data[variable]) && !isanonymous(value))) + predictvars = Dict( + variable => KeepLast() for (variable, value) in pairs(vardict) if (isdata(value) && __inference_check_dataismissing(data[variable]) && !isanonymous(value)) + ) else # iterate through vardict and find corresponding variables in predictvars for (variable, value) in pairs(vardict) # this logic creates and adds predictions into the data as missings @@ -544,7 +546,10 @@ function inference(; end # in case predictvars are empty, then the only place to look for predictions are `missings` of data # we extract datavars keys to add them to predictvars - data_missing = Dict(variable => KeepLast() for (variable, value) in pairs(vardict) if (isdata(value) && haskey(data, variable) && __inference_check_dataismissing(data[variable]) && !isanonymous(value))) + data_missing = Dict( + variable => KeepLast() for + (variable, value) in pairs(vardict) if (isdata(value) && haskey(data, variable) && __inference_check_dataismissing(data[variable]) && !isanonymous(value)) + ) predictvars = merge(predictvars, data_missing) end From 1c9eb9b09060372badffd0debf41023bd008df09 Mon Sep 17 00:00:00 2001 From: Albert Podusenko Date: Mon, 30 Jan 2023 18:13:52 +0100 Subject: [PATCH 05/24] WIP: Change inference --- src/inference.jl | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/src/inference.jl b/src/inference.jl index ae538d290..03233ccd3 100644 --- a/src/inference.jl +++ b/src/inference.jl @@ -135,6 +135,10 @@ end __inference_check_dataismissing(d) = (ismissing(d) || !isempty(findall(ismissing, d))) +# Return NamedTuple for predictions +__inference_fill_predictions(s::Symbol, d::AbstractArray) = NamedTuple{Tuple([s])}([repeat([missing], length(d))]) +__inference_fill_predictions(s::Symbol, d::DataVariable) = NamedTuple{Tuple([s])}([missing]) + ## Inference results postprocessing # TODO: Make this function a part of the public API? @@ -535,12 +539,7 @@ function inference(; for (variable, value) in pairs(vardict) # this logic creates and adds predictions into the data as missings if isdata(value) && haskey(predictvars, variable) - # TODO: how to check the size of datavar - if value isa Vector - predictions = NamedTuple{Tuple([variable])}([repeat([missing], length(value))]) - else - predictions = NamedTuple{Tuple([variable])}([missing]) - end + predictions = __inference_fill_predictions(variable, value) data = isnothing(data) ? predictions : merge(data, predictions) end end @@ -552,7 +551,7 @@ function inference(; ) predictvars = merge(predictvars, data_missing) end - + @show data __inference_check_dicttype(:returnvars, returnvars) __inference_check_dicttype(:predictvars, predictvars) From 11077a006283aeda6a1c905e12b8d8431095a3f8 Mon Sep 17 00:00:00 2001 From: Albert Podusenko Date: Wed, 1 Feb 2023 13:08:11 +0100 Subject: [PATCH 06/24] Update inference --- src/inference.jl | 75 ++++++++++++++++++++++++++++++++++-------------- 1 file changed, 54 insertions(+), 21 deletions(-) diff --git a/src/inference.jl b/src/inference.jl index 03233ccd3..05112b70d 100644 --- a/src/inference.jl +++ b/src/inference.jl @@ -7,7 +7,7 @@ import DataStructures: CircularBuffer using MacroTools # for `@autoupdates` -import ReactiveMP: israndom, isdata, isconst, isproxy, isanonymous +import ReactiveMP: israndom, isdata, isconst, isproxy, isanonymous, allows_missings import ReactiveMP: CountingReal import ProgressMeter @@ -251,6 +251,7 @@ unwrap_free_energy_option(option::Type{T}) where {T <: Real} = (true, T, Countin meta = nothing, options = nothing, returnvars = nothing, + predictvars = nothing, iterations = nothing, free_energy = false, free_energy_diagnostics = BetheFreeEnergyDefaultChecks, @@ -274,6 +275,7 @@ For more information about some of the arguments, please check below. - `meta = nothing`: meta specification object, optional, may be required for some models, see `@meta` - `options = nothing`: model creation options, optional, see `ModelInferenceOptions` - `returnvars = nothing`: return structure info, optional, defaults to return everything at each iteration, see below for more information +- `predictvars = nothing`: return structure info, optional, see below for more information - `iterations = nothing`: number of iterations, optional, defaults to `nothing`, the inference engine does not distinguish between variational message passing or Loopy belief propagation or expectation propagation iterations, see below for more information - `free_energy = false`: compute the Bethe free energy, optional, defaults to false. Can be passed a floating point type, e.g. `Float64`, for better efficiency, but disables automatic differentiation packages, such as ForwardDiff.jl - `free_energy_diagnostics = BetheFreeEnergyDefaultChecks`: free energy diagnostic checks, optional, by default checks for possible `NaN`s and `Inf`s. `nothing` disables all checks. @@ -385,6 +387,27 @@ result = inference( ) ``` +- ### `predictvars` + +`predictvars` specifies the variables which should be predicted. In the model definition these variables are specified +as datavars, although they should not be passed inside data argument. + +Similar to `returnvars`, `predictvars` accepts a `NamedTuple` or `Dict`. There are two specifications: +- `KeepLast`: saves the last update for a variable, ignoring any intermediate results during iterations +- `KeepEach`: saves all updates for a variable for all iterations + +Example: + +```julia +result = inference( + ..., + predictvars = ( + o = KeepLast(), + τ = KeepEach() + ) +) +``` + - ### `iterations` Specifies the number of variational (or loopy belief propagation) iterations. By default set to `nothing`, which is equivalent of doing 1 iteration. @@ -481,7 +504,7 @@ function inference(; warn = true ) if isnothing(data) && isnothing(predictvars) - error("""One of keyword arguments `data` or predictvars must be specified""") + error("""One of keyword arguments `data` or `predictvars`` must be specified""") end __inference_check_dicttype(:initmarginals, initmarginals) __inference_check_dicttype(:initmessages, initmessages) @@ -529,29 +552,36 @@ function inference(; returnvars = Dict(variable => returnoption for (variable, value) in pairs(vardict) if (israndom(value) && !isanonymous(value))) end - # Assuming that the prediction variables are specified as datavars inside @model, e.g. pred = datavar(Float64, n) - # Check if `predictvars` is nothing but `data` has missing values - if predictvars === nothing - predictvars = Dict( - variable => KeepLast() for (variable, value) in pairs(vardict) if (isdata(value) && __inference_check_dataismissing(data[variable]) && !isanonymous(value)) - ) - else # iterate through vardict and find corresponding variables in predictvars + # Assume that the prediction variables are specified as `datavars` inside the `@model` block, e.g. `pred = datavar(Float64, n)`. + # Verify that `predictvars` is not `nothing` and that `data` does not have any missing values. + if !isnothing(predictvars) for (variable, value) in pairs(vardict) - # this logic creates and adds predictions into the data as missings - if isdata(value) && haskey(predictvars, variable) - predictions = __inference_fill_predictions(variable, value) - data = isnothing(data) ? predictions : merge(data, predictions) + if !isnothing(data) && haskey(predictvars, variable) && haskey(data, variable) + @warn "$(variable) is present in both `data` and `predictvars`. The values in `data` will be ignored." + end + # The following logic creates and adds predictions to the data as missing values. + if isdata(value) && haskey(predictvars, variable) # Verify that the value is of a specified data type and is included in `predictvars`. + if allows_missings(value) # Allow missing values, otherwise raise an error. + predictions = __inference_fill_predictions(variable, value) + data = isnothing(data) ? predictions : merge(data, predictions) + else + error("`predictvars` does not allow missing values for $(variable). Please add the following line: `$(variable) ~ datavar{...} where {allow_missing = true }`") + end + elseif isdata(value) && haskey(data, variable) && __inference_check_dataismissing(data[variable]) # The variable may be of a specified data type and contain missing values. + if allows_missings(value) + predictvars = merge(predictvars, Dict(variable => KeepLast())) + else + error("datavar $(variable) has missings inside but does not allow it. Add `where {allow_missing = true }`") + end end end - # in case predictvars are empty, then the only place to look for predictions are `missings` of data - # we extract datavars keys to add them to predictvars - data_missing = Dict( - variable => KeepLast() for - (variable, value) in pairs(vardict) if (isdata(value) && haskey(data, variable) && __inference_check_dataismissing(data[variable]) && !isanonymous(value)) + else # In this case, the prediction functionality should only be performed if the data allows missings and actually contains missing values. + predictvars = Dict( + variable => KeepLast() for (variable, value) in pairs(vardict) if + (isdata(value) && haskey(data, variable) && allows_missings(value) && __inference_check_dataismissing(data[variable]) && !isanonymous(value)) ) - predictvars = merge(predictvars, data_missing) end - @show data + __inference_check_dicttype(:returnvars, returnvars) __inference_check_dicttype(:predictvars, predictvars) @@ -567,6 +597,7 @@ function inference(; return haskey_check && israndom_check end + # Use `__check_has_prediction` to filter out unknown predictions variables in the `predictvar` specification __check_has_prediction(vardict, variable) = begin haskey_check = haskey(vardict, variable) isdata_check = haskey_check ? isdata(vardict[variable]) : false @@ -630,7 +661,9 @@ function inference(; else foreach(filter(pair -> isdata(last(pair)), pairs(vardict))) do pair varname = first(pair) - haskey(data, varname) || error("Data entry `$(varname)` is missing in `data` argument. Double check `data = ($(varname) = ???, )`") + haskey(data, varname) || error( + "Data entry `$(varname)` is missing in `data` or `predictvars` arguments. Double check `data = ($(varname) = ???, )` or `predictvars = ($(varname) = ???, )`" + ) end end From 39c91ceb485db396a45784d57c15d3729f71c29c Mon Sep 17 00:00:00 2001 From: Albert Podusenko Date: Mon, 6 Feb 2023 15:00:13 +0100 Subject: [PATCH 07/24] Add tests --- test/test_inference.jl | 171 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 171 insertions(+) diff --git a/test/test_inference.jl b/test/test_inference.jl index 2465aa1b5..edf68e3cc 100644 --- a/test/test_inference.jl +++ b/test/test_inference.jl @@ -552,4 +552,175 @@ end end end +@testset "Predictions functionality" begin + + # Given the current implementation of RxInfer ecosystem, this rule needs to be predifined + @rule NormalMeanPrecision(:μ, Marginalisation) (m_out::PointMass, q_τ::PointMass) = begin + return missing + end + + # test #1 (array with missing + predictvars) + data = (y = [1.0, -500.0, missing, 100.0],) + + # A simple model for testing that resembles a simple kalman smoother with + # random walk state transition + @model function model_1(n) + x = randomvar(n + 2) + o = datavar(Float64, 2) where {allow_missing = true} + y = datavar(Float64, n) where {allow_missing = true} + + x_0 ~ NormalMeanPrecision(0.0, 1.0) + + z = x_0 + for i in 1:n + x[i] ~ NormalMeanPrecision(z, 1.0) + y[i] ~ NormalMeanPrecision(x[i], 1.0) + z = x[i] + end + x[n + 1] ~ NormalMeanPrecision(z, 1.0) + o[1] ~ NormalMeanPrecision(x[n + 1], 1.0) + z = x[n + 1] + x[n + 2] ~ NormalMeanPrecision(x[n + 1], 1.0) + o[2] ~ NormalMeanPrecision(x[n + 2], 1.0) + end + + result = inference(model = model_1(length(data[:y])), iterations = 10, data = data, predictvars = (o = KeepLast(),)) + + @test all(typeof.(result.predictions[:o]) .<: NormalDistributionsFamily) + @test typeof(result.predictions[:y][3]) <: NormalDistributionsFamily + + # test #2 (array with missing + single entry for predictvars) + data = (y = [1.0, -10.0, 0.9, missing, missing],) + + @model function model_2(n) + x = randomvar(n + 1) + o = datavar(Float64) where {allow_missing = true} + y = datavar(Float64, n) where {allow_missing = true} + + z ~ NormalMeanPrecision(0.0, 100.0) + + for i in 1:n + x[i] ~ NormalMeanPrecision(z, 1.0) + y[i] ~ NormalMeanPrecision(x[i], 1.0) + end + x[n + 1] ~ NormalMeanPrecision(x[n], 1.0) + o ~ NormalMeanPrecision(x[n + 1], 1.0) + end + + result = inference(model = model_2(length(data[:y])), iterations = 10, data = data, predictvars = (o = KeepEach(),)) + + # note we used KeepEach for variable o with BP algorithm (10 iterations), we expect all predicted variables to be equal + @test all(y -> y == result.predictions[:o][1], result.predictions[:o]) + @test all(typeof.(result.predictions[:y]) .<: NormalDistributionsFamily) + + # test #3 (array + single entry for predictvars) + data = (y = [1.0, -10.0, 0.9],) + @model function model_3(n) + x = randomvar(n + 1) + o = datavar(Float64) where {allow_missing = true} + y = datavar(Float64, n) where {allow_missing = true} + + z ~ NormalMeanPrecision(0.0, 100.0) + + for i in 1:n + x[i] ~ NormalMeanPrecision(z, 1.0) + y[i] ~ NormalMeanPrecision(x[i], 1.0) + end + x[n + 1] ~ NormalMeanPrecision(x[n], 1.0) + o ~ NormalMeanPrecision(x[n + 1], 1.0) + end + + result = inference(model = model_3(length(data[:y])), iterations = 10, data = data, predictvars = (o = KeepLast(),)) + + @test !haskey(result.predictions, :y) + @test haskey(result.predictions, :o) + + # test #4 (array of missing + no predictvars) + data = (y = [1.0, 2.0, missing],) + @model function model_4(n) + x = randomvar(n) + y = datavar(Float64, n) where {allow_missing = true} + + z ~ NormalMeanPrecision(3, 100.0) + + for i in 1:n + x[i] ~ NormalMeanPrecision(z, 1.0) + y[i] ~ NormalMeanPrecision(x[i], 1.0) + end + end + + result = inference(model = model_4(length(data[:y])), iterations = 10, data = data) + + @test all(typeof.(result.predictions[:y]) .<: NormalDistributionsFamily) + + # test #5 (single prediction, no data provided) + @model function model_5() + o = datavar(Float64) where {allow_missing = true} + + z ~ NormalMeanPrecision(0, 1.0) + x ~ NormalMeanPrecision(z, 1.0) + o ~ NormalMeanPrecision(x, 10.0) + end + + result = inference(model = model_5(), iterations = 1, predictvars = (o = KeepLast(),)) + + @test haskey(result.predictions, :o) + + # test #6 (single datavar missing) + @model function model_6() + y = datavar(Float64) where {allow_missing = true} + x_0 = datavar(Float64) + + x ~ Normal(mean = x_0, var = 1.0) + a ~ Normal(mean = x, var = 1.0) + b ~ Normal(mean = a, var = 1.0) + c ~ Normal(mean = a, var = 1.0) + d ~ Normal(mean = c + b, var = 1.0) + + y ~ Normal(mean = d, var = 1.0) + end + + result = inference(model = model_6(), data = (y = missing, x_0 = 1.0), initmessages = (a = vague(NormalMeanPrecision),), iterations = 10, free_energy = false) + + @test haskey(result.predictions, :y) + + # test vmp model + data = (y = [1.0, -10.0, 5.0],) + @model function vmp_model(n) + x = randomvar(n + 1) + o = datavar(Float64) where {allow_missing = true} + y = datavar(Float64, n) + + x_0 ~ NormalMeanPrecision(0.0, 100.0) + γ ~ GammaShapeRate(1.0, 1.0) + + x_prev = x_0 + for i in 1:n + x[i] ~ NormalMeanPrecision(x_prev, γ) + y[i] ~ NormalMeanPrecision(x[i], 1.0) + x_prev = x[i] + end + x[n + 1] ~ NormalMeanPrecision(x[n], 1.0) + o ~ NormalMeanPrecision(x[n + 1], 1.0) + end + + constraints = @constraints begin + q(x_0, x, γ) = q(x_0, x)q(γ) + end + + result = inference( + model = vmp_model(length(data[:y])), + data = data, + constraints = constraints, + free_energy = false, + initmarginals = (γ = GammaShapeRate(1.0, 1.0),), + iterations = 10, + returnvars = (γ = KeepEach(),), + predictvars = (o = KeepEach(),) + ) + + @test first(result.posteriors[:γ]) != last(result.posteriors[:γ]) + @test first(result.predictions[:o]) != last(result.predictions[:o]) +end + end From ccf4489d4fa1baec06fec62a67613c0db8e554df Mon Sep 17 00:00:00 2001 From: Bagaev Dmitry Date: Wed, 13 Sep 2023 15:36:19 +0200 Subject: [PATCH 08/24] fix: fix datavar tests --- src/model.jl | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/src/model.jl b/src/model.jl index f2f577456..1404c6aad 100644 --- a/src/model.jl +++ b/src/model.jl @@ -400,7 +400,23 @@ function ReactiveMP.make_node( return node, var else combinedvars = combineLatest(ReactiveMP.getmarginal.(args, IncludeAll()), PushNew()) - mappedvars = combinedvars |> map(Message, (vars) -> Message(PointMass(fform(map((d) -> ReactiveMP.getpointmass(ReactiveMP.getdata(d)), vars)...)), false, false, nothing)) + + # Check if some of the `DataVariable` allow for missing values + possibly_missings = any(allows_missings, filter(arg -> arg isa ReactiveMP.DataVariable, args)) + # If `missing` values are allowed, then the result type is a `Union` of `Message{Missing}` and `Message{PointMass}` + result_type = possibly_missings ? Union{Message{Missing}, Message{PointMass}} : Message{PointMass} + # By convention, if the result happens to be missing, the result is a `Message{Missing}` instead of `Message{PointMass}` + mapping_fn = let possibly_missings = possibly_missings + (vars) -> begin + result = fform(map((d) -> ReactiveMP.getpointmass(ReactiveMP.getdata(d)), vars)...) + return if (possibly_missings && ismissing(result)) + Message{Missing, Nothing}(missing, false, false, nothing) + else + Message{PointMass, Nothing}(PointMass(result), false, false, nothing) + end + end + end + mappedvars = combinedvars |> map(result_type, mapping_fn) output = mappedvars |> share_recent() var = push!(model, ReactiveMP.datavar(DataVariableCreationOptions(output, true, false), ReactiveMP.name(autovar), Any)) foreach(filter(ReactiveMP.isdata, args)) do datavar From 7f53ab766fca8001fae41bed39786f12f70cd504 Mon Sep 17 00:00:00 2001 From: Bagaev Dmitry Date: Wed, 13 Sep 2023 15:48:21 +0200 Subject: [PATCH 09/24] improve check data is missing --- src/inference.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/inference.jl b/src/inference.jl index 7b6064bff..502290ee3 100644 --- a/src/inference.jl +++ b/src/inference.jl @@ -144,7 +144,7 @@ function __inference_check_dicttype(keyword::Symbol, ::T) where {T} """) end -__inference_check_dataismissing(d) = (ismissing(d) || !isempty(findall(ismissing, d))) +__inference_check_dataismissing(d) = (ismissing(d) || any(ismissing, d)) # Return NamedTuple for predictions __inference_fill_predictions(s::Symbol, d::AbstractArray) = NamedTuple{Tuple([s])}([repeat([missing], length(d))]) From 3589fa007707b6ca9c2bc38ab84c66cf63edff5a Mon Sep 17 00:00:00 2001 From: Bagaev Dmitry Date: Wed, 13 Sep 2023 16:03:59 +0200 Subject: [PATCH 10/24] more tests --- test/test_inference.jl | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/test/test_inference.jl b/test/test_inference.jl index c87ce6411..474f295ed 100644 --- a/test/test_inference.jl +++ b/test/test_inference.jl @@ -755,6 +755,7 @@ end result = inference(model = model_1(length(data[:y])), iterations = 10, data = data, predictvars = (o = KeepLast(),)) @test all(typeof.(result.predictions[:o]) .<: NormalDistributionsFamily) + @test length(result.predictions[:o]) === 2 @test typeof(result.predictions[:y][3]) <: NormalDistributionsFamily # test #2 (array with missing + single entry for predictvars) @@ -777,8 +778,9 @@ end result = inference(model = model_2(length(data[:y])), iterations = 10, data = data, predictvars = (o = KeepEach(),)) - # note we used KeepEach for variable o with BP algorithm (10 iterations), we expect all predicted variables to be equal + # note we used KeepEach for variable o with BP algorithm (10 iterations), we expect all predicted variables to be equal (because of the beleif propagation) @test all(y -> y == result.predictions[:o][1], result.predictions[:o]) + @test length(result.predictions[:o]) === 10 @test all(typeof.(result.predictions[:y]) .<: NormalDistributionsFamily) # test #3 (array + single entry for predictvars) @@ -802,8 +804,9 @@ end @test !haskey(result.predictions, :y) @test haskey(result.predictions, :o) + @test typeof(result.predictions[:o]) <: NormalDistributionsFamily - # test #4 (array of missing + no predictvars) + # test #4 (array with a missing + no predictvars) data = (y = [1.0, 2.0, missing],) @model function model_4(n) x = randomvar(n) @@ -833,6 +836,7 @@ end result = inference(model = model_5(), iterations = 1, predictvars = (o = KeepLast(),)) @test haskey(result.predictions, :o) + @test typeof(result.predictions[:o]) <: NormalDistributionsFamily # test #6 (single datavar missing) @model function model_6() @@ -851,6 +855,7 @@ end result = inference(model = model_6(), data = (y = missing, x_0 = 1.0), initmessages = (a = vague(NormalMeanPrecision),), iterations = 10, free_energy = false) @test haskey(result.predictions, :y) + @test typeof(result.predictions[:y]) <: NormalDistributionsFamily # test vmp model data = (y = [1.0, -10.0, 5.0],) From b4a29fbdf665b27e04a5ffc47a7d2f32706fa00d Mon Sep 17 00:00:00 2001 From: Albert Podusenko Date: Wed, 13 Sep 2023 18:09:47 +0200 Subject: [PATCH 11/24] Update inference function --- src/inference.jl | 5 ++++ test/test_inference.jl | 53 +++++++++++++++++++++++++++++++++++++----- 2 files changed, 52 insertions(+), 6 deletions(-) diff --git a/src/inference.jl b/src/inference.jl index 502290ee3..5b72af21f 100644 --- a/src/inference.jl +++ b/src/inference.jl @@ -627,6 +627,7 @@ function inference(; end end else # In this case, the prediction functionality should only be performed if the data allows missings and actually contains missing values. + foreach((variable, value) -> isdata(value) && __inference_check_dataismissing(data[variable]) && !allows_missings(value) ? error("datavar $(variable) has missings inside but does not allow it. Add `where {allow_missing = true }`") : nothing, keys(vardict), values(vardict)) predictvars = Dict( variable => KeepLast() for (variable, value) in pairs(vardict) if (isdata(value) && haskey(data, variable) && allows_missings(value) && __inference_check_dataismissing(data[variable]) && !isanonymous(value)) @@ -684,6 +685,10 @@ function inference(; is_free_energy, S, T = unwrap_free_energy_option(free_energy) + if !isempty(actors_pr) && is_free_energy + error("Cannot compute Bethe Free Energy for models with prediction variables. Please set `free_energy = false`.") + end + if is_free_energy fe_actor = ScoreActor(S, _iterations, 1) fe_objective = BetheFreeEnergy(BetheFreeEnergyDefaultMarginalSkipStrategy, AsapScheduler(), free_energy_diagnostics) diff --git a/test/test_inference.jl b/test/test_inference.jl index 474f295ed..334d25c5b 100644 --- a/test/test_inference.jl +++ b/test/test_inference.jl @@ -722,11 +722,6 @@ end @testset "Predictions functionality" begin - # Given the current implementation of RxInfer ecosystem, this rule needs to be predifined - @rule NormalMeanPrecision(:μ, Marginalisation) (m_out::PointMass, q_τ::PointMass) = begin - return missing - end - # test #1 (array with missing + predictvars) data = (y = [1.0, -500.0, missing, 100.0],) @@ -857,7 +852,7 @@ end @test haskey(result.predictions, :y) @test typeof(result.predictions[:y]) <: NormalDistributionsFamily - # test vmp model + # test #7 vmp model data = (y = [1.0, -10.0, 5.0],) @model function vmp_model(n) x = randomvar(n + 1) @@ -894,6 +889,52 @@ end @test first(result.posteriors[:γ]) != last(result.posteriors[:γ]) @test first(result.predictions[:o]) != last(result.predictions[:o]) + + + # test #8 non gaussian likelihood (single datavar missing) + dataset = [1.0, 0.0, 1.0, missing,] + @model function coin_model(n) + + y = datavar(Float64, n) where {allow_missing = true} + + θ ~ Beta(4.0, 8.0) + for i in 1:n + y[i] ~ Bernoulli(θ) + end + + end + + result = inference( + model = coin_model(length(dataset)), + data = (y = dataset, ) + ) + + @test typeof(last(result.predictions[:y])) <: Bernoulli + + # test #9 allow_missing error handling + dataset = [1.0, 0.0, 1.0, missing,] + @model function coin_model(n) + + y = datavar(Float64, n) + + θ ~ Beta(4.0, 8.0) + for i in 1:n + y[i] ~ Bernoulli(θ) + end + + end + + @test_throws ErrorException inference( + model = coin_model(length(dataset)), + data = (y = dataset, ) + ) + + #test #10 free_energy error handling + @test_throws ErrorException inference( + model = coin_model(length(dataset)), + data = (y = dataset, ), + free_energy = true + ) end end From 9f59b0d8c49da9ba61f7e8b09f7e5d113acdae55 Mon Sep 17 00:00:00 2001 From: Albert Podusenko Date: Wed, 13 Sep 2023 18:13:50 +0200 Subject: [PATCH 12/24] Make format --- src/inference.jl | 10 +++++++++- test/test_inference.jl | 25 +++++-------------------- 2 files changed, 14 insertions(+), 21 deletions(-) diff --git a/src/inference.jl b/src/inference.jl index 5b72af21f..f365691c8 100644 --- a/src/inference.jl +++ b/src/inference.jl @@ -627,7 +627,15 @@ function inference(; end end else # In this case, the prediction functionality should only be performed if the data allows missings and actually contains missing values. - foreach((variable, value) -> isdata(value) && __inference_check_dataismissing(data[variable]) && !allows_missings(value) ? error("datavar $(variable) has missings inside but does not allow it. Add `where {allow_missing = true }`") : nothing, keys(vardict), values(vardict)) + foreach( + (variable, value) -> if isdata(value) && __inference_check_dataismissing(data[variable]) && !allows_missings(value) + error("datavar $(variable) has missings inside but does not allow it. Add `where {allow_missing = true }`") + else + nothing + end, + keys(vardict), + values(vardict) + ) predictvars = Dict( variable => KeepLast() for (variable, value) in pairs(vardict) if (isdata(value) && haskey(data, variable) && allows_missings(value) && __inference_check_dataismissing(data[variable]) && !isanonymous(value)) diff --git a/test/test_inference.jl b/test/test_inference.jl index 334d25c5b..bedc63661 100644 --- a/test/test_inference.jl +++ b/test/test_inference.jl @@ -890,51 +890,36 @@ end @test first(result.posteriors[:γ]) != last(result.posteriors[:γ]) @test first(result.predictions[:o]) != last(result.predictions[:o]) - # test #8 non gaussian likelihood (single datavar missing) - dataset = [1.0, 0.0, 1.0, missing,] + dataset = [1.0, 0.0, 1.0, missing] @model function coin_model(n) - y = datavar(Float64, n) where {allow_missing = true} θ ~ Beta(4.0, 8.0) for i in 1:n y[i] ~ Bernoulli(θ) end - end - result = inference( - model = coin_model(length(dataset)), - data = (y = dataset, ) - ) + result = inference(model = coin_model(length(dataset)), data = (y = dataset,)) @test typeof(last(result.predictions[:y])) <: Bernoulli # test #9 allow_missing error handling - dataset = [1.0, 0.0, 1.0, missing,] + dataset = [1.0, 0.0, 1.0, missing] @model function coin_model(n) - y = datavar(Float64, n) θ ~ Beta(4.0, 8.0) for i in 1:n y[i] ~ Bernoulli(θ) end - end - @test_throws ErrorException inference( - model = coin_model(length(dataset)), - data = (y = dataset, ) - ) + @test_throws ErrorException inference(model = coin_model(length(dataset)), data = (y = dataset,)) #test #10 free_energy error handling - @test_throws ErrorException inference( - model = coin_model(length(dataset)), - data = (y = dataset, ), - free_energy = true - ) + @test_throws ErrorException inference(model = coin_model(length(dataset)), data = (y = dataset,), free_energy = true) end end From 447efccda74839f256227601f8106ce35c99c931 Mon Sep 17 00:00:00 2001 From: Albert Podusenko Date: Wed, 13 Sep 2023 19:00:47 +0200 Subject: [PATCH 13/24] Make format --- src/inference.jl | 4 +--- test/test_inference.jl | 4 ++-- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/src/inference.jl b/src/inference.jl index f365691c8..3a508db49 100644 --- a/src/inference.jl +++ b/src/inference.jl @@ -632,9 +632,7 @@ function inference(; error("datavar $(variable) has missings inside but does not allow it. Add `where {allow_missing = true }`") else nothing - end, - keys(vardict), - values(vardict) + end, keys(vardict), values(vardict) ) predictvars = Dict( variable => KeepLast() for (variable, value) in pairs(vardict) if diff --git a/test/test_inference.jl b/test/test_inference.jl index bedc63661..2e98015be 100644 --- a/test/test_inference.jl +++ b/test/test_inference.jl @@ -901,7 +901,7 @@ end end end - result = inference(model = coin_model(length(dataset)), data = (y = dataset,)) + result = inference(model = coin_model(length(dataset)), data = (y = dataset,)) @test typeof(last(result.predictions[:y])) <: Bernoulli @@ -916,7 +916,7 @@ end end end - @test_throws ErrorException inference(model = coin_model(length(dataset)), data = (y = dataset,)) + @test_throws ErrorException inference(model = coin_model(length(dataset)), data = (y = dataset,)) #test #10 free_energy error handling @test_throws ErrorException inference(model = coin_model(length(dataset)), data = (y = dataset,), free_energy = true) From bb993ac8bfe9d805ac03d5a9689271ef3c82145a Mon Sep 17 00:00:00 2001 From: Albert Podusenko Date: Mon, 18 Sep 2023 11:47:25 +0200 Subject: [PATCH 14/24] Update src/inference.jl Co-authored-by: Bagaev Dmitry --- src/inference.jl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/inference.jl b/src/inference.jl index 3a508db49..ff9843c8b 100644 --- a/src/inference.jl +++ b/src/inference.jl @@ -147,8 +147,8 @@ end __inference_check_dataismissing(d) = (ismissing(d) || any(ismissing, d)) # Return NamedTuple for predictions -__inference_fill_predictions(s::Symbol, d::AbstractArray) = NamedTuple{Tuple([s])}([repeat([missing], length(d))]) -__inference_fill_predictions(s::Symbol, d::DataVariable) = NamedTuple{Tuple([s])}([missing]) +__inference_fill_predictions(s::Symbol, d::AbstractArray) = NamedTuple{(s, )}((Iterators.repeated(missing, length(d)), )) +__inference_fill_predictions(s::Symbol, d::DataVariable) = NamedTuple{(s, )}((missing, )) ## Inference results postprocessing From 829b921a0c9dae1ba97f9de25d05ebfe22f5b369 Mon Sep 17 00:00:00 2001 From: Albert Podusenko Date: Mon, 18 Sep 2023 11:47:35 +0200 Subject: [PATCH 15/24] Update src/inference.jl Co-authored-by: Bagaev Dmitry --- src/inference.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/inference.jl b/src/inference.jl index ff9843c8b..f69414599 100644 --- a/src/inference.jl +++ b/src/inference.jl @@ -532,7 +532,7 @@ function inference(; options = nothing, # Return structure info, optional, defaults to return everything at each iteration returnvars = nothing, - # Return structure info, optional, defaults to return everything at each iteration + # Prediction structure info, optional, defaults to return everything at each iteration predictvars = nothing, # Number of iterations, defaults to 1, we do not distinguish between VMP or Loopy belief or EP iterations iterations = nothing, From 5eb6c46a100371d2617be507102606faa1597c18 Mon Sep 17 00:00:00 2001 From: Albert Podusenko Date: Mon, 18 Sep 2023 11:47:44 +0200 Subject: [PATCH 16/24] Update src/inference.jl Co-authored-by: Bagaev Dmitry --- src/inference.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/inference.jl b/src/inference.jl index f69414599..ea11b3cf4 100644 --- a/src/inference.jl +++ b/src/inference.jl @@ -555,7 +555,7 @@ function inference(; catch_exception = false ) if isnothing(data) && isnothing(predictvars) - error("""One of keyword arguments `data` or `predictvars`` must be specified""") + error("""One of the keyword arguments `data` or `predictvars` must be specified""") end __inference_check_dicttype(:initmarginals, initmarginals) __inference_check_dicttype(:initmessages, initmessages) From d98d3c330278a068e36339eb2b0cb7f14b813672 Mon Sep 17 00:00:00 2001 From: Albert Podusenko Date: Mon, 18 Sep 2023 11:47:57 +0200 Subject: [PATCH 17/24] Update src/inference.jl Co-authored-by: Bagaev Dmitry --- src/inference.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/inference.jl b/src/inference.jl index ea11b3cf4..561ef47d7 100644 --- a/src/inference.jl +++ b/src/inference.jl @@ -692,7 +692,7 @@ function inference(; is_free_energy, S, T = unwrap_free_energy_option(free_energy) if !isempty(actors_pr) && is_free_energy - error("Cannot compute Bethe Free Energy for models with prediction variables. Please set `free_energy = false`.") + error("The Bethe Free Energy computation is not compatible with the prediction functionality. Set `free_energy = false` to suppress this error.") end if is_free_energy From b0dd1377bb447d13f7076ffa023d6c1d0ffbc617 Mon Sep 17 00:00:00 2001 From: Albert Podusenko Date: Mon, 18 Sep 2023 13:24:29 +0200 Subject: [PATCH 18/24] Add prediction test for coin model --- test/test_inference.jl | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/test/test_inference.jl b/test/test_inference.jl index 2e98015be..0be8d9092 100644 --- a/test/test_inference.jl +++ b/test/test_inference.jl @@ -891,11 +891,11 @@ end @test first(result.predictions[:o]) != last(result.predictions[:o]) # test #8 non gaussian likelihood (single datavar missing) - dataset = [1.0, 0.0, 1.0, missing] + dataset = [1.0, 1.0, 1.0, missing] @model function coin_model(n) y = datavar(Float64, n) where {allow_missing = true} - θ ~ Beta(4.0, 8.0) + θ ~ Beta(1.0, 1.0) for i in 1:n y[i] ~ Bernoulli(θ) end @@ -905,6 +905,9 @@ end @test typeof(last(result.predictions[:y])) <: Bernoulli + # for θ ~ Beta(1.0, 1.0) + @test Bernoulli(mean(Beta(sum(dataset .!== missing) + 1.0, 1.0))) ≈ last(result.predictions[:y]) + # test #9 allow_missing error handling dataset = [1.0, 0.0, 1.0, missing] @model function coin_model(n) From 2d2ac7f5d25ee1d74226483c85aecede9d7bcb8b Mon Sep 17 00:00:00 2001 From: Albert Podusenko Date: Mon, 18 Sep 2023 13:50:31 +0200 Subject: [PATCH 19/24] Update tests --- src/inference.jl | 4 ++-- test/test_inference.jl | 19 ++++++++++++++++--- 2 files changed, 18 insertions(+), 5 deletions(-) diff --git a/src/inference.jl b/src/inference.jl index 561ef47d7..1feeeb903 100644 --- a/src/inference.jl +++ b/src/inference.jl @@ -147,8 +147,8 @@ end __inference_check_dataismissing(d) = (ismissing(d) || any(ismissing, d)) # Return NamedTuple for predictions -__inference_fill_predictions(s::Symbol, d::AbstractArray) = NamedTuple{(s, )}((Iterators.repeated(missing, length(d)), )) -__inference_fill_predictions(s::Symbol, d::DataVariable) = NamedTuple{(s, )}((missing, )) +__inference_fill_predictions(s::Symbol, d::AbstractArray) = NamedTuple{Tuple([s])}([repeat([missing], length(d))]) +__inference_fill_predictions(s::Symbol, d::DataVariable) = NamedTuple{Tuple([s])}([missing]) ## Inference results postprocessing diff --git a/test/test_inference.jl b/test/test_inference.jl index 0be8d9092..22e14e491 100644 --- a/test/test_inference.jl +++ b/test/test_inference.jl @@ -909,11 +909,11 @@ end @test Bernoulli(mean(Beta(sum(dataset .!== missing) + 1.0, 1.0))) ≈ last(result.predictions[:y]) # test #9 allow_missing error handling - dataset = [1.0, 0.0, 1.0, missing] + dataset = [1.0, 1.0, 1.0, missing] @model function coin_model(n) y = datavar(Float64, n) - θ ~ Beta(4.0, 8.0) + θ ~ Beta(1.0, 1.0) for i in 1:n y[i] ~ Bernoulli(θ) end @@ -921,8 +921,21 @@ end @test_throws ErrorException inference(model = coin_model(length(dataset)), data = (y = dataset,)) - #test #10 free_energy error handling @test_throws ErrorException inference(model = coin_model(length(dataset)), data = (y = dataset,), free_energy = true) + + # test #10 predictvars, no dataset + @model function coin_model(n) + y = datavar(Float64, n) where {allow_missing = true} + + θ ~ Beta(1.0, 1.0) + for i in 1:n + y[i] ~ Bernoulli(θ) + end + end + + result = inference(model = coin_model(length(dataset)), predictvars = (y = KeepLast(),)) + + @test result.predictions[:y] .== Bernoulli(mean(Beta(1.0, 1.0))) end end From 3eb5cda299b03c94311350e07c18294a65fdebd0 Mon Sep 17 00:00:00 2001 From: Albert Podusenko Date: Mon, 18 Sep 2023 13:51:50 +0200 Subject: [PATCH 20/24] Make format --- test/test_inference.jl | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/test/test_inference.jl b/test/test_inference.jl index 22e14e491..e27f765b5 100644 --- a/test/test_inference.jl +++ b/test/test_inference.jl @@ -925,14 +925,14 @@ end # test #10 predictvars, no dataset @model function coin_model(n) - y = datavar(Float64, n) where {allow_missing = true} - + y = datavar(Float64, n) where {allow_missing = true} + θ ~ Beta(1.0, 1.0) for i in 1:n y[i] ~ Bernoulli(θ) end end - + result = inference(model = coin_model(length(dataset)), predictvars = (y = KeepLast(),)) @test result.predictions[:y] .== Bernoulli(mean(Beta(1.0, 1.0))) From 1a54d0f62f0b402401b829dc4d1b748a1dd89414 Mon Sep 17 00:00:00 2001 From: Bagaev Dmitry Date: Mon, 18 Sep 2023 14:26:38 +0200 Subject: [PATCH 21/24] fix tests --- src/inference.jl | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/inference.jl b/src/inference.jl index 1feeeb903..7d0671942 100644 --- a/src/inference.jl +++ b/src/inference.jl @@ -627,13 +627,13 @@ function inference(; end end else # In this case, the prediction functionality should only be performed if the data allows missings and actually contains missing values. - foreach( - (variable, value) -> if isdata(value) && __inference_check_dataismissing(data[variable]) && !allows_missings(value) - error("datavar $(variable) has missings inside but does not allow it. Add `where {allow_missing = true }`") - else - nothing - end, keys(vardict), values(vardict) - ) + foreach(keys(vardict), values(vardict)) do variable, value + if isdata(value) && haskey(data, variable) && __inference_check_dataismissing(data[variable]) && !allows_missings(value) + error( + "The `data` entry for the $(variable) has `missing` values inside, but the `datavar` specification does not allow it. Use `where { allow_missing = true }` in the model specification" + ) + end + end predictvars = Dict( variable => KeepLast() for (variable, value) in pairs(vardict) if (isdata(value) && haskey(data, variable) && allows_missings(value) && __inference_check_dataismissing(data[variable]) && !isanonymous(value)) From 9dd673895b01b629f2e50af9b0c2e3441d09c404 Mon Sep 17 00:00:00 2001 From: Bagaev Dmitry Date: Mon, 18 Sep 2023 14:29:34 +0200 Subject: [PATCH 22/24] fix inference tests --- test/test_inference.jl | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/test/test_inference.jl b/test/test_inference.jl index e27f765b5..caf35a304 100644 --- a/test/test_inference.jl +++ b/test/test_inference.jl @@ -892,7 +892,7 @@ end # test #8 non gaussian likelihood (single datavar missing) dataset = [1.0, 1.0, 1.0, missing] - @model function coin_model(n) + @model function coin_model1(n) y = datavar(Float64, n) where {allow_missing = true} θ ~ Beta(1.0, 1.0) @@ -901,7 +901,7 @@ end end end - result = inference(model = coin_model(length(dataset)), data = (y = dataset,)) + result = inference(model = coin_model1(length(dataset)), data = (y = dataset,)) @test typeof(last(result.predictions[:y])) <: Bernoulli @@ -910,7 +910,7 @@ end # test #9 allow_missing error handling dataset = [1.0, 1.0, 1.0, missing] - @model function coin_model(n) + @model function coin_model2(n) y = datavar(Float64, n) θ ~ Beta(1.0, 1.0) @@ -919,12 +919,12 @@ end end end - @test_throws ErrorException inference(model = coin_model(length(dataset)), data = (y = dataset,)) + @test_throws ErrorException inference(model = coin_model2(length(dataset)), data = (y = dataset,)) - @test_throws ErrorException inference(model = coin_model(length(dataset)), data = (y = dataset,), free_energy = true) + @test_throws ErrorException inference(model = coin_model2(length(dataset)), data = (y = dataset,), free_energy = true) # test #10 predictvars, no dataset - @model function coin_model(n) + @model function coin_model3(n) y = datavar(Float64, n) where {allow_missing = true} θ ~ Beta(1.0, 1.0) @@ -933,9 +933,9 @@ end end end - result = inference(model = coin_model(length(dataset)), predictvars = (y = KeepLast(),)) + result = inference(model = coin_model3(length(dataset)), predictvars = (y = KeepLast(),)) - @test result.predictions[:y] .== Bernoulli(mean(Beta(1.0, 1.0))) + @test all(result.predictions[:y] .== Bernoulli(mean(Beta(1.0, 1.0)))) end end From bdafd5d27e6847b9db5504f10eda676f7eddc3b5 Mon Sep 17 00:00:00 2001 From: Bagaev Dmitry Date: Mon, 18 Sep 2023 15:31:02 +0200 Subject: [PATCH 23/24] fix examples --- .../Kalman filtering and smoothing.ipynb | 10682 ++++++++-------- 1 file changed, 5335 insertions(+), 5347 deletions(-) diff --git a/examples/basic_examples/Kalman filtering and smoothing.ipynb b/examples/basic_examples/Kalman filtering and smoothing.ipynb index 61bdeb7c3..fe53050e0 100644 --- a/examples/basic_examples/Kalman filtering and smoothing.ipynb +++ b/examples/basic_examples/Kalman filtering and smoothing.ipynb @@ -18,7 +18,14 @@ "name": "stderr", "output_type": "stream", "text": [ - "\u001b[32m\u001b[1m Activating\u001b[22m\u001b[39m project at `~/.julia/dev/RxInfer/examples`\n" + "\u001b[32m\u001b[1m Activating\u001b[22m\u001b[39m project at `~/.julia/dev/RxInfer.jl/examples`\n", + "\u001b[32m\u001b[1mPrecompiling\u001b[22m\u001b[39m project...\n", + "\u001b[32m ✓ \u001b[39mReactiveMP\n", + "\u001b[32m ✓ \u001b[39m\u001b[90mReactiveMP → ReactiveMPRequiresExt\u001b[39m\n", + "\u001b[32m ✓ \u001b[39m\u001b[90mReactiveMP → ReactiveMPOptimisersExt\u001b[39m\n", + "\u001b[32m ✓ \u001b[39m\u001b[90mReactiveMP → ReactiveMPZygoteExt\u001b[39m\n", + "\u001b[32m ✓ \u001b[39mRxInfer\n", + " 5 dependencies successfully precompiled in 35 seconds. 344 already precompiled.\n" ] } ], @@ -138,7 +145,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 4, "id": "5c4925b0-23ac-4b60-b450-5aaecc119340", "metadata": {}, "outputs": [], @@ -163,7 +170,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 5, "id": "d9a2c5a7-c7e7-4d71-b012-c920f59fa111", "metadata": {}, "outputs": [], @@ -181,7 +188,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 6, "id": "21c244e7-3bbf-4387-a965-36c47f79c1d9", "metadata": {}, "outputs": [ @@ -192,1308 +199,1308 @@ "\n", "\n", "\n", - " \n", + " \n", " \n", " \n", "\n", - "\n", + "\n", "\n", - " \n", + " \n", " \n", " \n", "\n", - "\n", + "\n", "\n", - " \n", + " \n", " \n", " \n", "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n" + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n" ], "text/html": [ "\n", "\n", "\n", - " \n", + " \n", " \n", " \n", "\n", - "\n", + "\n", "\n", - " \n", + " \n", " \n", " \n", "\n", - "\n", + "\n", "\n", - " \n", + " \n", " \n", " \n", "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n" + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n" ] }, - "execution_count": 7, + "execution_count": 6, "metadata": {}, "output_type": "execute_result" } @@ -1519,7 +1526,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 7, "id": "b3cc78a3-c460-42b3-bf86-387f72d3285b", "metadata": {}, "outputs": [], @@ -1559,7 +1566,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 8, "id": "26578c71-6c2d-4104-90c0-48dff8d065c7", "metadata": {}, "outputs": [], @@ -1569,7 +1576,7 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 9, "id": "65d9ec02-068c-4e9d-a640-ef193b6d056e", "metadata": {}, "outputs": [], @@ -1588,7 +1595,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 10, "id": "3ee42a5c-7db8-4586-8d34-dbd0612fea3c", "metadata": {}, "outputs": [ @@ -1599,116 +1606,116 @@ "\n", "\n", "\n", - " \n", + " \n", " \n", " \n", "\n", - "\n", + "\n", "\n", - " \n", + " \n", " \n", " \n", "\n", - "\n", + "\n", "\n", - " \n", + " \n", " \n", " \n", "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n" + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n" ], "text/html": [ "\n", "\n", "\n", - " \n", + " \n", " \n", " \n", "\n", - "\n", + "\n", "\n", - " \n", + " \n", " \n", " \n", "\n", - "\n", + "\n", "\n", - " \n", + " \n", " \n", " \n", "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n" + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n" ] }, - "execution_count": 13, + "execution_count": 10, "metadata": {}, "output_type": "execute_result" } @@ -1735,7 +1742,7 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 11, "id": "49af6f79-eb95-4731-b4eb-f9d83fcc8f78", "metadata": {}, "outputs": [ @@ -1746,7 +1753,7 @@ " -1882.2434870101347" ] }, - "execution_count": 16, + "execution_count": 11, "metadata": {}, "output_type": "execute_result" } @@ -1765,26 +1772,26 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 12, "id": "c33f0927-1f34-4f19-946d-49229c4f3759", "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "BenchmarkTools.Trial: 278 samples with 1 evaluation.\n", - " Range \u001b[90m(\u001b[39m\u001b[36m\u001b[1mmin\u001b[22m\u001b[39m … \u001b[35mmax\u001b[39m\u001b[90m): \u001b[39m\u001b[36m\u001b[1m14.903 ms\u001b[22m\u001b[39m … \u001b[35m36.241 ms\u001b[39m \u001b[90m┊\u001b[39m GC \u001b[90m(\u001b[39mmin … max\u001b[90m): \u001b[39m 0.00% … 46.15%\n", - " Time \u001b[90m(\u001b[39m\u001b[34m\u001b[1mmedian\u001b[22m\u001b[39m\u001b[90m): \u001b[39m\u001b[34m\u001b[1m16.040 ms \u001b[22m\u001b[39m\u001b[90m┊\u001b[39m GC \u001b[90m(\u001b[39mmedian\u001b[90m): \u001b[39m 0.00%\n", - " Time \u001b[90m(\u001b[39m\u001b[32m\u001b[1mmean\u001b[22m\u001b[39m ± \u001b[32mσ\u001b[39m\u001b[90m): \u001b[39m\u001b[32m\u001b[1m18.024 ms\u001b[22m\u001b[39m ± \u001b[32m 3.932 ms\u001b[39m \u001b[90m┊\u001b[39m GC \u001b[90m(\u001b[39mmean ± σ\u001b[90m): \u001b[39m10.35% ± 14.24%\n", + "BenchmarkTools.Trial: 228 samples with 1 evaluation.\n", + " Range \u001b[90m(\u001b[39m\u001b[36m\u001b[1mmin\u001b[22m\u001b[39m … \u001b[35mmax\u001b[39m\u001b[90m): \u001b[39m\u001b[36m\u001b[1m17.081 ms\u001b[22m\u001b[39m … \u001b[35m48.992 ms\u001b[39m \u001b[90m┊\u001b[39m GC \u001b[90m(\u001b[39mmin … max\u001b[90m): \u001b[39m 0.00% … 0.00%\n", + " Time \u001b[90m(\u001b[39m\u001b[34m\u001b[1mmedian\u001b[22m\u001b[39m\u001b[90m): \u001b[39m\u001b[34m\u001b[1m19.579 ms \u001b[22m\u001b[39m\u001b[90m┊\u001b[39m GC \u001b[90m(\u001b[39mmedian\u001b[90m): \u001b[39m 0.00%\n", + " Time \u001b[90m(\u001b[39m\u001b[32m\u001b[1mmean\u001b[22m\u001b[39m ± \u001b[32mσ\u001b[39m\u001b[90m): \u001b[39m\u001b[32m\u001b[1m22.007 ms\u001b[22m\u001b[39m ± \u001b[32m 5.292 ms\u001b[39m \u001b[90m┊\u001b[39m GC \u001b[90m(\u001b[39mmean ± σ\u001b[90m): \u001b[39m10.83% ± 14.73%\n", "\n", - " \u001b[39m \u001b[39m \u001b[39m▃\u001b[39m▇\u001b[39m█\u001b[34m▃\u001b[39m\u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[32m \u001b[39m\u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \n", - " \u001b[39m▃\u001b[39m█\u001b[39m█\u001b[39m█\u001b[39m█\u001b[34m█\u001b[39m\u001b[39m█\u001b[39m▅\u001b[39m▄\u001b[39m▃\u001b[39m▂\u001b[39m▁\u001b[39m▁\u001b[39m▃\u001b[32m▃\u001b[39m\u001b[39m▂\u001b[39m▂\u001b[39m▁\u001b[39m▂\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▂\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▂\u001b[39m▁\u001b[39m▁\u001b[39m▂\u001b[39m▁\u001b[39m▁\u001b[39m▃\u001b[39m▂\u001b[39m▃\u001b[39m▂\u001b[39m▄\u001b[39m▄\u001b[39m▃\u001b[39m▄\u001b[39m▃\u001b[39m▃\u001b[39m▃\u001b[39m▃\u001b[39m▃\u001b[39m▃\u001b[39m▃\u001b[39m▁\u001b[39m▁\u001b[39m▃\u001b[39m▁\u001b[39m▂\u001b[39m▂\u001b[39m▂\u001b[39m▁\u001b[39m▂\u001b[39m▂\u001b[39m \u001b[39m▃\n", - " 14.9 ms\u001b[90m Histogram: frequency by time\u001b[39m 28.2 ms \u001b[0m\u001b[1m<\u001b[22m\n", + " \u001b[39m \u001b[39m \u001b[39m \u001b[39m▂\u001b[39m█\u001b[39m▂\u001b[39m▆\u001b[39m▂\u001b[34m▂\u001b[39m\u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[32m \u001b[39m\u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \n", + " \u001b[39m▂\u001b[39m▄\u001b[39m▆\u001b[39m█\u001b[39m█\u001b[39m█\u001b[39m█\u001b[39m█\u001b[34m█\u001b[39m\u001b[39m█\u001b[39m█\u001b[39m▄\u001b[39m▄\u001b[39m▆\u001b[39m▄\u001b[39m▁\u001b[32m▂\u001b[39m\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▂\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▂\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▂\u001b[39m▁\u001b[39m▂\u001b[39m▄\u001b[39m▅\u001b[39m▄\u001b[39m▄\u001b[39m▃\u001b[39m▄\u001b[39m▃\u001b[39m▄\u001b[39m▂\u001b[39m▄\u001b[39m▄\u001b[39m▂\u001b[39m▄\u001b[39m▁\u001b[39m▂\u001b[39m▁\u001b[39m▂\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▃\u001b[39m \u001b[39m▃\n", + " 17.1 ms\u001b[90m Histogram: frequency by time\u001b[39m 35.4 ms \u001b[0m\u001b[1m<\u001b[22m\n", "\n", - " Memory estimate\u001b[90m: \u001b[39m\u001b[33m9.47 MiB\u001b[39m, allocs estimate\u001b[90m: \u001b[39m\u001b[33m218991\u001b[39m." + " Memory estimate\u001b[90m: \u001b[39m\u001b[33m9.63 MiB\u001b[39m, allocs estimate\u001b[90m: \u001b[39m\u001b[33m222349\u001b[39m." ] }, - "execution_count": 17, + "execution_count": 12, "metadata": {}, "output_type": "execute_result" } @@ -1814,7 +1821,7 @@ }, { "cell_type": "code", - "execution_count": 21, + "execution_count": 13, "id": "095853e3-7823-44ef-ad4b-266856e7ca5c", "metadata": {}, "outputs": [], @@ -1824,7 +1831,7 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 14, "id": "ebcf0cd7-9a07-4e53-b15b-83df75289ba2", "metadata": {}, "outputs": [ @@ -1834,7 +1841,7 @@ "generate_data (generic function with 2 methods)" ] }, - "execution_count": 19, + "execution_count": 14, "metadata": {}, "output_type": "execute_result" } @@ -1881,7 +1888,7 @@ }, { "cell_type": "code", - "execution_count": 22, + "execution_count": 15, "id": "ad34bb84-ad34-4c0a-a25e-06fbe87ab818", "metadata": {}, "outputs": [ @@ -1892,674 +1899,674 @@ "\n", "\n", "\n", - " \n", + " \n", " \n", " \n", "\n", - "\n", + "\n", "\n", - " \n", + " \n", " \n", " \n", "\n", - "\n", + "\n", "\n", - " \n", + " \n", " \n", " \n", "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", "\n", - " \n", + " \n", " \n", " \n", "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n" + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n" ], "text/html": [ "\n", "\n", "\n", - " \n", + " \n", " \n", " \n", "\n", - "\n", + "\n", "\n", - " \n", + " \n", " \n", " \n", "\n", - "\n", + "\n", "\n", - " \n", + " \n", " \n", " \n", "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", "\n", - " \n", + " \n", " \n", " \n", "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n" + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n" ] }, - "execution_count": 22, + "execution_count": 15, "metadata": {}, "output_type": "execute_result" } @@ -2588,7 +2595,7 @@ }, { "cell_type": "code", - "execution_count": 23, + "execution_count": 16, "id": "a7a91ad9-e573-4415-b76e-d6b0b9d8fc39", "metadata": {}, "outputs": [], @@ -2632,7 +2639,7 @@ }, { "cell_type": "code", - "execution_count": 24, + "execution_count": 17, "id": "73302f4a-57ee-4857-87d2-72df160a6ee4", "metadata": { "jupyter": { @@ -2652,7 +2659,7 @@ " warn = true\n" ] }, - "execution_count": 24, + "execution_count": 17, "metadata": {}, "output_type": "execute_result" } @@ -2673,7 +2680,7 @@ }, { "cell_type": "code", - "execution_count": 25, + "execution_count": 18, "id": "c54bcb91-4e38-41d1-9c66-9cf5529db829", "metadata": {}, "outputs": [ @@ -2684,7 +2691,7 @@ " Posteriors | available for (w0, w, x0, s, τ_x, τ_w, τ_y, x)\n" ] }, - "execution_count": 25, + "execution_count": 18, "metadata": {}, "output_type": "execute_result" } @@ -2727,7 +2734,7 @@ }, { "cell_type": "code", - "execution_count": 26, + "execution_count": 19, "id": "10d94513-d36a-4027-9309-e1d560dc9ea8", "metadata": {}, "outputs": [], @@ -2743,7 +2750,7 @@ }, { "cell_type": "code", - "execution_count": 27, + "execution_count": 20, "id": "8db23910-4b2f-499a-a8e9-da47128e2e74", "metadata": {}, "outputs": [ @@ -2754,696 +2761,696 @@ "\n", "\n", "\n", - " \n", + " \n", " \n", " \n", "\n", - "\n", + "\n", "\n", - " \n", + " \n", " \n", " \n", "\n", - "\n", + "\n", "\n", - " \n", + " \n", " \n", " \n", "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", "\n", - " \n", + " \n", " \n", " \n", "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n" + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n" ], "text/html": [ "\n", "\n", "\n", - " \n", + " \n", " \n", " \n", "\n", - "\n", + "\n", "\n", - " \n", + " \n", " \n", " \n", "\n", - "\n", + "\n", "\n", - " \n", + " \n", " \n", " \n", "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", "\n", - " \n", + " \n", " \n", " \n", "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n" + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n" ] }, - "execution_count": 27, + "execution_count": 20, "metadata": {}, "output_type": "execute_result" } @@ -3484,7 +3491,7 @@ }, { "cell_type": "code", - "execution_count": 28, + "execution_count": 21, "id": "b52a8658-f7c7-4f19-9004-530d6073d2f7", "metadata": {}, "outputs": [ @@ -3494,7 +3501,7 @@ "smooth_min (generic function with 1 method)" ] }, - "execution_count": 28, + "execution_count": 21, "metadata": {}, "output_type": "execute_result" } @@ -3520,7 +3527,7 @@ }, { "cell_type": "code", - "execution_count": 29, + "execution_count": 22, "id": "659b7cfb-f856-4d0b-a10c-81dc7227a590", "metadata": {}, "outputs": [ @@ -3533,7 +3540,7 @@ " warn = true" ] }, - "execution_count": 29, + "execution_count": 22, "metadata": {}, "output_type": "execute_result" } @@ -3547,7 +3554,7 @@ }, { "cell_type": "code", - "execution_count": 30, + "execution_count": 23, "id": "7d136a84-49e4-4de1-88a4-fadc776bd89e", "metadata": {}, "outputs": [ @@ -3558,562 +3565,562 @@ "\n", "\n", "\n", - " \n", + " \n", " \n", " \n", "\n", - "\n", + "\n", "\n", - " \n", + " \n", " \n", " \n", "\n", - "\n", + "\n", "\n", - " \n", + " \n", " \n", " \n", "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", "\n", - " \n", + " \n", " \n", " \n", "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n" + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n" ], "text/html": [ "\n", "\n", "\n", - " \n", + " \n", " \n", " \n", "\n", - "\n", + "\n", "\n", - " \n", + " \n", " \n", " \n", "\n", - "\n", + "\n", "\n", - " \n", + " \n", " \n", " \n", "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", "\n", - " \n", + " \n", " \n", " \n", "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n" + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n" ] }, - "execution_count": 30, + "execution_count": 23, "metadata": {}, "output_type": "execute_result" } @@ -4134,7 +4141,7 @@ }, { "cell_type": "code", - "execution_count": 31, + "execution_count": 24, "id": "db6d4608-6011-4941-8168-075e3d38337b", "metadata": {}, "outputs": [ @@ -4145,7 +4152,7 @@ " Posteriors | available for (w0, w, x0, s, τ_x, τ_w, τ_y, x)\n" ] }, - "execution_count": 31, + "execution_count": 24, "metadata": {}, "output_type": "execute_result" } @@ -4175,7 +4182,7 @@ }, { "cell_type": "code", - "execution_count": 32, + "execution_count": 25, "id": "a5feaf7c-923d-4e7c-b55d-1f41ba41c1af", "metadata": {}, "outputs": [ @@ -4186,576 +4193,576 @@ "\n", "\n", "\n", - " \n", + " \n", " \n", " \n", "\n", - "\n", + "\n", "\n", - " \n", + " \n", " \n", " \n", "\n", - "\n", + "\n", "\n", - " \n", + " \n", " \n", " \n", "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", "\n", - " \n", + " \n", " \n", " \n", "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n" + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n" ], "text/html": [ "\n", "\n", "\n", - " \n", + " \n", " \n", " \n", "\n", - "\n", + "\n", "\n", - " \n", + " \n", " \n", " \n", "\n", - "\n", + "\n", "\n", - " \n", + " \n", " \n", " \n", "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", "\n", - " \n", + " \n", " \n", " \n", "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n" + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n" ] }, - "execution_count": 32, + "execution_count": 25, "metadata": {}, "output_type": "execute_result" } @@ -4810,7 +4817,7 @@ }, { "cell_type": "code", - "execution_count": 33, + "execution_count": 26, "id": "d575c973-3ee2-4646-9377-53cb0e9650ec", "metadata": {}, "outputs": [], @@ -4857,7 +4864,7 @@ }, { "cell_type": "code", - "execution_count": 34, + "execution_count": 27, "id": "a65271fc-0035-473d-9e85-663d14e0cbb6", "metadata": {}, "outputs": [ @@ -4873,7 +4880,7 @@ " warn = true\n" ] }, - "execution_count": 34, + "execution_count": 27, "metadata": {}, "output_type": "execute_result" } @@ -4894,7 +4901,7 @@ }, { "cell_type": "code", - "execution_count": 35, + "execution_count": 28, "id": "2e987a81-270e-4747-bc35-c6f584eb508c", "metadata": {}, "outputs": [ @@ -4904,7 +4911,7 @@ "(m_x_0,τ_x_0 = mean_precision(q(x)), m_w_0,τ_w_0 = mean_precision(q(w)), a_x = shape(q(τ_x)), b_x = rate(q(τ_x)), a_y = shape(q(τ_y)), b_y = rate(q(τ_y)), a_w = shape(q(τ_w)), b_w = rate(q(τ_w)))" ] }, - "execution_count": 35, + "execution_count": 28, "metadata": {}, "output_type": "execute_result" } @@ -4932,7 +4939,7 @@ }, { "cell_type": "code", - "execution_count": 36, + "execution_count": 29, "id": "1485db4c-c80a-41da-9575-2ebdea373228", "metadata": {}, "outputs": [ @@ -4945,7 +4952,7 @@ " warn = true" ] }, - "execution_count": 36, + "execution_count": 29, "metadata": {}, "output_type": "execute_result" } @@ -4966,7 +4973,7 @@ }, { "cell_type": "code", - "execution_count": 37, + "execution_count": 30, "id": "4c1a3e0d-a343-4ade-8784-c00dad90e28b", "metadata": {}, "outputs": [ @@ -4977,750 +4984,750 @@ "\n", "\n", "\n", - " \n", + " \n", " \n", " \n", "\n", - "\n", + "\n", "\n", - " \n", + " \n", " \n", " \n", "\n", - "\n", + "\n", "\n", - " \n", + " \n", " \n", " \n", "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", "\n", - " \n", + " \n", " \n", " \n", "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n" + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n" ], "text/html": [ "\n", "\n", "\n", - " \n", + " \n", " \n", " \n", "\n", - "\n", + "\n", "\n", - " \n", + " \n", " \n", " \n", "\n", - "\n", + "\n", "\n", - " \n", + " \n", " \n", " \n", "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", "\n", - " \n", + " \n", " \n", " \n", "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n" + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n" ] }, - "execution_count": 37, + "execution_count": 30, "metadata": {}, "output_type": "execute_result" } @@ -5741,7 +5748,7 @@ }, { "cell_type": "code", - "execution_count": 38, + "execution_count": 31, "id": "a66364ec-2522-44ab-803d-5fba9d0a6a23", "metadata": {}, "outputs": [ @@ -5756,7 +5763,7 @@ " Enabled events | [ ]" ] }, - "execution_count": 38, + "execution_count": 31, "metadata": {}, "output_type": "execute_result" } @@ -5781,7 +5788,7 @@ }, { "cell_type": "code", - "execution_count": 39, + "execution_count": 32, "id": "64d229e0-0adc-4187-ad2e-e0531830bc7b", "metadata": {}, "outputs": [], @@ -5793,12 +5800,10 @@ }, { "cell_type": "code", - "execution_count": 40, + "execution_count": 33, "id": "b265a0dc-39d5-4451-94d5-51ee0588d63c", "metadata": { - "collapsed": true, "jupyter": { - "outputs_hidden": true, "source_hidden": true } }, @@ -5810,772 +5815,772 @@ "\n", "\n", "\n", - " \n", + " \n", " \n", " \n", "\n", - "\n", + "\n", "\n", - " \n", + " \n", " \n", " \n", "\n", - "\n", + "\n", "\n", - " \n", + " \n", " \n", " \n", "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", "\n", - " \n", + " \n", " \n", " \n", "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n" + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n" ], "text/html": [ "\n", "\n", "\n", - " \n", + " \n", " \n", " \n", "\n", - "\n", + "\n", "\n", - " \n", + " \n", " \n", " \n", "\n", - "\n", + "\n", "\n", - " \n", + " \n", " \n", " \n", "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", "\n", - " \n", + " \n", " \n", " \n", "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n" + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n" ] }, - "execution_count": 40, + "execution_count": 33, "metadata": {}, "output_type": "execute_result" } @@ -6637,7 +6642,7 @@ }, { "cell_type": "code", - "execution_count": 41, + "execution_count": 34, "id": "0b826d5c-3662-4c95-86d6-288ab42b1dcf", "metadata": {}, "outputs": [], @@ -6647,7 +6652,7 @@ }, { "cell_type": "code", - "execution_count": 54, + "execution_count": 35, "id": "29f677b7-d470-4f8f-b002-220d4ae0b526", "metadata": {}, "outputs": [], @@ -6682,24 +6687,7 @@ }, { "cell_type": "code", - "execution_count": 55, - "id": "d93727d9-84c8-42d7-a490-80af75a6c766", - "metadata": {}, - "outputs": [], - "source": [ - "@rule NormalMeanPrecision(:μ, Marginalisation) (q_out::Any, q_τ::Missing) = missing\n", - "@rule NormalMeanPrecision(:μ, Marginalisation) (q_out::Missing, q_τ::Any) = missing\n", - "\n", - "@rule NormalMeanPrecision(:τ, Marginalisation) (q_out::Any, q_μ::Missing) = missing\n", - "@rule NormalMeanPrecision(:τ, Marginalisation) (q_out::Missing, q_μ::Any) = missing\n", - "\n", - "@rule typeof(+)(:in1, Marginalisation) (m_out::Missing, m_in2::Any) = missing\n", - "@rule typeof(+)(:in1, Marginalisation) (m_out::Any, m_in2::Missing) = missing" - ] - }, - { - "cell_type": "code", - "execution_count": 56, + "execution_count": 36, "id": "bf69ac49-622b-4ba3-b097-ff5be6f253b8", "metadata": {}, "outputs": [], @@ -6721,7 +6709,7 @@ }, { "cell_type": "code", - "execution_count": 57, + "execution_count": 37, "id": "b9b8fd14-89a0-4b4d-877b-c90235e8542d", "metadata": {}, "outputs": [ @@ -6732,25 +6720,25 @@ " marginals form:\n", " messages form:\n", " factorisation:\n", - " q(x, P) = q(x)q(P)\n", + " q(x_prior, x, y, P) = q(x_prior, x)q(P)q(y)\n", "Options:\n", " warn = true\n" ] }, - "execution_count": 57, + "execution_count": 37, "metadata": {}, "output_type": "execute_result" } ], "source": [ "constraints = @constraints begin\n", - " q(x, P) = q(x)q(P)\n", + " q(x_prior, x, y, P) = q(x_prior, x)q(P)q(y)\n", "end" ] }, { "cell_type": "code", - "execution_count": 58, + "execution_count": 38, "id": "03a2dbf3-064d-43d9-9502-6ec44b1bac7b", "metadata": {}, "outputs": [], @@ -6769,175 +6757,183 @@ }, { "cell_type": "code", - "execution_count": 59, + "execution_count": 39, "id": "932e35b1-6e8f-4ac4-839a-f3a756ab250a", "metadata": {}, "outputs": [ { "data": { - "image/png": "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3sAMSZIrVqy4dfGciNTmpkSFykQdRvJaee2OCzdOHf3xfU/P559/vnclnzhxYtu2bUwm87///S91ZMWKFVT/ZFxc3IgRI6Kioiwv7cUXX4yOju5dTfooIiLi9ddfd8il+wEIhAA8nI1ahAqezEm69Zzc2bNnr12+xNOr3549xpP727qCUJlooK/shR0/HTrw3aOPPurj49O7wqdNm7Zjx4533nmHyWSeOnVKJBKZ5qeo1eqmpibq8d69e48cOWI0GiMjI5966ikMw86cObNjxw6NRhMUFDR//nyhUHjv3j1q/4fjx4/r9XqVSnX48OHw8PCFCxdSZba2tn700UclJSVTpkxpbm4ODw/vFDi3b99OJS+9fPny6tWrmUzmV199dfHiRT8/v7/97W/UzBqj0bhx48bLly8nJSUFBgbqdLrMzEytVmvaTEqv12/cuPH69evBwcHz58+nZgB9/fXXMTExx44du3HjRkZGhiltKUDQNQqAJbgER8C0ftNNwbXaXnT927lz54ya1qwBQaYoSAn28kzwkxs0befPn+914WKxOCUl5bvvvkMIbdq06a9//avpR6dPn968eTNCaNeuXS+++GJKSsrw4cMLCwuNRuONGzemTZsWFRU1duxYtVp97949hNCHH3548+ZNhNDhw4cff/zxH3/8MTU1devWrdQ2gSRJjhkz5sqVKyNHjvz0008XL1588eLFTpXZtGnTtGnTKisrU1JSSJKcMGHC4cOH09PTa2pqUlNTdTodQmjJkiVffPHF8OHDr1+/PmvWrP379yOECgsLV69eTRUyefLk/fv3p6WlXbhwYejQoR0dHQihDRs25ObmtrS0JCQkPPvss7t27er1Het/oEUIgEUUPHmLVmXdMuU8mXUL7K/q6+vJDr1SJOj6I6VIcL6u2tQY6p158+Zt2LBh3Lhx+/bte/vtt//3v/91OuHatWuDBw/Oycmh0WjTpk1DCN26dcvf33/27NksFis7O7trmaGhoR988AFCyNfX96mnnnr33XePHz9eUVGRl5dHo9Gys7Pvu9YQITRhwoSVK1cihA4ePFhTU3Po0CEMw3Jyci5fvrx//34qiFILLaiDnV5+9uzZ8+fPl5aWstnsGTNmREVF7dmzJycnByGUm5v7wgsvIIRqamoOHDhA/SIAQYsQAAspuFYOWjBAaDk2m43heGu7ruuPWrU6hGPd5GGxxLhx4y5durR27drMzEzztXomc+fOvXTpklKpfPzxx0+cOIEQGjNmDJ/Pl8vlM2bMuG/ryrQAUSaTUe3FgoKCAQMGULlDu65QNImPj6ceXLlypaysbPDgwYmJiYmJiVeuXCkoKCgqKhKJRKb1i3FxcZ1enp+fHxMTQ90QDMMGDx5MNVLvWyVAgRYhABZR8GQYwkhktcwdMEBouYiIiENM9omC0gmxYeb3TNdhOF9YiXNF5vvf9gKdTp85c+by5cupbsauAgICrly5kp+fv2PHjnHjxp06dSomJubw4cMVFRV79ux5+umn9Xr9zJkzzV/SKVk2QkgkEjU0NJiePqgVaxqh5PP5GRkZnaJscXFxS0uLwWCgyq+vrzctyTe9SqX6o+uipaXFdAKVQBx0BfcFAIuw6ExP9n3aCr0GA4SWGzlypFAqv32v9aOj5zW631KgNarb//3diUaSFhAS1vdNiJ577rnNmzdnZmbe96elpaVGozE8PPyll14KDAwsKyurqqrSarU+Pj6LFi1KT08vLi5+6CUyMjLy8/OPHj2KEDp06NCvv/7a/fljxoz5+eefTZ2fTU1NTU1N/v7+oaGh1BzX27dvU/v3mktJScnPz79w4QJCqLCw8KeffnrQLwVMoEUIgKUUXFmDptFapcEAoeWEQuHz//znq6+88uPd6uP5ewOlHh1GY1Fdk5HNF3j7L1++vGvzq6eoIbcH/fTTTz/duHFjSEhIbW1teHh4Zmbmrl27li5dGhYWRk0TXbNmzUMvIRKJvv766yeffLK1tTU9PX3YsGGdMrp1EhISsmHDhuzsbKVSSe1W8d1333l4eGzZsmXevHn//ve/IyIiJk6c2ClLnFwu//jjjydMmBASElJQULBq1SpHrehwIZg9k7QePHjwgw8+sGTBqUqlMiXQA5br6OjQ6/V9HC9xT5a85cpaKn4sPmaVy3EJ7ozIyVYpyrHUajWLxbKkz62pqSkwMLCxsfffJK5evfq///3v9q2bpF6HEMKZrMFJQxYvXuzr69vrMrtnNBpJkqSibEtLS0VFhUQiofY/Qgi1t7cXFxfz+XzTyg2DwYDjuCU93u3t7UFBQd9///1D944wGo1UJh0fH5+u9zkzM/Ovf/3r3LlzSZI0GAx0+m9tG71eX1JS4uvr229SteXk5DzyyCPTp0+3RXSAFiEAlpJzvXAMN5JW2ATVV+Dd90LcTUxMzPr16ysrK0tLS2k0WnBwsEhk222TzQOPQCDoNBrHYrFMW9hTHtowXblypdFoFAgEO3fuTEtLs2QHJRzHg4KCzI989dVXV65c8fX1zcvLq66unjFjBkIIwzBTFEQIEQQREhLy0MIBBQIhAJYiaISc61XZWt33onz5vVz9Dby9vb29XfVrxKxZs44cOdLW1rZ8+fKxY8f2rpCsrCyj0VhTUzNjxozs7GxqDybQFxAIAegBP6Gy74GQjtPlPJgp48KMRqPBYOi6B/1DhYaGmrZP6jWZTDZ37txuTjAYDCRJmjcQQfdg1igAPeAn8On7mgdvnowOexA6h08//XSmmSVLljzozB07dpiye+/evbvX7TlKXV3d4cOHLT9fr9djGNbW1mZ+UKPRYBim0Wg6nfzmm28+88wzXQuRSCR37tzpdHD9+vWdFn703Z07d86ePdv9OdevX++aDcBR4L8RgB7gElwRy/OepuHhpz6YUgD9os7iwoULLS0t8+fPp552M41z1qxZVVVV1EyZlJQU0571vXPz5s3nnnvu6tWrfSnkQXJycqi5rI7y/fffnzx5csuWLd2c880337S0tHRNCOAQEAgB6BlfgU9fAiGGYUq+qw5x9UtBQUHTp083P0KS5ObNm6kFfzExMc8+++xHH31kNBpXrlzJ4XCeeOKJjo6OwsLCYcOGqdXq119//Yknnvjggw/0ev3SpUslEsl7771XXV09b968tLQ0hFBZWdmWLVtu3rwpFov/8pe/xMXFGQyG9evXV1dXUwnPVq1aRaPRzp8//80336hUqsmTJ48bN46qyZUrVz799FMMw5588skH1b+0tHT9+vVqtfqxxx4bMmQIQqi2tlalUlEx5s6dOx999JFare5Uwueff37s2LGoqCjzaaVtbW3r1q27ceNGSEjIkiVLeDweQuiNN96YOXPmpk2bqqqqpk2bNn78+E4VqKqq+vDDD4uLi8Vi8axZs3x9fb/99tvy8vIXXnhBKpU+99xz586d2717d1VVVUBAwKJFi6RSaX5+/k8//aTVal944YXAwECqbtu3b//pp5/4fP7jjz/exwwJPQVdowD0jL9A2ZeXSzkSLsF5+HnAXlpbW0t+V1dXhxD68ssv16xZM3Xq1JycHGr3iYiICAzDYmNjExISBALBjRs3vvji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", + "image/png": "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CD377LO5ubnHjx/vkk/BgEKhGLcIe0IQBJfL7bve4E80Gg0CYb8QBIHjeO9dowihcEpofsvdQR5LyvEUe7hCru0+L0yX+QRqNBoqldrfn+N0On3atGmDP3pGRkZGRm+LVqrVakP/rcugUChcLpf6Jwvu2dx9GVrfPTl27JhOp8vOzu5zVxqNBsbLAJchYgl5dG6belCNOR+uU7ZvXEBra+vTTz9tXLJs2bK0tLTuW+bl5alUKkMfWEJCwkcffTR27NgBH/rcuXMhISHmT2lfs2aNSqXatGmTceGqVauQqR47NptdVVXVpXf0ww8/vHLlyu7du7tsLJfLT548GR0d3b8/oFeHDh3KyMjo5YYxQRD79u2bPn26I/w2sti0ku3bty9YsMD4T9qxY8drr72GEGpubv7000/v3LlTVFT0xhtv3L1715x4CYCz8OMPdjyCL19ukZqA/lIqlV9//fWkSZNm/ykwMNDklvv379++fbvh6bvvvjvIyLFu3TpDRlOL27t3r30X6X366acrKip62YAgiNmzZysUCptVqReWaV0qlUqVStVlLS6CIMj7KziO//DDD++++65er4+NjT19+rTLDGQCACHkx/cZTK41No0ltujEfNBfDz30UJfGU2lp6datWysqKjw9PRcsWMBms0+cOKFQKFatWuXv779s2bLCwsKwsDCJRHLo0CEWi1VcXHzx4sXhw4cvW7bs+++/37dvX3Bw8Msvv0yuKX/w4MGzZ8+2tLQkJiYuXryYTqf/8MMP9+/fJyfLZ2RkZGVlqVSqTz/99NatW/7+/itWrBAKhQghnU738ccfX79+PSUlpad5igRB7N69+9SpU1FRUWT2bYTQ7du3s7Ky6HQ6QRA7duy4cOHCkCFDjN9VXFz80Ucftbe3d2kQnz9//ptvvlGpVDNnziR7X69cuVJYWCgWi7/++mtfX9+XXnpJIBB0qcOBAweOHTum0WiioqJeeOGFr776qr29/Z///KdYLH7sscdCQ0N37959/fp1CoWSnZ1NzqP7+OOPEUJr165lMBhPP/10SEhIRUXFZ599VlFRkZyc/NRTT9my49AyLUImk3n06NEu0wcXLVpEdqjy+fwDBw7cuXOnsLDwwIEDhizsALgGL46UQR34/ZggD38MwcgveyovLy/9k1qtRgiNGzdOJBItXLhw2LBh5eXlfD5fLpd7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", "image/svg+xml": [ "\n", "\n", "\n", - " \n", + " \n", " \n", " \n", "\n", - "\n", + "\n", "\n", - " \n", + " \n", " \n", " \n", "\n", - "\n", + "\n", "\n", - " \n", - " \n", + " \n", + " \n", " \n", "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n" + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n" ], "text/html": [ "\n", "\n", "\n", - " \n", + " \n", " \n", " \n", "\n", - "\n", + "\n", "\n", - " \n", + " \n", " \n", " \n", "\n", - "\n", + "\n", "\n", - " \n", - " \n", + " \n", + " \n", " \n", "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n" + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n" ] }, - "execution_count": 59, + "execution_count": 39, "metadata": {}, "output_type": "execute_result" } @@ -6947,19 +6943,11 @@ "scatter!(missing_indices, real_signal[missing_indices], ms = 2, opacity = 0.75, label = \"Missing region\")\n", "plot!(mean.(result.posteriors[:x]), ribbon = var.(result.posteriors[:x]), label = \"Estimated hidden state\")" ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "5604e8b9-c99d-4dcf-a105-0eefd58f176c", - "metadata": {}, - "outputs": [], - "source": [] } ], "metadata": { "kernelspec": { - "display_name": "Julia 1.9.1", + "display_name": "Julia 1.9.3", "language": "julia", "name": "julia-1.9" }, @@ -6967,7 +6955,7 @@ "file_extension": ".jl", "mimetype": "application/julia", "name": "julia", - "version": "1.9.1" + "version": "1.9.3" } }, "nbformat": 4, From 47ccf2bed68906b28daff1e8a30a4b501bc38db6 Mon Sep 17 00:00:00 2001 From: Bagaev Dmitry Date: Tue, 19 Sep 2023 11:54:02 +0200 Subject: [PATCH 24/24] update: Bump version to 2.12.0 --- Project.toml | 4 ++-- codemeta.json | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Project.toml b/Project.toml index 28a3c465b..d4ff25ff1 100644 --- a/Project.toml +++ b/Project.toml @@ -2,7 +2,7 @@ name = "RxInfer" uuid = "86711068-29c9-4ff7-b620-ae75d7495b3d" authors = ["Bagaev Dmitry and contributors"] # Do not forget to update the version in the `codemeta.json` too -version = "2.11.3" +version = "2.12.0" [deps] DataStructures = "864edb3b-99cc-5e75-8d2d-829cb0a9cfe8" @@ -27,7 +27,7 @@ GraphPPL = "3.1.0" MacroTools = "0.5.6" Optim = "1.0.0" ProgressMeter = "1.0.0" -ReactiveMP = "~3.9.0" +ReactiveMP = "~3.10.0" Reexport = "1.2.0" Rocket = "1.7.0" TupleTools = "1.2.0" diff --git a/codemeta.json b/codemeta.json index 45ba6a378..8894f0051 100644 --- a/codemeta.json +++ b/codemeta.json @@ -9,12 +9,12 @@ "downloadUrl": "https://github.com/biaslab/RxInfer.jl/releases", "issueTracker": "https://github.com/biaslab/RxInfer.jl/issues", "name": "RxInfer.jl", - "version": "2.11.3", + "version": "2.12.0", "description": "Julia package for automated, scalable and efficient Bayesian inference on factor graphs with reactive message passing. ", "applicationCategory": "Statistics", "developmentStatus": "active", "readme": "https://biaslab.github.io/RxInfer.jl/stable/", - "softwareVersion": "2.11.3", + "softwareVersion": "2.12.0", "keywords": [ "Bayesian inference", "message passing",