willow-ahrens / Finch.jl

Sparse tensors in Julia and more! Datastructure-driven array programing language.
http://willowahrens.io/Finch.jl/
MIT License
157 stars 15 forks source link

Error in reducing 1-size Tensors #485

Closed mtsokol closed 4 months ago

mtsokol commented 5 months ago

Hi @willow-ahrens,

I tried to run:

using Finch

a = zeros(1,1,1)
a_tns = Tensor(Dense(SparseList(SparseList(Element(0.0)))), a)

sum(a, dims=(1, 2))
sum(a_tns, dims=(1, 2))  # fails

But it fails with:

ERROR: DimensionMismatch: less indices than dimensions in Finch program: res[]
Stacktrace:
  [1] (::Finch.DeclareDimensions)(node::Finch.FinchNotation.FinchNode)
    @ Finch ~/JuliaProjects/Finch.jl/src/transforms/dimensionalize.jl:45
  [2] iterate(::Base.Generator{Vector{Finch.FinchNotation.FinchNode}, Finch.DeclareDimensions})
    @ Base ./generator.jl:47
  [3] _collect(c::Vector{…}, itr::Base.Generator{…}, ::Base.EltypeUnknown, isz::Base.HasShape{…})
    @ Base ./array.jl:854
  [4] collect_similar(cont::Vector{Finch.FinchNotation.FinchNode}, itr::Base.Generator{Vector{…}, Finch.DeclareDimensions})
    @ Base ./array.jl:763
  [5] map
    @ ./abstractarray.jl:3285 [inlined]
  [6] (::Finch.DeclareDimensions)(node::Finch.FinchNotation.FinchNode)
    @ Finch ~/JuliaProjects/Finch.jl/src/transforms/dimensionalize.jl:89
  [7] iterate(g::Base.Generator{Vector{Finch.FinchNotation.FinchNode}, Finch.DeclareDimensions}, s::Int64)
    @ Base ./generator.jl:47
  [8] collect_to!(dest::Vector{…}, itr::Base.Generator{…}, offs::Int64, st::Int64)
    @ Base ./array.jl:892
  [9] collect_to_with_first!(dest::Vector{…}, v1::Finch.FinchNotation.FinchNode, itr::Base.Generator{…}, st::Int64)
    @ Base ./array.jl:870
 [10] _collect(c::Vector{…}, itr::Base.Generator{…}, ::Base.EltypeUnknown, isz::Base.HasShape{…})
    @ Base ./array.jl:864
 [11] collect_similar(cont::Vector{Finch.FinchNotation.FinchNode}, itr::Base.Generator{Vector{…}, Finch.DeclareDimensions})
    @ Base ./array.jl:763
 [12] map(f::Finch.DeclareDimensions, A::Vector{Finch.FinchNotation.FinchNode})
    @ Base ./abstractarray.jl:3285
 [13] (::Finch.DeclareDimensions)(node::Finch.FinchNotation.FinchNode)
    @ Finch ~/JuliaProjects/Finch.jl/src/transforms/dimensionalize.jl:64
 [14] dimensionalize!(prgm::Finch.FinchNotation.FinchNode, ctx::Finch.LowerJulia)
    @ Finch ~/JuliaProjects/Finch.jl/src/transforms/dimensionalize.jl:29
 [15] (::Finch.var"#352#354"{Finch.LowerJulia})(ctx_2::Finch.LowerJulia)
    @ Finch ~/JuliaProjects/Finch.jl/src/execute.jl:101
 [16] #131
    @ ~/JuliaProjects/Finch.jl/src/lower.jl:17 [inlined]
 [17] contain(f::Finch.var"#131#132"{Dict{…}, Finch.var"#352#354"{…}, Finch.LowerJulia}, ctx::Finch.JuliaContext; task::Nothing)
    @ Finch ~/JuliaProjects/Finch.jl/src/environment.jl:76
 [18] contain(f::Function, ctx::Finch.JuliaContext)
    @ Finch ~/JuliaProjects/Finch.jl/src/environment.jl:69
 [19] contain(f::Finch.var"#352#354"{…}, ctx::Finch.LowerJulia; bindings::Dict{…}, kwargs::@Kwargs{})
    @ Finch ~/JuliaProjects/Finch.jl/src/lower.jl:16
 [20] contain(f::Function, ctx::Finch.LowerJulia)
    @ Finch ~/JuliaProjects/Finch.jl/src/lower.jl:15
 [21] lower_global(prgm::Finch.FinchNotation.FinchNode, ctx::Finch.LowerJulia)
    @ Finch ~/JuliaProjects/Finch.jl/src/execute.jl:94
 [22] (::Finch.var"#350#351"{Symbol, DataType})(ctx_2::Finch.LowerJulia)
    @ Finch ~/JuliaProjects/Finch.jl/src/execute.jl:82
 [23] #131
    @ ~/JuliaProjects/Finch.jl/src/lower.jl:17 [inlined]
 [24] contain(f::Finch.var"#131#132"{Dict{…}, Finch.var"#350#351"{…}, Finch.LowerJulia}, ctx::Finch.JuliaContext; task::Nothing)
    @ Finch ~/JuliaProjects/Finch.jl/src/environment.jl:76
 [25] contain(f::Function, ctx::Finch.JuliaContext)
    @ Finch ~/JuliaProjects/Finch.jl/src/environment.jl:69
 [26] contain(f::Finch.var"#350#351"{…}, ctx::Finch.LowerJulia; bindings::Dict{…}, kwargs::@Kwargs{})
    @ Finch ~/JuliaProjects/Finch.jl/src/lower.jl:16
 [27] contain
    @ ~/JuliaProjects/Finch.jl/src/lower.jl:15 [inlined]
 [28] #execute_code#349
    @ ~/JuliaProjects/Finch.jl/src/execute.jl:79 [inlined]
 [29] execute_code
    @ ~/JuliaProjects/Finch.jl/src/execute.jl:78 [inlined]
 [30] (::Finch.var"#344#347"{DataType, DataType})(ctx::Finch.JuliaContext)
    @ Finch ~/JuliaProjects/Finch.jl/src/execute.jl:63
 [31] contain(f::Finch.var"#344#347"{DataType, DataType}, ctx::Finch.JuliaContext; task::Nothing)
    @ Finch ~/JuliaProjects/Finch.jl/src/environment.jl:76
 [32] contain
    @ ~/JuliaProjects/Finch.jl/src/environment.jl:69 [inlined]
 [33] macro expansion
    @ ~/JuliaProjects/Finch.jl/src/execute.jl:62 [inlined]
 [34] ##execute_generator#231
    @ ~/JuliaProjects/Finch.jl/src/util/util.jl:51 [inlined]
 [35] (::Finch.var"#346#348"{DataType, DataType})()
    @ Finch ~/JuliaProjects/Finch.jl/src/util/util.jl:75
 [36] #s486#345
    @ ~/JuliaProjects/Finch.jl/src/util/util.jl:84 [inlined]
 [37] var"#s486#345"(::Any, ex::Any, opts::Any)
    @ Finch ./none:0
 [38] (::Core.GeneratedFunctionStub)(::UInt64, ::LineNumberNode, ::Any, ::Vararg{Any})
    @ Core ./boot.jl:602
 [39] execute(ex::Finch.FinchNotation.BlockInstance{Tuple{…}})
    @ Finch ~/JuliaProjects/Finch.jl/src/execute.jl:59
 [40] (::Finch.FinchInterpreter)(ex::Finch.FinchLogic.LogicNode)
    @ Finch ~/JuliaProjects/Finch.jl/src/interface/compute.jl:311
 [41] (::Finch.FinchInterpreter)(ex::Finch.FinchLogic.LogicNode)
    @ Finch ~/JuliaProjects/Finch.jl/src/interface/compute.jl:290
 [42] (::Finch.FinchInterpreter)(ex::Finch.FinchLogic.LogicNode)
    @ Finch ~/JuliaProjects/Finch.jl/src/interface/compute.jl:317
 [43] (::Finch.FinchInterpreter)(ex::Finch.FinchLogic.LogicNode) (repeats 2 times)
    @ Finch ~/JuliaProjects/Finch.jl/src/interface/compute.jl:318
 [44] compute_impl(args::Tuple{Finch.LazyTensor{Any, 1}}, ctx::Finch.DefaultOptimizer)
    @ Finch ~/JuliaProjects/Finch.jl/src/interface/compute.jl:418
 [45] compute(arg::Finch.LazyTensor{Any, 1}; ctx::Finch.DefaultOptimizer)
    @ Finch ~/JuliaProjects/Finch.jl/src/interface/compute.jl:390
 [46] reduce(op::Function, bc::Base.Broadcast.Broadcasted{…}; dims::Tuple{…}, init::Float64)
    @ Finch ~/JuliaProjects/Finch.jl/src/interface/eager.jl:51
 [47] reduce
    @ ~/JuliaProjects/Finch.jl/src/interface/eager.jl:50 [inlined]
 [48] #reduce#1918
    @ ~/JuliaProjects/Finch.jl/src/interface/eager.jl:34 [inlined]
 [49] reduce
    @ ~/JuliaProjects/Finch.jl/src/interface/eager.jl:33 [inlined]
 [50] #sum#1924
    @ ~/JuliaProjects/Finch.jl/src/interface/eager.jl:103 [inlined]
Some type information was truncated. Use `show(err)` to see complete types.
willow-ahrens commented 5 months ago

okay, yeah something is a little fishy here, I started a wip branch but I couldn't quite fix this one right away.

willow-ahrens commented 5 months ago

we may need to add some more unit tests and docs to the high-level api so that we can start narrowing down what's going on and where. Let's discuss thursday

willow-ahrens commented 4 months ago

oops! This is actually fixed in https://github.com/willow-ahrens/Finch.jl/pull/498