Subcategory: Code structure / API completeness — feature gap (not a defect)
Source: rhiza_quality assessment
Problem
After aligning the inner argument between the two entry points, solve_nnqp_eq still lacks two parameters that solve_nnqp exposes:
track — record the free-set trajectory in Result.traj
max_outer — cap on outer steps (returns the current iterate with converged=False when hit)
The underlying _active_set_loop already supports both (the solve_nnqp_eq call site just doesn't forward them), so this is a small, mechanical symmetry fix.
Where
src/nncg/solver.py — solve_nnqp_eq signature and its _active_set_loop(...) call (currently omits track / max_outer)
Done when
solve_nnqp_eq accepts track: bool = False and max_outer: int | None = None, forwards both to _active_set_loop, with docstrings updated and tests covering the trajectory-recording and outer-cap paths (keeping coverage at 100%).
Subcategory: Code structure / API completeness — feature gap (not a defect)
Source: rhiza_quality assessment
Problem
After aligning the
innerargument between the two entry points,solve_nnqp_eqstill lacks two parameters thatsolve_nnqpexposes:track— record the free-set trajectory inResult.trajmax_outer— cap on outer steps (returns the current iterate withconverged=Falsewhen hit)The underlying
_active_set_loopalready supports both (thesolve_nnqp_eqcall site just doesn't forward them), so this is a small, mechanical symmetry fix.Where
src/nncg/solver.py—solve_nnqp_eqsignature and its_active_set_loop(...)call (currently omitstrack/max_outer)Done when
solve_nnqp_eqacceptstrack: bool = Falseandmax_outer: int | None = None, forwards both to_active_set_loop, with docstrings updated and tests covering the trajectory-recording and outer-cap paths (keeping coverage at 100%).