@@ -35,16 +35,21 @@ function inv_cov!(A::AbstractMatrix)
3535    return  inv! (A_chol)
3636end 
3737
38- function  latent_scores_operator (:: SemRegressionScores , model:: SemLoss , params:: AbstractVector ;
38+ function  latent_scores_operator (:: Type{T} , model:: SemLoss , params:: AbstractVector ;
39+                                 kwargs... 
40+ ) where  T <:  SemScoresPredictMethod 
41+     ram =  imply (model). ram_matrices
42+     latent_scores_operator (T, imply (model), materialize (ram. A, params), materialize (ram. S, params); kwargs... )
43+ end 
44+ 
45+ function  latent_scores_operator (:: SemRegressionScores , implied:: SemImply ,
46+                                 A:: AbstractMatrix , S:: AbstractMatrix ;
3947                                alpha:: Number  =  0 )
40-     implied =  imply (model)
4148    ram =  implied. ram_matrices
4249    lv_inds =  latent_var_indices (ram)
4350
44-     A =  materialize (ram. A, params)
4551    lv_FA =  ram. F *  A[:, lv_inds]
4652
47-     S =  materialize (ram. S, params)
4853    if  alpha ==  0 
4954        lv_I_A⁻¹ =  inv (I -  A)[lv_inds, :]
5055        cov_lv =  X_A_Xt (S, lv_I_A⁻¹)
@@ -56,19 +61,17 @@ function latent_scores_operator(::SemRegressionScores, model::SemLoss, params::A
5661    return  cov_lv *  lv_FA'  *  Σ⁻¹
5762end 
5863
59- function  latent_scores_operator (:: SemBartlettScores , model:: SemLoss , params:: AbstractVector ;
64+ function  latent_scores_operator (:: SemBartlettScores , implied:: SemImply ,
65+                                 A:: AbstractMatrix , S:: AbstractMatrix ;
6066                                alpha:: Number  =  0 )
61-     implied =  imply (model)
6267    ram =  implied. ram_matrices
6368    lv_inds =  latent_var_indices (ram)
64-     A =  materialize (ram. A, params)
6569    lv_FA =  ram. F *  A[:, lv_inds]
6670
67-     S =  materialize (ram. S, params)
6871    obs_inds =  observed_var_indices (ram)
6972    ov_S⁻¹ =  inv (S[obs_inds, obs_inds])
70-     lv_FA⨉ov_S⁻ =  lv_FA'  *  ov_S⁻¹
71-     cov_lv⁻¹ =  lv_FA⨉ov_S⁻ *  lv_FA
73+     lv_FA⨉ov_S⁻¹  =  lv_FA'  *  ov_S⁻¹
74+     cov_lv⁻¹ =  lv_FA⨉ov_S⁻¹  *  lv_FA
7275    (alpha !=  0 ) &&  (cov_lv +=  alpha *  I)
7376    cov_lv =  inv (cov_lv⁻¹)
7477
@@ -85,19 +88,21 @@ function predict_latent_scores(method::SemScoresPredictMethod, model::SemLoss, p
8588    (alpha <  0 ) &&  throw (ArgumentError (" The regularization parameter alpha must be non-negative" 
8689
8790    implied =  imply (model)
91+     ram =  implied. ram_matrices
8892    update! (EvaluationTargets (0.0 , nothing , nothing ), implied, params)
8993
90-     lv_scores_op =  latent_scores_operator (method, model, params; alpha)
94+     A =  materialize (ram. A, params)
95+     S =  materialize (ram. S, params)
96+     lv_inds =  latent_var_indices (ram)
97+     lv_scores_op =  latent_scores_operator (method, implied, A, S; alpha)
9198
9299    data =  data. data .-  (isnothing (data. obs_mean) ?  mean (data. data, dims= 1 ) :  data. obs_mean' )
93100    lv_scores =  data *  lv_scores_op' 
94101
102+     #  adjust the scores w.r.t the variable means
95103    if  MeanStructure (implied) ===  HasMeanStructure
96-         ram =  implied. ram_matrices
97-         lv_inds =  latent_var_indices (ram)
98-         A =  materialize (ram. A, params)
99-         lv_I_A⁻¹ =  inv (I -  A)[lv_inds, :]
100104        M =  materialize (ram. M, params)
105+         lv_I_A⁻¹ =  inv (I -  A)[lv_inds, :]
101106        lv_scores .+ =  (lv_I_A⁻¹ *  M)' 
102107    end 
103108
0 commit comments