Skip to content

[EFIT] Add staged convergence-recovery workflow before considering solver replacement #683

Description

@HongSik-Yun-Fusion

Summary

Recent VEST EFIT studies show that strongly modified constraint weights, profile assumptions, or initialization choices can cause non-convergence or apparent branch changes. More rigorous nonlinear methods such as quasi-Newton, Newton-Krylov, SQP, or Anderson acceleration are possible in principle, but they require modification or replacement of the underlying equilibrium solver and substantially increase implementation scope.

Before taking that step, VAFT should first quantify how much of the observed EFIT non-convergence can be recovered using low-cost strategies available at the EFIT execution/orchestration layer:

  • qualified initialization,
  • warm starts,
  • parameter/weight continuation,
  • deterministic retry/fallback.

The central question is:

How much of VEST EFIT non-convergence can be recovered without changing the EFIT nonlinear solver itself?

If these inexpensive strategies recover most difficult cases, the current EFIT/Picard path can remain in place with better orchestration. If systematic failures remain, those cases become stronger evidence for investigating EFIT-specific nonlinear limitations or an alternative reconstruction solver.


Relationship to existing VAFT issues

This issue is not another independent EFIT parameter scan. It composes the results of already-separated numerical studies into one convergence-recovery workflow.

#171 — solver termination / numerical configuration

#171 owns the question of when EFIT stops, including explicit treatment of:

ERRMIN
SAICON
NXITER
MXITER
ICONVR
...

This issue should consume the explicit numerical configuration and runtime/convergence instrumentation established there.

Do not re-scan or re-optimize termination settings here.

#171
    explicit termination configuration
        ↓
this issue
    recovery workflow

#588 — first-slice seed / convergence basin

#588 studies where the first nonlinear solve starts, including the sensitivity to the configured ellipse/current seed through quantities such as:

RELIP
ZELIP
AELIP
EELIP

If #588 identifies a qualified VEST first-slice seed, this issue should use it as the default cold-start fallback.

Do not repeat the seed-basin scan here.

#196 — temporal continuation (ICINIT=-12)

#196 directly owns the time-sequence warm-start problem:

previous trusted equilibrium
    ↓
next EFIT slice

This issue should consume the policy established by #196 rather than implement a competing temporal-continuation mechanism.

The additional continuation studied here is mainly parameter/weight continuation toward a difficult target case.

#656 — does the VEST EFIT outer iterate contract?

#656 classifies the existing EFIT iteration behavior as, for example:

monotone contraction
plateau
oscillation

It also establishes an important scope boundary: the current EFIT RELAX parameter is a convergence-test quantity, not an iterate-under-relaxation control.

Therefore this issue must not describe RELAX as Picard damping or use it as an iterate-stabilization mechanism.

If #656 finds that plateau/oscillation is rare, the need for an elaborate recovery layer may be small. If it finds reproducible difficult slices, those become natural benchmark cases here.

#663 / #664 — constraint sensitivity, identifiability, and targeted nonlinear continuation

#663 provides empirical examples where large weight changes can produce weak response, branch changes, or loss of convergence.

#664 uses Jacobian/SVD analysis plus targeted continuation to distinguish:

local sensitivity
vs
branch transition
vs
non-convergence

Its continuation is primarily an analysis tool:

#664
    continuation as diagnosis
    -> where does the local inverse model break down?

The continuation in this issue is an execution strategy:

this issue
    continuation as recovery
    -> can the requested EFIT target be reached robustly?

Difficult cases identified in #663/#664 should be reused as benchmarks where practical.

#666 — NICE cross-validation

#666 provides an algorithmically independent reconstruction path.

The intended escalation logic is:

EFIT-stage recovery succeeds
    -> likely an execution / initialization / path problem

EFIT-stage recovery still fails systematically
    -> stronger case for #656 / #664 / #666 investigation

A case that remains unrecoverable here is therefore a useful target for EFIT-vs-NICE comparison rather than an automatic reason to add more retry heuristics.

#139 — fit-quality and convergence infrastructure

Reuse the existing convergence/fit-quality parsing and plotting infrastructure from #139.

Do not build a parallel QA stack.


Scope

1. Define the current direct-execution baseline

For representative VEST cases, record the behavior of the current EFIT execution path with a fixed, explicit numerical configuration.

