bsc-quantic/Quac.jl

`adjoint(::Circuit)` crashes on some circuits

Closed this issue · 1 comments

julia> using Quac
julia> circ = Quac.Algorithms.QFT(5)
julia> iterate(circ) # this works
...
julia> adj_circ = circ';
julia> adj_circ # this crashes
ERROR: MethodError: reducing over an empty collection is not allowed; consider supplying `init` to the reducer
Stacktrace:
  [1] reduce_empty(op::Base.BottomRF{Quac.var"#255#263"}, #unused#::Type{Quac.Element{Gate}})
    @ Base ./reduce.jl:355
  [2] reduce_empty(op::Base.FilteringRF{Quac.var"#258#266"{Vector{Int64}}, Base.BottomRF{Quac.var"#255#263"}}, #unused#::Type{Quac.Element{Gate}})
    @ Base ./reduce.jl:357
  [3] reduce_empty_iter
    @ ./reduce.jl:379 [inlined]
  [4] reduce_empty_iter
    @ ./reduce.jl:378 [inlined]
  [5] foldl_impl
    @ ./reduce.jl:49 [inlined]
  [6] mapfoldl_impl
    @ ./reduce.jl:44 [inlined]
  [7] #mapfoldl#259
    @ ./reduce.jl:170 [inlined]
  [8] mapfoldl
    @ ./reduce.jl:170 [inlined]
  [9] #mapreduce#263
    @ ./reduce.jl:302 [inlined]
 [10] mapreduce
    @ ./reduce.jl:302 [inlined]
 [11] #reduce#265
    @ ./reduce.jl:483 [inlined]
 [12] reduce
    @ ./reduce.jl:483 [inlined]
 [13] iterate(circuit::Circuit, state::Vector{Int64})
    @ Quac ~/Workspace/Quac.jl/src/Circuit.jl:104
 [14] iterate(circuit::Circuit)
    @ Quac ~/Workspace/Quac.jl/src/Circuit.jl:88
 [15] top-level scope
    @ REPL[16]:1

Problem looks to be in the filter at

Quac.jl/src/Circuit.jl

Lines 100 to 106 in de71b85

winner = reduce(filter(x -> x state, candidates)) do a, b
if mapreduce(x -> x[2], max, a.priority) <= mapreduce(x -> x[2], max, b.priority)
return a
else
return b
end
end

because the result of the filter is empty.

The result of circ' might be wrong. It would be awesome to write a test for this.

Triggering TagBot for merged registry pull request: bsc-quantic/Registry#41