From 74e94ddccb506f9d2f34e45afb467b05dc53bd2d Mon Sep 17 00:00:00 2001 From: Jerry Ling Date: Thu, 21 Apr 2022 23:27:59 -0400 Subject: [PATCH 1/9] fix findmin/findmax --- src/sparsevector.jl | 2 +- test/sparsevector.jl | 15 +++++++++++++++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/src/sparsevector.jl b/src/sparsevector.jl index 1f3d0793..281e4747 100644 --- a/src/sparsevector.jl +++ b/src/sparsevector.jl @@ -1433,7 +1433,7 @@ for (fun, comp, word) in ((:findmin, :(<), "minimum"), (:findmax, :(>), "maximum # we need to find the first zero, which could be stored or implicit # we try to avoid findfirst(iszero, x) sindex = findfirst(iszero, nzvals) # first stored zero, if any - zindex = findfirst(i -> i < nzinds[i], eachindex(nzinds)) # first non-stored zero + zindex = findfirst(i -> iszero(x[i]), eachindex(x)) # first non-stored zero index = isnothing(sindex) ? zindex : min(sindex, zindex) return zeroval, index end diff --git a/test/sparsevector.jl b/test/sparsevector.jl index 6eaaba98..4e63209e 100644 --- a/test/sparsevector.jl +++ b/test/sparsevector.jl @@ -898,6 +898,21 @@ end @test_throws ArgumentError findmin(x) @test_throws ArgumentError findmax(x) end + + let v = spzeros(3) #Julia #44978 + v[1] = 2 + @test argmin(v) == 2 + @test argmax(v) == 1 + v[1] = 0 + v[3] = 2 + @test argmin(v) == 1 + @test argmax(v) == 3 + end + + let v = spzeros(3) #Julia #44978 + v[3] = 2 + @test argmax(v) == 3 + end end ### linalg From b77fefd0928c2c404f931ab71f998251501d3ee2 Mon Sep 17 00:00:00 2001 From: Jerry Ling Date: Fri, 22 Apr 2022 08:48:42 -0400 Subject: [PATCH 2/9] Update sparsevector.jl --- src/sparsevector.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sparsevector.jl b/src/sparsevector.jl index 281e4747..4a74c495 100644 --- a/src/sparsevector.jl +++ b/src/sparsevector.jl @@ -1433,7 +1433,7 @@ for (fun, comp, word) in ((:findmin, :(<), "minimum"), (:findmax, :(>), "maximum # we need to find the first zero, which could be stored or implicit # we try to avoid findfirst(iszero, x) sindex = findfirst(iszero, nzvals) # first stored zero, if any - zindex = findfirst(i -> iszero(x[i]), eachindex(x)) # first non-stored zero + zindex = findfirst(i -> i <= nzinds[i], eachindex(nzinds)) # first non-stored zero index = isnothing(sindex) ? zindex : min(sindex, zindex) return zeroval, index end From c381d34935e774388e43e8e59f021046952d0f31 Mon Sep 17 00:00:00 2001 From: Jerry Ling Date: Fri, 22 Apr 2022 12:00:58 -0400 Subject: [PATCH 3/9] fix --- Project.toml | 3 ++- src/sparsevector.jl | 3 +++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/Project.toml b/Project.toml index bc8a968c..8257c9ac 100644 --- a/Project.toml +++ b/Project.toml @@ -1,9 +1,10 @@ name = "SparseArrays" -uuid = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" +uuid = "0f01184e-e22b-5df5-ae63-d93ebab69eaf" [deps] LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" Random = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c" +Revise = "295af30f-e4ad-537b-8983-00126c2a3abe" [extras] Dates = "ade2ca70-3891-5945-98fb-dc099432e06a" diff --git a/src/sparsevector.jl b/src/sparsevector.jl index 4a74c495..a5cd588f 100644 --- a/src/sparsevector.jl +++ b/src/sparsevector.jl @@ -1434,6 +1434,9 @@ for (fun, comp, word) in ((:findmin, :(<), "minimum"), (:findmax, :(>), "maximum # we try to avoid findfirst(iszero, x) sindex = findfirst(iszero, nzvals) # first stored zero, if any zindex = findfirst(i -> i <= nzinds[i], eachindex(nzinds)) # first non-stored zero + if !isnothing(zindex) && zindex < lastindex(x) + zindex += 1 + end index = isnothing(sindex) ? zindex : min(sindex, zindex) return zeroval, index end From 93713931c92de2a0d374b5ab3d06695f5de2986c Mon Sep 17 00:00:00 2001 From: Jerry Ling Date: Fri, 22 Apr 2022 12:02:49 -0400 Subject: [PATCH 4/9] fix UUID --- Project.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Project.toml b/Project.toml index 8257c9ac..7c78b425 100644 --- a/Project.toml +++ b/Project.toml @@ -1,5 +1,5 @@ name = "SparseArrays" -uuid = "0f01184e-e22b-5df5-ae63-d93ebab69eaf" +uuid = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" [deps] LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" From b1069d89a62974d527a9428156df0047cce54cea Mon Sep 17 00:00:00 2001 From: Jerry Ling Date: Fri, 22 Apr 2022 12:08:01 -0400 Subject: [PATCH 5/9] fix --- src/sparsevector.jl | 9 +++++---- test/sparsevector.jl | 2 ++ 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/src/sparsevector.jl b/src/sparsevector.jl index a5cd588f..0f34d195 100644 --- a/src/sparsevector.jl +++ b/src/sparsevector.jl @@ -1433,11 +1433,12 @@ for (fun, comp, word) in ((:findmin, :(<), "minimum"), (:findmax, :(>), "maximum # we need to find the first zero, which could be stored or implicit # we try to avoid findfirst(iszero, x) sindex = findfirst(iszero, nzvals) # first stored zero, if any - zindex = findfirst(i -> i <= nzinds[i], eachindex(nzinds)) # first non-stored zero - if !isnothing(zindex) && zindex < lastindex(x) - zindex += 1 + zindex = findfirst(i -> i < nzinds[i], eachindex(nzinds)) # first non-stored zero + index = if isnothing(zindex) && last(nzinds) < lastindex(x) + last(nzinds) + 1 + else + isnothing(sindex) ? zindex : min(sindex, zindex) end - index = isnothing(sindex) ? zindex : min(sindex, zindex) return zeroval, index end end diff --git a/test/sparsevector.jl b/test/sparsevector.jl index 4e63209e..17c330c1 100644 --- a/test/sparsevector.jl +++ b/test/sparsevector.jl @@ -903,6 +903,8 @@ end v[1] = 2 @test argmin(v) == 2 @test argmax(v) == 1 + v[2] = 2 + @test argmin(v) == 3 v[1] = 0 v[3] = 2 @test argmin(v) == 1 From 9057d70851c430b23504ce9784b4d9ff1858f89f Mon Sep 17 00:00:00 2001 From: Jerry Ling Date: Fri, 22 Apr 2022 12:11:09 -0400 Subject: [PATCH 6/9] remove Revise --- Project.toml | 1 - 1 file changed, 1 deletion(-) diff --git a/Project.toml b/Project.toml index 7c78b425..bc8a968c 100644 --- a/Project.toml +++ b/Project.toml @@ -4,7 +4,6 @@ uuid = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" [deps] LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" Random = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c" -Revise = "295af30f-e4ad-537b-8983-00126c2a3abe" [extras] Dates = "ade2ca70-3891-5945-98fb-dc099432e06a" From 9cf449ea0fdb109f42da35d73a79fb2c031629fa Mon Sep 17 00:00:00 2001 From: Jerry Ling Date: Fri, 22 Apr 2022 12:26:23 -0400 Subject: [PATCH 7/9] fix test --- test/sparsevector.jl | 1 + 1 file changed, 1 insertion(+) diff --git a/test/sparsevector.jl b/test/sparsevector.jl index 17c330c1..53b8060d 100644 --- a/test/sparsevector.jl +++ b/test/sparsevector.jl @@ -906,6 +906,7 @@ end v[2] = 2 @test argmin(v) == 3 v[1] = 0 + v[2] = 0 v[3] = 2 @test argmin(v) == 1 @test argmax(v) == 3 From 4db46c8eb232dd32f685c58870cf7805a0462118 Mon Sep 17 00:00:00 2001 From: Jerry Ling Date: Fri, 22 Apr 2022 23:35:12 -0400 Subject: [PATCH 8/9] fux 2 --- src/sparsevector.jl | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/sparsevector.jl b/src/sparsevector.jl index 0f34d195..cf2943e3 100644 --- a/src/sparsevector.jl +++ b/src/sparsevector.jl @@ -1434,10 +1434,13 @@ for (fun, comp, word) in ((:findmin, :(<), "minimum"), (:findmax, :(>), "maximum # we try to avoid findfirst(iszero, x) sindex = findfirst(iszero, nzvals) # first stored zero, if any zindex = findfirst(i -> i < nzinds[i], eachindex(nzinds)) # first non-stored zero - index = if isnothing(zindex) && last(nzinds) < lastindex(x) + index = if isnothing(zindex) && isnothing(sindex) && last(nzinds) < lastindex(x) + # non-stored zero are contiguous and at the end last(nzinds) + 1 + elseif isnothing(sindex) + zindex else - isnothing(sindex) ? zindex : min(sindex, zindex) + min(sindex, zindex) end return zeroval, index end From 6e807511effbec7cc671984d60bc7846b3e0dd0b Mon Sep 17 00:00:00 2001 From: Jerry Ling Date: Sat, 23 Apr 2022 13:13:25 -0400 Subject: [PATCH 9/9] Update src/sparsevector.jl Co-authored-by: Steven G. Johnson --- src/sparsevector.jl | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/sparsevector.jl b/src/sparsevector.jl index cf2943e3..e17ae607 100644 --- a/src/sparsevector.jl +++ b/src/sparsevector.jl @@ -1434,11 +1434,9 @@ for (fun, comp, word) in ((:findmin, :(<), "minimum"), (:findmax, :(>), "maximum # we try to avoid findfirst(iszero, x) sindex = findfirst(iszero, nzvals) # first stored zero, if any zindex = findfirst(i -> i < nzinds[i], eachindex(nzinds)) # first non-stored zero - index = if isnothing(zindex) && isnothing(sindex) && last(nzinds) < lastindex(x) + index = if isnothing(sindex) # non-stored zero are contiguous and at the end - last(nzinds) + 1 - elseif isnothing(sindex) - zindex + isnothing(zindex) && last(nzinds) < lastindex(x) ? last(nzinds) + 1 : zindex else min(sindex, zindex) end