julia.core.JuliaError: Exception 'MethodError: no method matching Float64(::Num)

Viewed 205

Attempting to call the julia ModellingToolkit in python (using JuliaCall) and obtaining the following error when attempting to define symbolic variables.

from julia import Main as jl

jl.eval("using ModelingToolkit")
jl.eval("using DifferentialEquations")
jl.eval("@variables t")

Getting the following error as a result

julia.core.JuliaError: Exception 'MethodError: no method matching Float64(::Num)
Closest candidates are:
  (::Type{T})(::Real, !Matched::RoundingMode) where T<:AbstractFloat at ~/Julia/julia-1.7.2/share/julia/base/rounding.jl:200
  (::Type{T})(::T) where T<:Number at ~/Julia/julia-1.7.2/share/julia/base/boot.jl:770
  (::Type{T})(!Matched::VectorizationBase.Double{T}) where T<:Union{Float16, Float32, Float64, VectorizationBase.Vec{<:Any, <:Union{Float16, Float32, Float64}}, VectorizationBase.VecUnroll{var"#s35", var"#s34", var"#s33", V} where {var"#s35", var"#s34", var"#s33"<:Union{Float16, Float32, Float64}, V<:Union{Bool, Float16, Float32, Float64, Int16, Int32, Int64, Int8, UInt16, UInt32, UInt64, UInt8, SIMDTypes.Bit, VectorizationBase.AbstractSIMD{var"#s34", var"#s33"}}}} at ~/.julia/packages/VectorizationBase/xnzUX/src/special/double.jl:84
  ...' occurred while calling julia code:
convert(PyCall.PyObject, @variables t)
1 Answers

Seems that supertype(Num) yields Real and hence PyCall tries to convert it into Float64 before showing in Python.

A simple workaround would be to provide your own wrapper:

jl.eval("Float64(::Num) = NaN")

Now you will not be able to see object from ModelingToolkit but you can manipulate them in Python.

>>> jl.eval("@variables x y")
[nan, nan]
>>> jl.eval("@show simplify((x+y)^2 - (x-y)^2; expand=true)")
simplify((x + y) ^ 2 - (x - y) ^ 2; expand = true) = 4x*y
nan
Related