# Sparse matrix product causes unnecessary casting to "Any" thereby causing issues?

**URL:** <https://discourse.julialang.org/t/sparse-matrix-product-causes-unnecessary-casting-to-any-thereby-causing-issues/64565>\
**Category:** General Usage\
**Tags:** sparse\
**Created:** [July 13, 2021, 12:59pm UTC](https://discourse.julialang.org/t/sparse-matrix-product-causes-unnecessary-casting-to-any-thereby-causing-issues/64565 "2021-07-13T12:59:19Z")\
**Posts on this page:** 12\
**Page:** 1

<div class="post-metadata">

**Author:** ![Annette\_F](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/annette_f/32/26616_2.png) [@Annette\_F](https://discourse.julialang.org/u/Annette_F)\
**Post date:** [July 13, 2021, 12:59pm UTC](https://discourse.julialang.org/t/sparse-matrix-product-causes-unnecessary-casting-to-any-thereby-causing-issues/64565/1 "2021-07-13T12:59:19Z")

</div>

Hi all,

I have a large sparse matrix A ( its size is (2823,2823 ) its type is SparceMatrixCSC{ Integer, Int64} ) with 0/1 values only.  
I want to get a sparse matrix B = A^2, and get the largest value in this matrix.  
For reasons beyond my understanding it looks like matrix B suddenly gets a type “Any” making it impossible to cast B back to an Array and/or get it min/max values.

see also screenshot below with minimum example and error message

 ![image](https://global.discourse-cdn.com/julialang/original/3X/c/2/c2ce86351012a2f5ff6301c1c0344c924338c12f.png)

I get the same errors for

```julia
Array( pairwiseComp) 
minimum( pairwiseComp[:, :] )

```

Can someone either show me what I do wrong or give me a work around?

---

<div class="post-metadata">

**Author:** ![kristoffer.carlsson](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/kristoffer.carlsson/32/22_2.png) [@kristoffer.carlsson](https://discourse.julialang.org/u/kristoffer.carlsson)\
**Post date:** [July 13, 2021, 1:18pm UTC](https://discourse.julialang.org/t/sparse-matrix-product-causes-unnecessary-casting-to-any-thereby-causing-issues/64565/2 "2021-07-13T13:18:44Z")

</div>

> [@Annette\_F](#):
>
> `SparceMatrixCSC{ Integer, Int64}`

Do you really want the abstract type `Integer` as the element type, or can you use `Int` instead?

---

<div class="post-metadata">

**Author:** ![Annette\_F](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/annette_f/32/26616_2.png) [@Annette\_F](https://discourse.julialang.org/u/Annette_F)\
**Post date:** [July 13, 2021, 1:25pm UTC](https://discourse.julialang.org/t/sparse-matrix-product-causes-unnecessary-casting-to-any-thereby-causing-issues/64565/3 "2021-07-13T13:25:00Z")

</div>

That’s the type Julia gave to this marix A/compMatrix.  
(I first initialized a 2-Dim array with only 0/1 values, then converted it to sparse).

I don’t really care about Integer or Int. I just want to be able to get matrix B = A^2 and get its max/min.  
I’m just surprised to see B gets type Any, instead of Integer ( like A has ); and that throwing errors.

---

<div class="post-metadata">

**Author:** ![Oscar\_Smith](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/oscar_smith/32/25343_2.png) [@Oscar\_Smith](https://discourse.julialang.org/u/Oscar_Smith)\
**Post date:** [July 13, 2021, 4:14pm UTC](https://discourse.julialang.org/t/sparse-matrix-product-causes-unnecessary-casting-to-any-thereby-causing-issues/64565/4 "2021-07-13T16:14:01Z")

</div>

Can you share the code you used to make `A`?

---

<div class="post-metadata">

**Author:** ![PetrKryslUCSD](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/petrkryslucsd/32/215825_2.png) [@PetrKryslUCSD](https://discourse.julialang.org/u/PetrKryslUCSD)\
**Post date:** [July 13, 2021, 4:47pm UTC](https://discourse.julialang.org/t/sparse-matrix-product-causes-unnecessary-casting-to-any-thereby-causing-issues/64565/5 "2021-07-13T16:47:10Z")

</div>

```julia
julia> using SparseArrays                                                             
                                                                                      
julia> a = sprand(Int, 7, 7, 0.5)                                                   
7×7 SparseMatrixCSC{Int64, Int64} with 25 stored entries:                           
                   ⋅ ⋅ … ⋅                  
 2818502083055319317 4767726624010214836 ⋅                  
                   ⋅ ⋅ 6887863942578783783                  
  809827778114231296 8685491858074137979 2448067753728538581                  
                   ⋅ ⋅ ⋅                  
                   ⋅ 8945844710485273438 … -1574207559067161462                  
 8530774627037061445 6557253109629682135 4738318991760729793                  
                                                                                    
julia> a.nzval[findall(x -> x != 0, a.nzval)] .= 1                                  
25-element view(::Vector{Int64}, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10 … 16, 17, 18, 19, 
20, 21, 22, 23, 24, 25]) with eltype Int64:                                         
 1                                                                                  
 1                                                                                  
 1                                                                                  
 1                                                                                  
 1                                                                                  
 1                                                                                  
 1                                                                                  
 1                                                                                  
 1                                                                                  
 1                                                                                  
 1                                                                                  
 1                                                                                  
 1                                                                                  
 1                                                                                  
 1                                                                                  
 1                                                                                  
 1                                                                                  
 1                                                                                  
 1                                                                                  
 1                                                                                  
 1                                                                                  
 1                                                                                  
 1                                                                                  
 1                                                                                  
 1                                                                                  
                                                                                    
julia> a                                                                            
7×7 SparseMatrixCSC{Int64, Int64} with 25 stored entries:                           
 ⋅ ⋅ 1 1 1 1 ⋅                                                                
 1 1 1 ⋅ ⋅ ⋅ ⋅                                                                
 ⋅ ⋅ ⋅ 1 1 1 1                                                                
 1 1 1 1 ⋅ ⋅ 1                                                                
 ⋅ ⋅ 1 ⋅ ⋅ ⋅ ⋅                                                                
 ⋅ 1 ⋅ ⋅ 1 ⋅ 1                                                                
 1 1 ⋅ 1 1 ⋅ 1                                                                
                                                                                    
julia> a*a                                                                          
7×7 SparseMatrixCSC{Int64, Int64} with 44 stored entries:                           
 1 2 2 2 2 1 3                                                                
 1 1 2 2 2 2 1                                                                
 2 3 2 2 2 ⋅ 3                                                                
 3 3 3 4 3 2 3                                                                
 ⋅ ⋅ ⋅ 1 1 1 1                                                                
 2 2 2 1 1 ⋅ 1                                                                
 3 3 4 3 2 1 2                                                                
                                                                                    
julia> 

```

---

<div class="post-metadata">

**Author:** ![Annette\_F](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/annette_f/32/26616_2.png) [@Annette\_F](https://discourse.julialang.org/u/Annette_F)\
**Post date:** [July 14, 2021, 7:21am UTC](https://discourse.julialang.org/t/sparse-matrix-product-causes-unnecessary-casting-to-any-thereby-causing-issues/64565/6 "2021-07-14T07:21:43Z")

</div>

It’s based on data, but the following code results in the exact same issues

```julia
using SparseArrays

A = zeros( Integer, 2400, 2400 )
for i in 1:2400
    if rand(1:4) == 1
        for j in i+1:2400
            if rand(1:15) == 1
                A[i,j] = 1
                A[j,i] = 1
            end
        end
    end
end

sum( A)
A = sparse( A )
B = A^2

println( "some stats A: size ", size(A), " min value ", minimum( A ), " max value ", maximum( A ) )
println( "some stats B: size ", size(B), " min value ", minimum( B ), " max value ", maximum( B ) )

```

---

<div class="post-metadata">

**Author:** ![Annette\_F](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/annette_f/32/26616_2.png) [@Annette\_F](https://discourse.julialang.org/u/Annette_F)\
**Post date:** [July 14, 2021, 7:22am UTC](https://discourse.julialang.org/t/sparse-matrix-product-causes-unnecessary-casting-to-any-thereby-causing-issues/64565/7 "2021-07-14T07:22:23Z")

</div>

I’m not sure how or what this answers?

---

<div class="post-metadata">

**Author:** ![sostock](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/sostock/32/5546_2.png) [@sostock](https://discourse.julialang.org/u/sostock)\
**Post date:** [July 14, 2021, 8:24am UTC](https://discourse.julialang.org/t/sparse-matrix-product-causes-unnecessary-casting-to-any-thereby-causing-issues/64565/8 "2021-07-14T08:24:43Z")

</div>

> [@Annette\_F](#):
>
> `A = zeros( Integer, 2400, 2400 )`

Do you have a reason for using `Integer` (an abstract type) here? If you use a concrete type like `Int` (or `BigInt` if you need the ability to store arbitrarily large numbers), it will not widen the element type to `Any` when multiplying.

---

<div class="post-metadata">

**Author:** ![PetrKryslUCSD](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/petrkryslucsd/32/215825_2.png) [@PetrKryslUCSD](https://discourse.julialang.org/u/PetrKryslUCSD)\
**Post date:** [July 14, 2021, 9:37am UTC](https://discourse.julialang.org/t/sparse-matrix-product-causes-unnecessary-casting-to-any-thereby-causing-issues/64565/9 "2021-07-14T09:37:10Z")

</div>

As I pointed out, creating the matrix `a` from `Int` (concrete type) leads to stable calculation.

---

<div class="post-metadata">

**Author:** ![Annette\_F](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/annette_f/32/26616_2.png) [@Annette\_F](https://discourse.julialang.org/u/Annette_F)\
**Post date:** [July 14, 2021, 3:21pm UTC](https://discourse.julialang.org/t/sparse-matrix-product-causes-unnecessary-casting-to-any-thereby-causing-issues/64565/10 "2021-07-14T15:21:02Z")

</div>

Ah, my apologies; I wasn’t aware there was a significant difference between `Int` and `Integer`.

Indeed the usage of `Int` solves my problem. Thank you.

---

<div class="post-metadata">

**Author:** ![cjdoris](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/cjdoris/32/213133_2.png) [@cjdoris](https://discourse.julialang.org/u/cjdoris)\
**Post date:** [July 15, 2021, 8:05am UTC](https://discourse.julialang.org/t/sparse-matrix-product-causes-unnecessary-casting-to-any-thereby-causing-issues/64565/11 "2021-07-15T08:05:21Z")

</div>

Why is the element type being widened at all? Why doesn’t it stay `Integer`?

---

<div class="post-metadata">

**Author:** ![kristoffer.carlsson](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/kristoffer.carlsson/32/22_2.png) [@kristoffer.carlsson](https://discourse.julialang.org/u/kristoffer.carlsson)\
**Post date:** [July 15, 2021, 9:11am UTC](https://discourse.julialang.org/t/sparse-matrix-product-causes-unnecessary-casting-to-any-thereby-causing-issues/64565/12 "2021-07-15T09:11:34Z")

</div>

I think some of the sparse array code unfortunately relies on inference to compute some things such as the output element type and if the type is abstract, that might widen.
