From 3653ec2cce507bd4076d379207952e33e9c53aed Mon Sep 17 00:00:00 2001 From: Marco Galliani <105008364+marcogalliani@users.noreply.github.com> Date: Mon, 27 Oct 2025 12:20:11 +0100 Subject: [PATCH 1/5] bugfix: correct dof computation for fpca_direct --- fdaPDE/src/models/fpca.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fdaPDE/src/models/fpca.h b/fdaPDE/src/models/fpca.h index 2036524b..10257ab3 100644 --- a/fdaPDE/src/models/fpca.h +++ b/fdaPDE/src/models/fpca.h @@ -371,7 +371,7 @@ template class fpca_direct_impl { double gcv_(const matrix_t& X, int rank, const LambdaT lambda, int flag) { const auto& [F, S] = solve_(X, rank, lambda, flag); // evaluate GCV index at convergence (note that Tr[S] = \|D^(-1)\|_F^2) - int dor = n_locs_ - invD_.squaredNorm(); + int dor = n_locs_ - (invD_*smoother_->Psi().transpose()).squaredNorm(); return (n_locs_ / std::pow(dor, 2)) * (X.transpose() * S - (smoother_->Psi() * F)).squaredNorm(); } int n_locs_ = 0, n_units_ = 0, n_dofs_ = 0; From d4020fa23330cca6e5aefab0998b407a74f9c933 Mon Sep 17 00:00:00 2001 From: AlePalu Date: Sun, 8 Feb 2026 20:06:58 +0100 Subject: [PATCH 2/5] bug fix: fpca unable to accept vector of smoothing parameters --- fdaPDE/src/models/fpca.h | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/fdaPDE/src/models/fpca.h b/fdaPDE/src/models/fpca.h index 761dd538..5ef57a9e 100644 --- a/fdaPDE/src/models/fpca.h +++ b/fdaPDE/src/models/fpca.h @@ -77,7 +77,8 @@ template class fpca_power_iteration_impl { case OptimizeGCV: { auto gcv_functor = [&](auto lambda) { return gcv_(X, lambda, V.col(i)); }; GridSearch optimizer; - opt_lambda = optimizer.optimize(gcv_functor, lambda_grid); + auto opt_ = optimizer.optimize(gcv_functor, lambda_grid); + for (int i = 0; i < n_lambda; ++i) { opt_lambda[i] = opt_[i]; } } break; case OptimizeMSRE: { } break; @@ -134,10 +135,12 @@ template class fpca_power_iteration_impl { double gcv_(const matrix_t& X, const LambdaT lambda, const InitT& f0) { const auto& [f, s] = solve_(X, lambda, f0); // evaluate GCV index at convergence - if (edf_map_.find(lambda) == edf_map_.end()) { // cache Tr[S] - edf_map_[lambda] = smoother_->edf(); + std::array lambda_; + for (int i = 0; i < n_lambda; ++i) { lambda_[i] = lambda[i]; } + if (edf_map_.find(lambda_) == edf_map_.end()) { // cache Tr[S] + edf_map_[lambda_] = smoother_->edf(); } - int dor = n_locs_ - edf_map_.at(lambda); + int dor = n_locs_ - edf_map_.at(lambda_); return (n_locs_ / std::pow(dor, 2)) * ((smoother_->Psi() * f) - smoother_->response()).squaredNorm(); } std::unordered_map, double, internals::std_array_hash> edf_map_; @@ -197,7 +200,8 @@ template class fpca_subspace_iteration_impl { case OptimizeGCV: { auto gcv_functor = [&](auto lambda) { return gcv_(X, rank, lambda, V); }; GridSearch optimizer; - opt_lambda = optimizer.optimize(gcv_functor, lambda_grid); + auto opt_ = optimizer.optimize(gcv_functor, lambda_grid); + for (int i = 0; i < n_lambda; ++i) { opt_lambda[i] = opt_[i]; } } break; case OptimizeMSRE: { } break; @@ -311,7 +315,8 @@ template class fpca_direct_impl { case OptimizeGCV: { auto gcv_functor = [&](auto lambda) { return gcv_(X, rank, lambda, flag); }; GridSearch optimizer; - opt_lambda = optimizer.optimize(gcv_functor, lambda_grid); + auto opt_ = optimizer.optimize(gcv_functor, lambda_grid); + for (int i = 0; i < n_lambda; ++i) { opt_lambda[i] = opt_[i]; } } break; case OptimizeMSRE: { } break; From fa20b6ec1646f7de3f33e6db4919b6b21d21ae6d Mon Sep 17 00:00:00 2001 From: Marco Galliani <105008364+marcogalliani@users.noreply.github.com> Date: Wed, 17 Jun 2026 16:02:43 +0200 Subject: [PATCH 3/5] chore: point submodule to my fork. --- .gitignore | 2 ++ .gitmodules | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 174f8247..2bd819eb 100644 --- a/.gitignore +++ b/.gitignore @@ -30,3 +30,5 @@ cmake-build-debug/ #docs files *.puml .Rproj.user + +experiments/ \ No newline at end of file diff --git a/.gitmodules b/.gitmodules index ce546b35..f96e5a93 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,4 +1,4 @@ [submodule "fdaPDE/core"] path = fdaPDE/core - url = https://github.com/fdaPDE/fdaPDE-core + url = https://github.com/marcogalliani/fdaPDE-core branch = stable From 0120619d7bad51a6336e361e269cbaf9077997ac Mon Sep 17 00:00:00 2001 From: Marco Galliani <105008364+marcogalliani@users.noreply.github.com> Date: Wed, 17 Jun 2026 17:39:35 +0200 Subject: [PATCH 4/5] chore: update submodule reference to latest commit --- fdaPDE/core | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fdaPDE/core b/fdaPDE/core index a2a9c88b..fad5a767 160000 --- a/fdaPDE/core +++ b/fdaPDE/core @@ -1 +1 @@ -Subproject commit a2a9c88b203b6f1b74bbc71d698f131f839f25ba +Subproject commit fad5a7673ad249d8f762e858059b34419c807738 From 8a0341bc2b39989f43ba29e4978d6854913231ed Mon Sep 17 00:00:00 2001 From: Marco Galliani <105008364+marcogalliani@users.noreply.github.com> Date: Thu, 18 Jun 2026 03:35:44 +0200 Subject: [PATCH 5/5] core updates. --- fdaPDE/core | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fdaPDE/core b/fdaPDE/core index fad5a767..f1a90ebf 160000 --- a/fdaPDE/core +++ b/fdaPDE/core @@ -1 +1 @@ -Subproject commit fad5a7673ad249d8f762e858059b34419c807738 +Subproject commit f1a90ebffc41c9eefa8d4df7291254ab256414f4