Skip to content

Commit fe94db8

Browse files
committed
fixed default pinball smoothing factor (defaulted to non-smoothed pinball), discretize() and analyze_data() steps in fe_de_elliptic
1 parent f9a7000 commit fe94db8

File tree

3 files changed

+26
-15
lines changed

3 files changed

+26
-15
lines changed

fdaPDE/src/models/de.h

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,11 +32,16 @@ class DEPDE {
3232

3333
DEPDE() noexcept = default;
3434
template <typename GeoFrame, typename Penalty> DEPDE(const GeoFrame& gf, Penalty&& penalty) noexcept : solver_() {
35+
analyze_data(gf);
36+
discretize(penalty.get());
37+
}
38+
template <typename... Args> const vector_t& fit(Args&&... args) { return solver_.fit(std::forward<Args>(args)...); }
39+
template <typename... Args> void discretize(Args&&... args) { solver_.discretize(std::forward<Args>(args)...); }
40+
template <typename GeoFrame> void analyze_data(const GeoFrame& gf) {
3541
fdapde_assert(gf.n_layers() == 1);
3642
n_obs_ = gf[0].rows();
37-
solver_ = solver_t(gf, penalty.get());
43+
solver_.analyze_data(gf);
3844
}
39-
template <typename... Args> const vector_t& fit(Args&&... args) { return solver_.fit(std::forward<Args>(args)...); }
4045
// observers
4146
const vector_t& log_density() const { return solver_.log_density(); }
4247
vector_t density() const { return solver_.density(); }

fdaPDE/src/models/qsr.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -192,7 +192,7 @@ template <typename VariationalSolver> class QSRPDE {
192192
vector_t py_; // y - (1 - 2 * alpha) * |y - X * beta - f|
193193
vector_t pW_; // diagonal of W^k = 1 / (2 * n * |y - X * beta - f|)
194194
vector_t mu_; // \mu^k = [ \mu^k_1, ..., \mu^k_n ] : quantile vector at step k
195-
double eps_ = -1e-1; // pinball loss smoothing factor
195+
double eps_ = -3; // pinball loss smoothing factor (defaulted to non-smoothed pinball)
196196
int max_iter_ = 200; // fpirls maximum iteration number
197197
double tol_ = 1e-6; // fprils convergence tolerance
198198
double tol_weights_ = 1e-6;

fdaPDE/src/solvers/fe_de_elliptic.h

Lines changed: 18 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -85,8 +85,6 @@ struct fe_de_elliptic {
8585
using DofHandler = typename FeSpace::DofHandlerType;
8686
using Triangulation = typename FeSpace::Triangulation;
8787
constexpr int embed_dim = Triangulation::embed_dim;
88-
fdapde_assert(gf.n_layers() == 1 && gf[0].category()[0] == ltype::point);
89-
n_obs_ = gf[0].rows();
9088
const Triangulation& triangulation = gf.template triangulation<0>();
9189
const FeSpace& fe_space = std::get<0>(info.penalty).trial_space();
9290
const DofHandler& dof_handler = fe_space.dof_handler();
@@ -104,15 +102,6 @@ struct fe_de_elliptic {
104102
}
105103
w[i] = quad_rule.weights[i];
106104
}
107-
// eval physical basis at spatial locations
108-
const auto& spatial_index = geo_index_cast<0, POINT>(gf[0]);
109-
if (spatial_index.points_at_dofs()) {
110-
Psi_.resize(n_obs_, n_dofs_);
111-
Psi_.setIdentity();
112-
} else {
113-
Psi_ = point_eval_(spatial_index.coordinates());
114-
}
115-
116105
// store handle for approximation of \int_D (e^g)
117106
int_exp_ = [&, PsiQuad, w](const vector_t& g) {
118107
double val_ = 0;
@@ -132,6 +121,8 @@ struct fe_de_elliptic {
132121
}
133122
return grad;
134123
};
124+
125+
analyze_data(gf);
135126
}
136127

137128
// perform finite element based numerical discretization
@@ -158,7 +149,22 @@ struct fe_de_elliptic {
158149
};
159150
return;
160151
}
161-
152+
// fit from geoframe
153+
template <typename GeoFrame> void analyze_data(const GeoFrame& gf) {
154+
fdapde_static_assert(GeoFrame::Order == 1, THIS_CLASS_IS_FOR_ORDER_ONE_GEOFRAMES_ONLY);
155+
fdapde_assert(gf.n_layers() == 1 && gf[0].category()[0] == ltype::point);
156+
n_obs_ = gf[0].rows();
157+
158+
// eval physical basis at spatial locations
159+
const auto& spatial_index = geo_index_cast<0, POINT>(gf[0]);
160+
if (spatial_index.points_at_dofs()) {
161+
Psi_.resize(n_obs_, n_dofs_);
162+
Psi_.setIdentity();
163+
} else {
164+
Psi_ = point_eval_(spatial_index.coordinates());
165+
}
166+
return;
167+
}
162168
// main fit entry point
163169
template <typename Optimizer> const vector_t& fit(double lambda, const vector_t& g_init, Optimizer&& opt) {
164170
g_ = opt.optimize(llik_t(*this, lambda, tol_), g_init);

0 commit comments

Comments
 (0)