From 719bc5cafd25adfa9c3dc5cafefe299e38e5bb55 Mon Sep 17 00:00:00 2001 From: ChrisRackauckas-Claude Date: Sat, 20 Jun 2026 11:59:22 -0400 Subject: [PATCH] Fix init_cacheval(::GenericLUFactorization) for SizedMatrix (StaticArrays.LU) PR #1038 changed init_cacheval(::GenericLUFactorization/::RFLUFactorization) to rebuild a LinearAlgebra.LU via `luinst.factors`/`luinst.info` so the cacheval pivot slot type matches for non-Array dense containers (e.g. FixedSizeArray). But ArrayInterface.lu_instance returns a StaticArrays.LU (fields L/U/p, no factors/info) for a SizedMatrix, so `luinst.factors` throws `type StaticArrays.LU has no field factors` and init(LinearProblem(SizedMatrix, ...)) errors. Guard the rebuild: when lu_instance does not return a LinearAlgebra.LU, return it as-is (the pre-#1038 behavior, which already carries a Vector pivot). Preserves the FixedSizeArray fix while restoring SizedMatrix. Co-Authored-By: Chris Rackauckas Co-Authored-By: Claude Opus 4.8 (1M context) --- src/factorization.jl | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/factorization.jl b/src/factorization.jl index 4d2509ec3..94bd5dfc9 100644 --- a/src/factorization.jl +++ b/src/factorization.jl @@ -184,6 +184,10 @@ function LinearSolve.init_cacheval( # type matches for dense CPU arrays whose container isn't `Base.Array` # (e.g. `FixedSizeArray`), whose `lu_instance` pivot would otherwise differ. luinst = ArrayInterface.lu_instance(convert(AbstractMatrix, A)) + # `lu_instance` may return a non-`LinearAlgebra.LU` (e.g. `StaticArrays.LU` + # for a `SizedMatrix`, with fields `L`/`U`/`p` rather than `factors`/`info`); + # those already carry a `Vector` pivot, so use them as-is. + luinst isa LinearAlgebra.LU || return luinst, ipiv return LinearAlgebra.LU(luinst.factors, ipiv, luinst.info), ipiv end @@ -343,6 +347,10 @@ function init_cacheval( # (e.g. a `FixedSizeVector` for a `FixedSizeArray`), so rebuild the instance # with the `Vector` pivot to keep the cacheval slot type matching. luinst = ArrayInterface.lu_instance(convert(AbstractMatrix, A)) + # `lu_instance` may return a non-`LinearAlgebra.LU` (e.g. `StaticArrays.LU` + # for a `SizedMatrix`, with fields `L`/`U`/`p` rather than `factors`/`info`); + # those already carry a `Vector` pivot, so use them as-is. + luinst isa LinearAlgebra.LU || return luinst, ipiv return LinearAlgebra.LU(luinst.factors, ipiv, luinst.info), ipiv end