At minimum retain:

  • convergence success/failure;
  • iteration count;
  • termination reason;
  • wall-clock runtime;
  • fit-quality metrics;
  • final equilibrium quantities;
  • initialization provenance.

2. Use qualified warm starts

Where applicable, initialize from the nearest trusted equilibrium rather than always starting independently.

Conceptually:

nearby trusted equilibrium
        ↓
qualified first-slice seed
        ↓
ordinary independent initialization

Time-axis warm-start policy should follow #196.

A failed or scientifically rejected equilibrium must not silently become the seed for a later solve.

3. Add parameter / weight continuation

For strongly modified constraints or weights, approach the requested target through intermediate cases instead of jumping directly from the baseline.

Example:

w = 1.0
 ↓
1.2
 ↓
1.5
 ↓
2.0
 ↓
target

Each converged intermediate case becomes the initial state for the next point.

The purpose is not to optimize production weights. It is to compare:

direct target solve
vs
continuation-assisted target solve

Where practical, scan both increasing and decreasing directions to expose path dependence.

4. Define a deterministic retry / fallback sequence

A failed case should follow an explicit recovery path rather than an ad-hoc repeated rerun.

Conceptually:

normal solve
    ↓ fail
nearest trusted warm start
    ↓ fail
smaller continuation step
    ↓ fail
qualified cold-start seed
    ↓ fail
record unrecovered failure

The exact ordering should follow the conclusions of #588 and #196.

The same input and configuration must produce the same retry path.

5. Preserve recovery provenance

For every case/slice, retain at least:

initialization source
continuation parent
continuation parameter/value
retry count
fallback reason
final convergence state
runtime
iteration count

The final status should distinguish at least:

converged_directly
converged_after_warm_start
converged_after_continuation
converged_after_fallback
unrecovered_failure

Benchmark set

Prefer reuse of existing EFIT numerical-study cases rather than introducing a new large shot scan.

Candidate sources:

Compare at minimum:

A. current direct execution
B. warm-start execution
C. continuation-assisted execution
D. staged recovery workflow

Metrics

Computational cost

  • total wall time;
  • number of EFIT executions;
  • total iteration count;
  • cost per successfully recovered equilibrium.

Robustness

  • direct convergence fraction;
  • convergence fraction after recovery;
  • unrecovered failure fraction;
  • recovery success rate by method.

Solution consistency

A recovered solve should not be counted as a success merely because EFIT returned a converged status.

Compare against a direct-converged reference branch where available using at least:

  • magnetic-axis position;
  • LCFS displacement;
  • plasma area / volume;
  • beta_p;
  • li;
  • q95;
  • diagnostic residuals;
  • relevant profile quantities.

If two paths reach materially different equilibria with comparable fit quality, record that as path/branch dependence, not as simple convergence recovery.


Interpretation

Case A — most target cases already converge directly

Keep the current EFIT workflow simple. Additional recovery machinery is unnecessary or should remain minimal.

Case B — warm start / continuation recovers most failures

There is weak justification for replacing the EFIT nonlinear solver.

The preferred architecture remains:

EFIT / current nonlinear solver
    +
better initialization and orchestration

Case C — the same regime remains unrecoverable

Do not add increasingly complicated retry heuristics indefinitely.

Link the remaining cases back to #656/#664 and use #666 or a separate EFIT/VFIT nonlinear-solver study to determine whether the limitation is solver-specific or structural to the inverse problem.

Case D — different paths converge to different branches

Do not classify this as a successful robustness improvement.

This is an identifiability / branch-selection problem and belongs primarily to #664/#666.


Out of scope

This issue does not implement or require:

If these become justified by the benchmark, they should be handled in an EFIT fork, VFIT, or a separate reconstruction-solver issue.


Acceptance criteria


Completion condition

At completion, this issue should answer:

For VEST EFIT, how much of the observed non-convergence can be recovered by initialization, warm starts, continuation, and deterministic retry alone?

The result should support one of two clear next steps:

most failures recovered
    ↓
retain current EFIT/Picard path
+ improve VAFT execution workflow

or

systematic failures remain
    ↓
investigate EFIT nonlinear solver itself
or an alternative reconstruction solver
(#656 / #664 / #666 / VFIT)

The purpose of this issue is therefore not to implement a more rigorous nonlinear method, but to establish whether such a change is actually necessary before paying its computational and engineering cost.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions