From c87a1e13dd9c0510aefd0347443186663b99ea0b Mon Sep 17 00:00:00 2001 From: Lukas Devos Date: Tue, 14 Jan 2025 07:20:40 -0500 Subject: [PATCH 1/8] pre-scale destination --- src/abstractsparsearrayinterface.jl | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/abstractsparsearrayinterface.jl b/src/abstractsparsearrayinterface.jl index 65937f3..0195d2a 100644 --- a/src/abstractsparsearrayinterface.jl +++ b/src/abstractsparsearrayinterface.jl @@ -357,11 +357,13 @@ function sparse_mul!( β::Number=false; (mul!!)=(default_mul!!), ) + storage(a_dest) .*= β + β′ = true for I1 in eachstoredindex(a1) for I2 in eachstoredindex(a2) I_dest = mul_indices(I1, I2) if !isnothing(I_dest) - a_dest[I_dest] = mul!!(a_dest[I_dest], a1[I1], a2[I2], α, β) + a_dest[I_dest] = mul!!(a_dest[I_dest], a1[I1], a2[I2], α, β′) end end end From 754f69c5f1154abac5263d121015286d6616ae93 Mon Sep 17 00:00:00 2001 From: Lukas Devos Date: Tue, 14 Jan 2025 07:43:34 -0500 Subject: [PATCH 2/8] add tests --- test/Project.toml | 2 ++ test/basics/test_linalg.jl | 35 +++++++++++++++++++++++++++++++++++ 2 files changed, 37 insertions(+) create mode 100644 test/basics/test_linalg.jl diff --git a/test/Project.toml b/test/Project.toml index 4e5feb3..6380142 100644 --- a/test/Project.toml +++ b/test/Project.toml @@ -5,6 +5,8 @@ ArrayLayouts = "4c555306-a7a7-4459-81d9-ec55ddd5c99a" DerivableInterfaces = "6c5e35bf-e59e-4898-b73c-732dcc4ba65f" Dictionaries = "85a47980-9c8c-11e8-2b9f-f7ca1fa99fb4" JLArrays = "27aeb0d3-9eb9-45fb-866b-73c2ecf80fcb" +LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" +Random = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c" SafeTestsets = "1bc83da4-3b8d-516f-aca4-4fe02f6d838f" SparseArraysBase = "0d5efcca-f356-4864-8770-e1ed8d78f208" Suppressor = "fd094767-a336-5f1f-9728-57cf17d0bbfb" diff --git a/test/basics/test_linalg.jl b/test/basics/test_linalg.jl new file mode 100644 index 0000000..610f867 --- /dev/null +++ b/test/basics/test_linalg.jl @@ -0,0 +1,35 @@ +using SparseArraysBase: SparseArrayDOK +using LinearAlgebra: mul! +using Random + +# TODO: add this to main package +function sprand(::Type{T}, sz::Base.Dims; p::Real=0.5) where {T} + A = SparseArrayDOK{T}(undef, sz) + for I in eachindex(A) + if rand() < p + A[I] = rand(T) + end + end + return A +end + +@testset "mul!" begin + T = Float64 + szA = (2, 2) + szB = (2, 2) + szC = (szA[1], szB[2]) + + for p in 0.0:0.25:1 + C = sprand(T, szC; p) + A = sprand(T, szA; p) + B = sprand(T, szB; p) + + check1 = mul!(Array(C), Array(A), Array(B)) + @test mul!(copy(C), A, B) ≈ check1 + + α = rand() + β = rand() + check2 = mul!(Array(C), Array(A), Array(B), α, β) + @test mul!(copy(C), A, B, α, β) ≈ check2 + end +end From 71b8a31f7e6bae2a050dd6acfc11746e962c56c8 Mon Sep 17 00:00:00 2001 From: Lukas Devos Date: Tue, 14 Jan 2025 10:47:00 -0500 Subject: [PATCH 3/8] commit code suggestion (second option) Co-authored-by: Matt Fishman --- src/abstractsparsearrayinterface.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/abstractsparsearrayinterface.jl b/src/abstractsparsearrayinterface.jl index 0195d2a..af73b3a 100644 --- a/src/abstractsparsearrayinterface.jl +++ b/src/abstractsparsearrayinterface.jl @@ -357,7 +357,7 @@ function sparse_mul!( β::Number=false; (mul!!)=(default_mul!!), ) - storage(a_dest) .*= β + storedvalues(a_dest) .*= β β′ = true for I1 in eachstoredindex(a1) for I2 in eachstoredindex(a2) From 98d5c6a70937d210cfcfec01b8ff04a4e21fdfa5 Mon Sep 17 00:00:00 2001 From: Lukas Devos Date: Tue, 14 Jan 2025 10:53:39 -0500 Subject: [PATCH 4/8] Make random tests reproducible --- test/Project.toml | 1 + test/basics/test_linalg.jl | 21 ++++++++++++--------- 2 files changed, 13 insertions(+), 9 deletions(-) diff --git a/test/Project.toml b/test/Project.toml index 6380142..575c9b2 100644 --- a/test/Project.toml +++ b/test/Project.toml @@ -9,5 +9,6 @@ LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" Random = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c" SafeTestsets = "1bc83da4-3b8d-516f-aca4-4fe02f6d838f" SparseArraysBase = "0d5efcca-f356-4864-8770-e1ed8d78f208" +StableRNGs = "860ef19b-820b-49d6-a774-d7a799459cd3" Suppressor = "fd094767-a336-5f1f-9728-57cf17d0bbfb" Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" diff --git a/test/basics/test_linalg.jl b/test/basics/test_linalg.jl index 610f867..f48585c 100644 --- a/test/basics/test_linalg.jl +++ b/test/basics/test_linalg.jl @@ -1,13 +1,16 @@ using SparseArraysBase: SparseArrayDOK using LinearAlgebra: mul! -using Random +using Random: Random +using StableRNGs: StableRNG + +const rng = StableRNG(123) # TODO: add this to main package -function sprand(::Type{T}, sz::Base.Dims; p::Real=0.5) where {T} +function sprand(rng::Random.AbstractRNG, ::Type{T}, sz::Base.Dims; p::Real=0.5) where {T} A = SparseArrayDOK{T}(undef, sz) for I in eachindex(A) - if rand() < p - A[I] = rand(T) + if rand(rng) < p + A[I] = rand(rng, T) end end return A @@ -20,15 +23,15 @@ end szC = (szA[1], szB[2]) for p in 0.0:0.25:1 - C = sprand(T, szC; p) - A = sprand(T, szA; p) - B = sprand(T, szB; p) + C = sprand(rng, T, szC; p) + A = sprand(rng, T, szA; p) + B = sprand(rng, T, szB; p) check1 = mul!(Array(C), Array(A), Array(B)) @test mul!(copy(C), A, B) ≈ check1 - α = rand() - β = rand() + α = rand(rng, T) + β = rand(rng, T) check2 = mul!(Array(C), Array(A), Array(B), α, β) @test mul!(copy(C), A, B, α, β) ≈ check2 end From 937271e8b407e007d063323cfe870bf69cb38b68 Mon Sep 17 00:00:00 2001 From: Lukas Devos Date: Tue, 14 Jan 2025 15:27:14 -0500 Subject: [PATCH 5/8] commit code suggestion Co-authored-by: Matt Fishman --- src/abstractsparsearrayinterface.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/abstractsparsearrayinterface.jl b/src/abstractsparsearrayinterface.jl index af73b3a..63fab67 100644 --- a/src/abstractsparsearrayinterface.jl +++ b/src/abstractsparsearrayinterface.jl @@ -358,7 +358,7 @@ function sparse_mul!( (mul!!)=(default_mul!!), ) storedvalues(a_dest) .*= β - β′ = true + β′ = one(Bool) for I1 in eachstoredindex(a1) for I2 in eachstoredindex(a2) I_dest = mul_indices(I1, I2) From 503985e48045c07fe10c47b567b9a0d7e37dc1f1 Mon Sep 17 00:00:00 2001 From: Matt Fishman Date: Tue, 14 Jan 2025 16:17:12 -0500 Subject: [PATCH 6/8] Add comment --- src/abstractsparsearrayinterface.jl | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/abstractsparsearrayinterface.jl b/src/abstractsparsearrayinterface.jl index 63fab67..2981200 100644 --- a/src/abstractsparsearrayinterface.jl +++ b/src/abstractsparsearrayinterface.jl @@ -357,6 +357,8 @@ function sparse_mul!( β::Number=false; (mul!!)=(default_mul!!), ) + # TODO: Change to: `a_dest .*= β` + # once #19 is fixed. storedvalues(a_dest) .*= β β′ = one(Bool) for I1 in eachstoredindex(a1) From 45f680f113c1d8ad6266406e50f8a424469541c4 Mon Sep 17 00:00:00 2001 From: Matt Fishman Date: Tue, 14 Jan 2025 16:18:02 -0500 Subject: [PATCH 7/8] Better comment --- src/abstractsparsearrayinterface.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/abstractsparsearrayinterface.jl b/src/abstractsparsearrayinterface.jl index 2981200..6d83385 100644 --- a/src/abstractsparsearrayinterface.jl +++ b/src/abstractsparsearrayinterface.jl @@ -358,7 +358,7 @@ function sparse_mul!( (mul!!)=(default_mul!!), ) # TODO: Change to: `a_dest .*= β` - # once #19 is fixed. + # once https://github.com/ITensor/SparseArraysBase.jl/issues/19 is fixed. storedvalues(a_dest) .*= β β′ = one(Bool) for I1 in eachstoredindex(a1) From 5cd89044566fab0bd8d06b22e6f77eb442276e57 Mon Sep 17 00:00:00 2001 From: Lukas Devos Date: Tue, 14 Jan 2025 16:20:33 -0500 Subject: [PATCH 8/8] Bump to v0.2.8 [no ci] --- Project.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Project.toml b/Project.toml index 2abfd48..d93698d 100644 --- a/Project.toml +++ b/Project.toml @@ -1,7 +1,7 @@ name = "SparseArraysBase" uuid = "0d5efcca-f356-4864-8770-e1ed8d78f208" authors = ["ITensor developers and contributors"] -version = "0.2.7" +version = "0.2.8" [deps] Accessors = "7d9f7c33-5ae7-4f3b-8dc6-eff91059b697"