fix(eigen): reject nonfinite modal validation scales
This commit is contained in:
@@ -265,11 +265,27 @@ Result<SolidFrequencyState> ExecuteCandidate(const Domain& domain) {
|
||||
Vector residual = kv;
|
||||
residual.Axpy(-lambda, mv);
|
||||
const double norm_phi = vector.Norm();
|
||||
const double denominator = (norm_k + std::abs(lambda) * norm_m) * norm_phi;
|
||||
const double eta_r = Ratio(residual.Norm(), denominator);
|
||||
const double residual_norm = residual.Norm();
|
||||
const double lambda_mass = lambda * modal_mass;
|
||||
const double energy_error = std::abs(energy - lambda_mass);
|
||||
const double matrix_scale = norm_k + std::abs(lambda) * norm_m;
|
||||
const double denominator = matrix_scale * norm_phi;
|
||||
const double energy_denominator = denominator * norm_phi;
|
||||
// Finite / infinity is zero in IEEE arithmetic but cannot certify a pair.
|
||||
// Validate both original-pencil scales before either division, preserving
|
||||
// the exact-zero branch only for representable finite numerator/scale.
|
||||
if (!std::isfinite(norm_k) || !std::isfinite(norm_m) ||
|
||||
!std::isfinite(norm_phi) || !std::isfinite(residual_norm) ||
|
||||
!std::isfinite(lambda_mass) || !std::isfinite(energy_error) ||
|
||||
!std::isfinite(matrix_scale) || !std::isfinite(denominator) ||
|
||||
!std::isfinite(energy_denominator))
|
||||
return Result<SolidFrequencyState>::Failure(
|
||||
Failure("solid-eigenpair-validation-failed",
|
||||
"A nonfinite original K/M validation numerator or scale "
|
||||
"cannot certify a pair."));
|
||||
const double eta_r = Ratio(residual_norm, denominator);
|
||||
const double eta_norm = std::abs(modal_mass - 1.0);
|
||||
const double eta_energy =
|
||||
Ratio(std::abs(energy - lambda * modal_mass), denominator * norm_phi);
|
||||
const double eta_energy = Ratio(energy_error, energy_denominator);
|
||||
if (!std::isfinite(lambda) || !std::isfinite(eta_r) || eta_r > 1e-10 ||
|
||||
!std::isfinite(eta_norm) || eta_norm > 1e-10 ||
|
||||
!std::isfinite(eta_energy) || eta_energy > 1e-10 ||
|
||||
|
||||
Reference in New Issue
Block a user