Add frozen polynomial positivity probes and tighten certificate diagnostics
This commit is contained in:
@@ -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 ==
|
||||
|
||||
Reference in New Issue
Block a user