@@ -503,6 +503,8 @@ function maxspace_rule(a::NormalizedPolynomialSpace, b::NormalizedPolynomialSpac
503503 S isa NoSpace ? S : NormalizedPolynomialSpace (S)
504504end
505505
506+ # Conversion
507+
506508bandwidths (C:: ConcreteConversion{NormalizedPolynomialSpace{S,D,R},S} ) where {S,D,R} = (0 , 0 )
507509bandwidths (C:: ConcreteConversion{S,NormalizedPolynomialSpace{S,D,R}} ) where {S,D,R} = (0 , 0 )
508510
@@ -538,6 +540,26 @@ function getindex(C::ConcreteConversion{S,NormalizedPolynomialSpace{S,D,R},T},k:
538540 end
539541end
540542
543+ # this is only evaluated if FillArrays >= v1 is used
544+ @static if isdefined (FillArrays, :OneElement )
545+ # # Special OneElement conversion
546+ function _mul_coefficients_concreteconv (C, v)
547+ Base. require_one_based_indexing (v)
548+ nzind = v. ind[1 ]
549+ Cnzind = C[nzind, nzind]
550+ OneElement (Cnzind * v. val, v. ind, axes (v))
551+ end
552+ function mul_coefficients (C:: ConcreteConversion{<:NormalizedPolynomialSpace{S}, S} ,
553+ v:: OneElement{<:Any,1} ) where {S<: PolynomialSpace }
554+ _mul_coefficients_concreteconv (C, v)
555+ end
556+ function mul_coefficients (C:: ConcreteConversion{S, <:NormalizedPolynomialSpace{S}} ,
557+ v:: OneElement{<:Any,1} ) where {S<: PolynomialSpace }
558+ _mul_coefficients_concreteconv (C, v)
559+ end
560+ end
561+
562+ # Evaluation
541563function getindex (op:: ConcreteEvaluation{<:NormalizedPolynomialSpace} , k:: Integer )
542564 S = domainspace (op)
543565 ec = Evaluation (canonicalspace (S), op. x, op. order)[k]
@@ -610,3 +632,12 @@ ApproxFunBase.hasconcreteconversion_canonical(
610632
611633rangespace (M:: MultiplicationWrapper {<: PolynomialSpace ,
612634 <: NormalizedPolynomialSpace }) = domainspace (M)
635+
636+ # evaluation in a normalized space may use the fact that the conversion is concrete
637+ # this improves type-inference, and hence performance
638+ function evaluate (f:: AbstractVector , S:: NormalizedPolynomialSpace , x... )
639+ csp = canonicalspace (S)
640+ C = Conversion_normalizedspace (csp, Val (:backward ))
641+ f_csp = mul_coefficients (C, f)
642+ evaluate (f_csp, csp, x... )
643+ end
0 commit comments