Skip to content

Commit f703846

Browse files
Merge pull request #105 from vpuri3/methods
some missing methods
2 parents 318cc97 + 3f36ae2 commit f703846

File tree

6 files changed

+40
-35
lines changed

6 files changed

+40
-35
lines changed

Project.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
name = "SciMLOperators"
22
uuid = "c0aeaf25-5076-4817-a8d5-81caf7dfa961"
33
authors = ["xtalax <alex.lemony@gmail.com>"]
4-
version = "0.1.13"
4+
version = "0.1.14"
55

66
[deps]
77
ArrayInterfaceCore = "30b0a656-2188-435a-8636-2ec0e6a096e2"

src/SciMLOperators.jl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ import Base: +, -, *, /, \, ∘, ==, conj, exp, kron
1717
import Base: iszero, inv, adjoint, transpose, size, convert
1818
import LinearAlgebra: mul!, ldiv!, lmul!, rmul!, factorize
1919
import LinearAlgebra: Matrix, Diagonal
20-
import SparseArrays: sparse
20+
import SparseArrays: sparse, issparse
2121

2222
"""
2323
$(TYPEDEF)
@@ -40,8 +40,8 @@ include("left.jl")
4040
include("multidim.jl")
4141

4242
include("scalar.jl")
43-
include("basic.jl")
4443
include("matrix.jl")
44+
include("basic.jl")
4545
include("batch.jl")
4646
include("func.jl")
4747
include("tensor.jl")

src/basic.jl

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -212,7 +212,7 @@ end
212212
Base.:-(L::AbstractSciMLOperator) = ScaledOperator(-true, L)
213213
Base.:+(L::AbstractSciMLOperator) = L
214214

215-
Base.convert(::Type{AbstractMatrix}, L::ScaledOperator) = L.λ.val * convert(AbstractMatrix, L.L)
215+
Base.convert(::Type{AbstractMatrix}, L::ScaledOperator) = convert(Number,L.λ) * convert(AbstractMatrix, L.L)
216216
SparseArrays.sparse(L::ScaledOperator) = L.λ * sparse(L.L)
217217

218218
# traits
@@ -311,7 +311,14 @@ end
311311
AddedOperator(L::AbstractSciMLOperator) = L
312312

313313
# constructors
314-
Base.:+(ops::AbstractSciMLOperator...) = AddedOperator(ops...)
314+
function Base.:+(ops::Union{AbstractSciMLOperator, AbstractMatrix}...)
315+
ops_ = ()
316+
for op in ops
317+
op = op isa AbstractMatrix ? MatrixOperator(op) : op
318+
ops_ = (ops_..., op)
319+
end
320+
AddedOperator(ops_...)
321+
end
315322
Base.:+(A::AbstractSciMLOperator, B::AddedOperator) = AddedOperator(A, B.ops...)
316323
Base.:+(A::AddedOperator, B::AbstractSciMLOperator) = AddedOperator(A.ops..., B)
317324
Base.:+(A::AddedOperator, B::AddedOperator) = AddedOperator(A.ops..., B.ops...)
@@ -327,6 +334,8 @@ function Base.:+(Z::NullOperator, A::AddedOperator)
327334
end
328335

329336
Base.:-(A::AbstractSciMLOperator, B::AbstractSciMLOperator) = AddedOperator(A, -B)
337+
Base.:-(A::AbstractSciMLOperator, B::AbstractMatrix) = A - MatrixOperator(B)
338+
Base.:-(A::AbstractMatrix, B::AbstractSciMLOperator) = MatrixOperator(A) - B
330339

331340
for op in (
332341
:+, :-,
@@ -350,7 +359,7 @@ for op in (
350359
end
351360

352361
Base.convert(::Type{AbstractMatrix}, L::AddedOperator) = sum(op -> convert(AbstractMatrix, op), L.ops)
353-
SparseArrays.sparse(L::AddedOperator) = sum(_sparse, L.ops)
362+
SparseArrays.sparse(L::AddedOperator) = sum(sparse, L.ops)
354363

355364
# traits
356365
Base.size(L::AddedOperator) = size(first(L.ops))
@@ -482,7 +491,7 @@ for op in (
482491
end
483492

484493
Base.convert(::Type{AbstractMatrix}, L::ComposedOperator) = prod(op -> convert(AbstractMatrix, op), L.ops)
485-
SparseArrays.sparse(L::ComposedOperator) = prod(_sparse, L.ops)
494+
SparseArrays.sparse(L::ComposedOperator) = prod(sparse, L.ops)
486495

487496
# traits
488497
Base.size(L::ComposedOperator) = (size(first(L.ops), 1), size(last(L.ops),2))
@@ -686,7 +695,7 @@ function LinearAlgebra.mul!(v::AbstractVecOrMat, L::InvertedOperator, u::Abstrac
686695
axpy!(β, L.cache, v)
687696
end
688697

689-
function LinearAlgebra.ldiv!(v::AbstractVecOrMat, L::InvertedOperator, u)
698+
function LinearAlgebra.ldiv!(v::AbstractVecOrMat, L::InvertedOperator, u::AbstractVecOrMat)
690699
mul!(v, L.L, u)
691700
end
692701

src/interface.jl

Lines changed: 12 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -167,12 +167,12 @@ issquare(::Union{
167167
issquare(A...) = @. (&)(issquare(A)...)
168168

169169
Base.isreal(L::AbstractSciMLOperator{T}) where{T} = T <: Real
170-
Base.Matrix(L::AbstractSciMLLinearOperator) = Matrix(convert(AbstractMatrix, L))
170+
Base.Matrix(L::AbstractSciMLOperator) = Matrix(convert(AbstractMatrix, L))
171171

172-
LinearAlgebra.exp(L::AbstractSciMLLinearOperator,t) = exp(t*L)
172+
LinearAlgebra.exp(L::AbstractSciMLOperator,t) = exp(t*L)
173173
has_exp(L::AbstractSciMLLinearOperator) = true
174-
expmv(L::AbstractSciMLLinearOperator,u,p,t) = exp(L,t)*u
175-
expmv!(v,L::AbstractSciMLLinearOperator,u,p,t) = mul!(v,exp(L,t),u)
174+
expmv(L::AbstractSciMLOperator,u,p,t) = exp(L,t)*u
175+
expmv!(v,L::AbstractSciMLOperator,u,p,t) = mul!(v,exp(L,t),u)
176176

177177
###
178178
# fallback implementations
@@ -188,46 +188,37 @@ function Base.:(==)(L1::AbstractSciMLOperator, L2::AbstractSciMLOperator)
188188
convert(AbstractMatrix, L1) == convert(AbstractMatrix, L1)
189189
end
190190

191-
Base.@propagate_inbounds function Base.getindex(L::AbstractSciMLLinearOperator, I::Vararg{Any,N}) where {N}
191+
Base.@propagate_inbounds function Base.getindex(L::AbstractSciMLOperator, I::Vararg{Any,N}) where {N}
192192
convert(AbstractMatrix, L)[I...]
193193
end
194-
function Base.getindex(L::AbstractSciMLLinearOperator, I::Vararg{Int, N}) where {N}
194+
function Base.getindex(L::AbstractSciMLOperator, I::Vararg{Int, N}) where {N}
195195
convert(AbstractMatrix,L)[I...]
196196
end
197197

198-
LinearAlgebra.exp(L::AbstractSciMLLinearOperator) = exp(Matrix(L))
199-
LinearAlgebra.opnorm(L::AbstractSciMLLinearOperator, p::Real=2) = opnorm(convert(AbstractMatrix,L), p)
198+
LinearAlgebra.exp(L::AbstractSciMLOperator) = exp(Matrix(L))
199+
LinearAlgebra.opnorm(L::AbstractSciMLOperator, p::Real=2) = opnorm(convert(AbstractMatrix,L), p)
200200
for pred in (
201201
:issymmetric,
202202
:ishermitian,
203203
:isposdef,
204204
)
205-
@eval function LinearAlgebra.$pred(L::AbstractSciMLLinearOperator)
205+
@eval function LinearAlgebra.$pred(L::AbstractSciMLOperator)
206206
$pred(convert(AbstractMatrix, L))
207207
end
208208
end
209209
for op in (
210210
:sum,:prod
211211
)
212-
@eval function LinearAlgebra.$op(L::AbstractSciMLLinearOperator; kwargs...)
212+
@eval function LinearAlgebra.$op(L::AbstractSciMLOperator; kwargs...)
213213
$op(convert(AbstractMatrix, L); kwargs...)
214214
end
215215
end
216216

217-
for op in (
218-
:+, :-,
219-
)
220-
221-
@eval function Base.$op(L::AbstractSciMLLinearOperator, u::AbstractVecOrMat)
222-
$op(convert(AbstractMatrix,L), u)
223-
end
224-
end
225-
226-
function LinearAlgebra.mul!(v::AbstractVecOrMat, L::AbstractSciMLLinearOperator, u::AbstractVecOrMat)
217+
function LinearAlgebra.mul!(v::AbstractVecOrMat, L::AbstractSciMLOperator, u::AbstractVecOrMat)
227218
mul!(v, convert(AbstractMatrix,L), u)
228219
end
229220

230-
function LinearAlgebra.mul!(v::AbstractVecOrMat, L::AbstractSciMLLinearOperator, u::AbstractVecOrMat, α, β)
221+
function LinearAlgebra.mul!(v::AbstractVecOrMat, L::AbstractSciMLOperator, u::AbstractVecOrMat, α, β)
231222
mul!(v, convert(AbstractMatrix,L), u, α, β)
232223
end
233224
#

src/matrix.jl

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ isconstant(L::MatrixOperator) = L.update_func == DEFAULT_UPDATE_FUNC
5252
Base.iszero(L::MatrixOperator) = iszero(L.A)
5353

5454
SparseArrays.sparse(L::MatrixOperator) = sparse(L.A)
55+
SparseArrays.issparse(L::MatrixOperator) = issparse(L.A)
5556

5657
# TODO - add tests for MatrixOperator indexing
5758
# propagate_inbounds here for the getindex fallback
@@ -142,12 +143,16 @@ for fact in (
142143
:svd, :svd!,
143144
)
144145

145-
@eval LinearAlgebra.$fact(L::AbstractSciMLLinearOperator, args...) =
146+
@eval LinearAlgebra.$fact(L::AbstractSciMLOperator, args...) =
146147
InvertibleOperator($fact(convert(AbstractMatrix, L), args...))
147-
@eval LinearAlgebra.$fact(L::AbstractSciMLLinearOperator; kwargs...) =
148+
@eval LinearAlgebra.$fact(L::AbstractSciMLOperator; kwargs...) =
148149
InvertibleOperator($fact(convert(AbstractMatrix, L); kwargs...))
149150
end
150151

152+
function Base.convert(::Type{<:Factorization}, L::InvertibleOperator{T,<:Factorization}) where{T}
153+
L.F
154+
end
155+
151156
function Base.convert(::Type{AbstractMatrix}, L::InvertibleOperator)
152157
if L.F isa Adjoint
153158
convert(AbstractMatrix,L.F')'

src/multidim.jl

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ for op in (
2121
end
2222
end
2323

24-
function LinearAlgebra.mul!(v::AbstractArray, L::AbstractSciMLLinearOperator, u::AbstractArray)
24+
function LinearAlgebra.mul!(v::AbstractArray, L::AbstractSciMLOperator, u::AbstractArray)
2525
u isa AbstractVecOrMat && @error "LinearAlgebra.mul! not defined for $(typeof(L)), $(typeof(u))."
2626

2727
sizes = _mat_sizes(L, u)
@@ -34,7 +34,7 @@ function LinearAlgebra.mul!(v::AbstractArray, L::AbstractSciMLLinearOperator, u:
3434
v
3535
end
3636

37-
function LinearAlgebra.mul!(v::AbstractArray, L::AbstractSciMLLinearOperator, u::AbstractArray, α, β)
37+
function LinearAlgebra.mul!(v::AbstractArray, L::AbstractSciMLOperator, u::AbstractArray, α, β)
3838
u isa AbstractVecOrMat && @error "LinearAlgebra.mul! not defined for $(typeof(L)), $(typeof(u))."
3939

4040
sizes = _mat_sizes(L, u)
@@ -47,7 +47,7 @@ function LinearAlgebra.mul!(v::AbstractArray, L::AbstractSciMLLinearOperator, u:
4747
v
4848
end
4949

50-
function LinearAlgebra.ldiv!(v::AbstractArray, L::AbstractSciMLLinearOperator, u::AbstractArray)
50+
function LinearAlgebra.ldiv!(v::AbstractArray, L::AbstractSciMLOperator, u::AbstractArray)
5151
u isa AbstractVecOrMat && @error "LinearAlgebra.ldiv! not defined for $(typeof(L)), $(typeof(u))."
5252

5353
sizes = _mat_sizes(L, u)
@@ -60,7 +60,7 @@ function LinearAlgebra.ldiv!(v::AbstractArray, L::AbstractSciMLLinearOperator, u
6060
v
6161
end
6262

63-
function LinearAlgebra.ldiv!(L::AbstractSciMLLinearOperator, u::AbstractArray)
63+
function LinearAlgebra.ldiv!(L::AbstractSciMLOperator, u::AbstractArray)
6464
u isa AbstractVecOrMat && @error "LinearAlgebra.ldiv! not defined for $(typeof(L)), $(typeof(u))."
6565

6666
sizes = _mat_sizes(L, u)

0 commit comments

Comments
 (0)