Skip to content

Commit 97dd159

Browse files
committed
add tests
1 parent c4d78f8 commit 97dd159

File tree

3 files changed

+26
-13
lines changed

3 files changed

+26
-13
lines changed

src/QuasiArrays.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ using Base, LinearAlgebra, LazyArrays, ArrayLayouts, DomainSets, FillArrays, Sta
33
import Base: getindex, size, axes, axes1, length, ==, isequal, iterate, CartesianIndices, LinearIndices,
44
Indices, IndexStyle, getindex, setindex!, parent, vec, convert, similar, copy, copyto!, zero,
55
map, eachindex, eltype, first, last, firstindex, lastindex, in, reshape, permutedims, all,
6-
isreal, iszero, isempty, empty, isapprox, fill!, getproperty, showarg
6+
isreal, iszero, isone, isempty, empty, isapprox, fill!, getproperty, showarg
77
import Base: @_inline_meta, DimOrInd, OneTo, @_propagate_inbounds_meta, @_noinline_meta,
88
DimsInteger, error_if_canonical_getindex, @propagate_inbounds, _return_type,
99
safe_tail, front, tail, _getindex, _maybe_reshape, index_ndims, _unsafe_getindex,

src/calculus.jl

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -69,24 +69,29 @@ function diff_layout(LAY::ApplyLayout{typeof(*)}, V::AbstractQuasiMatrix, order.
6969
end
7070

7171
diff_layout(::MemoryLayout, A, order...; dims...) = diff_size(size(A), A, order...; dims...)
72-
diff_size(sz, a, order...; dims...) = error("diff not implemented for $(typeof(a))")
72+
diff_size(sz, a; dims...) = error("diff not implemented for $(typeof(a))")
73+
function diff_size(sz, a, order::Int; dims...)
74+
order < 0 && throw(ArgumentError("order must be non-negative"))
75+
order == 0 && return a
76+
isone(order) ? diff(a) : diff(diff(a), order-1)
77+
end
7378

7479
diff(x::Inclusion; dims::Integer=1) = ones(eltype(x), diffaxes(x))
75-
diff(x::Inclusion, order::Int; dims::Integer=1) = fill(ifelse(isone(order), one(eltype(x)), zero(eltype(x))), diffaxes(x))
76-
diff(c::AbstractQuasiFill{<:Any,1}, order...; dims::Integer=1) = zeros(eltype(c), diffaxes(axes(c,1)))
80+
diff(x::Inclusion, order::Int; dims::Integer=1) = fill(ifelse(isone(order), one(eltype(x)), zero(eltype(x))), diffaxes(x,order))
81+
diff(c::AbstractQuasiFill{<:Any,1}, order...; dims::Integer=1) = zeros(eltype(c), diffaxes(axes(c,1),order...))
7782
function diff(c::AbstractQuasiFill{<:Any,2}, order...; dims::Integer=1)
7883
a,b = axes(c)
7984
if dims == 1
80-
zeros(eltype(c), diffaxes(a), b)
85+
zeros(eltype(c), diffaxes(a, order...), b)
8186
else
82-
zeros(eltype(c), a, diffaxes(b))
87+
zeros(eltype(c), a, diffaxes(b, order...))
8388
end
8489
end
8590

8691

87-
diffaxes(a::Inclusion{<:Any,<:AbstractVector}) = Inclusion(a.domain[1:end-1])
88-
diffaxes(a::OneTo) = oneto(length(a)-1)
89-
diffaxes(a) = a # default is differentiation does not change axes
92+
diffaxes(a::Inclusion{<:Any,<:AbstractVector}, order=1) = Inclusion(a.domain[1:end-order])
93+
diffaxes(a::OneTo, order=1) = oneto(length(a)-order)
94+
diffaxes(a, order...) = a # default is differentiation does not change axes
9095

9196
diff(b::QuasiVector; dims::Integer=1) = QuasiVector(diff(b.parent) ./ diff(b.axes[1]), (diffaxes(axes(b,1)),))
9297
function diff(A::QuasiMatrix; dims::Integer=1)

test/test_calculus.jl

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -30,19 +30,25 @@ using QuasiArrays, IntervalSets, Test
3030

3131
@testset "Diff" begin
3232
x = range(0, 1; length=10_000)
33-
@test diff(Inclusion(x)) == ones(Inclusion(x[1:end-1]))
34-
@test diff(ones(Inclusion(x))) == zeros(Inclusion(x[1:end-1]))
33+
@test diff(Inclusion(x)) == diff(Inclusion(x),1) == ones(Inclusion(x[1:end-1]))
34+
@test diff(Inclusion(x),2) == diff(diff(Inclusion(x))) == zeros(Inclusion(x[1:end-2]))
35+
@test diff(ones(Inclusion(x))) == diff(ones(Inclusion(x)),1) == zeros(Inclusion(x[1:end-1]))
36+
@test diff(ones(Inclusion(x)),2) == diff(diff(ones(Inclusion(x)))) == zeros(Inclusion(x[1:end-2]))
3537

3638
@test diff(ones(Inclusion(x), Inclusion(x))) == zeros(Inclusion(x[1:end-1]), Inclusion(x))
39+
@test diff(ones(Inclusion(x), Inclusion(x)), 2) == zeros(Inclusion(x[1:end-2]), Inclusion(x))
3740
@test diff(ones(Inclusion(x), Inclusion(x)); dims=2) == zeros(Inclusion(x), Inclusion(x[1:end-1]))
41+
@test diff(ones(Inclusion(x), Inclusion(x)), 2; dims=2) == zeros(Inclusion(x), Inclusion(x[1:end-2]))
3842

3943
b = QuasiVector(exp.(x), x)
4044

4145
@test diff(b) b[Inclusion(x[1:end-1])] atol=1E-2
46+
@test diff(b,2) b[Inclusion(x[1:end-2])] atol=1E-1
4247

4348

4449
A = QuasiArray(randn(3,2), (1:0.5:2,0:0.5:0.5))
4550
@test diff(A; dims=1)[:,0] == diff(A[:,0])
51+
@test diff(A,2; dims=1)[:,0] == diff(diff(A[:,0]))
4652
@test diff(A; dims=2)[1,:] == diff(A[1,:])
4753

4854
@testset "* diff" begin
@@ -57,8 +63,10 @@ using QuasiArrays, IntervalSets, Test
5763

5864
@testset "Interval" begin
5965
@test diff(Inclusion(0.0..1)) ones(Inclusion(0.0..1))
60-
@test diff(ones(Inclusion(0.0..1))) zeros(Inclusion(0.0..1))
61-
@test diff(ones(Inclusion(0.0..1), Base.OneTo(3))) zeros(Inclusion(0.0..1), Base.OneTo(3))
66+
@test diff(Inclusion(0.0..1),1) fill(1.0,Inclusion(0.0..1))
67+
@test diff(Inclusion(0.0..1),2) fill(0.0,Inclusion(0.0..1))
68+
@test diff(ones(Inclusion(0.0..1))) diff(ones(Inclusion(0.0..1)),1) diff(ones(Inclusion(0.0..1)),2) zeros(Inclusion(0.0..1))
69+
@test diff(ones(Inclusion(0.0..1), Base.OneTo(3))) diff(ones(Inclusion(0.0..1), Base.OneTo(3)),2) zeros(Inclusion(0.0..1), Base.OneTo(3))
6270
@test diff(ones(Inclusion(0.0..1), Base.OneTo(3)); dims=2) zeros(Inclusion(0.0..1), Base.OneTo(2))
6371
@test diff(ones(Base.OneTo(3), Inclusion(0.0..1))) zeros(Base.OneTo(2), Inclusion(0.0..1))
6472
@test diff(ones(Base.OneTo(3), Inclusion(0.0..1)); dims=2) zeros(Base.OneTo(3), Inclusion(0.0..1))

0 commit comments

Comments
 (0)