Skip to content

Commit d4020fa

Browse files
committed
bug fix: fpca unable to accept vector of smoothing parameters
1 parent 9c6dc1b commit d4020fa

File tree

1 file changed

+11
-6
lines changed

1 file changed

+11
-6
lines changed

fdaPDE/src/models/fpca.h

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)