QuantumBFS / Yao.jl

Extensible, Efficient Quantum Algorithm Design for Humans.

Home Page:https://yaoquantum.org

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

`dispatch!(circuit, angles)` fails when gates are created with `Irrational` angles

jlbosse opened this issue · comments

Here is an MWE illustrating the problem:

using Yao

circuit = chain(1)
push!(circuit, put(1, 1=>shift(π)))
push!(circuit, put(1, 1=>Rx(1))

parameters(circuit)

# out
2-element Vector{Float64}:
 3.141592653589793
 1.0

dispatch!(circuit, zeros(2))

# out
ERROR: MethodError: no method matching Irrational{:π}(::Float64)

Closest candidates are:
  (::Type{T})(::T) where T<:Number
   @ Core boot.jl:792
  (::Type{Irrational{sym}} where sym)()
   @ Base irrationals.jl:29
  (::Type{T})(::AbstractChar) where T<:Union{AbstractChar, Number}
   @ Base char.jl:50
  ...

Clearly, this can be fixed by wrapping the π in a Float64, but feels a bit cumbersome. But I am also not sure what a good fix is, since having generic types is quite nice.

I understand the use case, but I don't see a solution to this because Yao doesn't really handle symbolic scalar expressions...this should be the right behavior of YaoBlocks, and the error message is also quite clear?

Fair enough, I guess it is more down to the fact that π behaves funny in some contexts and julia users are (hopefully) used to that. So maybe give this issue a tag "wont-fix" and then close it for future reference?

so the real issue is still a mixture of value and symbolic expression (aka the program), pi is technically a symbol but unfortunately Yao doesn't understand it. This problem will automatically disappear if there is an explicit symbolic expression containing scalar symbols then use an explicit compile stage to get the value. So it automatically gets fixed with YaoExpr (the Yao 2.0), but I currently don't have time to work on the new engine, might need to wait until I have more spare time to sketch that out.