Skip to content

Commit ec4d975

Browse files
Setup the codebase to use explicit imports
1 parent aba7dd6 commit ec4d975

10 files changed

+63
-30
lines changed

Project.toml

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,7 @@ ChainRulesCore = "1.22"
7777
ConcreteStructs = "0.2.3"
7878
DocStringExtensions = "0.9.3"
7979
EnumX = "1.0.4"
80+
ExplicitImports = "1"
8081
EnzymeCore = "0.8.1"
8182
FastAlmostBandedMatrices = "0.1"
8283
FastLapackInterface = "2"
@@ -122,6 +123,7 @@ julia = "1.10"
122123
[extras]
123124
AllocCheck = "9b6a8646-10ed-4001-bbdc-1d2f46dfbb1a"
124125
Aqua = "4c88cf16-eb10-579e-8560-4a9242c79595"
126+
ExplicitImports = "7d51a73a-1435-4ff3-83d9-f097790105c7"
125127
BandedMatrices = "aae01518-5342-5314-be14-df237901396f"
126128
BlockDiagonals = "0a1fb500-61f7-11e9-3c65-f5ef3456f9f0"
127129
FastAlmostBandedMatrices = "9d29842c-ecb8-4973-b1e9-a27b1157504e"
@@ -150,4 +152,4 @@ Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40"
150152
Zygote = "e88e6eb3-aa80-5325-afca-941959d7151f"
151153

152154
[targets]
153-
test = ["Aqua", "Test", "IterativeSolvers", "InteractiveUtils", "KrylovKit", "KrylovPreconditioners", "Pkg", "Random", "SafeTestsets", "MultiFloats", "ForwardDiff", "HYPRE", "MPI", "BlockDiagonals", "FiniteDiff", "BandedMatrices", "FastAlmostBandedMatrices", "StaticArrays", "AllocCheck", "StableRNGs", "Zygote", "RecursiveFactorization", "Sparspak", "FastLapackInterface", "SparseArrays"]
155+
test = ["Aqua", "Test", "IterativeSolvers", "InteractiveUtils", "KrylovKit", "KrylovPreconditioners", "Pkg", "Random", "SafeTestsets", "MultiFloats", "ForwardDiff", "HYPRE", "MPI", "BlockDiagonals", "FiniteDiff", "BandedMatrices", "FastAlmostBandedMatrices", "StaticArrays", "AllocCheck", "StableRNGs", "Zygote", "RecursiveFactorization", "Sparspak", "FastLapackInterface", "SparseArrays", "ExplicitImports"]

ext/LinearSolveCUDAExt.jl

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
module LinearSolveCUDAExt
22

33
using CUDA
4-
using LinearSolve
4+
using LinearSolve: LinearSolve, is_cusparse, defaultalg, cudss_loaded, DefaultLinearSolver,
5+
DefaultAlgorithmChoice, ALREADY_WARNED_CUDSS, LinearCache, needs_concrete_A,
6+
error_no_cudss_lu, CUDSS_LOADED, init_cacheval
57
using LinearSolve.LinearAlgebra, LinearSolve.SciMLBase, LinearSolve.ArrayInterface
68
using SciMLBase: AbstractSciMLOperator
79

ext/LinearSolveCUDSSExt.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
module LinearSolveCUDSSExt
22

3-
using LinearSolve
3+
using LinearSolve: LinearSolve, cudss_loaded
44
using CUDSS
55

66
LinearSolve.cudss_loaded(A::CUDSS.CUDA.CUSPARSE.CuSparseMatrixCSR) = true

ext/LinearSolveEnzymeExt.jl

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
module LinearSolveEnzymeExt
22

3-
using LinearSolve
3+
using LinearSolve: LinearSolve, SciMLLinearSolveAlgorithm, init, solve!, LinearProblem,
4+
LinearCache, AbstractKrylovSubspaceMethod, DefaultLinearSolver,
5+
defaultalg_adjoint_eval
46
using LinearSolve.LinearAlgebra
57
using EnzymeCore
68
using EnzymeCore: EnzymeRules

ext/LinearSolveRecursiveFactorizationExt.jl

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
module LinearSolveRecursiveFactorizationExt
22

