ApproxFun.jl icon indicating copy to clipboard operation
ApproxFun.jl copied to clipboard

InexactError in Multivariate Fun definition

Open fgerick opened this issue 6 years ago • 4 comments

I'm trying to create a multivariate function with complex Laurent polynomials, but

Fun((x,y)->x*cos(y),Chebyshev()⊗Laurent())

yields

InexactError: Float64(0.5 + 6.123233995736765e-17im)

Stacktrace:
 [1] Type at ./complex.jl:37 [inlined]
 [2] convert at ./number.jl:7 [inlined]
 [3] setindex! at ./array.jl:769 [inlined]
 [4] macro expansion at ./multidimensional.jl:701 [inlined]
 [5] macro expansion at ./cartesian.jl:64 [inlined]
 [6] macro expansion at ./multidimensional.jl:696 [inlined]
 [7] _unsafe_setindex!(::IndexLinear, ::Array{Float64,2}, ::Array{Complex{Float64},1}, ::Int64, ::Base.Slice{Base.OneTo{Int64}}) at ./multidimensional.jl:689
 [8] _setindex! at ./multidimensional.jl:684 [inlined]
 [9] setindex! at ./abstractarray.jl:1020 [inlined]
 [10] *(::ApproxFun.TransformPlan{Tuple{AbstractFFTs.Plan{Float64},Int64},TensorSpace{Tuple{Chebyshev{ChebyshevInterval{Float64},Float64},ApproxFun.SumSpace{Tuple{Hardy{true,PeriodicSegment{Float64},Complex{Float64}},Hardy{false,PeriodicSegment{Float64},Complex{Float64}}},PeriodicSegment{Float64},Complex{Float64}}},DomainSets.ProductDomain{Tuple{ChebyshevInterval{Float64},PeriodicSegment{Float64}},Tuple{Float64,Float64},StaticArrays.SArray{Tuple{2},Float64,1,2}},Complex{Float64}},true,Tuple{Tuple{FastTransforms.ChebyshevTransformPlan{Float64,1,false,FastTransforms.ChebyshevTransformPlan{Float64,1,true,FFTW.r2rFFTWPlan{Float64,(5,),true,1}}},Int64},Tuple{ApproxFun.TransformPlan{Float64,ApproxFun.SumSpace{Tuple{Hardy{true,PeriodicSegment{Float64},Complex{Float64}},Hardy{false,PeriodicSegment{Float64},Complex{Float64}}},PeriodicSegment{Float64},Complex{Float64}},false,ApproxFun.TransformPlan{Complex{Float64},ApproxFun.SumSpace{Tuple{Hardy{true,PeriodicSegment{Float64},Complex{Float64}},Hardy{false,PeriodicSegment{Float64},Complex{Float64}}},PeriodicSegment{Float64},Complex{Float64}},false,ApproxFun.TransformPlan{Complex{Float64},ApproxFun.SumSpace{Tuple{Hardy{true,PeriodicSegment{Float64},Complex{Float64}},Hardy{false,PeriodicSegment{Float64},Complex{Float64}}},PeriodicSegment{Float64},Complex{Float64}},true,FFTW.cFFTWPlan{Complex{Float64},-1,true,1}}}},Int64}}}, ::Array{Float64,2}) at /cluster/home/gerickf/.julia/packages/ApproxFun/UU55f/src/Multivariate/TensorSpace.jl:339
 [11] * at /cluster/home/gerickf/.julia/packages/ApproxFun/UU55f/src/Multivariate/TensorSpace.jl:347 [inlined]
 [12] *(::ApproxFun.TransformPlan{Tuple{AbstractFFTs.Plan{Float64},Int64},TensorSpace{Tuple{Chebyshev{ChebyshevInterval{Float64},Float64},ApproxFun.SumSpace{Tuple{Hardy{true,PeriodicSegment{Float64},Complex{Float64}},Hardy{false,PeriodicSegment{Float64},Complex{Float64}}},PeriodicSegment{Float64},Complex{Float64}}},DomainSets.ProductDomain{Tuple{ChebyshevInterval{Float64},PeriodicSegment{Float64}},Tuple{Float64,Float64},StaticArrays.SArray{Tuple{2},Float64,1,2}},Complex{Float64}},false,Tuple{Tuple{FastTransforms.ChebyshevTransformPlan{Float64,1,false,FastTransforms.ChebyshevTransformPlan{Float64,1,true,FFTW.r2rFFTWPlan{Float64,(5,),true,1}}},Int64},Tuple{ApproxFun.TransformPlan{Float64,ApproxFun.SumSpace{Tuple{Hardy{true,PeriodicSegment{Float64},Complex{Float64}},Hardy{false,PeriodicSegment{Float64},Complex{Float64}}},PeriodicSegment{Float64},Complex{Float64}},false,ApproxFun.TransformPlan{Complex{Float64},ApproxFun.SumSpace{Tuple{Hardy{true,PeriodicSegment{Float64},Complex{Float64}},Hardy{false,PeriodicSegment{Float64},Complex{Float64}}},PeriodicSegment{Float64},Complex{Float64}},false,ApproxFun.TransformPlan{Complex{Float64},ApproxFun.SumSpace{Tuple{Hardy{true,PeriodicSegment{Float64},Complex{Float64}},Hardy{false,PeriodicSegment{Float64},Complex{Float64}}},PeriodicSegment{Float64},Complex{Float64}},true,FFTW.cFFTWPlan{Complex{Float64},-1,true,1}}}},Int64}}}, ::Array{Float64,1}) at /cluster/home/gerickf/.julia/packages/ApproxFun/UU55f/src/Multivariate/TensorSpace.jl:352
 [13] transform(::TensorSpace{Tuple{Chebyshev{ChebyshevInterval{Float64},Float64},ApproxFun.SumSpace{Tuple{Hardy{true,PeriodicSegment{Float64},Complex{Float64}},Hardy{false,PeriodicSegment{Float64},Complex{Float64}}},PeriodicSegment{Float64},Complex{Float64}}},DomainSets.ProductDomain{Tuple{ChebyshevInterval{Float64},PeriodicSegment{Float64}},Tuple{Float64,Float64},StaticArrays.SArray{Tuple{2},Float64,1,2}},Complex{Float64}}, ::Array{Float64,1}) at /cluster/home/gerickf/.julia/packages/ApproxFun/UU55f/src/Fun/Space.jl:426
 [14] default_Fun(::Type{Float64}, ::Function, ::TensorSpace{Tuple{Chebyshev{ChebyshevInterval{Float64},Float64},ApproxFun.SumSpace{Tuple{Hardy{true,PeriodicSegment{Float64},Complex{Float64}},Hardy{false,PeriodicSegment{Float64},Complex{Float64}}},PeriodicSegment{Float64},Complex{Float64}}},DomainSets.ProductDomain{Tuple{ChebyshevInterval{Float64},PeriodicSegment{Float64}},Tuple{Float64,Float64},StaticArrays.SArray{Tuple{2},Float64,1,2}},Complex{Float64}}, ::Array{StaticArrays.SArray{Tuple{2},Float64,1,2},1}, ::Type{Val{false}}) at /cluster/home/gerickf/.julia/packages/ApproxFun/UU55f/src/Fun/constructors.jl:47
 [15] default_Fun(::ApproxFun.DFunction, ::TensorSpace{Tuple{Chebyshev{ChebyshevInterval{Float64},Float64},ApproxFun.SumSpace{Tuple{Hardy{true,PeriodicSegment{Float64},Complex{Float64}},Hardy{false,PeriodicSegment{Float64},Complex{Float64}}},PeriodicSegment{Float64},Complex{Float64}}},DomainSets.ProductDomain{Tuple{ChebyshevInterval{Float64},PeriodicSegment{Float64}},Tuple{Float64,Float64},StaticArrays.SArray{Tuple{2},Float64,1,2}},Complex{Float64}}, ::Int64, ::Type{Val{false}}) at /cluster/home/gerickf/.julia/packages/ApproxFun/UU55f/src/Fun/constructors.jl:60
 [16] default_Fun(::Function, ::TensorSpace{Tuple{Chebyshev{ChebyshevInterval{Float64},Float64},ApproxFun.SumSpace{Tuple{Hardy{true,PeriodicSegment{Float64},Complex{Float64}},Hardy{false,PeriodicSegment{Float64},Complex{Float64}}},PeriodicSegment{Float64},Complex{Float64}}},DomainSets.ProductDomain{Tuple{ChebyshevInterval{Float64},PeriodicSegment{Float64}},Tuple{Float64,Float64},StaticArrays.SArray{Tuple{2},Float64,1,2}},Complex{Float64}}, ::Int64) at /cluster/home/gerickf/.julia/packages/ApproxFun/UU55f/src/Fun/constructors.jl:75
 [17] default_Fun(::ApproxFun.DFunction, ::TensorSpace{Tuple{Chebyshev{ChebyshevInterval{Float64},Float64},ApproxFun.SumSpace{Tuple{Hardy{true,PeriodicSegment{Float64},Complex{Float64}},Hardy{false,PeriodicSegment{Float64},Complex{Float64}}},PeriodicSegment{Float64},Complex{Float64}}},DomainSets.ProductDomain{Tuple{ChebyshevInterval{Float64},PeriodicSegment{Float64}},Tuple{Float64,Float64},StaticArrays.SArray{Tuple{2},Float64,1,2}},Complex{Float64}}) at /cluster/home/gerickf/.julia/packages/ApproxFun/UU55f/src/Fun/constructors.jl:124
 [18] Fun(::Function, ::TensorSpace{Tuple{Chebyshev{ChebyshevInterval{Float64},Float64},ApproxFun.SumSpace{Tuple{Hardy{true,PeriodicSegment{Float64},Complex{Float64}},Hardy{false,PeriodicSegment{Float64},Complex{Float64}}},PeriodicSegment{Float64},Complex{Float64}}},DomainSets.ProductDomain{Tuple{ChebyshevInterval{Float64},PeriodicSegment{Float64}},Tuple{Float64,Float64},StaticArrays.SArray{Tuple{2},Float64,1,2}},Complex{Float64}}) at /cluster/home/gerickf/.julia/packages/ApproxFun/UU55f/src/Fun/constructors.jl:180
 [19] default_Fun(::ApproxFun.DFunction, ::TensorSpace{Tuple{Chebyshev{ChebyshevInterval{Float64},Float64},ApproxFun.SumSpace{Tuple{Hardy{true,PeriodicSegment{Float64},Complex{Float64}},Hardy{false,PeriodicSegment{Float64},Complex{Float64}}},PeriodicSegment{Float64},Complex{Float64}}},DomainSets.ProductDomain{Tuple{ChebyshevInterval{Float64},PeriodicSegment{Float64}},Tuple{Float64,Float64},StaticArrays.SArray{Tuple{2},Float64,1,2}},Complex{Float64}}) at /cluster/home/gerickf/.julia/packages/ApproxFun/UU55f/src/Fun/constructors.jl:103
 [20] Fun(::Function, ::TensorSpace{Tuple{Chebyshev{ChebyshevInterval{Float64},Float64},ApproxFun.SumSpace{Tuple{Hardy{true,PeriodicSegment{Float64},Complex{Float64}},Hardy{false,PeriodicSegment{Float64},Complex{Float64}}},PeriodicSegment{Float64},Complex{Float64}}},DomainSets.ProductDomain{Tuple{ChebyshevInterval{Float64},PeriodicSegment{Float64}},Tuple{Float64,Float64},StaticArrays.SArray{Tuple{2},Float64,1,2}},Complex{Float64}}) at /cluster/home/gerickf/.julia/packages/ApproxFun/UU55f/src/Fun/constructors.jl:180
 [21] top-level scope at In[260]:1```

fgerick avatar Feb 27 '19 17:02 fgerick

Okay, I just found out it is fixed if a complex return type for the function is defined:

f(x::Float64,y::Float64)::ComplexF64 = x*cos(y)

Fun(f,Chebyshev() ⊗ Laurent())

works! Still it would be nice if this works without return-types!?

fgerick avatar Feb 27 '19 17:02 fgerick

Yes it’s definitely a bug.

dlfivefifty avatar Feb 27 '19 17:02 dlfivefifty

I also encounter similar issue but cannot resolve it yet.

f = Fun(Chebyshev()^2,[1,2,3,0,4,0]); f(0.5,0.4)

yields:

ERROR: InexactError: Int64(2.5) Stacktrace: [1] Type at .\float.jl:703 [inlined] [2] convert at .\number.jl:7 [inlined] [3] setindex! at .\array.jl:767 [inlined] [4] evaluate(::ProductFun{Chebyshev{ChebyshevInterval{Float64},Float64},Chebyshev{ChebyshevInterval{Float64},Float64},TensorSpace{Tuple{Chebyshev{ChebyshevInterval{Float64},Float64},Chebyshev{ChebyshevInterval{Float64},Float64}},DomainSets.ProductDomain{Tuple{ChebyshevInterval{Float64},ChebyshevInterval{Float64}},Tuple{Float64,Float64},StaticArrays.SArray{Tuple{2},Float64,1,2}},Float64},Int64}, ::Float64, ::Colon) at C:\Users\think.julia\packages\ApproxFunBase\EjdxK\src\Multivariate\ProductFun.jl:215 [5] evaluate at C:\Users\think.julia\packages\ApproxFunBase\EjdxK\src\Multivariate\ProductFun.jl:218 [inlined] [6] (::ProductFun{Chebyshev{ChebyshevInterval{Float64},Float64},Chebyshev{ChebyshevInterval{Float64},Float64},TensorSpace{Tuple{Chebyshev{ChebyshevInterval{Float64},Float64},Chebyshev{ChebyshevInterval{Float64},Float64}},DomainSets.ProductDomain{Tuple{ChebyshevInterval{Float64},ChebyshevInterval{Float64}},Tuple{Float64,Float64},StaticArrays.SArray{Tuple{2},Float64,1,2}},Float64},Int64})(::Float64, ::Float64) at C:\Users\think.julia\packages\ApproxFunBase\EjdxK\src\Multivariate\ProductFun.jl:176 [7] evaluate(::Fun{TensorSpace{Tuple{Chebyshev{ChebyshevInterval{Float64},Float64},Chebyshev{ChebyshevInterval{Float64},Float64}},DomainSets.ProductDomain{Tuple{ChebyshevInterval{Float64},ChebyshevInterval{Float64}},Tuple{Float64,Float64},StaticArrays.SArray{Tuple{2},Float64,1,2}},Float64},Int64,Array{Int64,1}}, ::Float64, ::Float64) at C:\Users\think.julia\packages\ApproxFunBase\EjdxK\src\Multivariate\TensorSpace.jl:481 [8] (::Fun{TensorSpace{Tuple{Chebyshev{ChebyshevInterval{Float64},Float64},Chebyshev{ChebyshevInterval{Float64},Float64}},DomainSets.ProductDomain{Tuple{ChebyshevInterval{Float64},ChebyshevInterval{Float64}},Tuple{Float64,Float64},StaticArrays.SArray{Tuple{2},Float64,1,2}},Float64},Int64,Array{Int64,1}})(::Float64, ::Vararg{Float64,N} where N) at C:\Users\think.julia\packages\ApproxFunBase\EjdxK\src\Fun.jl:220 [9] top-level scope at none:0

YingZhaoleo avatar Jun 13 '19 13:06 YingZhaoleo

This can probably be worked around by making the coefficients Float64. Though I believe changing something to prectype(f) should give a more robust fix.

I'm pretty busy right now so would appreciate any PRs.

dlfivefifty avatar Jun 16 '19 11:06 dlfivefifty