diff --git a/libmeanfield/interface/solver/enthalpy_admissibility.cppm b/libmeanfield/interface/solver/enthalpy_admissibility.cppm index 7ac9100..24292bb 100644 --- a/libmeanfield/interface/solver/enthalpy_admissibility.cppm +++ b/libmeanfield/interface/solver/enthalpy_admissibility.cppm @@ -53,9 +53,11 @@ export namespace mean_field::solver { double meritDirectionalDerivative{std::numeric_limits::quiet_NaN()}; double linearModelResidualNorm{std::numeric_limits::quiet_NaN()}; int jacobianApplications{0}; - PolynomialSignReport base; - PolynomialSignReport anchor; - PolynomialSignReport candidate; + // Early rejection can leave later checks unvisited. Such a report is + // never evidence of feasibility, even though the empty-domain check is. + PolynomialSignReport base{.status = PolynomialSignStatus::unresolved}; + PolynomialSignReport anchor{.status = PolynomialSignStatus::unresolved}; + PolynomialSignReport candidate{.status = PolynomialSignStatus::unresolved}; }; } diff --git a/tests/solver/enthalpy_admissibility.cpp b/tests/solver/enthalpy_admissibility.cpp index 0c6cadc..98a430e 100644 --- a/tests/solver/enthalpy_admissibility.cpp +++ b/tests/solver/enthalpy_admissibility.cpp @@ -157,8 +157,10 @@ TEST_CASE("Prepared admissibility preserves shared true DOFs and rejects an inva const auto repeated = prepared.MinimumRepairFraction(base,anchor,direction); CHECK(repeated.minimumSafeFraction == repair.minimumSafeFraction); mfem::Vector invalid(base); invalid *= -1.0; - CHECK(prepared.MinimumRepairFraction(invalid,anchor,direction).status == - EnthalpyDirectionRepairStatus::invalid_base); + const auto invalidBase = prepared.MinimumRepairFraction(invalid,anchor,direction); + CHECK(invalidBase.status == EnthalpyDirectionRepairStatus::invalid_base); + CHECK(invalidBase.anchor.status == PolynomialSignStatus::unresolved); + CHECK(invalidBase.candidate.status == PolynomialSignStatus::unresolved); int rank = 0; MPI_Comm_rank(MPI_COMM_WORLD,&rank); mfem::Vector nonfinite(base); if (rank == 0 && nonfinite.Size()) nonfinite(0) = std::numeric_limits::quiet_NaN();