From 8268244f843e8f16b436a4fd643e6fce316b34f6 Mon Sep 17 00:00:00 2001 From: FHoltorf <32248677+FHoltorf@users.noreply.github.com> Date: Wed, 20 Jul 2022 11:43:34 -0400 Subject: [PATCH 01/62] develop automated polynomial chaos transformations --- Project.toml | 5 +++++ src/ModelOrderReduction.jl | 8 +++++++- test/PolyChaos.jl | 0 3 files changed, 12 insertions(+), 1 deletion(-) create mode 100644 test/PolyChaos.jl diff --git a/Project.toml b/Project.toml index 7af4146..ec7dab3 100644 --- a/Project.toml +++ b/Project.toml @@ -3,6 +3,11 @@ uuid = "207801d6-6cee-43a9-ad0c-f0c64933efa0" authors = ["Bowen S. Zhu"] version = "0.1.0" +[deps] +PolyChaos = "8d666b04-775d-5f6e-b778-5ac7c70f65a3" +SymbolicUtils = "d1185830-fcd6-423d-90d6-eec64667417b" +Symbolics = "0c5d862f-8b57-4792-8d23-62f2024744c7" + [compat] julia = "1.6" diff --git a/src/ModelOrderReduction.jl b/src/ModelOrderReduction.jl index 5ae21ae..d64f900 100644 --- a/src/ModelOrderReduction.jl +++ b/src/ModelOrderReduction.jl @@ -1,5 +1,11 @@ module ModelOrderReduction -# Write your package code here. +using PolyChaos, Symbolics, SymbolicUtils + + +function generate_PCE_equations() + +end + end diff --git a/test/PolyChaos.jl b/test/PolyChaos.jl new file mode 100644 index 0000000..e69de29 From 413523ec928b968cdcd56a5295d10120084853d2 Mon Sep 17 00:00:00 2001 From: FHoltorf <32248677+FHoltorf@users.noreply.github.com> Date: Tue, 20 Sep 2022 20:57:02 -0400 Subject: [PATCH 02/62] outline of mathematical approach for polynomial models --- test/PolyChaos.jl | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/test/PolyChaos.jl b/test/PolyChaos.jl index e69de29..ddbdcff 100644 --- a/test/PolyChaos.jl +++ b/test/PolyChaos.jl @@ -0,0 +1,32 @@ +using Symbolics + +# polynomial transformations +# given two polynomial bases ξ₁(x) and ξ₂(x), we identify both polynomials simply by +# p(x) = a'ξ₁(x) = b'ξ₂(x) +# often we wish to compute b from a. +# to do so we only need to find T such that Tξ₁ = ξ₂. +# A convenient way is to expand both ξ₁ and ξ₂ in the monomial basis: Aξ₁ = Bξ₂ = ξ₃ +# Then T = B⁻¹A. +# Typically one chooses the monomial basis as A and B are remarkably easy to find in that case. +# That, however, comes at the cost of poor numerical conditioning of the A and B and hence potential +# issues arise in the computation of T = B⁻¹A. + +# For PCE a natural workflow is obtained as +# give f(x,p,t) = [f1(x,p,t), ..., fN(x,p,t)] +# choose polynomial basis ξ(p) = [ξ1(p1), ..., ξK(p1)] ⨂ ⋯ ⨂ [ξ1(pL), ..., ξK(pL)] => this contains redundant terms >:( +# choose solution ansatz x(p,t) = [x1(p,t), ..., xN(p,t)] = C(t)ξ(p) +# by asumption dC(t)/dt ξ(p) = f(C(t)ξ(p), p, t) +# => ∫ dC(t)/dt ξ(p) ξ'(p) dρ(p) = dC(t)/dt ∫ ξ(p) ξ'(p) dρ(p) = ∫ f(C(t)ξ(p), p, t) ξ'(p) dρ(p) +# If ξ(p) is orthogonal with respect to ρ(p) then ∫ ξ(p) ξ'(p) dρ(p) = I +# so dC(t)/dt = ∫ f(C(t)ξ(p), p, t) ξ'(p) dρ(p) +# We therefore need to evaluate the right-hand-side. +# In general this is very hard. Here we are going to make this easy by assuming that +# fi(x,p,t) = (f̂i)' (qi(x) ⨂ ri(p)) +# with qi(x) being itself a polynomial basis +# then we evaluate Wi(C(t)) vi(p) = qi(C(t)ξ(p)) ⨂ ri(p) +# and transform vi(p) = [Gi, Git] [ξ(p); ξt(p)] to arrive at +# fi(x,p,t) = (f̂i)'Wi(C(t))[Gi, Git] [ξ(p); ξt(p)] +# then ∫ fi(C(t)ξ(p), p, t) ξ'(p) dρ(p) = (f̂i)'Wi(C(t))[Gi, Git] ∫ [ξ(p); ξt(p)] ξ'(p) dρ(p) +# where ∫ [ξ(p); ξt(p)] ξ'(p) dρ(p) = [I; 0] +# so that eᵢ'dC/dt = (f̂i)'Wi(C(t)) Gi (ith row) + From 5910a0430858d7552107ec765e92e17ef93d35a8 Mon Sep 17 00:00:00 2001 From: FHoltorf <32248677+FHoltorf@users.noreply.github.com> Date: Sun, 25 Sep 2022 10:40:34 -0400 Subject: [PATCH 03/62] introduce PCE type and associated utilities --- Project.toml | 5 +++ src/ModelOrderReduction.jl | 9 +---- src/PCE.jl | 69 ++++++++++++++++++++++++++++++++++++++ src/PCE_utils.jl | 16 +++++++++ test/polychaos_tests.jl | 20 +++++++++++ test/runtests.jl | 2 +- 6 files changed, 112 insertions(+), 9 deletions(-) create mode 100644 src/PCE.jl create mode 100644 src/PCE_utils.jl create mode 100644 test/polychaos_tests.jl diff --git a/Project.toml b/Project.toml index ec7dab3..ce75c5a 100644 --- a/Project.toml +++ b/Project.toml @@ -4,7 +4,12 @@ authors = ["Bowen S. Zhu"] version = "0.1.0" [deps] +LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" +ModelingToolkit = "961ee093-0014-501f-94e3-6117800e7a78" +OrderedCollections = "bac558e1-5e72-5ebc-8fee-abe8a469f55d" PolyChaos = "8d666b04-775d-5f6e-b778-5ac7c70f65a3" +Revise = "295af30f-e4ad-537b-8983-00126c2a3abe" +Setfield = "efcf1570-3423-57d1-acb7-fd33fddbac46" SymbolicUtils = "d1185830-fcd6-423d-90d6-eec64667417b" Symbolics = "0c5d862f-8b57-4792-8d23-62f2024744c7" diff --git a/src/ModelOrderReduction.jl b/src/ModelOrderReduction.jl index d64f900..f775ac1 100644 --- a/src/ModelOrderReduction.jl +++ b/src/ModelOrderReduction.jl @@ -1,11 +1,4 @@ module ModelOrderReduction -using PolyChaos, Symbolics, SymbolicUtils - - -function generate_PCE_equations() - -end - - +include("PCE.jl") end diff --git a/src/PCE.jl b/src/PCE.jl new file mode 100644 index 0000000..39a6e99 --- /dev/null +++ b/src/PCE.jl @@ -0,0 +1,69 @@ +using PolyChaos, Symbolics, ModelingToolkit, LinearAlgebra + +# for now only consider tensor grid bases +# with degree equal across all bases +# need to adjust in PolyChaos +struct PCE + states # states + parameters # vector of parameters being expanded + bases # vector of pairs: p (symbolic variable) => polynomial basis (PolyChaos) + bases_dict # dictionary generated from bases + sym_basis # vector of basis functions (symbolic variables) !![indexing as generated by PolyChaos]!! + pc_basis # polychaos basis object + sym_to_pc # dictionary mapping symbolic to pc basis + pc_to_sym # dictionary mapping pc to symbolic basis + ansatz # vector of pairs: x(t,p) => ∑ᵢ cᵢ(t)ξᵢ(p) + moments # matrix (?) of symbolic variables: cᵢ(t) +end +function PCE(states, bases::AbstractVector{<:Pair}) + # to deal with symbolic arrays + states = collect(states) + + bases_dict = Dict(bases) + parameters = [p for (p, op) in bases] + ops = [op for (p, op) in bases] + degs = [deg(op) for op in ops] + min_deg = minimum(degs) + if !(allequal(degs)) + @warn "Currently only bases with identical degrees are supported. Proceed with minimum common degree = $min_deg" + end + pc_basis = MultiOrthoPoly(ops, min_deg) + n_basis = size(pc_basis.ind,1) + n_states = length(states) + + @variables ζ(parameters...)[1:n_basis] + sym_basis = collect(ζ) + + sym_to_pc = Dict(ζ[i] => pc_basis.ind[i,:] for i in eachindex(ζ)) + pc_to_sym = Dict(val => key for (val, key) in sym_to_pc) + + moments = [] + for (i,state) in enumerate(collect(states)) + moment_name = Symbol("z" * Symbolics.map_subscripts(i)) + ind_vars = get_independent_vars(state) + if isempty(ind_vars) + pce_coeffs = @variables $(moment_name)[1:n_basis] + else + pce_coeffs = @variables $(moment_name)(ind_vars...)[1:n_basis] + end + push!(moments, collect(pce_coeffs[1])) + end + ansatz = [states[i] => sum(moments[i][j]*sym_basis[j] for j in 1:n_basis) for i in 1:n_states] + return PCE(states, parameters, bases, bases_dict, sym_basis, pc_basis, sym_to_pc, pc_to_sym, ansatz, moments) +end +function (pce::PCE)(moment_vals, parameter_vals::AbstractMatrix) + # wasteful => should implement my own version of this + # this evaluates each polynomial via recurrence relation from scratch + # can reuse many results. + # fine for now. + basis = evaluate(parameter_vals, pce.pc_basis) + return [dot(moments,basis) for moments in moment_vals] +end +function (pce::PCE)(moment_vals, parameter_vals::AbstractVector) + return pce(moment_vals, reshape(parameter_vals,1,length(parameter_vals))) +end +function (pce::PCE)(moment_vals, parameter_vals::Number) + return pce(moment_vals, reshape([parameter_vals],1,1)) +end + + diff --git a/src/PCE_utils.jl b/src/PCE_utils.jl new file mode 100644 index 0000000..e97521d --- /dev/null +++ b/src/PCE_utils.jl @@ -0,0 +1,16 @@ +function get_independent_vars(var) + return [] +end +function get_independent_vars(var::Symbolics.Term) where T + if operation(var) isa Symbolics.Sym + return arguments(var) + else + return reduce(vcat, get_independent_vars(arguments(var))) + end +end +function get_independent_vars(var::Num) + return get_independent_vars(Symbolics.unwrap(var)) +end +function get_independent_vars(vars::AbstractVector) + return [get_independent_vars(var) for var in vars] +end \ No newline at end of file diff --git a/test/polychaos_tests.jl b/test/polychaos_tests.jl new file mode 100644 index 0000000..61fb408 --- /dev/null +++ b/test/polychaos_tests.jl @@ -0,0 +1,20 @@ +using Test +using ModelOrderReduction, Symbolics, PolyChaos +MO = ModelOrderReduction + +# testing extraction of independent variables +@variables t, z, u(t), v(t)[1:4], w(t,z), x(t,z)[1:4] + +@test isequal(MO.get_independent_vars(u), [t]) +@test isequal(MO.get_independent_vars(v[1]), [t]) +@test isequal(MO.get_independent_vars(v[2]), [t]) +@test isequal(MO.get_independent_vars(w),[t,z]) +@test isequal(MO.get_independent_vars(x[2]),[t,z]) +@test isequal(MO.get_independent_vars(collect(v)), [[t] for i in 1:length(v)]) +@test isequal(MO.get_independent_vars(collect(x)), [[t,z] for i in 1:length(v)]) + +# testing PCE expansion generation +@parameters a +@variables t, x(t) +D = Differential(t) +test_equation = [D(x) ~ a*x] diff --git a/test/runtests.jl b/test/runtests.jl index 1f356e7..f3c0e69 100644 --- a/test/runtests.jl +++ b/test/runtests.jl @@ -2,5 +2,5 @@ using ModelOrderReduction using Test @testset "ModelOrderReduction.jl" begin - # Write your tests here. + include("polychaos_tests.jl") end From b5d42d8c367ead26418e39b60b316c509df1432c Mon Sep 17 00:00:00 2001 From: FHoltorf <32248677+FHoltorf@users.noreply.github.com> Date: Sun, 25 Sep 2022 10:41:54 -0400 Subject: [PATCH 04/62] forgot to include PCE_utils.jl --- src/PCE.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/PCE.jl b/src/PCE.jl index 39a6e99..040e1d9 100644 --- a/src/PCE.jl +++ b/src/PCE.jl @@ -1,5 +1,6 @@ using PolyChaos, Symbolics, ModelingToolkit, LinearAlgebra +include("PCE_utils.jl") # for now only consider tensor grid bases # with degree equal across all bases # need to adjust in PolyChaos @@ -66,4 +67,3 @@ function (pce::PCE)(moment_vals, parameter_vals::Number) return pce(moment_vals, reshape([parameter_vals],1,1)) end - From 1611efcd02bf90e698cc3107b593b70215893067 Mon Sep 17 00:00:00 2001 From: FHoltorf <32248677+FHoltorf@users.noreply.github.com> Date: Sun, 25 Sep 2022 10:44:50 -0400 Subject: [PATCH 05/62] symbolic pipeline to apply PCE ansatz to equations + Roadmap --- src/PCE.jl | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/src/PCE.jl b/src/PCE.jl index 040e1d9..b734a54 100644 --- a/src/PCE.jl +++ b/src/PCE.jl @@ -67,3 +67,33 @@ function (pce::PCE)(moment_vals, parameter_vals::Number) return pce(moment_vals, reshape([parameter_vals],1,1)) end +# 1. apply PCE ansatz +function generate_parameter_pce(pce::PCE) + par_dim = length(pce.parameters) + par_pce = Vector{Pair{eltype(pce.parameters), eltype(pce.sym_basis)}}(undef, par_dim) + for (i, bases) in enumerate(pce.bases) + p, op = bases + par_pce[i] = p => pce.sym_basis[i+1] + op.α[1] + end + return par_pce +end +function substitute_parameters(eqs::AbstractVector, pce::PCE) + par_pce = generate_parameter_pce(pce) + subs_eqs = [substitute(eq, par_pce) for eq in eqs] + return subs_eqs +end +function substitute_pce_ansatz(eqs::AbstractVector, pce::PCE) + subs_eqs = [expand(expand(substitute(eq, pce.ansatz))) for eq in eqs] + return subs_eqs +end +function apply_ansatz(eqs::AbstractVector, pce::PCE) + return substitute_pce_ansatz(substitute_parameters(eqs, pce), pce) +end + +# 2. extract PCE expansion coeffs + +# 3. compute inner products + +# 4. Galerkin projection + +# 5. combine everything to high-level interface From ee6aa9eed7509aca4a2609698b87a45f083e9ae1 Mon Sep 17 00:00:00 2001 From: FHoltorf <32248677+FHoltorf@users.noreply.github.com> Date: Sun, 25 Sep 2022 10:52:40 -0400 Subject: [PATCH 06/62] tests for PCE (+ export PCE type) --- src/PCE.jl | 2 ++ test/polychaos_tests.jl | 9 ++++++++- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/src/PCE.jl b/src/PCE.jl index b734a54..67f79a7 100644 --- a/src/PCE.jl +++ b/src/PCE.jl @@ -1,5 +1,7 @@ using PolyChaos, Symbolics, ModelingToolkit, LinearAlgebra +export PCE + include("PCE_utils.jl") # for now only consider tensor grid bases # with degree equal across all bases diff --git a/test/polychaos_tests.jl b/test/polychaos_tests.jl index 61fb408..fcdb890 100644 --- a/test/polychaos_tests.jl +++ b/test/polychaos_tests.jl @@ -13,8 +13,15 @@ MO = ModelOrderReduction @test isequal(MO.get_independent_vars(collect(v)), [[t] for i in 1:length(v)]) @test isequal(MO.get_independent_vars(collect(x)), [[t,z] for i in 1:length(v)]) -# testing PCE expansion generation +# test equation for throughout: @parameters a @variables t, x(t) D = Differential(t) test_equation = [D(x) ~ a*x] + +# test PCE generation +bases = [a => GaussOrthoPoly(4)] +pce = PCE([x], bases) +@test length(pce.moments[1]) == 5 +@test length(pce.sym_basis) == 5 +@test isequal(pce.parameters, [a]) From 0c9a505c5b1ee22f3cf6b2b8234869ebb93dc02c Mon Sep 17 00:00:00 2001 From: FHoltorf <32248677+FHoltorf@users.noreply.github.com> Date: Sun, 25 Sep 2022 10:56:04 -0400 Subject: [PATCH 07/62] extracting PCE expansion coefficients after applying PCE ansatz --- src/PCE.jl | 8 +++++++ src/PCE_utils.jl | 57 +++++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 64 insertions(+), 1 deletion(-) diff --git a/src/PCE.jl b/src/PCE.jl index 67f79a7..87fffee 100644 --- a/src/PCE.jl +++ b/src/PCE.jl @@ -93,6 +93,14 @@ function apply_ansatz(eqs::AbstractVector, pce::PCE) end # 2. extract PCE expansion coeffs +function extract_basismonomial_coeffs(eqs::AbstractVector, pce::PCE) + basismonomial_coeffs = [extract_coeffs(eq, pce.sym_basis) for eq in eqs] + basismonomial_indices = [] + for coeffs in basismonomial_coeffs + union!(basismonomial_indices, [mono => get_basis_indices(mono) for mono in keys(coeffs)]) + end + return basismonomial_coeffs, basismonomial_indices +end # 3. compute inner products diff --git a/src/PCE_utils.jl b/src/PCE_utils.jl index e97521d..af3c053 100644 --- a/src/PCE_utils.jl +++ b/src/PCE_utils.jl @@ -1,3 +1,4 @@ +# getting independent variables function get_independent_vars(var) return [] end @@ -13,4 +14,58 @@ function get_independent_vars(var::Num) end function get_independent_vars(vars::AbstractVector) return [get_independent_vars(var) for var in vars] -end \ No newline at end of file +end + +# utiltiites to extracting coefficients of a polynomial in monomial basis in variables `vars` +function split_term(term::Symbolics.Mul, vars) + coeff = term.coeff + mono = Num(1.0) + for var in keys(term.dict) + if var in vars + mono *= var^term.dict[var] + else + coeff *= var^term.dict[var] + end + end + return coeff, mono +end + +function split_term(term::Symbolics.Pow, vars) + if term.base in vars + return 1.0, term + else + return term, 1.0 + end +end + +function split_term(term::T, vars) where T <: Union{Symbolics.Term, Symbolics.Sym} + if term in vars + return 1.0, term + else + return term, 1.0 + end +end + +function extract_coeffs(expr::Symbolics.Add, vars::Set) + coeffs = Dict() + for term in keys(expr.dict) + num_coeff = expr.dict[term] + var_coeff, mono = split_term(term, vars) + try + coeffs[mono] += num_coeff*var_coeff + catch + coeffs[mono] = num_coeff*var_coeff + end + end + return coeffs +end + +function extract_coeffs(expr::Symbolics.Mul, vars::Set) + coeff, mono = split_term(expr, vars) + return Dict(mono => coeff) +end + +extract_coeffs(expr::Num, vars::Set) = extract_coeffs(Symbolics.unwrap.(expr), vars) +extract_coeffs(expr::Num, vars::AbstractArray) = extract_coeffs(Symbolics.unwrap.(expr), vars) +extract_coeffs(expr, vars::AbstractArray{<:Num}) = extract_coeffs(expr, Symbolics.unwrap.(vars)) +extract_coeffs(expr, vars::AbstractArray) = extract_coeffs(expr, Set(vars)) \ No newline at end of file From 183f3dbd280059af60d213dbc304fd1bde5ac697 Mon Sep 17 00:00:00 2001 From: FHoltorf <32248677+FHoltorf@users.noreply.github.com> Date: Sun, 25 Sep 2022 11:00:45 -0400 Subject: [PATCH 08/62] test for ansatz application --- test/polychaos_tests.jl | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/test/polychaos_tests.jl b/test/polychaos_tests.jl index fcdb890..b4c79fd 100644 --- a/test/polychaos_tests.jl +++ b/test/polychaos_tests.jl @@ -1,5 +1,5 @@ using Test -using ModelOrderReduction, Symbolics, PolyChaos +using ModelOrderReduction, Symbolics, PolyChaos, LinearAlgebra MO = ModelOrderReduction # testing extraction of independent variables @@ -25,3 +25,9 @@ pce = PCE([x], bases) @test length(pce.moments[1]) == 5 @test length(pce.sym_basis) == 5 @test isequal(pce.parameters, [a]) + +# test PCE ansatz application +eq = [eq.rhs for eq in test_equation] +pce_eq = MO.apply_ansatz(eq, pce)[1] +true_eq = pce.sym_basis[2]*dot(pce.moments[1],pce.sym_basis) +@test isequal(pce_eq, expand(true_eq)) \ No newline at end of file From 01f4f4865c161dc9ae052d3249ae37303943042f Mon Sep 17 00:00:00 2001 From: FHoltorf <32248677+FHoltorf@users.noreply.github.com> Date: Sun, 25 Sep 2022 11:17:35 -0400 Subject: [PATCH 09/62] introduce utilities to extract the basis indices (perhaps I should just generate a dict in the beginnign?) --- src/PCE_utils.jl | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/src/PCE_utils.jl b/src/PCE_utils.jl index af3c053..9c48a93 100644 --- a/src/PCE_utils.jl +++ b/src/PCE_utils.jl @@ -68,4 +68,21 @@ end extract_coeffs(expr::Num, vars::Set) = extract_coeffs(Symbolics.unwrap.(expr), vars) extract_coeffs(expr::Num, vars::AbstractArray) = extract_coeffs(Symbolics.unwrap.(expr), vars) extract_coeffs(expr, vars::AbstractArray{<:Num}) = extract_coeffs(expr, Symbolics.unwrap.(vars)) -extract_coeffs(expr, vars::AbstractArray) = extract_coeffs(expr, Set(vars)) \ No newline at end of file +extract_coeffs(expr, vars::AbstractArray) = extract_coeffs(expr, Set(vars)) + +function get_basis_indices(mono::Symbolics.Mul) + basis_indices = Int[] + for (term, pow) in mono.dict + append!(basis_indices, (arguments(term)[end] - 1)*ones(Int, pow)) + end + return basis_indices +end +function get_basis_indices(mono::Symbolics.Term) + return [arguments(mono)[end] - 1] +end +function get_basis_indices(mono::Symbolics.Pow) + return (arguments(mono.base)[end] - 1)*ones(Int, mono.exp) +end +function get_basis_indices(mono::Num) + return get_basis_indices(Symbolics.unwrap(mono)) +end \ No newline at end of file From 745326547b48f4c46a5f951f3e9bd498eac78480 Mon Sep 17 00:00:00 2001 From: FHoltorf <32248677+FHoltorf@users.noreply.github.com> Date: Sun, 25 Sep 2022 11:25:09 -0400 Subject: [PATCH 10/62] test monomial extraction --- test/polychaos_tests.jl | 25 ++++++++++++++++++++----- 1 file changed, 20 insertions(+), 5 deletions(-) diff --git a/test/polychaos_tests.jl b/test/polychaos_tests.jl index b4c79fd..36d8afe 100644 --- a/test/polychaos_tests.jl +++ b/test/polychaos_tests.jl @@ -20,14 +20,29 @@ D = Differential(t) test_equation = [D(x) ~ a*x] # test PCE generation -bases = [a => GaussOrthoPoly(4)] +n = 5 +bases = [a => GaussOrthoPoly(n)] pce = PCE([x], bases) -@test length(pce.moments[1]) == 5 -@test length(pce.sym_basis) == 5 +@test length(pce.moments[1]) == n + 1 +@test length(pce.sym_basis) == n + 1 @test isequal(pce.parameters, [a]) # test PCE ansatz application eq = [eq.rhs for eq in test_equation] pce_eq = MO.apply_ansatz(eq, pce)[1] -true_eq = pce.sym_basis[2]*dot(pce.moments[1],pce.sym_basis) -@test isequal(pce_eq, expand(true_eq)) \ No newline at end of file +true_eq = expand(pce.sym_basis[2]*dot(pce.moments[1],pce.sym_basis)) +@test isequal(pce_eq, true_eq) + +# test extraction of monomial coefficients +coeffs = Dict(pce.sym_basis[i]*pce.sym_basis[2] => pce.moments[1][i] for i in 2:n+1) +extracted_coeffs = MO.extract_coeffs(pce_eq, pce.sym_basis) +@test all(isequal(coeffs[mono],extracted_coeffs[mono]) for mono in keys(coeffs)) + +basis_indices = Dict([pce.sym_basis[i]*pce.sym_basis[2] => ([i-1, 1], [1,i-1]) for i in 2:n+1]) +extracted_coeffs, extracted_basis_indices = MO.extract_basismonomial_coeffs([pce_eq], pce) +extracted_basis_indices = Dict(extracted_basis_indices) +test1 = [isequal(basis_indices[mono][1], extracted_basis_indices[mono]) for mono in keys(basis_indices)] +test2 = [isequal(basis_indices[mono][2], extracted_basis_indices[mono]) for mono in keys(basis_indices)] +@test all(test1 + test2 .>= 1) + + From bf049ac8c7d5ed82edf2930a0ce77211e814aa64 Mon Sep 17 00:00:00 2001 From: FHoltorf <32248677+FHoltorf@users.noreply.github.com> Date: Sun, 25 Sep 2022 11:29:29 -0400 Subject: [PATCH 11/62] evaluating inner products for galerkin projection --- src/PCE.jl | 18 ++++++ src/PCE_utils.jl | 145 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 163 insertions(+) diff --git a/src/PCE.jl b/src/PCE.jl index 87fffee..6dc2219 100644 --- a/src/PCE.jl +++ b/src/PCE.jl @@ -103,6 +103,24 @@ function extract_basismonomial_coeffs(eqs::AbstractVector, pce::PCE) end # 3. compute inner products +function maximum_degree(mono_indices::AbstractVector, pce::PCE) + max_degree = 0 + for (mono, ind) in mono_indices + max_degree = max(max_degree, maximum(sum(ind[i]*pce.pc_basis.ind[i+1] for i in eachindex(ind)))) + end + return max_degree +end +function eval_scalar_products(mono_indices, pce::PCE) + max_degree = maximum_degree(mono_indices, pce) + degree_quadrature = ceil(Int, 0.5 * (max_degree + deg(pce.pc_basis) + 1)) + integrator_pce = bump_degree(pce.pc_basis, degree_quadrature) + + scalar_products = Dict() + for k in 1:dim(pce.pc_basis) + scalar_products[k] = Dict([mono => computeSP([ind..., k-1], integrator_pce) for (mono, ind) in mono_indices]) + end + return scalar_products +end # 4. Galerkin projection diff --git a/src/PCE_utils.jl b/src/PCE_utils.jl index 9c48a93..0485e94 100644 --- a/src/PCE_utils.jl +++ b/src/PCE_utils.jl @@ -70,6 +70,7 @@ extract_coeffs(expr::Num, vars::AbstractArray) = extract_coeffs(Symbolics.unwrap extract_coeffs(expr, vars::AbstractArray{<:Num}) = extract_coeffs(expr, Symbolics.unwrap.(vars)) extract_coeffs(expr, vars::AbstractArray) = extract_coeffs(expr, Set(vars)) +# extracting the indices of the factors of as basismonomial function get_basis_indices(mono::Symbolics.Mul) basis_indices = Int[] for (term, pow) in mono.dict @@ -85,4 +86,148 @@ function get_basis_indices(mono::Symbolics.Pow) end function get_basis_indices(mono::Num) return get_basis_indices(Symbolics.unwrap(mono)) +end + +# bumping the degree of a PolyChaos OrthoPoly object up to ensure exact integration +measure_parameters(m::AbstractMeasure) = [] +measure_parameters(m::Measure) = m.pars +measure_parameters(m::JacobiMeasure) = [m.ashapeParameter, m.bshapeParameter] +measure_parameters(m::genLaguerreMeasure) = [m.shapeParameter] +measure_parameters(m::genHermiteMeasure) = [m.muParameter] +measure_parameters(m::MeixnerPollaczekMeasure) = [m.λParameter, m.ϕParameter] +measure_parameters(m::Beta01Measure) = [m.ashapeParameter, m.bshapeParameter] +measure_parameters(m::GammaMeasure) = [m.shapeParameter, m.rateParameter] + +recursion_coeffs(m::JacobiMeasure, deg::Int) = rm_jacobi(deg+1, m.ashapeParameter, m.bshapeParameter) +function OrthoPoly(m::JacobiMeasure, deg::Int) + α, β = recursion_coeffs(m, deg) + return JacobiOrthoPoly(deg, α, β, m) +end +function bump_degree(op::JacobiOrthoPoly, deg::Int) + ps = measure_parameters(op.measure) + return JacobiOrthoPoly(deg, ps...) +end + +recursion_coeffs(m::genLaguerreMeasure, deg::Int) = rm_laguerre(deg+1, m.shapeParameter) +function OrthoPoly(m::genLaguerreMeasure, deg::Int) + α, β = recursion_coeffs(m, deg) + return genLaguerreOrthoPoly(deg, α, β, m) +end +function bump_degree(op::genLaguerreOrthoPoly, deg::Int) + ps = measure_parameters(op.measure) + return genLaguerreorthoPoly(deg, ps...) +end + +recursion_coeffs(m::MeixnerPollaczekMeasure, deg::Int) = rm_meixner_pollaczek(deg+1, m.λParameter, m.ϕParameter) +function OrthoPoly(m::MeixnerPollaczekMeasure, deg::Int) + α, β = recursion_coeffs(m, deg) + return MeixnerPollaczekOrthoPoly(deg, α, β, m) +end +function bump_degree(op::MeixnerPollaczekOrthoPoly, deg::Int) + ps = measure_parameters(op.measure) + return MeixnerPollaczekOrthoPoly(deg, ps...) +end + +recursion_coeffs(m::Beta01Measure, deg::Int) = r_scale(1 / beta(m.ashapeParameter, m.bshapeParameter), rm_jacobi01(deg + 1, m.bshapeParameter - 1.0, m.ashapeParameter - 1.0)...) +function OrthoPoly(m::Beta01Measure, deg::Int) + α, β = recursion_coeffs(m, deg) + return Beta01OrthoPoly(deg, α, β, m) +end +function bump_degree(op::Beta01OrthoPoly, deg::Int) + ps = measure_parameters(op.measure) + return Beta01OrthoPoly(deg, ps...) +end + +recursion_coeffs(m::GammaMeasure, deg::Int) = r_scale((m.rateParameter^m.shapeParameter) / gamma(m.shapeParameter), rm_laguerre(deg+1, m.shapeParameter - 1.0)...) +function OrthoPoly(m::GammaMeasure, deg::Int) + α, β = recursion_coeffs(m, deg) + return GammaOrthoPoly(deg, α, β, m) +end +function bump_degree(op::GammaOrthoPoly, deg::Int) + ps = measure_parameters(op.measure) + return GammaOrthoPoly(deg, ps...) +end + +recursion_coeffs(m::genHermiteMeasure, deg::Int) = rm_hermite(deg+1, m.muParameter) +function OrthoPoly(m::genHermiteMeasure, deg::Int) + α, β = recursion_coeffs(m, deg) + return genHermiteOrthoPoly(deg, α, β, m) +end +function bump_degree(op::genHermiteOrthoPoly, deg::Int) + ps = measure_parameters(op.measure) + return genHermiteOrthoPoly(deg, ps...) +end + +recursion_coeffs(m::HermiteMeasure, deg::Int) = rm_hermite(deg+1) +function OrthoPoly(m::HermiteMeasure, deg::Int) + α, β = recursion_coeffs(m, deg) + return HermiteOrthoPoly(deg, α, β, m) +end +function bump_degree(op::HermiteOrthoPoly, deg::Int) + ps = measure_parameters(op.measure) + return HermiteOrthoPoly(deg, ps...) +end + +recursion_coeffs(m::LaguerreMeasure, deg::Int) = rm_laguerre(deg+1) +function OrthoPoly(m::LaguerreMeasure, deg::Int) + α, β = recursion_coeffs(m, deg) + return LaguerreOrthoPoly(deg, α, β, m) +end +function bump_degree(op::LaguerreOrthoPoly, deg::Int) + ps = measure_parameters(op.measure) + return LaguerreOrthoPoly(deg, ps...) +end + +recursion_coeffs(m::Uniform01Measure, deg::Int) = r_scale(1.0, rm_legendre01(deg+1)...) +function OrthoPoly(m::Uniform01Measure, deg::Int) + α, β = recursion_coeffs(m, deg) + return Uniform01OrthoPoly(deg, α, β, m) +end +function bump_degree(op::Uniform01OrthoPoly, deg::Int) + ps = measure_parameters(op.measure) + return Uniform01OrthoPoly(deg, ps...) +end + +recursion_coeffs(m::Uniform_11Measure, deg::Int) = r_scale(0.5, rm_legendre(deg+1)...) +function OrthoPoly(m::Uniform_11Measure, deg::Int) + α, β = recursion_coeffs(m, deg) + return Uniform_11OrthoPoly(deg, α, β, m) +end +function bump_degree(op::Uniform_11OrthoPoly, deg::Int) + ps = measure_parameters(op.measure) + return Uniform_11OrthoPoly(deg, ps...) +end + +recursion_coeffs(m::GaussMeasure, deg::Int) = r_scale(1/sqrt(2π), rm_hermite_prob(deg+1)...) +function OrthoPoly(m::GaussMeasure, deg::Int) + α, β = recursion_coeffs(m, deg) + return GaussOrthoPoly(deg, α, β, m) +end +function bump_degree(op::GaussOrthoPoly, deg::Int) + ps = measure_parameters(op.measure) + return GaussOrthoPoly(deg, ps...) +end + +recursion_coeffs(m::LegendreMeasure, deg::Int) = rm_legendre(deg+1) +function OrthoPoly(m::LegendreMeasure, deg::Int) + α, β = recursion_coeffs(m, deg) + return LegendreOrthoPoly(deg, α, β, m) +end +function bump_degree(op::LegendreOrthoPoly, deg::Int) + ps = measure_parameters(op.measure) + return LegendreOrthoPoly(deg, ps...) +end + +recursion_coeffs(m::LogisticMeasure, deg::Int) = r_scale(1.0, rm_logistic(deg+1)...) +function OrthoPoly(m::LogisticMeasure, deg::Int) + α, β = recursion_coeffs(m, deg) + return LogisticOrthoPoly(deg, α, β, m) +end +function bump_degree(op::LogisticOrthoPoly, deg::Int) + ps = measure_parameters(op.measure) + return LogisticOrthoPoly(deg, ps...) +end + +function bump_degree(op::MultiOrthoPoly, deg::Int) + return MultiOrthoPoly(bump_degree.(op.uni, deg), deg) end \ No newline at end of file From 4ad852f60425982d590d9f67c8cb610b9baa0386 Mon Sep 17 00:00:00 2001 From: FHoltorf <32248677+FHoltorf@users.noreply.github.com> Date: Sun, 25 Sep 2022 11:32:25 -0400 Subject: [PATCH 12/62] rm OrthoPoly functions -> not compatible with PolyChaos => consider PR to PolyChaos since that is really awkward --- src/PCE_utils.jl | 48 ------------------------------------------------ 1 file changed, 48 deletions(-) diff --git a/src/PCE_utils.jl b/src/PCE_utils.jl index 0485e94..34795b1 100644 --- a/src/PCE_utils.jl +++ b/src/PCE_utils.jl @@ -109,120 +109,72 @@ function bump_degree(op::JacobiOrthoPoly, deg::Int) end recursion_coeffs(m::genLaguerreMeasure, deg::Int) = rm_laguerre(deg+1, m.shapeParameter) -function OrthoPoly(m::genLaguerreMeasure, deg::Int) - α, β = recursion_coeffs(m, deg) - return genLaguerreOrthoPoly(deg, α, β, m) -end function bump_degree(op::genLaguerreOrthoPoly, deg::Int) ps = measure_parameters(op.measure) return genLaguerreorthoPoly(deg, ps...) end recursion_coeffs(m::MeixnerPollaczekMeasure, deg::Int) = rm_meixner_pollaczek(deg+1, m.λParameter, m.ϕParameter) -function OrthoPoly(m::MeixnerPollaczekMeasure, deg::Int) - α, β = recursion_coeffs(m, deg) - return MeixnerPollaczekOrthoPoly(deg, α, β, m) -end function bump_degree(op::MeixnerPollaczekOrthoPoly, deg::Int) ps = measure_parameters(op.measure) return MeixnerPollaczekOrthoPoly(deg, ps...) end recursion_coeffs(m::Beta01Measure, deg::Int) = r_scale(1 / beta(m.ashapeParameter, m.bshapeParameter), rm_jacobi01(deg + 1, m.bshapeParameter - 1.0, m.ashapeParameter - 1.0)...) -function OrthoPoly(m::Beta01Measure, deg::Int) - α, β = recursion_coeffs(m, deg) - return Beta01OrthoPoly(deg, α, β, m) -end function bump_degree(op::Beta01OrthoPoly, deg::Int) ps = measure_parameters(op.measure) return Beta01OrthoPoly(deg, ps...) end recursion_coeffs(m::GammaMeasure, deg::Int) = r_scale((m.rateParameter^m.shapeParameter) / gamma(m.shapeParameter), rm_laguerre(deg+1, m.shapeParameter - 1.0)...) -function OrthoPoly(m::GammaMeasure, deg::Int) - α, β = recursion_coeffs(m, deg) - return GammaOrthoPoly(deg, α, β, m) -end function bump_degree(op::GammaOrthoPoly, deg::Int) ps = measure_parameters(op.measure) return GammaOrthoPoly(deg, ps...) end recursion_coeffs(m::genHermiteMeasure, deg::Int) = rm_hermite(deg+1, m.muParameter) -function OrthoPoly(m::genHermiteMeasure, deg::Int) - α, β = recursion_coeffs(m, deg) - return genHermiteOrthoPoly(deg, α, β, m) -end function bump_degree(op::genHermiteOrthoPoly, deg::Int) ps = measure_parameters(op.measure) return genHermiteOrthoPoly(deg, ps...) end recursion_coeffs(m::HermiteMeasure, deg::Int) = rm_hermite(deg+1) -function OrthoPoly(m::HermiteMeasure, deg::Int) - α, β = recursion_coeffs(m, deg) - return HermiteOrthoPoly(deg, α, β, m) -end function bump_degree(op::HermiteOrthoPoly, deg::Int) ps = measure_parameters(op.measure) return HermiteOrthoPoly(deg, ps...) end recursion_coeffs(m::LaguerreMeasure, deg::Int) = rm_laguerre(deg+1) -function OrthoPoly(m::LaguerreMeasure, deg::Int) - α, β = recursion_coeffs(m, deg) - return LaguerreOrthoPoly(deg, α, β, m) -end function bump_degree(op::LaguerreOrthoPoly, deg::Int) ps = measure_parameters(op.measure) return LaguerreOrthoPoly(deg, ps...) end recursion_coeffs(m::Uniform01Measure, deg::Int) = r_scale(1.0, rm_legendre01(deg+1)...) -function OrthoPoly(m::Uniform01Measure, deg::Int) - α, β = recursion_coeffs(m, deg) - return Uniform01OrthoPoly(deg, α, β, m) -end function bump_degree(op::Uniform01OrthoPoly, deg::Int) ps = measure_parameters(op.measure) return Uniform01OrthoPoly(deg, ps...) end recursion_coeffs(m::Uniform_11Measure, deg::Int) = r_scale(0.5, rm_legendre(deg+1)...) -function OrthoPoly(m::Uniform_11Measure, deg::Int) - α, β = recursion_coeffs(m, deg) - return Uniform_11OrthoPoly(deg, α, β, m) -end function bump_degree(op::Uniform_11OrthoPoly, deg::Int) ps = measure_parameters(op.measure) return Uniform_11OrthoPoly(deg, ps...) end recursion_coeffs(m::GaussMeasure, deg::Int) = r_scale(1/sqrt(2π), rm_hermite_prob(deg+1)...) -function OrthoPoly(m::GaussMeasure, deg::Int) - α, β = recursion_coeffs(m, deg) - return GaussOrthoPoly(deg, α, β, m) -end function bump_degree(op::GaussOrthoPoly, deg::Int) ps = measure_parameters(op.measure) return GaussOrthoPoly(deg, ps...) end recursion_coeffs(m::LegendreMeasure, deg::Int) = rm_legendre(deg+1) -function OrthoPoly(m::LegendreMeasure, deg::Int) - α, β = recursion_coeffs(m, deg) - return LegendreOrthoPoly(deg, α, β, m) -end function bump_degree(op::LegendreOrthoPoly, deg::Int) ps = measure_parameters(op.measure) return LegendreOrthoPoly(deg, ps...) end recursion_coeffs(m::LogisticMeasure, deg::Int) = r_scale(1.0, rm_logistic(deg+1)...) -function OrthoPoly(m::LogisticMeasure, deg::Int) - α, β = recursion_coeffs(m, deg) - return LogisticOrthoPoly(deg, α, β, m) -end function bump_degree(op::LogisticOrthoPoly, deg::Int) ps = measure_parameters(op.measure) return LogisticOrthoPoly(deg, ps...) From c9638b2098c7cddb4e7ce42c73a7e866896ef9b1 Mon Sep 17 00:00:00 2001 From: FHoltorf <32248677+FHoltorf@users.noreply.github.com> Date: Sun, 25 Sep 2022 11:34:15 -0400 Subject: [PATCH 13/62] description of potential pr to PolyChaos --- src/PCE_utils.jl | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/PCE_utils.jl b/src/PCE_utils.jl index 34795b1..d9bfbb0 100644 --- a/src/PCE_utils.jl +++ b/src/PCE_utils.jl @@ -89,6 +89,9 @@ function get_basis_indices(mono::Num) end # bumping the degree of a PolyChaos OrthoPoly object up to ensure exact integration +# PR to PolyChaos -> remove unnecessarily restrictive constructors and allow construction from measures +# -> also expose number of points used for quadrature generation for general orthogonal polys +# measure_parameters(m::AbstractMeasure) = [] measure_parameters(m::Measure) = m.pars measure_parameters(m::JacobiMeasure) = [m.ashapeParameter, m.bshapeParameter] From 9380ad0af189a207f42d01c693575e8142d8f29d Mon Sep 17 00:00:00 2001 From: FHoltorf <32248677+FHoltorf@users.noreply.github.com> Date: Sun, 25 Sep 2022 11:36:38 -0400 Subject: [PATCH 14/62] galerking projection --- src/PCE.jl | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/PCE.jl b/src/PCE.jl index 6dc2219..9b25a0f 100644 --- a/src/PCE.jl +++ b/src/PCE.jl @@ -123,5 +123,16 @@ function eval_scalar_products(mono_indices, pce::PCE) end # 4. Galerkin projection +function galerkin_projection(bm_coeffs, scalar_products, pce::PCE) + projected_eqs = [] + for i in eachindex(bm_coeffs) + eqs = [] + for k in 1:dim(pce.pc_basis) + push!(eqs, sum(bm_coeffs[i][mono]*scalar_products[k][mono] for mono in keys(bm_coeffs[i]))) + end + push!(projected_eqs, eqs) + end + return projected_eqs +end # 5. combine everything to high-level interface From d5487758c0c02e2c4320b180c6c4cb6d57acb389 Mon Sep 17 00:00:00 2001 From: FHoltorf <32248677+FHoltorf@users.noreply.github.com> Date: Sun, 25 Sep 2022 11:37:28 -0400 Subject: [PATCH 15/62] combining everything --- src/PCE.jl | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/PCE.jl b/src/PCE.jl index 9b25a0f..7461502 100644 --- a/src/PCE.jl +++ b/src/PCE.jl @@ -135,4 +135,13 @@ function galerkin_projection(bm_coeffs, scalar_products, pce::PCE) return projected_eqs end -# 5. combine everything to high-level interface +# 5. combine everything +function pce_galerkin(eqs::AbstractVector, pce::PCE) + expanded_eqs = apply_ansatz(eqs, pce) + basismonomial_coeffs, basismonomial_indices = extract_basismonomial_coeffs(expanded_eqs, pce) + scalar_products = eval_scalar_products(basismonomial_indices, pce) + projected_eqs = galerkin_projection(basismonomial_coeffs, scalar_products, pce) + return projected_eqs +end + +# 6. high-level interface \ No newline at end of file From 44dccf1d9d8739c3d09a3768f6a7302c0c2c6be6 Mon Sep 17 00:00:00 2001 From: FHoltorf <32248677+FHoltorf@users.noreply.github.com> Date: Sun, 25 Sep 2022 11:41:04 -0400 Subject: [PATCH 16/62] pce for explicit ODEs --- src/PCE.jl | 29 ++++++++++++++++++++++++++++- src/PCE_utils.jl | 11 +++++++++++ 2 files changed, 39 insertions(+), 1 deletion(-) diff --git a/src/PCE.jl b/src/PCE.jl index 7461502..5bcc669 100644 --- a/src/PCE.jl +++ b/src/PCE.jl @@ -144,4 +144,31 @@ function pce_galerkin(eqs::AbstractVector, pce::PCE) return projected_eqs end -# 6. high-level interface \ No newline at end of file +# 6. high-level interface +# 6a. apply pce to explicit ODE +function moment_equations(sys::ODESystem, pce::PCE) + eqs = [eq.rhs for eq in equations(sys)] + scaling_factors = computeSP2(pce.pc_basis) + moment_eqs = reduce(vcat, [eq ./ scaling_factors for eq in pce_galerkin(eqs, pce)]) + iv = independent_variable(sys) + params = setdiff(parameters(sys), pce.parameters) + D = Differential(iv) + moments = reduce(vcat, pce.moments) + name = Symbol(String(nameof(sys))*"_pce") + pce_system = ODESystem([D(moments[i]) ~ moment_eqs[i] for i in eachindex(moments)], + iv, moments, params, name = name) + + n_moments = dim(pce.pc_basis) + n_states = length(states(sys)) + pce_eval = function (moment_vals, parameter_values) + shape_state = [moment_vals[i*n_moments+1:(i+1)*n_moments] for i in 0:n_states-1] + return pce(shape_state, parameter_values) + end + return pce_system, pce_eval +end + +# 6b. apply pce to algebraic equations + +# 6c. apply pce to control problems + +# 6d. ? \ No newline at end of file diff --git a/src/PCE_utils.jl b/src/PCE_utils.jl index d9bfbb0..93f96b0 100644 --- a/src/PCE_utils.jl +++ b/src/PCE_utils.jl @@ -1,3 +1,5 @@ +import PolyChaos.computeSP2 + # getting independent variables function get_independent_vars(var) return [] @@ -185,4 +187,13 @@ end function bump_degree(op::MultiOrthoPoly, deg::Int) return MultiOrthoPoly(bump_degree.(op.uni, deg), deg) +end + +# extending computeSP2 for multivariate orthogonal polys +function computeSP2(pc::MultiOrthoPoly) + n = length(pc.uni) + m = dim(pc) + uni_SP2 = [computeSP2(op) for op in pc.uni] + multi_SP2 = [prod(uni_SP2[j][pc.ind[i,j]+1] for j in 1:n) for i in 1:m] + return multi_SP2 end \ No newline at end of file From eedee96589e8fbc8c42ce6efcbcbde06188bc237 Mon Sep 17 00:00:00 2001 From: FHoltorf <32248677+FHoltorf@users.noreply.github.com> Date: Sun, 25 Sep 2022 11:41:39 -0400 Subject: [PATCH 17/62] forgot to export moment_equations --- src/PCE.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/PCE.jl b/src/PCE.jl index 5bcc669..65bd176 100644 --- a/src/PCE.jl +++ b/src/PCE.jl @@ -1,6 +1,6 @@ using PolyChaos, Symbolics, ModelingToolkit, LinearAlgebra -export PCE +export PCE, moment_equations include("PCE_utils.jl") # for now only consider tensor grid bases From 2ccb1c272871666607847127aee32b01e6d25597 Mon Sep 17 00:00:00 2001 From: FHoltorf <32248677+FHoltorf@users.noreply.github.com> Date: Sun, 25 Sep 2022 11:42:50 -0400 Subject: [PATCH 18/62] update potential interfaces agenda --- src/PCE.jl | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/PCE.jl b/src/PCE.jl index 65bd176..5b2df2f 100644 --- a/src/PCE.jl +++ b/src/PCE.jl @@ -167,8 +167,10 @@ function moment_equations(sys::ODESystem, pce::PCE) return pce_system, pce_eval end -# 6b. apply pce to algebraic equations +# 6b. apply pce to implicit & mass-matrix ODE/DAEs -# 6c. apply pce to control problems +# 6c. apply pce to algebraic equations -# 6d. ? \ No newline at end of file +# 6d. apply pce to control problems + +# 6e. ? \ No newline at end of file From 495022a78880b65962fb5bcdfe7f78c9fb74ed5c Mon Sep 17 00:00:00 2001 From: FHoltorf <32248677+FHoltorf@users.noreply.github.com> Date: Mon, 26 Sep 2022 10:50:51 -0400 Subject: [PATCH 19/62] test galerking projection --- test/polychaos_tests.jl | 54 ++++++++++++++++++++++++++++++++++++++--- 1 file changed, 51 insertions(+), 3 deletions(-) diff --git a/test/polychaos_tests.jl b/test/polychaos_tests.jl index 36d8afe..e9ae93c 100644 --- a/test/polychaos_tests.jl +++ b/test/polychaos_tests.jl @@ -1,5 +1,5 @@ using Test -using ModelOrderReduction, Symbolics, PolyChaos, LinearAlgebra +using ModelOrderReduction, Symbolics, PolyChaos, ModelingToolkit, LinearAlgebra MO = ModelOrderReduction # testing extraction of independent variables @@ -34,15 +34,63 @@ true_eq = expand(pce.sym_basis[2]*dot(pce.moments[1],pce.sym_basis)) @test isequal(pce_eq, true_eq) # test extraction of monomial coefficients -coeffs = Dict(pce.sym_basis[i]*pce.sym_basis[2] => pce.moments[1][i] for i in 2:n+1) +coeffs = Dict(pce.sym_basis[i]*pce.sym_basis[2] => pce.moments[1][i] for i in 1:n+1) extracted_coeffs = MO.extract_coeffs(pce_eq, pce.sym_basis) @test all(isequal(coeffs[mono],extracted_coeffs[mono]) for mono in keys(coeffs)) -basis_indices = Dict([pce.sym_basis[i]*pce.sym_basis[2] => ([i-1, 1], [1,i-1]) for i in 2:n+1]) +basis_indices = Dict([pce.sym_basis[i]*pce.sym_basis[2] => ([i-1, 1], [1,i-1]) for i in 1:n+1]) extracted_coeffs, extracted_basis_indices = MO.extract_basismonomial_coeffs([pce_eq], pce) extracted_basis_indices = Dict(extracted_basis_indices) test1 = [isequal(basis_indices[mono][1], extracted_basis_indices[mono]) for mono in keys(basis_indices)] test2 = [isequal(basis_indices[mono][2], extracted_basis_indices[mono]) for mono in keys(basis_indices)] @test all(test1 + test2 .>= 1) +# test Galerkin projection +moment_eqs = MO.pce_galerkin(eq, pce) +integrator = MO.bump_degree(pce.pc_basis, n+1) +@test integrator.deg == n+1 +@test integrator.measure isa typeof(pce.pc_basis.measure) +@test integrator.measure.measures[1] isa typeof(pce.pc_basis.measure.measures[1]) + +true_moment_eqs = Num[] +for j in 0:n + mom_eq = 0.0 + for mono in keys(basis_indices) + ind = basis_indices[mono][2] + c = computeSP([ind...,j], integrator) + mom_eq += c*coeffs[mono] + end + push!(true_moment_eqs, mom_eq) +end + +function isapprox_sym(exprA, exprB, atol = 1e-6) + exprA = Symbolics.unwrap(exprA) + exprB = Symbolics.unwrap(exprB) + approx_equal = false + if typeof(exprA) == typeof(exprB) + approx_equal = isapprox_sym(exprA, exprB, atol) + end + return approx_equal +end + +function isapprox_sym(exprA::T, exprB::T, atol = 1e-6) where T <: Union{Symbolics.Mul, Symbolics.Add} + approx_equal = true + approx_equal = isapprox(exprA.coeff, exprB.coeff, atol = atol) + approx_equal = keys(exprA.dict) == keys(exprB.dict) + if approx_equal + for subexpr in keys(exprA.dict) + approx_equal = isapprox(exprA.dict[subexpr], exprB.dict[subexpr], atol=atol) + if !approx_equal + break + end + end + end + return approx_equal +end + +function isapprox_sym(exprA::Symbolics.Term, exprB::Symbolics.Term, atol = 1e-6) + return isequal(exprA, exprB) +end + +@test all([isapprox_sym(moment_eqs[1][i], true_moment_eqs[i]) for i in eachindex(true_moment_eqs)]) \ No newline at end of file From c85f2b0dfda4d77b8c0ef205032e0a27d9963265 Mon Sep 17 00:00:00 2001 From: FHoltorf <32248677+FHoltorf@users.noreply.github.com> Date: Mon, 26 Sep 2022 11:05:38 -0400 Subject: [PATCH 20/62] rm old file --- test/PolyChaos.jl | 32 -------------------------------- 1 file changed, 32 deletions(-) delete mode 100644 test/PolyChaos.jl diff --git a/test/PolyChaos.jl b/test/PolyChaos.jl deleted file mode 100644 index ddbdcff..0000000 --- a/test/PolyChaos.jl +++ /dev/null @@ -1,32 +0,0 @@ -using Symbolics - -# polynomial transformations -# given two polynomial bases ξ₁(x) and ξ₂(x), we identify both polynomials simply by -# p(x) = a'ξ₁(x) = b'ξ₂(x) -# often we wish to compute b from a. -# to do so we only need to find T such that Tξ₁ = ξ₂. -# A convenient way is to expand both ξ₁ and ξ₂ in the monomial basis: Aξ₁ = Bξ₂ = ξ₃ -# Then T = B⁻¹A. -# Typically one chooses the monomial basis as A and B are remarkably easy to find in that case. -# That, however, comes at the cost of poor numerical conditioning of the A and B and hence potential -# issues arise in the computation of T = B⁻¹A. - -# For PCE a natural workflow is obtained as -# give f(x,p,t) = [f1(x,p,t), ..., fN(x,p,t)] -# choose polynomial basis ξ(p) = [ξ1(p1), ..., ξK(p1)] ⨂ ⋯ ⨂ [ξ1(pL), ..., ξK(pL)] => this contains redundant terms >:( -# choose solution ansatz x(p,t) = [x1(p,t), ..., xN(p,t)] = C(t)ξ(p) -# by asumption dC(t)/dt ξ(p) = f(C(t)ξ(p), p, t) -# => ∫ dC(t)/dt ξ(p) ξ'(p) dρ(p) = dC(t)/dt ∫ ξ(p) ξ'(p) dρ(p) = ∫ f(C(t)ξ(p), p, t) ξ'(p) dρ(p) -# If ξ(p) is orthogonal with respect to ρ(p) then ∫ ξ(p) ξ'(p) dρ(p) = I -# so dC(t)/dt = ∫ f(C(t)ξ(p), p, t) ξ'(p) dρ(p) -# We therefore need to evaluate the right-hand-side. -# In general this is very hard. Here we are going to make this easy by assuming that -# fi(x,p,t) = (f̂i)' (qi(x) ⨂ ri(p)) -# with qi(x) being itself a polynomial basis -# then we evaluate Wi(C(t)) vi(p) = qi(C(t)ξ(p)) ⨂ ri(p) -# and transform vi(p) = [Gi, Git] [ξ(p); ξt(p)] to arrive at -# fi(x,p,t) = (f̂i)'Wi(C(t))[Gi, Git] [ξ(p); ξt(p)] -# then ∫ fi(C(t)ξ(p), p, t) ξ'(p) dρ(p) = (f̂i)'Wi(C(t))[Gi, Git] ∫ [ξ(p); ξt(p)] ξ'(p) dρ(p) -# where ∫ [ξ(p); ξt(p)] ξ'(p) dρ(p) = [I; 0] -# so that eᵢ'dC/dt = (f̂i)'Wi(C(t)) Gi (ith row) - From 4e5d652cdc3134b91ebb738976bd3b3f502a7639 Mon Sep 17 00:00:00 2001 From: FHoltorf <32248677+FHoltorf@users.noreply.github.com> Date: Mon, 26 Sep 2022 12:33:27 -0400 Subject: [PATCH 21/62] restructure PCE tests --- Project.toml | 5 ++- test/PCETestUtils.jl | 28 ++++++++++++++++ test/PCETests.jl | 80 ++++++++++++++++++++++++++++++++++++++++++++ test/runtests.jl | 2 +- 4 files changed, 111 insertions(+), 4 deletions(-) create mode 100644 test/PCETestUtils.jl create mode 100644 test/PCETests.jl diff --git a/Project.toml b/Project.toml index 6a1b38b..32224f2 100644 --- a/Project.toml +++ b/Project.toml @@ -8,16 +8,15 @@ LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" ModelingToolkit = "961ee093-0014-501f-94e3-6117800e7a78" OrderedCollections = "bac558e1-5e72-5ebc-8fee-abe8a469f55d" PolyChaos = "8d666b04-775d-5f6e-b778-5ac7c70f65a3" +RandomizedLinAlg = "0448d7d9-159c-5637-8537-fd72090fea46" Revise = "295af30f-e4ad-537b-8983-00126c2a3abe" -Setfield = "efcf1570-3423-57d1-acb7-fd33fddbac46" SymbolicUtils = "d1185830-fcd6-423d-90d6-eec64667417b" Symbolics = "0c5d862f-8b57-4792-8d23-62f2024744c7" -RandomizedLinAlg = "0448d7d9-159c-5637-8537-fd72090fea46" TSVD = "9449cd9e-2762-5aa3-a617-5413e99d722e" [compat] -TSVD = "0.4" RandomizedLinAlg = "0.1" +TSVD = "0.4" julia = "1.6" [extras] diff --git a/test/PCETestUtils.jl b/test/PCETestUtils.jl new file mode 100644 index 0000000..cf5d4ee --- /dev/null +++ b/test/PCETestUtils.jl @@ -0,0 +1,28 @@ +function isapprox_sym(exprA, exprB, atol = 1e-6) + exprA = Symbolics.unwrap(exprA) + exprB = Symbolics.unwrap(exprB) + approx_equal = false + if typeof(exprA) == typeof(exprB) + approx_equal = isapprox_sym(exprA, exprB, atol) + end + return approx_equal +end + +function isapprox_sym(exprA::T, exprB::T, atol = 1e-6) where T <: Union{Symbolics.Mul, Symbolics.Add} + approx_equal = true + approx_equal = isapprox(exprA.coeff, exprB.coeff, atol = atol) + approx_equal = keys(exprA.dict) == keys(exprB.dict) + if approx_equal + for subexpr in keys(exprA.dict) + approx_equal = isapprox(exprA.dict[subexpr], exprB.dict[subexpr], atol=atol) + if !approx_equal + break + end + end + end + return approx_equal +end + +function isapprox_sym(exprA::Symbolics.Term, exprB::Symbolics.Term, atol = 1e-6) + return isequal(exprA, exprB) +end diff --git a/test/PCETests.jl b/test/PCETests.jl new file mode 100644 index 0000000..254cd93 --- /dev/null +++ b/test/PCETests.jl @@ -0,0 +1,80 @@ +using Test +using ModelOrderReduction, Symbolics, PolyChaos, ModelingToolkit, LinearAlgebra +MO = ModelOrderReduction + +include("PCETestUtils.jl") + +# testing extraction of independent variables +@variables t, z, u(t), v(t)[1:4], w(t,z), x(t,z)[1:4] + +@testset "PCE: get_independent_vars test" begin + @test isequal(MO.get_independent_vars(u), [t]) + @test isequal(MO.get_independent_vars(v[1]), [t]) + @test isequal(MO.get_independent_vars(v[2]), [t]) + @test isequal(MO.get_independent_vars(w),[t,z]) + @test isequal(MO.get_independent_vars(x[2]),[t,z]) + @test isequal(MO.get_independent_vars(collect(v)), [[t] for i in 1:length(v)]) + @test isequal(MO.get_independent_vars(collect(x)), [[t,z] for i in 1:length(v)]) +end + +# test equation for throughout: +@parameters a +@variables t, y(t) +D = Differential(t) +test_equation = [D(y) ~ a*y] + +# test PCE generation +n = 5 +bases = [a => GaussOrthoPoly(n)] +pce = PCE([y], bases) +@testset "PCE: constructor test" begin + @test length(pce.moments[1]) == n + 1 + @test length(pce.sym_basis) == n + 1 + @test isequal(pce.parameters, [a]) +end + +# test PCE ansatz application +eq = [eq.rhs for eq in test_equation] +pce_eq = MO.apply_ansatz(eq, pce)[1] +@testset "PCE: apply_ansatz test" begin + true_eq = expand(pce.sym_basis[2]*dot(pce.moments[1],pce.sym_basis)) + @test isequal(pce_eq, true_eq) +end + +# test extraction of monomial coefficients +coeffs = Dict(pce.sym_basis[i]*pce.sym_basis[2] => pce.moments[1][i] for i in 1:n+1) +basis_indices = Dict([pce.sym_basis[i]*pce.sym_basis[2] => ([i-1, 1], [1,i-1]) for i in 1:n+1]) + +@testset "PCE: basismonomial extraction test" begin + extracted_coeffs = MO.extract_coeffs(pce_eq, pce.sym_basis) + @test all(isequal(coeffs[mono],extracted_coeffs[mono]) for mono in keys(coeffs)) + + extracted_coeffs, extracted_basis_indices = MO.extract_basismonomial_coeffs([pce_eq], pce) + extracted_basis_indices = Dict(extracted_basis_indices) + test1 = [isequal(basis_indices[mono][1], extracted_basis_indices[mono]) for mono in keys(basis_indices)] + test2 = [isequal(basis_indices[mono][2], extracted_basis_indices[mono]) for mono in keys(basis_indices)] + @test all(test1 + test2 .>= 1) +end + +# test Galerkin projection +@testset "PCE: galerkin projection test" begin + moment_eqs = MO.pce_galerkin(eq, pce) + integrator = MO.bump_degree(pce.pc_basis, n+1) + + true_moment_eqs = Num[] + for j in 0:n + mom_eq = 0.0 + for mono in keys(basis_indices) + ind = basis_indices[mono][2] + c = computeSP([ind...,j], integrator) + mom_eq += c*coeffs[mono] + end + push!(true_moment_eqs, mom_eq) + end + + @test integrator.deg == n+1 + @test integrator.measure isa typeof(pce.pc_basis.measure) + @test integrator.measure.measures[1] isa typeof(pce.pc_basis.measure.measures[1]) + @test all([isapprox_sym(moment_eqs[1][i], true_moment_eqs[i]) for i in eachindex(true_moment_eqs)]) +end + diff --git a/test/runtests.jl b/test/runtests.jl index a3490ff..073c229 100644 --- a/test/runtests.jl +++ b/test/runtests.jl @@ -4,6 +4,6 @@ using OrdinaryDiffEq @testset "ModelOrderReduction.jl" begin end -include("polychaos_tests.jl") +include("PCETests.jl") include("DataReduction.jl") #---------- Model Reduction ----------------# From 06a0e9876fe8c5eb30e479513e57a814011bd33b Mon Sep 17 00:00:00 2001 From: FHoltorf <32248677+FHoltorf@users.noreply.github.com> Date: Mon, 26 Sep 2022 12:38:37 -0400 Subject: [PATCH 22/62] update testing environmnet --- test/Project.toml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/test/Project.toml b/test/Project.toml index 9aaa105..88bfe24 100644 --- a/test/Project.toml +++ b/test/Project.toml @@ -1,3 +1,7 @@ [deps] +LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" +ModelingToolkit = "961ee093-0014-501f-94e3-6117800e7a78" OrdinaryDiffEq = "1dea7af3-3e70-54e6-95c3-0bf5283fa5ed" +PolyChaos = "8d666b04-775d-5f6e-b778-5ac7c70f65a3" +Symbolics = "0c5d862f-8b57-4792-8d23-62f2024744c7" Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" From 2bc23b845422c0820be5219389116ec807db5e04 Mon Sep 17 00:00:00 2001 From: FHoltorf <32248677+FHoltorf@users.noreply.github.com> Date: Mon, 26 Sep 2022 12:40:18 -0400 Subject: [PATCH 23/62] move dependencies to respective tests for easier bookkepping --- test/DataReduction.jl | 1 + test/PCETests.jl | 3 +-- test/runtests.jl | 1 - 3 files changed, 2 insertions(+), 3 deletions(-) diff --git a/test/DataReduction.jl b/test/DataReduction.jl index 3e32b19..a16042c 100644 --- a/test/DataReduction.jl +++ b/test/DataReduction.jl @@ -1,4 +1,5 @@ #--------- Data Reduction -----------------# +using OrdinaryDiffEq function lorenz_prob() function lorenz!(du, u, p, t) diff --git a/test/PCETests.jl b/test/PCETests.jl index 254cd93..f3fb63b 100644 --- a/test/PCETests.jl +++ b/test/PCETests.jl @@ -1,5 +1,4 @@ -using Test -using ModelOrderReduction, Symbolics, PolyChaos, ModelingToolkit, LinearAlgebra +using Symbolics, PolyChaos, ModelingToolkit, LinearAlgebra MO = ModelOrderReduction include("PCETestUtils.jl") diff --git a/test/runtests.jl b/test/runtests.jl index 073c229..808551d 100644 --- a/test/runtests.jl +++ b/test/runtests.jl @@ -1,6 +1,5 @@ using ModelOrderReduction using Test -using OrdinaryDiffEq @testset "ModelOrderReduction.jl" begin end From 3b7f8a380b09129f3f1ee8679ce14f749533c286 Mon Sep 17 00:00:00 2001 From: FHoltorf <32248677+FHoltorf@users.noreply.github.com> Date: Mon, 26 Sep 2022 14:34:49 -0400 Subject: [PATCH 24/62] bug fix: constant terms were omitted in coefficient extraction and galerkin projection --- src/PCE/PCE_utils.jl | 6 +++ test/PCETests.jl | 12 +++--- test/polychaos_tests.jl | 96 ----------------------------------------- 3 files changed, 13 insertions(+), 101 deletions(-) delete mode 100644 test/polychaos_tests.jl diff --git a/src/PCE/PCE_utils.jl b/src/PCE/PCE_utils.jl index 93f96b0..e93436f 100644 --- a/src/PCE/PCE_utils.jl +++ b/src/PCE/PCE_utils.jl @@ -50,6 +50,9 @@ end function extract_coeffs(expr::Symbolics.Add, vars::Set) coeffs = Dict() + if !iszero(expr.coeff) + coeffs[Val(1)] = expr.coeff + end for term in keys(expr.dict) num_coeff = expr.dict[term] var_coeff, mono = split_term(term, vars) @@ -89,6 +92,9 @@ end function get_basis_indices(mono::Num) return get_basis_indices(Symbolics.unwrap(mono)) end +function get_basis_indices(::Val{1}) + return [0] +end # bumping the degree of a PolyChaos OrthoPoly object up to ensure exact integration # PR to PolyChaos -> remove unnecessarily restrictive constructors and allow construction from measures diff --git a/test/PCETests.jl b/test/PCETests.jl index f3fb63b..6cf7b4f 100644 --- a/test/PCETests.jl +++ b/test/PCETests.jl @@ -20,7 +20,7 @@ end @parameters a @variables t, y(t) D = Differential(t) -test_equation = [D(y) ~ a*y] +test_equation = [D(y) ~ a*y + 4] # test PCE generation n = 5 @@ -36,13 +36,15 @@ end eq = [eq.rhs for eq in test_equation] pce_eq = MO.apply_ansatz(eq, pce)[1] @testset "PCE: apply_ansatz test" begin - true_eq = expand(pce.sym_basis[2]*dot(pce.moments[1],pce.sym_basis)) + true_eq = expand(pce.sym_basis[2]*dot(pce.moments[1],pce.sym_basis)+4) @test isequal(pce_eq, true_eq) end # test extraction of monomial coefficients -coeffs = Dict(pce.sym_basis[i]*pce.sym_basis[2] => pce.moments[1][i] for i in 1:n+1) -basis_indices = Dict([pce.sym_basis[i]*pce.sym_basis[2] => ([i-1, 1], [1,i-1]) for i in 1:n+1]) +coeffs = Dict{Any, Any}(pce.sym_basis[i]*pce.sym_basis[2] => pce.moments[1][i] for i in 1:n+1) +coeffs[Val(1)] = 4.0 +basis_indices = Dict{Any,Any}(pce.sym_basis[i]*pce.sym_basis[2] => ([i-1, 1], [1,i-1]) for i in 1:n+1) +basis_indices[Val(1)] = [[0],[0]] @testset "PCE: basismonomial extraction test" begin extracted_coeffs = MO.extract_coeffs(pce_eq, pce.sym_basis) @@ -65,7 +67,7 @@ end mom_eq = 0.0 for mono in keys(basis_indices) ind = basis_indices[mono][2] - c = computeSP([ind...,j], integrator) + c = computeSP(vcat(ind, j), integrator) mom_eq += c*coeffs[mono] end push!(true_moment_eqs, mom_eq) diff --git a/test/polychaos_tests.jl b/test/polychaos_tests.jl deleted file mode 100644 index e9ae93c..0000000 --- a/test/polychaos_tests.jl +++ /dev/null @@ -1,96 +0,0 @@ -using Test -using ModelOrderReduction, Symbolics, PolyChaos, ModelingToolkit, LinearAlgebra -MO = ModelOrderReduction - -# testing extraction of independent variables -@variables t, z, u(t), v(t)[1:4], w(t,z), x(t,z)[1:4] - -@test isequal(MO.get_independent_vars(u), [t]) -@test isequal(MO.get_independent_vars(v[1]), [t]) -@test isequal(MO.get_independent_vars(v[2]), [t]) -@test isequal(MO.get_independent_vars(w),[t,z]) -@test isequal(MO.get_independent_vars(x[2]),[t,z]) -@test isequal(MO.get_independent_vars(collect(v)), [[t] for i in 1:length(v)]) -@test isequal(MO.get_independent_vars(collect(x)), [[t,z] for i in 1:length(v)]) - -# test equation for throughout: -@parameters a -@variables t, x(t) -D = Differential(t) -test_equation = [D(x) ~ a*x] - -# test PCE generation -n = 5 -bases = [a => GaussOrthoPoly(n)] -pce = PCE([x], bases) -@test length(pce.moments[1]) == n + 1 -@test length(pce.sym_basis) == n + 1 -@test isequal(pce.parameters, [a]) - -# test PCE ansatz application -eq = [eq.rhs for eq in test_equation] -pce_eq = MO.apply_ansatz(eq, pce)[1] -true_eq = expand(pce.sym_basis[2]*dot(pce.moments[1],pce.sym_basis)) -@test isequal(pce_eq, true_eq) - -# test extraction of monomial coefficients -coeffs = Dict(pce.sym_basis[i]*pce.sym_basis[2] => pce.moments[1][i] for i in 1:n+1) -extracted_coeffs = MO.extract_coeffs(pce_eq, pce.sym_basis) -@test all(isequal(coeffs[mono],extracted_coeffs[mono]) for mono in keys(coeffs)) - -basis_indices = Dict([pce.sym_basis[i]*pce.sym_basis[2] => ([i-1, 1], [1,i-1]) for i in 1:n+1]) -extracted_coeffs, extracted_basis_indices = MO.extract_basismonomial_coeffs([pce_eq], pce) -extracted_basis_indices = Dict(extracted_basis_indices) -test1 = [isequal(basis_indices[mono][1], extracted_basis_indices[mono]) for mono in keys(basis_indices)] -test2 = [isequal(basis_indices[mono][2], extracted_basis_indices[mono]) for mono in keys(basis_indices)] -@test all(test1 + test2 .>= 1) - -# test Galerkin projection -moment_eqs = MO.pce_galerkin(eq, pce) - -integrator = MO.bump_degree(pce.pc_basis, n+1) -@test integrator.deg == n+1 -@test integrator.measure isa typeof(pce.pc_basis.measure) -@test integrator.measure.measures[1] isa typeof(pce.pc_basis.measure.measures[1]) - -true_moment_eqs = Num[] -for j in 0:n - mom_eq = 0.0 - for mono in keys(basis_indices) - ind = basis_indices[mono][2] - c = computeSP([ind...,j], integrator) - mom_eq += c*coeffs[mono] - end - push!(true_moment_eqs, mom_eq) -end - -function isapprox_sym(exprA, exprB, atol = 1e-6) - exprA = Symbolics.unwrap(exprA) - exprB = Symbolics.unwrap(exprB) - approx_equal = false - if typeof(exprA) == typeof(exprB) - approx_equal = isapprox_sym(exprA, exprB, atol) - end - return approx_equal -end - -function isapprox_sym(exprA::T, exprB::T, atol = 1e-6) where T <: Union{Symbolics.Mul, Symbolics.Add} - approx_equal = true - approx_equal = isapprox(exprA.coeff, exprB.coeff, atol = atol) - approx_equal = keys(exprA.dict) == keys(exprB.dict) - if approx_equal - for subexpr in keys(exprA.dict) - approx_equal = isapprox(exprA.dict[subexpr], exprB.dict[subexpr], atol=atol) - if !approx_equal - break - end - end - end - return approx_equal -end - -function isapprox_sym(exprA::Symbolics.Term, exprB::Symbolics.Term, atol = 1e-6) - return isequal(exprA, exprB) -end - -@test all([isapprox_sym(moment_eqs[1][i], true_moment_eqs[i]) for i in eachindex(true_moment_eqs)]) \ No newline at end of file From 9cfb20369a8f417a25741e4dc97ece4110d0e1f8 Mon Sep 17 00:00:00 2001 From: FHoltorf <32248677+FHoltorf@users.noreply.github.com> Date: Tue, 27 Sep 2022 01:52:13 -0400 Subject: [PATCH 25/62] tutorial docs --- examples/PCE/mean.png | Bin 0 -> 46597 bytes examples/PCE/traces.png | Bin 0 -> 84243 bytes examples/PCE/tutorial.jl | 114 +++++++++++++++++++++++++++++++++++++++ examples/PCE/tutorial.md | 108 +++++++++++++++++++++++++++++++++++++ examples/PCE/var.png | Bin 0 -> 58342 bytes src/PCE/PCE.jl | 14 +++-- src/PCE/PCE_utils.jl | 1 + 7 files changed, 233 insertions(+), 4 deletions(-) create mode 100644 examples/PCE/mean.png create mode 100644 examples/PCE/traces.png create mode 100644 examples/PCE/tutorial.jl create mode 100644 examples/PCE/tutorial.md create mode 100644 examples/PCE/var.png diff --git a/examples/PCE/mean.png b/examples/PCE/mean.png new file mode 100644 index 0000000000000000000000000000000000000000..cf970e9eaf6883b02bb471a6d1326f20d5c91002 GIT binary patch literal 46597 zcmY&=1yq$=xAvyH5$P`Jlok*q6p)ZcKtd3Z?(UXU5NSaHMd^|*Nu|341qA7C?&REY z|1tjkjd9NTfW7w{Yt8x8e52IW6!EYru@MLap0bj>CIW%1hd>}DU?Rg$E_I^@;9uxw zj}+w**Ej#mX)H)aAm|aw^0H4nGdAWtWJr`}5If3f_i-`@KRnzH4y5OZ&dDmojBX6f zV)H(7p3mG=^D4`*;?>*IwkwEyiiAT?_UR!;V%#W#L1z89t0|Q?6+!&)ZuiC2^qk7` zZ035eq^T(i+|)iaLR48oA){wQ_=sS7%-}&(lH5=;fiya4e-$;gpFe+oEh$lypmw~v zIQ{S_m5h`$hXxZBPx5YhW_o&hM#jZrdjzjZQw|M&t=Im_@P|hu!^4C47PWy<>PzZH zquQT!?%cVfZ)oV_>8Yo$UsO~?K}pH;^xNwn&+~4L^`-LWy?<|GW7AQmg&&buP!Q2- zIy*btQD=PcbAhWHAhfddU`yKM2ZS)j7vd0trQ0@F9sq%KmX6l%DeRR7?T60tk9>amp_(9WTi9&lp(l+`&SWTJ#VHWxq#7es*@S)}YOk znx2)#!_EEj#fz!Q$&;PMcKA#wsm7jUw!WSoEZs*1Bfo$Dmi9XfZ8a_a@r_^4N1rOTUwy+>al_RaoIKU^R62^#vS$v9`93eD!KTydwRr6CX!67}Qb;}`_APo6wcXD5}GZswU$ z5|@z3mJTphS8rK#REVQq+uT%TCJu|yC>pgI$a?eU4G|_PT)8syt|TSqKe@fVy>P-z zOiV#%Gcz-AsxdJ!{N%Clcd4nVJ5d?1y3^A1wY6E;*b2UU*<4u(&lgJ6Gc?4&z<{kG z$;rtnDylbHKpz%n#zPm#%+L#@Z4QOyRJ~nlDy;i{#$MBPFCBp zGaLt->N{q~?!{ftD}gyN-xEHB=}h%YBc9u*TI5tz=VMl~>f0|TOOX(z{+DMZDNi&t z8Iyaku&_8dI2xGr_4Q9-iz2gZ&(#;?<+TU2P*G5P`0!yjbe45_<)dmk0wH2Q`zv64?6WQ!*?#`WM`i&Gshr{(bm-b zR9yV$O@sF#2YQHxuCBEIh3E6<&uwhh!||v}^@@XnkOKM!$}Rg42-sV&rF8xM{S_3x zFZZRwRXA81VapG6WR#JkwqTAZzO*f zQWD(cd%h=*@cWjQmU-s;5)u*!8QA)%eSSN?kTl~X9oSG0|1@7;@*-r^)V8LpY^6** z)HOAeQc`qubd1Z)I=kZOU=NTI5y{dM=70Ebsx>rH@Oal#GEF5eHdf`)qrUF$$vPLd zM5QO%+Fw3>TDk?dh6*8LXm}0>TUS>Hht~|Z1^&-MlV1!ep<3ufiAk3!A5@~QI2w4j zlB()l?*ITN|7Ey&E$%1PDI=i<8jMP`H8{8yl08lV~_(78Vuf(Z2lW&%xOyb(<;UYpx$Ze!zz4ek>-Cwz0k4>~p+TSt*1c(QXnukFMb$WD=#&!^1=PUJHS`;^Nq5 zJv}{g#4p(M-JdcuY49Up^O79;$%x0rQwn42TbAjOVxz@(>FVmn7~Dd2yIEm#b2MUa zpwO|ZWt{8}NEhVimrmIQB|UujuuZxXHa89e6C3-!jy_jPVj>YNDC;+3u73#;rgPui zx^4XZ?~%o@B=HlipozJ`^0hT%Ln z)Z4obdw@|}*tPYi0I{Nh!P#ndz}4w$HV!tnF)TqiySH!Owzb_iFg(69Z}S>MTZB3|kRi6eHCKOib#)Q;^5x4@-CMVA zDaMi~CMRoYYMPmu1!s_|s;agXq{qhMZoBsN_97$bxvv{TM~(FL?-&WuN`<(7A!@bRNEx6JtT zLt-3X_jZ@x`O%?KT|ogGf}V%xYlHx@Y93%c3kEy#8V`Fm-UM@rLA9O39A1?$P ztLxR~-D!Tqse9yHKsYMWt?eR7J0Q`V@Np<5g)Atko1P#nEX*j^HfSzQ*p>|O3)-pF zYa(mPTeV~-+OQzX%E~x(ieJ5s8J6M3@9-(?SEynKFs>~@#Ev{dp*6q zl;q?HW%0Rgi@nhzt;ZRnL9yh6?Q7#9-@d^%M?w6;521*@DcrCGzI^>kHrc)G3{V(> zh>MFuCZG{@3=9w!5FkbbUi?8toSdJ3{`?vG99>;3Z=gaR0}iYw3sR>t`m$ckyuPCa|55maWABF2>FbLMSa#5^x~mWb1Oy}`$-SkGQ0a_Lo7K;ut>@c|1 zsomY(Op0-ZpFSDaIitNGW+0A&%M8aA9~bv=WDW2J+*eqFckjB7ebR?Is5SI`{E51GT|w_T@>f zx0@;l+!BI8z$if+*lKD&_ib!=IGEW1b3GnvV?<~u@Co_?LocsW_~vT+IZ7IuSM7^x znc|jqcCoK#n**c~IZaLXBqR(C4eOy2{pm@D3ksdG&V7^8SqeF(b9!p(X_N0M5P?^( zUQy#i$NhbIeoR1j!0rN4huNeM3kv6gZQfZlfEtFp2(QB()OAUJ)8`36Ax$U%J0f4bpMVFlGxRh3O`9336?_xHosUhT9K!0s|OHbx+=hPLi|aZ)C;s)+~; z3X)Y(!7af}|1l3R%OR946xhJ_`~{CUC@JWmwKvfQwyYW7@TBk%@_kEqn^y-2y#5Jr^NmFRZP1 z@ZGX>ON`+PVLmDR@WE}d4eiP-f`D#C+64jSB7sypv#9M}Gz9uh%8!Ju~lle|2< zVQ=CHtrACdyqu|a^SH|p>hm7?hBV%wA6UChjb(E9;S#vh0TIwk-T{~c?j)Y6#+v-n z&JNZ8H9t8n@MGW$7Z(>PDJiwJwNN0QKAm&={hc9I1hsT(>Fgd0O?FbaoIx&C zA3w4(F`>M09UB>Oad+Q(CLh4@W_of`i7`<~Sh${3OJ5((uP8T{f$u(`7gayMOX%bP z1+0bMH8eB;DT2k;60c!tX~~m113Y|wp7!=_U2W|Txw(tKe~&E7Lj8iRk^Sb)gMtxZ zAt78`TsYUzfVpAoO1K)s!yH2yU^>yGLd+}HkAK)$dx*P@vI zQK6R*-3R5Pozjjn3}laR;kTF!n87*E@L2Evf1hB=82aC@u~b95wKQ9Av{R=cb160=5j$-8&cKzd#X8Q9xzf$Earm2~Rnfsg(9>(`^59l}Yaf)N(6 zky1S_EC=nR!n_A>Ln9_u+aDK44YsyETO0n+CK$B?@Q$2%}(-jQUWO?iQvVZVbXv zlpadk%DTF=0DC>Czpx|FLu3m^yk>w$dB4TI5s9EoogZz==@dN9zOwZ^DZ9n#-qDF? z^XF1FZ)gxdm#usB2${tHAwF45r&-xs71rq>*GDJ&or{jhF7z?L$n?Lt7Qsd|HO*;} zdzuw8HzxN%6Yja!=bO^&CI%$zm3ph_$)|Vk3_OID9zD7tzK82$4cw|M zELQW4F$t-34W;Lgjf30U&B}ma5NBc5XT<3_D~+!9Ejt6+{kOgj_nr5`I(605LmSEt z)*2v!QOoiqY?n%VW$B@|#aH8oIX zg90lXh%iGzU$UDlU4$MC4HMu=Hwm;rlc!ImU@IdB5fTwCg8nt^U!|1ayJ1H{mmTB} zLTX24bv57^T4{f3{lousOQc3o44)SnBejQb{$WVkVNyO>nDz|?Dh_P)VgeHh;c|F* zd3h;!C3ec9YHRzMS)?8sajR|UCBtI2LpJD9_4V~QMojrb*3s{x_36rs74&j%=@Bqr zQ|5-!aTC)T8ye2kIKFaBur4anPDy!BgNBNSvnRgi0jqiZ)8!Fuj?H8dWw# z(Kd8EyL>xzg{O#EAQP2PW> zHlNq<*-`tycaf7tCCKF>CWWwN&7OU=$ui82aVI5Y4t|!1S@-T;PBodU@NZmHS(Hb* zvNd&ibssAJQ9P$tLdJ`c$K3JE$w&S5OMp=5gpWM7DEfuJ+`Z`_8FdG|czMj0;-5cb zLs2X90&||_9_su{D-^u>zD8jqVg{{;pNh}xsu?gTWj=oYShQC3f4|ACj(%tvUqODK zP)OZZ(l7cRX)YY^;drTXDCt8>FR^J2nZZ&*N&dGw3V9yGL-?q{-jxdfa_pO`k&d731*T^J1dcaflhVR z&Bx>2j#G=MQ$OR(5Wl}TI_JfwCOB4osd>vN9)9IXG+< z+rk=zriO=|p(+4Mt!|pXT>?S^T250=j>F>!dZi~?Y^r{#sD{tzmD$DvLg9R&A$1GD zviwic11XG{=Z5Hd_Y(nn_XB8G&ZG{Kbrq{7T#ZHjfeL>VkLgD(FDnfLG!& z6h*t)+TE*5`w0I0ku}w8TuvxLy{8z67Cr4MKH;$!L+^t;g;B!c2q=jcmHk6644IE~ zI|K6y)&ICH4|HTqNd^c`m&vHtbiBj7L;A2)nmgIY4jGpRzMG7U|~T+@C{Ay-eH$XVZq>)?CCHo1Kh`aR8JMr4y;hw zABAOoALPQQs3_1c0XqY;(th%Ul*eV~SL^h&fyLC|AfJ#>rL<3_M@76BAqoitb5Fjt_NXio6@v%Gv>*Hwq)BA6_2u8)O^$5D30 z=(AKaiAGJeEgV~i77-O?;F+EDrHCq zG_@#LSy^3a8#j~Fnwy&&ccuAjXrqzi7M5Uq`h=oRh3XdrR0K#ztDVivF9;! zbZCTP!3g|FCX|_Y?ekOW@CS5T0cE8KI_cmt^PxDDVCE+l7R=?Pj*It!azH)cH~;Rc zuc@FA-mH}l2ran>WS3hip)1L$_w=S)><4v60p$3gD2FDEcqo&n_C46DOi>}GrG+J! zsN|mzNTy1vNX#Nrl6KER9JQ|a z-4^9>acXXEZXRfusBNKGBquelr&c%-t#EF>Jd3km1D~Q$F`(jM5)m_`|G+0806#z| zrjyvy8uUaciYSzmradErO7(7>7C$H}QG#-sCY$`ugHSNQkV32GHLBfd3&ZjIdRI)0 zBBnErR_dKXo>QGseuXs%ngD5cex3O7y?@b>+bsv>EJ-<3-V;FRjam>9!K+s)qpTct z%^;8_IT(bO@|-49uBeE?Is!@7ZwKh*g8%tTC~%y*U!Q1c{SGKRJ{AKhg5fvmxBB|u zyC)YHzM$7^&5B9V0{s8`{{4HnzVHW5q8Y&Ipqk-#FP|Rnk8c~){Clv1!z)p8HGvMD zJ5>H{O3HHwhwCo709<1sGgDzVo2}sw#YgT9vA9qq608BKxw*Q+2c8Kw$!cm6Uq`BS zbE`z))7;nD+}MD20IKtjX9GBB*V|0;-96n?r<0qamA{ueQ&BYGV$u^4=N1=!$w!&TnH5YK-#nXfc%@PfSonl=7L)FX>cXC2z4p5>jdXl0@*kBjT zj*shvmv{y6dB4K1U2`eOmUP)GV3E!RGyF0JGinDaB=|Wf2yky6|H@?;wIxNE{#$Y1 zIB|mZOrHo+Exi?;L%2Ye{}JV__)FX4f7GKrT>X`TWpWZ^m}dcu%xz#RxO$ju60Qql zBT5gC2c|19HreTwEJXgX#Q$Fw09rA)%}?(MsW%#+ze)Kt?lIF;|JH?w^}f>k$OO#g z<>iQuo+IsVc?y?`Iw^))Aw#3`@cG0@QSt&pLh=&P{$dShrR{ejOe6xdU$2{?vt!;5 z3sn;knY^Eo$*-?}gR9!(n%-Z@=S68yXxxCJ>&KPydZ2cjbw+FCDS%SKzJI!$YJz^J zsdZ@`8=NBvOiW^ZIl1vcm&eu-^=Ee?6ZGkj;9!MUlw-5AcIM^))df5m@UcZi5;9`l2??1gS(C-wHzt86 z0z(`d9aTxc`=h-biYWyZRXmM&`|7mK7FJfU7&X~n%f>i5*48;KG%Y{evEw3S<^sn8>NeautDhOIrhH)C#k_i@`uOqn z!CG>3H1_mRl<8ErC58x1eznF8EJG09AzE2o1vvh1ZH)oN(ACuyfq=lm^MR~avpW2* z+3(bq>FEbtzjCJrKn%MNTw*v!1cEH)!B1JBtChDsqsBSPZC_%E~=05qG<}4iAzX=I#UVBgS*aM@9$<356esd9LiFO}dn6 zA8Oy+p!dx8;o1cULy`n+Wq^E8pKk1ctIOjBU`!#me&skF?|2>_aRV$(zyy2-R`-+iGwHw$409_ zt*EdNbc9=EWI)}$2N|ikwq#{{Zr%D{Y5>kzqLS~?1_i7Iy`@)IgVH-O;`4p=k@7^RN?0~!mRzEN-9Gn7NRcFrm zrZEcPPuEql3FO_qz2l>!^nG9kf#L^k+LVvH;`t9}S66wF>U*VkE3>NYrY|h_sqWo{ z-&D2-h4Vs%3It#pJ#8)_CFR$X!~(roLrV(>A0JLCOFH0QKoE%ape#xIo)GFU7Dvh z(I=G>&?tn8ho4CD?7@QvAlN`xh>wT*uLz4rRyL@rN;vW4Q0zMd1L~ktN=pM{1^5hE z71jixkL0+|p=}{kfz;Xrp#tVpZfM$of>8ua-W~rP+Ks2fIBaIbB+dgw2m&KmfV#R9 z;QmzA)U5vb6H6_osiQ--IVjKiAi>*rb+_{G3$4wMHodJ31Prc`fFmRVX`lM@q{g9QSr6f(k5G$T8E0bHO#{4entRT-%g zTqfid2{;4tm@H7SFHUyNLGC1wz9}kC_kfTg7m+)3o^`a;9sJB510|-C2`5sIUfOQSZ zHW!zd$D1<~V5TqM!h9)GBSDINIVYi3QsRUkzSWjY=qjH1bi6gkl-vXHnB_UuNIrgkSp(~EcI1>D-4>I)iCCRWW4CWzt~a}ZhNx+d zl8Oq%tg!2P@bfJ~V@d@0_}IC)f#*9#*QvIf^- ze}5l%0cv$uXJ^{GckhXZ5oazV+28TM=M}`SIEq?#A>;8vj|TcMF)_hwSY2FJMszAX z4f-Q&3Q(}Q3@Qsngi%pZfn$=BlS7Gwyw3cCIB@D#S65LGV8P$$f!o z=eK}~4;{OzvJ&w2?A#p2pL=cBiEkR;mt3!RL?L}93`YL}wjJ;eFd{#F{+#HNpjO~8 zQ+*?E#@r6T`R(5H?ex=!>Q39l+aRN~$s=WK0q{UVxnr zyJt&-HCZ1TXtjx-l}9kH5|zkA*KlXX~bA565nY@ld|{{=8x+ z?!BQ3Yeiq)183Zg)%1jfoc#Pyqgse*0Fyd~>}6{js8A zWOCATzQN1g-JMZ;*rf|elD4F1>TpvYb}Hj$VJdQsos+xAbwwl1LP4A_A+s73bO3+g zOatb$b#Q>2Lx7F#?BXIP@fFFu_$9Rq+wKoJLi102%A))PB`}-{Ymi+8F8SbLs`8 zFAqlYm6NZ|{@vs#s6^}|1tqgi{r3U#kj?2ITD5)rp<2Y*1C0@0)92At>+3TT?P{?r4 zzA7a%vo83)kwyN3nx`sqk`aJSh}Nh>+rz>d8XWu;P#EE^<`0Vt5eTl-7B<)%6P=w8 zOibtyzgAbFl|ynWd>reZf6ut=-*!z0s6?;HE-t7@8nC6GR- zPdDyyB@Vc*^N!(&KoCZ-!-k(e1C6Zt`YJsD=am996_k6C7bhCOamukX*u<&g`Th6* zzADq9Gr5<9`62%->mdeJ`VZDbCGe8Cu?XV(mX9`fNEnEwXJ+Uik~A^lvE2IxIV5iV z-#_R!k>4DmNXXF1xDb$4t8`nI5bpd!l zd@WMm3?xApmx{(lzw6JN(tfI!y$8MgE?sYD-exzsdY3KK@Fn3hGsxRga^JbrGcaIM zW){{W2Ma$oGLn3-W$@PuIw`5lePnWJ+D&!(LR&~~LKqc~fZ+CIljC9=pbg){wVU)$ zJS{g5k3Be_<(4rJkb#U75&~Ag4~Rh!4TW@MSl9!|naaqtK$L)pjO=^5IG!7-U}_i+6Uq)8zY!O~OFeUv=B z)aes&YN_B{o>eb#!>n__gMMLayYS5oC!+oE3p#dKIqdDl&5IwBdwY8znr)g#nk_!x zJnCH^3oyRyTB{tH-}OnI;yn*9@Qt1j;+FoP5Z z6?)T!>>|aKfAYsxdN#MWJI`gtA;-Uy1J6pP;BY>GBajkmd)BvSP%`sM_g?~ky*d6>!ftnDqo zd2n#BimK|V!(B>Yo7Xip$Mm5Q$ZmoagoZOr&z?0mdxf}j5gzcuN{596ydsm|JRD$i zqS7BJ2y85GZ^xV2S+_oOtRYzNr#f<9d7ox;X0s^K#?;Q#ycy1E{p-;G`$yWd{Fk$} zWdvF>c;WZ@71@gqHVw6LKk~3y{aRX&`tx`fZIx*w9_hlDPSSI5POKJIR?ze#Uc6!7 z&`T%Lv(nhO*x;hJqPJR4$pZI@j*@Sj%Tvq;)|8uzD(7TdnZNQ@HzX(K{jE&tVOb0| zL*}Kf-lbIJSj~5T9JS=d=`67%ujkl%?XQMU1#JWd<1i^He?1j_dJg%Fvn4Y%9WrP2H zm5b`;vcKuNuDd@=+W9n2i8N3sY>9}u+w;UW-FJs`nyaj-@bfCLK+ zGNcw$P{3PFfj;lhekm^A$dz?VsI;G{J{ZdT!=%{JU;cVc9-H6K{@zOW(kvI- zxZf|jNQ&4BX-dbe^hj(O!FLt}4J8F28<+%rz29Euh`OxA0yT9I-5wo%0(q&Mh1+!g z74m5HRv@y0l3E*Z6J^Qf=cFRfI6It3aQjDzgMFrd3ssi5?fc})^pXK{ z7@~mKo!LJWy9=0}XilEQ&n(iez!<(rwuPAR&T-`8F}R(Pk&(5vq86c;1O)LAh#-!V z|DXx#MI8i2fWf$(%9F(ai%v*R4k`Bb_J$hoQIl%CXHfC{EK_2CZY~c8hd+d`-(0$# z$_}Uu*bk5W*fjKRoCspA>!N!^SH5uE%men~zNY+obaHfba@pUHzE_=3Y)v=W&aA)0 zC!rY+`+`GzJJ#Jbf&6fh_2M4LCNoQ&F} zZ=(p5$Cm!AuGZMwOH5`xtjOX~zB0vggmX;T8K@axhW{!#TkjS)PTKMc^(1_aC6Dd2 zu~c?!JV#<^hlwR^0LcWWSgw%(Al*RWyZ4|JfwBx4E}1l_nIMLP-8|Obp4ayfA`++9 zI?))3^51qhrgCd*>#6QWdQA|bM!jmT4_FEyk@zR^I757BdRCmtGrUtHhGxLMrGBsZ zC0N3l;%@7p^+Pswb$k07^2>nrVGaiWCS31LjenbnNW;ho%mE9C(E|H?|DF-iQu$&8 zQZxkAqV&AHfX%X#lPiFs0_=7Qe>Ldh+Tgak^coFEb9OfNc|TzQ0*(U%Jw#u?tp^qy z$m}zpY64a-r2d_8;in2xicG&+A`_Q-9mteJ!z7f@aTcE-Ll4{sv?gjvPe(Aq&yTki zt092~FJ#1|ox7tW?0vO!3}?U2{(den#X*Pz$lBz6xSquFsDt9}Kw&~csPwgvQ5ClD zN#Mhq10aDplOgx0ohWu}-e|12XXE@Lm$k|U8q?MpL*Lr}_1g9g;S)lJ5oCUMT$DSK zlCvEh7LYc$pn_l;Yyb>9x*Gc+I)8+dQ%jqf%sSPt9drW-mfsLekCeoe6a|R{d*zeW z87uf>P+5^_nqLUL1I4%FXK=@VF2U>9PXai+GB3||I@_@x6R+>D-@?14=o3Fr++-QM z_7=%&jM%>thyw5yX5u0Ox=_7zg=Qkb=LkwXm3OGLl8EtfYef{<1idkIDmrw|8~FM-N#y#yACjkI%Ek&O5wZ{-j3Xj`6?)a5>WV`aD1AN4=k01B;^8Di zc<@6@L;ck9lvm%QBD#i@jaSuu%;{2M)gf7xm02oj-)>b(!^bAwW+;wm{nlH|bDJ~Q z5^lqb`*P;vU*sf6F@x3b21}ZSjYJ#D)~w@C&|Lj44bEr_ibR35SMdF(o(hFZa=aEw)S>@@sV3cpvV%QdL?I~(ooBhlsPHy8u6-ks^$v; zt_xjVY$6iJ=h_SZ=*EsC_w=qUE)O^Uv8b|GD~cPn$cviJ-sZikE5@y@M^RMV`BxIC zrYOOPx!zV`HL$U{2@){Ob=cU}{~ZU8{r4cgw3KgGQFK;?T6niVPH>8#V&-1eEkBb= zAO*rn1_xc%1#W7hXw;oi0?$rE7kDmo^zBVhhLmfNt}_v|1_h4n^7ZnG?}r~m|hegjm*-E4qgEfF}2CbM+M36s}% zn)hwy%;2q3Y0l^OoA5P%sp1x39PXct&3QQJHu99Z?nHSvIs7QRL>J=_zaiJ3@b7x? zXI(1$Iq_=OHHU!9Di&tulL6`7@^b44G}&KghyOsY1}Os(I9KmMMM(*QF?;_7^AQcvqaCrVS(6VWQ((CUT;NtleW&<7D%LxYH7&RE9U zy70}LG04G#n9Mwn$hC(k5S>-Fw8$kzBhT4Xo0V#M`Vv_OnjzYR_5_WDcYkLO8e6

)a>tj*hAZHTJ{b+#E`bFCkps$fSr)PQDQzsh-J?qO?Ak zIau?htV{zaUkwZ)=$Y_(<{g(bU)k8(|6F#Crxp{ipREN0*Hxs!!rYwcx;74ccQDr5 z7nM%*@^G=5{^{nw_$G`=nS99lI4&c$_&J&7J>SC})wA@sGyGQg8Ld3+?`+ZyieUOs zKkd%DHA1)k!~RZ+tdpTNSIE^lo+K(U&rYyDiHK6CRzSlr!N>o~&GD_l?Q`39b4Zn~ ztRo*LHnN(UjApYyjzbcR)?It(gZmy}EZ?6cMWrw5cUJlJtG%Y?F!-cCT2$n;A@&5- z_u_4&zWeu+pYu0pizjD2P0iF!KFmFmQ*rLEUzmSZN?uN@Kk#JW`}FsbDVM#!JqDi) z%y1s#LWqvq)o{3oit5_)H#!3GXC;_Z7Y0)X3P(ky8nG&#dxb@qvv^*i{!M>oX12F* zeRW&^Yf(|IW)Uc~bGN>ml>x>|y12$#M~aeh9(Q&hcZN?fK~#tIxAiNQ(6SV;7BClF z_^oYQj`dl*wCF0PG5=t1`PIfA{`t}DBm0*~_h0ORc&^rbA{g}^Aq|pW1g&bBhu>vN zj49{SbAPFDSs`6$CJ?2r{2kJy54-YbZ?E^s4g=(pE3D%G6DH6Rzd$jDi~<4yGf|yg zT_9(GqrN#;UsG2HFpOq7Cl|@g%B;q6F{M6Wo;#8^$M0j=-{O2K<N)wW)v8RP2;WBuzzRT%!EEXQ*wQYRVcM?CL*zksTI-i@9?0 zDpLA{VVsph@cZ<@9cPuXE)#g64Zv)g=4)99WVD*u6OSs{A>&*#}AnuJ!iI zYU^q}4f&1HOY-ybZ3}H}%+^hp`My7ktw9Q;Q8yV5fzvl318qN&&bJ<<_LZT=(HZT?!P7oTOz?iTw+Q)8zq=FZH*1Uoy ztd`7;176vQS-U$&?J4VIYHVFA39rhc%c9Do%F4^)D&w$qI)_Gy4mT#L_=q0fm87+@ zs@Yq5Fdse~8{2SlGV8J3`|y$M6H;~#WEK_~<+U&Grq``d?ZBiF6y(Oik&=*@ zB4SdHr3r?ulo6Y;U@hG|W_|jNp`V=&CSEjO}1T!C1+XfTgyMFQqPb39z7(UZz%FSDg9JcmC=eY z+QRlag^*>=SNzejppVb7U+JI(eu|5WZfc6o&5h1w$Wl@GS9Jp))V08Re^N0~dA)Gv zf!IK*8lAqq#yjulo2r$tzjzr@aGb4BsOTE|FQ;1z_YE%I8(jVm^%LK82KB&~5z*aTJI#j*ydqNHrKt|B1;`PD>po z{--d>**P{Q3`s3ERRFDKWCwHjLgHQ-kd@MjQ?<_3iHF#Lj1L?xyI%gj{fqMp=GTY-UP~M@(@gj0yj6wSPG+u_$ zcYj3{+Mklb~g+94~kA~JauJeLg4Lv@!YjFn^IZdg97;~L@INR7bPzklXJW!_4v|@X8)m(|0 z0$J8T7AdBSlY<@c;)Srl6qpRZAgwCHDl%eCjgJ9qA6G%vn6@AvwdpQ7Dypm;5p9f! zrhtH^05T#}?CSb}6>Qrcx+Fno!M*4`n`s-K=f)Q*mltVgX*jjB&9%&TlEUM{VVrIk z)BF+1BQ_j1L#COa^%RzId6?fz&W#cOzbpW#8TT!`!20WMmhy)|4@mtfW%Gc11L|&#bf!Xct{S7jB96q|EgX*J$gp()j zy>A+p!D2x}NB2LT^SI_{eNIv|T7ZVO$<0lJhxdh>yEr9 z+;|9e-6sd-rN5*;L$5CVh~C|U)sU=dw3YSuZ&zAc#wI5At3mjI0_RbK!p5FO}J1433G4iqaJ!*=5bz0 zo!8T+PuVl)XQ!ichZ2e@e6IcFEI;h7k7agus^Mb@iNsG#6u7yUi)HAD(^S^%b9Cq# z3Ob77X5u4E%k;3Zv0c&gswzk-tM_`9e(&~A8?-z(H!ws(sQ&n|4O55Vpx|N*E;{^@{NHtvc3Y#{x=9@sA&oE$6GN?=G*{pkeGg9Apcwety%3D6PBA zAB+0Sf;Sosnf^qA4E8?EMU?4Rpc+SZ%s@U0tyH&H2c&!(a~XnWZHfqOiDlbbNfv{e8R$D)I#G}Sy=(q1XKh-*D%=zI(_T!UEA?uu!qG0 zt|U|Y4k3qse0&Ybjr!S6NESQH*54I@TyXs8>&sJTkB%l5 zcNBCkdH|L%Y&KZGI)KeCmQq!~*m7}wJ?rxaj4GHZ>b`Db*#M9&70VS*Xv+u_EAVK7 z|DDwT31W+iiVz^n6-1%maPo?A)M*ggMC3Fy%(l0;_x46B zUJ>^U5hdJcP&0DhSbnKj*5~89xG@XdrpW=eY%QY zNRIXLl-{pz+)QTuL4$`y6ciQpJo*jy2Fx-zN2Pc2l~q-Zp1Z*^^qyW`M2o6+FlRJ~ zI2}iy3x`o6dT?g6c;T5VAOop{-u$W*orK}$87#%h)~T2G`UVDIuH#KmP%At$p}yf| z+QSbJ;>L_49wlZ*hnpcLlI{HmZhh84t%St*WH_EfB2m}ft(N& z#D1;EY%n5E(3%I|y@Pf4?%j_C1^YTMEB8$T9i1?w6`oTf=i^fk3HIwFPu)10&V^IvYftVP#K_v)hKfixRrznmz(a`}hd^9uwJWkz=#Y_ngHC5GDHOD}f z7X@H?1DrZ&r7*At(?Voco-hQv+PMPOP^TG~>S(HYla z({n2;oK*c9`%K94>*>Ay_;CfET+>N04`cRl%RvREASGqy<-MLT3BXDvx*lqKtgSuv z;|Jc<`PZlQp*X%U{Qcm8B|OLnf~yrZH4YHcwekcTtYJh|L&FKwJ!G_{r6ov3ds!Mc z`HD?4z}!0s%<$Rp^p~s6ZYvrv1Yf+UgP_SG8?+jT)WKsl?r434$B@8GH&*JY`%Ogl zu7JQduYK0kzLz#OuugmX`$^gNf5%Jj%>zCx*q*J^${-@Ub&COqi>&Ya_weh_B#Cd{ z!1xu@&x8}W%Jz^Tk|Jfla|dQLVfp-Vu7gVp&2M{SgH+e`x*XatoHmX_w$O`VFx)yQ z0Qz7h_hj%rL%uHXx;%4(G6a#4WoO9otin>*DgI9<4`q&rh6zbhh!s19&jqllWk87D zykg3T#{;ehi08N1)s2mzo;@`-2IV0+DG3ITz%=b7gJciOO&SNHyg8pga~dgJDB?)N zr3HDP78?}<1E#yu`j*S5Hh^5loO-Ykym<&d7L-xs8SwW(x9X%&hWRVlLpM<%lAB8; zB-8*insABi?BGEukfOTnX$INt_YYzcmW#9sV8-0AcF$pz@)^ueL5u)q$dM2h0$zYl zAhJWk?gIaW70l2lX!Vnnhp*5xkLs7BD0CIbK^uj4nn5M{ke{C;@X*u6Wj{|bet2YL z%C34R??y*)avB;QMn-sgdpp+|&3k$-bu2r>nZe_Ml6dI2;h{+IB{1jINfHb8s3XZS zEX=0!EeVU07WhUfuRZx+6>3UK@Jxcz|6%OC!@2I?@ZnDgl})nus*uRYULhfxGBQ&} z$R61{goMgUloTO*WGf{}1KC7HMoCu2bAImc^E-~``R6$v$8q1sT{k}O@p@ga>pHLV zJg<@x0^v@2Iy(ys?2KZC$3ol?v4evNw&6+m)?L}U#EfQX*f-gdp5Qs?B!gxJ`pXpAoQ06Fi|IV~Df+@7$=hY2iAY<^dVsi=Ut2pcI?7D|E#-*wkleWJ3~XpDHV3x77_89s zgraugqW{&abCBMSOV;m^F=wVrKxzzX0S<~iDgp-&`Xf6AH}lTDdky|81{p?H64+gj z@V2_|Ny81P;L#(k`>I$43-<)c!|?djr>L)k2XAgZjFwCUHx8jdsHvf2$NTj8;}yfb z?OF|JqT_K5$abm`GA61(@+^*xbRxV&NI!0 zNz%@fc4t%7rwfr?c7H5{rm{;&LN*eaILMaf$WURcw)gcq@=uD^uPi2R0ukl z(Jl`<>Q}PK?Z3j=*S1DZ*mxZp{(^UwKJq>v$(vI~^qL0@$|ovs9ijy+3uBnOH**HNJny4~J^bs&A$jO)ef=L>d*Pb<$|8Z>G&Y(Y4 z@M&?;O(s2FjCtR_)8Ge^0A1D4$Sp6wZAz$n)0Yk@5CVA>+zAdH+L65c>z&cq+}!5x zui7DLBL0*spN|XNN=rL`J+{WS;LL%AOB^}%A<&_Nl5=IQR>XTBYF(IxAtLx4E)V+M zVD#UOF^#+ypBRpqn6L(K+WU(x)AF^hd(v>2TKe;cv48SZbvE<-Q!qWxUA&l8)ht60 zIdI_CYuoX_3p<+dXdmg_ZOPP3-6tE!L9+rPTGdAF56&|OD$r<|D-Q7V{Oi(?yeUji z!y=)or6r`O$N{pb7HD9ot4m+u=rO*FkOiw0s|4_{krMk$wcvOIJybtk#!C3283-6+ zL3wR2Un1=9a$L{q?>C;`<#_h&-evwyNSdLxZ)o5mKv99y$**yE8*IiaShbw7I2=>m z@5)F^!(rsOaWWNBjX!~JBWbyB4i`TuC}_Tyr*QNr{@<>;Rk(#^+`fIpx{Wd?e8B$t zzYe9_;JTG6Xyt0f--wHA+mc2kg&jm|B=yfOO4+LeO904;hrseJhUSwe5FmYhk9t)j zmBS%HN}!2ihXc(D$J3R@LPD@XKA04-3)+`K66>`1&aHg?if_PEZ$zyV$B!S=)Fcox z4QSDOM*1*t`L9ZC5>}zf$&Be;U;u)p01ldQ2w1k@R$hf$5t;z_ z8{~a2ShJ8$BjM>*aUQ9UDatn#!FB^l7HqUvufC5phk^c;j7$j1Z$GJecsXq>b{>LQ z0xk-vg@sNqIH(-y?_Y(0sow_f6kvEFW}~v(ULJIL!OHb=U|=12Z@nXckoj-l;HQAk z#oO|p?H~X7Q^DhhAq1couYB@@X8|`iH#o0I1MwfT`Ut5=oHHN>haBa94kn>{y^yiN zuWK1bIqk@>P%4yFRG2@vJ$~}lmpS}qG|A5u8sj$~L@qJ&`JmHg@D5V(i}le;S!j-e zD2U}K<2t5VxWl%%CU8@pfc)zkZ57VdnPX5bQA=5BL&et(C+&Iz%P`RViLDG0DGoi}qe_d5@0w?|`v(Uh5Xyh_2v!Khw{G0Z3YP^tyGVUX&;XS$y}1oD zm!#K|==#96aM{iW9}2?Vy=|o2{RxIhl+iZ90yvO@-e+uP{Q}tF;OSyLfWePd>+4$+ z5z!7_lGS3j84-PkAhZ8^I37={a+3SEx6ShnOLpO4v}^KR>n*%cf1YR%NKVbBncE|P zKJMfs-UbWROT2rWq(ghkZUa!quC$6TvYMp+Ks+5SnA>7Z8({NV5#8r0dS6@*v0LT}P8MOD>i!u^l)2C?26-Xo}v@=CKXM>86Kj+VYnNsm95Ml$fiBZ9BjkWZ8N z{cO77lqi)TBS=xuqYvd#`i?k*K+NRD)Dd)FQ^X4;y3 z9bB7y^8F}+VRJ=Hkc@eGNpkQ5@OSZ>8;~B6MrZ&G?R>PDE0o9l_qVQe9QM}y$wa}x z(-jJuV*`;5|L9m`obEL3NGjzGMw_$R5qAb!#)8O8Gb-}j`g$|GtTD3Vl%bYjg$lR^ z*xMsF7WH0Ll}Sgw`V3u*5?ADZr%xxtAK(zJd%s1Fl=^RLTU+dUPe7^&plE}@Ooy}y zdjRKCSaZ`Gkl^vM5S74idkkvPm2z0k;gmzQ49W?t39D;rAU}8i>2&4F>U4fKeisY~ z06amOU}cr#>P4%j`4Sq5bHx{_iGF?kkJci^7+0}ywNEekx9I}=CWnkEek`YxJ;((LSwY;Z(ejTowdEpTe*hTT&DqGO# z;3su-bthcq5SVum=70RNl?0O+XUH_F-@vVn8q^D=rN6;ElW`g0*t^#g6l;(#amzLl zaQuRr6Z!nRY?W-7mM%@7hP4q^{)cIgoH>Ee=wPf!K&6BxWV&C59Kc0KvlLkqzEXC zb*?CUu^_G<$Zl#rHdvYnsk^(o&o2S!H`_rN(T6vO`omMDuV8sbXj0g*+^njdRfFVXlfSiKDeGeKOD7W>Y@kwjd zN>rvuc;zl^#!p9yW+Gx6XuADGgG`c;UsIj?2v`m}1_sN&e0T)1Y~qdhR+T@Hp<10DN%@^4E@z2&*s@T4i~$;++268F`9e&FY1UJ zQdCq_T|)ylUJUH)>B-3-+XsLlz}z%V^a4>Hj+KuXjV%BwnYF$hon{6cVM&{?z~KgG zZDUiTbX%Sxsui6~Sw%(U|7&2(;nQ(ZxcZ^8%O_>q4>lO`F)6@hj!n*W46J=8Cnp@* zBkcnv%S2MaT_6xJ_5d{!wGL!VNE_+|O~|I}$Z5IiL5)L{0E+VgRdLnI)$i~j`wq@C zDs%)xRMJRFo}Mq(@)oS6iF)@O-ifVtWi?%z3aEeNm6Xi!9U$i%KVDF0t&tdrGT^Ig z^|LrieAEA|C9wxVBC7S7f2Ji~^ZI=$bt4ayTBQGdQBY9ez($b3ia2?) zJ3O4sDgw5F-Y}2BA$QUL7~t{W6UXprz^Nd|Quu+0wqbpNk--#RQ^qial_lyS`mZ=M#2mrvRSP4>@r>jfa3nlw0XO1Cb_*WBXW?g@D%UR}Q~NnJ zwU>nj{R3iEjk}S&i`~k>#)j-I0&YCO!>pyq`E|a-`w7z1$nbDD<)Tu8?E>xz2P6Il zIfhMlmJ$wCb)wa9$Cob`^!1DSE<)1W)X_odzw!5H-`Lm~B(SgqE;KHkc%P#IKhHis zdNvw9U4Zw|nh(OEGxm`iJ&lxj700LHgPBWEZ_RuvAXr*iC1qv3TXAxAEdkPGW0PxW zt+5^t+8Jpum=0iwEcgi}v(nLlQY={5yjOSKuJkTg zC!%L)25veaRQ#ODi1q#h2f$5y)72$NM~Sovl>{S;Kp%*ypatKDLWzY1j$iF7aBQ~8 z&CSK-uuJoF$VNm(kp_diKr|flgH0L?CPt+Hmz;Ja@&e5Vsh@~*pDKVvg3gDI2qweV zR!l6u%MRYb@mxwKV-I6-i*UU|RmBjKS6r;(@JVF;?IjpQfTa!2EiS7*{fLYVbm@{( zQjAfp)EsiI03*bNEn&q2V>3kE#H1uZ4sNclKibYnV86iY+1o^TgV;i?S`#6?B*K3?KTEtZUH$TJc2G>908tKGFl0?|5s+1 z5JMj*Oh<{Mm)K<1)qR6B3_%h4Dr6Vc?KskLCf(H|>I1NVuuvc>Kzh5q`jxg&wNvv> zRu&%GAzt26tJX;DI@nvxy6uk9^xNK2I`<97KEcw`(iJ{JSlyr>gVp@Zv}zvBm!i3S z$*!LegI&wWFEN|3O7dj}W%ZE6aB*D9d5LW4yt zmTme548mc3L{QB!L_ym4*K7Hz2>p!=dk_BjaYd2K#l|K~3|SWtWr7dVL`S0vy>M)5g6s4L!4YdB>un5P z+hXY9P!LSA0xCh@Wf|PWtuDJn@NhyXt_Y-HwiR}EUuR~BF0#?llwdEPXQ-={v;QD4 zl7fO6NPIGs6bCX{ZD$k^ZbymrWFhaV<=jEfg{|ETq1eU|0-V^q$tap|C zmw$0RFysdQMI`fzV)$-^nFriMe!k20)T&TTRp71qL(Ca_FI z<0Z#Rh5y3^_`}@FFb>xo-}7+HHxgmm9RWwQquXX1uGg-O`@=6&h%X8DdN;&?EVB~= zVO1~lVB$o0|J*GcQj2^4Aw49>$;ny9LKIB`g6u|_#)9f#Ok(S}<)}IuI-E}`yVc?^ zX(qw#D?guzreHC{jusFpoOvsqzMy{%xwrDjEiwPoaF}=zw5@#f=$Ciz#9??>TAHN$ z(E7ZM&)M_m-Q_ai&Vj93=+9?ilTk^$<1bE#sdtA z9LKn$EPMdk4KSJm;F6h%9Qon{x z1?duulK5R#gpmI>6qP8<^h?L1P$Lk#i{A5Qo$JU8raj~dh(QEGitg1QC*v-h3`JPv zLsSGLKnQu*+vvf2W z^o!H{I&$Mwn=Z>&Y^gk@{MN|aia6=}rL_uQ9TUD;flPjPVXF5=8g$rjo5iz2fo==G zV}LG5wv^nz>0KVBg0m1D3tBID)ZS9wA=uKeBjJ@zCY_H9M~h0Dz7M)!B!u3lR!zY> zY$eyQtcKD@NT@mGnFvUo-f#ItQn7}%j)P>zN~Puh=7g>;tZ%Imp-}}Qr~|oa6R)8x z2U&+8hY0LwW#i2;$SoFH&b|CF;nmkQgS^$76^L(0IDtt5XKGRLW=6p=@QmYNBxl~- zr+4>i(38XRT7?~pB|kaBOz~!M`_spdi8$`B?%(~5Sb`>ytdRvy;3b)!KCK~?yyiTc z4Yy?&IMo5ZLE8PaxER5gl)$w668w@p)5&Fg0~}4T{P8~L zddx4puliV=3eFA=_m0>zcyYf2D2Vnf(Wn+^_yyq=)jOySlXPI#%~xgAFN+dCOZOq_ z8|(N1lczOPrIF^rb3;k6bUFwy6a*y*_yJpZKZtDDIn2)_h9C}1j@Z&w^nDH-8z3s4 zwyWzeEYlrh=zq39OLnD?(FBr>3;;zPiVGaZGz1zBxu(n~6HOtc2r}59n_!Q^v=hZS zy!TO_prwafD-Bd9BN>O1AK)^M)tfOfci}?TTR+&{-Hl9)sGrmzt|QD2Nfk52OGXNY za`ViE3y`B=>ysiqW?`WuV1*&x{9Rt=lCZ=E7ZVYY!%v|c0W3Di!WOB?hiZa|7$OIQ z8DK24*z?Lt^mfG2g~J-fr6UN`PH$?poriWDJ!3Es5C?##03Jm3vb_$5d@wm4Pf_IxPLb&B!s9|1M)?Vi%#(x`mqRsaM^@b81%tS z>^k)HvB(Gn3;}^t0xBP0c$q@B#dXw8AhsPwR*m3D;eN4VOkW-sO2&d!fh!}t_X{t+ zfGsgh(tt=v0JuapHyW_QDHHY{vrmx53+dkjqzM2BwO;98*h8#-GyT0db)rxZ{S^)L zWO16I8Xz=%{`?m|Ykl}}aY=d+-*!?)#_asOL5|_-mOe6NqAe2V675gr-y3W02xQKO z;gSNh^Y`ZqhK3TzNE@=N@D7I>^zQ&IvfStE4Ii$Tbt(Wg%JKubcWOK-CO)zn4gd8N2!qL zOt)s|(8}gnHSE6Yr*boeqb!J>JT$p+)~*~L#mAO#u)RdX;QM#5N)Sh|X<<*lcGcHb6o(5?BOuJ6J|L^CzwD0$1gsA<7V&Ga@WRNc9sKY2q`I^d zhnf8OgPS2*abCSz+OSReK@15gh6mv9ksM)7Q($WW#%r*MM=XO|09IFN>0t!zk`hDE zLMm>mBJ;uWR8|JQqXzOBkjD=no=@36fO!PKpVwVopd~@G27rBtu^6>2;?RMVH|OC* zy9L$<4qKFYD4AeKGdg)6H;ZdU5e0gew)QIsr7v8lnHw&C{J6>Fp*6r|9QuHSt41of z$Pv+Rq*MC7Vmn5cH+YRPr-W3^Z?}VJ*#8R*Hi=(83k(P|Yks^3K_N2m)u4?6XP*H6zooK&8)P0nCZ8-z1Wgp zzlF2B>HZ0YSYhH;QJ;H~qf>iJZL7vHhAR-hAfQzuoxYWrQY>)6Kj zpgnFIaPakm(1vIp{Rs6JEPH1~2KXkjndxbZKXNy2rTzzT=V`Qw)A#n?SXxj6&XbpH z9G^L8Q2!F{`29C-M8fvL(?ipJ0Jg_VYH<#JQ{O|oudN;3@B8I$@?74-qwVhv3Dh;V zM^Cu=55^qum!Q|u)D#d90NJCix|&iHupRvHgptaDa51lorVBBaW^e$50;(~;jw)dN z-@g+&I$#dy}arXA8QHQrf#@!w9T-(d7PtWX~g$o)w>7#$6OCa@lcefal@hC#uZ!)7AM5<3Mf=vXzPB3ve7GE^;gR z-7Y2;peP}Q#l)0=)1b<8?ZeR|CoezH-hK&i2~w#GptTT?kfZT)5~wHoC5S0tUz|5G zn$|qiSFAz`shurJwWrm0v;-38o1E>=Ufvscv$JdUPG$-Up!D;G8K%Z5rXMzbGPSoS zzg08g&hu33dDCIi({H3dcqK6_DFS!_*P$N`7u|&i7neF_8G#gl3jnSV%p{Qe9AOia zk~)3jL~NBFK>P;}Ca}(S@7YrmBZ1OWSP*5q0Nrt;ld;<1LJ;1*J$2`;)Z$`We?R|lLto}g>XS#n9z89>)Xc3w4|Be| zdO~;gn7w$47=CZNTM|{UPPLZ7O1!vgc-!JXxxwGrQW5yI z;=nJ()&`Rf@9e8kCz=s(2Pvq~?2p{IE^?5)wMxXac2db?goKgfotC%yqrCim?p$}<#k;G+YdQ6-VT=Fa%ICK-a!eYVzY_<0x$|-MuG3P zkGOny@0PFS#r&~T1-L9Y*i={Fsk`{!VOCPXc1O?7(9rPeRk6w|h_vJ5@Cidp?&~X@ z!`GfYlc{pv0c(@VhQ9<+MeJ-$HG*-(v5h#0HYpVn&sA(}qhrBmR6kI_yLsB(_fnvl zotv$lgZeqUZ{LSn{=^<7Ghpms3yCwbiFb1r{L;U!(03t>`fVip2fc@R^4@!jU;XXq z=@@tQIcf0Q=emNw?H}{}c9}Nvu(5N|t>XjFijc>^q14~Z)U@y70ob?#{`DgJ8CYU-x*qd!-%?qHSbnJQ%Bf9+?0RVSE&P%H;k#6 zvmS|Qf6QlNWtI2Uv#b>t?)YhG`h%3?51qr?xnBO5MBRrVM!4_8Fd1Z21MjGT`})eF zcoCqZ1j>clmXw@|Ko}`&O-1(vP0O`;dQ|!(Y7?KIX0Xdr!SCVNPTdoNe>EQsi)0$? zn@VR!@Wx8BZLHfxMgpPyl&oRfb|Ym=LaXh$OP7NDGM9gwJIv%Sy&YN_TCCt&jd@2J z%|vP_N%16oFs|9%gMu}EkT{k_VaWMCe+*1Q8<2k}DGj%^9RH_0b^QZpfmo{@{d%xBi_59@ z8vxDe>DP5H(Vzi@KlOE+OjF?9U8(#jKeqTvKyn5Yt?87W9wJFe-16poaTZ^hIKmWY zK&cl^qrY({@yzJqrBCQhk)G8mStUhC*{xOq4J z)rv|DO(kb8)JwA>|G2Il57*bHQrue5)Oq-3-1T-_8}e$5mk+EqN{YWyeOOCBFYIu6yERORJO- zpJtmrG$Cjwf$$Du0Kn!4MMcBU<7#SrF>p&}IUcBYcD6-v)c%nf_xqx|-;8Rk{fkm7 z{bL|)dhc;R)!~&pHEvIn^9yPoiX`NI(vCU7_o-J#O8W12@h6X20ypkZ2M22NPDE(( zp=1a2>Gb}-+Eu1Kl$4k(Gh6YvjkAnbWj~MPlGS9L_iKBLESJ;G1vC^>;}Sl7WdGDs z{xQ7|zOJNiHex|es*@MAucCZOO3FQ)nL3m*2J8*2Fr=6R;x8>F;AemilfUqRYoCmn z_IYh~bzY|LiJ?E9(k1#}lg_+uyw&XT)vrG9nm45q8QGE^dq>;z!GbNosWALkiyB>$ z%%wL>%&`w2J@P`M1At1^xwzN1I78j`4JvnP-WO-ry{IwmDB?@HbR!^NAmx*XkdN4? zyBBlU(!%T4s5p*!$+ZUR=`rTqy*u>vRZA?nnr1(+@sb_l;%3!jQ&TBfStA2<%*bd@ zq>7G<1LVfEg&Qt!1Cm0!wENSOU%Wr~(MH|5-uLf>r^n0i90tcAmhMwtmS03|I`5gg z{aZ1g$jSwX6FXZ+!N+|OUS{AP#Tx4B&ZIYrwF%Ov-o9S+w3EORA~y3=!{DYNsXCoe zJLflhFnItNgDsUI@A;(Z7LsRf<&DcuyN?_`L?~fv(4xqs-F2N~QRb+8t}mUw?^3i? zB>s#)RS#5ipleAHflU4PLcioB_@wcGti|ZwMHC_l|~u z9Ipro(quT>`Kl)cd_O;bW$fPA^wt+m>0=?Bku6akpOsMztgF6Wu}nL$IQrltt0rHJ zw|>A2Z_BYAY}A~S(LON=2`%)~XAa8giO|$}PyJd*)A$%`{ES9O>ihQfOD}bg3GTJh zj`T>W7HCPm9F8$Ndqc8#a-eFfX>1IaUO1`|NIF1G;*_$B zYf`g8op`a{hv*hIG4TL11dGrR`X-i(&K@{PNHy=SEu5)6!iKp*4I0hwugqUJ?f)`; zm}QNMJYAC^?V~lB8ktCJ_*?hH?N#^Z<89M>p6zr>PSH5M9+Q@(OKe7<-3Bo)NW(B* z3NkdLvk)(Q`V?6GDc~{h-y2srd9`lmw?z4A&H%^ zFJNF~tRdY3b;~t-COkEUj!;-c`t*ssxnL+yz^SXp*B`d3WYu#$c_OeP^o!YOkXlvq zRk((qc7oa7wr9S6zP>wx0b~M$@2pY6$QK|_k$=bkE-pG;AZ{!4G}97S{clDisG;ph zBw#x?nF%qPT+Eb~0LjJROeBv^_L+<|yFuDs@*`!@t3y9!U9^SH(^b666^&l%V6{Sj z7eU7$5I{m^Vq(+zNB8fmqFOP9Zl)eczCz?N(Au)IxfgsIP}yKc20GA*w{OENp#bEP zrZl@!V?Y!`;>t(ZuEG`z(j@7>cOURYw6nc7HMZc+zPn45xvtZHNbo=V`(3h;GM3{Q zziUOo$MTcAg(mN;7%>K2d6IcCHGQlx=--=0b+^m<cU$e8sad8k9#&iI|7D^0y!);uUiHxPGWJd%kKNs z6fhdsKDnbuG4Qppa37lVRFO(9R-~jYvHMm>GLnz+fJeW?G5}d4I^`XK*QC%D?7l_m zu(sX)_4m*TPMw6Odckd1vqMJ@oGxNid0}|&mJp8PRr3wr75MJ&$p^t0av3@$fLG*oTkle>wB!1#@Nrr-)k;5~DvFHg76~ z#Ob#R%$Cq4edHf?21y3k-cY3&%3&g5hyZHA%#4H66tc*gooEx3klX=#5N%6XP*WBv zDl2FC_f%}&(bMW29gB>d9U8JwFhN4a_pG$mbyQbaWi;o$1f7sw@bm$m`=fk1Pfe8g zLF7Rqi~6blyyy;sBgr4c^Q$JPxDg%TjQ|-A{C#&qGHVaK9*8YS2q)6Sk>LKqCV6~j z24pcG_D-`}4~&aNOZR4-9msJQkptr?0E(c@6`Ak5N}BvSF>%aAMmM*BK&KpVKw4J2 z>rs+2F@XZP?fLUt-Vfohht^BP-dmL8B@5f76Mg3UoG7Nd<$jaARp{;BO@A_!(F!>; z9NFE;^e0B%X)%Jn03s@IEUCkXzo08EBQ2Psy9s<0WI%$dh6d)!ErXehYetkqCsV}R z6wN5093unY-ep4ka3?$4#mOlnG0_q#g?Y{mc3kCcCJCKq<>l9mjpcR2b+VhROV1UV zc*2RjAshX5c;BLL4`N7968)bauO9x1eQJDOJd=H@RHuKOCm?c6v-(O8pX6Ow?=#}s zLc&_gUja$gid*fbtH6^Z8X$`Uy9Jf~;Z$V*G=DKjnpCVG9-g}>ni?#n4!NsrOw4f# z*IC^u$`1-$=u@C|P-s%&fC}Wsjcry+bv3m@3JoinKCadF&Hnff{ezdE4O~lcv9uzy zPY)IV9+CvROC~1hDXK?kA4ioKhjvp!m45oPl%EP0*>pIV;Ao%%ec7WxM}KSbu^ODNgIqT<9`2XNk;Pdm72i!JRj@4w`Vqe=<*mr>MgCK z>KK*NTdgKlwiqe@9&{`6V+1Glhx5CxNP|ZKwtN7>^+>{_?~fnr^?a1FuL)dr{krJp zp%uMEJu)(aHlMD({$4Mh2RX|7LNo45(hPkyWY(-z|Fx;&?Y#nhyr8UX-|(F_qi0+w=p+;EAbXT-Z68+xoLv^sunxF>9TYJig~(Xbr#-*4qq0Z) zYc6*?OZ;PvPm1(N!fS!15>)-5|GpaXHN74eRaT@@e*TpA`BUKf;?AWdKP4fuX`+c= zrZPsxE-#FBuiTcaV4KPqQoOcs_j_757g^co78>$tS~6jn7l;^f)t54woCqgaT9Zsq zgIX2P1Rm>}iM4yo@ux;w?!zagqO<}_#j~6k`QXpZ?*xgBsDL z`x}79=M@#$K{RynrovNADXpum918`4&4VAX|*1aU93R!~+Lp2MN3rNbO&~ zem#xU9+XXh{Ln{n$T%5834y2p;_yfo8|dxCLmBPe-reX2LJ24YR8vUE4y`j#YZwFn zRj->-vepGHyvxiF3+LGN;Uq2w?EtV$H!<@Ba^+WXtnLU;U_67i46J_Te~-gZBs55e zhUI=_D}8S69>1dkWYdq)V*(71$+w)!*I5Yo;1!^xpbJ7Vb-Liw@+TytSWzvqitM8& zFt!*d_Kqfi0#LR>Mcr@y+gnRRnM@&U%`ap6fK_D3k|POG({vX6N|`ZXt^@=gGQ#c% zHxE`V)BnQ-fJPEb0C!>fS<`+e^1DMbd-n*wcg2+xybF80w~@BjuF6Fb+aHA%HOC1xfL-_ThD-j#Lg!D8>-kN-9 zcVm120dpC?AwjEsxP?KWBZ2EcfRIRBWx80uI_g^lH1?37V7pz}wQA=d;|4B|vlP9W zo~+rtN-*19^y)ote_Q=Y4}FdN40udpE5Ig@5NVMT6%ry$2FIiSh=dXJw$U}0_NJF?;#J# z6^Ic)wP5b)0#6OGLtvV{^WTj@2q9A@A?U{f;_&JF^!fAg6DPct=-uRIeLqq-I6T(d z{%cj0ca|!Z(pTyQCBttn$p;);|}=oQZ$;Ui2k}g(ayb}6a(L}7GcMV z$&0j{@*YsHyo|L$6~d$x z&@RB;8$7K6k~KPw=mnvL3j94E>lO`nE9SKt$@biz(q1)Lmffy93>edJ1Fc=%Y>^Log`0C*3&y#Rk= zrL?kg8EI>s)P$GKk-n}BN#~-3{Nz`XIb^}n!p$+iu)(2qLB=J(a9m%X`b0RWEnou% z`1ttv&%A(225}Xkhm(toXak65!k@jUm%P2aKn;A?-F^Pd8Ss~DzySqI4^(9ELraNr z8hjB9jg5ayPNH86kQe1XX8c7x622rEq7z=ZAZ=`-PEva!I=UW=xo5_up$7TMIs#a4 z;NQrkD`Ai;0`XOUG3{e2yjyMYoOmC4WtONAr zE0r{P9|4KNNsqO$`LnnY;$!TFcd1IhiG5R0G(fyUeu_u~ZkN?hC`sR{l!#Ii0C`}5 z0~Hb?TG}*>$o2Vc9p!}%deZAp4s~ze=g_ea=9tjuRS}!LtE-}5lc3=lTwGQ!Tb~+fnd|BA zAbadm7gr&jmv>!6Y;TTHBz<@{@<9Bqn;7K)@uRm>WzXCT7fWfiPqdcq3>^W_&E-Gj z@2Wn6vboE;v^w{MtCbX!jI3->*#`&#kg?1^fKc9I9lIY_{XG>OU200oCa%*Wx3ScM zHrG=ifCHG)+#J$6&cw{T$n4C|T4r2GloNqxY3kEoV&&Mku-o{*W zNk@Reiv?U3aDOd_&517@^aM}~Y)1Kq$R&qbNJ@S8O#RM ztM8{hM!XJVSRNkH9PHMPToMZB81-11+!VE<2#wyqBgPP08NG^uko@6^rssISv}2 zQol8Igpwoh_-lV}E1>O99Qy>w4_dEQw;<#;;B$hli(zFS#SZZ@Jx%Lkn>s=xQpD9q z`5~7qsBRP4Efz7_AFyUdRvv?s0zCzcb%kPT;52b$Dg5@;)OHZyJq1$n2*Owu=prR$ zWqYWp+nGTeSldld1(Jz?D5KX97N&uyz#cK!+uzYP-Z1>tdh7bD8#lc5^&j{rQPaC4 zjX{P}k7fqCdm!b2Z-L|w?=%SXAmoO-6lx9p-0c5+554!f!8@FjlCOcxI~%+%d|Ch? z1ArJ{@I(Fv${nO=!|#3`#p6aqfJgL85OQ6HYo#&H3Qb^=Cd3fTFlXoHrX?UIT2#C8 zawT+kbpf3blS%CYA&`-Q0XaQr4xs0i!ar*E#t*m)&Ww-e+`kWBd!mvazDhK6wx=0$ zm15q%H@u*({%7Pxg8MgP&&Ppe)6$^Q;*3YH#sr`ajQ`@bF#YXaBCkd`=Xv4MJ6-8s z8-Yt>2DdbS@~iOb&^lIVD21qk{SK$rkMidih!>ctu!4Aui{DuNn$WKc(crvbA;|q0 zY5jd`^B<0K#KhLfYv6cyba#V*b;{7N+HLAadOG{L{+^!S&=!Gbn-8@e5^AuuqC)K* ztjB)O&4jtwPA-k9$?1kii(uTv%i85-QrVkZj|)|={R_+m&!KIgD$4k$?F-F`8+#9~ zoPE^9($E2 zXxNXu46G9fT~cgbp)5A5kpzPQ0Rh70hU{#j=$*mX+rin6j&kmWj4n@b~Mm$%s2#dFc@M6mLgRhsD_l$MAG$X`LgN&{ zqcjJC0(Q$iCI3p4M&K1JoCd3><;Ig-agISnmk)-=b?f|&@ai0*OQghM3UCU;l-_an zKP>+FgEgn7CNi|;zLGx)4acw98sc4p3Mnck1~$ovcTkojtNwXz&7DgABD1P=lNKaw zoiONuOak+rmIIF{g&SP<_z_1(5IUI^fGmsa1_~Z+WLzkV7wpssK3+Ce%4Y|zuWBOD z^K3IDV$$Us==r)4Irq6x>~6F4kfUE;e zW50LPc`;Ega)+{azQ0nAh9^i`wbj*@jJ(&b_LtrQz zh5ygqTUmj_&}D{y);|6I6m6seQ!h@h{JZ&h8`v+{Ze@3YZ7!|J~}BvIQ=l|M-P`V%dA zItAsfmyh)4Io{noneE5JLpFUIsc4m#Wo6?6Qt>Dt>%>9h&~{<2QYHNFW|3bB^734xV$U3b-?!`$wyfI+GMdGPQx8AN=ptH@#98>aGq~OVc z3PyHF@Y42WC=Ci9qU6^(0md5^b-xXSe5e{hzD{j#*xvF--VcM1%5KWLdUm3;@|h#O zj^BrOniq?=-Q-bvm~Z!(A{g=W&K(wf7RZ<(J7E`rBLeOd@$uB&y&C^BYC3yX8Up6| zI7g^k>q)6W=E5|z3YA-VdF(`h*e9&9)x*zl3fj}-REmru$^ zG+P4YbrEpNaadcR+t0^EY$jqN*S}Sua`cp=Ebof*8LV)mqc{Up2*an$%whOtt%bsJ z9^}nos6l{^;QzL^v>-@8orH7~$2h=;uV24{Cs1YGzMDX~YuDYwHsmW;z~m(k(fSu= zCCQri&YXRxtE*vh+WCtWGu@qO-#wp^lhJdcplDa@TZakSkt3`A%-6IX(^Z1Dh;NXe zKVP3w(Ge|%>(Ih2+=HMIRb^_-`|X)+=h5WAr81NA-uE3#G(}2^3V+c3Zr0O0s;I~X zpx|>1y|CZRhaXt<$PYk>V*_~sJWURcx97)D;v)Aa>Q%?b0dL`XQ4r7w$8iT;6vo97 z-C&`0aQF0-J~smD)lY8DH=zWe{sMvuBPQRt@dNdN0j7Ap`Hre|^oKouyocIk_BW`_ zcl4l6w|9&HB@8-4uo3IFYD2n7hs-kSF4BfBg>xMbN4P|&MlwS|!2A}--$C3?D1J+9 zadzE{FsIMN&EpR{RMAmY;4J|;3QY|mbu1fnk!#pj^@KFkAN<)Tv+t1Csq@^5E+gCW z=A@y~(O`ojl|-l+M|uOq$`ohfGAWY%zkmivg7LDDZ?63#ex1yeKZ`XC2b3rolOZz%7F4oYBH8Xg?D%ixTejscLw zwgREE9~M4ukk+6Q!&ckc_;XTPy1CC7UI0L`P!X0KLo$lAO!6)jLrjxhnZgV0ed4p* z^L3^0ed+64*y8>3#mVcu^-uc%KE@^S^y) z;(;WZddX)G4!CdM?B;n_Kt;kq2xWy;EI&=dNDY5;oP z{s}0F;f8ltkDMmTkyYbgJWGzF?WBCb`bb}Km1pg(UXXMH|6F`VCoLo6CdZ+8QInko z?IEG${cmDQrnb{md46?y52vG=hpAFil^X(GKPkcrqLjzNLFFJ1-;L-U!=}Qa9=TW} z{c|huoSChMqC8IbVWsG4BFq9I1j@&WksChX*TBLbu#1D;vbVy?`MC?&7Q|jr?;aKc zP|I`A%xZ{Yy%Z-IK)jdEGZ?5oyiZqZJE&J_~h=LPP{ zldKu#-zc6oKpFxE7!O%lc?(;UkeHR_Y-585zYm)dkKgpd1xnh^D4D`TWr%Wjyc z*@GSrb^^W#5@2WneFdXycf^DId|+yBFvSHy-%EtWd|3M1x8ag}b{VSpI5G>1{)(qR zQ+T6|A9v9Vz39+1x!A!eOqWNkltKxyH#`ac{OI8a_W-h!1N-;y2nNgGq{?Qv=fq(N z2})|}%~3dOb8`owa|`VefrlZc|127dx`kXq$-4-^l!72k0_z%$E9`I3tL2%f!ggfN zX>}~TWi2TUG0L@^?Vm58Q(Kp%Hkf#F$vvDCyt|!!+QPT5bUiuy6nX=Y<8HFG50r+z zH&3pJhzO~Y{r>qWxsA=Va{=fG=WhRd3`4wJ|8R5OiS1E?e~VMGxw%B6>IK~$oHJpw zRvkMG*}n|_-o>}hIdg2|Bj3b0sGhOsqWqFR)Y#uK`8rEQL(_Nls&HSgWNpzYvgx!t z)P|WzcXQ@Cn_BIK3j!j>4_Jli z=!J1;7S5u{a$NQtDs=|N?ZSfBK-5of*Otfe3{St$A>G$f7euw2Z2F>g66F^sp}Rv} z?%Exlr~!qxq9fXMXgSY!Ax-(b7yy1H5#b&*VMJxi81A;T#y0`K5@`W*rF z+S_Nof9Ky2+I?)|hfz$XLUa30=pH^@Cs!lz@XdsUB_oShO>|*Q*6a{S_IIG-6nAln zjte)f3f3CrX70^=Ax)Qe$S=)!R>C>;f8QCaiP5jejY?&;G$bTLWnKCoJ&G%}DKa;s zNllgc+Y-wcO?lvLw7`im54~0GL2WvE0p=LGgzXFGD${D0Zt1LE?yhX`+j}?Z_f1{t zbcK}zY{BI88u#)F-`1TbUUhk_v4FY|W1o4La~1rE#AH{RBlgHxU0xvln!9*CpKY9^U@+%P4o*teWoQ zP@L97we^(3{-~s5TEPp=$|op4#ADvE)0O+~a>Wsx?W3-8t{!OiXiFbq;#90IE+~M& zX3fDt>)t)7M|wy9{<3m*FDuc|OcbvR_&F0sE3$_#AW}|1ojh1#p04uv;`UsouNhxEDxuE^DA)z-vw4(e?nRv1B=Kgcp z=boM|*n4c}vG*p1iRMZAO@t6Kl3icEt-Mmqw`X{AR>yFDr5N?Q&}HZO7nkkkUwmg_ z6}RAmZHcV)wF`k;nF-4GwkD6iuJxpy_842By>+W8M`Nrd!X!lXiOUJz#Kx|NPrY0D zte39tBwKt!H6iJqq;tmHd~R&a($4PDS*Q=8r+^2GzrX+4quJdqSFZRhyjX#FQ%I98 z@4c;-VcCL}6h;!&U5(%j+VAY#|^Z0Ock5CRLW>)v#int6z!+Qb)!fr?@x? zkv-ri@1#e&4AK*razUdBFv5Ra{V(Mb@@SwRnBOz`hiD)N)zy{sApk_kIRMR|`|1Z8 z9nz5<1dKXIo(Mf5oQym@mAvOOAX-0YBDutwbAW009f=)!cL)T+_DWDyoAq=&``MbB zz3uI1A%esl-52@!H&uP!*d@=-24`~K|2XJV?@mM0d-LYGXU}F=M#}O&T2$Ebw9Wt5H9b=LrHx0$pU~PiV1`Lvj zewrWvq2S8v*AAIC-T_+}u*M=^w9IYL56_&lK~e6oA9qWS!G4ELdtb+{ZH>I+kiqzap$ z1bN}%sp&XYDFOjS6a+L#-XUB~eewb0$^5UG^Z z`;jbBhN)Yx?R@HaBh&@ybj}?3(iHq-K_$K2O-dS`B&MtnZAE&2aHFq9ZI$@Oxv50xCOA3*vV zoK62_^&!}lCWML$4+*salxwBqfTE+&csv^c4rl06{VFFv$4wGK z)A(C`eMiH~y9kLoivt796TiPbu{kT35mMtD9ow09XL9Y&_M(ppLrkQDi%@T`ky}lp z@sP4ri!njPPg^}uX18dMQ6F*-t| zN=kABRg3Hsrh^eTX+n%QqGC1Z9_ne8luow`C}y3%S`?xqaDL18wP4g&GXPE&qv+4= zBJj{TtzNHr5_)R?!VH5^L9qIojn(dWJ3WD|c-N7J4Q%^~En^^6JdU_wKc0$5y02zkQ1}d4>?IYRN-4_UQ>XS3=+U^N>;I4%~*w-&pj~gOh@X zn6_$vKjCAJg_xpbm|x^Hr8a@EH}JTo+8OPe9nrmN^ktDw?u@%5K;O{lRa~OB>bOTi z`0;=Bb>{I@=WQQ9Np&JR8L5OUrAVkzNljTAS}2La)TEQ8g-nJ-S`cd5ZzJI;N+ndX zHqv4lx1vIpqQx{>4(&;W!Sg=%%s>d$x(*OihwW+jRBX{6;$pDMt8K#ary=vHHa4wx!i`32F6qByi@l9a6p3o^*^UC8 z#7ep?XPB5^{ZcnlD%?=+s-<)QGN*HthED>iKFXr_ifk*mn z0J`$&tUbZ3U&^Yn4;-@&iS7ny9b{fe9kszUOQgwMJ$f{zNWHvfpmI-tNsHe=&+kQk z`?QZw!L)br;vK9ec<>~y=Xw8pDU6?$WQMfW%dxc4q>*e1x#FN49$O3^8Vh!-iA3+a z+Y*y&o(KfwiCkIJ zxe`^0P)j6~opCAjpC{tA%sd8ip~M58Ae=z&uUFM`))bMN4>?*E6&3Yr$BVQzhHUdt z(mk>pxR4Lm7_nAhaU6U@<(PIB$-NuA1_N!}>GU9R;Ky%95|LV#ySlzFSBm}`}aQ?XdK%Lp$Z$oW5ejXj=jT}O!&(${X#EEdwat= z^|9vX9NJlMzl%S}npjlI)2B?o9Wyjwm7mLf0@V9ndAYVoNQG|msEPf9%Vi{h*4Ll;q43#W;n=9DMeRDCt1(vH~;p3 z8Qz~8^3@p1;qIGRSq>|`XxitB5F%hmri>cfioWQU2UDLZhsd7k?Z5_ucI-$pbDdha z7ts*B{uJeMBH`(09Q74Oj8KEYfr-*KrH1f0JxJ{5mxXRB7Sl=N!(&BTb!Wm~_`iq| zSiFF+R+N{U1TaOoqQwsv2^AhXq?49*GCfddthw#1~2#%flvqvgUs2ozP zOn(o0vB_wS?}FXeub)nf72`aS4q051hc^%mscr*uV;;n2IS?8qstPsvtW&oHf52xz zUU1k_kk_{vc!f5{**8R9W#eg>oRyy0XhqW7o_1+4J$9!8%SI8K8^$t9*+tfZ2%c~s z=Fi0oFknL{b4bkr%B`e@}GiM&V99zojorzv-IN^A5ltVuV^{ zTI0cVF%K?GlXXHfClf=wT1j+(Eu4LV^M%(`S6jWyXGJNFfwZ&^BV}o%%f6u_JZnD% z$Uw@=wq+wi&EXo+d|TJdr9@b-K0hgB{%u@DQ>QMilU^NSMG8DR!iUw>>peXgOmTMm zpR65rsuNq0jlM1?$KE{isNyWkGw=DuSZQ3tJEZM(>_m(c5=gNIvKAyT zDL;=V_~o6g#S>YdjGPIgh0;~qpX1+q)7 zvtTd%7dLPAVFe1<@ZS7*TpWOa2|qcXz4_dvZu9u*(|hhS zFbH1Xg4M3J_FQVX!sCrjRSHrljDf-LVZj&0-rjJmo&)USK5e?4G3j#AAM6SIg|Vxm zZ@zi?>QygLh?xxln(gQ-H#ec2Q}T8?aycZ%D2{S zzTl|O$x^HAXtSrwdGxyRxjSn|bZ2Zo+LJa-E<$_G9B_iA@ll_C_yH>vB9WipjMxfn zTdU`Cb9}EoYSrH0OIr9!f6Q_}P;Vs+d;R2^(fs+(pFO*I_N--DNv%39RLizdjHn5e1JPoePe`Dysk2)fSic4VMl3QBF!g=1tbb|67uhxZASx zGWNv7So(1yu;!}sL%G@AipEwec4eRe9g_*cLBz9PC-dk z&I0>sQ~a$iCq-H=zNM9R4Fl&L_pC;*^fNylg$+fuIiJ&@UN5%i^0dbpESm;KH3t;W z5)^`TTBzNAEn7wqLYzxq(Z+KdXBzizGkuBycV>b7GZYL)Z4X?3;+5%aH0>_?B^n5n zczTNkdu??K7;>SS@Plsj`n#hh+r|6CoAvL-T!`dm3OB0fA-7s*T(X`c!iAu+&$y zoMg(?AOR{aix_`8>mF4(o?a9>QsUy~JpPPaMJN^WzG#@E{!CD^lO_#`fp~6aYWkXw zX~MwQVP*$LS{!3!I$Q()UPK?FPbn(n+E(>b%l6RK)mr+2D^?fURIl)lbM?|CuIlp< z97eJ->#@3}t-Fp9!TPXj3*UhCKrDXP*r*?Um#~G?Y>Rhm?H`2cizZ^FIu;u{h7%z$ zkaKXd(gBn#pG})a$wlz4PH|AD-E%XBF<<2#hi=U91Z>qnrN__m9-B4%c@G!98=6e2XAhICuIA=q z0v^7iO**UPh9Omxn@k^Kx?=)7KQ{{K**7q_z!iMQ2z!{vUhsB3z3j7*!i-@LPb}<>62Y0J$3xXjrviyXL zj{4mp^TUg((hQX4CMhv7sCL`QlEBeltxa$I;g?V72>dFk1|HvcdV0eJP=K_U4jg^g zUVT;q+`qpXyb=jmGMx>$!pt3I^MLWFAG6uhQ#wVZtuu2APchZtX>oBF{MVBw!6RZu zebx3^6R)7FYa=JaAOVYbP`S`50x2IVas;!-^ZIz^%gD)>D zOFSd)#EBCaAf0Z$rV2p52KbA_4h^*W{h!BXdt9}Ow2D+_uf+OB{zQRT>QdaaNiR$j zZE~o&s9Ij4BmoxUz|LYz;{D>Ev zlZf}qRt%WaA=S}$_VCaVgK)q#?0Kc!$fcz%pv79ojnqWLzrwK4L6v|Qt8R0pu!aYxI_N=sq9wo(2_Uv*hV@Yi3RmB9sf1BXb2 zQR-YC=f*M0b~X|ipy$`k3H~%iVBYmB^k%{U|6cNhL4u3A>n&FL7yo;B=(&`X!GhWu zQ&Q(x3Z&Ces@CSOdElAN21F=szZh4CKu~d~_3c{?W#xUkC#{B)+LFk9nj7>ebi+Q; zG~2itLn?+JYTY1*%k_xa+_~u5YanN-s(N~O@TZb+-|N@jwnfk;a&r9tO>Jq`c$uJA z91?{}SEz^>#!fxH2z>a8;jtA2bKtY2y)758bJC%Ut!YCFv`f;5SI=Juj$n1UQqL~S ztDfhxSxMHy-saBB56W_-(B~YNvn#O#z3MGBeT|?g+Ujm7Sg5@s;89`WUUSVw=N$y( z4TA+zz9a^`wAH)<$(uJ3(Y4QI`L(|LQd9LPiu(9Oq#J1-vmoP;6_AM?QdF=UDl*;T z|JdTZL#ga^-qP2$Oo~w zb+B@2g%^=V5f>F~dl?DUf3LHA=#86@q@=zvt^wyMN08InUA@7$9E^a$5>o(80d5FA z8MjnqvXZZ&;w=v=k?acnn8zm7kF2IBuUfr&{J3#UF05+*6q=P5Q_q0 literal 0 HcmV?d00001 diff --git a/examples/PCE/traces.png b/examples/PCE/traces.png new file mode 100644 index 0000000000000000000000000000000000000000..49ba1d05080e0753d7397db6f046624a83809194 GIT binary patch literal 84243 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 Uniform_11OrthoPoly(d_pce) for i in eachindex(θ)]) + +# 2. generate moment equations +moment_eqs, pce_eval = moment_equations(reactor_model, pce) + +# 3. solve the moment equations +# 3a. find initial moments via Galerkin projection (note that c0 could depend on an uncertain parameter) +c0 = [1.0, 2.0, 0.0, 0.0] +z0 = reduce(vcat, pce_galerkin(c0, pce)) + +# 3b. solve the initial value problem for the moment equations +moment_prob = ODEProblem(moment_eqs, z0, (0.0, 10.0), [k[1] => 1.0, k[2] => 0.2, k[3] => 12, k[4] => 0.1]) +moment_sol = solve(moment_prob, Tsit5()) + +# 3c. define a function approximating the parametric solution to the IVP. +pce_sol(t, θ) = pce_eval(moment_sol(t), θ) + +# 4. now let's compare to true solution +# take 100 uniform samples +n = 5 +θsamples = Iterators.product(range(-1, 1, length=n), range(-1,1,length=n)) +ps = [k[1] => 1.0, k[2] => 0.2, k[3] => 12, k[4] => 0.1, θ[1] => 0.0, θ[2] => 0.0] +pvals = [p[2] for p in ps] +reactor_problem = ODEProblem(reactor_model, c0, (0.0, 10.0), ps) +t_range = range(0.0, 10.0, length = 100) +sols = [] +for θval in θsamples + pvals[end-1] = θval[1] + pvals[end] = θval[2] + _prob = remake(reactor_problem, p = pvals) + push!(sols, Array(solve(_prob, Tsit5(), saveat=t_range))) +end + +species = ["A", "B", "C", "D"] +color = [:red, :green, :blue, :orange] +plots = [plot(title="Species $(species[i])", xlabel = "time", ylabel = "concentration", legend = false) for i in 1:4] +for sol in sols + for i in 1:4 + plot!(plots[i], t_range, sol[i,:], color = color[i]) + end +end +for θval in θsamples + pce_predictions = [pce_sol(t, [θval...]) for t in t_range] + for i in 1:4 + plot!(plots[i], t_range, [c[i] for c in pce_predictions], color = "black", linestyle=:dash) + end +end + +fig = plot(plots...) +savefig(fig,string(@__DIR__,"/traces.png")) + +n = 100 +θsamples = Iterators.product(range(-1, 1, length=n), range(-1,1,length=n)) +ps = [k[1] => 1.0, k[2] => 0.2, k[3] => 12, k[4] => 0.1, θ[1] => 0.0, θ[2] => 0.0] +pvals = [p[2] for p in ps] +reactor_problem = ODEProblem(reactor_model, c0, (0.0, 10.0), ps) +t_range = range(0.0, 10.0, length = 100) +sols = [] +for θval in θsamples + pvals[end-1] = θval[1] + pvals[end] = θval[2] + _prob = remake(reactor_problem, p = pvals) + push!(sols, Array(solve(_prob, Tsit5(), saveat=t_range))) +end + +mean_solution = mean(sols) +var_solution = mean([sol.^2 for sol in sols]) - mean_solution.^2 + +L = length(pce.sym_basis) +mean_PCE = [[moment_sol(t)[(i-1)*L+1:i*L][1] for i in 1:4] for t in t_range] +var_weightings = computeSP2(pce.pc_basis) +var_PCE = [[dot(moment_sol(t)[(i-1)*L+1:i*L] .^ 2, var_weightings) for i in 1:4] for t in t_range] .- [m .^2 for m in mean_PCE] + +species = ["A", "B", "C", "D"] +color = [:red, :green, :blue, :orange] +plots = [plot(title="Species $(species[i])", xlabel = "time", ylabel = "mean", legend = false) for i in 1:4] + +for i in 1:4 + plot!(plots[i], t_range, [mean_solution[i,k] for k in axes(mean_solution,2)], color = color[i]) + plot!(plots[i], t_range, [s[i] for s in mean_PCE], color = "black", linestyle=:dash) +end +fig = plot(plots...) +savefig(fig, string(@__DIR__,"/mean.png")) + +plots = [plot(title="Species $(species[i])", xlabel = "time", ylabel = "variance", legend = false) for i in 1:4] +for i in 1:4 + plot!(plots[i], t_range, [var_solution[i,k] for k in axes(var_solution,2)], color = color[i]) + plot!(plots[i], t_range, [s[i] for s in var_PCE], color = "black", linestyle=:dash) +end +fig = plot(plots...) +savefig(fig, string(@__DIR__,"/var.png")) diff --git a/examples/PCE/tutorial.md b/examples/PCE/tutorial.md new file mode 100644 index 0000000..bc8e5ae --- /dev/null +++ b/examples/PCE/tutorial.md @@ -0,0 +1,108 @@ +# Polynomial Chaos Expansion for Random ODEs +## Sketch of the Theory +This section reviews the basic concept behind the use of Polynomial Chaos Expansion (PCE) for approximate solution to random ODEs as well as how `ModelOrderReduction` facilitates its use within the SciML ecosystem. + +In essence, PCE is nothing more than a function expansion technique for square integrable functions where the basis functions are chosen to be orthogonal polynomials; for a detailed treatment of the mathematical underpinnings the interested reader is referred to Gautschi (2004) [1], for example. For the sake of this tutorial we will remain much more informal and discuss only aspects that are critical for basic use of PCE in computational practice. To that end, we will consider the problem of finding a parametric solution to the following *random* ODE: +```math +\begin{aligned} + \frac{dx}{dt}(p) = f(x,p,t), \quad x(0) = x_0(p) +\end{aligned} +``` +where the parameters $p$ are *apriori* only known to follow a given distribution $\mu$. Specifically, we will seek to find an approximation to the solution $x(t,p)$ in the form of a PCE that matches the statistics of the random process $x(t,p)$ with $p \sim \mu$. To that end, we approximate +```math +\begin{aligned} + x(t,p) \approx \hat{x}(t,p) = \sum_{i=0}^L z_i(t) \zeta_i(p) +\end{aligned} +``` +where $\zeta_0(p), \dots, \zeta_L(p)$ are mutually orthogonal polynomial with respect to the distribution $\mu$, i.e., +```math +\begin{aligned} + \left\langle \zeta_i, \zeta_j \right\rangle := \int \zeta_i(p) \zeta_j(p) d\mu(p) = \delta_{ij} +\end{aligned} +``` +where $\delta_{ij}$ is the Kronecker delta. These polynomials can be efficiently constructed for many distributions. In particular, they are known analytically for many standard distributions including but not limited to Gaussians, uniform or beta distributions; moreover, they can be approximated numerically for distributions with known smooth densities and even empirically known distributions. For more details, please review the documentation of [PolyChaos.jl](github.com/SciML/PolyChaos.jl) or Gautschi (2004) [1] for instance. + +Inserting the PCE-Ansatz $\hat{x}$ into the random ODE of interest yields +```math +\begin{aligned} + \sum_{i=0}^L \frac{dz_i}{dt}(t) \zeta_i(p) = f\left(\sum_{i=0}^L z_i(t) \zeta_i(p), p, t \right), \sum_{i=0}^L z_i(0) \zeta_i(p) +\end{aligned} +``` +To derive evolution equations for the coefficients (or *moments*) $z_i$ we simply demand that the residual of the above equations to be orthogonal to the space spanned by $\zeta_0, \dots, \zeta_L$. Orthogonality here shall be understood with respect to the inner product as described above. This is equivalent to demanding minimal expected mismatch when evaluating the above equation for $p \sim \mu$. Mathematically, this condition translates into a set of deterministic ODEs for the moments $z_j$: +```math +\begin{aligned} + \left\langle\sum_{i=0}^L \frac{dz_i}{dt}(t) \zeta_i(p), \zeta_j(p) \right\rangle = \left \langle f\left(\sum_{i=0}^L z_i(t) \zeta_i(p), p, t \right), \sum_{i=0}^L z_i(0) \zeta_i(p), \zeta_j(p) \right\rangle +\end{aligned} +``` +and since $\left\langle \zeta_i, \zeta_j\right\rangle = \delta_{ij}$ it follows that +```math +\begin{aligned} + \frac{dz_0}{dt} &= \left \langle f\left(\sum_{i=0}^L z_i(t) \zeta_i(p), p, t \right), \sum_{i=0}^L z_i(0) \zeta_i(p), \zeta_0(p) \right\rangle\\ + & \vdots\\ + \frac{dz_L}{dt} &= \left \langle f\left(\sum_{i=0}^L z_i(t) \zeta_i(p), p, t \right), \sum_{i=0}^L z_i(0) \zeta_i(p), \zeta_L(p) \right\rangle +\end{aligned} +``` +with initial condition +\begin{aligned} + z_i(0) = \left\langle x_0, \zeta_i \right\rangle. +\end{aligned} + +These equations are referred to as the moment equations and can in principle be solved with any suitable IVP solution technique. + +## Example +In this section, we will showcase how `ModelOrderReduction.jl` may be used to apply PCE for the approximate solution of random ODEs as described in the previous section. To that end, we will consider a simple nonlinear reactor in which the following reaction occurs +```math +\begin{aligned} + &A + B \xleftrightharpoons[k_1(1-\frac{\theta_1}{2})]{k_2} C\\ + &C \xrightarrow{k_3(1-\frac{\theta_2}{2})} D\\ + &B \xrightarrow{k_4} D +\end{aligned} +``` +where the rate parameters $\theta_1 \sim U[-1,1]$, $\theta_2 \sim U[-1,1]$ are uncertain. Using [ModelingToolkit.jl]{github.com/SciML/ModelingToolkit.jl} the following code creates the associated model. +``` +using ModelOrderReduction, ModelingToolkit, DifferentialEquations, PolyChaos, Plots + +@parameters k[1:4], θ[1:2] +@variables t, c(t)[1:4] +D = Differential(t) +reactor = [D(c[1]) ~ -k[1]*(1+0.5*θ[1])*c[1]*c[2] + k[2]*c[3]; + D(c[2]) ~ -k[1]*(1+0.5*θ[1])*c[1]*c[2] - k[4]*c[2] + k[2]*c[3]; + D(c[3]) ~ k[1]*c[1]*c[2] - k[3]*c[3]; + D(c[4]) ~ k[3]*(1+0.5*θ[2])*c[3] + k[4]*c[2]]; + +@named reactor_model = ODESystem(reactor, t, c, vcat(k, θ)) +``` + +Next, we are going to define the PCE Ansatz with the help of which we are going to approximate the parametric solution. To that end, we heavily rely on [PolyChaos.jl]{github.com/SciML/PolyChaos.jl}. In this example, we choose a PCE of degree 3. +``` +d_pce = 3 +pce = PCE(c, [θ[i] => Uniform_11OrthoPoly(d_pce) for i in eachindex(θ)]) +``` + +Next, we are constructing the corresponding moment equations via a simple function call of `moment_equations`. This function returns and `MTK.ODESystem` describing the deterministic evolution equation of the PCE moments and a function that maps the state of this model via the PCE Ansatz back to the original model state (in this example, the concentration of the different species). +``` +moment_eqs, pce_eval = moment_equations(reactor_model, pce) +``` + +Next, we are solving the evolution equation for the PCE moments. The initial condition for the moments is also obtained via Galerkin projection onto the space spanned by the basis functions in the PCE Ansatz. +``` +c0 = [1.0, 2.0, 0.0, 0.0] +z0 = reduce(vcat, pce_galerkin(c0, pce)) +moment_prob = ODEProblem(moment_eqs, z0, (0.0, 10.0), [k[1] => 1.0, k[2] => 0.2, k[3] => 12, k[4] => 0.1]) +moment_sol = solve(moment_prob, Tsit5()) +``` + +Lastly, we wish to demonstrate that this approximation can be remarkably accurate in practice. The figure below shows the PCE approximation (dashed black lines) compared to the full model for several realization of the uncertain paramters. + +![traces](traces.png) + +While PCE can even provide a good parametric surrogate model of the true solution of the random ODE, it is really designed to capture the statistics of the solution of the random ODE well. Moreover, any statistics that can be computed in terms of the moments of the states of the random ODE are remarkably cheap to compute from the PCE coefficients/moments alone. The figures below shows an example for the mean and variances of the different species. + + +![mean](mean.png) +![var](var.png) + + + +## References +Gautschi, Walter. Orthogonal polynomials: computation and approximation. OUP Oxford, 2004. \ No newline at end of file diff --git a/examples/PCE/var.png b/examples/PCE/var.png new file mode 100644 index 0000000000000000000000000000000000000000..7de5bea578d60c80118e3960869c7b901881abd0 GIT binary patch literal 58342 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 literal 0 HcmV?d00001 diff --git a/src/PCE/PCE.jl b/src/PCE/PCE.jl index 5b2df2f..feb8c00 100644 --- a/src/PCE/PCE.jl +++ b/src/PCE/PCE.jl @@ -1,6 +1,6 @@ using PolyChaos, Symbolics, ModelingToolkit, LinearAlgebra -export PCE, moment_equations +export PCE, moment_equations, pce_galerkin, mean, var include("PCE_utils.jl") # for now only consider tensor grid bases @@ -112,12 +112,12 @@ function maximum_degree(mono_indices::AbstractVector, pce::PCE) end function eval_scalar_products(mono_indices, pce::PCE) max_degree = maximum_degree(mono_indices, pce) - degree_quadrature = ceil(Int, 0.5 * (max_degree + deg(pce.pc_basis) + 1)) + degree_quadrature = max(ceil(Int, 0.5 * (max_degree + deg(pce.pc_basis) + 1)), deg(pce.pc_basis)) integrator_pce = bump_degree(pce.pc_basis, degree_quadrature) scalar_products = Dict() for k in 1:dim(pce.pc_basis) - scalar_products[k] = Dict([mono => computeSP([ind..., k-1], integrator_pce) for (mono, ind) in mono_indices]) + scalar_products[k] = Dict(mono => computeSP(vcat(ind,k-1), integrator_pce) for (mono, ind) in mono_indices) end return scalar_products end @@ -173,4 +173,10 @@ end # 6d. apply pce to control problems -# 6e. ? \ No newline at end of file +# 6e. ? + + +# ToDo: +# better support to evaluate the PCE +# in particular => make evaluation of means, variances, etc evaluable from the object itself upon specification of the moment values +# hinderance -> how do you provide the moments in a convenient format? diff --git a/src/PCE/PCE_utils.jl b/src/PCE/PCE_utils.jl index e93436f..5024666 100644 --- a/src/PCE/PCE_utils.jl +++ b/src/PCE/PCE_utils.jl @@ -74,6 +74,7 @@ extract_coeffs(expr::Num, vars::Set) = extract_coeffs(Symbolics.unwrap.(expr), v extract_coeffs(expr::Num, vars::AbstractArray) = extract_coeffs(Symbolics.unwrap.(expr), vars) extract_coeffs(expr, vars::AbstractArray{<:Num}) = extract_coeffs(expr, Symbolics.unwrap.(vars)) extract_coeffs(expr, vars::AbstractArray) = extract_coeffs(expr, Set(vars)) +extract_coeffs(expr::Number, vars::Set) = Dict(Val(1) => expr) # extracting the indices of the factors of as basismonomial function get_basis_indices(mono::Symbolics.Mul) From 0a97073bd403eb35daa1491143a86435a93c7248 Mon Sep 17 00:00:00 2001 From: FHoltorf <32248677+FHoltorf@users.noreply.github.com> Date: Tue, 27 Sep 2022 11:48:16 -0400 Subject: [PATCH 26/62] fix naming conflict for SVD in tests --- test/DataReduction.jl | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/test/DataReduction.jl b/test/DataReduction.jl index a16042c..05538e4 100644 --- a/test/DataReduction.jl +++ b/test/DataReduction.jl @@ -1,5 +1,6 @@ #--------- Data Reduction -----------------# using OrdinaryDiffEq +const MOR = ModelOrderReduction function lorenz_prob() function lorenz!(du, u, p, t) @@ -29,7 +30,7 @@ end solution = Array(sol) order = 2 - solver = SVD() + solver = MOR.SVD() matrix_reducer = POD(solution, order) snapshot_reducer = POD(sol.u, order) reduce!(matrix_reducer, solver) @@ -48,7 +49,7 @@ end @test reducer.nmodes == 1 order = 2 - solver = TSVD() + solver = MOR.TSVD() reducer = POD(solution, order) reduce!(reducer, solver) @@ -57,7 +58,7 @@ end @test reducer.renergy > 0.7 order = 2 - solver = RSVD() + solver = MOR.RSVD() reducer = POD(solution, order) reduce!(reducer, solver) From db21b2fe474227bfeb153d051f17afa727927aaf Mon Sep 17 00:00:00 2001 From: FHoltorf <32248677+FHoltorf@users.noreply.github.com> Date: Tue, 27 Sep 2022 11:58:45 -0400 Subject: [PATCH 27/62] fix typo in tutorial --- examples/PCE/tutorial.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/examples/PCE/tutorial.md b/examples/PCE/tutorial.md index bc8e5ae..c0119ba 100644 --- a/examples/PCE/tutorial.md +++ b/examples/PCE/tutorial.md @@ -43,10 +43,11 @@ and since $\left\langle \zeta_i, \zeta_j\right\rangle = \delta_{ij}$ it follows \end{aligned} ``` with initial condition +```math \begin{aligned} z_i(0) = \left\langle x_0, \zeta_i \right\rangle. \end{aligned} - +``` These equations are referred to as the moment equations and can in principle be solved with any suitable IVP solution technique. ## Example From 02d20ccd9bfd63a5af41dd14c92cf3fd2d5eba98 Mon Sep 17 00:00:00 2001 From: FHoltorf <32248677+FHoltorf@users.noreply.github.com> Date: Tue, 27 Sep 2022 12:05:11 -0400 Subject: [PATCH 28/62] replace allequal call --- src/PCE/PCE.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/PCE/PCE.jl b/src/PCE/PCE.jl index feb8c00..01f4f46 100644 --- a/src/PCE/PCE.jl +++ b/src/PCE/PCE.jl @@ -27,7 +27,7 @@ function PCE(states, bases::AbstractVector{<:Pair}) ops = [op for (p, op) in bases] degs = [deg(op) for op in ops] min_deg = minimum(degs) - if !(allequal(degs)) + if !(all(isequal(first(degs)), degs)) # allequal @warn "Currently only bases with identical degrees are supported. Proceed with minimum common degree = $min_deg" end pc_basis = MultiOrthoPoly(ops, min_deg) From ac415832ec0119da35dcc1d3b90a0f5e31fc0557 Mon Sep 17 00:00:00 2001 From: FHoltorf <32248677+FHoltorf@users.noreply.github.com> Date: Tue, 27 Sep 2022 12:27:40 -0400 Subject: [PATCH 29/62] SciML format --- examples/PCE/tutorial.jl | 60 ++++++++++++++++------------- src/PCE/PCE.jl | 82 ++++++++++++++++++++++------------------ src/PCE/PCE_utils.jl | 68 ++++++++++++++++++++------------- test/PCETestUtils.jl | 7 ++-- test/PCETests.jl | 46 ++++++++++++---------- test/runtests.jl | 2 - 6 files changed, 152 insertions(+), 113 deletions(-) diff --git a/examples/PCE/tutorial.jl b/examples/PCE/tutorial.jl index 7a764cc..2eaf187 100644 --- a/examples/PCE/tutorial.jl +++ b/examples/PCE/tutorial.jl @@ -12,10 +12,10 @@ using ModelOrderReduction, Plots, ModelingToolkit, DifferentialEquations, PolyCh @parameters k[1:4], θ[1:2] @variables t, c(t)[1:4] D = Differential(t) -reactor = [D(c[1]) ~ -k[1]*(1+0.5*θ[1])*c[1]*c[2] + k[2]*c[3]; - D(c[2]) ~ -k[1]*(1+0.5*θ[1])*c[1]*c[2] - k[4]*c[2] + k[2]*c[3]; - D(c[3]) ~ k[1]*c[1]*c[2] - k[3]*c[3]; - D(c[4]) ~ k[3]*(1+0.5*θ[2])*c[3] + k[4]*c[2]]; +reactor = [D(c[1]) ~ -k[1] * (1 + 0.5 * θ[1]) * c[1] * c[2] + k[2] * c[3]; + D(c[2]) ~ -k[1] * (1 + 0.5 * θ[1]) * c[1] * c[2] - k[4] * c[2] + k[2] * c[3]; + D(c[3]) ~ k[1] * c[1] * c[2] - k[3] * c[3]; + D(c[4]) ~ k[3] * (1 + 0.5 * θ[2]) * c[3] + k[4] * c[2]]; @named reactor_model = ODESystem(reactor, t, c, vcat(k, θ)) @@ -32,7 +32,8 @@ c0 = [1.0, 2.0, 0.0, 0.0] z0 = reduce(vcat, pce_galerkin(c0, pce)) # 3b. solve the initial value problem for the moment equations -moment_prob = ODEProblem(moment_eqs, z0, (0.0, 10.0), [k[1] => 1.0, k[2] => 0.2, k[3] => 12, k[4] => 0.1]) +moment_prob = ODEProblem(moment_eqs, z0, (0.0, 10.0), + [k[1] => 1.0, k[2] => 0.2, k[3] => 12, k[4] => 0.1]) moment_sol = solve(moment_prob, Tsit5()) # 3c. define a function approximating the parametric solution to the IVP. @@ -41,74 +42,81 @@ pce_sol(t, θ) = pce_eval(moment_sol(t), θ) # 4. now let's compare to true solution # take 100 uniform samples n = 5 -θsamples = Iterators.product(range(-1, 1, length=n), range(-1,1,length=n)) +θsamples = Iterators.product(range(-1, 1, length = n), range(-1, 1, length = n)) ps = [k[1] => 1.0, k[2] => 0.2, k[3] => 12, k[4] => 0.1, θ[1] => 0.0, θ[2] => 0.0] pvals = [p[2] for p in ps] reactor_problem = ODEProblem(reactor_model, c0, (0.0, 10.0), ps) t_range = range(0.0, 10.0, length = 100) sols = [] for θval in θsamples - pvals[end-1] = θval[1] + pvals[end - 1] = θval[1] pvals[end] = θval[2] _prob = remake(reactor_problem, p = pvals) - push!(sols, Array(solve(_prob, Tsit5(), saveat=t_range))) + push!(sols, Array(solve(_prob, Tsit5(), saveat = t_range))) end species = ["A", "B", "C", "D"] color = [:red, :green, :blue, :orange] -plots = [plot(title="Species $(species[i])", xlabel = "time", ylabel = "concentration", legend = false) for i in 1:4] +plots = [plot(title = "Species $(species[i])", xlabel = "time", ylabel = "concentration", + legend = false) for i in 1:4] for sol in sols for i in 1:4 - plot!(plots[i], t_range, sol[i,:], color = color[i]) + plot!(plots[i], t_range, sol[i, :], color = color[i]) end end for θval in θsamples pce_predictions = [pce_sol(t, [θval...]) for t in t_range] for i in 1:4 - plot!(plots[i], t_range, [c[i] for c in pce_predictions], color = "black", linestyle=:dash) + plot!(plots[i], t_range, [c[i] for c in pce_predictions], color = "black", + linestyle = :dash) end end fig = plot(plots...) -savefig(fig,string(@__DIR__,"/traces.png")) +savefig(fig, string(@__DIR__, "/traces.png")) n = 100 -θsamples = Iterators.product(range(-1, 1, length=n), range(-1,1,length=n)) +θsamples = Iterators.product(range(-1, 1, length = n), range(-1, 1, length = n)) ps = [k[1] => 1.0, k[2] => 0.2, k[3] => 12, k[4] => 0.1, θ[1] => 0.0, θ[2] => 0.0] pvals = [p[2] for p in ps] reactor_problem = ODEProblem(reactor_model, c0, (0.0, 10.0), ps) t_range = range(0.0, 10.0, length = 100) sols = [] for θval in θsamples - pvals[end-1] = θval[1] + pvals[end - 1] = θval[1] pvals[end] = θval[2] _prob = remake(reactor_problem, p = pvals) - push!(sols, Array(solve(_prob, Tsit5(), saveat=t_range))) + push!(sols, Array(solve(_prob, Tsit5(), saveat = t_range))) end mean_solution = mean(sols) -var_solution = mean([sol.^2 for sol in sols]) - mean_solution.^2 +var_solution = mean([sol .^ 2 for sol in sols]) - mean_solution .^ 2 L = length(pce.sym_basis) -mean_PCE = [[moment_sol(t)[(i-1)*L+1:i*L][1] for i in 1:4] for t in t_range] +mean_PCE = [[moment_sol(t)[((i - 1) * L + 1):(i * L)][1] for i in 1:4] for t in t_range] var_weightings = computeSP2(pce.pc_basis) -var_PCE = [[dot(moment_sol(t)[(i-1)*L+1:i*L] .^ 2, var_weightings) for i in 1:4] for t in t_range] .- [m .^2 for m in mean_PCE] +var_PCE = [[dot(moment_sol(t)[((i - 1) * L + 1):(i * L)] .^ 2, var_weightings) for i in 1:4] + for t in t_range] .- [m .^ 2 for m in mean_PCE] species = ["A", "B", "C", "D"] color = [:red, :green, :blue, :orange] -plots = [plot(title="Species $(species[i])", xlabel = "time", ylabel = "mean", legend = false) for i in 1:4] +plots = [plot(title = "Species $(species[i])", xlabel = "time", ylabel = "mean", + legend = false) for i in 1:4] for i in 1:4 - plot!(plots[i], t_range, [mean_solution[i,k] for k in axes(mean_solution,2)], color = color[i]) - plot!(plots[i], t_range, [s[i] for s in mean_PCE], color = "black", linestyle=:dash) + plot!(plots[i], t_range, [mean_solution[i, k] for k in axes(mean_solution, 2)], + color = color[i]) + plot!(plots[i], t_range, [s[i] for s in mean_PCE], color = "black", linestyle = :dash) end fig = plot(plots...) -savefig(fig, string(@__DIR__,"/mean.png")) +savefig(fig, string(@__DIR__, "/mean.png")) -plots = [plot(title="Species $(species[i])", xlabel = "time", ylabel = "variance", legend = false) for i in 1:4] +plots = [plot(title = "Species $(species[i])", xlabel = "time", ylabel = "variance", + legend = false) for i in 1:4] for i in 1:4 - plot!(plots[i], t_range, [var_solution[i,k] for k in axes(var_solution,2)], color = color[i]) - plot!(plots[i], t_range, [s[i] for s in var_PCE], color = "black", linestyle=:dash) + plot!(plots[i], t_range, [var_solution[i, k] for k in axes(var_solution, 2)], + color = color[i]) + plot!(plots[i], t_range, [s[i] for s in var_PCE], color = "black", linestyle = :dash) end fig = plot(plots...) -savefig(fig, string(@__DIR__,"/var.png")) +savefig(fig, string(@__DIR__, "/var.png")) diff --git a/src/PCE/PCE.jl b/src/PCE/PCE.jl index 01f4f46..c137768 100644 --- a/src/PCE/PCE.jl +++ b/src/PCE/PCE.jl @@ -6,17 +6,17 @@ include("PCE_utils.jl") # for now only consider tensor grid bases # with degree equal across all bases # need to adjust in PolyChaos -struct PCE - states # states - parameters # vector of parameters being expanded - bases # vector of pairs: p (symbolic variable) => polynomial basis (PolyChaos) - bases_dict # dictionary generated from bases - sym_basis # vector of basis functions (symbolic variables) !![indexing as generated by PolyChaos]!! - pc_basis # polychaos basis object - sym_to_pc # dictionary mapping symbolic to pc basis - pc_to_sym # dictionary mapping pc to symbolic basis - ansatz # vector of pairs: x(t,p) => ∑ᵢ cᵢ(t)ξᵢ(p) - moments # matrix (?) of symbolic variables: cᵢ(t) +struct PCE + states::Any # states + parameters::Any # vector of parameters being expanded + bases::Any # vector of pairs: p (symbolic variable) => polynomial basis (PolyChaos) + bases_dict::Any # dictionary generated from bases + sym_basis::Any # vector of basis functions (symbolic variables) !![indexing as generated by PolyChaos]!! + pc_basis::Any # polychaos basis object + sym_to_pc::Any # dictionary mapping symbolic to pc basis + pc_to_sym::Any # dictionary mapping pc to symbolic basis + ansatz::Any # vector of pairs: x(t,p) => ∑ᵢ cᵢ(t)ξᵢ(p) + moments::Any # matrix (?) of symbolic variables: cᵢ(t) end function PCE(states, bases::AbstractVector{<:Pair}) # to deal with symbolic arrays @@ -31,17 +31,17 @@ function PCE(states, bases::AbstractVector{<:Pair}) @warn "Currently only bases with identical degrees are supported. Proceed with minimum common degree = $min_deg" end pc_basis = MultiOrthoPoly(ops, min_deg) - n_basis = size(pc_basis.ind,1) + n_basis = size(pc_basis.ind, 1) n_states = length(states) - + @variables ζ(parameters...)[1:n_basis] sym_basis = collect(ζ) - sym_to_pc = Dict(ζ[i] => pc_basis.ind[i,:] for i in eachindex(ζ)) + sym_to_pc = Dict(ζ[i] => pc_basis.ind[i, :] for i in eachindex(ζ)) pc_to_sym = Dict(val => key for (val, key) in sym_to_pc) moments = [] - for (i,state) in enumerate(collect(states)) + for (i, state) in enumerate(collect(states)) moment_name = Symbol("z" * Symbolics.map_subscripts(i)) ind_vars = get_independent_vars(state) if isempty(ind_vars) @@ -51,8 +51,10 @@ function PCE(states, bases::AbstractVector{<:Pair}) end push!(moments, collect(pce_coeffs[1])) end - ansatz = [states[i] => sum(moments[i][j]*sym_basis[j] for j in 1:n_basis) for i in 1:n_states] - return PCE(states, parameters, bases, bases_dict, sym_basis, pc_basis, sym_to_pc, pc_to_sym, ansatz, moments) + ansatz = [states[i] => sum(moments[i][j] * sym_basis[j] for j in 1:n_basis) + for i in 1:n_states] + return PCE(states, parameters, bases, bases_dict, sym_basis, pc_basis, sym_to_pc, + pc_to_sym, ansatz, moments) end function (pce::PCE)(moment_vals, parameter_vals::AbstractMatrix) # wasteful => should implement my own version of this @@ -60,13 +62,13 @@ function (pce::PCE)(moment_vals, parameter_vals::AbstractMatrix) # can reuse many results. # fine for now. basis = evaluate(parameter_vals, pce.pc_basis) - return [dot(moments,basis) for moments in moment_vals] + return [dot(moments, basis) for moments in moment_vals] end function (pce::PCE)(moment_vals, parameter_vals::AbstractVector) - return pce(moment_vals, reshape(parameter_vals,1,length(parameter_vals))) + return pce(moment_vals, reshape(parameter_vals, 1, length(parameter_vals))) end function (pce::PCE)(moment_vals, parameter_vals::Number) - return pce(moment_vals, reshape([parameter_vals],1,1)) + return pce(moment_vals, reshape([parameter_vals], 1, 1)) end # 1. apply PCE ansatz @@ -75,7 +77,7 @@ function generate_parameter_pce(pce::PCE) par_pce = Vector{Pair{eltype(pce.parameters), eltype(pce.sym_basis)}}(undef, par_dim) for (i, bases) in enumerate(pce.bases) p, op = bases - par_pce[i] = p => pce.sym_basis[i+1] + op.α[1] + par_pce[i] = p => pce.sym_basis[i + 1] + op.α[1] end return par_pce end @@ -97,7 +99,8 @@ function extract_basismonomial_coeffs(eqs::AbstractVector, pce::PCE) basismonomial_coeffs = [extract_coeffs(eq, pce.sym_basis) for eq in eqs] basismonomial_indices = [] for coeffs in basismonomial_coeffs - union!(basismonomial_indices, [mono => get_basis_indices(mono) for mono in keys(coeffs)]) + union!(basismonomial_indices, + [mono => get_basis_indices(mono) for mono in keys(coeffs)]) end return basismonomial_coeffs, basismonomial_indices end @@ -106,18 +109,22 @@ end function maximum_degree(mono_indices::AbstractVector, pce::PCE) max_degree = 0 for (mono, ind) in mono_indices - max_degree = max(max_degree, maximum(sum(ind[i]*pce.pc_basis.ind[i+1] for i in eachindex(ind)))) + max_degree = max(max_degree, + maximum(sum(ind[i] * pce.pc_basis.ind[i + 1] + for i in eachindex(ind)))) end return max_degree end function eval_scalar_products(mono_indices, pce::PCE) max_degree = maximum_degree(mono_indices, pce) - degree_quadrature = max(ceil(Int, 0.5 * (max_degree + deg(pce.pc_basis) + 1)), deg(pce.pc_basis)) + degree_quadrature = max(ceil(Int, 0.5 * (max_degree + deg(pce.pc_basis) + 1)), + deg(pce.pc_basis)) integrator_pce = bump_degree(pce.pc_basis, degree_quadrature) scalar_products = Dict() for k in 1:dim(pce.pc_basis) - scalar_products[k] = Dict(mono => computeSP(vcat(ind,k-1), integrator_pce) for (mono, ind) in mono_indices) + scalar_products[k] = Dict(mono => computeSP(vcat(ind, k - 1), integrator_pce) + for (mono, ind) in mono_indices) end return scalar_products end @@ -128,7 +135,9 @@ function galerkin_projection(bm_coeffs, scalar_products, pce::PCE) for i in eachindex(bm_coeffs) eqs = [] for k in 1:dim(pce.pc_basis) - push!(eqs, sum(bm_coeffs[i][mono]*scalar_products[k][mono] for mono in keys(bm_coeffs[i]))) + push!(eqs, + sum(bm_coeffs[i][mono] * scalar_products[k][mono] + for mono in keys(bm_coeffs[i]))) end push!(projected_eqs, eqs) end @@ -138,7 +147,8 @@ end # 5. combine everything function pce_galerkin(eqs::AbstractVector, pce::PCE) expanded_eqs = apply_ansatz(eqs, pce) - basismonomial_coeffs, basismonomial_indices = extract_basismonomial_coeffs(expanded_eqs, pce) + basismonomial_coeffs, basismonomial_indices = extract_basismonomial_coeffs(expanded_eqs, + pce) scalar_products = eval_scalar_products(basismonomial_indices, pce) projected_eqs = galerkin_projection(basismonomial_coeffs, scalar_products, pce) return projected_eqs @@ -154,16 +164,17 @@ function moment_equations(sys::ODESystem, pce::PCE) params = setdiff(parameters(sys), pce.parameters) D = Differential(iv) moments = reduce(vcat, pce.moments) - name = Symbol(String(nameof(sys))*"_pce") - pce_system = ODESystem([D(moments[i]) ~ moment_eqs[i] for i in eachindex(moments)], - iv, moments, params, name = name) - + name = Symbol(String(nameof(sys)) * "_pce") + pce_system = ODESystem([D(moments[i]) ~ moment_eqs[i] for i in eachindex(moments)], + iv, moments, params, name = name) + n_moments = dim(pce.pc_basis) n_states = length(states(sys)) - pce_eval = function (moment_vals, parameter_values) - shape_state = [moment_vals[i*n_moments+1:(i+1)*n_moments] for i in 0:n_states-1] - return pce(shape_state, parameter_values) - end + pce_eval = function (moment_vals, parameter_values) + shape_state = [moment_vals[(i * n_moments + 1):((i + 1) * n_moments)] + for i in 0:(n_states - 1)] + return pce(shape_state, parameter_values) + end return pce_system, pce_eval end @@ -175,7 +186,6 @@ end # 6e. ? - # ToDo: # better support to evaluate the PCE # in particular => make evaluation of means, variances, etc evaluable from the object itself upon specification of the moment values diff --git a/src/PCE/PCE_utils.jl b/src/PCE/PCE_utils.jl index 5024666..918ea1d 100644 --- a/src/PCE/PCE_utils.jl +++ b/src/PCE/PCE_utils.jl @@ -4,7 +4,7 @@ import PolyChaos.computeSP2 function get_independent_vars(var) return [] end -function get_independent_vars(var::Symbolics.Term) where T +function get_independent_vars(var::Symbolics.Term) where {T} if operation(var) isa Symbolics.Sym return arguments(var) else @@ -40,13 +40,13 @@ function split_term(term::Symbolics.Pow, vars) end end -function split_term(term::T, vars) where T <: Union{Symbolics.Term, Symbolics.Sym} +function split_term(term::T, vars) where {T <: Union{Symbolics.Term, Symbolics.Sym}} if term in vars return 1.0, term else return term, 1.0 end -end +end function extract_coeffs(expr::Symbolics.Add, vars::Set) coeffs = Dict() @@ -56,12 +56,12 @@ function extract_coeffs(expr::Symbolics.Add, vars::Set) for term in keys(expr.dict) num_coeff = expr.dict[term] var_coeff, mono = split_term(term, vars) - try - coeffs[mono] += num_coeff*var_coeff + try + coeffs[mono] += num_coeff * var_coeff catch - coeffs[mono] = num_coeff*var_coeff + coeffs[mono] = num_coeff * var_coeff end - end + end return coeffs end @@ -71,8 +71,12 @@ function extract_coeffs(expr::Symbolics.Mul, vars::Set) end extract_coeffs(expr::Num, vars::Set) = extract_coeffs(Symbolics.unwrap.(expr), vars) -extract_coeffs(expr::Num, vars::AbstractArray) = extract_coeffs(Symbolics.unwrap.(expr), vars) -extract_coeffs(expr, vars::AbstractArray{<:Num}) = extract_coeffs(expr, Symbolics.unwrap.(vars)) +function extract_coeffs(expr::Num, vars::AbstractArray) + extract_coeffs(Symbolics.unwrap.(expr), vars) +end +function extract_coeffs(expr, vars::AbstractArray{<:Num}) + extract_coeffs(expr, Symbolics.unwrap.(vars)) +end extract_coeffs(expr, vars::AbstractArray) = extract_coeffs(expr, Set(vars)) extract_coeffs(expr::Number, vars::Set) = Dict(Val(1) => expr) @@ -80,7 +84,7 @@ extract_coeffs(expr::Number, vars::Set) = Dict(Val(1) => expr) function get_basis_indices(mono::Symbolics.Mul) basis_indices = Int[] for (term, pow) in mono.dict - append!(basis_indices, (arguments(term)[end] - 1)*ones(Int, pow)) + append!(basis_indices, (arguments(term)[end] - 1) * ones(Int, pow)) end return basis_indices end @@ -88,7 +92,7 @@ function get_basis_indices(mono::Symbolics.Term) return [arguments(mono)[end] - 1] end function get_basis_indices(mono::Symbolics.Pow) - return (arguments(mono.base)[end] - 1)*ones(Int, mono.exp) + return (arguments(mono.base)[end] - 1) * ones(Int, mono.exp) end function get_basis_indices(mono::Num) return get_basis_indices(Symbolics.unwrap(mono)) @@ -110,7 +114,9 @@ measure_parameters(m::MeixnerPollaczekMeasure) = [m.λParameter, m.ϕParameter] measure_parameters(m::Beta01Measure) = [m.ashapeParameter, m.bshapeParameter] measure_parameters(m::GammaMeasure) = [m.shapeParameter, m.rateParameter] -recursion_coeffs(m::JacobiMeasure, deg::Int) = rm_jacobi(deg+1, m.ashapeParameter, m.bshapeParameter) +function recursion_coeffs(m::JacobiMeasure, deg::Int) + rm_jacobi(deg + 1, m.ashapeParameter, m.bshapeParameter) +end function OrthoPoly(m::JacobiMeasure, deg::Int) α, β = recursion_coeffs(m, deg) return JacobiOrthoPoly(deg, α, β, m) @@ -120,73 +126,83 @@ function bump_degree(op::JacobiOrthoPoly, deg::Int) return JacobiOrthoPoly(deg, ps...) end -recursion_coeffs(m::genLaguerreMeasure, deg::Int) = rm_laguerre(deg+1, m.shapeParameter) +recursion_coeffs(m::genLaguerreMeasure, deg::Int) = rm_laguerre(deg + 1, m.shapeParameter) function bump_degree(op::genLaguerreOrthoPoly, deg::Int) ps = measure_parameters(op.measure) return genLaguerreorthoPoly(deg, ps...) end -recursion_coeffs(m::MeixnerPollaczekMeasure, deg::Int) = rm_meixner_pollaczek(deg+1, m.λParameter, m.ϕParameter) +function recursion_coeffs(m::MeixnerPollaczekMeasure, deg::Int) + rm_meixner_pollaczek(deg + 1, m.λParameter, m.ϕParameter) +end function bump_degree(op::MeixnerPollaczekOrthoPoly, deg::Int) ps = measure_parameters(op.measure) return MeixnerPollaczekOrthoPoly(deg, ps...) end -recursion_coeffs(m::Beta01Measure, deg::Int) = r_scale(1 / beta(m.ashapeParameter, m.bshapeParameter), rm_jacobi01(deg + 1, m.bshapeParameter - 1.0, m.ashapeParameter - 1.0)...) +function recursion_coeffs(m::Beta01Measure, deg::Int) + r_scale(1 / beta(m.ashapeParameter, m.bshapeParameter), + rm_jacobi01(deg + 1, m.bshapeParameter - 1.0, m.ashapeParameter - 1.0)...) +end function bump_degree(op::Beta01OrthoPoly, deg::Int) ps = measure_parameters(op.measure) return Beta01OrthoPoly(deg, ps...) end -recursion_coeffs(m::GammaMeasure, deg::Int) = r_scale((m.rateParameter^m.shapeParameter) / gamma(m.shapeParameter), rm_laguerre(deg+1, m.shapeParameter - 1.0)...) +function recursion_coeffs(m::GammaMeasure, deg::Int) + r_scale((m.rateParameter^m.shapeParameter) / gamma(m.shapeParameter), + rm_laguerre(deg + 1, m.shapeParameter - 1.0)...) +end function bump_degree(op::GammaOrthoPoly, deg::Int) ps = measure_parameters(op.measure) return GammaOrthoPoly(deg, ps...) end -recursion_coeffs(m::genHermiteMeasure, deg::Int) = rm_hermite(deg+1, m.muParameter) +recursion_coeffs(m::genHermiteMeasure, deg::Int) = rm_hermite(deg + 1, m.muParameter) function bump_degree(op::genHermiteOrthoPoly, deg::Int) ps = measure_parameters(op.measure) return genHermiteOrthoPoly(deg, ps...) end -recursion_coeffs(m::HermiteMeasure, deg::Int) = rm_hermite(deg+1) +recursion_coeffs(m::HermiteMeasure, deg::Int) = rm_hermite(deg + 1) function bump_degree(op::HermiteOrthoPoly, deg::Int) ps = measure_parameters(op.measure) return HermiteOrthoPoly(deg, ps...) end -recursion_coeffs(m::LaguerreMeasure, deg::Int) = rm_laguerre(deg+1) +recursion_coeffs(m::LaguerreMeasure, deg::Int) = rm_laguerre(deg + 1) function bump_degree(op::LaguerreOrthoPoly, deg::Int) ps = measure_parameters(op.measure) return LaguerreOrthoPoly(deg, ps...) end -recursion_coeffs(m::Uniform01Measure, deg::Int) = r_scale(1.0, rm_legendre01(deg+1)...) +recursion_coeffs(m::Uniform01Measure, deg::Int) = r_scale(1.0, rm_legendre01(deg + 1)...) function bump_degree(op::Uniform01OrthoPoly, deg::Int) ps = measure_parameters(op.measure) return Uniform01OrthoPoly(deg, ps...) end -recursion_coeffs(m::Uniform_11Measure, deg::Int) = r_scale(0.5, rm_legendre(deg+1)...) +recursion_coeffs(m::Uniform_11Measure, deg::Int) = r_scale(0.5, rm_legendre(deg + 1)...) function bump_degree(op::Uniform_11OrthoPoly, deg::Int) ps = measure_parameters(op.measure) return Uniform_11OrthoPoly(deg, ps...) end -recursion_coeffs(m::GaussMeasure, deg::Int) = r_scale(1/sqrt(2π), rm_hermite_prob(deg+1)...) +function recursion_coeffs(m::GaussMeasure, deg::Int) + r_scale(1 / sqrt(2π), rm_hermite_prob(deg + 1)...) +end function bump_degree(op::GaussOrthoPoly, deg::Int) ps = measure_parameters(op.measure) return GaussOrthoPoly(deg, ps...) end -recursion_coeffs(m::LegendreMeasure, deg::Int) = rm_legendre(deg+1) +recursion_coeffs(m::LegendreMeasure, deg::Int) = rm_legendre(deg + 1) function bump_degree(op::LegendreOrthoPoly, deg::Int) ps = measure_parameters(op.measure) return LegendreOrthoPoly(deg, ps...) end -recursion_coeffs(m::LogisticMeasure, deg::Int) = r_scale(1.0, rm_logistic(deg+1)...) +recursion_coeffs(m::LogisticMeasure, deg::Int) = r_scale(1.0, rm_logistic(deg + 1)...) function bump_degree(op::LogisticOrthoPoly, deg::Int) ps = measure_parameters(op.measure) return LogisticOrthoPoly(deg, ps...) @@ -201,6 +217,6 @@ function computeSP2(pc::MultiOrthoPoly) n = length(pc.uni) m = dim(pc) uni_SP2 = [computeSP2(op) for op in pc.uni] - multi_SP2 = [prod(uni_SP2[j][pc.ind[i,j]+1] for j in 1:n) for i in 1:m] + multi_SP2 = [prod(uni_SP2[j][pc.ind[i, j] + 1] for j in 1:n) for i in 1:m] return multi_SP2 -end \ No newline at end of file +end diff --git a/test/PCETestUtils.jl b/test/PCETestUtils.jl index cf5d4ee..55a8cc4 100644 --- a/test/PCETestUtils.jl +++ b/test/PCETestUtils.jl @@ -8,13 +8,14 @@ function isapprox_sym(exprA, exprB, atol = 1e-6) return approx_equal end -function isapprox_sym(exprA::T, exprB::T, atol = 1e-6) where T <: Union{Symbolics.Mul, Symbolics.Add} +function isapprox_sym(exprA::T, exprB::T, + atol = 1e-6) where {T <: Union{Symbolics.Mul, Symbolics.Add}} approx_equal = true approx_equal = isapprox(exprA.coeff, exprB.coeff, atol = atol) approx_equal = keys(exprA.dict) == keys(exprB.dict) - if approx_equal + if approx_equal for subexpr in keys(exprA.dict) - approx_equal = isapprox(exprA.dict[subexpr], exprB.dict[subexpr], atol=atol) + approx_equal = isapprox(exprA.dict[subexpr], exprB.dict[subexpr], atol = atol) if !approx_equal break end diff --git a/test/PCETests.jl b/test/PCETests.jl index 6cf7b4f..a7b62f1 100644 --- a/test/PCETests.jl +++ b/test/PCETests.jl @@ -4,23 +4,23 @@ MO = ModelOrderReduction include("PCETestUtils.jl") # testing extraction of independent variables -@variables t, z, u(t), v(t)[1:4], w(t,z), x(t,z)[1:4] +@variables t, z, u(t), v(t)[1:4], w(t, z), x(t, z)[1:4] -@testset "PCE: get_independent_vars test" begin +@testset "PCE: get_independent_vars test" begin @test isequal(MO.get_independent_vars(u), [t]) @test isequal(MO.get_independent_vars(v[1]), [t]) @test isequal(MO.get_independent_vars(v[2]), [t]) - @test isequal(MO.get_independent_vars(w),[t,z]) - @test isequal(MO.get_independent_vars(x[2]),[t,z]) + @test isequal(MO.get_independent_vars(w), [t, z]) + @test isequal(MO.get_independent_vars(x[2]), [t, z]) @test isequal(MO.get_independent_vars(collect(v)), [[t] for i in 1:length(v)]) - @test isequal(MO.get_independent_vars(collect(x)), [[t,z] for i in 1:length(v)]) + @test isequal(MO.get_independent_vars(collect(x)), [[t, z] for i in 1:length(v)]) end # test equation for throughout: @parameters a @variables t, y(t) D = Differential(t) -test_equation = [D(y) ~ a*y + 4] +test_equation = [D(y) ~ a * y + 4] # test PCE generation n = 5 @@ -36,31 +36,37 @@ end eq = [eq.rhs for eq in test_equation] pce_eq = MO.apply_ansatz(eq, pce)[1] @testset "PCE: apply_ansatz test" begin - true_eq = expand(pce.sym_basis[2]*dot(pce.moments[1],pce.sym_basis)+4) + true_eq = expand(pce.sym_basis[2] * dot(pce.moments[1], pce.sym_basis) + 4) @test isequal(pce_eq, true_eq) end # test extraction of monomial coefficients -coeffs = Dict{Any, Any}(pce.sym_basis[i]*pce.sym_basis[2] => pce.moments[1][i] for i in 1:n+1) +coeffs = Dict{Any, Any}(pce.sym_basis[i] * pce.sym_basis[2] => pce.moments[1][i] + for i in 1:(n + 1)) coeffs[Val(1)] = 4.0 -basis_indices = Dict{Any,Any}(pce.sym_basis[i]*pce.sym_basis[2] => ([i-1, 1], [1,i-1]) for i in 1:n+1) -basis_indices[Val(1)] = [[0],[0]] +basis_indices = Dict{Any, Any}(pce.sym_basis[i] * pce.sym_basis[2] => ([i - 1, 1], + [1, i - 1]) + for i in 1:(n + 1)) +basis_indices[Val(1)] = [[0], [0]] @testset "PCE: basismonomial extraction test" begin extracted_coeffs = MO.extract_coeffs(pce_eq, pce.sym_basis) - @test all(isequal(coeffs[mono],extracted_coeffs[mono]) for mono in keys(coeffs)) - - extracted_coeffs, extracted_basis_indices = MO.extract_basismonomial_coeffs([pce_eq], pce) + @test all(isequal(coeffs[mono], extracted_coeffs[mono]) for mono in keys(coeffs)) + + extracted_coeffs, extracted_basis_indices = MO.extract_basismonomial_coeffs([pce_eq], + pce) extracted_basis_indices = Dict(extracted_basis_indices) - test1 = [isequal(basis_indices[mono][1], extracted_basis_indices[mono]) for mono in keys(basis_indices)] - test2 = [isequal(basis_indices[mono][2], extracted_basis_indices[mono]) for mono in keys(basis_indices)] + test1 = [isequal(basis_indices[mono][1], extracted_basis_indices[mono]) + for mono in keys(basis_indices)] + test2 = [isequal(basis_indices[mono][2], extracted_basis_indices[mono]) + for mono in keys(basis_indices)] @test all(test1 + test2 .>= 1) end # test Galerkin projection @testset "PCE: galerkin projection test" begin moment_eqs = MO.pce_galerkin(eq, pce) - integrator = MO.bump_degree(pce.pc_basis, n+1) + integrator = MO.bump_degree(pce.pc_basis, n + 1) true_moment_eqs = Num[] for j in 0:n @@ -68,14 +74,14 @@ end for mono in keys(basis_indices) ind = basis_indices[mono][2] c = computeSP(vcat(ind, j), integrator) - mom_eq += c*coeffs[mono] + mom_eq += c * coeffs[mono] end push!(true_moment_eqs, mom_eq) end - @test integrator.deg == n+1 + @test integrator.deg == n + 1 @test integrator.measure isa typeof(pce.pc_basis.measure) @test integrator.measure.measures[1] isa typeof(pce.pc_basis.measure.measures[1]) - @test all([isapprox_sym(moment_eqs[1][i], true_moment_eqs[i]) for i in eachindex(true_moment_eqs)]) + @test all([isapprox_sym(moment_eqs[1][i], true_moment_eqs[i]) + for i in eachindex(true_moment_eqs)]) end - diff --git a/test/runtests.jl b/test/runtests.jl index 808551d..f4f9927 100644 --- a/test/runtests.jl +++ b/test/runtests.jl @@ -1,8 +1,6 @@ using ModelOrderReduction using Test -@testset "ModelOrderReduction.jl" begin -end include("PCETests.jl") include("DataReduction.jl") #---------- Model Reduction ----------------# From 7ae4754e8931830d6bc2433a17f0d0977588d407 Mon Sep 17 00:00:00 2001 From: FHoltorf <32248677+FHoltorf@users.noreply.github.com> Date: Tue, 27 Sep 2022 18:51:23 -0400 Subject: [PATCH 30/62] fix typos in PCE utils --- src/PCE/PCE_utils.jl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/PCE/PCE_utils.jl b/src/PCE/PCE_utils.jl index 918ea1d..6ae35a4 100644 --- a/src/PCE/PCE_utils.jl +++ b/src/PCE/PCE_utils.jl @@ -119,7 +119,7 @@ function recursion_coeffs(m::JacobiMeasure, deg::Int) end function OrthoPoly(m::JacobiMeasure, deg::Int) α, β = recursion_coeffs(m, deg) - return JacobiOrthoPoly(deg, α, β, m) + return JacobiOrthoPoly(deg, α, β) end function bump_degree(op::JacobiOrthoPoly, deg::Int) ps = measure_parameters(op.measure) @@ -129,7 +129,7 @@ end recursion_coeffs(m::genLaguerreMeasure, deg::Int) = rm_laguerre(deg + 1, m.shapeParameter) function bump_degree(op::genLaguerreOrthoPoly, deg::Int) ps = measure_parameters(op.measure) - return genLaguerreorthoPoly(deg, ps...) + return genLaguerreOrthoPoly(deg, ps...) end function recursion_coeffs(m::MeixnerPollaczekMeasure, deg::Int) From db13e24db2b13509e282145a346013d287c6401a Mon Sep 17 00:00:00 2001 From: FHoltorf <32248677+FHoltorf@users.noreply.github.com> Date: Tue, 27 Sep 2022 18:53:24 -0400 Subject: [PATCH 31/62] test bump_degree for different OPs + some minor changes --- test/DataReduction.jl | 1 - test/PCETests.jl | 58 +++++++++++++++++++++++++++++++++---------- test/runtests.jl | 2 ++ 3 files changed, 47 insertions(+), 14 deletions(-) diff --git a/test/DataReduction.jl b/test/DataReduction.jl index 05538e4..ddd4d1d 100644 --- a/test/DataReduction.jl +++ b/test/DataReduction.jl @@ -1,6 +1,5 @@ #--------- Data Reduction -----------------# using OrdinaryDiffEq -const MOR = ModelOrderReduction function lorenz_prob() function lorenz!(du, u, p, t) diff --git a/test/PCETests.jl b/test/PCETests.jl index a7b62f1..1a7b7a3 100644 --- a/test/PCETests.jl +++ b/test/PCETests.jl @@ -1,5 +1,4 @@ using Symbolics, PolyChaos, ModelingToolkit, LinearAlgebra -MO = ModelOrderReduction include("PCETestUtils.jl") @@ -7,13 +6,13 @@ include("PCETestUtils.jl") @variables t, z, u(t), v(t)[1:4], w(t, z), x(t, z)[1:4] @testset "PCE: get_independent_vars test" begin - @test isequal(MO.get_independent_vars(u), [t]) - @test isequal(MO.get_independent_vars(v[1]), [t]) - @test isequal(MO.get_independent_vars(v[2]), [t]) - @test isequal(MO.get_independent_vars(w), [t, z]) - @test isequal(MO.get_independent_vars(x[2]), [t, z]) - @test isequal(MO.get_independent_vars(collect(v)), [[t] for i in 1:length(v)]) - @test isequal(MO.get_independent_vars(collect(x)), [[t, z] for i in 1:length(v)]) + @test isequal(MOR.get_independent_vars(u), [t]) + @test isequal(MOR.get_independent_vars(v[1]), [t]) + @test isequal(MOR.get_independent_vars(v[2]), [t]) + @test isequal(MOR.get_independent_vars(w), [t, z]) + @test isequal(MOR.get_independent_vars(x[2]), [t, z]) + @test isequal(MOR.get_independent_vars(collect(v)), [[t] for i in 1:length(v)]) + @test isequal(MOR.get_independent_vars(collect(x)), [[t, z] for i in 1:length(v)]) end # test equation for throughout: @@ -34,7 +33,7 @@ end # test PCE ansatz application eq = [eq.rhs for eq in test_equation] -pce_eq = MO.apply_ansatz(eq, pce)[1] +pce_eq = MOR.apply_ansatz(eq, pce)[1] @testset "PCE: apply_ansatz test" begin true_eq = expand(pce.sym_basis[2] * dot(pce.moments[1], pce.sym_basis) + 4) @test isequal(pce_eq, true_eq) @@ -50,10 +49,10 @@ basis_indices = Dict{Any, Any}(pce.sym_basis[i] * pce.sym_basis[2] => ([i - 1, 1 basis_indices[Val(1)] = [[0], [0]] @testset "PCE: basismonomial extraction test" begin - extracted_coeffs = MO.extract_coeffs(pce_eq, pce.sym_basis) + extracted_coeffs = MOR.extract_coeffs(pce_eq, pce.sym_basis) @test all(isequal(coeffs[mono], extracted_coeffs[mono]) for mono in keys(coeffs)) - extracted_coeffs, extracted_basis_indices = MO.extract_basismonomial_coeffs([pce_eq], + extracted_coeffs, extracted_basis_indices = MOR.extract_basismonomial_coeffs([pce_eq], pce) extracted_basis_indices = Dict(extracted_basis_indices) test1 = [isequal(basis_indices[mono][1], extracted_basis_indices[mono]) @@ -65,8 +64,8 @@ end # test Galerkin projection @testset "PCE: galerkin projection test" begin - moment_eqs = MO.pce_galerkin(eq, pce) - integrator = MO.bump_degree(pce.pc_basis, n + 1) + moment_eqs = MOR.pce_galerkin(eq, pce) + integrator = MOR.bump_degree(pce.pc_basis, n + 1) true_moment_eqs = Num[] for j in 0:n @@ -85,3 +84,36 @@ end @test all([isapprox_sym(moment_eqs[1][i], true_moment_eqs[i]) for i in eachindex(true_moment_eqs)]) end + +# test bump_degree +@testset "PCE: bump_degree test" begin + n = 5 + n_bumped = 10 + shape_a = 0.1 + shape_b = 0.2 + shape = 0.3 + mu = 0.4 + λ = 0.5 + ϕ = 0.6 + rate = 1.0 + orthogonal_polynomials = [GaussOrthoPoly(n) => [], + Uniform01OrthoPoly(n) => [], + Uniform_11OrthoPoly(n) => [], + GammaOrthoPoly(n,shape,rate) => [shape, rate], + HermiteOrthoPoly(n) => [], + JacobiOrthoPoly(n, shape_a, shape_b) => [shape_a, shape_b], + LaguerreOrthoPoly(n) => [], + LogisticOrthoPoly(n) => [], + MeixnerPollaczekOrthoPoly(n,λ,ϕ) => [λ,ϕ], + genHermiteOrthoPoly(n,mu) => [mu], + genLaguerreOrthoPoly(n,shape) => [shape], + LegendreOrthoPoly(n) => [], + Beta01OrthoPoly(n,shape_a,shape_b) => [shape_a, shape_b]] + + + for (op, params) in orthogonal_polynomials + bumped_op = MOR.bump_degree(op, n_bumped) + @test deg(bumped_op) == n_bumped + @test MOR.measure_parameters(bumped_op.measure) == params + end +end diff --git a/test/runtests.jl b/test/runtests.jl index f4f9927..2eaadfc 100644 --- a/test/runtests.jl +++ b/test/runtests.jl @@ -1,6 +1,8 @@ using ModelOrderReduction using Test +const MOR = ModelOrderReduction + include("PCETests.jl") include("DataReduction.jl") #---------- Model Reduction ----------------# From fcf255f5e9428bc3858a083c14e76e1d0b39608b Mon Sep 17 00:00:00 2001 From: FHoltorf <32248677+FHoltorf@users.noreply.github.com> Date: Tue, 27 Sep 2022 18:57:21 -0400 Subject: [PATCH 32/62] SciML format --- test/PCETests.jl | 31 ++++++++++++++++--------------- 1 file changed, 16 insertions(+), 15 deletions(-) diff --git a/test/PCETests.jl b/test/PCETests.jl index 1a7b7a3..60617a8 100644 --- a/test/PCETests.jl +++ b/test/PCETests.jl @@ -53,7 +53,7 @@ basis_indices[Val(1)] = [[0], [0]] @test all(isequal(coeffs[mono], extracted_coeffs[mono]) for mono in keys(coeffs)) extracted_coeffs, extracted_basis_indices = MOR.extract_basismonomial_coeffs([pce_eq], - pce) + pce) extracted_basis_indices = Dict(extracted_basis_indices) test1 = [isequal(basis_indices[mono][1], extracted_basis_indices[mono]) for mono in keys(basis_indices)] @@ -96,20 +96,21 @@ end λ = 0.5 ϕ = 0.6 rate = 1.0 - orthogonal_polynomials = [GaussOrthoPoly(n) => [], - Uniform01OrthoPoly(n) => [], - Uniform_11OrthoPoly(n) => [], - GammaOrthoPoly(n,shape,rate) => [shape, rate], - HermiteOrthoPoly(n) => [], - JacobiOrthoPoly(n, shape_a, shape_b) => [shape_a, shape_b], - LaguerreOrthoPoly(n) => [], - LogisticOrthoPoly(n) => [], - MeixnerPollaczekOrthoPoly(n,λ,ϕ) => [λ,ϕ], - genHermiteOrthoPoly(n,mu) => [mu], - genLaguerreOrthoPoly(n,shape) => [shape], - LegendreOrthoPoly(n) => [], - Beta01OrthoPoly(n,shape_a,shape_b) => [shape_a, shape_b]] - + orthogonal_polynomials = [ + GaussOrthoPoly(n) => [], + Uniform01OrthoPoly(n) => [], + Uniform_11OrthoPoly(n) => [], + GammaOrthoPoly(n, shape, rate) => [shape, rate], + HermiteOrthoPoly(n) => [], + JacobiOrthoPoly(n, shape_a, shape_b) => [shape_a, shape_b], + LaguerreOrthoPoly(n) => [], + LogisticOrthoPoly(n) => [], + MeixnerPollaczekOrthoPoly(n, λ, ϕ) => [λ, ϕ], + genHermiteOrthoPoly(n, mu) => [mu], + genLaguerreOrthoPoly(n, shape) => [shape], + LegendreOrthoPoly(n) => [], + Beta01OrthoPoly(n, shape_a, shape_b) => [shape_a, shape_b], + ] for (op, params) in orthogonal_polynomials bumped_op = MOR.bump_degree(op, n_bumped) From d4e7ef9c8abfb37f02263606eb3a441cd0071c3f Mon Sep 17 00:00:00 2001 From: FHoltorf <32248677+FHoltorf@users.noreply.github.com> Date: Tue, 27 Sep 2022 23:35:04 -0400 Subject: [PATCH 33/62] rm recursion coefficient methods as they are not needed in current implementation --- src/PCE/PCE_utils.jl | 8 -------- 1 file changed, 8 deletions(-) diff --git a/src/PCE/PCE_utils.jl b/src/PCE/PCE_utils.jl index 6ae35a4..9de7f99 100644 --- a/src/PCE/PCE_utils.jl +++ b/src/PCE/PCE_utils.jl @@ -114,19 +114,11 @@ measure_parameters(m::MeixnerPollaczekMeasure) = [m.λParameter, m.ϕParameter] measure_parameters(m::Beta01Measure) = [m.ashapeParameter, m.bshapeParameter] measure_parameters(m::GammaMeasure) = [m.shapeParameter, m.rateParameter] -function recursion_coeffs(m::JacobiMeasure, deg::Int) - rm_jacobi(deg + 1, m.ashapeParameter, m.bshapeParameter) -end -function OrthoPoly(m::JacobiMeasure, deg::Int) - α, β = recursion_coeffs(m, deg) - return JacobiOrthoPoly(deg, α, β) -end function bump_degree(op::JacobiOrthoPoly, deg::Int) ps = measure_parameters(op.measure) return JacobiOrthoPoly(deg, ps...) end -recursion_coeffs(m::genLaguerreMeasure, deg::Int) = rm_laguerre(deg + 1, m.shapeParameter) function bump_degree(op::genLaguerreOrthoPoly, deg::Int) ps = measure_parameters(op.measure) return genLaguerreOrthoPoly(deg, ps...) From d395638b38c3c95148f7fa9142f728faeb1e2802 Mon Sep 17 00:00:00 2001 From: FHoltorf <32248677+FHoltorf@users.noreply.github.com> Date: Tue, 27 Sep 2022 23:39:02 -0400 Subject: [PATCH 34/62] rm recursion coefficient methods as they are not needed in current implementation --- src/PCE/PCE_utils.jl | 21 --------------------- 1 file changed, 21 deletions(-) diff --git a/src/PCE/PCE_utils.jl b/src/PCE/PCE_utils.jl index 9de7f99..c2e3ccc 100644 --- a/src/PCE/PCE_utils.jl +++ b/src/PCE/PCE_utils.jl @@ -124,77 +124,56 @@ function bump_degree(op::genLaguerreOrthoPoly, deg::Int) return genLaguerreOrthoPoly(deg, ps...) end -function recursion_coeffs(m::MeixnerPollaczekMeasure, deg::Int) - rm_meixner_pollaczek(deg + 1, m.λParameter, m.ϕParameter) -end function bump_degree(op::MeixnerPollaczekOrthoPoly, deg::Int) ps = measure_parameters(op.measure) return MeixnerPollaczekOrthoPoly(deg, ps...) end -function recursion_coeffs(m::Beta01Measure, deg::Int) - r_scale(1 / beta(m.ashapeParameter, m.bshapeParameter), - rm_jacobi01(deg + 1, m.bshapeParameter - 1.0, m.ashapeParameter - 1.0)...) -end function bump_degree(op::Beta01OrthoPoly, deg::Int) ps = measure_parameters(op.measure) return Beta01OrthoPoly(deg, ps...) end -function recursion_coeffs(m::GammaMeasure, deg::Int) - r_scale((m.rateParameter^m.shapeParameter) / gamma(m.shapeParameter), - rm_laguerre(deg + 1, m.shapeParameter - 1.0)...) -end function bump_degree(op::GammaOrthoPoly, deg::Int) ps = measure_parameters(op.measure) return GammaOrthoPoly(deg, ps...) end -recursion_coeffs(m::genHermiteMeasure, deg::Int) = rm_hermite(deg + 1, m.muParameter) function bump_degree(op::genHermiteOrthoPoly, deg::Int) ps = measure_parameters(op.measure) return genHermiteOrthoPoly(deg, ps...) end -recursion_coeffs(m::HermiteMeasure, deg::Int) = rm_hermite(deg + 1) function bump_degree(op::HermiteOrthoPoly, deg::Int) ps = measure_parameters(op.measure) return HermiteOrthoPoly(deg, ps...) end -recursion_coeffs(m::LaguerreMeasure, deg::Int) = rm_laguerre(deg + 1) function bump_degree(op::LaguerreOrthoPoly, deg::Int) ps = measure_parameters(op.measure) return LaguerreOrthoPoly(deg, ps...) end -recursion_coeffs(m::Uniform01Measure, deg::Int) = r_scale(1.0, rm_legendre01(deg + 1)...) function bump_degree(op::Uniform01OrthoPoly, deg::Int) ps = measure_parameters(op.measure) return Uniform01OrthoPoly(deg, ps...) end -recursion_coeffs(m::Uniform_11Measure, deg::Int) = r_scale(0.5, rm_legendre(deg + 1)...) function bump_degree(op::Uniform_11OrthoPoly, deg::Int) ps = measure_parameters(op.measure) return Uniform_11OrthoPoly(deg, ps...) end -function recursion_coeffs(m::GaussMeasure, deg::Int) - r_scale(1 / sqrt(2π), rm_hermite_prob(deg + 1)...) -end function bump_degree(op::GaussOrthoPoly, deg::Int) ps = measure_parameters(op.measure) return GaussOrthoPoly(deg, ps...) end -recursion_coeffs(m::LegendreMeasure, deg::Int) = rm_legendre(deg + 1) function bump_degree(op::LegendreOrthoPoly, deg::Int) ps = measure_parameters(op.measure) return LegendreOrthoPoly(deg, ps...) end -recursion_coeffs(m::LogisticMeasure, deg::Int) = r_scale(1.0, rm_logistic(deg + 1)...) function bump_degree(op::LogisticOrthoPoly, deg::Int) ps = measure_parameters(op.measure) return LogisticOrthoPoly(deg, ps...) From 7546a75da8a1ec9aded4ca47fcd861b33efdc2b1 Mon Sep 17 00:00:00 2001 From: FHoltorf <32248677+FHoltorf@users.noreply.github.com> Date: Wed, 28 Sep 2022 00:12:25 -0400 Subject: [PATCH 35/62] support for generic orthogonal polynomials --- src/PCE/PCE_utils.jl | 5 +++++ test/PCETests.jl | 3 +++ 2 files changed, 8 insertions(+) diff --git a/src/PCE/PCE_utils.jl b/src/PCE/PCE_utils.jl index c2e3ccc..386fd48 100644 --- a/src/PCE/PCE_utils.jl +++ b/src/PCE/PCE_utils.jl @@ -105,6 +105,7 @@ end # PR to PolyChaos -> remove unnecessarily restrictive constructors and allow construction from measures # -> also expose number of points used for quadrature generation for general orthogonal polys # + measure_parameters(m::AbstractMeasure) = [] measure_parameters(m::Measure) = m.pars measure_parameters(m::JacobiMeasure) = [m.ashapeParameter, m.bshapeParameter] @@ -114,6 +115,10 @@ measure_parameters(m::MeixnerPollaczekMeasure) = [m.λParameter, m.ϕParameter] measure_parameters(m::Beta01Measure) = [m.ashapeParameter, m.bshapeParameter] measure_parameters(m::GammaMeasure) = [m.shapeParameter, m.rateParameter] +function bump_degree(op::OrthoPoly, deg::Int) + return OrthoPoly(op.name, deg, op.measure) +end + function bump_degree(op::JacobiOrthoPoly, deg::Int) ps = measure_parameters(op.measure) return JacobiOrthoPoly(deg, ps...) diff --git a/test/PCETests.jl b/test/PCETests.jl index 60617a8..67a6ca9 100644 --- a/test/PCETests.jl +++ b/test/PCETests.jl @@ -96,7 +96,10 @@ end λ = 0.5 ϕ = 0.6 rate = 1.0 + my_measure = Measure("my_measure", t -> 1+t, (-1,1), false, Dict()) + my_poly = OrthoPoly("my_poly", n, my_measure) orthogonal_polynomials = [ + my_poly => Dict(), GaussOrthoPoly(n) => [], Uniform01OrthoPoly(n) => [], Uniform_11OrthoPoly(n) => [], From ceba82857a0a2ae39a59dbce8ed64f57b85dc359 Mon Sep 17 00:00:00 2001 From: FHoltorf <32248677+FHoltorf@users.noreply.github.com> Date: Wed, 28 Sep 2022 01:36:55 -0400 Subject: [PATCH 36/62] fixed error in coefficient extraction (symbolic constant parts!) --- src/PCE/PCE.jl | 3 ++- src/PCE/PCE_utils.jl | 6 +++--- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/PCE/PCE.jl b/src/PCE/PCE.jl index c137768..7da4669 100644 --- a/src/PCE/PCE.jl +++ b/src/PCE/PCE.jl @@ -28,7 +28,8 @@ function PCE(states, bases::AbstractVector{<:Pair}) degs = [deg(op) for op in ops] min_deg = minimum(degs) if !(all(isequal(first(degs)), degs)) # allequal - @warn "Currently only bases with identical degrees are supported. Proceed with minimum common degree = $min_deg" + @warn "Currently only bases with identical degrees are supported."* + "\nProceed with minimum common degree = $min_deg" end pc_basis = MultiOrthoPoly(ops, min_deg) n_basis = size(pc_basis.ind, 1) diff --git a/src/PCE/PCE_utils.jl b/src/PCE/PCE_utils.jl index 386fd48..9557f6f 100644 --- a/src/PCE/PCE_utils.jl +++ b/src/PCE/PCE_utils.jl @@ -36,7 +36,7 @@ function split_term(term::Symbolics.Pow, vars) if term.base in vars return 1.0, term else - return term, 1.0 + return term, Val(1) end end @@ -44,7 +44,7 @@ function split_term(term::T, vars) where {T <: Union{Symbolics.Term, Symbolics.S if term in vars return 1.0, term else - return term, 1.0 + return term, Val(1) end end @@ -65,7 +65,7 @@ function extract_coeffs(expr::Symbolics.Add, vars::Set) return coeffs end -function extract_coeffs(expr::Symbolics.Mul, vars::Set) +function extract_coeffs(expr::T, vars::Set) where T <: Union{Symbolics.Sym, Symbolics.Mul} coeff, mono = split_term(expr, vars) return Dict(mono => coeff) end From 6fa5101a0723f9d868ddd44e49391232236758f3 Mon Sep 17 00:00:00 2001 From: FHoltorf <32248677+FHoltorf@users.noreply.github.com> Date: Wed, 28 Sep 2022 01:38:54 -0400 Subject: [PATCH 37/62] test for moment equations + more challenging test equation + minor bug fixes --- test/PCETestUtils.jl | 10 ++--- test/PCETests.jl | 95 ++++++++++++++++++++++++++------------------ 2 files changed, 60 insertions(+), 45 deletions(-) diff --git a/test/PCETestUtils.jl b/test/PCETestUtils.jl index 55a8cc4..3d1a67b 100644 --- a/test/PCETestUtils.jl +++ b/test/PCETestUtils.jl @@ -1,15 +1,11 @@ function isapprox_sym(exprA, exprB, atol = 1e-6) exprA = Symbolics.unwrap(exprA) exprB = Symbolics.unwrap(exprB) - approx_equal = false - if typeof(exprA) == typeof(exprB) - approx_equal = isapprox_sym(exprA, exprB, atol) - end - return approx_equal + return isapprox_sym(exprA, exprB) end -function isapprox_sym(exprA::T, exprB::T, - atol = 1e-6) where {T <: Union{Symbolics.Mul, Symbolics.Add}} +function isapprox_sym(exprA::TA, exprB::TB, + atol = 1e-6) where {TA, TB <: Union{Symbolics.Mul, Symbolics.Add}} approx_equal = true approx_equal = isapprox(exprA.coeff, exprB.coeff, atol = atol) approx_equal = keys(exprA.dict) == keys(exprB.dict) diff --git a/test/PCETests.jl b/test/PCETests.jl index 67a6ca9..8afd460 100644 --- a/test/PCETests.jl +++ b/test/PCETests.jl @@ -3,9 +3,8 @@ using Symbolics, PolyChaos, ModelingToolkit, LinearAlgebra include("PCETestUtils.jl") # testing extraction of independent variables -@variables t, z, u(t), v(t)[1:4], w(t, z), x(t, z)[1:4] - @testset "PCE: get_independent_vars test" begin + @variables t, z, u(t), v(t)[1:4], w(t, z), x(t, z)[1:4] @test isequal(MOR.get_independent_vars(u), [t]) @test isequal(MOR.get_independent_vars(v[1]), [t]) @test isequal(MOR.get_independent_vars(v[2]), [t]) @@ -15,34 +14,43 @@ include("PCETestUtils.jl") @test isequal(MOR.get_independent_vars(collect(x)), [[t, z] for i in 1:length(v)]) end +# test PCE generation +@testset "PCE: constructor test" begin + @variables y + n = 5 + test_basis = [a => GaussOrthoPoly(n), b => Uniform01OrthoPoly(n+1)] + warn_message = "Currently only bases with identical degrees are supported."* + "\nProceed with minimum common degree = $n" + @test_logs (:warn, warn_message) PCE([y], test_basis) + + test_basis = [a => GaussOrthoPoly(n), b => Uniform01OrthoPoly(n)] + pce = PCE([y], test_basis) + @test length(pce.moments[1]) == binomial(n+2,2) + @test length(pce.sym_basis) == binomial(n+2,2) + @test isequal(pce.parameters, [a,b]) +end + # test equation for throughout: -@parameters a +@parameters a, b @variables t, y(t) D = Differential(t) -test_equation = [D(y) ~ a * y + 4] +test_equation = [D(y) ~ a * y + 4*b] -# test PCE generation -n = 5 +# set up pce bases = [a => GaussOrthoPoly(n)] pce = PCE([y], bases) -@testset "PCE: constructor test" begin - @test length(pce.moments[1]) == n + 1 - @test length(pce.sym_basis) == n + 1 - @test isequal(pce.parameters, [a]) -end - -# test PCE ansatz application eq = [eq.rhs for eq in test_equation] pce_eq = MOR.apply_ansatz(eq, pce)[1] + @testset "PCE: apply_ansatz test" begin - true_eq = expand(pce.sym_basis[2] * dot(pce.moments[1], pce.sym_basis) + 4) + true_eq = expand(pce.sym_basis[2] * dot(pce.moments[1], pce.sym_basis) + 4*b) @test isequal(pce_eq, true_eq) end # test extraction of monomial coefficients coeffs = Dict{Any, Any}(pce.sym_basis[i] * pce.sym_basis[2] => pce.moments[1][i] for i in 1:(n + 1)) -coeffs[Val(1)] = 4.0 +coeffs[Val(1)] = 4.0*b basis_indices = Dict{Any, Any}(pce.sym_basis[i] * pce.sym_basis[2] => ([i - 1, 1], [1, i - 1]) for i in 1:(n + 1)) @@ -62,29 +70,6 @@ basis_indices[Val(1)] = [[0], [0]] @test all(test1 + test2 .>= 1) end -# test Galerkin projection -@testset "PCE: galerkin projection test" begin - moment_eqs = MOR.pce_galerkin(eq, pce) - integrator = MOR.bump_degree(pce.pc_basis, n + 1) - - true_moment_eqs = Num[] - for j in 0:n - mom_eq = 0.0 - for mono in keys(basis_indices) - ind = basis_indices[mono][2] - c = computeSP(vcat(ind, j), integrator) - mom_eq += c * coeffs[mono] - end - push!(true_moment_eqs, mom_eq) - end - - @test integrator.deg == n + 1 - @test integrator.measure isa typeof(pce.pc_basis.measure) - @test integrator.measure.measures[1] isa typeof(pce.pc_basis.measure.measures[1]) - @test all([isapprox_sym(moment_eqs[1][i], true_moment_eqs[i]) - for i in eachindex(true_moment_eqs)]) -end - # test bump_degree @testset "PCE: bump_degree test" begin n = 5 @@ -121,3 +106,37 @@ end @test MOR.measure_parameters(bumped_op.measure) == params end end + +# test Galerkin projection +@testset "PCE: galerkin projection test" begin + moment_eqs = MOR.pce_galerkin(eq, pce) + integrator = MOR.bump_degree(pce.pc_basis, n + 1) + + true_moment_eqs = Num[] + for j in 0:n + mom_eq = 0.0 + for mono in keys(basis_indices) + ind = basis_indices[mono][2] + c = computeSP(vcat(ind, j), integrator) + mom_eq += c * coeffs[mono] + end + push!(true_moment_eqs, mom_eq) + end + + @test integrator.deg == n + 1 + @test integrator.measure isa typeof(pce.pc_basis.measure) + @test integrator.measure.measures[1] isa typeof(pce.pc_basis.measure.measures[1]) + @test all([isapprox_sym(moment_eqs[1][i], true_moment_eqs[i]) + for i in eachindex(true_moment_eqs)]) + + # check generation of moment equations + @named test_system = ODESystem(test_equation, t, [y], [a,b]) + moment_system, pce_eval = moment_equations(test_system, pce) + moment_eqs = equations(moment_system) + moment_eqs = [moment_eqs[i].rhs * computeSP([i-1,i-1], integrator) for i in eachindex(moment_eqs)] + @test isequal(parameters(moment_system), [b]) + @test nameof(moment_system) == :test_system_pce + @test isequal(states(moment_system), reduce(vcat, pce.moments)) + @test all([isapprox_sym(moment_eqs[i], true_moment_eqs[i]) + for i in eachindex(true_moment_eqs)]) +end \ No newline at end of file From 06cd417d35587e1840b175844af2402c6d4daaa2 Mon Sep 17 00:00:00 2001 From: FHoltorf <32248677+FHoltorf@users.noreply.github.com> Date: Wed, 28 Sep 2022 01:39:48 -0400 Subject: [PATCH 38/62] SciML format --- src/PCE/PCE.jl | 2 +- src/PCE/PCE_utils.jl | 2 +- test/PCETests.jl | 25 +++++++++++++------------ 3 files changed, 15 insertions(+), 14 deletions(-) diff --git a/src/PCE/PCE.jl b/src/PCE/PCE.jl index 7da4669..f009136 100644 --- a/src/PCE/PCE.jl +++ b/src/PCE/PCE.jl @@ -28,7 +28,7 @@ function PCE(states, bases::AbstractVector{<:Pair}) degs = [deg(op) for op in ops] min_deg = minimum(degs) if !(all(isequal(first(degs)), degs)) # allequal - @warn "Currently only bases with identical degrees are supported."* + @warn "Currently only bases with identical degrees are supported." * "\nProceed with minimum common degree = $min_deg" end pc_basis = MultiOrthoPoly(ops, min_deg) diff --git a/src/PCE/PCE_utils.jl b/src/PCE/PCE_utils.jl index 9557f6f..1f44aeb 100644 --- a/src/PCE/PCE_utils.jl +++ b/src/PCE/PCE_utils.jl @@ -65,7 +65,7 @@ function extract_coeffs(expr::Symbolics.Add, vars::Set) return coeffs end -function extract_coeffs(expr::T, vars::Set) where T <: Union{Symbolics.Sym, Symbolics.Mul} +function extract_coeffs(expr::T, vars::Set) where {T <: Union{Symbolics.Sym, Symbolics.Mul}} coeff, mono = split_term(expr, vars) return Dict(mono => coeff) end diff --git a/test/PCETests.jl b/test/PCETests.jl index 8afd460..ff281b2 100644 --- a/test/PCETests.jl +++ b/test/PCETests.jl @@ -18,23 +18,23 @@ end @testset "PCE: constructor test" begin @variables y n = 5 - test_basis = [a => GaussOrthoPoly(n), b => Uniform01OrthoPoly(n+1)] - warn_message = "Currently only bases with identical degrees are supported."* + test_basis = [a => GaussOrthoPoly(n), b => Uniform01OrthoPoly(n + 1)] + warn_message = "Currently only bases with identical degrees are supported." * "\nProceed with minimum common degree = $n" @test_logs (:warn, warn_message) PCE([y], test_basis) test_basis = [a => GaussOrthoPoly(n), b => Uniform01OrthoPoly(n)] pce = PCE([y], test_basis) - @test length(pce.moments[1]) == binomial(n+2,2) - @test length(pce.sym_basis) == binomial(n+2,2) - @test isequal(pce.parameters, [a,b]) + @test length(pce.moments[1]) == binomial(n + 2, 2) + @test length(pce.sym_basis) == binomial(n + 2, 2) + @test isequal(pce.parameters, [a, b]) end # test equation for throughout: @parameters a, b @variables t, y(t) D = Differential(t) -test_equation = [D(y) ~ a * y + 4*b] +test_equation = [D(y) ~ a * y + 4 * b] # set up pce bases = [a => GaussOrthoPoly(n)] @@ -43,14 +43,14 @@ eq = [eq.rhs for eq in test_equation] pce_eq = MOR.apply_ansatz(eq, pce)[1] @testset "PCE: apply_ansatz test" begin - true_eq = expand(pce.sym_basis[2] * dot(pce.moments[1], pce.sym_basis) + 4*b) + true_eq = expand(pce.sym_basis[2] * dot(pce.moments[1], pce.sym_basis) + 4 * b) @test isequal(pce_eq, true_eq) end # test extraction of monomial coefficients coeffs = Dict{Any, Any}(pce.sym_basis[i] * pce.sym_basis[2] => pce.moments[1][i] for i in 1:(n + 1)) -coeffs[Val(1)] = 4.0*b +coeffs[Val(1)] = 4.0 * b basis_indices = Dict{Any, Any}(pce.sym_basis[i] * pce.sym_basis[2] => ([i - 1, 1], [1, i - 1]) for i in 1:(n + 1)) @@ -81,7 +81,7 @@ end λ = 0.5 ϕ = 0.6 rate = 1.0 - my_measure = Measure("my_measure", t -> 1+t, (-1,1), false, Dict()) + my_measure = Measure("my_measure", t -> 1 + t, (-1, 1), false, Dict()) my_poly = OrthoPoly("my_poly", n, my_measure) orthogonal_polynomials = [ my_poly => Dict(), @@ -130,13 +130,14 @@ end for i in eachindex(true_moment_eqs)]) # check generation of moment equations - @named test_system = ODESystem(test_equation, t, [y], [a,b]) + @named test_system = ODESystem(test_equation, t, [y], [a, b]) moment_system, pce_eval = moment_equations(test_system, pce) moment_eqs = equations(moment_system) - moment_eqs = [moment_eqs[i].rhs * computeSP([i-1,i-1], integrator) for i in eachindex(moment_eqs)] + moment_eqs = [moment_eqs[i].rhs * computeSP([i - 1, i - 1], integrator) + for i in eachindex(moment_eqs)] @test isequal(parameters(moment_system), [b]) @test nameof(moment_system) == :test_system_pce @test isequal(states(moment_system), reduce(vcat, pce.moments)) @test all([isapprox_sym(moment_eqs[i], true_moment_eqs[i]) for i in eachindex(true_moment_eqs)]) -end \ No newline at end of file +end From 73d89decda42b0d65bf5df6bbca9ff11aa25697c Mon Sep 17 00:00:00 2001 From: FHoltorf <32248677+FHoltorf@users.noreply.github.com> Date: Wed, 28 Sep 2022 11:30:52 -0400 Subject: [PATCH 39/62] fix bug --- test/PCETests.jl | 1 + 1 file changed, 1 insertion(+) diff --git a/test/PCETests.jl b/test/PCETests.jl index ff281b2..37df111 100644 --- a/test/PCETests.jl +++ b/test/PCETests.jl @@ -16,6 +16,7 @@ end # test PCE generation @testset "PCE: constructor test" begin + @parameters a, b @variables y n = 5 test_basis = [a => GaussOrthoPoly(n), b => Uniform01OrthoPoly(n + 1)] From 1a10d55f9efefdd1205c7e031a1eaba7455ee223 Mon Sep 17 00:00:00 2001 From: FHoltorf <32248677+FHoltorf@users.noreply.github.com> Date: Wed, 28 Sep 2022 11:57:51 -0400 Subject: [PATCH 40/62] fix apply_ansatz test --- test/PCETests.jl | 1 + 1 file changed, 1 insertion(+) diff --git a/test/PCETests.jl b/test/PCETests.jl index 37df111..64c27db 100644 --- a/test/PCETests.jl +++ b/test/PCETests.jl @@ -38,6 +38,7 @@ D = Differential(t) test_equation = [D(y) ~ a * y + 4 * b] # set up pce +n = 5 bases = [a => GaussOrthoPoly(n)] pce = PCE([y], bases) eq = [eq.rhs for eq in test_equation] From 9e800905c43a300e05bf1a1c9624d64e3e6b8ad7 Mon Sep 17 00:00:00 2001 From: FHoltorf <32248677+FHoltorf@users.noreply.github.com> Date: Thu, 13 Oct 2022 14:45:44 -0400 Subject: [PATCH 41/62] run SciML formatter --- test/runtests.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/runtests.jl b/test/runtests.jl index 9b610f1..6bdcf97 100644 --- a/test/runtests.jl +++ b/test/runtests.jl @@ -5,4 +5,4 @@ using SafeTestsets @safetestset "POD" begin include("DataReduction.jl") end @safetestset "utils" begin include("utils.jl") end @safetestset "DEIM" begin include("deim.jl") end -@safetestset "PCE" begin include("PCETests.jl") end \ No newline at end of file +@safetestset "PCE" begin include("PCETests.jl") end From 11504df5fc47a8208879eab88118794d48e68655 Mon Sep 17 00:00:00 2001 From: FHoltorf <32248677+FHoltorf@users.noreply.github.com> Date: Thu, 13 Oct 2022 21:31:51 -0400 Subject: [PATCH 42/62] include normalization in galerkin_projection --- src/PCE/PCE.jl | 14 +++++++------- test/PCETests.jl | 6 +++--- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/PCE/PCE.jl b/src/PCE/PCE.jl index f009136..af06430 100644 --- a/src/PCE/PCE.jl +++ b/src/PCE/PCE.jl @@ -133,6 +133,7 @@ end # 4. Galerkin projection function galerkin_projection(bm_coeffs, scalar_products, pce::PCE) projected_eqs = [] + scaling_factors = computeSP2(pce.pc_basis) for i in eachindex(bm_coeffs) eqs = [] for k in 1:dim(pce.pc_basis) @@ -140,7 +141,7 @@ function galerkin_projection(bm_coeffs, scalar_products, pce::PCE) sum(bm_coeffs[i][mono] * scalar_products[k][mono] for mono in keys(bm_coeffs[i]))) end - push!(projected_eqs, eqs) + push!(projected_eqs, eqs ./ scaling_factors) end return projected_eqs end @@ -148,10 +149,9 @@ end # 5. combine everything function pce_galerkin(eqs::AbstractVector, pce::PCE) expanded_eqs = apply_ansatz(eqs, pce) - basismonomial_coeffs, basismonomial_indices = extract_basismonomial_coeffs(expanded_eqs, - pce) - scalar_products = eval_scalar_products(basismonomial_indices, pce) - projected_eqs = galerkin_projection(basismonomial_coeffs, scalar_products, pce) + basismono_coeffs, basismono_idcs = extract_basismonomial_coeffs(expanded_eqs, pce) + scalar_products = eval_scalar_products(basismono_idcs, pce) + projected_eqs = galerkin_projection(basismono_coeffs, scalar_products, pce) return projected_eqs end @@ -159,8 +159,8 @@ end # 6a. apply pce to explicit ODE function moment_equations(sys::ODESystem, pce::PCE) eqs = [eq.rhs for eq in equations(sys)] - scaling_factors = computeSP2(pce.pc_basis) - moment_eqs = reduce(vcat, [eq ./ scaling_factors for eq in pce_galerkin(eqs, pce)]) + projected_eqs = pce_galerkin(eqs, pce) + moment_eqs = reduce(vcat, projected_eqs) iv = independent_variable(sys) params = setdiff(parameters(sys), pce.parameters) D = Differential(iv) diff --git a/test/PCETests.jl b/test/PCETests.jl index b369180..04237ed 100644 --- a/test/PCETests.jl +++ b/test/PCETests.jl @@ -117,6 +117,7 @@ end integrator = MOR.bump_degree(pce.pc_basis, n + 1) true_moment_eqs = Num[] + scaling_factor = computeSP2(pce.pc_basis) for j in 0:n mom_eq = 0.0 for mono in keys(basis_indices) @@ -124,7 +125,7 @@ end c = computeSP(vcat(ind, j), integrator) mom_eq += c * coeffs[mono] end - push!(true_moment_eqs, mom_eq) + push!(true_moment_eqs, 1 / scaling_factor[j + 1] * mom_eq) end @test integrator.deg == n + 1 @@ -137,8 +138,7 @@ end @named test_system = ODESystem(test_equation, t, [y], [a, b]) moment_system, pce_eval = moment_equations(test_system, pce) moment_eqs = equations(moment_system) - moment_eqs = [moment_eqs[i].rhs * computeSP([i - 1, i - 1], integrator) - for i in eachindex(moment_eqs)] + moment_eqs = [moment_eqs[i].rhs for i in eachindex(moment_eqs)] @test isequal(parameters(moment_system), [b]) @test nameof(moment_system) == :test_system_pce @test isequal(states(moment_system), reduce(vcat, pce.moments)) From dad3d67e37e6b6a32f6cbeed09f377183d755bc8 Mon Sep 17 00:00:00 2001 From: FHoltorf <32248677+FHoltorf@users.noreply.github.com> Date: Fri, 14 Oct 2022 11:25:03 -0400 Subject: [PATCH 43/62] doc strings --- src/PCE/PCE.jl | 109 ++++++++++++++++++++++++++++++++++++------- src/PCE/PCE_utils.jl | 11 +++++ 2 files changed, 103 insertions(+), 17 deletions(-) diff --git a/src/PCE/PCE.jl b/src/PCE/PCE.jl index af06430..41e07c4 100644 --- a/src/PCE/PCE.jl +++ b/src/PCE/PCE.jl @@ -2,10 +2,30 @@ using PolyChaos, Symbolics, ModelingToolkit, LinearAlgebra export PCE, moment_equations, pce_galerkin, mean, var -include("PCE_utils.jl") -# for now only consider tensor grid bases -# with degree equal across all bases -# need to adjust in PolyChaos +""" +$(SIGNATURES) + +`PCE` object for symbolic representation of a dense multivariate polynomial chaos expansion +of a given set of states ``x`` in terms of a given set of uncertain parameters ``p``: +```math + x = ∑ᵢ zᵢ ζᵢ(p). +``` +Here ``x`` denotes the states of the PCE, ``p`` the parameters, ``zᵢ`` refers to the ``i``th moments and ``ζᵢ`` to the +``i``th basis function. + +# Fields +- `states`: Vector of states (symbolic variables) representing the state of the PCE. +- `parameters`: `Vector` of parameters (symbolic variables) being expanded. +- `bases`: `Vector` of `Pair`s mapping parameters to a `PolyChaos.AbstractOrthoPoly` representing + the basis in which the parametric dependence is expanded. +- `bases_dict`: `Dict` generated from bases. +- `sym_basis`: `Vector` of symbolic variables representing the basis functions: ``[ζ₁, …, ζₘ]``. +- `pc_basis`: `PolyChaos.MultiOrthoPoly` representing the tensorproduct-based multi-variate basis underpinning the PCE +- `sym_to_pc`: `Dict` mapping symbolic basis variable to PolyChaos.MultiOrthoPoly index (multi-index) +- `pc_to_sym`: `Dict` mapping PolyChaos.MultiOrthoPoly index (multi-index) to symbolic basis variable +- `ansatz`: `Vector` of `Pair`s mapping state to corresponding PCE ansatz +- `moments`: `Vector` of `Vector`s carrying the moments for each state. +""" struct PCE states::Any # states parameters::Any # vector of parameters being expanded @@ -15,9 +35,16 @@ struct PCE pc_basis::Any # polychaos basis object sym_to_pc::Any # dictionary mapping symbolic to pc basis pc_to_sym::Any # dictionary mapping pc to symbolic basis - ansatz::Any # vector of pairs: x(t,p) => ∑ᵢ cᵢ(t)ξᵢ(p) - moments::Any # matrix (?) of symbolic variables: cᵢ(t) + ansatz::Any # vector of pairs: x(t,p) => ∑ᵢ zᵢ(t)ζᵢ(p) + moments::Any # symbolic variables: zᵢ(t) end + +""" +$(SIGNATURES) + +Create `PCE` object from a `Vector` of states (symbolic variables) and a `Vector` of `Pair`s mapping +the parameters to the corresponding `PolyChaos.AbstractOrthoPoly` basis used for expansion. +""" function PCE(states, bases::AbstractVector{<:Pair}) # to deal with symbolic arrays states = collect(states) @@ -72,7 +99,14 @@ function (pce::PCE)(moment_vals, parameter_vals::Number) return pce(moment_vals, reshape([parameter_vals], 1, 1)) end +include("PCE_utils.jl") + # 1. apply PCE ansatz +""" +$(TYPEDSIGNATURES) + +Generate linear PCEs for the uncertain parameters. +""" function generate_parameter_pce(pce::PCE) par_dim = length(pce.parameters) par_pce = Vector{Pair{eltype(pce.parameters), eltype(pce.sym_basis)}}(undef, par_dim) @@ -82,20 +116,47 @@ function generate_parameter_pce(pce::PCE) end return par_pce end + +""" +$(TYPEDSIGNATURES) + +Substitute parameters shared between a set of symbolic `eqs` and the PCE `pce` for the corresponding linear PCEs. +""" function substitute_parameters(eqs::AbstractVector, pce::PCE) par_pce = generate_parameter_pce(pce) subs_eqs = [substitute(eq, par_pce) for eq in eqs] return subs_eqs end + +""" +$(TYPEDSIGNATURES) + +Substitute PCE Ansatz defined in `pce` into a set of symbolic equations `eqs`. +""" function substitute_pce_ansatz(eqs::AbstractVector, pce::PCE) subs_eqs = [expand(expand(substitute(eq, pce.ansatz))) for eq in eqs] return subs_eqs end + +""" +$(TYPEDSIGNATURES) + +Apply PCE ansatz defined in `pce` to a given set of symbolic equations `eqs`. +""" function apply_ansatz(eqs::AbstractVector, pce::PCE) return substitute_pce_ansatz(substitute_parameters(eqs, pce), pce) end -# 2. extract PCE expansion coeffs +# 2. extract PCE expansion coeffs +""" +$(TYPEDSIGNATURES) + +Given a set of symbolic equations `eqs` involving the basis functions of `pce`, +extract monomials of the basis functions and the corresponding coeffiecients. + +# Returns +`Vector` of `Dict`s mapping monomial of basis functions to its coefficient in the individual equations. +""" function extract_basismonomial_coeffs(eqs::AbstractVector, pce::PCE) basismonomial_coeffs = [extract_coeffs(eq, pce.sym_basis) for eq in eqs] basismonomial_indices = [] @@ -107,15 +168,12 @@ function extract_basismonomial_coeffs(eqs::AbstractVector, pce::PCE) end # 3. compute inner products -function maximum_degree(mono_indices::AbstractVector, pce::PCE) - max_degree = 0 - for (mono, ind) in mono_indices - max_degree = max(max_degree, - maximum(sum(ind[i] * pce.pc_basis.ind[i + 1] - for i in eachindex(ind)))) - end - return max_degree -end +""" +$(TYPEDSIGNATURES) + +Evaluate scalar products between all basis functions in `pce` and +basis monomials as characterized by `mono_indices`. +""" function eval_scalar_products(mono_indices, pce::PCE) max_degree = maximum_degree(mono_indices, pce) degree_quadrature = max(ceil(Int, 0.5 * (max_degree + deg(pce.pc_basis) + 1)), @@ -131,7 +189,14 @@ function eval_scalar_products(mono_indices, pce::PCE) end # 4. Galerkin projection -function galerkin_projection(bm_coeffs, scalar_products, pce::PCE) +""" +$(TYPEDSIGNATURES) + +perform Galerkin projection of polynomial expressions characterized by `Dict`s mapping +basis monomials to coefficients. +""" +function galerkin_projection(bm_coeffs::Vector{<:Dict}, scalar_products::Vector{<:Dict}, + pce::PCE) projected_eqs = [] scaling_factors = computeSP2(pce.pc_basis) for i in eachindex(bm_coeffs) @@ -147,6 +212,11 @@ function galerkin_projection(bm_coeffs, scalar_products, pce::PCE) end # 5. combine everything +""" +$(TYPEDSIGNATURES) + +perform Galerkin projection onto the `pce`. +""" function pce_galerkin(eqs::AbstractVector, pce::PCE) expanded_eqs = apply_ansatz(eqs, pce) basismono_coeffs, basismono_idcs = extract_basismonomial_coeffs(expanded_eqs, pce) @@ -157,6 +227,11 @@ end # 6. high-level interface # 6a. apply pce to explicit ODE +""" +$(TYPEDSIGNATURES) + +Generate moment equations of an `ODESystem` from a given `PCE`-Ansatz via Galerkin projection. +""" function moment_equations(sys::ODESystem, pce::PCE) eqs = [eq.rhs for eq in equations(sys)] projected_eqs = pce_galerkin(eqs, pce) diff --git a/src/PCE/PCE_utils.jl b/src/PCE/PCE_utils.jl index 1f44aeb..53f655e 100644 --- a/src/PCE/PCE_utils.jl +++ b/src/PCE/PCE_utils.jl @@ -196,3 +196,14 @@ function computeSP2(pc::MultiOrthoPoly) multi_SP2 = [prod(uni_SP2[j][pc.ind[i, j] + 1] for j in 1:n) for i in 1:m] return multi_SP2 end + +# computing maximum degree +function maximum_degree(mono_indices::AbstractVector, pce::PCE) + max_degree = 0 + for (mono, ind) in mono_indices + max_degree = max(max_degree, + maximum(sum(pce.pc_basis.ind[ind[i] + 1, :] + for i in eachindex(ind)))) + end + return max_degree +end From a6708dd028901153f22b50779f040c548ed9c12a Mon Sep 17 00:00:00 2001 From: FHoltorf <32248677+FHoltorf@users.noreply.github.com> Date: Fri, 14 Oct 2022 11:48:25 -0400 Subject: [PATCH 44/62] bug fix --- src/PCE/PCE.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/PCE/PCE.jl b/src/PCE/PCE.jl index 41e07c4..53bab67 100644 --- a/src/PCE/PCE.jl +++ b/src/PCE/PCE.jl @@ -195,7 +195,7 @@ $(TYPEDSIGNATURES) perform Galerkin projection of polynomial expressions characterized by `Dict`s mapping basis monomials to coefficients. """ -function galerkin_projection(bm_coeffs::Vector{<:Dict}, scalar_products::Vector{<:Dict}, +function galerkin_projection(bm_coeffs::Vector{<:Dict}, scalar_products::Dict, pce::PCE) projected_eqs = [] scaling_factors = computeSP2(pce.pc_basis) From d378ad42708157187443ece79994385bb113cc62 Mon Sep 17 00:00:00 2001 From: FHoltorf <32248677+FHoltorf@users.noreply.github.com> Date: Fri, 14 Oct 2022 22:19:47 -0400 Subject: [PATCH 45/62] TensorProductOrthoPoly introduced --- src/PCE/PCE_utils.jl | 103 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 103 insertions(+) diff --git a/src/PCE/PCE_utils.jl b/src/PCE/PCE_utils.jl index 53f655e..234b7dc 100644 --- a/src/PCE/PCE_utils.jl +++ b/src/PCE/PCE_utils.jl @@ -207,3 +207,106 @@ function maximum_degree(mono_indices::AbstractVector, pce::PCE) end return max_degree end + +""" +`TensorProductOrthoPoly` objects represent bases formed as the tensor product of univariate `PolyChaos.AbstractOrthoPoly` bases. +By default the basis elements of the tensor product are restricted to polynomials with total degree up to the maximum degree among the +univariate bases. This maximum degree can be manually specified, however. +""" +struct TensorProductOrthoPoly{M,U} + ind::Matrix + measure::M + deg::Vector{Int} + uni::U +end +function TensorProductOrthoPoly(ops::AbstractVector{T}) where T <: Union{AbstractOrthoPoly, AbstractCanonicalOrthoPoly} + n = length(ops) + degrees = [deg(op) for op in ops] + ind = grevlex(n, 0:maximum(degrees), degrees) + measures = [op.measure for op in ops] + prod_measure = ProductMeasure(t -> prod(measure.w for measure in measures), + measures) + + return TensorProductOrthoPoly(ind, prod_measure, degrees, ops) +end +function TensorProductOrthoPoly(ops::AbstractVector{T}, max_deg::Int) where T <: Union{AbstractOrthoPoly, AbstractCanonicalOrthoPoly} + n = length(ops) + degrees = [deg(op) for op in ops] + ind = grevlex(n, 0:max_deg, degrees) + measures = [op.measure for op in ops] + prod_measure = ProductMeasure(t -> prod(measure.w for measure in measures), + measures) + + return TensorProductOrthoPoly(ind, prod_measure, degrees, ops) +end + +""" +$(TYPEDSIGNATURES) + +computes inner product between basis functions of a `TensorProductOrthoPoly` via +`PolyChaos`'s infrastructure (exploiting the tensor product form). +""" +function computeSP(basis_fxns, tpop::TensorProductOrthoPoly) + multi_indices = tpop.ind[basis_fxns, :] + # columns of multi_indices refer to inner products to be computed + sp = 1.0 + for k in axes(multi_indices, 2) + sp *= computeSP(multi_indices[:,k], tpop.uni[k]) + end + return round(sp, digits = 12) +end + +""" +$(TYPEDSIGNATURES) + +Compute the an ascending list of `n`-dimensional multi-indices with fixed `grade` (= sum of entries) +in graded reverse lexicographic order. Constraints on the degrees considered can be incorporated. +""" +function grevlex(n::Int, grade::Int) + if n == 1 + return reshape([grade], 1, 1) + end + + if grade == 0 + return zeros(Int, 1, n) + end + + sub_ind = grevlex(n-1,grade) + ind = hcat(sub_ind, zeros(Int,size(sub_ind,1))) + for k in 1:grade + sub_ind = grevlex(n-1,grade-k) + ind = vcat(ind, hcat(sub_ind, k*ones(Int,size(sub_ind,1)))) + end + return ind +end + +function grevlex(n::Int, grades::AbstractVector) + return reduce(vcat, [grevlex(n, grade) for grade in grades]) +end + +function grevlex(n::Int, grade::Int, max_degrees::Vector{Int}) + return grevlex(n, grade, [0:d for d in max_degrees]) +end + +function grevlex(n::Int, grades::AbstractVector, max_degrees::Vector{Int}) + return reduce(vcat, [grevlex(n, grade, max_degrees) for grade in grades]) +end + +function grevlex(n::Int, grade::Int, constrained_degrees::Vector{<:AbstractVector}) + if n == 1 + return grade in constrained_degrees[1] ? reshape([grade], 1, 1) : zeros(Int,0,1) + end + + if grade == 0 + return zeros(Int, 1, n) + end + + filtered_grades = filter(x -> x <= grade, constrained_degrees[end]) + sub_ind = grevlex(n-1, grade - filtered_grades[1], constrained_degrees[1:end-1]) + ind = hcat(sub_ind, filtered_grades[1]*ones(Int,size(sub_ind,1))) + for k in filtered_grades[2:end] + sub_ind = grevlex(n-1, grade-k, constrained_degrees[1:end-1]) + ind = vcat(ind, hcat(sub_ind, k*ones(Int,size(sub_ind,1)))) + end + return ind +end \ No newline at end of file From 751039989baee3cb0f03108e5800624c50e6f3ec Mon Sep 17 00:00:00 2001 From: FHoltorf <32248677+FHoltorf@users.noreply.github.com> Date: Sat, 15 Oct 2022 02:18:03 -0400 Subject: [PATCH 46/62] change code base to TensorProductOrthoPoly --- examples/PCE/mean.png | Bin 46597 -> 47083 bytes examples/PCE/traces.png | Bin 84243 -> 84839 bytes examples/PCE/var.png | Bin 58342 -> 58942 bytes src/PCE/PCE.jl | 56 ++++----- src/PCE/PCE_utils.jl | 256 ++++++++++++++++++++++------------------ test/PCETests.jl | 12 +- 6 files changed, 169 insertions(+), 155 deletions(-) diff --git a/examples/PCE/mean.png b/examples/PCE/mean.png index cf970e9eaf6883b02bb471a6d1326f20d5c91002..b2337a3f032dce78a56989b35223bc8e6ced3123 100644 GIT binary patch literal 47083 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 diff --git a/examples/PCE/traces.png b/examples/PCE/traces.png index 49ba1d05080e0753d7397db6f046624a83809194..4bc5295f86355181247940d4607b8760eb89f5ec 100644 GIT binary patch literal 84839 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

+lk2_v(y-*=qtjm$ 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 literal 58342 zcmafbbyQXB7wx7G>7hfqr9}`aNdYO5M!G>nKq)~w1VKU+L>d(7?hYvtNePt_P+CMf z-{Stp8{_@=_Pqn|Js!^4dw=U&Ypyxx+L2nC%ESb81PFo<-&Rr7Mi5Lx1i^?yVZtk? z29bmC2d3XNGr`en6+@5IT$_krNTfQX`jN_P%;{N(P z+sc&EV`IsvTxvDDaka#B*tGw7lrw1&cQysD9w~(!#tQ$=OIdl9`ajQ(-*R1k&VtY0 zb|SOYn4Fp{z8~&8n3jC)w*?v-1C7GQ42sq*>(ECqgJhY}maGB~aF|bXN=izano|30 z?mId{j6G& zK$ZdX_3NH-jp5N~;cM4Es3!-vTNu`+)YaAH}jwU)DRnpY_ z^6At4vy;QVzP^y0HVaJUP=%1Zyu8dzW^B1!%`^$OpNbqD??*;P*4Nh!O3gIh2({17 znseWqcdfgklN(KY%`Wb^*=Lt$t!;47CC>L5k?+XpsI-(6H^uYj=H}Sg*n)!ldU|?h zW@g&j+7BK)aCI#!qj>!IaY9lO(`QDmJL%Dyk{%u&ey2yGJUpvk(j>(m{y-5B(5Z{! z(pwr^_3m2=(R};%4GC;LJBnH;eEIU_*qCmX0|#Hr(?d+e)zfo)Vj}6)s|OAa=o+QC z`R>KO1Pp|Qg@t|zJ{2DyU;eJ+mYj0v?(S|88QqH-`$0w|FfoxTq#d385ECy%w)AfN z@3o0iJ3G7Q&!6-2^RGV^ozBnCXF;Qsl$3aQcwpg@lapzP>_*<*_Vo0W{zOeh#mU7b zcK!O#zuuQFU1DHJ+Z0ykyatD)WMfW_f|^=?d%NXW-rZ#b5juV@E@d;bna`i2bH+d1 z$$(p9Y;5e|?hbdhASd}PEIF( z%x$5&zM)~yJ40Vj4?ZTlrbge$Xlh_!U~H_a$L`};d|_2p)dOeeDVLe`^#^Wl ze}{9FAM0M>=l9!P)${Xf4iE2sbw!7Wm{=S;Pj@v%%tcjA?fdudu$=Hg8yg#4A3q-5 zkTfzf5>7TTH!m$I`N9KH@+v9m!|2M_uV0tH9}3A$Cem#C!S7)pj~+cTH8u59+x%X8 z332`V^Om`}`JVZcuIH2@bT3TdDjdg)jMjx=g=Nl9t|j!@Q1^fNQd3>MbdWJsVM}=A z9P1P+Dk_?up1!^f@d%+~lT`oscT9FRt8!&~d;4rNg$NySY|nyg9c;0V4tXNnYd$;6 zf5wAl>z=h+WNKbrT3Yf`Gi&rDM#{YY%!oRTmz{InNx5EJTnyh|S^0S5TlIQ4UPyb< zz3S(x?<=BUZ`Cz6KK?=N@9)nSwCNPePUiUcXVZ{L19W!P_2 zJDye!MFq$8*|@p65#f#w4-b3oX5om0Dj=K*`Ptc+h+)kG+926w1v1f421F(-5N0^8UcD+KbKV|;2iJlio>8weGDx84jmd-`XlxhS{cvOH_NgPmP?yG5da>Cw-wsFRbEygcrmQxR5H%-8v)rAhJe zceS+Yo*q7eOL_9-$)iWx^PSHW6ck#0uQ1+xibCGV1l&9t?(4%x;$FY*+ISx-Th}%` zOj>Op78d3gkrl25ajT>AFC*YAKQB*3P3_;-7J__E6;I&kwh{jQIT;Iag-yJ(d>20d z>C=;Uw;}n;oE@;K6_u9{x3wXNko}j`ckkZ){P|PNW#;7U_)ioSzg3?rjl4u!jOXvA zrQMyCQ8;T@)y&$xfb(PX#AsOQy1E0G*3-n46yv*h>|Lj-#B6Z-Zrh*sffOtk$uDy$`9l`RSqX+MZ<)ojlU^ z@Asfl7zF`NwLRY-)g7jpuC6e@S4!`-`T6)he*E}6Dr%U_Jv;!SoW4?c-Ib=J_5AEI zGWX}tpjntA>&o)-oa>FT@TK3su@Jk#^y%5CK)Q~;1g<-25+18#`Cq<#fjo7CUO-4F z&ic&_qQG$1-mT4P$$)@>y)<>WWT){W%ZwaZ;`v}4!W*k4X3cbn>wE{!4%_N)BQ32q zmhdlI?3|pesFBIZh<1xtuU|tU^3}<2WEq>7=&=x*W-$CUkb;Nwe)*z=UK~gfLjv=4 zKI{!YiXHp<^|p$NgM&j^ZUn>!lr7jX+!U&qvu~}FA3*Yion2jB%||y0uu{sYIepDVxAt^>R}3CMs?T-55KR2CAnGkQz&$qPSMM&e!9^M z3wb!(@`72#*_j_{`|+a*zRBDG5e-#URb4*5x?0S`!66!OcGB{i{(0L5xdN`Q?{QBo zQ$pV&_JSV5Mj~^AWutHYg zBa(%?zJE{glWP$xF>lq(8Kx36<6~h7O62C@IXXU`t$)nL$!Q0L)?^hw=qWWhc>?6q z5r?Yi=xE4A(!P7}=6TqYw{G3~Guvw4dgZ8P8bPL}rjWqNNy8n=xLa~^7zdt>U&qEo zL`3om3)faxAC%7TpYh)h5wgA$YaN4Fqp9__4HT3Y(}`1n=DYGOl3oI)m`HxGLTxd=sigN%#}5EC4b zTzyZEs*{oo064h2@4VztGZglleK_~skCc{ns@c!h)^;cG*>_@R+K~3l{agEq@h*~> z**Q6}^x}`;0(*N^bcqcNCSc=v?T4&g1_%=u7Z=MUGXtm!Hg8r|)@gyj2+CK5V4l$3 zl0MB;u0`Voql9~e!upT;$4DTAIU8!^>({V$3jkp^PE^Fb|Ng{5+Pb>lU!sl4zw1sG ze%wn9!E<`N4=}E>rUn<8{PwLvFxxdQK7P2T^(s|VabDhBg*hrzY{+!6h{M(W{?0Qd z|2cG2Y%Jb`ne^`NZX^)u*v)%zy|_qTe*SJT(leF^<%}xI+1YtX`+P7%CPOA*=Id8V zBr`vM3bOt)*I2V0RB)=)6EZ}|@5o(1l7Xx(^Si=j_vhi(GH40Q4o!W1Dg>GKXJ=ut zw6<2@Oc*{)m?^8Q?6fL}yiY+8re-T5DhhWV9~-k_cA+sMGV;Y`vCR(|{-2=QmX-DP z^M8(VH}?%uF4W9-Dp$o&To z_yh%in`OYR7Eb=Wv*RwX1W0P4)cpL{z-4pu*@gy*nEZPJ`GtiGS&4aU57dYbZ$gCb zZ%(gmswD#EnE{BE?0_%9NkHJ41m@&eD=L0$^!fv^@%-?2#@w6*WQRn<+qdx>7yX0|8(iaCT^a|NiRn z{+~ZT>MQ+@Jv}^jA0>_&-2WzFR&;lfVC3(hTBShnnYH4iz z9e_VC8{5Lh_u9L6?_R$CKucR&ep)d@+Sks)0!>GE1g8ue#opGILBd@{US9szt+15* zVU3jQ8?ciBNE_EaOuJ@JvReJn*?D?lZG8v_Ql9MN$NwOF4A)lqTyOjcC%)X^k^%5Y zxM7wAC#3zsWLc2)VR3V_ALJ6geKm^Pw{HVl^(=2{lJXRzM-Zy0>1roxfTZ!Z05p>L zjDow)oW>cRb@H3kp(!I`Vm29Xcz1;27jemZ4ViXQ3!1HK%+0ljWPbQchYH0D4hd;I zE{3f)kRj7rQWC=vPS@dgyyu2}m?Hkz&evDcH^g1S@BHkvqN0MncI0Cu`P4HLY|JcQ z^kG|@Y@+ObuQ0R<-)miZ=3UqIK6Z6MrXS+!gcqPZ-1r6?TtiK5?U>coCPTJ;;jhf; zj!uA=Rm4r9@#VOnc8iN}D=2s_%N!9Eb(xM%;>HbbZtk-F_1V_*By<0I|I;JLw*ZJ` zo*n?;G%+!0=)t_@=-{BDp}~Ph!8yT>S?G!V!+1y}7nhovdWq?#R=zH5d0$^&{b)If zG_!m6c-YuRr2};!M(*Fg54{Au4e(rZv-Gh}pyr1FI0Ha~@891tHJyf*#P>ka6RQ3j z_1u^kO&4GBUYkeG&c&gjinIP7(5NJ4)b`=O-;gZdzNJF~)6-`T{w|2qE8eZ$fb`3B z!!;AYE+nWbYzKsnH4aLR$ zyj6loW?dakR2LmBt(z|3yxSTY#YIK0Ac2pMGfH|E6%_Cs*DwD1MMX*Zbz*{-hv)5^ zH_=Qo=?i+*lFP!_zL5~dzLlN$4yb38>)~3H4YJIg^qvab4@{Y#Vl*p36NxRH9Tbkf z-~`y{XpHO(uR4DdfsN@tONNa}tJVGD^8R<1)-00AI2K|PwoqUWdLwW(U&u3~Q8tQL z#4Nxn$SR2pq5pp`uzf?<0K}=PDoe`5FbsQt$0hU1!YyLbF@m$F+3Nd~ud|=nDsGvp zVC!LKAN~8A`!(WvC=_C7N$mtzR#&q}S2{*Mh{3Xk7Rz6X$kZ31D=sWlo4n`B8ceOq zZFukAqZ0{MZ`(KOoXP4`HB_lu+!VMWED!i^khW)Bl0(nlN zoB`ci_AUzJk7#co7O~~IQ6m*MH$qK~CTDw~#~f#=#?}1z&IsfC*;m>;I-$jcHgDiv zGEdGKrJi7Z`qY*#ZLxb_OONA07`zunZmC%(m6cb&+;o2Uem}A1?)T7QQkxs_8v(ND zGH2uN0=*AxY?W2jv?550`n z1S2^j1wIJ?ih^5L(N|I0Zyr!|%snZ&1%Q})nQTYCiZBycka^9w!8wAb3^ zJ6*LUQ16tjua&mCI2K=R`XKQC?R{sbG0kWau!BhpD8I(|V4vvkPW=TQ8 z*Z>a6l{A;a*#_D=S~|Ld{Cv}9AJG+?kr(@74xbrubI_=BS%qHFfq~2{3`4^*0*Luq z_mvSpRn@uAv@EMQL9T<+Ia(inbdYx_PoSBV*YU?5!2I;B6VFQnNc3P=GyCx@Xbu`J_&d&?&O5FKW+EGAxx zjAZgXo=+0Q+uNJ_h|kO+y6hvzd@5^dnzqC|`t2J50uf|Et)-*GMiyBV3#A}05OTHe zttuflHfsQEU0q!e*t$F(5P-0O0GIzMcY>4t_U+!48sAVw*79iHC;=sd`S0=u(gu5_ zi;Ii;d`52P8OMF0i(%IZpGY77>9i3B#%aKnVUCTAV%AQu$(4JZuJA@@$~%6 z4{3u+{@42iSRLrz_WsPeSXy2MMi*&&E9&$Gz&;f9q$Drs>4BR<5PAj%V1->~nr^d` zk&}@DF?M9ewisTKSWz+}aOqO)rn!b#3gfJzuE zpy?LFuBm-H|5=zUaca0v($V+T+NYivL9Wa^PN9P4E$X*#4+HmE=L%Kd#w!RaIlx-r zJpj0w8yjEdS41zuO<7(afZoiA(7V3A9;jO)TD5+i@BpPKf{(g5=D4MLey!TxzkdMXTnO z^IUoiUm06J_4YbMIz)OzdW?HeS;V3vRH9Mm2Me+9)smor+1lDlzGm-9eXzaM51)X- zmY0)jhwCk932V6MAJ0yYF%V#W{sG7y?ttzb8coQk!pZAvYv27oP+WSqw0I*WWq+Qv z8bEqPI4-;J%kviIxOnxuZt*ecnz82fb#?C7y=DgMWO{kz!et`Lpaw&V2P*JC29cQf z1(4h%$q-ANnHi17HY&4dhc(rjhmO9n zv2lNVHwX(4f@{!h1n2|cVND;EmONZ8(DTcP*jOGGq@;*jU2W;|hTff^N#l%Et~gJZ zXZ2V>J7O-3i~v}A`c}7dC?Mtv^%)CFlBZ>$<4_L z(fmMYOsJ{2#gx)#1C0kG4?%$9o1`RVb}|qiFp;>#L{Bd-Xb2YLZmX;B{QIX6dwOyL zEk1$(d3jw-Y+_;p4}r~g&(N^R|CA1~aBu*m@tgqYd>UHXzom;l5~n@HvylO<4-U64 zzkNG5BYoBwBCEuw?)xjT*x2XTvwMe@V2L1-BQ+L<3S|myRWj7k0nO#hH`b7z1*iM> zCvpC}XOKgel_4kTW;Qgu)r-(Cx@fphPW}zb$;m;!hm8f;^QvF&poY4-jdL5l=zU!+ zEi_e>t#I-=S@!T2{N}aF7KQb}G|7pxwxF_JmCvhRf22v&YUPhHPH2Qhq3(yp{0b|^ z;hGkF_2$i+y1FeFY0}V0At%~u&u-6V{DXsoB9s}aIlA@p!zl|MT-q7b`9lhFa%(Xu zBHR$`S#I1A%Op9kroFp=|FoV92ngKtJE{r|{dhsgz^dk~MM$&q^A8XdvOvK-?QW&W zD^w5>DVz0OURz!^{PvA=Y0-OPoOSlc6Kr{}*NPZ``=Yv7QLMrD+|HCE4W&qigN8J< zy00vJbZf@vzH((My5`B-9SVHKIonVa!Te=;DaP5!NtF+y!(NM!ktHR+?8`xE#S9Vx zq6Yuk@5AjSz$J8abO-`{mzSsK=IZL|`nvj^JC_Ivu`c)==kGNG6BAyb-CSannr!iF zyy#vmpd*EvaJsz|1*uR`QE@-o>6C*_)I<6HeV(KdGc$`RVJ#gjYzaw%plEFEQJrgF zYyy}3`hdeMGOs+d`!X;P6P)T56m1jgg2F)hlLTw4t2J)lPL_JI4HWvYJS6{Km+#x^ z>go_gP;J>j*C{I#5~*Q9=7zEqbUtVf^!GP{By?PRU{6TJS5{ja0ODInyEpu#qljnX zc^U#} zfn{`=Zool$2M05*JJa=SerF*lPj|4NS>u%Vd>P9rqv|g*bR?^U!W0UHUdpW8Dl9Ux z4@#y{7}P3IJV@K82TpUFn^W6|YRl(alw@UPO{}ezb;sJS;Ls+cBR}3w;N;-s1bXzP z=%I_9oxX|5$=1BW{A#xhLlwz8ocTwJ4vr3oEW21?nzRnZ%xoC`#4InABwgoZ9UPX^ zB)xupPVVIKdh`egnEQ0Nj*$Se5Lv8xw@7#)Bw@6&N@QqA$kj(qi5bLOXD26+8jp4- z%#AExml+m;Cj9IYQ)uDkbCLLzIQ@@pbCSoXyHA^++Va?r@QmW#)a*pWi+^@ zppfIgTzZ@Q9!h&v8-V){6oiA$^DDQzZetZw+OW5kvb=iv5)-Mat$q9o5l zR1g#2ilW-B)t8lR8_ms)`Cf}B&(Rx!^Q_aObpkjePHc5A*9vc3afRhEW_=+KI|YG5GnhvM6k9gr96LhK6G6f8=-t^gN)~C*IyDHD0-4bw~Zg&1d5K`+I^< zja61ziBnbMNQ03*()1f{tjx^7C%{g9qsYo2{)inGgNw_arf3EWkyXH&b5uJ^-1uHj zLEwFWKG_P%^azgD0%ZjR40 zxVV7NJg76ZxZ!OAz(xpJb^ys{MA`{VjqBPtKWudn`GHEST!apk23U*XVE~wuOZ~^u z1fyIUuQ)|%MK_n4KRhuH@Hy2uyey+5lP(!18z|ePWIynBcX>Fcrltner^cEZPv9bT zd3HgPD5ANlkn+o}Z4|o{j{R_Ap-pbZKwz)nww!KtUIOI=cu7)HQV20(0s^1Cb=oAi zW>BM{NdX%G(A%-GgOI2i`#*!cfBpJ+clR$qXp&x=iiDLF6`Xg{i-1P~`D1ZW*Tf_` zQCV3zhm;=@m|3$=*Wi?Be2VV7W4BU`bSc`Z;LvPre~Bpf!=PHu&_Uq zFQs=c(b5Vz)BP~IM0x{sryQjh6=h`rmf)0tG6zwQQaT-kJ?KTnv1gi|Ed2b*%EpF; z2#Jd785j(H{=8mnrKA)Nd|FA#CJ1rBIlJh`IL#bvohZ1ey0sQeI(<*7eJvI@f0F}c zj`@eY0hTfrZVUM~9j6eNZ!Yi*K*&Lv#K6GV|1*0*i2&&LsT=^F18CKvs_(!ubT9l}H>xvEF?RNF zK6cVDbvH@>C6nfKwbs1aC#26to15aU+Mya}LZdw&wFCvhtubABbSQklVte#WB3 zKq(6}ub`v@(LTqWan-szo=rJIF*`UIGs6^>lv^U8r=XBtSQ-`UrKw@6Z+=Nc1p5Pp zO(+>PwLP#X|6IiEKpVm*=alk4d2{(fE|vonWW6H`(u3*64-N#$9CiSRXvhc2IaLpo zy&*pxL%y1l5&?i@y}c2AHs2;E6_u4iG%M;Uxk?iaBpvO|22Rz(L$pv7+y*fisWmlwQPk&5pXub{VC#%+-gj~`FfhouVgUMPefYg9eqKS9(0wIuh$hsV9GKD(=s-yqWXPu3Tm9zJZh(ACv@^3VdR zo};4GX|+?+8WQwW0hp5J${XDL{7c(rDG&m%UulVO5oTc0;GGUn09ggeBFMqhC zbQ%Y6*t_g(GJ1L`>uw^@9mdD?tDcVLYEV&8K}PvHIx6Y*6Z;;Z?+a*XXIJC7@$JdK zU#1Q2`L+J7Yoe;3dgHpR>ZPJ)Q1{B_?ud)Ot9tdDN^wY%ko0zOc=N<^v+uqT&F38D z*hxajZ~VZaO_&F`jmiVj4Hhg=ia`gduBsv+BpiMOTq6{d?4Cx?4PhZ6u%sl1hvOCk z7ou%$9ss)@IC_W~u=hAX!Mnj2YhHc-b#d`Vs`z7AUl-GW2`7r2;J*IBgUN?jX(?SN6eAS zzPaG0AihBoan~R-B@4KyiXP_8KJUTz1ulnJ0OHbKoAl43D=Hp=FVN>H+$P7-To%-$ zl@SiukQe?J#)b^X?ZrN70TVD^_=CF!SQ{o-1hl?cOH=3AtA6s87m$aDZI`sw)c)Vg zhVKU61k^of_Oh-?KwX1!;^O2)Zb6NuI2&G8RINTPR}+h2%fx5Wpkv(h}zMhckM@00G-FYl4=K%!|x)24_h zJuw7{>dNLli8t_dF3mamRMJ4G z-!hgx$3%oQG-Pi_?#A0E3K;LL{Wv9 zfom*^)#ag#>N*pAU~PPPXpCaPw=}x4vhp8O0OI0O-uX=Ke0KJhYby!*cCio*Q806M z?rRG{iZsoDtvP6m8N;?q7uRQIW*j~bvZ!8rUvD0yG<6ruE<)Gql3ZOfdTzGg$ANyT z4V^CaM3|jD6l|^c?^hhV0z>}T8U=p9KAUamCjf3Ju*L(A6vHG#f-ooaDYB9d$gQrd z9KzL(y^s_T_%b?5j?B%^mqUjP0c2~t1pWKbk&no$vnt2Y?SKDPUL?9Q7f{Fl}3^NFvaUM&bD8c@e?+6S5fLch45bHJ0-@}!je`|VD z2@O>uzcKi8IyySOq)Yezo4VzH;$UIb;ao8Er{bx2L_}aXy5kz)WPU&fk&($)t;5Sa zNQI1CDpw2EkWyMFP6>7QUN7&vdsg97u8qQRa)IWx!NBzqgptwFeM+HJoPyjlRcY@i z@(l!#htmyVRGM!^@EPbZ5qf%hu((0c08az3+VJY7yT=n>zj~}sUL9Z7F)-K%trQ#w z0A+wg0RsNFQMocDWfud3l)-PCzgFzmsj6xSisX7xIb~(8->Mut2MI6{0vW2B#4Qh} zgP83X$8=oWe#~qH{>q_1djJs`;^H*Fc5(EZS=rcpWUL?P=*T|4pYi6+WJefbV{PvH z_tm!jR5$f75s~=5g5bxuz0*>BP3}qj`oe&w=gYg!!bafdclz=rnWfWJ<|>ie=n?v^ zJB0qZ{%5r(IPWjnD7OEJ(9+lU1Ut|(5{7K;e9XHl?;PG~e?2g=IuRowA<5s^pbR)+ z$-`w~doedR2c`xvWLfgEdVjn3U1aQlK;0$Z?zU6zlGraoRgT_XIpm9Q-m@s6mkSFE zi;DOPO|-Rz`S_yG_rg@JrIn2Er{5R^>8$NmRLL!+&C@N6Xj-;BI~KNQKw(2@KrZ+7 z_6BaU+@32t)?ARz;nD&9pTC{zSQs4!9MF3IiSzP@{rEC)|@5acwZ- zSvqo{xfP$saGLj{fyZnJZ>Y_fp1B%%jh7yKL=1R`jGKNxTS-aZ71ktTBEDa=&uGOS zrZxn%k4B(cX9Ms|KKu%l)k=g50Q2X?ZFY}uAgVer4M(LicyABfu8YJRF<0cJd95<6 ztDnot$+>0n)k(~`ftw9$^9SjJN_1~r_;9<>$S*Hit1q9$Uv|Cx+w~XoF23+1v`s`c zkcB{)AAxPKfoq*XzBjIq>+=B4%sMQ;*Te7nPmZe01S6YR;{HIHz2IYWh(K8>V|BYE z-YZfOniNWsZhpxb?kW+^<2A59^&>&txR7Ej6ai;m^tfDH&w3U#Cg-?rec;Yi$>L)S z)PY?n?Rwy$TrO5DP1&`-9F`v{kk}!y1O-zj7^C z=7pcC{RmDrjZG*sqEKfy@D`xR`gG&O)YOytjxg{7?(gmCYiZr^Sfx0BL70%snb~2z z)!8yt=9aUO$Upa^KFEPyI2zg+HQ4*mdO@FoAfPc!*1BW>a&B!6kZnUVV#PP8Y-?|0 zI^K7ivr@<4tQOW|E|yb5ozQ{N6)Z`oWo2amhE_n0yCC#h&%ip!t6x;-^(S3cmx2!1 z2OD7ZEWYw=9b5%|D{qgbGahp4>hdx)C^VwJ0F7?~O$8VYOmwGOXXdQhkp$YOnkJ)c z0Nt$Dd!%@tvd4`xvtj!aTY}vYI*OE(%ZRMJe0Fm)1OIH5qYl_}<66Y!oOo&KZc*FX z3b`=WxjSZldq$)Tr5ns1>~L^!U?9sIxuvBtU>=1w?a{0zc=o|q$b<FN`Ms~> z({`*?=L~~H1T-Cvb_-e`){Ej02}Vi@hUFP;o-wyxj1w$s3<6G z0GWYm?ljID zv}oUmgA|jH!Ty7zvi-Dv#c-%?V_ z7B_BD1M3zT!&RvjCY;sIUEuj8kc$>;UO&zO(s@5 z*hXc1_dWxS($j+%+w+*#_6#T~;5uMCfm8!b^~TLCpW{7eYHDf`&4HucHIU(XczK7P zgTLUTg%BhxwM0HkJ#cHmF9G9uXfCmKHaarS%Fo*?s~a>POfJ|NY=D-5ix=NNa3RUctm%@@rsm&0^iOnQ=9|Fv;)`@wJ-e;X0B42<zljbz9`T63N8Rz2cWRaBEhWh%6 zD(tMN4#u02D(nU28lhmu1mG91!j3IB$(t>34b1o#3NFwnbt`Y%EkIT(J0iGrskZFk ze0dV6*^!D7cCvi)-y?Vc*>^B~yj2ed(`EJxSrhtTFk^j_gWUuyx`1_$AK#&{s8@PU z@}J%qgY$rvHu;a41S7E}kZ)>gQ2-KBQ%&F#W6#Ba_%Kc>blv^{9huKgUQ*HoV4ND4 z*$bzJ8_LGs-WTqOxA&`8uX_9YA()8Lo*C6XGzEnRpeF>3pjlII%WGgldxnSIfYk(3 zVpAGhypqn)$j@SdB=AQIm^UA}D}L-d@Sa-|&GeHC7r@5EkV88=Z$J|>Zbl{v&Z|%T z0Rg<}7tLxIWC+-qG0ee$Le~Aopjn0e1se@|GZ^K77aeZ>M^me)M1b^QVnUB(=H#%6 ziyJ|U3xbHWCqE}AWcs!i6BwJ&O1nbwyx=8|*wN!iFiSUAo^HJP-eb@7$KV!c!WF=( z>9>?AptnqbiY%&tLeO(}I6-u6w<>@1=rrAQ&h5q4>eoU@#=u};Aa9bBS9Y^0qPnW&0xF(Y64_= z!@W0}A4;K4EPZ<2l*XXS8XU~~C`Ky8Ir-zFzpmK%cOXzw|^ihvc18aE^!)XFz+RI;>g zK0VNaCcG2BCgIy_3Y;cA$Bl|=jX!T&MEn5+#989UvdKdO1Dk&G`*$n^+_a7&_bzEf zJ^p$CP!c>1z@lOx5Ov|<;b4{o-=!`7kV6$D$yxtnVubn16>;Cab@(n|Hl%%a96;D# z=3RyHv5SF~!+-Yfb{FLH=H@2UaHgA2=Qgl05^h@wQ)0gj$yWx5pNNOY)atomqfNH8 zL%+PqtPl@h`=8Uiwss#3%s#JZJ59s;J=Vr?u(8$OiriLJU4<+N8Ca=*`o|9v28qSh zRS94tAmdz2pMYcu6v({_8~nF{wx>tCcqH^duoma%*ZUn`fBTpp+MBPBtgL=QhCV%g z(nosdAr~+2m4900mtX>;+3xi1R@IjEwHW*w+up4ZWrd63o0e>08X~|lz-Hm#Fz$Ei z8yHkdnysy@Kx!{1gjtEJG(?HfB_$7id?b)e@L%cy+nAM~Zv+-AYik`)oM98j$F~nq zEdX6=UgwG-Jw81AcV|ZtZz53TDF@h+1qUsJyd?!U@u%t&vOhdqpB+pUey@yy8*&wO ze}|fM?0LHd^M9&u9(bV3PN$MP-~Kbu(RmE)pU|ANX?#k`1v&z|=4TsW_$dVr@~Wp7 zqiRo?NuH^xr~sCk1@eqbVez-e%_XyY_3o z>N|70sXj{Jju`0NSRE)-{=h`(O+wo%6k=|lJTjsU)fN1g5NI>^fJ0q>JPSLNenD-A zO%3$l?7~7qME1kz6keJGY&FmdpRSHw5g5e;x3LY-bUn~e0#B`!q4g#=cNpkVxhLZn z^BAWGY-FVE-dllFqlBU_l-Arn^P51^P4{B&{Lj^F#eKrCE-Rxi38xp+mB2Sb_L)=8 z2!jG>QWuwlHvJ`AUQ@Hl$V3V*U#P|KZ?ov-Zsiik0;1Q0MNQHbZoA!?8*+WG`x17z z@SEIvU4zXPz?2`{Wp(&uXYTI-q@eL0XjWtPRe}BkVMigPrR641;L#lX<=`x9D>G^Y zl!cxJC=%%z8B995H?{M1!OO(Lf*~Op^pY$| zU?q5d!klA&9pmw@z=zZcN;$*@oIhBC@4?o^mQ!@zFF*ueH8l8uvsLyj*%cL2Ov3W+ z80bXvMsrwalw}oAE0_Ie)1b84eMx-+Q+(;hu5NCJpq7JXcQHh81q7*|A0rV&B2DwX zHUR( z9);9IcUgg#%82P0r@7upUCuI&nkwe|lmtL9x zdl00QW7_f*vfRLh>3elm{zBr)&dxRzhDe+Q_YjPj1#|vVVu@FQS+^fePp&nxM*$*~ z^4`jf^#{~i2L7tOmjIk~gSZ+!4;>uc@>?@67z%a|k6*2N@@VYoUB3I^(beUtuB_C# z@aVP?dH~No^Kj8T;8ahmnF#%#iHF4J!mk^LIZ!-+HRhsg_DVSvFR6nFHwU(KpvZi3 zObm%cn!tY^UM>V!nh=>CYNG8w8V6DUp~e@&eZYSOUA_GR)+g|0(Gn@a{AIk;xRi?O zb3Oq^bw4m`|2y~#gUcZ|{V*S-2Nn7Cu!eyXrsZSAH@YlDQ1`!)L7iB0m>A?HHW?R^ z3+$W+iL=2akIR#c(w34|q#Jo6?s2tY=gvy2(P6i4*G^-HI%k4>R>Ze(AK_%a;LEGG zw(tX)Rg{(SE?r*55fYVnr=z~3Wc;|&>b#UQ1Nh|8fRn4UJ@(x-&W{wNi?7-sP{kCz zc8R%A1K81u=X(h|gl^F{7Npod3$3q9l~|F;Dlum-IS5Fgzkj0${adjBum}``(o(aa zo>;tAFO$_YRndHD{I zRO&zPum+1<7yD_0CnelDC>c-^Q~D+E3(ay2vjQpfrWzW=k&5zc*P%QAuSqN_S_kVB zBO{|GI~g=xLd)6Ocp}n%vlc>c0x5aR0?zOg`GUybp{XD_K&K1LW1bU!m^=pJ4cN=q z7Y0-APJa8VVyv7JJrd}WY6@0Eo2bR0UaVQ_uxKgl1-_7n*-%;7{k_J)TKT`{0-#Y2 zku^2fUnqgVK&5gVGRW_DD&Eo}uWvQZH@A$k21n#3dzVhdvG~EYedL$%e-fAPAr`aX|IZq_(v90~rVDG_05* zHZJcS#`DtdAP^_q4R>~9C)Ola@vdjL>i%ic)!Z4atBZ0QGvb1b}&R6+pNfpK=-@Ri8r~?KM+RK*-4aCyn z62EPSEUx5SDXed^Yfp~8_DqU|STi<`B`C1=56n7(2iB;}nE*rL)WiO_%`mF+VkV=> zW37XbnoP_k5sc85g;=C4U~7c~e0Z(8lm^MSlZo$nv5+gQ3r_uUoyrO&Ux{#!YgYsc z5IF9D)7^<75A=qny+Vjs0=^<=;cg6rWR;2O#M!?~b8OR;HZ-mvQtz%!*xL{lN+U+K zm8zAhc*T-fx3KPT3}U$r`B7}kU|XQ_byorZgS?i=XY?{IZpa$h%(`XlQ60=}D-Of6 z1|_EbV?#GuZ3(>(wI^3)L&KjxSGBQu2juhX*I$Qolz|oVc6bM!5&&qhBLXSK9R6{d=t-H}^8A6Ap}8h%5|LK|2j!S^+)!h_=}}?fa1If}&3f zx6Qflr2usf4F1JX)wgOV8{y<*B`B-p0PSdK z-lU~XTXzpZQ(9tF+1=ky7~2B_HWk+$4~~vta0Uk#_hRq>fR@Aj-o|&ZZNrG_ZT1mx z)`HY}?5jOSQt);=b93r+BWYHs{!Q9lNxVv(2o<(A6D=ZKwwpKoK_~|Ni6CBHUYlz` zWTNrm3-7apZx9e4fC(UpSWo z&RZZg?eo&Ilfk1o96Q5_A*nKnJv51>oq!=Xup!1WNW#1UOcXz^Dr;)`0nZZwpFNBr z{M*|DD6GusG!3$S-c0_pcTc&N4d~BS+ zm?1)Fcx2>Ti{CLYeix4!xDfXO=Dqqpe-;7P&d3NR0=$c)ghcMSWHb{P2KP79fLuHp z9vC2|1mn4vo12`1Jw!`ke!kzq76#I$n(@&_7;Ffjh`=|C5NN3B6}DC%*zCtl*U|kL zsZ_(OH;-^&?Zt0{`~y6SvZ5j^DQx&sy@o2FZ z9NXYSnJguDbb6rs3M@CT@ zWZ|%s=fK4j6r3B!>FDTK4?N9=n*tqQVl;SOc($gWgF>OLrS(SI*VD!HTJmQcLaH*N z-!SzF5EP0?LWk}v{Rb{Czm)AadiDuy zQJ5>dYnlY*1~4Rvf;Y^S!xKtGN=Jc?hl*gJt1EJUEDttn_s5U_5tmeahOPjnIn)vj zVKj#az}eZ~9;Q=iHmk>#!4B(b%ddyD$f%4L7H!f~iMG5gov>)7K%QfRgOwGiKX_IR zP!}LPN!=gg7AS<0Qh8#6AV3i>%i}h}19{R+EUCfT^bpL7#TSz@XGd$LuuY@(Tk2xk zFXsO_S~kL9v<~JNwMVp3lvl^DzUn64EByVONk8>??MJRciroy<-}CdlS#?hGkakxS z^1HIw*T$~V5Z!ImT9)DhpUmP@D)sOqSOs_h3qUP?vnIplbL&^2n!)74&SYC#X2J8( zlqgeK82*C+Kkzyj8#mV1CpZ5Dz%%7^HTg4;@~~Vx!@D2@fbKtZF+UGP7!t@D96kD# zl40L~Ghxa!Sy#D-vL{x?)06SviMWsm1!-|8VS^?gxU4VwZExS#B$qB-7$%^P0Lw+G zNxiV`r&nj3o}j|PEVwKhTkpaX1dnMjm4#Gq1{!`7ecH{7zrx~x4AS!CAMWd{(G|#N zMaXlwO_yMb|LjD3&2F6(o@L@PBXy4t z1XxpAl~10TeGS4rCbs0=7F5*Yz?SnKRYk&G;VCQNCZvHu$U%OX)g1TDh7=kmZ#kXE z4XdU4U<%_dt;i^j@~u5Ppk`qt^W)XJMP@NEnE21^0a^##CEZr#XK&xO_2!wUdt(uV z$*-IV-*Ef+Q71|87#q*r%RO~xnRK*UiK2>3Anya^8XhHSgE==iv*=@zJ}N+H0YQdO zM6@XGJr7ebq}X7?-P+y;%ZZMqWft_w2n=y9Lk{@Q!3}N=cuvc}@Nju$d0^tM+ zgrN+03AM!2-F&}mNy^eV8a_o^J?AyL`c{Q@lshP*HkxG>-; z;7J{j(jddbV|pMg;M#`xso(~}h)x>Zap=NlVQP_)F{Z@}VoVzzs{mbs!!h(F3xHwj zCO#yO6!A#srJ%&M67EWFdOZEwsh8{|%+ZB=T}DXJhBR{e5zMkflm8aRqLDc$Ul*h8 zI5iKZf=S51F95g_M#64_X!LK9dG-~I5^PoXmUffe43no z)B0Q09YSix=|%%7c13s0pR$Sx@c5`ZcLsm_Fag!beVPF&1M_fVMpSvZ8w9?cT`ss6 z!NRjv><%VVC`%v>m4n-Q+6V*~8!vv#jQaU-PSu2hXdz-2gt?b<`O9y~Ml!Footsxo zG?+W&*@@=Cnqp#V3IiK3rKOp1lYyH0St3yM@SF*l>F)vC{X~f=C=w7&ke9!eSz z=W%@2L2z+%i;0Q?S$*4k^;G7OLx&Os*)1P>1BKr$D)RkBz!7abzUzEDhlb#kC2wXM z{ZTgdlj_op?giF-)?T-s+g=t{ho7-lN-+vVFjesGztZ);9)DdyTL-26-Xm}OjALs` zA>`Pc;#po2u&CPc>@>sHAG^k1J8qM_bu(e?RnTUtGtnlw+Ja-zHz;A#b2YiuP{j5q zbB?1JAftzh4-NOH$R(bAEKVDK^VJR*hnp5z1b^Q^jtjA$Ke8eyE66I&$W=JM{Z92~ ziAYgVWahJ|5|M8O%z=zfCk`Gr`A|6K{$^y{%D1?(@}zsA)wBf=JqdFf8Ewr;DF`$dwxdVL6Zr4x0UyOE;Xcz8KFPcUcQP?J+XFdzAKYToyCco z&Gq8)Wn)2E`H+L59d|Nzd3^jU3t=UXjZ(Mnh4w4 z=W92;vNZQ~gd*GYrhr+Vl;*_qKU9|y>k_W#klpv8`a2Vo=CAMjXz0iegbPwf#qdwk zKI<)fQ`olsvmtK#&)S0bv9K_|6R$-A7A~9cb}~wsT3fiR=*8bxU_kd&(sFhC;$P+V zv9ZN5Z|QgM>>K`3a#gRqN?&#mEfYiw+Ek+(s!SgDTZ)Qt@GzTUcx15P42oky;$hAuZA4CX&j35 zUK26hX#(p1^pA8udvap1$26+Og;~j!!nO3*=+~2Zp&kq#e3C&vkCysoXOa(j3I-Hh z`Jzp{whgyO-i4o9ZK(SF`}w~WI`8G_q$)24F1gt|scaV(PMXkeMr!$se>hpxM#aUe z+Y{x=EUPGZ*7N$X_OAMiY-m2X=0ZQR<%ZoBtKL&pKt^^axF zIWPZNo;vk?rzU@VtO>)f=8L~Be)vwW$gY?!o}TA_YmBiflO^nAl}fA>38(fUgMfhX z&cQF%5Il5*E*;dhv2jJh!I=&zPL7a2-O`hD6!rBbzCwFMax5Rl7Udp%mlb$p?0#g+ z)T~C=KcC5~@$FJve}7HBzy1DH=9Moeao2Q@$wkS5-#OcxaY0yidGhCH6I%w10@#&bpn+_DK^lMpp9Lz^36x*Y{a(@h5G1jl2C=P}R5oF*le+_w%9RhVlp64@1puBtszBEU9aW@RXpB>#%mjTB82jE@jMH9a*a@UzEPd|Cap>VN-(jlq#W zdnG+in%?4$IZ$fRr>L0N*SAAMH)Pv>!<1UXW2# zk-pe*pZDkIo=gq*&4(Kq9t@su3U^H(9bnaYH#BrBIr$85vz1%R2Y5Pw`WrtQ=H24n zb-7~(kzJ|>4v0TLij%^J2mMj-K83Gzv_`e&d$cRG8uJvLR`6Q_=mza>o1%%Fp&qUUHlTi(*# zoI-(P59kmMJGXP^h(VM|2D*8fsuvP_&;I%IhntfVxOcjNhnLrGMUOjIu3Sk@K4EWf z4-Tlis1|tmkNQ8~HShAM$ZMTihi1Aq`--)R5U;y%k^x@VCz8rrryHpyS`0XR^w|9} zmury;B$k;Ta-B}!>#Hxs|DY9au6p|v(lW@U7k>s1c1Pq+1nSKooR=~#+X z(D5deUMKh2)&Nxg@1ZEgM&aSjf|t(fV5?!U!s%YMWff|RzQ{jv@v78fPi6WVgP@z1+CI0&3a z$=$C)9s#M+S!d_@g#~Gg5_@0~`Zu;ZDxPccTR`lBPeH}N#mdQ9jra#(?l8|n`tn~m z9*O$3*QqGf6%uRlf&T30Chyvh(McjpD&wfMZRxlZESLJDs=vfFd^u{&%eLh zX6Ab57QBito&5RihHGZn?SI!P+P93iBE2GwxHh8)m0x>P6N$Kt4Ao0(9t4nK%j@gg zKl?S)_F0QapNH}bd?%KQ%6$zmOtG=C=mQZB)!o{G5L>ee{GUjb3JN-+@`t{b zfTpfkM-gu_Ont(|h?BPAgMay0PR?KLW1uHwaIWltXJy?w*B zhk0^2qJNi?;?{#(&E8(@m6f!uj$!TvC51=%Q%y;pCM0B6u)VP1Pfkwn5!Mz+&>qY; zg*HJWfznJOUhllD+~$X_dA>7G@>5&qM9fdh`3FQAjl3DknV%<#NW6VJ_sSKaLH_;n z%1mP&-bV#c*?*aL<>n%d*pYnr?Fi+@gJ2OBd5`8q6qB(ie<9o?YkZU$rUH{M zg-*~+I|G2egI6d?8qs1P8AZkBd8Ry=R|xg zC6?D6Wv2(X3ZBsPw8!HiW zWA_Wyi?G>~+I)C^_`pBJAbx25yuF{nLLxv)TJv`D@cY-VduA#WlzwL1)spm@U49ne z-#Eq{q}C|I7$42axv_8Gbd3su@p+}8t{{QYV9$x39-hT-xDYmt%V&av2Ll3{D;1}$ zw4azoIS`f#p3IZ0@cs@Fyx%hOvQcKEJ!R+pdR5s$>-{|M0Ctj7QL&6cb)&W$L8_dc z3R|b^f(AF-%uP)l&z;j3Op5j2aaD)9iY{>mE%Ed4w<6H~9Hub6bfkCX1u-mZ0{SFy zs6QlhL=re%xH(+7f4AL7%+kY35ey844nI($xsLw+CEm8QpT&$yI5vkD6KCW($jFvaMS=+NnmMQmpl{+#ZLzo&md zuu1c@sjw+cspsf~>BOl_0}ock+y73t_s<;3H#LeSA;g?%r97je^Uj)@u!o;hjy|LL zZi&csUBTne#R-HxF7EEbBX0x$_8d>kFE~0(NjO}-=ckECf^n|Pzx``QqQmn>Dz<6H zzaElC2(;WJ&ujnG-X5bT$g=Mmd%DrtQcHsUWADzPvm{#5EvH$T+ujYndr`E;AFY#igJ+01^p9@L|Mt%($i)5*p|HtgWn^ ztdcAwVZ{#=p8K^%u@rhZX2o%WG-QmXRGvWJ0$r4o_zc*`pb#?&^O2Pkva}Us1cWrz z34|27{gRssZ1N33qdXg4`wXtnOSfnaUoFZ#?#(nP_eCZ3Ip_Oa%0w;&AG2Ehg^Yz0 zWG4z13b;2CK8Q#ar;9RQyBpnGr?2M5oqBld(XomJo1%XWA6 z$Zy#=Cmzdw=t#fTPJ)NBqFlzSp|h!~x9RSZ8*wE&cajn)qa7Tb@XJNY7^CXZV@KGe zf#IM0{rKh+ncMQ^Ecr5oto<)3jR`Dv`xG{F2g??L_IwL3vzuB5Zg;9k?RbNLypj^K zgHjfe1iiQCaPFXshhlAZcH}!x7Z({NB`N||STsu<>;mW0OC*<_!Jz1e@lGLfg@cmv zZl!XJkqCeTmz0ypzHySX%rzq=?Auoe@crn3;m7ADU;L5ZOJhY6fr!G8Mc5f&f>|L& zmI{E=he9Ha9-n_!Xqxq(9@>3r?IPLxOTu3N(3FdnF0kRtpa79B=Ek_d42JFfoh63s-^U8b(!KZGh0e1I)N z*TS;j9f_?xY;1>&9wSRZj_}N;dIf2C;t~?qZrlhT&4(-mL9kA?xyp&6qM}e}H7s~< zDm*SO_I7dc@%J~Y65JNh)SQ5;*rFw8dXK2+pUur%3a%FwZ*&wOJvQJkGa|rVf81ir ze97fNeMoQ+g&%GfYICKD5FLw$#QcC7f7gYP!l)i1()Ou`Q{{d=ZUo}Lnd5*|;wtoa zb`mkuPZ{2^)jq^Xs`ID@c{(&VW|NWC8Q?RI#o?k&!+((#SyX_izSdks(lfxs-yvH_ z@}}NPO#pkqrR+n@A|%Oz77drn($Z2xLj&J8IY8bP{%Cmjk#mh26dEM~=8cdofQpcE zK}9!GZ0GH?YAX63#&6w@out`@l=K`+ulh_AWTJ@CZ(5J(7&f0Cf*+V%`xn1XEaL29 zcQeTS_itYY|LqpK-WBV0)_~C`^oOQG@PiQ1xLrma5Hr&Bpf)_paleY2-T%S zON=IyXx_maD$2_v9R`-EQ|yfKZK!%?e{KlrU6+A3G13q?7*dNu zG$#7{i^qdJfiB{CE*l2}p1!|YDhFYLLNnW;k3hy&aF2e4u^wv=SN^GGgFnn>j@62h z&}WriJgSG<3-86_?eOr4rXww?dC#9?izEI?!`=?@^2nFN;{(aSX+`e?2%18ETln_Y z_r+k(*Re82ZVt$gf5km z@3?xx(((zv$?4O^BFR^`yCEbu&q}?2-xfUL*Q+x(G$BfPjx#x} zd(kZwx+bUS$+@{hkA_i9vN_>#ApWTntaM(y{DI(=Jt%SH)_|5oxd4dv>&(nBROpAe+(@C&K3hHt1r@hiP)S2WgWuz4U?TbW5P&*) z;QS}}Z*W}$Dh#1BrKF_f3t4J{mdrwO1hV85XE$DxX)PQV?~4o<-0#c48!z7L;l2REPqOkMdt__s)*x zr6nI|`6)=^bRDtDqQ>SS=JZ1g5@*n0YZw+*@1d%!9E2T=mK5o3P-hjqF=<2vfh~!b z8p*Rh^F#T{iDx(z5!wl#>SIF%o{nW`$o!z7eKk);Nly$L{aOHN3rYlJ1$A>b<6}mr6#+W{NJu#7Kv9?(+=g=I5hiOJxD#-xa=M-)qNYcK& zE#_nL^M()v4prRa*yx|FYaq(diuiFfLrlQpR&X8Cy@cKBHDn~yyNC&z9m}v?DQ1ih z4dqBI`bed9JITQ&z&Zpq6V_}YDFwtW*twy=s}uN8e(soo0rjAfB?t#}A5VQwB9iBS z7WKp#oHY>cqoSsjQ}@3v0|)nPXHqNaUxW+c$b}K4lMbrY=WyV)#xfD?Jv`K$I&Y%! zEE+NV_%E`$`oPpDLlT~jZSagR-mTkWdIKz`6@4VeEp02wg$&xxx|>hR#Gv z_dYIb@-Yq9b(g@vwLftF^a)sE)A~`kgOQEI@*qj`?~)E%3S~y`*?-)}yPKOyTS_X!XRdXg zIDQ;^bpmu}MI-u@nf*87;_x85o`P$R1K$Ge6-i?R3E3T^PuS+n9$E(lL4&J4<#&uE z$-p1GG}`32w&|i15YvgNmI*v%9&{i7-p#_x%ge!GusQ-#0Gmbkg<0lR6CI1wr{S78 z>VYS&eDvGOiXR0D9UWbIzaO;36p>O$dLZh3bg%1CKz~v{_o{Md<>ZVB({gw=)OV)!b`f*^$28t)B`pi& z5hC8YOjnrXJx(ngeh-gjexI2UqPs3MlUjT-%@5mKG~L+xTEfh4a2ALf{`~!Wkxbac z8?idI);|yV`S;4prF(!>v~f}QFS~9gk;=FJ(DVuIqBI2wZS;^AS>ax>y?Zl|mjsGG zg(?7C1=M2)#o+f;gwROp-v@yp$hHRggWv@M${j_+GJEceJx7egooCO?EKLYYfDigJ zl#0hWh^3L>5CopMib_~aP^&)C+dEfvL?Ts!nh;S#d$i5}(^)(l&+?C{DWtM>;>?G- zo#-u|(}D6zAZ5z08n-|ddQ}7+)S9JZr|!QaOGdzR1uHD%3P||j430dtt%nN+p3&IoW+6&osQTRw8lUoC!#6$$| zew!w;fQl(1)A95u;PV`0AJ!C6F6(4P07J@u-#~_{c7ODU4g>C#53C-8 zQZFv87sbWVlwL+=E|fw9E#QE%^h6;Z0l6U96w)94C_>Cl;P0g=6or;AFII%8q;;F` zmL`T2zIo$ZK5AQ-dL5tO+BI6iN*#B1oOQxO05qK$8j;uVQgWn2^)nI{c;#Jg{vCoJ ziG8lIME9mNF0u(5Hsr_8p7nHh3l%*`NzqM-vyc=y>3`E84~%F9>)o%}gDzJn8BFUf z>04r}>$6sAA!mHT|FDTTQQ_Mt#KwCkM#Z)ryBmG~;v+u|i6-z13m;Vtm=7X;0)K(aE9RpmbMmOHEC&Y?EKhp zk+@h;Tl)w3c1i>n5T zA{1eQB1UN|h~r|8llPl7und6xpvm_y`bVA}S8vkL(psTf#w)?FgP;;~pnz|zqGMu+ z&?PiBQ0EadVq}*&I((tR87*$Y^GwOW_1t?x1Kc>`R4!B)k|Q+<>WY=rSQlSrI$M-Q z<%rk?BzZL^2J%~ECj=yMf!IIe;_?{rFUylSNPT#u_wL=VsEAPBIb27~Fo8FTdI|>z zlV*l;BGCc}*i=%oXLPiBJiRdmqP-`r9`5WY>Y)<|(P)5w0CJGBL~q3moX$s|yTs6Q zI=Z`OBq#5O2pFMarcZ1&9=vjrBO@i1+>UOU@=@j?00;Xr(V!XMCWmg@%d4oUNKsDi zJw$xlTk8!)C%YOOajYVJ{ASlIAk>hby-Kz|^-e~#SzyU_ z?X$|8Y{p=ZUyFLm*q*&x0Ir9_^|O&eLPm)P|4@^)yteb|fQ(UWU)JOwYdz!(CnhEW ziz$tt3Bn&BAgTTM0I(L?HIyvolX{$yUmn5-`J8*{whyV)kH}*%IPPJd^BEujwnZEF zsJOV_Nv_u9?K;!ySX2aR+R)AUM}*16#a=WS9)S)H0t7r+*e4Qh9`KnYWc0%4QhN0& z71Qm1<^38hGLmX)A8;bRex1_h_z%3$%4mCA+s5W57Y7GKbJ$sS<0|~BiqUf6Lj8kg z8u~lIuUt$+Q_upGBiXCX7$T-ItQ6EtmXfytBcZc`$^+I>I9wohba!!4_IM|=F`%uT z?epfTIb>=$xY5=^bOmM1@&3ht6E&Sjm2s6hz6yIH1ZsQ$C7%70V4DKL(i#pjA!8%*KueD&ZNLR8G8l z^(qc8k& zr=KOO-RjPtp$c&eoZIMYP+uo$uXg<>!Ak3fOBjvf2)s1Hs$k~6;kIF6Nl?2)Yx!S5 z=!OWL?5EjTastS!6kg17!(CvdCWnQISPUk2A<(rXmK;|KeS!d2pQ z1xZJRRLJC_VlV8J&G#Iy31}SF7K-rj>01Z8gsNTAwLx$Z;X`#GDy) zP&pY?gPaD+i3QeFQ8AYtIO25O-r5<7Hur`??0rO+G*A+~HdLM5Ohs?!a zsMp1>G`*|6P<-)CkmhlB3;S00CG-ynZ0d3hASJ}<`dzp%QQ~lgtKuup?7!R*CJM82 zbG?W!1_D~ogKLSglEnBvIR(ZavM^QROiaBXWsq+Qy5HyTZ(jwsHYYheKxXInZ3ON^ zI=q4cWX$&# zV_U=)WDespvi>z7RD?tx=Q9>Ch9+HWn?_ZKQcqDqA@t8;6=?F~kzBFscOdNp{s(Ub zfbK-j{p}d$g8?l2_y2^C0N`Zx#a~ZrSh+E$14lOi_Uy~bGsivm98<)y z3x8Z%x{PMeuKa95jlWKv64)`aMu5UkZl1<`00`aLQ_XfRAF?nv7tXwsn)+){pO1u) zpjR8PaJ$BTfp%b*!+K+P_uhT`7E!42Dz$=yhsPf-9a!*yeq!K3T6X~C#Hg@CGM`?@ zJ;$+$Of5N%>nP6u04U7x1ULY@4$>hqdISCZXsM}hR(JLH_2H~pTUjynxn~D|FN~CE zR9eKt-i8!xI?{_|E7yan50)7*g@R4FGz=1Svmr;P=4NF(*<{R+dx6-vw`rjl9)y z86*I*;5S0*;W5Su0k3RFl2oj8GZ0fEccX){={-g);LE|`jQum8zy04mq;SYVGNvl~ zrOj1wg3&!?SxHGFjZaDN{3GzIZcmH@V!Z6-(pRKgP?4e1oNWW30JO1dcDqNa5-1am z*bOF>ncnpqdXRc-r9kM9cDc(5Zw6&&!IDIo#j_n=i)h3MS%rn;=sVJxb@)FLo|qY$ zT?6)+D2#rbjxd307psp=f+?*#HH|e+7mC)~N@}RLaS$R3`}DKt&;22ApiOl|{D2(E zoUAtVCx|i$u04`%arW(?4#_2M%vXT?fs=m1R3uo;X>I`7~>>M0o-TI@9MHZz@CQU#OKY@fX zSVaghd6B300GKDS$AZS50mvSEQp3NsjJgOptTciQ$u=qcXPXls{!FNvh+|-kTp{Ah44!saDK%~;E;D2z_x&aLkO6;O3z73zzUH|hsS#Q zh!^b0#2Hy)V%R3PP~a?KjdeM((ql4|HDJW!;$9!?P*8ZN=LfC&`p7FyHUr2Vqz&gfMiCzz7L)< z?9;TkzT^?GzIQ#sNI7Q04n7UZ?gZ^@Y$d3{yW@#rw6pc9fB_F%H0}5lC(hA~$bRBH zS}e@lUG^M$um571Fp8s4g+RE%FoHw)-?#Gq(+iU1(*YZZ7jse`kpg^T3grE^#xnBgXMc^DFtxydR51zAh1OVd% z2pUzwX-StUv8N(5geYML2oG)qG8~AckU4u7wFGdg%Oz=PyOu5W;L3?*&v;hEq~M4O zXhnxjp34*R9gY~t)d`Sg0AL^x+x@_fU1QOm!Dup89sw9egr@WU=DYx~UclcoB?Gz_+Q7b zWk#mKk24;-;}C6?Ixd8(y@j~SVA*NwgvU$(;?NeNWk6+c|J1F{4ctL6`pL&cpYBU4 zM;bX)I!F>3K|O`>e8|D@$1w;A&)2`^@4?hHHhfz8N8oJsqKwmB`R@l@3CEG>a8p1B z+chA%68E=K>DRH+n=Qdfs0@h$ok*#lyEe> z_^c4rpx{U}(yK0F5-+RKdyVptdhV~KBzx%~afTmyq~d(YRD_^Iq#KAqJ$f3j=`2vU>CZmO3Fz=A3mTTuIa8-z`X@WwqJkQAu%e zbE`htM$b-+SU|GZe>u;0__DO9&O|ZCA$F9K7`CDs?Al9}z!c~mdzve{zZg3}&JS%$ z*{g>}{u!(WO02#S(}`vJ9LPMKg3*4)udp}vBR~N)4ssF@AB1yNIvL#p?g0j6E2G2h zcEWO0DV88zwqg{TqwW3?yLC7?c60jscjIq?5B0DkT3c8!(y^!(?;QLHGoOR#oUM%w z!dkfa_%vZpM9GY{b4b|jQw%yqWOyTj@@dX5PuVUEeM zkSni*QVrvnh=xeOzdk8nb}`4dNp~YY8Jl&6t{_MoW5s#Bt=+gCFR=v}e~r_syKWb@ zf$J-_2Nemk_kC?!lslZVQ_)&ttmttVXTQD&dQGs$L9e_0NDa~m{Ag7i95S5@&2}@u@pT6r4dzU+ewrk9| z$w2Fff&r=BxJsoc?Q`B7{;j>IHMZzDSQyGHr8raI)COPHyw?;@&+M+HEhy&*_KuE3 zCoh0d?2K6XK(l<6?*aO|auWkJTC*@1=q=8F7-7+HU4ZHiTtnB&@zeUh5$8`90W&cG zs_!3P{z2$HIy*$meSH6Z6JLwVz1s~%2CO@Cz|GL+!$fqs_v{I=6m({Z-3}-b5I?0W z2z+h}n*|V8yuT0ip{lZz%V_Ig7Le+%TA(?4@&wq<5zIhY2l$PYGq2IIXpWq~8m-&4hA7RrL=xGu@8d<{HwRgP2|n9%Tw=A&P4o5Dhp;K(3XsnW*jVA06c+ z06icEq$DNz;*H?ub)Cx}P>{g=_Lc)o3YZLEt%2qd6&5imNnU=>MGe#mXvtxdO)ZWrE17=n(9gWVw zfJyXsObQlFk0=vpmBH(U($eiGG-4jTMfQh*fh;v|?BWpq3r*QAqOBG4#S)rL|_3QMS~?_k%ChU8Bd^E0WIglPbno;^yEob zTbr9F963lVmkj&XG z9<7a9Z)cn=MxxN6uiv29O)#;rKuQ)ukJ{`J$?*-$+1rgb*9ay^FaWHFG4lEOb094~ ze}1&);~Tq9$KLVHwxilz0A|oU5!kBxolIKN%vwrT689+Q_C3Jj0T&vK@SbwUMTN^$dt-AjI z{U*qIz=@M6hFNt1#s$z-_ePAiu7Fk@A7;Y?^Fv2lT~qVadKdY0XpCV#wqZ&ts)m;x za#8OOp7}pgnXIDY|L<3z6=LkYF2|eUqzb9lQ6udRo6I* zn0|w)d6%r3?6mLNw(|hp#qoF{op+X| zrjuXI2Zk>5g+-h?RH4gX!>OG3<6Y?tdOS>;1C<2JD>NNII6)MnlLRyY5)mm(R$K{` z1Y|217#ZzxLRLO9)XWQ2w9mMDlKb+;E@W4bSaEB8AQUnTyr(Wq7q!aIMY``+AZBw{w}iP!m(~z79=@b zjBg?y)3yfiKPB_!HA!!jp-|y|em$a(62H95>LyX4bBWPXBCin`ppQ69@YnhE5h|_w z)34Yje@=BJA0>D)F&zgi_;Ekl!Zn-$XoyIN17~o4v(itU%M8`?P*zcaJODr6m5Cxu ze)n0RI+|N@Eo)?$jrE`Rnx;s0c)k;FkV#l-!Zw-^ozDNfW`V#|{eF%%R;+e*NoncvJUGHiNIKVNyLy5joQnNk1lB0#$U~!aMT&ujKy4rGU8NvOqGGcCV5k3Nb zp0a~(giEvpi6-r1fz0^unZ`eK*DkV-Wq;zhkEd|nk($2ce_HWZwC^psXol0bkOWNWso z^ot9as~s*86g-9&~96-W!8V?ytO`M1Ly{#?Ob>Madq}xCL z1jASN@+GWC30u+VnYUfMk;#$pJ?DJYwV6H4^9-k-7Rg27$%Jp|EKt4nq9cxI z1J1Dla0kT~co*-`zVF4EAfc zgFyw6U2P#=tEws`0&+gjEAu#~BLOlhCPq(R|I)>al^HbgZC~FNQ^mJwv$)mp@Q{V= zc&!-|!|Gxb-7cS1-Z;QQuip4c=Sw-$>ityxA2_5T0gK0B9v=_b5T%WnDtfGnv%Or< z1Ob9Wg)A*Cji0eu=j=6YM>z_Gaq%_oZ?sEA*|;+mK`W7j>`W|~3$T{o+X|Oj&Kgx|1 zMkho;8d+0el7~$h_g#qQIPd8|hVV^>uuB|a$N6sfH~t8ZI=9$f@O^SRChdNd!#jLN zAif_l`Ufw9R4|le(hwFRk;g(bY*Kz{*?|L3>BMBKlx!4gM-Y#4GYI4Ww#w!N0wA<||G7l@LY% zR*GH3O+>KWlJmvDAx1^TY1V7{R#sf4;DG~#a_v@DR3tB7xJFs;^Fq%pntqB~h&c}F z-1!hz+uJX-?ZVK+D`T z@_D3Hu8Qt!&i$|yzxn$e8=%^R6u$#nQS2lS?%WXzUqw(WqBl_Q z;Zp_M7UF`uEEV{6t7s7D3wCiNC4Q@^u7*0Ziw+GGlp>7hD`+Cova^W3Vuq3vtq4q( zz&at$NQs`SM#>`)N9R*%yZZY3e`uLwo2An_m^=8Mx8&JlLIhEK=Xjy#j_ehxmSoY% z$)%^4wfJjj06hWva`p5SPVOqR3`V*iLMPwtKnY7ncS8AyzP_lCkPiByJvP}~% zi7@XrYdiSH^Km`d^hFs4(qVzg7u59Xk*k>`S*YmID?Nfn;Xn055Hy6fwa4zr9CR?9 z14?ZEwBg~9aLmo_xmPz7p^O&SRh{;$Ch&6)y?*-^a`vFnI6PT6IOH6Vr=@M7=i%`U z4-Nca{M|OEEvANOc_1Oj;%p@*X1}AnTv+*|_M>6v{x6{Y{rsJNE6C>Ln z*{d=3=ts0@%dCw0nP=9)EQk+Cb{oS! z3!ciHkw3`*z2(5bO-AUlg@&B>nT*DPc(t?31cx1GBbCM|5_{uDCdw`((!{zd=!&c~ z)25xAEGVuACQ$AHyl^jfGg>2&Vbid->kXPbYSc9~-YW&ml#|LuuE`5pLKTAa*$lF_(21d!m61^n`7Ki_7iatky8+aeUm@Fo7HS(RY;9^} zbu^$h1+jzT>(7q{J{5m40#Z0ue@txSMwR{03=a>7(gK(p&}7^&M~+ITu3MmLU(UTW zGfRQksO!;yi#*TvMptt2v%(2EZwPeCnap*jT*dyf`G~*ky_`go<-U`Ea!%Gm&sZ zTi`ueo;F7+ePn}Xrx06qHCo9DEu`(AX~zQ}P&X{j%~jYpkpgf4&5;%?qyL!swZbOOgu5$0Jqbay z^O&laWKcFdlviJWSK)Gk7Qg)E+kTzDcNttnRFOK-d3-rWo=DIDKnt zYbDnb>^*37^hJ-;cKXoMhQ~Z-us=ZAu14``d)psQRvxt=lZ2-NDwAwyz@~No4O}xq z&42y65Q%p=uPR{S!yHZ=OkUDOYZED9&ok4F#9$UAHjp2U9wN=u2jk?#2F;}mG z7MD#o!r?FI3`9$P;64N|`ANrBZF33s&J@fvuU|j55F*dv#XhwkfO=?XD0{pxa~xq3 z35$4e7iZ_O4~&C&gOq`&Uj#fbxX;tQ^xGycwG9M~-M7zko(=jf3#DOb0(fvnZ{~)Uk{>sm`3O zL~bQ$$c_zjjc~*q&L8S?d-LAF*!Hkn(DjYXmuY0(f2cCj)7#qHnP0m6SQ^o$MPcaD5KkRI8xM*{+Wp<`kliW7?frLX>qv9fX+(_sR4CUrUO-TRhmryL2X z*)uj$fnyghZl1CW1yeA)S1npwR#EYL&#r8=$m?eg=OZX?Y^RDXa`Pb2&kWn_>gy{S zXHoT`#BptCc+DtmAnPE8HxA#s>cAnAWT2AER{crZ%24dA!eO~p0h4rL;f8PsTJXW5 zq?Tgw6`f9UF%CZz$Exy@De?_{cutL6Gk(+%C$Oh(`W0o1Gv(*cib+UaJ#KBimjwkKxs%)mt~#x86(@cB-Zv+NIbx=iw`dDXP8$57JZ%#dVJH4c zAj%;v_3$p&{7B;}teA)D8q@Jh4A0%pUB>{z;ENZ(19oYVNf$^p%tvjoI9{uS{?OXF zmMuiXf6`uEW+1ojZ+c9?PX3EL*mlr!u*0{vZvxXI@Ych_w@*Fz4!xI$2M-?xXmi96 z@p;`mcPQb5l?W!bw(1CIgrA}NSR<#5Jyd}LgS_y*ucFRuY;3%6$(>98ylm?Z%COU^ zKMHwv)3&TV7}#=32OF{tkO(*}s0}vSXlT(_5b=PAIsEt3)d!y#zNlb=u;w zb~GckFiyxnfF*$JV=gv9IcRAT`~ZsfUyD@}foJO}6ZHNdR}oEi5Vj+<$QV&ilt&N% z_y8-UNhcn-lI&n2o)NPc-&g!M`2jlydd+`!mp=0j=nhdV9p+!!sqXluqwPJZd& z>+-agBC*@U?_)t2veRA-y>cuY-tnL;3aQ=;?W69ivd4iybo?Vm%Z|wY$;d)vq$nqEIUJ@GYAm zT8AjI@T;59$7^8k!<)l@q9i=Ct}22K6Z``7{&hiblGT3w^5oP;N{q;UVPOi`Enj}z zDPwvF3m$%d_<&!5DIp<1j(*18-UkE3n#M)Leos-sK7!YSbng%5_qwoRCi@z~@eKII z#A45{nqxYnCl53?=rD-991`P@f*2iqa)^T5wYKR|GQ&%0=?Tu=Fs))61r3(^{3OTJ zfU)C800Nj60H91rXlu~?J!T_FVEE0EBL$FrgycR&m?rQmm>I!F-`w9sjLC(I00nA% zJl*lmv*qC05C;t~5WmL&A4a9#IYQZxA-Es2WexL^Pf(A=TXgTy%BbLkVeaZh*Nl_-8K z>EBr|KiAI3tE;J@u~oVGucBpO-e3HlP)c*dF|)W}RE%+@NyXE^CvgFJQU2m`A-@kt zQOhrBY;^!6OGiCyZO3u;;iw@k)TxDd3)Tn9oxATrzR1W(G#8N(;QoTY6Q*c{?*V*R z#~63k9#?!Jjv{O$Fjk;@=YG0@&H{E4!D#|3!F68^`%&S^QI0IH@F)IFJNJw5ss#}}nYTu0ggp2)(Zs(% zU|&%)))t21Ev0^T#%sfWd=*pl{4vfLVgf&!dny4>fdn9yQ=5Z_M=g9Sgjyh@x3aVp zz69E+k{2&PsVnT?&!Qdl^V3o6|6nJmr_gsJ_4BweDhymKuzRp~>^*)Sl4HPQ{D#PP zBu3cY6UG+)rGWIfO%JJ7Oq*lH@ve>=1MjVFj;I(z1@6NAh0*je+m$BR-fum}st!lHB7d; z&)r;Hv~Cza(Wc$jP|P@*JE-ErpUHFt+3!Hn&=>ipQjwG6!_}enx1D)qFM}ibq49lM zV$eJ~I^7cs_x_?Ug85H7Gw#GgBjOZW0zcYjbU89IjD)P>;vWkO@q#wQuR^_|6YmJ- zju}|LlN<>FP_)^JnVFtGCpqK~fdq|gRWY)(BujtxF0is^x4M?E?4)IFVpHr5T>Tpy zvX={d02~1M!AiXqYiJv}qP*0)Q~3vJ;@Il1UjVQczkCsMy)Ppe*`T9-rAdn{^&Y5v zG6Jg5o99Bgkw=f?Sa22w)x%uJ_{%V#=*&zwJ731#yMQhszhq-)N6a%*Ikj$7Jf3g} zRTz=TU!Ip2rF?G}?C8*q;QRqy3$8*YEoPtPA1crdLie1_U7WLE9R-EZ;SM1)s zzcoB$pQ&NTJ8z+tCv%zXreWbgRV}MqTRzBUW-qA~perA_Pom5Kw4teK7t0VJbnW|< zsL`zLL-sPPYzAZZ_Ugqh$wr}E-NP&n19V?sV)$q8w^&)<$f2=*8>zhnd?VF%9~^=Z$8Gw}p&1yZx#zJ-7&f-xtp7~kPFPnygi zxm~P2sCi{|(%ETq#K@m+N2Qzfvla+*#6#{K&OV9m z*JSf#!nN#Ns4&nOCD@eG8lygXKTfmvCfyS>2#Lox6StLjSN?LgcR#d9A& zhT$!PdZ2TggXRKyOb8@FF=HD;VFHI5I7l4Y;6DE1bOeot&ongk(V^U&orM9LZ6hO!Qc_-!_`%7cMc0Z$04^zY1OOi{SUZ|@A$8U3=$EUm4(E(9 zsr@zfRUG@Rx&>iTpt_Ji0Cy2eYT$`>3-{zb-^)v+a&dA(z?BY5_(&ku_u@nYA43(6 zN~E14Z%lFT-UTQ&T1967;G#HZ+O_NRr%!<}p33VXZw7;#gOJn#u?TdnJ2>UYY2br{ zo|BS-BHLD8glJ5MY8inS=!~Fcykp@!O!EBsCOkReFCIPOPUm@WpP?o&Nc_4yMo+*q zbp=5-vlm{=u1|O!9aO(r_jmHDt7zZ&^|&}$1%=e-+8oP+#!l%)M{ARu1HY5^_S%2$ z3;g<|xcKeBfNFUC*-d{#)f`@JS|Me^lh?HRx0BB1sgxNVQVY^pGucc@PTLIx2?dSL z5bZxI9;85I4G483bqRlqcq1RnSGZ$=x=r56n->QR{VTVT$ei;8LzWM>ug<^gr556Z z0nGcui{lm+opVo1p^yC=@NS2~kAp`1OEp9KX>zV>TnCv?In;3cWtf6e0_PbJXlUbK zG=C4+t7DK$a{hee9$ub{q9Tax=hnVXj?s=EfsKpr8l!SWYRm8XuX> zPEz%T$cx*pT&d5EIec3>7`3UDU!U z-S?A{06i`=Kshb61`+IBK`Ny0Bq`VhjSAwE!hUl!~M{fU# z_Xp1CTb!M6VNakvunlOdsTsms4(I|rnCzKA2Rx6FP|$qpjQ+rcwNSbE!rl!%mD2V3e8P{m zjQyQ>bw_w#T6f3U_C?Gvs=T2>PsEmFw3_&GBJ@&^j%xqhVDEn#ATKJFJYWQnt773 z{&Q?Nw)+nB*<-tPB-t6*g3xNfgvfE!0E0eY64+-vo-EV@fv=I&!Bux0o4Y1wL-;u^ z|1tiGeqnGi0<`FxHy2K4-P0i$ z%&ps&!lP#yUf-(;j6**4*wl_gA^K@N_N7~0zx5aRF8cu(7# z+5DFfRidSTu5R?8+w`^iS1d%X{0{?eI2kCoP9-J=AMl^Y|WysEFKwx9MR-~ zD;rZ0hcy!%dmq}`s;w~=VxysVdf+QPjnrK3^IbB826E!6Q%;+|OIVoh3+oK63A_o< zd3?M;3nxTMVh;9#xmJZ@cx&qFFliexTxa0$BnXv+CB#@`$Q>w71YU7{v4?dDWD)EP zHTEHVn;(FpN1jHFJqgo2da7n2={MuOn07RS`NzJ)LTVunL#`Bj989=!!z}B8?``8; z2~m3V@$rJoN$ph1+OTDG7=$mos9r9PZqzCO?SrojIl{NHAz}-(cF^x0J#s_=eC?)Z z5z*0-W~_)enjH9xiwBAbmJIb`D0iwE-BY@XL^{tEwy5R;_PX;mpQr&e8W!*+u-JHs zQq8iFZ&8U35AKjTI9X3ENl-$WDlbcUyp3Ikl`bov`KY?}?Hcz)G&v$W&f9}A1$hUB zIF4NetONxH_QF+Y`9AZGq~bpnv-OonnA~^Yc+YJxb|XS>zLf(z(-KY_=s00n#y)u% z4Hp_3bWnGmFkR;QF;?|~3aBl-accMKIVHaK3+R?18^n*QZf|ez?In%v00Gd(*11+K zNi~!@_GAvWOph|}jF*$hW7abqIzhpzb=)d&K{>-jrf$>`kQbOT{D8XbWQNrC%Egy0 zpe?nIse6P=3xq21Eo0kB5jVZ6pmW!a^VYV2*a;UFkI zM!Gu9_d@i_Z8%qU>@a;L>;1Xs9XECN1^xWQ$F|PvDq+wAc z<;C34=q+h8*lkf|FpHwweF!`gPHy z*3a2}#)2sE$) z$&|1BYJ6_=W1okICFJD#s(eBW&k^2Nzw_s)en{uBSldS9--h|zg10(~&B zfrA48ZTn*-CiQTZ(fd9O32u%A5rZ6180)Gy!#_<~70|aq6?r%lC;0lrN z({vP%Wo7&>2kv{7SmwW9bzfO}Ukn`kYlM1a!GG808t>hkdI;G?+1UmiHs{5c?_gkq zH=LsA66-#m>%(-Ri%Yv6jPoC|4S$w11S+}eGnMSfkGRWTg6oY5lUAMNOCxHfVZX)< z6yY5OOAX2p3-$MV!~avV>ed>}s(J#nPDO=@zz3Q8)raxOF$WRVixL*Yj8pC4B88-t z(6F^lgkL0B58;ZK>b3mm*I{!t$F>a$L*0S5Z;PM#11-kkQuZG|9N)YV4od&_h5o+! zgjE7x2o?Duv0I()q9I7#K?A5RZo z`6LPo6n9J0`yxp6<1K7%6dJ6N=&kCT>7wj@B@- z)`gj6I5*wyzif$}x_Hz)+}srH-rl`E-G?SLG_)i$^rS8xJasCiV4wkiRl1VG1MV{z z<|#_+;N5fkS=!#(y(V{YK>qp#pyMa%6nQ13N$jy+^$a1KI=kjQ2$_Vk#m7-a>tkL0 zRs^*G$%3Itot#GBGir3`h`4wfAd2J9Qc~Jm zR=E)TqAA0nZ*LDN@!;raAT2Z`gu(fR-7!dB;Oygg4t~=}DlOxYyXTAYa+ZZL^)Vpn z2I)^48tx9fV6XaPRY{dK-~q6tOf$=hmNADR?K$K+Hs@Y|l|&O>d3=<2?8w&Pn<3)% z9#7I|tG%}T`$R>b^}zQ7Ouca4LBeEb_u@n}j+M=PA?SO7or>x z(>m^CHQWYpV&|`1fiS4d?F*C5288g&qFnzrG7=Xb5A70?d4RJD5=eb6ot&KH5Z6PV zEJ!mz;VL$3+1M%o(!$b*L0X^++e^+1#>O&S^Smr!E)Zvg9IMJpV+-AR2X}REW$IJ_ zX(*%5Kvcu@jijF9kkbA;+jD$>T}b)Y6_>8m&#R{R2-H1b2Y5||ADbUJavf9^wm!0> zNYV5wIoBV2uKn-a1jbYfHDXf60zx4nG6XZ0W|j>zxG;gjd>E|wBs{|S9*BYPVA|)G zVXGxAee8mmb)lQqjv&W))Z`(G>6@@^8z-RR7)2O?4oii?|; zgE)~uIpUo|@?7EwsC5iw1=p93j3NX~2<{Jj>3y^R_u^?eJC|8N<##N6`=uH5S(6Fj z%gKWi`a8fYt9+a&XLAwMl9rwyw|gzu)A=-c$CSnCcjDo-tJfH29P00;!md%@+4&R% z(aUY{h{RRejnp;{v>!$Is ziSC-t(mzm)z2tH!lQV_!zspde{p+!SP4WV~9XMODG|&YmYVrqei?O?JeCi--*BOA= z#HjdgvI>IIg&gh!{Vg2hI4u*$P9ex8wPWBCw(dDRTu>Esq(LxXjj$&Y^B#w9l_?Rs zXL-)Zh|OOM`Q6NQ`Hp5s6J(c@$Ww`6o% z@cVAyeGM&)+vCM^e>Gb8s^AK6dCRRu!9;E23Jbj4_)`V%oiznGX|IOm6CNum9@!Hx zFtzIt%ip84jA#=LS(f@Sy}-T4^i#vM6!I9XpEiG@qMcFS003NHwYDcwxG{vM+bQJ70+IR4!Pnk-eUas1Jr!clTSa zfBK%N^%PDrJ{iB3jbYc7n-)2=3~r{EBEtcF$ABf{9DMJr;&}uJC1unbF{ejOO*MZW zGB<}Au1E?YJ&1hSamxi$z@NV?S#@{Cp(($8gXAwqX*q|d@3EG#PiwUsT0u&S%ima} zTD$m{#z+g-5xb-z_x-}2nDuAQS`%C4HcmCJm)vpv`i3oB!$VtN@O^&;gB*AROhhIK zvMc=#yWj@q^5@S%R;9_9<5a{ZwQ9YL!w==6(boK<&$}sMfy)qyas}(6!#X1U{jBzHyiGAQdSl= z*i)l>Z0JpA=F442*WwaoK5`}*Bg}|&lqns%2@`IpUV`$;U|$v;Si6h77Jh?)g`^b4 zt&qIaX6W3+?9mtCHAM-3068frQ&LmuqEViog7qBjI0O?_mw&|v8W+gRa%s-)vgg`# z&@nokK@=uYprO+ZqwBAw(rXUY>(dH{`~R+qYhKw)CW>qzr!9@^$9BU{XG-pA&tQd-!xf z^u2qTX4x`?tK~@dl)sO+xur$V-6FAASHb@QR3Izl`dKY#v%gxY)IHzRR=amI-= zNFwmC*}9ZMQ(*U$i!{R5BIlI(q2=Wt(I&Dl?dRLl^w+w-EH5nu$js!;NJjjuTX#{l z;>u<#|1g!6n5WxkXho6(wO$t|t9-$bp_ZW|NHn{r2c9R)fwu;$21@%tuGrWIcjZa} zX-Lx!S>%0snkg4%a!i7ZttGAE)y>T=Fo9tigFp~L84rF|@=NOm-r6vQ&Uafx)Q+d8 z^VE1vPhQEwkZkS`NOgwzgjB?$T0u|v(D;`E%O9E}1%<@}-HVXz8l=sd^0eqnF-?mA zbVFmVTI3Dt05u8B%%BBNV9)K~mC&^+2wp!?K0g<m0(-q+!86xV)@v2VcOqJgsD>&hnh}pi^5y~m-|AE@|YLcV{pSC6Dz6h zP(s1NS6p6h^Y+8uwXOI45k{b6RSZ)hNNK4}Z0-qxBYcI**v|nHOh0`4>roN+p1w=p zCw~3Cv(JXZXx)t}ay4QQ7#cIMb3wtuKLY4VA@8=Z@aK0uKWVR#>WegCD@mqlbmXk? z1SxIXCcN#8xgcHXbGDOief0WkehZ9>JLxLfF)Rm6E-(E(TIuz^#N{x8l@Vx-R3#+N z-bZ4N#|wb{_(3@O5WyrPz@-R1LNTQC5CtKL>DXDc*LXVsO6{9 zD0)vS@nw-ye`RDEaPIW?FQGz!@$c{4xKN6P`q9-%NAe%Z4tqSwIfRT4+F?m1dV(OM zm0DXdB~V^L0TAO8P@L#iO)6~-a->#0`owQ~LF>S$XcX59I(^H3plVfBU4%qYf2!i| z?3i>)+A{1!$QFSbA7Cwvh4GP*FD0oWA_p?epjQPD3{5jgACm<{U_v8gVQM-BXSLJW zv(P?hP@vHVSp#su*4!K$s4mUV8lLOe%_m3%eV`)y;X_oE0cXG}?q9x#N8BCdEdC^< zY$3P)b}Ng=lT{rb-*$H`$!(s>SsPVLSz{tw{G%k|*N=~mQbYlK0H;CskoB>vYZgT(wHD_oIXsRB9e+c0HKElD+h%U=zw!QE z=4t@pLE>vtkd+Q)F+=-PcI~Wub=YnNZ<>qkK*3*KUDGr+)U#g3f1MDv!U9o=y$~L` zxzQ00Cr<`dU8>T9}Z=T^-s&Ila-9|Cd_ z0CN7qg*PoN_qUxrwC>`+W}outE^)pFcUg4-rk9L9b1Y1LQ&1U$_CbZA2Hoa+a120Od$R-yq4QX;$QD3u>qp!CT%+v# zbr+a2+`j0!zUNfEGCrH0&T&(u3w4_RfIS+w#dy-yR3x@?<5?P>0lHOMFGE5zBIGKO z27u_tQFl*BQ%DRS2XX~V<^=_0T9o= z{rh!S0gnTZ$Mc4Nicw`a%T7}tgk0?Ljm`Y!+@=>AfPhG>m**HDVzFZVM7-}HU z4P)cu1BHfYqmTmG(b)-&3_)Ob7=Ez@%qOPq2A1Goj*xYUi=S|E0(1e#RBB!xJAu)` z`ux;9jG6R@Ru3F0c9TYj3zsjKphDw>=uFX44n3C)pU+v;+t7S)KCkmMXAf;yQDdgP zYD@JK7J^9T@3!sRb>7_XjdhJi{u88G_!!S#nr?>$>KoV_OiSh^5J=;NgF~!>`!kv@ zq-kK(SYV_r|?uBMsbhSalOK21WW8yY7FPQ#q$5>+*#f``CB#>&BIrm`?O6 zRIumc$He>hAE%~9#K*IWZcamaVALci4VoAg-MMW+VqI} z<9n|EgDeIInt;~);_TV|`6Hy;1qB)FV?sPJPZ*rPCH zaPN?R|4_a1uUl4Qd{DYU0>Ha?uJ6S)3@8>SQc_b%B+qg74WdFw0)2S6?$lGnOdZOz z@n1uJ5WE6yO5XwZfMF*HTm>{rC<;MB0fqZic!HUe++zV^z)*bmZU^Anwm@lBHfU2}1CWDg$WMl*cG~TuE zydy;S?A(n}$F}hisE;boboqINYvrY1yko+;D|j7xHk1lm6)|hOA1jDMevf$U?yDCd z|3P;4D#HHhd(b~v0tF);VF+79If42)dAsZSPf~b`VAhg?z2tIxNPzF2>G3~{o2PwR zHfD*gS;v7HDKOf;i%ddkVT_~ao{BckF%?g4 z9`XJD?Q?nlJe_q3TSJqd-E*D(HB6n@Hl%b|VTM>v*nT?|^}HyCa5EDdJ|ZZisS$osphEe+x(iP8d$Ox)lVJ$!7^_0G%0NIQ$S(c07F; zB?Oi1eJ7)vp7RR)RPw1mH`EhSLl6uGFW<4_rMefvaqEO{rP_`Q>BoQe_Du{lZ`;D9 z?FZf$F&R4%Vg+9&$FuSewu9M@QIeH=qjgWYslVe_?sqVP~1&(%{S$Ut5<_5_GfI&PVbdt~p@e(PhtN=u# zSaVRuu1OP=927BJPbVeJ=cP-qvVA>U6A-@E!eaKqh2!xINIqv_nG+U%;pH9r<;&~9 z&jvSZD1q{=Vy7OT6bFoIJG2ca<<&4wsqf6bOEwy{kvsS}ZYnCOnOpWWHQiP`73}Y? z>pt@sR8(=P>G!fXf={i=ICE{fu7BibdpKrl z`Fm)-_+9V4pu2|{I_0a6(!6A3h`UJGj1aHMu|&Gk;E?I;vbR3x>Jv(zw(6H$SFe3t zc*~oaYtUZlD5DC^Ywv!>m9H=E@kvPyPMt`}6aMkF`}C_2+K)3VV}3P(q45ujPH?zx zpV%dbYwBlorj#9fs_ChEKI$fSuLNgc@CU5hho@V4zmJ98S644AIn<$gOzFY5&X>)% zGuIS78I%9NZwm@jjEU}-*`wLzcT?)$(p*lcpuSz1vbFwepSQ7xhs{4`^v3dsc`YqYVu~Fi{7lx}^tXJpGVwk3B$5g-)gC=9#pTd3&`YDh;XKYrSAx}WPie_m@76g^o-#_v& zwr!$O0fzf5&IIj)#q|%)<*fptIf!(OlzW=x>u@q-=KGhAH|XmF%F8=S-3DK=hbON+ z)ygD&K;cU+JG|`);z!j^1o1A|rrwoE(IU3=L^!n8E7vS`JYpy_iOUw;4nOuw-Z>&9Bdl zn#xB17#d2=$-!$K$_k@0WG$Web5K7cP#QZ!>Thha;>X|-M?aie3jzzVq!0}Q(S`d5 zXi9e!@^k)T*VwTSS17}s(9p0pX@X9)I~Zk#-Mx83j`vqekp3FL0HmL^|EVA!naw$pO2ePJ>BK4B7CdKA z!gp_QwkDMONUyU>f?nFCL5&DLa&iciD0qM~FrdLbpk zEZanPB(HqYabJ_|X6P+j9bh|;k1Of4*$ z-@N(Ei7)x06GtPV90!sXVMH`4LY*L?c#yDNK>?cL7oo3B`T`~!yZQsn;~so;7rk%J zTpeI?K7Fz_MnQWXpglJK&*H7^?NcB>Y?Z-80XK2H27L(r@uS{HzG$^CT~>IFJ;Wgu z-hX+u95H#rYf^aU1xzRrrPgApyzlKz(Nal3H~9~OZVKr7CBzE(zX7lE^YiD9`1=(B zlXXGs3=LoG^7<_HV0xXcv2jCfA28OH(}OPA=4=MLHs2+u zg!{8 zQh_HR!5iuE2#(g&q%%Et@+9!K*OEqJ5ddvXFx0|-It+o$TV($CcOZ=Qd~;8=MEyD@O5}18)qaMF?`Y?s=>kjjHmg&Ci)Dw=x9cM z{)@41J*}-zvg#WDNnRZ)p_o53QmkveknH@0O%H^4m8|S4&hP5M*;%8r#GxbW}P2{;Nie!$EFc$8&j z38F3SR>C9MXzITG-YpI#lb36B?fN2k&4>9 zDWEJ^Yem>1oLv>ajrK-f`5x+!jfOBMhb!rjjg7{>)da!BR=}K6%=dc5Rk$_>VEgpf zyftfA(n@0R!q^@?;OZ<97i)EQuX~hPM59D~U5LGM0)Ge-Q(8tDzc58m@a*jDVXI9{ zkAig`JhkG9j{X?h^{y>6G-1n@m8-STEuB6k<;JRk;frUp-d+Fx-8-;$yX)wsOHPmy z*%rsehO@IRuLwlME##K`+4JF?Q#Kt@QbZ8G(OpL@EG}tnlK%xjC9@T>@skeAQ(Iil zJvKb>sYy;;Iuql1Zj`KM-Ceq@1{u59ujgBNzVVT%)yllYc}BV#8v-|DJ+8)2)aJP1UP2L5$NyTD#`Q_oDBzMxMibl@MYGW z{$)0rBdGCcN~XO6Pfs;}K&V^cbEIutx+H1w-7S+DCRnLR05cheaF0-V ze)a1Qh;4A*YalX{m~pXm{AR4D?bkQ(!fR8f&wDYA+XSKMRUS%sd@RwK7?6&Nx*q+g zDs1(hJue_%qlhk+e7V+he&Eor0Y5L%$VTX7Hn2(Gt`A<(Id!UNk#QpjHxCa4${D{} z?_x|da=%pa5IPKm5SjyWz2SEtkc3BNB1#V+3IpY-#i2v12vqo3kRSV3xOQ9O4SN56 zr^0yhW=tC>MF~Jpc+QOri-@$IdP+y&!Gifi`Yk~~`E_sQtK?_y>oB2^Hw<~lm_`Va2XgUnq#%0VwiNM&UxAN-pE-#^6=+648B$536~sj7V2}>< zy0>>8lL6?7k5xYEGBTqeT(MCC+rh9|4Wyc?ydUg6CBp*j5TcM>IZ3Cbp{y;)e@c`}$Wcl3Q9mh!Vsf$a{jg3wzg@v2tiUE z7GlP4UWf2cBfNGMfjMp%NlJt1VaJ?$2G1&BB3091nDKp=La8#iWSOR5u*Wk-}CFAvY`&-al}C&95m z+IZ%#hABU3wg6fP0tKUYujB5HD#DJ3Uv_}k@9y+j{s({$Y(9i&#vj*$_r>RcVe`-A zq!s3#ZH~SG)&fu_5(wmxaf8YkO_io!Hpz*K};cU2m@fm;?NeN^^VaIL*)7u zz;9XMdTC2Dod-sZKb5+r@y5G+eT}R1pg#^f(L*2*zt+SAzo8yS*~c`!e}nGPV*Cbe z1bUy%_+4jSO#s%Zy;8rx|9ycYNPB5J9qW8la`ME;NSDpb6VTgu{V3rGy< zC&HVZmiFb_x7Ykn>GAzos+vDZ0biH5m?Xme3JW=0&N?|wvGc%&vw*ILk{tOO`gK*ibW>{tvID$oqqr7#13-B-TmM4-wD8+ z;1z(!moXsYs?p*1pbzGo-{mWUTx}H4|8v}3xViKXQ|SDWf{XDA??Fli4>lqd~e0zk92t7Ia9>u}QwDk^MsbtN%6=$#GP z=Ahm`v$OpbSGU|F2Ztb2Bdco=S0#ovm;DBIFM!(G6p+!VW*|bU&k&$dA7eHW{IeA! zcoabX?q?mw1f`t3JUC`|XNsnGem9q$#bH3LMbD(GTMxh3V|p?u5L_ok6c*;mNsV*) zcF_ouiuzLUpQOZpj&U6K9+#uZ!b`f~-9GD>=Fo(`wO__q6hOMJ9YLt9e(!IVQALW= zZg^x=7}~f7vC65nG#UePd@?)hGlao_o0^$RW z3N;>hB0*&b3ZVfhd|%&RoRtr{gSY&nGt6(0qZb8x;ACVJvO|0l^K*B5&SVvT9D&9Z zBVG_Lu{WKCOA5xB;QgDWBCle7KiJRI7NI`0tf z4r&cA+2^~Wsu+_P1~Y$RlGG`yO;C<-tKzZ{c&9NC32B}XPL1G@fBjcJ1*LAs?BB0d zjr(D!L^~SUILsr5Q31ihVE3uTY7AQiej&gSqMNTdtzaUc+QVoHg22;+_EKz>Meq%{ zKC$(IY8^<%+FK6{{zsP_lb@(6BNqKt`u8b^Swd~5UwFWq1%;iz-dT*4feL;H^97Fn zcT{ZO*wE5kK%${^g7Zhx-rioLZWBhAe&(cZg!&Zso zgg}P|e2xr3b#YmOd-viJNE`^m16#N+>i566W~rw~N-!$ap>@!QOgkU|OwsL~_xZnd zG0x8#fHj7RKV5bITSTFyPVp2q%{jpP7PR*kXfnJ@I=-%(3t$okJpKp~V$n?v4P=}@ zwka?uFqEEk8j6hEH`?Y{1Xmei>EAauhwcs0ZX3^#G;6uPXBV_5mFk)l%#9P^=6;8b z?(xDk)0dZ~QpQ5}`HqsK67B7)`<(jS3)!G(O`MB~jvnz``OF!P9ro`{DPZQTpgSO$ zQ5!I@LlY1AX?ic7zu(Q9I*Vm~7&N4($bi@%{_+ zzgk_LpA?lvt^>Nu1JEkq?DweGp_}NckAB4T%kWWWUC0LMrsIWy+r4MYr>W{oQyLV6h)4Y4q;xy=&)jaSt_J7J<^r2Jv`3FM z`k;P6)l+v4nQbud@o~fM2GQBtHEX_JYeIa)XOSco7aN$+@hr0}#NHaAjfV^XF>O12 zboc27R?5oD^BivYjbas5Ap;}h)KaubAF3>j27}uCb35z5xgV>@jG*&&yOD&2$0(L0 zbsZ-ma{BtDo8F&5@ygAryPNJI#()_E1)rZfQQ6FKFFYXN6_N@DD!t{-cn9(#+e>PH zeBHJ73wAc2D=wg1*#fO-$u7(T$9PlS#5sY%GLI~C*&YFBP1U>v0WDxfu&T@)0qwd4 zfc3DZ>CvMHGCS!Aum;X5yLRs6C)(b<-5g#w{SFkBGAdH@l+=W@(Rat8ql- zAsEYnXB|C=6}&Gp&$Lk_@88cZJ2yKkd4vEJ(QET~ZR*AGk2~?SjeFo4Zb{(7B)oAv zcsxXWe4-7nGQt#4Kfm)leq8Ja7n9$O-KyvT!otFIRQLZgk>SSo4n$%Uqhp@pU>OY} zg}U(0LD0q65V4X!3po#06tHZdp(o|}Cdojc2-_B+pFvWrFBazKD?Dde?R2pNLMaCt z^SH^wva$sTZU^H-fJF{Bzxj*d!kaUFoPI56?^Z$Ug8`s7ysB|$p{{=Wn%T%3;T9MC-Om82lwRT}d1w#)ABMcBEpA;J^w45yT-sVM7g zIt}JlkdiP-Ld=EfS8O|bfyeNZZg&PzRPS4rm2C>_Yrv4;qnH@;MQ}ncA{K!gVEFMI zFd%9zN^BG@V*IGlP>rU6K3Y&6n|$UZ&hFqY8k|SEL~A}kO;2(63u9fr z-^4qUpc1N=77ckmrUKA^GM9ytf#*fL$F*x9{m{j&;Zw55ar)$mSn>f2GcycUsv4?7 z)-`^uB5-h_jKp+Y_*5|h-o(ZRv+Ro@8wZee+eQ)%9%m5TgnCku=%k(>d&#s_B_}=I z0RY0_AVJ{h7JyU>2Md%Lh#Gmda9v*2acevdK;&%fl%~hMPE1OY-?Ryv2IiH(EpEN3 z8>5UNy?S|Nec`kcAL*h%^85&J(#X~Ngv zzaCQ;$;O%J zVVO^=a&LqJ1{=q~!2QyGTpXCs9g5C?0DujvCaK{ep$(p#by=r?zwCeV54aW4Q|RAg z?WpVT7iQmweHH}mb+pRR0b~3&wKzsxm&0$mIg^5kcnd5!fAMP*iYHcCt~O|Q`b9W>|BYv>n83t0%vBtx>&CK;JnG;FA1 zubzG76ic>Roq69MUWBF@t=5JD(K>r2KBH$$f?DK%yPy64`hro8ZP^9??MAym+>@pqt2jWlt%ucMeda543-+~_IR(?sC13U?WKd5~BDYr5m-Iwwc{wtwWTO`W1k)2>+|iSVI-tHrgd2hYK>QmvRboV} zN&-|>=Nuf;QC?A&aVw|kkR48{QL>67i?5T zcoal6QWUTcB5(wg(xEfJM7c_@g`2~$iy5bypyHXsc8j-7!smO3WKfa>lelnQ-*qu* zf}qzo(9txns{;{DI*+c&BQ`?|v3PC-vJU0%wgb}mFOACsZzntgz+tfaKxy{}<07Oa zBy20a5Pp9N|8pfVbqLsZEGLB6cdanQkdn|SpwKq|;nH~rpHW1qfWU;j0j8Ml~8 z0WAc#kOrS?@O={1ptM*P@X7IB6)mB_AgV#e1syf5oX3=v_WOG4R<&{*uUvKf7h8}H z3D|&Mi;m`z)jXjLn3wQHm5o{-;Yho^7o&C@LS2WQ9_C&)mOQ0cS7Gc!V)e0r;0b#i zQg!*r{6fe1I6vRg)Re3Qgvk*X)nJjmB}8~v2}*c~MR6L)fild= zxrVn7iw>ZTB)7|R`v3j3j*j2hq_HYcTjS9tUD0A?V+#ok+-qnEXaE==jIF3#3Qf%G z?JF-~c=^xqakbMeLZEVnt>5t@DH0E5J5sgK79*Si?E|`$zc>yYW0}P%5|q^ROVxX^ zk7I<&ROmYK4b)nk7MKqXU>fL7#Sw15q1Ci-c(WTC+#lXW>jQ!nMHN0GV2ESiyM=MH y|A$NM-Wm*iDfS$@%76Rm_in7*|DP}XTl;s-l=~)|*B1%=GSD^Fd8}oB^Zx;q;RRCw diff --git a/src/PCE/PCE.jl b/src/PCE/PCE.jl index 53bab67..33177e6 100644 --- a/src/PCE/PCE.jl +++ b/src/PCE/PCE.jl @@ -2,6 +2,8 @@ using PolyChaos, Symbolics, ModelingToolkit, LinearAlgebra export PCE, moment_equations, pce_galerkin, mean, var +include("PCE_utils.jl") + """ $(SIGNATURES) @@ -52,13 +54,10 @@ function PCE(states, bases::AbstractVector{<:Pair}) bases_dict = Dict(bases) parameters = [p for (p, op) in bases] ops = [op for (p, op) in bases] - degs = [deg(op) for op in ops] - min_deg = minimum(degs) - if !(all(isequal(first(degs)), degs)) # allequal - @warn "Currently only bases with identical degrees are supported." * - "\nProceed with minimum common degree = $min_deg" - end - pc_basis = MultiOrthoPoly(ops, min_deg) + + @assert all(deg(op) > 0 for op in ops) "Every basis considered must at least include the linear function" + + pc_basis = TensorProductOrthoPoly(ops) n_basis = size(pc_basis.ind, 1) n_states = length(states) @@ -68,38 +67,22 @@ function PCE(states, bases::AbstractVector{<:Pair}) sym_to_pc = Dict(ζ[i] => pc_basis.ind[i, :] for i in eachindex(ζ)) pc_to_sym = Dict(val => key for (val, key) in sym_to_pc) - moments = [] + moments = Vector{Num}[] for (i, state) in enumerate(collect(states)) - moment_name = Symbol("z" * Symbolics.map_subscripts(i)) ind_vars = get_independent_vars(state) - if isempty(ind_vars) - pce_coeffs = @variables $(moment_name)[1:n_basis] - else - pce_coeffs = @variables $(moment_name)(ind_vars...)[1:n_basis] - end - push!(moments, collect(pce_coeffs[1])) + create_var = isempty(ind_vars) ? name -> (@variables $(name))[1] : + name -> (@variables $(name)(ind_vars...))[1] + push!(moments, [create_var(moment_name(i,j)) for j in 1:n_basis]) end ansatz = [states[i] => sum(moments[i][j] * sym_basis[j] for j in 1:n_basis) for i in 1:n_states] return PCE(states, parameters, bases, bases_dict, sym_basis, pc_basis, sym_to_pc, pc_to_sym, ansatz, moments) end -function (pce::PCE)(moment_vals, parameter_vals::AbstractMatrix) - # wasteful => should implement my own version of this - # this evaluates each polynomial via recurrence relation from scratch - # can reuse many results. - # fine for now. +function (pce::PCE)(moment_vals, parameter_vals::AbstractVector) basis = evaluate(parameter_vals, pce.pc_basis) return [dot(moments, basis) for moments in moment_vals] end -function (pce::PCE)(moment_vals, parameter_vals::AbstractVector) - return pce(moment_vals, reshape(parameter_vals, 1, length(parameter_vals))) -end -function (pce::PCE)(moment_vals, parameter_vals::Number) - return pce(moment_vals, reshape([parameter_vals], 1, 1)) -end - -include("PCE_utils.jl") # 1. apply PCE ansatz """ @@ -175,15 +158,20 @@ Evaluate scalar products between all basis functions in `pce` and basis monomials as characterized by `mono_indices`. """ function eval_scalar_products(mono_indices, pce::PCE) - max_degree = maximum_degree(mono_indices, pce) - degree_quadrature = max(ceil(Int, 0.5 * (max_degree + deg(pce.pc_basis) + 1)), - deg(pce.pc_basis)) - integrator_pce = bump_degree(pce.pc_basis, degree_quadrature) + uni_degs = [deg(op) for op in pce.pc_basis.uni] + max_degs = uni_degs + for (mono, id) in mono_indices + max_degs = max.(max_degs, vec(sum(pce.pc_basis.ind[id .+ 1, :], dims=1))) + end + println(max_degs) + println(typeof(max_degs)) + quad_deg = max.(ceil.(Int, 0.5 * (max_degs + uni_degs .+ 1))) + integrators = map((uni, deg) -> bump_degree(uni, deg), pce.pc_basis.uni, quad_deg) scalar_products = Dict() for k in 1:dim(pce.pc_basis) - scalar_products[k] = Dict(mono => computeSP(vcat(ind, k - 1), integrator_pce) - for (mono, ind) in mono_indices) + scalar_products[k] = Dict(mono => computeSP(vcat(id, k - 1), pce.pc_basis, integrators) + for (mono, id) in mono_indices) end return scalar_products end diff --git a/src/PCE/PCE_utils.jl b/src/PCE/PCE_utils.jl index 234b7dc..ade0fba 100644 --- a/src/PCE/PCE_utils.jl +++ b/src/PCE/PCE_utils.jl @@ -1,4 +1,10 @@ -import PolyChaos.computeSP2 +import PolyChaos.computeSP2, PolyChaos.computeSP, PolyChaos.dim + +# moment names +function moment_name(i,j) + return Symbol("z" * Symbolics.map_subscripts(i) * + "₋" * Symbolics.map_subscripts(j)) +end # getting independent variables function get_independent_vars(var) @@ -101,113 +107,6 @@ function get_basis_indices(::Val{1}) return [0] end -# bumping the degree of a PolyChaos OrthoPoly object up to ensure exact integration -# PR to PolyChaos -> remove unnecessarily restrictive constructors and allow construction from measures -# -> also expose number of points used for quadrature generation for general orthogonal polys -# - -measure_parameters(m::AbstractMeasure) = [] -measure_parameters(m::Measure) = m.pars -measure_parameters(m::JacobiMeasure) = [m.ashapeParameter, m.bshapeParameter] -measure_parameters(m::genLaguerreMeasure) = [m.shapeParameter] -measure_parameters(m::genHermiteMeasure) = [m.muParameter] -measure_parameters(m::MeixnerPollaczekMeasure) = [m.λParameter, m.ϕParameter] -measure_parameters(m::Beta01Measure) = [m.ashapeParameter, m.bshapeParameter] -measure_parameters(m::GammaMeasure) = [m.shapeParameter, m.rateParameter] - -function bump_degree(op::OrthoPoly, deg::Int) - return OrthoPoly(op.name, deg, op.measure) -end - -function bump_degree(op::JacobiOrthoPoly, deg::Int) - ps = measure_parameters(op.measure) - return JacobiOrthoPoly(deg, ps...) -end - -function bump_degree(op::genLaguerreOrthoPoly, deg::Int) - ps = measure_parameters(op.measure) - return genLaguerreOrthoPoly(deg, ps...) -end - -function bump_degree(op::MeixnerPollaczekOrthoPoly, deg::Int) - ps = measure_parameters(op.measure) - return MeixnerPollaczekOrthoPoly(deg, ps...) -end - -function bump_degree(op::Beta01OrthoPoly, deg::Int) - ps = measure_parameters(op.measure) - return Beta01OrthoPoly(deg, ps...) -end - -function bump_degree(op::GammaOrthoPoly, deg::Int) - ps = measure_parameters(op.measure) - return GammaOrthoPoly(deg, ps...) -end - -function bump_degree(op::genHermiteOrthoPoly, deg::Int) - ps = measure_parameters(op.measure) - return genHermiteOrthoPoly(deg, ps...) -end - -function bump_degree(op::HermiteOrthoPoly, deg::Int) - ps = measure_parameters(op.measure) - return HermiteOrthoPoly(deg, ps...) -end - -function bump_degree(op::LaguerreOrthoPoly, deg::Int) - ps = measure_parameters(op.measure) - return LaguerreOrthoPoly(deg, ps...) -end - -function bump_degree(op::Uniform01OrthoPoly, deg::Int) - ps = measure_parameters(op.measure) - return Uniform01OrthoPoly(deg, ps...) -end - -function bump_degree(op::Uniform_11OrthoPoly, deg::Int) - ps = measure_parameters(op.measure) - return Uniform_11OrthoPoly(deg, ps...) -end - -function bump_degree(op::GaussOrthoPoly, deg::Int) - ps = measure_parameters(op.measure) - return GaussOrthoPoly(deg, ps...) -end - -function bump_degree(op::LegendreOrthoPoly, deg::Int) - ps = measure_parameters(op.measure) - return LegendreOrthoPoly(deg, ps...) -end - -function bump_degree(op::LogisticOrthoPoly, deg::Int) - ps = measure_parameters(op.measure) - return LogisticOrthoPoly(deg, ps...) -end - -function bump_degree(op::MultiOrthoPoly, deg::Int) - return MultiOrthoPoly(bump_degree.(op.uni, deg), deg) -end - -# extending computeSP2 for multivariate orthogonal polys -function computeSP2(pc::MultiOrthoPoly) - n = length(pc.uni) - m = dim(pc) - uni_SP2 = [computeSP2(op) for op in pc.uni] - multi_SP2 = [prod(uni_SP2[j][pc.ind[i, j] + 1] for j in 1:n) for i in 1:m] - return multi_SP2 -end - -# computing maximum degree -function maximum_degree(mono_indices::AbstractVector, pce::PCE) - max_degree = 0 - for (mono, ind) in mono_indices - max_degree = max(max_degree, - maximum(sum(pce.pc_basis.ind[ind[i] + 1, :] - for i in eachindex(ind)))) - end - return max_degree -end - """ `TensorProductOrthoPoly` objects represent bases formed as the tensor product of univariate `PolyChaos.AbstractOrthoPoly` bases. By default the basis elements of the tensor product are restricted to polynomials with total degree up to the maximum degree among the @@ -246,16 +145,41 @@ $(TYPEDSIGNATURES) computes inner product between basis functions of a `TensorProductOrthoPoly` via `PolyChaos`'s infrastructure (exploiting the tensor product form). """ -function computeSP(basis_fxns, tpop::TensorProductOrthoPoly) - multi_indices = tpop.ind[basis_fxns, :] +function computeSP(basis_fxns, tpop::TensorProductOrthoPoly, + integrators = tpop.uni) + multi_indices = tpop.ind[basis_fxns .+ 1, :] # columns of multi_indices refer to inner products to be computed sp = 1.0 for k in axes(multi_indices, 2) - sp *= computeSP(multi_indices[:,k], tpop.uni[k]) + sp *= computeSP(multi_indices[:,k], integrators[k]) end return round(sp, digits = 12) end +function computeSP2(tpop::TensorProductOrthoPoly) + sp2 = [computeSP2(op) for op in tpop.uni] + return [prod(sp2[i][j+1] for (i,j) in enumerate(tpop.ind[k,:])) + for k in axes(tpop.ind, 1)] +end + +function evaluate(x, tpop::TensorProductOrthoPoly) + uni_vals = [_evaluate_uni_op(x[i], tpop.uni[i]) for i in eachindex(x)] + tensor_vals = zeros(size(tpop.ind,1)) + for idx in axes(tpop.ind,1) + tensor_vals[idx] = prod(uni_vals[i][j+1] for (i,j) in enumerate(tpop.ind[idx,:])) + end + return tensor_vals +end + +function _evaluate_uni_op(x, op::T) where T <: Union{AbstractOrthoPoly, AbstractCanonicalOrthoPoly} + vals = zeros(deg(op)+2) + vals[1], vals[2] = 0.0, 1.0 + for k in 2:deg(op)+1 + vals[k+1] = (x-op.α[k-1])*vals[k] - vals[k-1]*op.β[k-1] + end + popfirst!(vals) + return vals +end """ $(TYPEDSIGNATURES) @@ -309,4 +233,112 @@ function grevlex(n::Int, grade::Int, constrained_degrees::Vector{<:AbstractVecto ind = vcat(ind, hcat(sub_ind, k*ones(Int,size(sub_ind,1)))) end return ind -end \ No newline at end of file +end + +""" +$(TYPEDSIGNATURES) + +returns dimension of `TensorProductOrthoPoly` object, i.e., the number of basis functions encoded. +""" +dim(tpop::TensorProductOrthoPoly) = size(tpop.ind,1) + +# bumping the degree of a PolyChaos OrthoPoly object up to ensure exact integration +# PR to PolyChaos -> remove unnecessarily restrictive constructors and allow construction from measures +# -> also expose number of points used for quadrature generation for general orthogonal polys +# + +measure_parameters(m::AbstractMeasure) = [] +measure_parameters(m::Measure) = m.pars +measure_parameters(m::JacobiMeasure) = [m.ashapeParameter, m.bshapeParameter] +measure_parameters(m::genLaguerreMeasure) = [m.shapeParameter] +measure_parameters(m::genHermiteMeasure) = [m.muParameter] +measure_parameters(m::MeixnerPollaczekMeasure) = [m.λParameter, m.ϕParameter] +measure_parameters(m::Beta01Measure) = [m.ashapeParameter, m.bshapeParameter] +measure_parameters(m::GammaMeasure) = [m.shapeParameter, m.rateParameter] + +function bump_degree(op::OrthoPoly, deg::Int) + return OrthoPoly(op.name, deg, op.measure) +end + +function bump_degree(op::JacobiOrthoPoly, deg::Int) + ps = measure_parameters(op.measure) + return JacobiOrthoPoly(deg, ps...) +end + +function bump_degree(op::genLaguerreOrthoPoly, deg::Int) + ps = measure_parameters(op.measure) + return genLaguerreOrthoPoly(deg, ps...) +end + +function bump_degree(op::MeixnerPollaczekOrthoPoly, deg::Int) + ps = measure_parameters(op.measure) + return MeixnerPollaczekOrthoPoly(deg, ps...) +end + +function bump_degree(op::Beta01OrthoPoly, deg::Int) + ps = measure_parameters(op.measure) + return Beta01OrthoPoly(deg, ps...) +end + +function bump_degree(op::GammaOrthoPoly, deg::Int) + ps = measure_parameters(op.measure) + return GammaOrthoPoly(deg, ps...) +end + +function bump_degree(op::genHermiteOrthoPoly, deg::Int) + ps = measure_parameters(op.measure) + return genHermiteOrthoPoly(deg, ps...) +end + +function bump_degree(op::HermiteOrthoPoly, deg::Int) + ps = measure_parameters(op.measure) + return HermiteOrthoPoly(deg, ps...) +end + +function bump_degree(op::LaguerreOrthoPoly, deg::Int) + ps = measure_parameters(op.measure) + return LaguerreOrthoPoly(deg, ps...) +end + +function bump_degree(op::Uniform01OrthoPoly, deg::Int) + ps = measure_parameters(op.measure) + return Uniform01OrthoPoly(deg, ps...) +end + +function bump_degree(op::Uniform_11OrthoPoly, deg::Int) + ps = measure_parameters(op.measure) + return Uniform_11OrthoPoly(deg, ps...) +end + +function bump_degree(op::GaussOrthoPoly, deg::Int) + ps = measure_parameters(op.measure) + return GaussOrthoPoly(deg, ps...) +end + +function bump_degree(op::LegendreOrthoPoly, deg::Int) + ps = measure_parameters(op.measure) + return LegendreOrthoPoly(deg, ps...) +end + +function bump_degree(op::LogisticOrthoPoly, deg::Int) + ps = measure_parameters(op.measure) + return LogisticOrthoPoly(deg, ps...) +end + +function bump_degree(op::MultiOrthoPoly, deg::Int) + return MultiOrthoPoly(bump_degree.(op.uni, deg), deg) +end + +function bump_degree(op::TensorProductOrthoPoly, deg::Vector{Int}) + return TensorProductOrthoPoly(bump_degree.(op.uni, deg)) +end + +# extending computeSP2 for multivariate orthogonal polys +function computeSP2(pc::MultiOrthoPoly) + n = length(pc.uni) + m = dim(pc) + uni_SP2 = [computeSP2(op) for op in pc.uni] + multi_SP2 = [prod(uni_SP2[j][pc.ind[i, j] + 1] for j in 1:n) for i in 1:m] + return multi_SP2 +end + diff --git a/test/PCETests.jl b/test/PCETests.jl index 04237ed..429b6ac 100644 --- a/test/PCETests.jl +++ b/test/PCETests.jl @@ -21,10 +21,6 @@ end @parameters a, b @variables y n = 5 - test_basis = [a => GaussOrthoPoly(n), b => Uniform01OrthoPoly(n + 1)] - warn_message = "Currently only bases with identical degrees are supported." * - "\nProceed with minimum common degree = $n" - @test_logs (:warn, warn_message) PCE([y], test_basis) test_basis = [a => GaussOrthoPoly(n), b => Uniform01OrthoPoly(n)] pce = PCE([y], test_basis) @@ -114,7 +110,8 @@ end # test Galerkin projection @testset "PCE: galerkin projection test" begin moment_eqs = MOR.pce_galerkin(eq, pce) - integrator = MOR.bump_degree(pce.pc_basis, n + 1) + + integrator = map((uni, deg) -> MOR.bump_degree(uni,deg), pce.pc_basis.uni, [n + 1, n+1]) true_moment_eqs = Num[] scaling_factor = computeSP2(pce.pc_basis) @@ -122,15 +119,12 @@ end mom_eq = 0.0 for mono in keys(basis_indices) ind = basis_indices[mono][2] - c = computeSP(vcat(ind, j), integrator) + c = computeSP(vcat(ind, j), pce.pc_basis, integrator) mom_eq += c * coeffs[mono] end push!(true_moment_eqs, 1 / scaling_factor[j + 1] * mom_eq) end - @test integrator.deg == n + 1 - @test integrator.measure isa typeof(pce.pc_basis.measure) - @test integrator.measure.measures[1] isa typeof(pce.pc_basis.measure.measures[1]) @test all([isapprox_sym(moment_eqs[1][i], true_moment_eqs[i]) for i in eachindex(true_moment_eqs)]) From bdf692e8be0b786031b4671f8d0ede59309f3c1a Mon Sep 17 00:00:00 2001 From: FHoltorf <32248677+FHoltorf@users.noreply.github.com> Date: Sat, 15 Oct 2022 02:20:21 -0400 Subject: [PATCH 47/62] SciML format --- src/PCE/PCE.jl | 13 +++---- src/PCE/PCE_utils.jl | 83 +++++++++++++++++++++++++------------------- test/PCETests.jl | 5 +-- 3 files changed, 57 insertions(+), 44 deletions(-) diff --git a/src/PCE/PCE.jl b/src/PCE/PCE.jl index 33177e6..b1b6427 100644 --- a/src/PCE/PCE.jl +++ b/src/PCE/PCE.jl @@ -2,7 +2,7 @@ using PolyChaos, Symbolics, ModelingToolkit, LinearAlgebra export PCE, moment_equations, pce_galerkin, mean, var -include("PCE_utils.jl") +include("PCE_utils.jl") """ $(SIGNATURES) @@ -70,9 +70,9 @@ function PCE(states, bases::AbstractVector{<:Pair}) moments = Vector{Num}[] for (i, state) in enumerate(collect(states)) ind_vars = get_independent_vars(state) - create_var = isempty(ind_vars) ? name -> (@variables $(name))[1] : - name -> (@variables $(name)(ind_vars...))[1] - push!(moments, [create_var(moment_name(i,j)) for j in 1:n_basis]) + create_var = isempty(ind_vars) ? name -> (@variables $(name))[1] : + name -> (@variables $(name)(ind_vars...))[1] + push!(moments, [create_var(moment_name(i, j)) for j in 1:n_basis]) end ansatz = [states[i] => sum(moments[i][j] * sym_basis[j] for j in 1:n_basis) for i in 1:n_states] @@ -161,7 +161,7 @@ function eval_scalar_products(mono_indices, pce::PCE) uni_degs = [deg(op) for op in pce.pc_basis.uni] max_degs = uni_degs for (mono, id) in mono_indices - max_degs = max.(max_degs, vec(sum(pce.pc_basis.ind[id .+ 1, :], dims=1))) + max_degs = max.(max_degs, vec(sum(pce.pc_basis.ind[id .+ 1, :], dims = 1))) end println(max_degs) println(typeof(max_degs)) @@ -170,7 +170,8 @@ function eval_scalar_products(mono_indices, pce::PCE) integrators = map((uni, deg) -> bump_degree(uni, deg), pce.pc_basis.uni, quad_deg) scalar_products = Dict() for k in 1:dim(pce.pc_basis) - scalar_products[k] = Dict(mono => computeSP(vcat(id, k - 1), pce.pc_basis, integrators) + scalar_products[k] = Dict(mono => computeSP(vcat(id, k - 1), pce.pc_basis, + integrators) for (mono, id) in mono_indices) end return scalar_products diff --git a/src/PCE/PCE_utils.jl b/src/PCE/PCE_utils.jl index ade0fba..a122639 100644 --- a/src/PCE/PCE_utils.jl +++ b/src/PCE/PCE_utils.jl @@ -1,8 +1,8 @@ import PolyChaos.computeSP2, PolyChaos.computeSP, PolyChaos.dim # moment names -function moment_name(i,j) - return Symbol("z" * Symbolics.map_subscripts(i) * +function moment_name(i, j) + return Symbol("z" * Symbolics.map_subscripts(i) * "₋" * Symbolics.map_subscripts(j)) end @@ -112,30 +112,37 @@ end By default the basis elements of the tensor product are restricted to polynomials with total degree up to the maximum degree among the univariate bases. This maximum degree can be manually specified, however. """ -struct TensorProductOrthoPoly{M,U} +struct TensorProductOrthoPoly{M, U} ind::Matrix measure::M deg::Vector{Int} uni::U end -function TensorProductOrthoPoly(ops::AbstractVector{T}) where T <: Union{AbstractOrthoPoly, AbstractCanonicalOrthoPoly} +function TensorProductOrthoPoly(ops::AbstractVector{T}) where { + T <: + Union{AbstractOrthoPoly, + AbstractCanonicalOrthoPoly + }} n = length(ops) degrees = [deg(op) for op in ops] ind = grevlex(n, 0:maximum(degrees), degrees) measures = [op.measure for op in ops] - prod_measure = ProductMeasure(t -> prod(measure.w for measure in measures), - measures) - + prod_measure = ProductMeasure(t -> prod(measure.w for measure in measures), + measures) + return TensorProductOrthoPoly(ind, prod_measure, degrees, ops) end -function TensorProductOrthoPoly(ops::AbstractVector{T}, max_deg::Int) where T <: Union{AbstractOrthoPoly, AbstractCanonicalOrthoPoly} +function TensorProductOrthoPoly(ops::AbstractVector{T}, + max_deg::Int) where { + T <: Union{AbstractOrthoPoly, + AbstractCanonicalOrthoPoly}} n = length(ops) degrees = [deg(op) for op in ops] ind = grevlex(n, 0:max_deg, degrees) measures = [op.measure for op in ops] - prod_measure = ProductMeasure(t -> prod(measure.w for measure in measures), - measures) - + prod_measure = ProductMeasure(t -> prod(measure.w for measure in measures), + measures) + return TensorProductOrthoPoly(ind, prod_measure, degrees, ops) end @@ -145,37 +152,42 @@ $(TYPEDSIGNATURES) computes inner product between basis functions of a `TensorProductOrthoPoly` via `PolyChaos`'s infrastructure (exploiting the tensor product form). """ -function computeSP(basis_fxns, tpop::TensorProductOrthoPoly, - integrators = tpop.uni) +function computeSP(basis_fxns, tpop::TensorProductOrthoPoly, + integrators = tpop.uni) multi_indices = tpop.ind[basis_fxns .+ 1, :] # columns of multi_indices refer to inner products to be computed sp = 1.0 for k in axes(multi_indices, 2) - sp *= computeSP(multi_indices[:,k], integrators[k]) + sp *= computeSP(multi_indices[:, k], integrators[k]) end return round(sp, digits = 12) end function computeSP2(tpop::TensorProductOrthoPoly) sp2 = [computeSP2(op) for op in tpop.uni] - return [prod(sp2[i][j+1] for (i,j) in enumerate(tpop.ind[k,:])) - for k in axes(tpop.ind, 1)] + return [prod(sp2[i][j + 1] for (i, j) in enumerate(tpop.ind[k, :])) + for k in axes(tpop.ind, 1)] end function evaluate(x, tpop::TensorProductOrthoPoly) uni_vals = [_evaluate_uni_op(x[i], tpop.uni[i]) for i in eachindex(x)] - tensor_vals = zeros(size(tpop.ind,1)) - for idx in axes(tpop.ind,1) - tensor_vals[idx] = prod(uni_vals[i][j+1] for (i,j) in enumerate(tpop.ind[idx,:])) + tensor_vals = zeros(size(tpop.ind, 1)) + for idx in axes(tpop.ind, 1) + tensor_vals[idx] = prod(uni_vals[i][j + 1] + for (i, j) in enumerate(tpop.ind[idx, :])) end return tensor_vals end -function _evaluate_uni_op(x, op::T) where T <: Union{AbstractOrthoPoly, AbstractCanonicalOrthoPoly} - vals = zeros(deg(op)+2) +function _evaluate_uni_op(x, + op::T) where { + T <: + Union{AbstractOrthoPoly, AbstractCanonicalOrthoPoly + }} + vals = zeros(deg(op) + 2) vals[1], vals[2] = 0.0, 1.0 - for k in 2:deg(op)+1 - vals[k+1] = (x-op.α[k-1])*vals[k] - vals[k-1]*op.β[k-1] + for k in 2:(deg(op) + 1) + vals[k + 1] = (x - op.α[k - 1]) * vals[k] - vals[k - 1] * op.β[k - 1] end popfirst!(vals) return vals @@ -190,16 +202,16 @@ function grevlex(n::Int, grade::Int) if n == 1 return reshape([grade], 1, 1) end - + if grade == 0 return zeros(Int, 1, n) end - sub_ind = grevlex(n-1,grade) - ind = hcat(sub_ind, zeros(Int,size(sub_ind,1))) + sub_ind = grevlex(n - 1, grade) + ind = hcat(sub_ind, zeros(Int, size(sub_ind, 1))) for k in 1:grade - sub_ind = grevlex(n-1,grade-k) - ind = vcat(ind, hcat(sub_ind, k*ones(Int,size(sub_ind,1)))) + sub_ind = grevlex(n - 1, grade - k) + ind = vcat(ind, hcat(sub_ind, k * ones(Int, size(sub_ind, 1)))) end return ind end @@ -218,19 +230,19 @@ end function grevlex(n::Int, grade::Int, constrained_degrees::Vector{<:AbstractVector}) if n == 1 - return grade in constrained_degrees[1] ? reshape([grade], 1, 1) : zeros(Int,0,1) + return grade in constrained_degrees[1] ? reshape([grade], 1, 1) : zeros(Int, 0, 1) end - + if grade == 0 return zeros(Int, 1, n) end filtered_grades = filter(x -> x <= grade, constrained_degrees[end]) - sub_ind = grevlex(n-1, grade - filtered_grades[1], constrained_degrees[1:end-1]) - ind = hcat(sub_ind, filtered_grades[1]*ones(Int,size(sub_ind,1))) + sub_ind = grevlex(n - 1, grade - filtered_grades[1], constrained_degrees[1:(end - 1)]) + ind = hcat(sub_ind, filtered_grades[1] * ones(Int, size(sub_ind, 1))) for k in filtered_grades[2:end] - sub_ind = grevlex(n-1, grade-k, constrained_degrees[1:end-1]) - ind = vcat(ind, hcat(sub_ind, k*ones(Int,size(sub_ind,1)))) + sub_ind = grevlex(n - 1, grade - k, constrained_degrees[1:(end - 1)]) + ind = vcat(ind, hcat(sub_ind, k * ones(Int, size(sub_ind, 1)))) end return ind end @@ -240,7 +252,7 @@ $(TYPEDSIGNATURES) returns dimension of `TensorProductOrthoPoly` object, i.e., the number of basis functions encoded. """ -dim(tpop::TensorProductOrthoPoly) = size(tpop.ind,1) +dim(tpop::TensorProductOrthoPoly) = size(tpop.ind, 1) # bumping the degree of a PolyChaos OrthoPoly object up to ensure exact integration # PR to PolyChaos -> remove unnecessarily restrictive constructors and allow construction from measures @@ -341,4 +353,3 @@ function computeSP2(pc::MultiOrthoPoly) multi_SP2 = [prod(uni_SP2[j][pc.ind[i, j] + 1] for j in 1:n) for i in 1:m] return multi_SP2 end - diff --git a/test/PCETests.jl b/test/PCETests.jl index 429b6ac..2055871 100644 --- a/test/PCETests.jl +++ b/test/PCETests.jl @@ -110,8 +110,9 @@ end # test Galerkin projection @testset "PCE: galerkin projection test" begin moment_eqs = MOR.pce_galerkin(eq, pce) - - integrator = map((uni, deg) -> MOR.bump_degree(uni,deg), pce.pc_basis.uni, [n + 1, n+1]) + + integrator = map((uni, deg) -> MOR.bump_degree(uni, deg), pce.pc_basis.uni, + [n + 1, n + 1]) true_moment_eqs = Num[] scaling_factor = computeSP2(pce.pc_basis) From c8353f87ae723e553fdf2efd7c703b5d6acd85bc Mon Sep 17 00:00:00 2001 From: FHoltorf <32248677+FHoltorf@users.noreply.github.com> Date: Sun, 16 Oct 2022 12:37:16 -0400 Subject: [PATCH 48/62] TensorProductOrthoPoly and ancillary tests + minor adjustments --- src/PCE/PCE_utils.jl | 40 ++++++++++++++----- test/PCETests.jl | 95 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 126 insertions(+), 9 deletions(-) diff --git a/src/PCE/PCE_utils.jl b/src/PCE/PCE_utils.jl index a122639..2ec4eec 100644 --- a/src/PCE/PCE_utils.jl +++ b/src/PCE/PCE_utils.jl @@ -1,4 +1,4 @@ -import PolyChaos.computeSP2, PolyChaos.computeSP, PolyChaos.dim +import PolyChaos: computeSP2, computeSP, dim, deg # moment names function moment_name(i, j) @@ -216,7 +216,7 @@ function grevlex(n::Int, grade::Int) return ind end -function grevlex(n::Int, grades::AbstractVector) +function grevlex(n::Int, grades::AbstractVector{Int}) return reduce(vcat, [grevlex(n, grade) for grade in grades]) end @@ -224,29 +224,33 @@ function grevlex(n::Int, grade::Int, max_degrees::Vector{Int}) return grevlex(n, grade, [0:d for d in max_degrees]) end -function grevlex(n::Int, grades::AbstractVector, max_degrees::Vector{Int}) +function grevlex(n::Int, grades::AbstractVector{Int}, max_degrees::Vector{Int}) return reduce(vcat, [grevlex(n, grade, max_degrees) for grade in grades]) end -function grevlex(n::Int, grade::Int, constrained_degrees::Vector{<:AbstractVector}) +function grevlex(n::Int, grade::Int, degree_constraints::Vector{<:AbstractVector}) if n == 1 - return grade in constrained_degrees[1] ? reshape([grade], 1, 1) : zeros(Int, 0, 1) + return grade in degree_constraints[1] ? reshape([grade], 1, 1) : zeros(Int, 0, 1) end if grade == 0 - return zeros(Int, 1, n) + return all(0 in degs for degs in degree_constraints) ? zeros(Int, 1, n) : zeros(Int, 0, n) end - filtered_grades = filter(x -> x <= grade, constrained_degrees[end]) - sub_ind = grevlex(n - 1, grade - filtered_grades[1], constrained_degrees[1:(end - 1)]) + filtered_grades = filter(x -> x <= grade, degree_constraints[end]) + sub_ind = grevlex(n - 1, grade - filtered_grades[1], degree_constraints[1:(end - 1)]) ind = hcat(sub_ind, filtered_grades[1] * ones(Int, size(sub_ind, 1))) for k in filtered_grades[2:end] - sub_ind = grevlex(n - 1, grade - k, constrained_degrees[1:(end - 1)]) + sub_ind = grevlex(n - 1, grade - k, degree_constraints[1:(end - 1)]) ind = vcat(ind, hcat(sub_ind, k * ones(Int, size(sub_ind, 1)))) end return ind end +function grevlex(n::Int, grades::AbstractVector{Int}, degree_constraints::Vector{<:AbstractVector}) + return reduce(vcat, [grevlex(n, grade, degree_constraints) for grade in grades]) +end + """ $(TYPEDSIGNATURES) @@ -254,6 +258,20 @@ returns dimension of `TensorProductOrthoPoly` object, i.e., the number of basis """ dim(tpop::TensorProductOrthoPoly) = size(tpop.ind, 1) +""" +$(TYPEDSIGNATURES) + +returns degrees of the bases forming a `TensorProductOrthoPoly` object. +""" +deg(tpop::TensorProductOrthoPoly) = tpop.deg + +""" +$(TYPEDSIGNATURES) + +returns maximum degree featured in a `TensorProductOrthoPoly` object. +""" +max_degree(tpop::TensorProductOrthoPoly) = sum(tpop.ind[end,:]) + # bumping the degree of a PolyChaos OrthoPoly object up to ensure exact integration # PR to PolyChaos -> remove unnecessarily restrictive constructors and allow construction from measures # -> also expose number of points used for quadrature generation for general orthogonal polys @@ -345,6 +363,10 @@ function bump_degree(op::TensorProductOrthoPoly, deg::Vector{Int}) return TensorProductOrthoPoly(bump_degree.(op.uni, deg)) end +function bump_degree(op::TensorProductOrthoPoly, deg::Vector{Int}, max_deg::Int) + return TensorProductOrthoPoly(bump_degree.(op.uni, deg), max_deg) +end + # extending computeSP2 for multivariate orthogonal polys function computeSP2(pc::MultiOrthoPoly) n = length(pc.uni) diff --git a/test/PCETests.jl b/test/PCETests.jl index 2055871..c521b25 100644 --- a/test/PCETests.jl +++ b/test/PCETests.jl @@ -4,6 +4,101 @@ const MOR = ModelOrderReduction include("PCETestUtils.jl") +# testing GRevLex capabilities +@testset "PCE: GRevLeX ordering" begin + @test MOR.grevlex(1,5) == reshape([5],1,1) + + ind = [2 0 0; + 1 1 0; + 0 2 0; + 1 0 1; + 0 1 1; + 0 0 2] + @test ind == MOR.grevlex(3, 2) + + ind = [1 1 0; + 1 0 1; + 0 1 1; + 0 0 2] + @test ind == MOR.grevlex(3, 2, [1,1,2]) + + ind = [1 1 0; + 0 1 1] + @test ind == MOR.grevlex(3, 2, [0:1,[1],0:2]) + + @test zeros(Int,0,3) == MOR.grevlex(3, 0, [0:1,[1],0:2]) + + + ind0 = [0 0 0] + ind1 = [1 0 0; + 0 1 0; + 0 0 1] + ind2 = [2 0 0; + 1 1 0; + 0 2 0; + 1 0 1; + 0 1 1; + 0 0 2] + @test vcat(ind0, ind1, ind2) == MOR.grevlex(3, 0:2) + @test vcat(ind1, ind2) == MOR.grevlex(3, 1:2) + @test vcat(ind0, ind2) == MOR.grevlex(3, [0,2]) + @test vcat(ind2, ind0) == MOR.grevlex(3, [2,0]) + + degree_constraints = [0:1, [1], 1:2] + ind0 = zeros(Int,0,3) + ind1 = zeros(Int,0,3) + ind2 = [0 1 1] + @test vcat(ind0, ind1, ind2) == MOR.grevlex(3, 0:2, degree_constraints) + @test vcat(ind1, ind2) == MOR.grevlex(3, 1:2, degree_constraints) + @test vcat(ind0, ind2) == MOR.grevlex(3, [0,2], degree_constraints) + @test vcat(ind2, ind0) == MOR.grevlex(3, [2,0], degree_constraints) +end + +# testing TensorProductOrthoPoly +@testset "PCE: TensorProductOrthoPoly test" begin + ops = [GaussOrthoPoly(4), Uniform01OrthoPoly(2), LaguerreOrthoPoly(3)] + tpop = MOR.TensorProductOrthoPoly(ops) + @test tpop.uni == ops + @test MOR.max_degree(tpop) == 4 + @test MOR.deg(tpop) == [4, 2, 3] + + tpop = MOR.TensorProductOrthoPoly(ops, 3) + @test MOR.max_degree(tpop) == 3 + + ops = [GaussOrthoPoly(4), Uniform01OrthoPoly(2)] + tpop = MOR.TensorProductOrthoPoly(ops) + ind = [0 0; + 1 0; + 0 1; + 2 0; + 1 1; + 0 2; + 3 0; + 2 1; + 1 2; + 4 0; + 3 1; + 2 2] # GRevLex-ordered multi-indices + @test tpop.ind == ind + + ops = [GaussOrthoPoly(3), Uniform01OrthoPoly(3), LaguerreOrthoPoly(3)] + mop = MultiOrthoPoly(ops,3) + tpop = MOR.TensorProductOrthoPoly(ops) + sp2_mop = computeSP2(mop) + sp2_tpop = computeSP2(tpop) + mop_multi_indices = [mop.ind[i,:] for i in axes(mop.ind,1)] + tpop_multi_indices = [tpop.ind[i,:] for i in axes(mop.ind,1)] + idx_map = [findfirst(x -> x == mult_index, mop_multi_indices) for mult_index in tpop_multi_indices] + @test sp2_mop[idx_map] == sp2_tpop + @test isapprox(computeSP(idx_map[[5,5,2,2]],mop), computeSP([5,5,2,2],tpop)) + + tpop = MOR.bump_degree(tpop, [2,4,1]) + @test deg(tpop) == [2,4,1] + + tpop = MOR.bump_degree(tpop, [2,4,1], 5) + @test tpop.ind[end,:] == [0,4,1] +end + # testing extraction of independent variables @testset "PCE: get_independent_vars test" begin @variables t, z, u(t), v(t)[1:4], w(t, z), x(t, z)[1:4] From 32eb581bce97732410b95d49e39d918cf162d8e4 Mon Sep 17 00:00:00 2001 From: FHoltorf <32248677+FHoltorf@users.noreply.github.com> Date: Sun, 16 Oct 2022 19:23:36 -0400 Subject: [PATCH 49/62] SciML format --- src/PCE/PCE_utils.jl | 8 +++++--- test/PCETests.jl | 44 ++++++++++++++++++++++---------------------- 2 files changed, 27 insertions(+), 25 deletions(-) diff --git a/src/PCE/PCE_utils.jl b/src/PCE/PCE_utils.jl index 2ec4eec..0e0440a 100644 --- a/src/PCE/PCE_utils.jl +++ b/src/PCE/PCE_utils.jl @@ -234,7 +234,8 @@ function grevlex(n::Int, grade::Int, degree_constraints::Vector{<:AbstractVector end if grade == 0 - return all(0 in degs for degs in degree_constraints) ? zeros(Int, 1, n) : zeros(Int, 0, n) + return all(0 in degs for degs in degree_constraints) ? zeros(Int, 1, n) : + zeros(Int, 0, n) end filtered_grades = filter(x -> x <= grade, degree_constraints[end]) @@ -247,7 +248,8 @@ function grevlex(n::Int, grade::Int, degree_constraints::Vector{<:AbstractVector return ind end -function grevlex(n::Int, grades::AbstractVector{Int}, degree_constraints::Vector{<:AbstractVector}) +function grevlex(n::Int, grades::AbstractVector{Int}, + degree_constraints::Vector{<:AbstractVector}) return reduce(vcat, [grevlex(n, grade, degree_constraints) for grade in grades]) end @@ -270,7 +272,7 @@ $(TYPEDSIGNATURES) returns maximum degree featured in a `TensorProductOrthoPoly` object. """ -max_degree(tpop::TensorProductOrthoPoly) = sum(tpop.ind[end,:]) +max_degree(tpop::TensorProductOrthoPoly) = sum(tpop.ind[end, :]) # bumping the degree of a PolyChaos OrthoPoly object up to ensure exact integration # PR to PolyChaos -> remove unnecessarily restrictive constructors and allow construction from measures diff --git a/test/PCETests.jl b/test/PCETests.jl index c521b25..3ed0d77 100644 --- a/test/PCETests.jl +++ b/test/PCETests.jl @@ -6,7 +6,7 @@ include("PCETestUtils.jl") # testing GRevLex capabilities @testset "PCE: GRevLeX ordering" begin - @test MOR.grevlex(1,5) == reshape([5],1,1) + @test MOR.grevlex(1, 5) == reshape([5], 1, 1) ind = [2 0 0; 1 1 0; @@ -15,19 +15,18 @@ include("PCETestUtils.jl") 0 1 1; 0 0 2] @test ind == MOR.grevlex(3, 2) - + ind = [1 1 0; 1 0 1; 0 1 1; 0 0 2] - @test ind == MOR.grevlex(3, 2, [1,1,2]) + @test ind == MOR.grevlex(3, 2, [1, 1, 2]) ind = [1 1 0; 0 1 1] - @test ind == MOR.grevlex(3, 2, [0:1,[1],0:2]) - - @test zeros(Int,0,3) == MOR.grevlex(3, 0, [0:1,[1],0:2]) + @test ind == MOR.grevlex(3, 2, [0:1, [1], 0:2]) + @test zeros(Int, 0, 3) == MOR.grevlex(3, 0, [0:1, [1], 0:2]) ind0 = [0 0 0] ind1 = [1 0 0; @@ -41,17 +40,17 @@ include("PCETestUtils.jl") 0 0 2] @test vcat(ind0, ind1, ind2) == MOR.grevlex(3, 0:2) @test vcat(ind1, ind2) == MOR.grevlex(3, 1:2) - @test vcat(ind0, ind2) == MOR.grevlex(3, [0,2]) - @test vcat(ind2, ind0) == MOR.grevlex(3, [2,0]) - + @test vcat(ind0, ind2) == MOR.grevlex(3, [0, 2]) + @test vcat(ind2, ind0) == MOR.grevlex(3, [2, 0]) + degree_constraints = [0:1, [1], 1:2] - ind0 = zeros(Int,0,3) - ind1 = zeros(Int,0,3) + ind0 = zeros(Int, 0, 3) + ind1 = zeros(Int, 0, 3) ind2 = [0 1 1] @test vcat(ind0, ind1, ind2) == MOR.grevlex(3, 0:2, degree_constraints) @test vcat(ind1, ind2) == MOR.grevlex(3, 1:2, degree_constraints) - @test vcat(ind0, ind2) == MOR.grevlex(3, [0,2], degree_constraints) - @test vcat(ind2, ind0) == MOR.grevlex(3, [2,0], degree_constraints) + @test vcat(ind0, ind2) == MOR.grevlex(3, [0, 2], degree_constraints) + @test vcat(ind2, ind0) == MOR.grevlex(3, [2, 0], degree_constraints) end # testing TensorProductOrthoPoly @@ -82,21 +81,22 @@ end @test tpop.ind == ind ops = [GaussOrthoPoly(3), Uniform01OrthoPoly(3), LaguerreOrthoPoly(3)] - mop = MultiOrthoPoly(ops,3) + mop = MultiOrthoPoly(ops, 3) tpop = MOR.TensorProductOrthoPoly(ops) sp2_mop = computeSP2(mop) sp2_tpop = computeSP2(tpop) - mop_multi_indices = [mop.ind[i,:] for i in axes(mop.ind,1)] - tpop_multi_indices = [tpop.ind[i,:] for i in axes(mop.ind,1)] - idx_map = [findfirst(x -> x == mult_index, mop_multi_indices) for mult_index in tpop_multi_indices] + mop_multi_indices = [mop.ind[i, :] for i in axes(mop.ind, 1)] + tpop_multi_indices = [tpop.ind[i, :] for i in axes(mop.ind, 1)] + idx_map = [findfirst(x -> x == mult_index, mop_multi_indices) + for mult_index in tpop_multi_indices] @test sp2_mop[idx_map] == sp2_tpop - @test isapprox(computeSP(idx_map[[5,5,2,2]],mop), computeSP([5,5,2,2],tpop)) + @test isapprox(computeSP(idx_map[[5, 5, 2, 2]], mop), computeSP([5, 5, 2, 2], tpop)) - tpop = MOR.bump_degree(tpop, [2,4,1]) - @test deg(tpop) == [2,4,1] + tpop = MOR.bump_degree(tpop, [2, 4, 1]) + @test deg(tpop) == [2, 4, 1] - tpop = MOR.bump_degree(tpop, [2,4,1], 5) - @test tpop.ind[end,:] == [0,4,1] + tpop = MOR.bump_degree(tpop, [2, 4, 1], 5) + @test tpop.ind[end, :] == [0, 4, 1] end # testing extraction of independent variables From bcad194b74e54e29df7fe5eb8ddf71f4ca09ab14 Mon Sep 17 00:00:00 2001 From: FHoltorf <32248677+FHoltorf@users.noreply.github.com> Date: Sun, 16 Oct 2022 21:05:33 -0400 Subject: [PATCH 50/62] rm field bases_dict --- src/PCE/PCE.jl | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/PCE/PCE.jl b/src/PCE/PCE.jl index b1b6427..760cbdd 100644 --- a/src/PCE/PCE.jl +++ b/src/PCE/PCE.jl @@ -20,7 +20,6 @@ Here ``x`` denotes the states of the PCE, ``p`` the parameters, ``zᵢ`` refers - `parameters`: `Vector` of parameters (symbolic variables) being expanded. - `bases`: `Vector` of `Pair`s mapping parameters to a `PolyChaos.AbstractOrthoPoly` representing the basis in which the parametric dependence is expanded. -- `bases_dict`: `Dict` generated from bases. - `sym_basis`: `Vector` of symbolic variables representing the basis functions: ``[ζ₁, …, ζₘ]``. - `pc_basis`: `PolyChaos.MultiOrthoPoly` representing the tensorproduct-based multi-variate basis underpinning the PCE - `sym_to_pc`: `Dict` mapping symbolic basis variable to PolyChaos.MultiOrthoPoly index (multi-index) @@ -32,7 +31,6 @@ struct PCE states::Any # states parameters::Any # vector of parameters being expanded bases::Any # vector of pairs: p (symbolic variable) => polynomial basis (PolyChaos) - bases_dict::Any # dictionary generated from bases sym_basis::Any # vector of basis functions (symbolic variables) !![indexing as generated by PolyChaos]!! pc_basis::Any # polychaos basis object sym_to_pc::Any # dictionary mapping symbolic to pc basis @@ -51,7 +49,6 @@ function PCE(states, bases::AbstractVector{<:Pair}) # to deal with symbolic arrays states = collect(states) - bases_dict = Dict(bases) parameters = [p for (p, op) in bases] ops = [op for (p, op) in bases] @@ -76,7 +73,7 @@ function PCE(states, bases::AbstractVector{<:Pair}) end ansatz = [states[i] => sum(moments[i][j] * sym_basis[j] for j in 1:n_basis) for i in 1:n_states] - return PCE(states, parameters, bases, bases_dict, sym_basis, pc_basis, sym_to_pc, + return PCE(states, parameters, bases, sym_basis, pc_basis, sym_to_pc, pc_to_sym, ansatz, moments) end function (pce::PCE)(moment_vals, parameter_vals::AbstractVector) From c65f681facad56fe7e6dc2e7d83af2df88ca6db9 Mon Sep 17 00:00:00 2001 From: FHoltorf <32248677+FHoltorf@users.noreply.github.com> Date: Sun, 16 Oct 2022 21:08:50 -0400 Subject: [PATCH 51/62] rm sym_to_pc and inverse dict => goal: denser code --- src/PCE/PCE.jl | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/src/PCE/PCE.jl b/src/PCE/PCE.jl index 760cbdd..05304a3 100644 --- a/src/PCE/PCE.jl +++ b/src/PCE/PCE.jl @@ -21,9 +21,7 @@ Here ``x`` denotes the states of the PCE, ``p`` the parameters, ``zᵢ`` refers - `bases`: `Vector` of `Pair`s mapping parameters to a `PolyChaos.AbstractOrthoPoly` representing the basis in which the parametric dependence is expanded. - `sym_basis`: `Vector` of symbolic variables representing the basis functions: ``[ζ₁, …, ζₘ]``. -- `pc_basis`: `PolyChaos.MultiOrthoPoly` representing the tensorproduct-based multi-variate basis underpinning the PCE -- `sym_to_pc`: `Dict` mapping symbolic basis variable to PolyChaos.MultiOrthoPoly index (multi-index) -- `pc_to_sym`: `Dict` mapping PolyChaos.MultiOrthoPoly index (multi-index) to symbolic basis variable +- `pc_basis`: `TensorProductOrthoPoly` representing the tensorproduct-based multi-variate basis underpinning the PCE - `ansatz`: `Vector` of `Pair`s mapping state to corresponding PCE ansatz - `moments`: `Vector` of `Vector`s carrying the moments for each state. """ @@ -33,8 +31,6 @@ struct PCE bases::Any # vector of pairs: p (symbolic variable) => polynomial basis (PolyChaos) sym_basis::Any # vector of basis functions (symbolic variables) !![indexing as generated by PolyChaos]!! pc_basis::Any # polychaos basis object - sym_to_pc::Any # dictionary mapping symbolic to pc basis - pc_to_sym::Any # dictionary mapping pc to symbolic basis ansatz::Any # vector of pairs: x(t,p) => ∑ᵢ zᵢ(t)ζᵢ(p) moments::Any # symbolic variables: zᵢ(t) end @@ -61,9 +57,6 @@ function PCE(states, bases::AbstractVector{<:Pair}) @variables ζ(parameters...)[1:n_basis] sym_basis = collect(ζ) - sym_to_pc = Dict(ζ[i] => pc_basis.ind[i, :] for i in eachindex(ζ)) - pc_to_sym = Dict(val => key for (val, key) in sym_to_pc) - moments = Vector{Num}[] for (i, state) in enumerate(collect(states)) ind_vars = get_independent_vars(state) @@ -73,8 +66,7 @@ function PCE(states, bases::AbstractVector{<:Pair}) end ansatz = [states[i] => sum(moments[i][j] * sym_basis[j] for j in 1:n_basis) for i in 1:n_states] - return PCE(states, parameters, bases, sym_basis, pc_basis, sym_to_pc, - pc_to_sym, ansatz, moments) + return PCE(states, parameters, bases, sym_basis, pc_basis, ansatz, moments) end function (pce::PCE)(moment_vals, parameter_vals::AbstractVector) basis = evaluate(parameter_vals, pce.pc_basis) From 3f9f42f98207a87eb382cefdb78b3c599835a42a Mon Sep 17 00:00:00 2001 From: FHoltorf <32248677+FHoltorf@users.noreply.github.com> Date: Sun, 16 Oct 2022 22:34:06 -0400 Subject: [PATCH 52/62] rename bases => uni_basis, pc_basis => tensor_basis and added some type information --- src/PCE/PCE.jl | 56 +++++++++++++++++++++++------------------------- test/PCETests.jl | 6 +++--- 2 files changed, 30 insertions(+), 32 deletions(-) diff --git a/src/PCE/PCE.jl b/src/PCE/PCE.jl index 05304a3..55fc3c9 100644 --- a/src/PCE/PCE.jl +++ b/src/PCE/PCE.jl @@ -18,21 +18,21 @@ Here ``x`` denotes the states of the PCE, ``p`` the parameters, ``zᵢ`` refers # Fields - `states`: Vector of states (symbolic variables) representing the state of the PCE. - `parameters`: `Vector` of parameters (symbolic variables) being expanded. -- `bases`: `Vector` of `Pair`s mapping parameters to a `PolyChaos.AbstractOrthoPoly` representing - the basis in which the parametric dependence is expanded. +- `uni_basis`: `Vector` of `Pair`s mapping parameters to a `PolyChaos.AbstractOrthoPoly` representing + the basis in which the parametric dependence is expanded. +- `tensor_basis`: `TensorProductOrthoPoly` representing the tensorproduct-based multi-variate basis underpinning the PCE - `sym_basis`: `Vector` of symbolic variables representing the basis functions: ``[ζ₁, …, ζₘ]``. -- `pc_basis`: `TensorProductOrthoPoly` representing the tensorproduct-based multi-variate basis underpinning the PCE - `ansatz`: `Vector` of `Pair`s mapping state to corresponding PCE ansatz - `moments`: `Vector` of `Vector`s carrying the moments for each state. """ struct PCE - states::Any # states - parameters::Any # vector of parameters being expanded - bases::Any # vector of pairs: p (symbolic variable) => polynomial basis (PolyChaos) - sym_basis::Any # vector of basis functions (symbolic variables) !![indexing as generated by PolyChaos]!! - pc_basis::Any # polychaos basis object - ansatz::Any # vector of pairs: x(t,p) => ∑ᵢ zᵢ(t)ζᵢ(p) - moments::Any # symbolic variables: zᵢ(t) + states::Vector{<:Num} + parameters::Vector{<:Num} + uni_basis::Vector{Pair{<:Num, <:Union{AbstractOrthoPoly, AbstractCanonicalOrthoPoly}}} + tensor_basis::TensorProductOrthoPoly + sym_basis::Vector{<:Num} + ansatz::Vector{Pair{<:Num, <:Num}} + moments::Vector{Vector{<:Num}} end """ @@ -41,17 +41,17 @@ $(SIGNATURES) Create `PCE` object from a `Vector` of states (symbolic variables) and a `Vector` of `Pair`s mapping the parameters to the corresponding `PolyChaos.AbstractOrthoPoly` basis used for expansion. """ -function PCE(states, bases::AbstractVector{<:Pair}) +function PCE(states, uni_basis::AbstractVector{<:Pair}) # to deal with symbolic arrays states = collect(states) - parameters = [p for (p, op) in bases] - ops = [op for (p, op) in bases] + parameters = [p for (p, op) in uni_basis] + ops = [op for (p, op) in uni_basis] @assert all(deg(op) > 0 for op in ops) "Every basis considered must at least include the linear function" - pc_basis = TensorProductOrthoPoly(ops) - n_basis = size(pc_basis.ind, 1) + tensor_basis = TensorProductOrthoPoly(ops) + n_basis = size(tensor_basis.ind, 1) n_states = length(states) @variables ζ(parameters...)[1:n_basis] @@ -66,10 +66,10 @@ function PCE(states, bases::AbstractVector{<:Pair}) end ansatz = [states[i] => sum(moments[i][j] * sym_basis[j] for j in 1:n_basis) for i in 1:n_states] - return PCE(states, parameters, bases, sym_basis, pc_basis, ansatz, moments) + return PCE(states, parameters, uni_basis, tensor_basis, sym_basis, ansatz, moments) end function (pce::PCE)(moment_vals, parameter_vals::AbstractVector) - basis = evaluate(parameter_vals, pce.pc_basis) + basis = evaluate(parameter_vals, pce.tensor_basis) return [dot(moments, basis) for moments in moment_vals] end @@ -82,8 +82,8 @@ Generate linear PCEs for the uncertain parameters. function generate_parameter_pce(pce::PCE) par_dim = length(pce.parameters) par_pce = Vector{Pair{eltype(pce.parameters), eltype(pce.sym_basis)}}(undef, par_dim) - for (i, bases) in enumerate(pce.bases) - p, op = bases + for (i, basis) in enumerate(pce.uni_basis) + p, op = basis par_pce[i] = p => pce.sym_basis[i + 1] + op.α[1] end return par_pce @@ -147,19 +147,17 @@ Evaluate scalar products between all basis functions in `pce` and basis monomials as characterized by `mono_indices`. """ function eval_scalar_products(mono_indices, pce::PCE) - uni_degs = [deg(op) for op in pce.pc_basis.uni] + uni_degs = [deg(op) for op in pce.tensor_basis.uni] max_degs = uni_degs for (mono, id) in mono_indices - max_degs = max.(max_degs, vec(sum(pce.pc_basis.ind[id .+ 1, :], dims = 1))) + max_degs = max.(max_degs, vec(sum(pce.tensor_basis.ind[id .+ 1, :], dims = 1))) end - println(max_degs) - println(typeof(max_degs)) quad_deg = max.(ceil.(Int, 0.5 * (max_degs + uni_degs .+ 1))) - integrators = map((uni, deg) -> bump_degree(uni, deg), pce.pc_basis.uni, quad_deg) + integrators = map((uni, deg) -> bump_degree(uni, deg), pce.tensor_basis.uni, quad_deg) scalar_products = Dict() - for k in 1:dim(pce.pc_basis) - scalar_products[k] = Dict(mono => computeSP(vcat(id, k - 1), pce.pc_basis, + for k in 1:dim(pce.tensor_basis) + scalar_products[k] = Dict(mono => computeSP(vcat(id, k - 1), pce.tensor_basis, integrators) for (mono, id) in mono_indices) end @@ -176,10 +174,10 @@ basis monomials to coefficients. function galerkin_projection(bm_coeffs::Vector{<:Dict}, scalar_products::Dict, pce::PCE) projected_eqs = [] - scaling_factors = computeSP2(pce.pc_basis) + scaling_factors = computeSP2(pce.tensor_basis) for i in eachindex(bm_coeffs) eqs = [] - for k in 1:dim(pce.pc_basis) + for k in 1:dim(pce.tensor_basis) push!(eqs, sum(bm_coeffs[i][mono] * scalar_products[k][mono] for mono in keys(bm_coeffs[i]))) @@ -222,7 +220,7 @@ function moment_equations(sys::ODESystem, pce::PCE) pce_system = ODESystem([D(moments[i]) ~ moment_eqs[i] for i in eachindex(moments)], iv, moments, params, name = name) - n_moments = dim(pce.pc_basis) + n_moments = dim(pce.tensor_basis) n_states = length(states(sys)) pce_eval = function (moment_vals, parameter_values) shape_state = [moment_vals[(i * n_moments + 1):((i + 1) * n_moments)] diff --git a/test/PCETests.jl b/test/PCETests.jl index 3ed0d77..d3bcf83 100644 --- a/test/PCETests.jl +++ b/test/PCETests.jl @@ -206,16 +206,16 @@ end @testset "PCE: galerkin projection test" begin moment_eqs = MOR.pce_galerkin(eq, pce) - integrator = map((uni, deg) -> MOR.bump_degree(uni, deg), pce.pc_basis.uni, + integrator = map((uni, deg) -> MOR.bump_degree(uni, deg), pce.tensor_basis.uni, [n + 1, n + 1]) true_moment_eqs = Num[] - scaling_factor = computeSP2(pce.pc_basis) + scaling_factor = computeSP2(pce.tensor_basis) for j in 0:n mom_eq = 0.0 for mono in keys(basis_indices) ind = basis_indices[mono][2] - c = computeSP(vcat(ind, j), pce.pc_basis, integrator) + c = computeSP(vcat(ind, j), pce.tensor_basis, integrator) mom_eq += c * coeffs[mono] end push!(true_moment_eqs, 1 / scaling_factor[j + 1] * mom_eq) From 8e2773e96096d60f1acee2996fd745b9765c9f45 Mon Sep 17 00:00:00 2001 From: FHoltorf <32248677+FHoltorf@users.noreply.github.com> Date: Sun, 16 Oct 2022 22:35:00 -0400 Subject: [PATCH 53/62] SciML format --- src/PCE/PCE.jl | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/PCE/PCE.jl b/src/PCE/PCE.jl index 55fc3c9..fbe1010 100644 --- a/src/PCE/PCE.jl +++ b/src/PCE/PCE.jl @@ -26,13 +26,13 @@ Here ``x`` denotes the states of the PCE, ``p`` the parameters, ``zᵢ`` refers - `moments`: `Vector` of `Vector`s carrying the moments for each state. """ struct PCE - states::Vector{<:Num} - parameters::Vector{<:Num} + states::Vector{<:Num} + parameters::Vector{<:Num} uni_basis::Vector{Pair{<:Num, <:Union{AbstractOrthoPoly, AbstractCanonicalOrthoPoly}}} - tensor_basis::TensorProductOrthoPoly - sym_basis::Vector{<:Num} + tensor_basis::TensorProductOrthoPoly + sym_basis::Vector{<:Num} ansatz::Vector{Pair{<:Num, <:Num}} - moments::Vector{Vector{<:Num}} + moments::Vector{Vector{<:Num}} end """ From d582ccf43b8b605f49f56608b37754d8d41b1a6c Mon Sep 17 00:00:00 2001 From: FHoltorf <32248677+FHoltorf@users.noreply.github.com> Date: Sun, 16 Oct 2022 23:02:45 -0400 Subject: [PATCH 54/62] adjust tutorial for new field names --- examples/PCE/tutorial.jl | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/examples/PCE/tutorial.jl b/examples/PCE/tutorial.jl index 2eaf187..e2bc391 100644 --- a/examples/PCE/tutorial.jl +++ b/examples/PCE/tutorial.jl @@ -1,4 +1,5 @@ -using ModelOrderReduction, Plots, ModelingToolkit, DifferentialEquations, PolyChaos +using ModelOrderReduction, ModelingToolkit, DifferentialEquations, + PolyChaos, Plots, LinearAlgebra # Reaction system # k[1](1+θ[1]/2)/k[2]: A + B ⇌ C @@ -94,7 +95,7 @@ var_solution = mean([sol .^ 2 for sol in sols]) - mean_solution .^ 2 L = length(pce.sym_basis) mean_PCE = [[moment_sol(t)[((i - 1) * L + 1):(i * L)][1] for i in 1:4] for t in t_range] -var_weightings = computeSP2(pce.pc_basis) +var_weightings = computeSP2(pce.tensor_basis) var_PCE = [[dot(moment_sol(t)[((i - 1) * L + 1):(i * L)] .^ 2, var_weightings) for i in 1:4] for t in t_range] .- [m .^ 2 for m in mean_PCE] From a2ca3d87c00530eb752861cb98d81529ec57f944 Mon Sep 17 00:00:00 2001 From: FHoltorf <32248677+FHoltorf@users.noreply.github.com> Date: Sun, 16 Oct 2022 23:05:33 -0400 Subject: [PATCH 55/62] SciML format again ... --- examples/PCE/tutorial.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/PCE/tutorial.jl b/examples/PCE/tutorial.jl index e2bc391..93eff3a 100644 --- a/examples/PCE/tutorial.jl +++ b/examples/PCE/tutorial.jl @@ -1,4 +1,4 @@ -using ModelOrderReduction, ModelingToolkit, DifferentialEquations, +using ModelOrderReduction, ModelingToolkit, DifferentialEquations, PolyChaos, Plots, LinearAlgebra # Reaction system From 3383d42449fc57b28e85c23aaf2c6b2ff4d894c4 Mon Sep 17 00:00:00 2001 From: "Bowen S. Zhu" Date: Wed, 26 Oct 2022 00:23:59 -0400 Subject: [PATCH 56/62] Fix typo "and" -> "an" --- examples/PCE/tutorial.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/PCE/tutorial.md b/examples/PCE/tutorial.md index c0119ba..a212c6a 100644 --- a/examples/PCE/tutorial.md +++ b/examples/PCE/tutorial.md @@ -80,7 +80,7 @@ d_pce = 3 pce = PCE(c, [θ[i] => Uniform_11OrthoPoly(d_pce) for i in eachindex(θ)]) ``` -Next, we are constructing the corresponding moment equations via a simple function call of `moment_equations`. This function returns and `MTK.ODESystem` describing the deterministic evolution equation of the PCE moments and a function that maps the state of this model via the PCE Ansatz back to the original model state (in this example, the concentration of the different species). +Next, we are constructing the corresponding moment equations via a simple function call of `moment_equations`. This function returns an `MTK.ODESystem` describing the deterministic evolution equation of the PCE moments and a function that maps the state of this model via the PCE Ansatz back to the original model state (in this example, the concentration of the different species). ``` moment_eqs, pce_eval = moment_equations(reactor_model, pce) ``` From 892b261df48ea695d17753f9cfcf4509b8c317e4 Mon Sep 17 00:00:00 2001 From: "Bowen S. Zhu" Date: Wed, 26 Oct 2022 00:25:12 -0400 Subject: [PATCH 57/62] Change MTK to fullname in case the abbreviation is unknown for new users --- examples/PCE/tutorial.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/PCE/tutorial.md b/examples/PCE/tutorial.md index a212c6a..8c1dc36 100644 --- a/examples/PCE/tutorial.md +++ b/examples/PCE/tutorial.md @@ -80,7 +80,7 @@ d_pce = 3 pce = PCE(c, [θ[i] => Uniform_11OrthoPoly(d_pce) for i in eachindex(θ)]) ``` -Next, we are constructing the corresponding moment equations via a simple function call of `moment_equations`. This function returns an `MTK.ODESystem` describing the deterministic evolution equation of the PCE moments and a function that maps the state of this model via the PCE Ansatz back to the original model state (in this example, the concentration of the different species). +Next, we are constructing the corresponding moment equations via a simple function call of `moment_equations`. This function returns an `ModelingToolkit.ODESystem` describing the deterministic evolution equation of the PCE moments and a function that maps the state of this model via the PCE Ansatz back to the original model state (in this example, the concentration of the different species). ``` moment_eqs, pce_eval = moment_equations(reactor_model, pce) ``` From bf1addbad8250839eec06533ed0e75319bf4b311 Mon Sep 17 00:00:00 2001 From: "Bowen S. Zhu" Date: Wed, 26 Oct 2022 01:04:06 -0400 Subject: [PATCH 58/62] Change to use `Symbolics.variables` to create an array of symbolic vars --- src/PCE/PCE.jl | 10 +++++++--- src/PCE/PCE_utils.jl | 16 +++++----------- 2 files changed, 12 insertions(+), 14 deletions(-) diff --git a/src/PCE/PCE.jl b/src/PCE/PCE.jl index fbe1010..4a8df03 100644 --- a/src/PCE/PCE.jl +++ b/src/PCE/PCE.jl @@ -60,9 +60,13 @@ function PCE(states, uni_basis::AbstractVector{<:Pair}) moments = Vector{Num}[] for (i, state) in enumerate(collect(states)) ind_vars = get_independent_vars(state) - create_var = isempty(ind_vars) ? name -> (@variables $(name))[1] : - name -> (@variables $(name)(ind_vars...))[1] - push!(moments, [create_var(moment_name(i, j)) for j in 1:n_basis]) + new_vars = if isempty(ind_vars) + Symbolics.variables(:z, i:i, 1:n_basis) + else + map(z -> z(ind_vars...), + Symbolics.variables(:z, i:i, 1:n_basis; T = Symbolics.FnType)) + end + push!(moments, vec(new_vars)) end ansatz = [states[i] => sum(moments[i][j] * sym_basis[j] for j in 1:n_basis) for i in 1:n_states] diff --git a/src/PCE/PCE_utils.jl b/src/PCE/PCE_utils.jl index 0e0440a..a8f4c24 100644 --- a/src/PCE/PCE_utils.jl +++ b/src/PCE/PCE_utils.jl @@ -1,11 +1,5 @@ import PolyChaos: computeSP2, computeSP, dim, deg -# moment names -function moment_name(i, j) - return Symbol("z" * Symbolics.map_subscripts(i) * - "₋" * Symbolics.map_subscripts(j)) -end - # getting independent variables function get_independent_vars(var) return [] @@ -109,7 +103,7 @@ end """ `TensorProductOrthoPoly` objects represent bases formed as the tensor product of univariate `PolyChaos.AbstractOrthoPoly` bases. -By default the basis elements of the tensor product are restricted to polynomials with total degree up to the maximum degree among the +By default the basis elements of the tensor product are restricted to polynomials with total degree up to the maximum degree among the univariate bases. This maximum degree can be manually specified, however. """ struct TensorProductOrthoPoly{M, U} @@ -149,8 +143,8 @@ end """ $(TYPEDSIGNATURES) -computes inner product between basis functions of a `TensorProductOrthoPoly` via -`PolyChaos`'s infrastructure (exploiting the tensor product form). +computes inner product between basis functions of a `TensorProductOrthoPoly` via +`PolyChaos`'s infrastructure (exploiting the tensor product form). """ function computeSP(basis_fxns, tpop::TensorProductOrthoPoly, integrators = tpop.uni) @@ -195,8 +189,8 @@ end """ $(TYPEDSIGNATURES) -Compute the an ascending list of `n`-dimensional multi-indices with fixed `grade` (= sum of entries) -in graded reverse lexicographic order. Constraints on the degrees considered can be incorporated. +Compute the an ascending list of `n`-dimensional multi-indices with fixed `grade` (= sum of entries) +in graded reverse lexicographic order. Constraints on the degrees considered can be incorporated. """ function grevlex(n::Int, grade::Int) if n == 1 From 36652c8d2ae801e030b277b248d1bbe256010bb2 Mon Sep 17 00:00:00 2001 From: "Bowen S. Zhu" Date: Wed, 26 Oct 2022 01:09:22 -0400 Subject: [PATCH 59/62] Resolve `independent_variables` deprecated warning --- src/PCE/PCE.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/PCE/PCE.jl b/src/PCE/PCE.jl index fbe1010..722502d 100644 --- a/src/PCE/PCE.jl +++ b/src/PCE/PCE.jl @@ -212,7 +212,7 @@ function moment_equations(sys::ODESystem, pce::PCE) eqs = [eq.rhs for eq in equations(sys)] projected_eqs = pce_galerkin(eqs, pce) moment_eqs = reduce(vcat, projected_eqs) - iv = independent_variable(sys) + iv = ModelingToolkit.get_iv(sys) params = setdiff(parameters(sys), pce.parameters) D = Differential(iv) moments = reduce(vcat, pce.moments) From 2ff63791a8683e357d54d9d38c41327dcc49dd3a Mon Sep 17 00:00:00 2001 From: "Bowen S. Zhu" Date: Wed, 26 Oct 2022 01:31:24 -0400 Subject: [PATCH 60/62] Generate code of `bump_degree` for AbstractOrthoPoly subtypes --- src/PCE/PCE_utils.jl | 71 +++++--------------------------------------- 1 file changed, 8 insertions(+), 63 deletions(-) diff --git a/src/PCE/PCE_utils.jl b/src/PCE/PCE_utils.jl index 0e0440a..ceac43f 100644 --- a/src/PCE/PCE_utils.jl +++ b/src/PCE/PCE_utils.jl @@ -292,69 +292,14 @@ function bump_degree(op::OrthoPoly, deg::Int) return OrthoPoly(op.name, deg, op.measure) end -function bump_degree(op::JacobiOrthoPoly, deg::Int) - ps = measure_parameters(op.measure) - return JacobiOrthoPoly(deg, ps...) -end - -function bump_degree(op::genLaguerreOrthoPoly, deg::Int) - ps = measure_parameters(op.measure) - return genLaguerreOrthoPoly(deg, ps...) -end - -function bump_degree(op::MeixnerPollaczekOrthoPoly, deg::Int) - ps = measure_parameters(op.measure) - return MeixnerPollaczekOrthoPoly(deg, ps...) -end - -function bump_degree(op::Beta01OrthoPoly, deg::Int) - ps = measure_parameters(op.measure) - return Beta01OrthoPoly(deg, ps...) -end - -function bump_degree(op::GammaOrthoPoly, deg::Int) - ps = measure_parameters(op.measure) - return GammaOrthoPoly(deg, ps...) -end - -function bump_degree(op::genHermiteOrthoPoly, deg::Int) - ps = measure_parameters(op.measure) - return genHermiteOrthoPoly(deg, ps...) -end - -function bump_degree(op::HermiteOrthoPoly, deg::Int) - ps = measure_parameters(op.measure) - return HermiteOrthoPoly(deg, ps...) -end - -function bump_degree(op::LaguerreOrthoPoly, deg::Int) - ps = measure_parameters(op.measure) - return LaguerreOrthoPoly(deg, ps...) -end - -function bump_degree(op::Uniform01OrthoPoly, deg::Int) - ps = measure_parameters(op.measure) - return Uniform01OrthoPoly(deg, ps...) -end - -function bump_degree(op::Uniform_11OrthoPoly, deg::Int) - ps = measure_parameters(op.measure) - return Uniform_11OrthoPoly(deg, ps...) -end - -function bump_degree(op::GaussOrthoPoly, deg::Int) - ps = measure_parameters(op.measure) - return GaussOrthoPoly(deg, ps...) -end - -function bump_degree(op::LegendreOrthoPoly, deg::Int) - ps = measure_parameters(op.measure) - return LegendreOrthoPoly(deg, ps...) -end - -function bump_degree(op::LogisticOrthoPoly, deg::Int) - ps = measure_parameters(op.measure) - return LogisticOrthoPoly(deg, ps...) +for OrthoPolyT in (JacobiOrthoPoly, genLaguerreOrthoPoly, MeixnerPollaczekOrthoPoly, + Beta01OrthoPoly, GammaOrthoPoly, genHermiteOrthoPoly, HermiteOrthoPoly, + LaguerreOrthoPoly, Uniform01OrthoPoly, Uniform_11OrthoPoly, + GaussOrthoPoly, LegendreOrthoPoly, LogisticOrthoPoly) + @eval begin function bump_degree(op::$OrthoPolyT, deg::Integer) + ps = measure_parameters(op.measure) + return $OrthoPolyT(deg, ps...) + end end end function bump_degree(op::MultiOrthoPoly, deg::Int) From 6b453086b42f25a6b2b8a8fafbb745c5eef4913c Mon Sep 17 00:00:00 2001 From: "Bowen S. Zhu" Date: Wed, 26 Oct 2022 01:32:37 -0400 Subject: [PATCH 61/62] Remove unnecessary import in runtests.jl --- test/runtests.jl | 3 --- 1 file changed, 3 deletions(-) diff --git a/test/runtests.jl b/test/runtests.jl index 6bdcf97..905e8fe 100644 --- a/test/runtests.jl +++ b/test/runtests.jl @@ -1,6 +1,3 @@ -using ModelOrderReduction - -#---------- Model Reduction ----------------# using SafeTestsets @safetestset "POD" begin include("DataReduction.jl") end @safetestset "utils" begin include("utils.jl") end From 1912a9d1e47bb68b496554ba2babd50588d0bf4b Mon Sep 17 00:00:00 2001 From: "Bowen S. Zhu" Date: Wed, 26 Oct 2022 01:34:54 -0400 Subject: [PATCH 62/62] Remove unused type variable --- src/PCE/PCE_utils.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/PCE/PCE_utils.jl b/src/PCE/PCE_utils.jl index 0e0440a..db59ae9 100644 --- a/src/PCE/PCE_utils.jl +++ b/src/PCE/PCE_utils.jl @@ -10,7 +10,7 @@ end function get_independent_vars(var) return [] end -function get_independent_vars(var::Symbolics.Term) where {T} +function get_independent_vars(var::Symbolics.Term) if operation(var) isa Symbolics.Sym return arguments(var) else