@@ -77,7 +77,8 @@ template <typename VariationalSolver> class fpca_power_iteration_impl {
7777 case OptimizeGCV: {
7878 auto gcv_functor = [&](auto lambda) { return gcv_ (X, lambda, V.col (i)); };
7979 GridSearch<n_lambda> optimizer;
80- opt_lambda = optimizer.optimize (gcv_functor, lambda_grid);
80+ auto opt_ = optimizer.optimize (gcv_functor, lambda_grid);
81+ for (int i = 0 ; i < n_lambda; ++i) { opt_lambda[i] = opt_[i]; }
8182 } break ;
8283 case OptimizeMSRE: {
8384 } break ;
@@ -134,10 +135,12 @@ template <typename VariationalSolver> class fpca_power_iteration_impl {
134135 double gcv_ (const matrix_t & X, const LambdaT lambda, const InitT& f0) {
135136 const auto & [f, s] = solve_ (X, lambda, f0);
136137 // evaluate GCV index at convergence
137- if (edf_map_.find (lambda) == edf_map_.end ()) { // cache Tr[S]
138- edf_map_[lambda] = smoother_->edf ();
138+ std::array<double , n_lambda> lambda_;
139+ for (int i = 0 ; i < n_lambda; ++i) { lambda_[i] = lambda[i]; }
140+ if (edf_map_.find (lambda_) == edf_map_.end ()) { // cache Tr[S]
141+ edf_map_[lambda_] = smoother_->edf ();
139142 }
140- int dor = n_locs_ - edf_map_.at (lambda );
143+ int dor = n_locs_ - edf_map_.at (lambda_ );
141144 return (n_locs_ / std::pow (dor, 2 )) * ((smoother_->Psi () * f) - smoother_->response ()).squaredNorm ();
142145 }
143146 std::unordered_map<std::array<double , n_lambda>, double , internals::std_array_hash<double , n_lambda>> edf_map_;
@@ -197,7 +200,8 @@ template <typename VariationalSolver> class fpca_subspace_iteration_impl {
197200 case OptimizeGCV: {
198201 auto gcv_functor = [&](auto lambda) { return gcv_ (X, rank, lambda, V); };
199202 GridSearch<n_lambda> optimizer;
200- opt_lambda = optimizer.optimize (gcv_functor, lambda_grid);
203+ auto opt_ = optimizer.optimize (gcv_functor, lambda_grid);
204+ for (int i = 0 ; i < n_lambda; ++i) { opt_lambda[i] = opt_[i]; }
201205 } break ;
202206 case OptimizeMSRE: {
203207 } break ;
@@ -311,7 +315,8 @@ template <typename VariationalSolver> class fpca_direct_impl {
311315 case OptimizeGCV: {
312316 auto gcv_functor = [&](auto lambda) { return gcv_ (X, rank, lambda, flag); };
313317 GridSearch<n_lambda> optimizer;
314- opt_lambda = optimizer.optimize (gcv_functor, lambda_grid);
318+ auto opt_ = optimizer.optimize (gcv_functor, lambda_grid);
319+ for (int i = 0 ; i < n_lambda; ++i) { opt_lambda[i] = opt_[i]; }
315320 } break ;
316321 case OptimizeMSRE: {
317322 } break ;
0 commit comments