3-
using LinearSolve
3+
using LinearSolve: LinearSolve, userecursivefactorization, LinearCache, @get_cacheval, RFLUFactorization
44
using LinearSolve.LinearAlgebra, LinearSolve.ArrayInterface, RecursiveFactorization
5+
using SciMLBase: SciMLBase, ReturnCode
56

67
LinearSolve.userecursivefactorization(A::Union{Nothing, AbstractMatrix}) = true
78

ext/LinearSolveSparseArraysExt.jl

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,13 @@
11
module LinearSolveSparseArraysExt
22

3-
using LinearSolve, LinearAlgebra
3+
using LinearSolve: LinearSolve, BLASELTYPES, pattern_changed, ArrayInterface,
4+
@get_cacheval, CHOLMODFactorization, GenericFactorization, GenericLUFactorization,
5+
KLUFactorization, LUFactorization, NormalCholeskyFactorization, OperatorAssumptions,
6+
QRFactorization, RFLUFactorization, UMFPACKFactorization, solve
7+
using LinearAlgebra
48
using SparseArrays
59
using SparseArrays: AbstractSparseMatrixCSC, nonzeros, rowvals, getcolptr
6-
using LinearSolve: BLASELTYPES, pattern_changed, ArrayInterface
10+
using SciMLBase: SciMLBase, LinearProblem, ReturnCode
711

812
# Can't `using KLU` because cannot have a dependency in there without
913
# requiring the user does `using KLU`

src/LinearSolve.jl

Lines changed: 22 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -5,27 +5,33 @@ if isdefined(Base, :Experimental) &&
55
end
66

77
import PrecompileTools
8-
using ArrayInterface
9-
using Base: cache_dependencies, Bool
10-
using LinearAlgebra
8+
using ArrayInterface: ArrayInterface
9+
using Base: Bool, convert, copyto!, adjoint, transpose, /, \, require_one_based_indexing
10+
using LinearAlgebra: LinearAlgebra, BlasInt, LU, Adjoint, BLAS, Bidiagonal, BunchKaufman,
11+
ColumnNorm, Diagonal, Factorization, Hermitian, I, LAPACK, NoPivot,
12+
RowMaximum, RowNonZero, SymTridiagonal, Symmetric, Transpose,
13+
Tridiagonal, UniformScaling, axpby!, axpy!, bunchkaufman, bunchkaufman!,
14+
cholesky, cholesky!, diagind, dot, ldiv!, ldlt!, lu, lu!, mul!, norm,
15+
qr, qr!, svd, svd!
1116
using LazyArrays: @~, BroadcastArray
12-
using SciMLBase: AbstractLinearAlgorithm, LinearAliasSpecifier
13-
using SciMLOperators
14-
using SciMLOperators: AbstractSciMLOperator, IdentityOperator
15-
using Setfield
16-
using UnPack
17-
using DocStringExtensions
18-
using EnumX
19-
using Markdown
20-
using ChainRulesCore
17+
using SciMLBase: SciMLBase, LinearAliasSpecifier, AbstractSciMLOperator,
18+
init, solve!, reinit!, solve, ReturnCode, LinearProblem
19+
using SciMLOperators: SciMLOperators, AbstractSciMLOperator, IdentityOperator, MatrixOperator,
20+
has_ldiv!, issquare
21+
using Setfield: @set, @set!
22+
using UnPack: @unpack
23+
using DocStringExtensions: DocStringExtensions
24+
using EnumX: EnumX, @enumx
25+
using Markdown: Markdown, @doc_str
26+
using ChainRulesCore: ChainRulesCore
27+
using Reexport: Reexport, @reexport
28+
using Libdl: Libdl, dlsym_e
2129
import InteractiveUtils
2230
import RecursiveArrayTools
2331

24-
import StaticArraysCore: StaticArray, SVector, MVector, SMatrix, MMatrix
32+
import StaticArraysCore: StaticArray, SVector, SMatrix
2533

26-
using LinearAlgebra: BlasInt, LU
27-
using LinearAlgebra.LAPACK: require_one_based_indexing,
28-
chkfinite, chkstride1,
34+
using LinearAlgebra.LAPACK: chkfinite, chkstride1,
2935
@blasfunc, chkargsok
3036

