Skip to content

Ordering: expose METIS nseps as nd_nseps - #124

Closed
sshin23 wants to merge 1 commit into
mainfrom
nd-nseps
Closed

sshin23 wants to merge 1 commit into
mainfrom
nd-nseps

Conversation

@sshin23

@sshin23 sshin23 commented Oct 9, 2026

Copy link
Copy Markdown
Contributor

What

Exposes METIS_OPTION_NSEPS (number of candidate separators METIS evaluates per split, keeping the best) as a cuDSS-style config parameter nd_nseps, next to nd_ubfactor. Default -1 keeps the METIS default; values ≥ 1 are passed through, values < 1 fall back to the default.

Why

Follow-up to the #107 ordering study: nseps is the one NodeND knob that reproducibly improves the ACOPF KKT orderings. On kkt_pglib_opf_case78484_epigrids_condensed_10 (n = 157k, the 78k-bus condensed KKT), nd_nseps = 4 vs the default:

default nd_nseps = 4
nnz(L) 14.76M 14.42M (−2.3%)
factorization flops — −6.7%
fused refactorization (#107 prototype, GV100) 32.1 ms 30.1 ms (−6.2%)
schedule depth 29 29
ordering time 1× ~2×

GPU numbers are interleaved A/B medians, correctness-gated (info 0, factor delta ~3e-10 vs stock, matching residuals). The ordering itself roughly doubles in cost, so this stays opt-in: it pays when one symbolic analysis is reused across many factorizations (interior-point refactorization loops), which is the MadNLP usage pattern.

How

  • Options field + ParameterSpec + validation, mirroring nd_ubfactor
  • ND_PROVIDER contract gains a third argument; the Metis extension passes nseps to CliqueTrees.METIS
  • covered in test_options (roundtrip, type error, out-of-range) and test_symbolic_etree (provider passthrough + fallback)

Tests: test_options + test_symbolic_etree on CPU, 1658 pass. CUDA: pending CI.

🤖 Generated with Claude Code

METIS_OPTION_NSEPS (candidate separators per split) is the one NodeND knob
that reproducibly improves the ACOPF KKT orderings: on
kkt_pglib_opf_case78484_epigrids_condensed_10 (n = 157k), nd_nseps = 4
gives nnz(L) 14.42M vs 14.76M (-2.3%), factorization flops -6.7%, and the
PR #107 fused refactorization 30.1 ms vs 32.1 ms (-6.2%, interleaved A/B
on a GV100, correctness-gated) at the same schedule depth. The ordering
itself runs ~2x slower, so the default stays at the METIS default (-1);
the option pays off when one symbolic analysis is reused across many
factorizations and is exposed like nd_ubfactor.

ND_PROVIDER gains a third argument (values < 1 fall back to the library
default); validated like the other config ints and covered in
test_options and test_symbolic_etree.
@sshin23

sshin23 commented Oct 10, 2026

Copy link
Copy Markdown
Contributor Author

Consolidated into #126 (single PR carrying #119, #122, #124, #125 plus the integration-branch extras, pre-gated on the GV100). Branch left in place.

@sshin23 sshin23 closed this Oct 10, 2026
sshin23 added a commit that referenced this pull request Oct 13, 2026
…ering knobs, division-free Cholesky, GV100 record (#126)

Device-built symbolic maps, the nd_nseps/nd_seed ordering parameters, the
division-free Cholesky column step, the fused factorization/solve pipeline
(src/fused.jl) with its no-pivot LDL mode and per-architecture tuning, the
MadNLP package extension (exported SDSSolver with sds_factorization = :ldl
and true inertia; no-pivot LDL disables 2x2 pivot-pair detection), the CPU
fast path and HSL reference benches, the fresh-machine @sds workflow, and
the campaign write-ups. Full validation record in the PR body.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant