Skip to content

Commit 94f124b

Browse files
Alexey Stukalovalyst
authored andcommitted
RAMSymbolic: calc (I-A)^{-1} once
1 parent 4c06582 commit 94f124b

1 file changed

Lines changed: 20 additions & 20 deletions

File tree

src/imply/RAM/symbolic.jl

Lines changed: 20 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -111,8 +111,10 @@ function RAMSymbolic(;
111111
vech = true
112112
end
113113

114+
I_A⁻¹ = neumann_series(A)
115+
114116
# Σ
115-
Σ_symbolic = get_Σ_symbolic_RAM(S, A, F; vech = vech)
117+
Σ_symbolic = eval_Σ_symbolic(S, I_A⁻¹, F; vech = vech)
116118
#print(Symbolics.build_function(Σ_symbolic)[2])
117119
Σ_function = Symbolics.build_function(Σ_symbolic, par, expression = Val{false})[2]
118120
Σ = zeros(size(Σ_symbolic))
@@ -153,7 +155,7 @@ function RAMSymbolic(;
153155
# μ
154156
if meanstructure
155157
MS = HasMeanStructure
156-
μ_symbolic = get_μ_symbolic_RAM(M, A, F)
158+
μ_symbolic = eval_μ_symbolic(M, I_A⁻¹, F)
157159
μ_function = Symbolics.build_function(μ_symbolic, par, expression = Val{false})[2]
158160
μ = zeros(size(μ_symbolic))
159161
if gradient
@@ -233,26 +235,24 @@ end
233235
### additional functions
234236
############################################################################################
235237

236-
function get_Σ_symbolic_RAM(S, A, F; vech = false)
237-
invia = neumann_series(A)
238-
Σ_symbolic = F * invia * S * permutedims(invia) * permutedims(F)
239-
Σ_symbolic = Array(Σ_symbolic)
240-
# Σ_symbolic = Symbolics.simplify.(Σ_symbolic)
241-
if vech
242-
Σ_symbolic = Σ_symbolic[tril(trues(size(F, 1), size(F, 1)))]
243-
end
244-
Threads.@threads for i in eachindex(Σ_symbolic)
245-
Σ_symbolic[i] = Symbolics.simplify(Σ_symbolic[i])
238+
# expected covariations of observed vars
239+
function eval_Σ_symbolic(S, I_A⁻¹, F; vech = false)
240+
Σ = F * I_A⁻¹ * S * permutedims(I_A⁻¹) * permutedims(F)
241+
Σ = Array(Σ)
242+
vech &&= Σ[tril(trues(size(F, 1), size(F, 1)))])
243+
# Σ = Symbolics.simplify.(Σ)
244+
Threads.@threads for i in eachindex(Σ)
245+
Σ[i] = Symbolics.simplify(Σ[i])
246246
end
247-
return Σ_symbolic
247+
return Σ
248248
end
249249

250-
function get_μ_symbolic_RAM(M, A, F)
251-
invia = neumann_series(A)
252-
μ_symbolic = F * invia * M
253-
μ_symbolic = Array(μ_symbolic)
254-
Threads.@threads for i in eachindex(μ_symbolic)
255-
μ_symbolic[i] = Symbolics.simplify(μ_symbolic[i])
250+
# expected means of observed vars
251+
function eval_μ_symbolic(M, I_A⁻¹, F)
252+
μ = F * I_A⁻¹ * M
253+
μ = Array(μ)
254+
Threads.@threads for i in eachindex(μ)
255+
μ[i] = Symbolics.simplify(μ[i])
256256
end
257-
return μ_symbolic
257+
return μ
258258
end

0 commit comments

Comments
 (0)