From 5f7efae7f60fbe9344a505af8f0265183ed377d2 Mon Sep 17 00:00:00 2001 From: Jeff Bezanson Date: Fri, 21 Jul 2017 16:46:43 -0400 Subject: [PATCH] use `pairs` in `findmin` and `findmax`, supporting all indexable collections return `CartesianIndex` for n-d arrays in findmin, findmax, indmin, indmax more compact printing of `CartesianIndex` change sparse `_findr` macro to a function --- NEWS.md | 4 ++ base/array.jl | 24 +++++------ base/multidimensional.jl | 3 +- base/reducedim.jl | 24 +++++------ base/sparse/sparsematrix.jl | 79 ++++++++++++++++++------------------- test/arrayops.jl | 7 +++- test/reducedim.jl | 52 ++++++++++++------------ test/sparse/sparse.jl | 56 +++++++++++++------------- 8 files changed, 130 insertions(+), 119 deletions(-) diff --git a/NEWS.md b/NEWS.md index 52a4503ba44d6..2ce366decab1e 100644 --- a/NEWS.md +++ b/NEWS.md @@ -191,6 +191,10 @@ This section lists changes that do not have deprecation warnings. This avoids stack overflows in the common case of definitions like `f(x, y) = f(promote(x, y)...)` ([#22801]). + * `findmin`, `findmax`, `indmin`, and `indmax` used to always return linear indices. + They now return `CartesianIndex`es for all but 1-d arrays, and in general return + the `keys` of indexed collections (e.g. dictionaries) ([#22907]). + Library improvements -------------------- diff --git a/base/array.jl b/base/array.jl index 61ef1fbd63f29..9f43321ac8a38 100644 --- a/base/array.jl +++ b/base/array.jl @@ -2072,13 +2072,13 @@ function findmax(a) if isempty(a) throw(ArgumentError("collection must be non-empty")) end - s = start(a) - mi = i = 1 - m, s = next(a, s) - while !done(a, s) + p = pairs(a) + s = start(p) + (mi, m), s = next(p, s) + i = mi + while !done(p, s) m != m && break - ai, s = next(a, s) - i += 1 + (i, ai), s = next(p, s) if ai != ai || isless(m, ai) m = ai mi = i @@ -2113,13 +2113,13 @@ function findmin(a) if isempty(a) throw(ArgumentError("collection must be non-empty")) end - s = start(a) - mi = i = 1 - m, s = next(a, s) - while !done(a, s) + p = pairs(a) + s = start(p) + (mi, m), s = next(p, s) + i = mi + while !done(p, s) m != m && break - ai, s = next(a, s) - i += 1 + (i, ai), s = next(p, s) if ai != ai || isless(ai, m) m = ai mi = i diff --git a/base/multidimensional.jl b/base/multidimensional.jl index 2988daf2beddc..2693333f063b7 100644 --- a/base/multidimensional.jl +++ b/base/multidimensional.jl @@ -4,7 +4,7 @@ module IteratorsMD import Base: eltype, length, size, start, done, next, first, last, in, getindex, setindex!, IndexStyle, min, max, zero, one, isless, eachindex, - ndims, iteratorsize, convert + ndims, iteratorsize, convert, show import Base: +, -, * import Base: simd_outer_range, simd_inner_length, simd_index @@ -80,6 +80,7 @@ module IteratorsMD @inline _flatten(i, I...) = (i, _flatten(I...)...) @inline _flatten(i::CartesianIndex, I...) = (i.I..., _flatten(I...)...) CartesianIndex(index::Tuple{Vararg{Union{Integer, CartesianIndex}}}) = CartesianIndex(index...) + show(io::IO, i::CartesianIndex) = (print(io, "CartesianIndex"); show(io, i.I)) # length length(::CartesianIndex{N}) where {N} = N diff --git a/base/reducedim.jl b/base/reducedim.jl index 2bd52371d5529..b2bee574032e7 100644 --- a/base/reducedim.jl +++ b/base/reducedim.jl @@ -635,7 +635,9 @@ function findminmax!(f, Rval, Rind, A::AbstractArray{T,N}) where {T,N} # Otherwise, keep the result in Rval/Rind so that we traverse A in storage order. indsAt, indsRt = safe_tail(indices(A)), safe_tail(indices(Rval)) keep, Idefault = Broadcast.shapeindexer(indsAt, indsRt) - k = 0 + ks = keys(A) + k, kss = next(ks, start(ks)) + zi = zero(eltype(ks)) if reducedim1(Rval, A) i1 = first(indices1(Rval)) @inbounds for IA in CartesianRange(indsAt) @@ -643,12 +645,12 @@ function findminmax!(f, Rval, Rind, A::AbstractArray{T,N}) where {T,N} tmpRv = Rval[i1,IR] tmpRi = Rind[i1,IR] for i in indices(A,1) - k += 1 tmpAv = A[i,IA] - if tmpRi == 0 || (tmpRv == tmpRv && (tmpAv != tmpAv || f(tmpAv, tmpRv))) + if tmpRi == zi || (tmpRv == tmpRv && (tmpAv != tmpAv || f(tmpAv, tmpRv))) tmpRv = tmpAv tmpRi = k end + k, kss = next(ks, kss) end Rval[i1,IR] = tmpRv Rind[i1,IR] = tmpRi @@ -657,14 +659,14 @@ function findminmax!(f, Rval, Rind, A::AbstractArray{T,N}) where {T,N} @inbounds for IA in CartesianRange(indsAt) IR = Broadcast.newindex(IA, keep, Idefault) for i in indices(A, 1) - k += 1 tmpAv = A[i,IA] tmpRv = Rval[i,IR] tmpRi = Rind[i,IR] - if tmpRi == 0 || (tmpRv == tmpRv && (tmpAv != tmpAv || f(tmpAv, tmpRv))) + if tmpRi == zi || (tmpRv == tmpRv && (tmpAv != tmpAv || f(tmpAv, tmpRv))) Rval[i,IR] = tmpAv Rind[i,IR] = k end + k, kss = next(ks, kss) end end end @@ -680,7 +682,7 @@ dimensions of `rval` and `rind`, and store the results in `rval` and `rind`. """ function findmin!(rval::AbstractArray, rind::AbstractArray, A::AbstractArray; init::Bool=true) - findminmax!(isless, init && !isempty(A) ? fill!(rval, first(A)) : rval, fill!(rind,0), A) + findminmax!(isless, init && !isempty(A) ? fill!(rval, first(A)) : rval, fill!(rind,zero(eltype(keys(A)))), A) end """ @@ -709,10 +711,10 @@ function findmin(A::AbstractArray{T}, region) where T if prod(map(length, reduced_indices(A, region))) != 0 throw(ArgumentError("collection slices must be non-empty")) end - (similar(A, ri), similar(dims->zeros(Int, dims), ri)) + (similar(A, ri), similar(dims->zeros(eltype(keys(A)), dims), ri)) else findminmax!(isless, fill!(similar(A, ri), first(A)), - similar(dims->zeros(Int, dims), ri), A) + similar(dims->zeros(eltype(keys(A)), dims), ri), A) end end @@ -727,7 +729,7 @@ dimensions of `rval` and `rind`, and store the results in `rval` and `rind`. """ function findmax!(rval::AbstractArray, rind::AbstractArray, A::AbstractArray; init::Bool=true) - findminmax!(isgreater, init && !isempty(A) ? fill!(rval, first(A)) : rval, fill!(rind,0), A) + findminmax!(isgreater, init && !isempty(A) ? fill!(rval, first(A)) : rval, fill!(rind,zero(eltype(keys(A)))), A) end """ @@ -756,10 +758,10 @@ function findmax(A::AbstractArray{T}, region) where T if prod(map(length, reduced_indices(A, region))) != 0 throw(ArgumentError("collection slices must be non-empty")) end - similar(A, ri), similar(dims->zeros(Int, dims), ri) + similar(A, ri), similar(dims->zeros(eltype(keys(A)), dims), ri) else findminmax!(isgreater, fill!(similar(A, ri), first(A)), - similar(dims->zeros(Int, dims), ri), A) + similar(dims->zeros(eltype(keys(A)), dims), ri), A) end end diff --git a/base/sparse/sparsematrix.jl b/base/sparse/sparsematrix.jl index 2f071aa586dd0..dbb3eb814e04b 100644 --- a/base/sparse/sparsematrix.jl +++ b/base/sparse/sparsematrix.jl @@ -1815,7 +1815,7 @@ function _findz(A::SparseMatrixCSC{Tv,Ti}, rows=1:A.m, cols=1:A.n) where {Tv,Ti} row = 0 rowmin = rows[1]; rowmax = rows[end] allrows = (rows == 1:A.m) - @inbounds for col in cols + @inbounds for col in cols r1::Int = colptr[col] r2::Int = colptr[col+1] - 1 if !allrows && (r1 <= r2) @@ -1823,93 +1823,92 @@ function _findz(A::SparseMatrixCSC{Tv,Ti}, rows=1:A.m, cols=1:A.n) where {Tv,Ti} (r1 <= r2 ) && (r2 = searchsortedlast(rowval, rowmax, r1, r2, Forward)) end row = rowmin - while (r1 <= r2) && (row == rowval[r1]) && (nzval[r1] != zval) r1 += 1 row += 1 end - (row <= rowmax) && (return sub2ind(size(A), row, col)) + (row <= rowmax) && (return CartesianIndex(row, col)) end - return 0 + return CartesianIndex(0, 0) end -macro _findr(op, A, region, Tv, Ti) - esc(quote - N = nnz($A) - L = length($A) +function _findr(op, A, region, Tv) + Ti = eltype(keys(A)) + i1 = first(keys(A)) + N = nnz(A) + L = length(A) if L == 0 - if prod(map(length, Base.reduced_indices($A, $region))) != 0 + if prod(map(length, Base.reduced_indices(A, region))) != 0 throw(ArgumentError("array slices must be non-empty")) else - ri = Base.reduced_indices0($A, $region) - return (similar($A, ri), similar(dims->zeros(Int, dims), ri)) + ri = Base.reduced_indices0(A, region) + return (similar(A, ri), similar(dims->zeros(Ti, dims), ri)) end end - colptr = $A.colptr; rowval = $A.rowval; nzval = $A.nzval; m = $A.m; n = $A.n - zval = zero($Tv) - szA = size($A) + colptr = A.colptr; rowval = A.rowval; nzval = A.nzval; m = A.m; n = A.n + zval = zero(Tv) + szA = size(A) - if $region == 1 || $region == (1,) - (N == 0) && (return (fill(zval,1,n), fill(convert($Ti,1),1,n))) - S = Vector{$Tv}(n); I = Vector{$Ti}(n) + if region == 1 || region == (1,) + (N == 0) && (return (fill(zval,1,n), fill(i1,1,n))) + S = Vector{Tv}(n); I = Vector{Ti}(n) @inbounds for i = 1 : n - Sc = zval; Ic = _findz($A, 1:m, i:i) - if Ic == 0 + Sc = zval; Ic = _findz(A, 1:m, i:i) + if Ic == CartesianIndex(0, 0) j = colptr[i] - Ic = sub2ind(szA, rowval[j], i) + Ic = CartesianIndex(rowval[j], i) Sc = nzval[j] end for j = colptr[i] : colptr[i+1]-1 - if ($op)(nzval[j], Sc) + if op(nzval[j], Sc) Sc = nzval[j] - Ic = sub2ind(szA, rowval[j], i) + Ic = CartesianIndex(rowval[j], i) end end S[i] = Sc; I[i] = Ic end return(reshape(S,1,n), reshape(I,1,n)) - elseif $region == 2 || $region == (2,) - (N == 0) && (return (fill(zval,m,1), fill(convert($Ti,1),m,1))) - S = Vector{$Tv}(m); I = Vector{$Ti}(m) + elseif region == 2 || region == (2,) + (N == 0) && (return (fill(zval,m,1), fill(i1,m,1))) + S = Vector{Tv}(m); I = Vector{Ti}(m) @inbounds for row in 1:m - S[row] = zval; I[row] = _findz($A, row:row, 1:n) - if I[row] == 0 - I[row] = sub2ind(szA, row, 1) + S[row] = zval; I[row] = _findz(A, row:row, 1:n) + if I[row] == CartesianIndex(0, 0) + I[row] = CartesianIndex(row, 1) S[row] = A[row,1] end end @inbounds for i = 1 : n, j = colptr[i] : colptr[i+1]-1 row = rowval[j] - if ($op)(nzval[j], S[row]) + if op(nzval[j], S[row]) S[row] = nzval[j] - I[row] = sub2ind(szA, row, i) + I[row] = CartesianIndex(row, i) end end return (reshape(S,m,1), reshape(I,m,1)) - elseif $region == (1,2) - (N == 0) && (return (fill(zval,1,1), fill(convert($Ti,1),1,1))) - hasz = nnz($A) != length($A) + elseif region == (1,2) + (N == 0) && (return (fill(zval,1,1), fill(i1,1,1))) + hasz = nnz(A) != length(A) Sv = hasz ? zval : nzval[1] - Iv::($Ti) = hasz ? _findz($A) : 1 - @inbounds for i = 1 : $A.n, j = colptr[i] : (colptr[i+1]-1) - if ($op)(nzval[j], Sv) + Iv::(Ti) = hasz ? _findz(A) : i1 + @inbounds for i = 1 : A.n, j = colptr[i] : (colptr[i+1]-1) + if op(nzval[j], Sv) Sv = nzval[j] - Iv = sub2ind(szA, rowval[j], i) + Iv = CartesianIndex(rowval[j], i) end end return (fill(Sv,1,1), fill(Iv,1,1)) else throw(ArgumentError("invalid value for region; must be 1, 2, or (1,2)")) end - end) #quote end _isless_fm(a, b) = b == b && ( a != a || isless(a, b) ) _isgreater_fm(a, b) = b == b && ( a != a || isless(b, a) ) -findmin(A::SparseMatrixCSC{Tv,Ti}, region) where {Tv,Ti} = @_findr(_isless_fm, A, region, Tv, Ti) -findmax(A::SparseMatrixCSC{Tv,Ti}, region) where {Tv,Ti} = @_findr(_isgreater_fm, A, region, Tv, Ti) +findmin(A::SparseMatrixCSC{Tv,Ti}, region) where {Tv,Ti} = _findr(_isless_fm, A, region, Tv) +findmax(A::SparseMatrixCSC{Tv,Ti}, region) where {Tv,Ti} = _findr(_isgreater_fm, A, region, Tv) findmin(A::SparseMatrixCSC) = (r=findmin(A,(1,2)); (r[1][1], r[2][1])) findmax(A::SparseMatrixCSC) = (r=findmax(A,(1,2)); (r[1][1], r[2][1])) diff --git a/test/arrayops.jl b/test/arrayops.jl index 39b914a6a0e55..3848aa14e61cc 100644 --- a/test/arrayops.jl +++ b/test/arrayops.jl @@ -503,7 +503,7 @@ end @test indmin(5:-2:1) == 3 #23094 - @test findmax(Set(["abc"])) === ("abc", 1) + @test_throws MethodError findmax(Set(["abc"])) @test findmin(["abc", "a"]) === ("a", 2) @test_throws MethodError findmax([Set([1]), Set([2])]) @test findmin([0.0, -0.0]) === (-0.0, 2) @@ -1814,6 +1814,11 @@ s, si = findmax(S) @test a == b == s @test ai == bi == si +for X in (A, B, S) + @test findmin(X) == findmin(Dict(pairs(X))) + @test findmax(X) == findmax(Dict(pairs(X))) +end + fill!(B, 2) @test all(x->x==2, B) diff --git a/test/reducedim.jl b/test/reducedim.jl index d5cf35feeb003..63cc41775f125 100644 --- a/test/reducedim.jl +++ b/test/reducedim.jl @@ -156,9 +156,9 @@ end A = [1.0 5.0 6.0; 5.0 2.0 4.0] -for (tup, rval, rind) in [((1,), [1.0 2.0 4.0], [1 4 6]), - ((2,), reshape([1.0,2.0], 2, 1), reshape([1,4], 2, 1)), - ((1,2), fill(1.0,1,1),fill(1,1,1))] +for (tup, rval, rind) in [((1,), [1.0 2.0 4.0], [CartesianIndex(1,1) CartesianIndex(2,2) CartesianIndex(2,3)]), + ((2,), reshape([1.0,2.0], 2, 1), reshape([CartesianIndex(1,1),CartesianIndex(2,2)], 2, 1)), + ((1,2), fill(1.0,1,1),fill(CartesianIndex(1,1),1,1))] @test findmin(A, tup) == (rval, rind) @test findmin!(similar(rval), similar(rind), A) == (rval, rind) @test isequal(minimum(A, tup), rval) @@ -166,9 +166,9 @@ for (tup, rval, rind) in [((1,), [1.0 2.0 4.0], [1 4 6]), @test isequal(minimum!(copy(rval), A, init=false), rval) end -for (tup, rval, rind) in [((1,), [5.0 5.0 6.0], [2 3 5]), - ((2,), reshape([6.0,5.0], 2, 1), reshape([5,2], 2, 1)), - ((1,2), fill(6.0,1,1),fill(5,1,1))] +for (tup, rval, rind) in [((1,), [5.0 5.0 6.0], [CartesianIndex(2,1) CartesianIndex(1,2) CartesianIndex(1,3)]), + ((2,), reshape([6.0,5.0], 2, 1), reshape([CartesianIndex(1,3),CartesianIndex(2,1)], 2, 1)), + ((1,2), fill(6.0,1,1),fill(CartesianIndex(1,3),1,1))] @test findmax(A, tup) == (rval, rind) @test findmax!(similar(rval), similar(rind), A) == (rval, rind) @test isequal(maximum(A, tup), rval) @@ -180,9 +180,9 @@ end A = [1.0 3.0 6.0; NaN 2.0 4.0] -for (tup, rval, rind) in [((1,), [NaN 2.0 4.0], [2 4 6]), - ((2,), reshape([1.0, NaN], 2, 1), reshape([1,2], 2, 1)), - ((1,2), fill(NaN,1,1),fill(2,1,1))] +for (tup, rval, rind) in [((1,), [NaN 2.0 4.0], [CartesianIndex(2,1) CartesianIndex(2,2) CartesianIndex(2,3)]), + ((2,), reshape([1.0, NaN], 2, 1), reshape([CartesianIndex(1,1),CartesianIndex(2,1)], 2, 1)), + ((1,2), fill(NaN,1,1),fill(CartesianIndex(2,1),1,1))] @test isequal(findmin(A, tup), (rval, rind)) @test isequal(findmin!(similar(rval), similar(rind), A), (rval, rind)) @test isequal(minimum(A, tup), rval) @@ -191,9 +191,9 @@ for (tup, rval, rind) in [((1,), [NaN 2.0 4.0], [2 4 6]), @test isequal(Base.reducedim!(min, copy(rval), A), rval) end -for (tup, rval, rind) in [((1,), [NaN 3.0 6.0], [2 3 5]), - ((2,), reshape([6.0, NaN], 2, 1), reshape([5,2], 2, 1)), - ((1,2), fill(NaN,1,1),fill(2,1,1))] +for (tup, rval, rind) in [((1,), [NaN 3.0 6.0], [CartesianIndex(2,1) CartesianIndex(1,2) CartesianIndex(1,3)]), + ((2,), reshape([6.0, NaN], 2, 1), reshape([CartesianIndex(1,3),CartesianIndex(2,1)], 2, 1)), + ((1,2), fill(NaN,1,1),fill(CartesianIndex(2,1),1,1))] @test isequal(findmax(A, tup), (rval, rind)) @test isequal(findmax!(similar(rval), similar(rind), A), (rval, rind)) @test isequal(maximum(A, tup), rval) @@ -204,9 +204,9 @@ end A = [1.0 NaN 6.0; NaN 2.0 4.0] -for (tup, rval, rind) in [((1,), [NaN NaN 4.0], [2 3 6]), - ((2,), reshape([NaN, NaN], 2, 1), reshape([3,2], 2, 1)), - ((1,2), fill(NaN,1,1),fill(2,1,1))] +for (tup, rval, rind) in [((1,), [NaN NaN 4.0], [CartesianIndex(2,1) CartesianIndex(1,2) CartesianIndex(2,3)]), + ((2,), reshape([NaN, NaN], 2, 1), reshape([CartesianIndex(1,2),CartesianIndex(2,1)], 2, 1)), + ((1,2), fill(NaN,1,1),fill(CartesianIndex(2,1),1,1))] @test isequal(findmin(A, tup), (rval, rind)) @test isequal(findmin!(similar(rval), similar(rind), A), (rval, rind)) @test isequal(minimum(A, tup), rval) @@ -214,9 +214,9 @@ for (tup, rval, rind) in [((1,), [NaN NaN 4.0], [2 3 6]), @test isequal(minimum!(copy(rval), A, init=false), rval) end -for (tup, rval, rind) in [((1,), [NaN NaN 6.0], [2 3 5]), - ((2,), reshape([NaN, NaN], 2, 1), reshape([3,2], 2, 1)), - ((1,2), fill(NaN,1,1),fill(2,1,1))] +for (tup, rval, rind) in [((1,), [NaN NaN 6.0], [CartesianIndex(2,1) CartesianIndex(1,2) CartesianIndex(1,3)]), + ((2,), reshape([NaN, NaN], 2, 1), reshape([CartesianIndex(1,2),CartesianIndex(2,1)], 2, 1)), + ((1,2), fill(NaN,1,1),fill(CartesianIndex(2,1),1,1))] @test isequal(findmax(A, tup), (rval, rind)) @test isequal(findmax!(similar(rval), similar(rind), A), (rval, rind)) @test isequal(maximum(A, tup), rval) @@ -226,9 +226,9 @@ end A = [Inf -Inf Inf -Inf; Inf Inf -Inf -Inf] -for (tup, rval, rind) in [((1,), [Inf -Inf -Inf -Inf], [1 3 6 7]), - ((2,), reshape([-Inf -Inf], 2, 1), reshape([3,6], 2, 1)), - ((1,2), fill(-Inf,1,1),fill(3,1,1))] +for (tup, rval, rind) in [((1,), [Inf -Inf -Inf -Inf], [CartesianIndex(1,1) CartesianIndex(1,2) CartesianIndex(2,3) CartesianIndex(1,4)]), + ((2,), reshape([-Inf -Inf], 2, 1), reshape([CartesianIndex(1,2),CartesianIndex(2,3)], 2, 1)), + ((1,2), fill(-Inf,1,1),fill(CartesianIndex(1,2),1,1))] @test isequal(findmin(A, tup), (rval, rind)) @test isequal(findmin!(similar(rval), similar(rind), A), (rval, rind)) @test isequal(minimum(A, tup), rval) @@ -236,9 +236,9 @@ for (tup, rval, rind) in [((1,), [Inf -Inf -Inf -Inf], [1 3 6 7]), @test isequal(minimum!(copy(rval), A, init=false), rval) end -for (tup, rval, rind) in [((1,), [Inf Inf Inf -Inf], [1 4 5 7]), - ((2,), reshape([Inf Inf], 2, 1), reshape([1,2], 2, 1)), - ((1,2), fill(Inf,1,1),fill(1,1,1))] +for (tup, rval, rind) in [((1,), [Inf Inf Inf -Inf], [CartesianIndex(1,1) CartesianIndex(2,2) CartesianIndex(1,3) CartesianIndex(1,4)]), + ((2,), reshape([Inf Inf], 2, 1), reshape([CartesianIndex(1,1),CartesianIndex(2,1)], 2, 1)), + ((1,2), fill(Inf,1,1),fill(CartesianIndex(1,1),1,1))] @test isequal(findmax(A, tup), (rval, rind)) @test isequal(findmax!(similar(rval), similar(rind), A), (rval, rind)) @test isequal(maximum(A, tup), rval) @@ -281,7 +281,7 @@ for (tup, rval, rind) in [((2,), [BigInt(-10)], [1])] end A = [BigInt(10) BigInt(-10)] -for (tup, rval, rind) in [((2,), reshape([BigInt(-10)], 1, 1), reshape([2], 1,1))] +for (tup, rval, rind) in [((2,), reshape([BigInt(-10)], 1, 1), reshape([CartesianIndex(1,2)], 1, 1))] @test isequal(findmin(A, tup), (rval, rind)) @test isequal(findmin!(similar(rval), similar(rind), A), (rval, rind)) @test isequal(minimum(A, tup), rval) @@ -289,7 +289,7 @@ for (tup, rval, rind) in [((2,), reshape([BigInt(-10)], 1, 1), reshape([2], 1,1) @test isequal(minimum!(copy(rval), A, init=false), rval) end -for (tup, rval, rind) in [((2,), reshape([BigInt(10)], 1, 1), reshape([1], 1, 1))] +for (tup, rval, rind) in [((2,), reshape([BigInt(10)], 1, 1), reshape([CartesianIndex(1,1)], 1, 1))] @test isequal(findmax(A, tup), (rval, rind)) @test isequal(findmax!(similar(rval), similar(rind), A), (rval, rind)) @test isequal(maximum(A, tup), rval) diff --git a/test/sparse/sparse.jl b/test/sparse/sparse.jl index a52dcf5638973..c5ab994d2b40d 100644 --- a/test/sparse/sparse.jl +++ b/test/sparse/sparse.jl @@ -998,8 +998,8 @@ end S = spzeros(10,8) A = Array(S) - @test indmax(S) == indmax(A) == 1 - @test indmin(S) == indmin(A) == 1 + @test indmax(S) == indmax(A) == CartesianIndex(1,1) + @test indmin(S) == indmin(A) == CartesianIndex(1,1) A = Array{Int}(0,0) S = sparse(A) @@ -1015,15 +1015,15 @@ end A = sparse([1.0 5.0 6.0; 5.0 2.0 4.0]) -for (tup, rval, rind) in [((1,), [1.0 2.0 4.0], [1 4 6]), - ((2,), reshape([1.0,2.0], 2, 1), reshape([1,4], 2, 1)), - ((1,2), fill(1.0,1,1),fill(1,1,1))] +for (tup, rval, rind) in [((1,), [1.0 2.0 4.0], [CartesianIndex(1,1) CartesianIndex(2,2) CartesianIndex(2,3)]), + ((2,), reshape([1.0,2.0], 2, 1), reshape([CartesianIndex(1,1),CartesianIndex(2,2)], 2, 1)), + ((1,2), fill(1.0,1,1),fill(CartesianIndex(1,1),1,1))] @test findmin(A, tup) == (rval, rind) end -for (tup, rval, rind) in [((1,), [5.0 5.0 6.0], [2 3 5]), - ((2,), reshape([6.0,5.0], 2, 1), reshape([5,2], 2, 1)), - ((1,2), fill(6.0,1,1),fill(5,1,1))] +for (tup, rval, rind) in [((1,), [5.0 5.0 6.0], [CartesianIndex(2,1) CartesianIndex(1,2) CartesianIndex(1,3)]), + ((2,), reshape([6.0,5.0], 2, 1), reshape([CartesianIndex(1,3),CartesianIndex(2,1)], 2, 1)), + ((1,2), fill(6.0,1,1),fill(CartesianIndex(1,3),1,1))] @test findmax(A, tup) == (rval, rind) end @@ -1031,43 +1031,43 @@ end A = sparse([1.0 5.0 6.0; NaN 2.0 4.0]) -for (tup, rval, rind) in [((1,), [NaN 2.0 4.0], [2 4 6]), - ((2,), reshape([1.0, NaN], 2, 1), reshape([1,2], 2, 1)), - ((1,2), fill(NaN,1,1),fill(2,1,1))] +for (tup, rval, rind) in [((1,), [NaN 2.0 4.0], [CartesianIndex(2,1) CartesianIndex(2,2) CartesianIndex(2,3)]), + ((2,), reshape([1.0, NaN], 2, 1), reshape([CartesianIndex(1,1),CartesianIndex(2,1)], 2, 1)), + ((1,2), fill(NaN,1,1),fill(CartesianIndex(2,1),1,1))] @test isequal(findmin(A, tup), (rval, rind)) end -for (tup, rval, rind) in [((1,), [NaN 5.0 6.0], [2 3 5]), - ((2,), reshape([6.0, NaN], 2, 1), reshape([5,2], 2, 1)), - ((1,2), fill(NaN,1,1),fill(2,1,1))] +for (tup, rval, rind) in [((1,), [NaN 5.0 6.0], [CartesianIndex(2,1) CartesianIndex(1,2) CartesianIndex(1,3)]), + ((2,), reshape([6.0, NaN], 2, 1), reshape([CartesianIndex(1,3),CartesianIndex(2,1)], 2, 1)), + ((1,2), fill(NaN,1,1),fill(CartesianIndex(2,1),1,1))] @test isequal(findmax(A, tup), (rval, rind)) end A = sparse([1.0 NaN 6.0; NaN 2.0 4.0]) -for (tup, rval, rind) in [((1,), [NaN NaN 4.0], [2 3 6]), - ((2,), reshape([NaN, NaN], 2, 1), reshape([3,2], 2, 1)), - ((1,2), fill(NaN,1,1),fill(2,1,1))] +for (tup, rval, rind) in [((1,), [NaN NaN 4.0], [CartesianIndex(2,1) CartesianIndex(1,2) CartesianIndex(2,3)]), + ((2,), reshape([NaN, NaN], 2, 1), reshape([CartesianIndex(1,2),CartesianIndex(2,1)], 2, 1)), + ((1,2), fill(NaN,1,1),fill(CartesianIndex(2,1),1,1))] @test isequal(findmin(A, tup), (rval, rind)) end -for (tup, rval, rind) in [((1,), [NaN NaN 6.0], [2 3 5]), - ((2,), reshape([NaN, NaN], 2, 1), reshape([3,2], 2, 1)), - ((1,2), fill(NaN,1,1),fill(2,1,1))] +for (tup, rval, rind) in [((1,), [NaN NaN 6.0], [CartesianIndex(2,1) CartesianIndex(1,2) CartesianIndex(1,3)]), + ((2,), reshape([NaN, NaN], 2, 1), reshape([CartesianIndex(1,2),CartesianIndex(2,1)], 2, 1)), + ((1,2), fill(NaN,1,1),fill(CartesianIndex(2,1),1,1))] @test isequal(findmax(A, tup), (rval, rind)) end A = sparse([Inf -Inf Inf -Inf; Inf Inf -Inf -Inf]) -for (tup, rval, rind) in [((1,), [Inf -Inf -Inf -Inf], [1 3 6 7]), - ((2,), reshape([-Inf -Inf], 2, 1), reshape([3,6], 2, 1)), - ((1,2), fill(-Inf,1,1),fill(3,1,1))] +for (tup, rval, rind) in [((1,), [Inf -Inf -Inf -Inf], [CartesianIndex(1,1) CartesianIndex(1,2) CartesianIndex(2,3) CartesianIndex(1,4)]), + ((2,), reshape([-Inf -Inf], 2, 1), reshape([CartesianIndex(1,2),CartesianIndex(2,3)], 2, 1)), + ((1,2), fill(-Inf,1,1),fill(CartesianIndex(1,2),1,1))] @test isequal(findmin(A, tup), (rval, rind)) end -for (tup, rval, rind) in [((1,), [Inf Inf Inf -Inf], [1 4 5 7]), - ((2,), reshape([Inf Inf], 2, 1), reshape([1,2], 2, 1)), - ((1,2), fill(Inf,1,1),fill(1,1,1))] +for (tup, rval, rind) in [((1,), [Inf Inf Inf -Inf], [CartesianIndex(1,1) CartesianIndex(2,2) CartesianIndex(1,3) CartesianIndex(1,4)]), + ((2,), reshape([Inf Inf], 2, 1), reshape([CartesianIndex(1,1),CartesianIndex(2,1)], 2, 1)), + ((1,2), fill(Inf,1,1),fill(CartesianIndex(1,1),1,1))] @test isequal(findmax(A, tup), (rval, rind)) end @@ -1090,11 +1090,11 @@ for (tup, rval, rind) in [((2,), [BigInt(-10)], [1])] end A = sparse([BigInt(10) BigInt(-10)]) -for (tup, rval, rind) in [((2,), reshape([BigInt(-10)], 1, 1), reshape([2], 1, 1))] +for (tup, rval, rind) in [((2,), reshape([BigInt(-10)], 1, 1), reshape([CartesianIndex(1,2)], 1, 1))] @test isequal(findmin(A, tup), (rval, rind)) end -for (tup, rval, rind) in [((2,), reshape([BigInt(10)], 1, 1), reshape([1], 1, 1))] +for (tup, rval, rind) in [((2,), reshape([BigInt(10)], 1, 1), reshape([CartesianIndex(1,1)], 1, 1))] @test isequal(findmax(A, tup), (rval, rind)) end