Skip to content

Commit 9424edb

Browse files
authored
Static numbers in jacobi (#172)
* static numbers in jacobi * version bump to v0.6.3 * Add tests * Fix import
1 parent 0f037a3 commit 9424edb

File tree

6 files changed

+116
-48
lines changed

6 files changed

+116
-48
lines changed

Project.toml

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
name = "ApproxFunOrthogonalPolynomials"
22
uuid = "b70543e2-c0d9-56b8-a290-0d4d6d4de211"
3-
version = "0.6.2"
3+
version = "0.6.3"
44

55
[deps]
66
ApproxFunBase = "fbd15aa5-315a-5a7d-a8a4-24992e37be05"
@@ -15,11 +15,12 @@ IntervalSets = "8197267c-284f-5f27-9208-e0e47529a953"
1515
LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e"
1616
Reexport = "189a3867-3050-52da-a836-e630ba90ab69"
1717
SpecialFunctions = "276daf66-3868-5448-9aa4-cd146d93841b"
18+
Static = "aedffcd0-7271-4cad-89d0-dc628f76c6d3"
1819
StaticArrays = "90137ffa-7385-5640-81b9-e52037218182"
1920
Statistics = "10745b16-79ce-11e8-11f9-7d13ad32a3b2"
2021

2122
[compat]
22-
ApproxFunBase = "0.7.56"
23+
ApproxFunBase = "0.7.58"
2324
ApproxFunBaseTest = "0.1"
2425
Aqua = "0.5"
2526
BandedMatrices = "0.16, 0.17"
@@ -33,6 +34,7 @@ IntervalSets = "0.5, 0.6, 0.7"
3334
LazyArrays = "0.22"
3435
Reexport = "0.2, 1"
3536
SpecialFunctions = "0.10, 1.0, 2"
37+
Static = "0.8"
3638
StaticArrays = "1"
3739
julia = "1.6"
3840

src/ApproxFunOrthogonalPolynomials.jl

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
module ApproxFunOrthogonalPolynomials
22
using Base, LinearAlgebra, Reexport, BandedMatrices, BlockBandedMatrices,
33
BlockArrays, FillArrays, FastTransforms, IntervalSets,
4-
DomainSets, Statistics, SpecialFunctions, FastGaussQuadrature
4+
DomainSets, Statistics, SpecialFunctions, FastGaussQuadrature,
5+
Static
56

67
@reexport using ApproxFunBase
78

src/Spaces/Jacobi/Jacobi.jl

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,9 @@ struct Jacobi{D<:Domain,R,T} <: PolynomialSpace{D,R}
1313
end
1414
Jacobi(b::T,a::T,d::Domain) where {T} =
1515
Jacobi{typeof(d),promote_type(T,real(prectype(d)))}(b, a, d)
16-
Legendre(domain) = Jacobi(0,0,domain)
16+
Legendre(domain) = Jacobi(static(0),static(0),domain)
1717
Legendre() = Legendre(ChebyshevInterval())
18-
Jacobi(b,a,d::Domain) = Jacobi(promote(b,a)...,d)
18+
Jacobi(b,a,d::Domain) = Jacobi(promote(dynamic(b), dynamic(a))...,d)
1919
Jacobi(b,a,d) = Jacobi(b,a,Domain(d))
2020
Jacobi(b,a) = Jacobi(b,a,ChebyshevInterval())
2121
Jacobi(A::Ultraspherical) = Jacobi(order(A)-0.5,order(A)-0.5,domain(A))
@@ -24,7 +24,7 @@ Jacobi(A::Chebyshev) = Jacobi(-0.5,-0.5,domain(A))
2424
NormalizedJacobi(s...) = NormalizedPolynomialSpace(Jacobi(s...))
2525
NormalizedLegendre(d...) = NormalizedPolynomialSpace(Legendre(d...))
2626

27-
normalization(::Type{T}, sp::Jacobi, k::Int) where T = FastTransforms.Anαβ(k, sp.a, sp.b)
27+
normalization(::Type{T}, sp::Jacobi, k::Int) where T = FastTransforms.Anαβ(k, dynamic(sp.a), dynamic(sp.b))
2828

2929
function Ultraspherical(J::Jacobi)
3030
if J.a == J.b
@@ -48,12 +48,13 @@ spacescompatible(a::Jacobi,b::Jacobi) = a.a ≈ b.a && a.b ≈ b.b && domainscom
4848

4949
isapproxinteger_addhalf(a) = isapproxinteger(a+0.5)
5050
isapproxinteger_addhalf(::Integer) = false
51+
isapproxinteger_addhalf(@nospecialize ::StaticInt) = false
5152
function canonicalspace(S::Jacobi)
5253
if isapproxinteger_addhalf(S.a) && isapproxinteger_addhalf(S.b)
5354
Chebyshev(domain(S))
5455
else
5556
# return space with parameters in (-1,0.]
56-
Jacobi(mod(S.b,-1),mod(S.a,-1),domain(S))
57+
Jacobi(mod(dynamic(S.b),-1),mod(dynamic(S.a),-1),domain(S))
5758
end
5859
end
5960

@@ -120,8 +121,8 @@ jacobip(r::AbstractRange,α,β,x::Number) = jacobip(promote_type(typeof(α),type
120121

121122
jacobip(::Type{T},n::Integer,α,β,v) where {T} = jacobip(T,n:n,α,β,v)[1]
122123
jacobip(n::Integer,α,β,v) = jacobip(n:n,α,β,v)[1]
123-
jacobip(::Type{T},n,S::Jacobi,v) where {T} = jacobip(T,n,S.a,S.b,v)
124-
jacobip(n,S::Jacobi,v) = jacobip(n,S.a,S.b,v)
124+
jacobip(::Type{T},n,S::Jacobi,v) where {T} = jacobip(T,n,dynamic(S.a),dynamic(S.b),v)
125+
jacobip(n,S::Jacobi,v) = jacobip(n,dynamic(S.a),dynamic(S.b),v)
125126

126127

127128

src/Spaces/Jacobi/JacobiOperators.jl

Lines changed: 37 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,10 @@ else
1818
end
1919

2020

21-
rangespace(D::ConcreteDerivative{J}) where {J<:Jacobi}=Jacobi(D.space.b+D.order,D.space.a+D.order,domain(D))
22-
bandwidths(D::ConcreteDerivative{J}) where {J<:Jacobi}=-D.order,D.order
21+
rangespace(D::ConcreteDerivative{<:Jacobi}) = Jacobi(D.space.b+D.order,D.space.a+D.order,domain(D))
22+
bandwidths(D::ConcreteDerivative{<:Jacobi}) = -D.order,D.order
2323

24-
getindex(T::ConcreteDerivative{J},k::Integer,j::Integer) where {J<:Jacobi} =
24+
getindex(T::ConcreteDerivative{<:Jacobi}, k::Integer, j::Integer) =
2525
j==k+1 ? eltype(T)((k+1+T.space.a+T.space.b)/complexlength(domain(T))) : zero(eltype(T))
2626

2727

@@ -57,10 +57,10 @@ function Integral(J::Jacobi,k::Number)
5757
end
5858

5959

60-
rangespace(D::ConcreteIntegral{J}) where {J<:Jacobi}=Jacobi(D.space.b-D.order,D.space.a-D.order,domain(D))
61-
bandwidths(D::ConcreteIntegral{J}) where {J<:Jacobi}=D.order,0
60+
rangespace(D::ConcreteIntegral{<:Jacobi}) = Jacobi(D.space.b-D.order,D.space.a-D.order,domain(D))
61+
bandwidths(D::ConcreteIntegral{<:Jacobi}) = D.order,0
6262

63-
function getindex(T::ConcreteIntegral{J},k::Integer,j::Integer) where J<:Jacobi
63+
function getindex(T::ConcreteIntegral{<:Jacobi}, k::Integer, j::Integer)
6464
@assert T.order==1
6565
if k2 && j==k-1
6666
complexlength(domain(T))./(k+T.space.a+T.space.b-2)
@@ -80,7 +80,7 @@ function Volterra(S::Jacobi, order::Integer)
8080
end
8181

8282
rangespace(V::ConcreteVolterra{J}) where {J<:Jacobi}=Jacobi(-1.0,0.0,domain(V))
83-
bandwidths(V::ConcreteVolterra{J}) where {J<:Jacobi}=1,0
83+
bandwidths(::ConcreteVolterra{<:Jacobi}) = 1,0
8484

8585
function getindex(V::ConcreteVolterra{J},k::Integer,j::Integer) where J<:Jacobi
8686
d=domain(V)
@@ -141,32 +141,36 @@ function Conversion(L::Jacobi,M::Jacobi)
141141

142142
if isapproxinteger(L.a-M.a) && isapproxinteger(L.b-M.b)
143143
dm=domain(M)
144-
D=typeof(dm)
145144
if isapprox(M.a,L.a) && isapprox(M.b,L.b)
146145
ConversionWrapper(Operator(I,L))
147-
elseif (isapprox(M.b,L.b+1) && isapprox(M.a,L.a)) || (isapprox(M.b,L.b) && isapprox(M.a,L.a+1))
146+
elseif (isapprox(M.b,L.b+static(1)) && isapprox(M.a,L.a)) ||
147+
(isapprox(M.b,L.b) && isapprox(M.a,L.a+static(1)))
148148
ConcreteConversion(L,M)
149-
elseif M.b > L.b+1
150-
ConversionWrapper(TimesOperator(Conversion(Jacobi(M.b-1,M.a,dm),M),Conversion(L,Jacobi(M.b-1,M.a,dm))))
149+
elseif M.b > L.b+static(1)
150+
ConversionWrapper(
151+
TimesOperator(
152+
Conversion(Jacobi(M.b-static(1),M.a,dm),M),
153+
Conversion(L,Jacobi(M.b-static(1),M.a,dm))))
151154
else #if M.a >= L.a+1
152-
ConversionWrapper(TimesOperator(Conversion(Jacobi(M.b,M.a-1,dm),M),Conversion(L,Jacobi(M.b,M.a-1,dm))))
155+
ConversionWrapper(
156+
TimesOperator(
157+
Conversion(Jacobi(M.b,M.a-static(1),dm),M),
158+
Conversion(L,Jacobi(M.b,M.a-static(1),dm))))
153159
end
154-
elseif L.a L.b 0. && M.a M.b 0.5
160+
elseif L.a L.b 0 && M.a M.b 0.5
155161
Conversion(L,Ultraspherical(L),Ultraspherical(M),M)
156-
elseif L.a L.b 0. && M.a M.b -0.5
162+
elseif L.a L.b 0 && M.a M.b -0.5
157163
Conversion(L,Ultraspherical(L),Chebyshev(M),M)
158-
elseif L.a L.b -0.5 && M.a M.b 0.5
159-
Conversion(L,Chebyshev(L),Ultraspherical(M),M)
160164
else # L.a - M.a ≈ L.b - M.b
161165
error("Implement for $L$M")
162166
end
163167
end
164168

165-
bandwidths(C::ConcreteConversion{J1,J2}) where {J1<:Jacobi,J2<:Jacobi}=(0,1)
169+
bandwidths(::ConcreteConversion{<:Jacobi,<:Jacobi}) = (0,1)
166170

167171

168172

169-
function Base.getindex(C::ConcreteConversion{J1,J2,T},k::Integer,j::Integer) where {J1<:Jacobi,J2<:Jacobi,T}
173+
function Base.getindex(C::ConcreteConversion{<:Jacobi,<:Jacobi,T},k::Integer,j::Integer) where {T}
170174
L=C.domainspace
171175
if L.b+1==C.rangespace.b
172176
if j==k
@@ -220,7 +224,8 @@ function Conversion(A::Jacobi,B::PolynomialSpace)
220224
end
221225

222226
isequalminhalf(x) = x == -0.5
223-
isequalminhalf(::Integer) = false
227+
isequalminhalf(@nospecialize ::Integer) = false
228+
isequalminhalf(@nospecialize ::StaticInt) = false
224229

225230
function Conversion(A::Jacobi,B::Chebyshev)
226231
if isequalminhalf(A.a) && isequalminhalf(A.b)
@@ -300,23 +305,23 @@ end
300305

301306

302307

303-
bandwidths(C::ConcreteConversion{US,J}) where {US<:Chebyshev,J<:Jacobi} = 0,0
304-
bandwidths(C::ConcreteConversion{J,US}) where {US<:Chebyshev,J<:Jacobi} = 0,0
308+
bandwidths(::ConcreteConversion{<:Chebyshev,<:Jacobi}) = 0,0
309+
bandwidths(::ConcreteConversion{<:Jacobi,<:Chebyshev}) = 0,0
305310

306311

307-
bandwidths(C::ConcreteConversion{US,J}) where {US<:Ultraspherical,J<:Jacobi} = 0,0
308-
bandwidths(C::ConcreteConversion{J,US}) where {US<:Ultraspherical,J<:Jacobi} = 0,0
312+
bandwidths(::ConcreteConversion{<:Ultraspherical,<:Jacobi}) = 0,0
313+
bandwidths(::ConcreteConversion{<:Jacobi,<:Ultraspherical}) = 0,0
309314

310315
#TODO: Figure out how to unify these definitions
311-
function getindex(C::ConcreteConversion{CC,J,T},k::Integer,j::Integer) where {J<:Jacobi,CC<:Chebyshev,T}
316+
function getindex(::ConcreteConversion{<:Chebyshev,<:Jacobi,T}, k::Integer, j::Integer) where {T}
312317
if j==k
313318
one(T)/jacobip(T,k-1,-one(T)/2,-one(T)/2,one(T))
314319
else
315320
zero(T)
316321
end
317322
end
318323

319-
function BandedMatrix(S::SubOperator{T,ConcreteConversion{CC,J,T},Tuple{UnitRange{Int},UnitRange{Int}}}) where {J<:Jacobi,CC<:Chebyshev,T}
324+
function BandedMatrix(S::SubOperator{T,ConcreteConversion{CC,J,T},NTuple{2,UnitRange{Int}}}) where {J<:Jacobi,CC<:Chebyshev,T}
320325
ret=BandedMatrix(Zeros, S)
321326
kr,jr = parentindices(S)
322327
k=(kr jr)
@@ -328,15 +333,15 @@ function BandedMatrix(S::SubOperator{T,ConcreteConversion{CC,J,T},Tuple{UnitRang
328333
end
329334

330335

331-
function getindex(C::ConcreteConversion{J,CC,T},k::Integer,j::Integer) where {J<:Jacobi,CC<:Chebyshev,T}
336+
function getindex(::ConcreteConversion{<:Jacobi,<:Chebyshev,T}, k::Integer, j::Integer) where {T}
332337
if j==k
333338
jacobip(T,k-1,-one(T)/2,-one(T)/2,one(T))
334339
else
335340
zero(T)
336341
end
337342
end
338343

339-
function BandedMatrix(S::SubOperator{T,ConcreteConversion{J,CC,T},Tuple{UnitRange{Int},UnitRange{Int}}}) where {J<:Jacobi,CC<:Chebyshev,T}
344+
function BandedMatrix(S::SubOperator{T,ConcreteConversion{J,CC,T},NTuple{2,UnitRange{Int}}}) where {J<:Jacobi,CC<:Chebyshev,T}
340345
ret=BandedMatrix(Zeros, S)
341346
kr,jr = parentindices(S)
342347
k=(kr jr)
@@ -348,7 +353,7 @@ function BandedMatrix(S::SubOperator{T,ConcreteConversion{J,CC,T},Tuple{UnitRang
348353
end
349354

350355

351-
function getindex(C::ConcreteConversion{US,J,T},k::Integer,j::Integer) where {US<:Ultraspherical,J<:Jacobi,T}
356+
function getindex(C::ConcreteConversion{<:Ultraspherical,<:Jacobi,T}, k::Integer, j::Integer) where {T}
352357
if j==k
353358
S=rangespace(C)
354359
jp=jacobip(T,k-1,S.a,S.b,one(T))
@@ -359,7 +364,7 @@ function getindex(C::ConcreteConversion{US,J,T},k::Integer,j::Integer) where {US
359364
end
360365
end
361366

362-
function BandedMatrix(S::SubOperator{T,ConcreteConversion{US,J,T},Tuple{UnitRange{Int},UnitRange{Int}}}) where {US<:Ultraspherical,J<:Jacobi,T}
367+
function BandedMatrix(S::SubOperator{T,ConcreteConversion{US,J,T},NTuple{2,UnitRange{Int}}}) where {US<:Ultraspherical,J<:Jacobi,T}
363368
ret=BandedMatrix(Zeros, S)
364369
kr,jr = parentindices(S)
365370
k=(kr jr)
@@ -375,7 +380,7 @@ end
375380

376381

377382

378-
function getindex(C::ConcreteConversion{J,US,T},k::Integer,j::Integer) where {US<:Ultraspherical,J<:Jacobi,T}
383+
function getindex(C::ConcreteConversion{<:Jacobi,<:Ultraspherical,T}, k::Integer, j::Integer) where {T}
379384
if j==k
380385
S=domainspace(C)
381386
jp=jacobip(T,k-1,S.a,S.b,one(T))
@@ -386,7 +391,7 @@ function getindex(C::ConcreteConversion{J,US,T},k::Integer,j::Integer) where {US
386391
end
387392
end
388393

389-
function BandedMatrix(S::SubOperator{T,ConcreteConversion{J,US,T},Tuple{UnitRange{Int},UnitRange{Int}}}) where {US<:Ultraspherical,J<:Jacobi,T}
394+
function BandedMatrix(S::SubOperator{T,ConcreteConversion{J,US,T},NTuple{2,UnitRange{Int}}}) where {US<:Ultraspherical,J<:Jacobi,T}
390395
ret=BandedMatrix(Zeros, S)
391396
kr,jr = parentindices(S)
392397
k=(kr jr)
@@ -403,6 +408,7 @@ end
403408

404409
isapproxminhalf(a) = a -0.5
405410
isapproxminhalf(::Integer) = false
411+
isapproxminhalf(@nospecialize ::StaticInt) = false
406412

407413
function union_rule(A::Jacobi,B::Jacobi)
408414
if domainscompatible(A,B)

src/Spaces/Ultraspherical/Ultraspherical.jl

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
21
export Ultraspherical, NormalizedUltraspherical
32

43
#Ultraspherical Spaces
@@ -106,17 +105,17 @@ ones(S::Ultraspherical) = ones(Float64, S)
106105

107106
## Fast evaluation
108107

109-
function Base.first(f::Fun{Ultraspherical{Int,D,R}}) where {D,R}
108+
function Base.first(f::Fun{<:Ultraspherical{Int}})
110109
n = length(f.coefficients)
111110
n == 0 && return zero(cfstype(f))
112111
n == 1 && return first(f.coefficients)
113112
foldr(-,coefficients(f,Chebyshev))
114113
end
115114

116-
Base.last(f::Fun{Ultraspherical{Int,D,R}}) where {D,R} = reduce(+,coefficients(f,Chebyshev))
115+
Base.last(f::Fun{<:Ultraspherical{Int}}) = reduce(+,coefficients(f,Chebyshev))
117116

118-
Base.first(f::Fun{Ultraspherical{O,D,R}}) where {O,D,R} = f(leftendpoint(domain(f)))
119-
Base.last(f::Fun{Ultraspherical{O,D,R}}) where {O,D,R} = f(rightendpoint(domain(f)))
117+
Base.first(f::Fun{<:Ultraspherical}) = f(leftendpoint(domain(f)))
118+
Base.last(f::Fun{<:Ultraspherical}) = f(rightendpoint(domain(f)))
120119

121120
function Fun(::typeof(identity), s::Ultraspherical)
122121
d = domain(s)

test/JacobiTest.jl

Lines changed: 62 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ using ApproxFunBaseTest: testbandedbelowoperator, testbandedoperator, testspace,
99
testfunctional
1010
using ApproxFunOrthogonalPolynomials: jacobip
1111
using StaticArrays: SVector
12+
using Static
1213

1314
@verbose @testset "Jacobi" begin
1415
@testset "Basic" begin
@@ -50,9 +51,9 @@ using StaticArrays: SVector
5051
@testset for d in [-1..1, 0..1]
5152
f = Fun(x->x^2, Chebyshev(d))
5253
C = space(f)
53-
for J1 = Any[Jacobi(-0.5, -0.5, d), Legendre(d),
54-
Jacobi(0.5, 0.5, d), Jacobi(2.5, 1.5, d)]
55-
for J in [J1, NormalizedPolynomialSpace(J1)]
54+
for J1 in (Jacobi(-0.5, -0.5, d), Legendre(d),
55+
Jacobi(0.5, 0.5, d), Jacobi(2.5, 1.5, d))
56+
for J in (J1, NormalizedPolynomialSpace(J1))
5657
g = Fun(f, J)
5758
if !any(isnan, coefficients(g))
5859
@test Conversion(C, J) * f g
@@ -61,6 +62,64 @@ using StaticArrays: SVector
6162
end
6263
end
6364

65+
@testset "inference tests" begin
66+
#= Note all cases are inferred as of now,
67+
but as the situation eveolves in the future, more @inferred tests
68+
may be added
69+
There are also issues with static float promotion, because of which
70+
we don't use the floating point orders directly in tests
71+
See https://github.com/SciML/Static.jl/issues/97
72+
=#
73+
@testset "Jacobi" begin
74+
CLL = @inferred Conversion(Legendre(), Legendre())
75+
@test convert(Number, CLL) == 1
76+
CNLNL = @inferred Conversion(NormalizedLegendre(), NormalizedLegendre())
77+
@test convert(Number, CNLNL) == 1
78+
CLNL = @inferred Conversion(Legendre(), NormalizedLegendre())
79+
@test CLNL * Fun(Legendre()) Fun(NormalizedLegendre())
80+
CNLL = @inferred Conversion(NormalizedLegendre(), Legendre())
81+
@test CNLL * Fun(NormalizedLegendre()) Fun(Legendre())
82+
end
83+
84+
@testset "Chebyshev" begin
85+
CCL = @inferred Conversion(Chebyshev(), Legendre())
86+
@test CCL * Fun(Chebyshev()) Fun(Legendre())
87+
CLC = @inferred Conversion(Legendre(), Chebyshev())
88+
@test CLC * Fun(Legendre()) Fun(Chebyshev())
89+
90+
@inferred Conversion(Chebyshev(), Jacobi(static(-0.5), static(-0.5)))
91+
CCJmhalf = Conversion(Chebyshev(), Jacobi(-0.5, -0.5))
92+
@test CCJmhalf * Fun(Chebyshev()) Fun(Jacobi(-0.5,-0.5))
93+
@inferred Conversion(Jacobi(static(-0.5),static(-0.5)), Chebyshev())
94+
CJmhalfC = Conversion(Jacobi(-0.5,-0.5), Chebyshev())
95+
@test CJmhalfC * Fun(Jacobi(-0.5,-0.5)) Fun(Chebyshev())
96+
97+
@inferred Conversion(Chebyshev(), Jacobi(static(0.5), static(0.5)))
98+
CCJmhalf = Conversion(Chebyshev(), Jacobi(0.5, 0.5))
99+
@test CCJmhalf * Fun(Chebyshev()) Fun(Jacobi(0.5,0.5))
100+
101+
CCJ1 = Conversion(Chebyshev(), Jacobi(1,1))
102+
@test CCJ1 * Fun(Chebyshev()) Fun(Jacobi(1,1))
103+
104+
CCJmix = Conversion(Chebyshev(), Jacobi(0.5,1.5))
105+
@test CCJmix * Fun(Chebyshev()) Fun(Jacobi(0.5,1.5))
106+
end
107+
108+
@testset "Ultraspherical" begin
109+
CUL = @inferred Conversion(Ultraspherical(static(0.5)), Legendre())
110+
@test CUL * Fun(Ultraspherical(0.5)) Fun(Legendre())
111+
CLU = @inferred Conversion(Legendre(), Ultraspherical(static(0.5)))
112+
@test CLU * Fun(Legendre()) Fun(Ultraspherical(0.5))
113+
114+
@inferred Conversion(Ultraspherical(static(0.5)), Jacobi(static(1),static(1)))
115+
CU0J1 = Conversion(Ultraspherical(0.5), Jacobi(1,1))
116+
@test CU0J1 * Fun(Ultraspherical(0.5)) Fun(Jacobi(1,1))
117+
@inferred Conversion(Jacobi(static(1),static(1)), Ultraspherical(static(2.5)))
118+
CJ1U2 = Conversion(Jacobi(1,1), Ultraspherical(2.5))
119+
@test CJ1U2 * Fun(Jacobi(1,1)) Fun(Ultraspherical(2.5))
120+
end
121+
end
122+
64123
@testset "conversion between spaces" begin
65124
for u in (Ultraspherical(1), Chebyshev())
66125
@test NormalizedPolynomialSpace(Jacobi(u)) ==

0 commit comments

Comments
 (0)