Add frozen polynomial positivity probes and tighten certificate diagnostics

This commit is contained in:
2026-09-17 09:31:31 -04:00
parent dfba40b1f5
commit 97204a3253
3 changed files with 213 additions and 2 deletions

View File

@@ -138,6 +138,7 @@ TEST_CASE("Prepared admissibility preserves shared true DOFs and rejects an inva
const auto base = fixture.Project([](const mfem::Vector &) { return 1.0; });
const auto anchor = fixture.Project([](const mfem::Vector &p) { return 1.0+0.2*p(1); });
const auto direction = fixture.Project([](const mfem::Vector &p) { return -2.0-p(0)+0.5*p(2); });
const mfem::Vector savedBase(base), savedAnchor(anchor), savedDirection(direction);
const auto repair = prepared.MinimumRepairFraction(base,anchor,direction);
REQUIRE(repair.status == EnthalpyDirectionRepairStatus::feasible);
REQUIRE(repair.minimumSafeFraction > 0.0);
@@ -149,6 +150,12 @@ TEST_CASE("Prepared admissibility preserves shared true DOFs and rejects an inva
CHECK(prepared.Check(candidate).status == PolynomialSignStatus::certified_nonnegative);
for (int i = 0; i < repaired.Size(); ++i)
CHECK(repaired(i) == Catch::Approx((1.0-beta)*direction(i)+beta*(anchor(i)-base(i))));
for (int i = 0; i < base.Size(); ++i) {
CHECK(base(i) == savedBase(i)); CHECK(anchor(i) == savedAnchor(i));
CHECK(direction(i) == savedDirection(i));
}
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);
@@ -181,6 +188,10 @@ TEST_CASE("Feasible direction repair enforces exact homogeneous trace and reject
REQUIRE(prepared.ApplyRepairFraction(base,anchor,direction,1.0,repaired).status ==
PolynomialSignStatus::certified_nonnegative);
for (int row : boundary) CHECK(repaired(row) == 0.0);
auto nonfiniteDirection = direction;
for (int row : boundary) nonfiniteDirection(row) = std::numeric_limits<double>::quiet_NaN();
CHECK(prepared.MinimumRepairFraction(base,anchor,nonfiniteDirection).status ==
EnthalpyDirectionRepairStatus::invalid_direction);
auto invalidTrace = base;
for (int row : boundary) invalidTrace(row) = 1.0e-20;
CHECK(prepared.MinimumRepairFraction(invalidTrace,anchor,direction).status ==