MINOR-1 (spherical_functional.hpp:426)
Wrong comment said "second derivative < 0 for a convex functional".
The spherical energy is *concave* (NSD Hessian); the monotone-f argument
applies to both convex and concave functionals equally. Comment rewritten
to explain the actual physics: increasing scale increases all angles and
thus reduces Σ G_v.
MINOR-2 (spherical_functional.hpp:494-495)
Forward finite difference O(ε) → central finite difference O(ε²):
old: dft = (sum_Gv(t + fd_eps) - ft) / fd_eps
new: dft = (sum_Gv(t + fd_eps) - sum_Gv(t - fd_eps)) / (2*fd_eps)
Same cost when the extra sum_Gv(t - fd_eps) replaces the cached ft.
MINOR-3 (euclidean_functional.hpp, spherical_functional.hpp,
inversive_distance_functional.hpp)
New header gauss_legendre.hpp centralises the 10-point Gauss-Legendre
nodes and weights (gl10_nodes() / gl10_weights()). The three energy
functions now use the shared accessors instead of duplicated local
static arrays.
MINOR-4 (euclidean_functional.hpp, spherical_functional.hpp,
hyper_ideal_functional.hpp, inversive_distance_functional.hpp)
halfedge_to_index() centralised in conformal_mesh.hpp. All four local
aliases (eucl_hidx, spher_hidx, hidx, id_detail::hidx) now delegate to
it as one-line wrappers; the aliases are kept for now to avoid a larger
call-site churn, clearly documented as thin wrappers.
MINOR-5 (clausen.hpp:33-38)
Added a comment above inits() explaining the intentional off-by-one
return value and how it interacts with csevl() — matching the Java
Clausen.inits() / csevl() contract.
277/277 CGAL + 26/26 pure-math tests pass, 0 failed.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
50 lines
1.5 KiB
C++
50 lines
1.5 KiB
C++
#pragma once
|
||
// Copyright (c) 2024-2026 Tarik Moussa.
|
||
// SPDX-License-Identifier: MIT
|
||
|
||
// gauss_legendre.hpp
|
||
//
|
||
// 10-point Gauss-Legendre quadrature nodes and weights on [-1,1].
|
||
//
|
||
// Previously duplicated verbatim in:
|
||
// euclidean_functional.hpp, spherical_functional.hpp,
|
||
// inversive_distance_functional.hpp (MINOR-3 fix)
|
||
//
|
||
// Usage (integration over [0,1] via change of variables t=(1+s)/2, w=w_GL/2):
|
||
//
|
||
// const auto* s = conformallab::gl10_nodes();
|
||
// const auto* w = conformallab::gl10_weights();
|
||
// for (int k = 0; k < 10; ++k) {
|
||
// double t = (1.0 + s[k]) * 0.5;
|
||
// double wt = w[k] * 0.5;
|
||
// E += wt * dot(G(t*x), x);
|
||
// }
|
||
|
||
namespace conformallab {
|
||
|
||
/// 10-point Gauss-Legendre nodes on [−1, 1].
|
||
inline const double* gl10_nodes() noexcept {
|
||
static constexpr double s[10] = {
|
||
-0.9739065285171717, -0.8650633666889845,
|
||
-0.6794095682990244, -0.4333953941292472,
|
||
-0.1488743389816312, 0.1488743389816312,
|
||
0.4333953941292472, 0.6794095682990244,
|
||
0.8650633666889845, 0.9739065285171717
|
||
};
|
||
return s;
|
||
}
|
||
|
||
/// 10-point Gauss-Legendre weights on [−1, 1].
|
||
inline const double* gl10_weights() noexcept {
|
||
static constexpr double w[10] = {
|
||
0.0666713443086881, 0.1494513491505806,
|
||
0.2190863625159820, 0.2692667193099963,
|
||
0.2955242247147529, 0.2955242247147529,
|
||
0.2692667193099963, 0.2190863625159820,
|
||
0.1494513491505806, 0.0666713443086881
|
||
};
|
||
return w;
|
||
}
|
||
|
||
} // namespace conformallab
|