3137
import GPUArraysCore
@@ -34,8 +40,6 @@ import ConcreteStructs: @concrete
3440

3541
# wrap
3642
import Krylov
37-
using SciMLBase
38-
import Preferences
3943

4044
const CRC = ChainRulesCore
4145

@@ -51,9 +55,7 @@ else
5155
const usemkl = false
5256
end
5357

54-
using Reexport
5558
@reexport using SciMLBase
56-
using SciMLBase: _unwrap_val
5759

5860
abstract type SciMLLinearSolveAlgorithm <: SciMLBase.AbstractLinearAlgorithm end
5961
abstract type AbstractFactorization <: SciMLLinearSolveAlgorithm end

src/appleaccelerate.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -252,7 +252,7 @@ function SciMLBase.solve!(cache::LinearCache, alg::AppleAccelerateLUFactorizatio
252252
end
253253

254254
A, info = @get_cacheval(cache, :AppleAccelerateLUFactorization)
255-
LinearAlgebra.require_one_based_indexing(cache.u, cache.b)
255+
require_one_based_indexing(cache.u, cache.b)
256256
m, n = size(A, 1), size(A, 2)
257257
if m > n
258258
Bc = copy(cache.b)

src/default.jl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,7 @@ function defaultalg(A::GPUArraysCore.AnyGPUArray, b::GPUArraysCore.AnyGPUArray,
125125
end
126126
end
127127

128-
function defaultalg(A::SciMLBase.AbstractSciMLOperator, b,
128+
function defaultalg(A::SciMLOperators.AbstractSciMLOperator, b,
129129
assump::OperatorAssumptions{Bool})
130130
if has_ldiv!(A)
131131
return DefaultLinearSolver(DefaultAlgorithmChoice.DirectLdiv!)
@@ -142,7 +142,7 @@ function defaultalg(A::SciMLBase.AbstractSciMLOperator, b,
142142
end
143143

144144
# Fix ambiguity
145-
function defaultalg(A::SciMLBase.AbstractSciMLOperator, b::GPUArraysCore.AnyGPUArray,
145+
function defaultalg(A::SciMLOperators.AbstractSciMLOperator, b::GPUArraysCore.AnyGPUArray,
146146
assump::OperatorAssumptions{Bool})
147147
if has_ldiv!(A)
148148
return DefaultLinearSolver(DefaultAlgorithmChoice.DirectLdiv!)

test/qa.jl

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,8 @@
11
using LinearSolve, Aqua
2+
using ExplicitImports
3+
using LinearAlgebra, Markdown, Reexport, DocStringExtensions, Libdl, SparseArrays
4+
import CommonSolve
5+
26
@testset "Aqua" begin
37
Aqua.find_persistent_tasks_deps(LinearSolve)
48
Aqua.test_ambiguities(LinearSolve, recursive = false, broken = true)
@@ -10,3 +14,19 @@ using LinearSolve, Aqua
1014
Aqua.test_unbound_args(LinearSolve)
1115
Aqua.test_undefined_exports(LinearSolve)
1216
end
17+
18+
@testset "Explicit Imports" begin
19+
# Get extension modules that might be unanalyzable
20+
klu_mod = try; Base.get_extension(LinearSolve, :LinearSolveSparseArraysExt).KLU; catch; nothing; end
21+
unanalyzable_mods = (LinearSolve.OperatorCondition, LinearSolve.DefaultAlgorithmChoice)
22+
if klu_mod !== nothing
23+
unanalyzable_mods = (unanalyzable_mods..., klu_mod)
24+
end
25+
26+
@test check_no_implicit_imports(
27+
LinearSolve; skip = (Base, Core, SciMLBase, LinearAlgebra, SparseArrays, CommonSolve),
28+
allow_unanalyzable = unanalyzable_mods
29+
) === nothing
30+
@test check_no_stale_explicit_imports(LinearSolve; allow_unanalyzable = unanalyzable_mods) === nothing
31+
@test check_all_qualified_accesses_via_owners(LinearSolve) === nothing
32+
end

0 commit comments

Comments
 (0)