From 041563490ead192ca5dd49766e08fff82e74fd2a Mon Sep 17 00:00:00 2001 From: Alexey Stukalov Date: Tue, 19 Jul 2022 20:18:50 -0700 Subject: [PATCH 1/6] tests: refine type checks --- test/runtests.jl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/runtests.jl b/test/runtests.jl index fe5836d..0c38069 100644 --- a/test/runtests.jl +++ b/test/runtests.jl @@ -35,11 +35,11 @@ for f in DiffTests.ARRAY_TO_ARRAY_FUNCS end for f in DiffTests.MATRIX_TO_MATRIX_FUNCS - @test isa(f(A), Array) + @test isa(f(A), Matrix) end for f in DiffTests.BINARY_MATRIX_TO_MATRIX_FUNCS - @test isa(f(A, B), Array) + @test isa(f(A, B), Matrix) end # f! returns Nothing From 07956b740c4b41bf9567773884481bd3b493af69 Mon Sep 17 00:00:00 2001 From: Alexey Stukalov Date: Tue, 19 Jul 2022 20:20:07 -0700 Subject: [PATCH 2/6] add A*x to VEC_TO_VEC funcs --- src/DiffTests.jl | 35 ++++++++++++++++++++++++++++++++++- test/runtests.jl | 4 ++++ 2 files changed, 38 insertions(+), 1 deletion(-) diff --git a/src/DiffTests.jl b/src/DiffTests.jl index 31d7bd6..12a17ec 100644 --- a/src/DiffTests.jl +++ b/src/DiffTests.jl @@ -1,6 +1,6 @@ module DiffTests -using LinearAlgebra: det, norm, dot, tr +using LinearAlgebra: det, norm, dot, tr, Diagonal, LowerTriangular, UpperTriangular using Statistics: mean #= @@ -246,9 +246,42 @@ function mutation_test_2!(y, x) return nothing end +############################ +# f(x::VecOrMat)::VecOrMat # +############################ + const INPLACE_ARRAY_TO_ARRAY_FUNCS = (chebyquad!, brown_almost_linear!, trigonometric!, mutation_test_1!, mutation_test_2!) +diag_matrix(::Type{T}, n::Integer) where T<:Real = + Diagonal(LinRange(convert(T, 0.01), convert(T, 100.0), n)) +diag_matrix(x::VecOrMat) = diag_matrix(Float64, size(x, 1)) + +hilbert_matrix(::Type{T}, n::Integer) where T<:Real = + [convert(T, inv(i + j - 1)) for i in 1:n, j in 1:n] +hilbert_matrix(x::VecOrMat) = hilbert_matrix(Float64, size(x, 1)) + +lehmer_matrix(::Type{T}, n::Integer) where T<:Real = + [convert(T, min(i, j)/max(i, j)) for i in 1:n, j in 1:n] +lehmer_matrix(x::VecOrMat) = lehmer_matrix(Float64, size(x, 1)) + +test_matrix = lehmer_matrix + +# left multiplication by a constant matrix +diag_lmul(x::VecOrMat) = diag_matrix(x) * x +dense_lmul(x::VecOrMat) = test_matrix(x) * x +utriag_lmul(x::VecOrMat) = UpperTriangular(test_matrix(x)) * x +ltriag_lmul(x::VecOrMat) = LowerTriangular(test_matrix(x)) * x + +# left division by a constant matrix +diag_ldiv(x::VecOrMat) = diag_matrix(x) \ x +dense_ldiv(x::VecOrMat) = test_matrix(x) \ x +utriag_ldiv(x::VecOrMat) = UpperTriangular(test_matrix(x)) \ x +ltriag_ldiv(x::VecOrMat) = LowerTriangular(test_matrix(x)) \ x + +const VECTOR_TO_VECTOR_FUNCS = (diag_lmul, dense_lmul, utriag_lmul, ltriag_lmul, + diag_ldiv, utriag_ldiv, ltriag_ldiv) + ###################### # f(x::Array)::Array # ###################### diff --git a/test/runtests.jl b/test/runtests.jl index 0c38069..d217acf 100644 --- a/test/runtests.jl +++ b/test/runtests.jl @@ -34,6 +34,10 @@ for f in DiffTests.ARRAY_TO_ARRAY_FUNCS @test isa(f(y), Array) end +for f in DiffTests.VECTOR_TO_VECTOR_FUNCS + @test isa(f(y), Vector) +end + for f in DiffTests.MATRIX_TO_MATRIX_FUNCS @test isa(f(A), Matrix) end From 094d17dfa8b97fe886a01cf487ddbac9feff6d64 Mon Sep 17 00:00:00 2001 From: Alexey Stukalov Date: Tue, 19 Jul 2022 20:20:26 -0700 Subject: [PATCH 3/6] add A*X to MAT_TO_MAT funcs --- src/DiffTests.jl | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/DiffTests.jl b/src/DiffTests.jl index 12a17ec..0579713 100644 --- a/src/DiffTests.jl +++ b/src/DiffTests.jl @@ -307,6 +307,8 @@ const ARRAY_TO_ARRAY_FUNCS = (-, chebyquad, brown_almost_linear, trigonometric, # f(::Matrix)::Matrix # ####################### -const MATRIX_TO_MATRIX_FUNCS = (inv,) +const MATRIX_TO_MATRIX_FUNCS = (inv, + diag_lmul, dense_lmul, utriag_lmul, ltriag_lmul, + diag_ldiv, utriag_ldiv, ltriag_ldiv) end # module From 10f17ce3064a2f90ae5125aebfebf2ef7e056281 Mon Sep 17 00:00:00 2001 From: Alexey Stukalov Date: Thu, 21 Jul 2022 14:40:05 -0700 Subject: [PATCH 4/6] fix misplaced comment --- src/DiffTests.jl | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/DiffTests.jl b/src/DiffTests.jl index 0579713..0d00e31 100644 --- a/src/DiffTests.jl +++ b/src/DiffTests.jl @@ -246,13 +246,13 @@ function mutation_test_2!(y, x) return nothing end +const INPLACE_ARRAY_TO_ARRAY_FUNCS = (chebyquad!, brown_almost_linear!, trigonometric!, + mutation_test_1!, mutation_test_2!) + ############################ # f(x::VecOrMat)::VecOrMat # ############################ -const INPLACE_ARRAY_TO_ARRAY_FUNCS = (chebyquad!, brown_almost_linear!, trigonometric!, - mutation_test_1!, mutation_test_2!) - diag_matrix(::Type{T}, n::Integer) where T<:Real = Diagonal(LinRange(convert(T, 0.01), convert(T, 100.0), n)) diag_matrix(x::VecOrMat) = diag_matrix(Float64, size(x, 1)) From 2b55856b906384042e0f98680884e8ae5276f588 Mon Sep 17 00:00:00 2001 From: Alexey Stukalov Date: Mon, 22 Aug 2022 16:59:00 -0700 Subject: [PATCH 5/6] add sparse matrix-based functions --- Project.toml | 3 ++- src/DiffTests.jl | 15 +++++++++++++-- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/Project.toml b/Project.toml index 40abe87..0ad759a 100644 --- a/Project.toml +++ b/Project.toml @@ -6,10 +6,11 @@ version = "0.1.1" [deps] LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" +SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" Statistics = "10745b16-79ce-11e8-11f9-7d13ad32a3b2" [compat] -julia="1" +julia = "1" [extras] Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" diff --git a/src/DiffTests.jl b/src/DiffTests.jl index 0d00e31..fae17bf 100644 --- a/src/DiffTests.jl +++ b/src/DiffTests.jl @@ -1,6 +1,7 @@ module DiffTests using LinearAlgebra: det, norm, dot, tr, Diagonal, LowerTriangular, UpperTriangular +using SparseArrays: sparse using Statistics: mean #= @@ -272,15 +273,23 @@ diag_lmul(x::VecOrMat) = diag_matrix(x) * x dense_lmul(x::VecOrMat) = test_matrix(x) * x utriag_lmul(x::VecOrMat) = UpperTriangular(test_matrix(x)) * x ltriag_lmul(x::VecOrMat) = LowerTriangular(test_matrix(x)) * x +sparse_lmul(x::VecOrMat) = sparse(test_matrix(x)) * x +sp_utriag_lmul(x::VecOrMat) = UpperTriangular(sparse(test_matrix(x))) * x +sp_ltriag_lmul(x::VecOrMat) = LowerTriangular(sparse(test_matrix(x))) * x # left division by a constant matrix diag_ldiv(x::VecOrMat) = diag_matrix(x) \ x dense_ldiv(x::VecOrMat) = test_matrix(x) \ x utriag_ldiv(x::VecOrMat) = UpperTriangular(test_matrix(x)) \ x ltriag_ldiv(x::VecOrMat) = LowerTriangular(test_matrix(x)) \ x +sparse_ldiv(x::VecOrMat) = sparse(test_matrix(x)) \ x +sp_utriag_ldiv(x::VecOrMat) = UpperTriangular(sparse(test_matrix(x))) \ x +sp_ltriag_ldiv(x::VecOrMat) = LowerTriangular(sparse(test_matrix(x))) \ x const VECTOR_TO_VECTOR_FUNCS = (diag_lmul, dense_lmul, utriag_lmul, ltriag_lmul, - diag_ldiv, utriag_ldiv, ltriag_ldiv) + sparse_lmul, sp_utriag_lmul, sp_ltriag_lmul, + diag_ldiv, utriag_ldiv, ltriag_ldiv, + sparse_ldiv, sp_utriag_ldiv, sp_ltriag_ldiv,) ###################### # f(x::Array)::Array # @@ -309,6 +318,8 @@ const ARRAY_TO_ARRAY_FUNCS = (-, chebyquad, brown_almost_linear, trigonometric, const MATRIX_TO_MATRIX_FUNCS = (inv, diag_lmul, dense_lmul, utriag_lmul, ltriag_lmul, - diag_ldiv, utriag_ldiv, ltriag_ldiv) + sparse_lmul, sp_utriag_lmul, sp_ltriag_lmul, + diag_ldiv, utriag_ldiv, ltriag_ldiv, + sparse_ldiv, sp_utriag_ldiv, sp_ltriag_ldiv,) end # module From 8af779048727e4f8a75e6942a35cfa33e42e5d26 Mon Sep 17 00:00:00 2001 From: Alexey Stukalov Date: Tue, 23 Aug 2022 09:47:14 -0700 Subject: [PATCH 6/6] remove hilbert_matrix() (unused) --- src/DiffTests.jl | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/DiffTests.jl b/src/DiffTests.jl index fae17bf..be079d4 100644 --- a/src/DiffTests.jl +++ b/src/DiffTests.jl @@ -258,10 +258,6 @@ diag_matrix(::Type{T}, n::Integer) where T<:Real = Diagonal(LinRange(convert(T, 0.01), convert(T, 100.0), n)) diag_matrix(x::VecOrMat) = diag_matrix(Float64, size(x, 1)) -hilbert_matrix(::Type{T}, n::Integer) where T<:Real = - [convert(T, inv(i + j - 1)) for i in 1:n, j in 1:n] -hilbert_matrix(x::VecOrMat) = hilbert_matrix(Float64, size(x, 1)) - lehmer_matrix(::Type{T}, n::Integer) where T<:Real = [convert(T, min(i, j)/max(i, j)) for i in 1:n, j in 1:n] lehmer_matrix(x::VecOrMat) = lehmer_matrix(Float64, size(x, 1))