Consolidates the five reports I filed on 2026-09-22 — #6598, #6599, #6600, #6601, #6602 —
into one, and closes those. They are all one story, and five separate issues was the wrong
way to tell it. (LLNL/hiop asked me to consolidate on their tracker for the same reason,
llnl/hiop#801; this is the same medicine applied here.)
The story: the packaged ExaGO and HiOp cannot give you a working GPU sparse solver, and
nothing says so.
1. spack install exago with no variants has no OPFLOW solver — was #6598
exago/package.py has variant("hiop", default=False) and variant("ipopt", default=False).
With neither, the binary builds and installs, and then has no solver for OPFLOW at all. A
default install that cannot solve the package's main problem is a surprising default; at the
least the recipe could say so.
2. +sparse forces a licensed dependency — was #6599
hiop/package.py:
95: variant("sparse", default=False, description="Enable/Disable Sparse linear algebra")
198: depends_on("coinhsl+blas", when="+sparse")
236: self.define_from_variant("HIOP_SPARSE", "sparse"),
237: self.define_from_variant("HIOP_USE_COINHSL", "sparse"),
so asking for HiOp's sparse interface pulls in COINHSL, which needs a licence and a manually
fetched tarball. HiOp itself does not require it. We build upstream HiOp develop
(fc0e881) like this, and it works:
HIOP_SPARSE:BOOL=ON
HIOP_USE_COINHSL:BOOL=OFF
with STRUMPACK and ReSolve as the sparse backends. The coupling is in this recipe, not in
HiOp. A separate coinhsl variant would decouple them:
variant("coinhsl", default=False, description="Use the licensed COINHSL solvers (MA57/MA27)")
depends_on("coinhsl+blas", when="+coinhsl")
...
self.define_from_variant("HIOP_USE_COINHSL", "coinhsl"),
I have not sent that as a pull request because it changes what +sparse resolves to for
people who already depend on it, which is your call rather than mine. Say the word and it
is a five-line change.
3. The GPU sparse solver is off by default and cannot be enabled on its own — was #6600
Following from 2: the combination that gives a GPU sparse solve (+sparse with a GPU
backend, no COINHSL) is not expressible through the variants as they stand.
4. E4S has never shipped a HiOp with any sparse backend — was #6601
A consequence of 2 and 3 rather than a separate defect: because +sparse drags in a
licensed package, the distributed builds leave it off.
5. MA27 cannot stand in for MA57 — was #6602
Where a build does have COINHSL, MA27 does not substitute for MA57 in HiOp's safe mode: the
code asks for MA57 specifically (hiopKKTLinSysSparse.cpp), and a build with only MA27
behaves as a build with neither — see llnl/hiop#810 for what that does.
The recipes list @ryandanehy, @cameronrutherford, @pelesh (exago) and @nychiang, @cnpetra,
@pelesh (hiop) as maintainers — one mention rather than five, and no expectation of a quick
answer. If any of this is intended as it stands, say so and I will close this.
Consolidates the five reports I filed on 2026-09-22 — #6598, #6599, #6600, #6601, #6602 —
into one, and closes those. They are all one story, and five separate issues was the wrong
way to tell it. (LLNL/hiop asked me to consolidate on their tracker for the same reason,
llnl/hiop#801; this is the same medicine applied here.)
The story: the packaged ExaGO and HiOp cannot give you a working GPU sparse solver, and
nothing says so.
1.
spack install exagowith no variants has no OPFLOW solver — was #6598exago/package.pyhasvariant("hiop", default=False)andvariant("ipopt", default=False).With neither, the binary builds and installs, and then has no solver for OPFLOW at all. A
default install that cannot solve the package's main problem is a surprising default; at the
least the recipe could say so.
2.
+sparseforces a licensed dependency — was #6599hiop/package.py:so asking for HiOp's sparse interface pulls in COINHSL, which needs a licence and a manually
fetched tarball. HiOp itself does not require it. We build upstream HiOp
develop(fc0e881) like this, and it works:
with STRUMPACK and ReSolve as the sparse backends. The coupling is in this recipe, not in
HiOp. A separate
coinhslvariant would decouple them:I have not sent that as a pull request because it changes what
+sparseresolves to forpeople who already depend on it, which is your call rather than mine. Say the word and it
is a five-line change.
3. The GPU sparse solver is off by default and cannot be enabled on its own — was #6600
Following from 2: the combination that gives a GPU sparse solve (
+sparsewith a GPUbackend, no COINHSL) is not expressible through the variants as they stand.
4. E4S has never shipped a HiOp with any sparse backend — was #6601
A consequence of 2 and 3 rather than a separate defect: because
+sparsedrags in alicensed package, the distributed builds leave it off.
5. MA27 cannot stand in for MA57 — was #6602
Where a build does have COINHSL, MA27 does not substitute for MA57 in HiOp's safe mode: the
code asks for MA57 specifically (
hiopKKTLinSysSparse.cpp), and a build with only MA27behaves as a build with neither — see llnl/hiop#810 for what that does.
The recipes list @ryandanehy, @cameronrutherford, @pelesh (exago) and @nychiang, @cnpetra,
@pelesh (hiop) as maintainers — one mention rather than five, and no expectation of a quick
answer. If any of this is intended as it stands, say so and I will close this.