feat(triggers): added ConvergenceFailureTrigger

added new trigger which throws on convergence failures. This also required adding a new "step" method for other triggers which gets called every step instead of every trigger throw. The ConvergenceFailureTrigger has sucsessgully let teh engine evolve to 10Gyr without any meaningful growth of convergence failures.
This commit is contained in:
2025-11-04 13:22:57 -05:00
parent 7f19143ff6
commit 72a3f5bf4c
6 changed files with 285 additions and 21 deletions

View File

@@ -42,6 +42,12 @@ namespace gridfire::trigger {
* @param ctx Context snapshot used to update state.
*/
virtual void update(const TriggerContextStruct& ctx) = 0;
/**
* @brief similar to update but intended to be run on every step not just those where the trigger triggered
* @param ctx Context snapshot used to update state.
*/
virtual void step(const TriggerContextStruct& ctx) = 0;
/**
* @brief Reset internal state and diagnostics counters.
*/

View File

@@ -52,6 +52,8 @@ namespace gridfire::trigger {
* @brief Update both sub-triggers and increment update counter.
*/
void update(const TriggerContextStruct& ctx) override;
void step(const TriggerContextStruct& ctx) override;
/**
* @brief Reset both sub-triggers and local counters.
*/
@@ -84,6 +86,7 @@ namespace gridfire::trigger {
mutable size_t m_misses = 0;
mutable size_t m_updates = 0;
mutable size_t m_resets = 0;
mutable size_t m_steps = 0;
};
/**
@@ -101,6 +104,7 @@ namespace gridfire::trigger {
bool check(const TriggerContextStruct& ctx) const override;
void update(const TriggerContextStruct& ctx) override;
void step(const TriggerContextStruct& ctx) override;
void reset() override;
std::string name() const override;
TriggerResult why(const TriggerContextStruct& ctx) const override;
@@ -116,6 +120,7 @@ namespace gridfire::trigger {
mutable size_t m_misses = 0;
mutable size_t m_updates = 0;
mutable size_t m_resets = 0;
mutable size_t m_steps = 0;
};
/**
@@ -133,6 +138,7 @@ namespace gridfire::trigger {
bool check(const TriggerContextStruct& ctx) const override;
void update(const TriggerContextStruct& ctx) override;
void step(const TriggerContextStruct& ctx) override;
void reset() override;
std::string name() const override;
@@ -148,7 +154,7 @@ namespace gridfire::trigger {
mutable size_t m_misses = 0;
mutable size_t m_updates = 0;
mutable size_t m_resets = 0;
mutable size_t m_steps = 0;
};
/**
@@ -168,6 +174,7 @@ namespace gridfire::trigger {
bool check(const TriggerContextStruct& ctx) const override;
void update(const TriggerContextStruct& ctx) override;
void step(const TriggerContextStruct& ctx) override;
void reset() override;
std::string name() const override;
@@ -185,6 +192,7 @@ namespace gridfire::trigger {
mutable size_t m_misses = 0;
mutable size_t m_updates = 0;
mutable size_t m_resets = 0;
mutable size_t m_steps = 0;
};
///////////////////////////////
@@ -216,6 +224,13 @@ namespace gridfire::trigger {
m_updates++;
}
template <typename TriggerContextStruct>
void AndTrigger<TriggerContextStruct>::step(const TriggerContextStruct &ctx) {
m_A->step(ctx);
m_B->step(ctx);
m_steps++;
}
template <typename TriggerContextStruct>
void AndTrigger<TriggerContextStruct>::reset() {
m_A->reset();
@@ -301,6 +316,13 @@ namespace gridfire::trigger {
m_updates++;
}
template <typename TriggerContextStruct>
void OrTrigger<TriggerContextStruct>::step(const TriggerContextStruct &ctx) {
m_A->step(ctx);
m_B->step(ctx);
m_steps++;
}
template <typename TriggerContextStruct>
void OrTrigger<TriggerContextStruct>::reset() {
m_A->reset();
@@ -383,6 +405,12 @@ namespace gridfire::trigger {
m_updates++;
}
template <typename TriggerContextStruct>
void NotTrigger<TriggerContextStruct>::step(const TriggerContextStruct &ctx) {
m_A->step(ctx);
m_steps++;
}
template <typename TriggerContextStruct>
void NotTrigger<TriggerContextStruct>::reset() {
m_A->reset();
@@ -457,6 +485,12 @@ namespace gridfire::trigger {
m_updates++;
}
template <typename TriggerContextStruct>
void EveryNthTrigger<TriggerContextStruct>::step(const TriggerContextStruct &ctx) {
m_A->step(ctx);
m_steps++;
}
template <typename TriggerContextStruct>
void EveryNthTrigger<TriggerContextStruct>::reset() {
m_A->reset();
@@ -508,7 +542,4 @@ namespace gridfire::trigger {
size_t EveryNthTrigger<TriggerContextStruct>::numMisses() const {
return m_misses;
}
}