@@ -158,8 +158,8 @@ function Conversion(L::Jacobi,M::Jacobi)
158158 # Conversion(L, M) == Conversion(J, M) * Conversion(L, J)
159159 # Conversion(L, J) = Conversion(Jacobi(L.b, L.a, dm), Jacobi(M.b, L.a, dm))
160160 # Conversion(J, M) = Conversion(Jacobi(M.b, L.a, dm), Jacobi(M.b, M.a, dm))
161- CLJ = [ConcreteConversion (Jacobi (b- 1 ,L. a,dm), Jacobi (b, L. a, dm)) for b in M. b: - 1 : L. b+ 1 ]
162- CJM = [ConcreteConversion (Jacobi (M. b,a- 1 ,dm), Jacobi (M. b, a, dm)) for a in M. a: - 1 : L. a+ 1 ]
161+ CLJ = [ConcreteConversion (Jacobi (b- 1 ,L. a,dm), Jacobi (b, L. a, dm)) for b in decreasingunitsteprange ( M. b, L. b+ 1 ) ]
162+ CJM = [ConcreteConversion (Jacobi (M. b,a- 1 ,dm), Jacobi (M. b, a, dm)) for a in decreasingunitsteprange ( M. a, L. a+ 1 ) ]
163163 C = [CJM; CLJ]
164164 return ConversionWrapper (TimesOperator (C))
165165 end
@@ -221,102 +221,98 @@ end
221221
222222# Assume m is compatible
223223
224- function Conversion (A:: PolynomialSpace ,B:: Jacobi )
224+ function Conversion (A:: PolynomialSpace , B:: Jacobi )
225225 @assert domain (A) == domain (B)
226226 J = Jacobi (A)
227227 J == B ? ConcreteConversion (A,B) :
228- ConversionWrapper (TimesOperator (Conversion (J,B),Conversion (A,J)))
228+ ConversionWrapper (SpaceOperator ( TimesOperator (Conversion (J,B),Conversion (A,J)), A, B ))
229229end
230230
231- function Conversion (A:: Jacobi ,B:: PolynomialSpace )
231+ function Conversion (A:: Jacobi , B:: PolynomialSpace )
232232 @assert domain (A) == domain (B)
233233 J = Jacobi (B)
234234 J == A ? ConcreteConversion (A,B) :
235- ConversionWrapper (TimesOperator (Conversion (J,B),Conversion (A,J)))
235+ ConversionWrapper (SpaceOperator ( TimesOperator (Conversion (J,B),Conversion (A,J)), A, B ))
236236end
237237
238- isequalminhalf (x) = x == - 0.5
239- isequalminhalf (@nospecialize :: Integer ) = false
240-
241- function Conversion (A:: Jacobi ,B:: Chebyshev )
238+ function Conversion (A:: Jacobi , B:: Chebyshev )
242239 @assert domain (A) == domain (B)
243240 if isequalminhalf (A. a) && isequalminhalf (A. b)
244241 ConcreteConversion (A,B)
245242 elseif A. a == A. b == 0
246- ConversionWrapper (
247- SpaceOperator (
248- ConcreteConversion (Ultraspherical (1 // 2 ),B),
249- A,B))
243+ ConversionWrapper (SpaceOperator (ConcreteConversion (Ultraspherical (A), B), A, B))
250244 elseif A. a == A. b
251245 US = Ultraspherical (A)
252- ConversionWrapper (Conversion (US,B)* ConcreteConversion (A,US))
246+ ConversionWrapper (SpaceOperator ( TimesOperator ( Conversion (US,B), ConcreteConversion (A,US)), A, B ))
253247 else
254248 J = Jacobi (B)
255249 ConcreteConversion (J,B)* Conversion (A,J)
256250 end
257251end
258252
259- function Conversion (A:: Chebyshev ,B:: Jacobi )
253+ function Conversion (A:: Chebyshev , B:: Jacobi )
260254 @assert domain (A) == domain (B)
261255 if isequalminhalf (B. a) && isequalminhalf (B. b)
262256 ConcreteConversion (A,B)
263257 elseif B. a == B. b == 0
264- ConversionWrapper (
265- SpaceOperator (
266- ConcreteConversion (A,Ultraspherical (1 // 2 ,domain (B))),
267- A,B))
258+ ConversionWrapper (SpaceOperator (ConcreteConversion (A, Ultraspherical (B)), A, B))
268259 elseif B. a == B. b
269260 US = Ultraspherical (B)
270- ConcreteConversion (US,B) * Conversion (A,US)
261+ ConversionWrapper ( SpaceOperator ( TimesOperator ( ConcreteConversion (US,B), Conversion (A,US)), A, B) )
271262 else
272263 J = Jacobi (A)
273264 Conversion (J,B)* ConcreteConversion (A,J)
274265 end
275266end
276267
277268
278- function Conversion (A:: Jacobi ,B:: Ultraspherical )
269+ @inline function _Conversion (A:: Jacobi , B:: Ultraspherical )
279270 @assert domain (A) == domain (B)
280271 if isequalminhalf (A. a) && isequalminhalf (A. b)
281- ConversionWrapper (Conversion (Chebyshev (domain (A)),B)*
282- ConcreteConversion (A,Chebyshev (domain (A))))
272+ C = Chebyshev (domain (A))
273+ ConversionWrapper (SpaceOperator (
274+ TimesOperator (Conversion (C,B), ConcreteConversion (A,C)), A, B))
283275 elseif isequalminhalf (A. a - order (B)) && isequalminhalf (A. b - order (B))
284276 ConcreteConversion (A,B)
285277 elseif A. a == A. b == 0
286- ConversionWrapper (
287- SpaceOperator (
288- Conversion (Ultraspherical (1 // 2 ),B),
289- A,B))
278+ ConversionWrapper (SpaceOperator (Conversion (Ultraspherical (A), B), A, B))
290279 elseif A. a == A. b
291280 US = Ultraspherical (A)
292- ConversionWrapper (Conversion (US,B)* ConcreteConversion (A,US))
281+ ConversionWrapper (SpaceOperator (
282+ TimesOperator (Conversion (US,B), ConcreteConversion (A,US)), A, B))
293283 else
294284 J = Jacobi (B)
295285 ConcreteConversion (J,B)* Conversion (A,J)
296286 end
297287end
298288
299- function Conversion (A:: Ultraspherical ,B:: Jacobi )
289+ @inline function _Conversion (A:: Ultraspherical , B:: Jacobi )
300290 @assert domain (A) == domain (B)
301291 if isequalminhalf (B. a) && isequalminhalf (B. b)
302- ConversionWrapper (ConcreteConversion (Chebyshev (domain (A)),B)*
303- Conversion (A,Chebyshev (domain (A))))
292+ C = Chebyshev (domain (B))
293+ ConversionWrapper (SpaceOperator (
294+ TimesOperator (ConcreteConversion (C, B), Conversion (A, C)), A, B))
304295 elseif isequalminhalf (B. a - order (A)) && isequalminhalf (B. b - order (A))
305296 ConcreteConversion (A,B)
306297 elseif B. a == B. b == 0
307- ConversionWrapper (
308- SpaceOperator (
309- Conversion (A,Ultraspherical (1 // 2 ,domain (B))),
310- A,B))
298+ ConversionWrapper (SpaceOperator (Conversion (A, Ultraspherical (B)), A, B))
311299 elseif B. a == B. b
312300 US = Ultraspherical (B)
313- ConversionWrapper (ConcreteConversion (US,B)* Conversion (A,US))
301+ ConversionWrapper (SpaceOperator (
302+ TimesOperator (ConcreteConversion (US,B), Conversion (A,US)), A, B))
314303 else
315304 J = Jacobi (A)
316305 Conversion (J,B)* ConcreteConversion (A,J)
317306 end
318307end
319308
309+ @static if VERSION >= v " 1.8"
310+ Base. @constprop :aggressive Conversion (A:: Jacobi , B:: Ultraspherical ) = _Conversion (A, B)
311+ Base. @constprop :aggressive Conversion (A:: Ultraspherical , B:: Jacobi ) = _Conversion (A, B)
312+ else
313+ Conversion (A:: Jacobi , B:: Ultraspherical ) = _Conversion (A, B)
314+ Conversion (A:: Ultraspherical , B:: Jacobi ) = _Conversion (A, B)
315+ end
320316
321317
322318
@@ -420,10 +416,6 @@ function BandedMatrix(S::SubOperator{T,ConcreteConversion{J,US,T},NTuple{2,UnitR
420416 ret
421417end
422418
423-
424- isapproxminhalf (a) = a ≈ - 0.5
425- isapproxminhalf (:: Integer ) = false
426-
427419function union_rule (A:: Jacobi ,B:: Jacobi )
428420 if domainscompatible (A,B)
429421 Jacobi (min (A. b,B. b),min (A. a,B. a),domain (A))
0 commit comments