@@ -8,15 +8,15 @@ import Base: hypot, max, min
88import Base: tail
99
1010# Unary
11- @inline + (a:: Number , b:: TaylorScalar ) = TaylorScalar (( a + value (b)[ 1 ]), tail ( value (b)) ... )
12- @inline - (a:: Number , b:: TaylorScalar ) = TaylorScalar (( a - value (b)[ 1 ]), .- tail ( value ( b))... )
13- @inline * (a:: Number , b:: TaylorScalar ) = TaylorScalar ((a . * value (b)) . .. )
11+ @inline + (a:: Number , b:: TaylorScalar ) = TaylorScalar (a + value (b), partials (b) )
12+ @inline - (a:: Number , b:: TaylorScalar ) = TaylorScalar (a - value (b), map ( - , partials ( b)))
13+ @inline * (a:: Number , b:: TaylorScalar ) = TaylorScalar (a * value (b), a .* partials (b) )
1414@inline / (a:: Number , b:: TaylorScalar ) = / (promote (a, b)... )
1515
16- @inline + (a:: TaylorScalar , b:: Number ) = TaylorScalar (( value (a)[ 1 ] + b), tail ( value (a)) ... )
17- @inline - (a:: TaylorScalar , b:: Number ) = TaylorScalar (( value (a)[ 1 ] - b), tail ( value (a)) ... )
18- @inline * (a:: TaylorScalar , b:: Number ) = TaylorScalar (( value (a) . * b) . .. )
19- @inline / (a:: TaylorScalar , b:: Number ) = TaylorScalar (( value (a) . / b) . .. )
16+ @inline + (a:: TaylorScalar , b:: Number ) = TaylorScalar (value (a) + b, partials (a) )
17+ @inline - (a:: TaylorScalar , b:: Number ) = TaylorScalar (value (a) - b, partials (a) )
18+ @inline * (a:: TaylorScalar , b:: Number ) = TaylorScalar (value (a) * b, partials (a) .* b )
19+ @inline / (a:: TaylorScalar , b:: Number ) = TaylorScalar (value (a) / b, partials (a) ./ b )
2020
2121# # Delegated
2222
@@ -27,10 +27,10 @@ import Base: tail
2727for func in (:exp , :expm1 , :exp2 , :exp10 )
2828 @eval @generated function $func (t:: TaylorScalar{T, N} ) where {T, N}
2929 ex = quote
30- v = value (t)
30+ v = flatten (t)
3131 v1 = $ ($ (QuoteNode (func)) == :expm1 ? :(exp (v[1 ])) : :($$ func (v[1 ])))
3232 end
33- for i in 2 : N
33+ for i in 2 : (N + 1 )
3434 ex = quote
3535 $ ex
3636 $ (Symbol (' v' , i)) = + ($ ([:($ (binomial (i - 2 , j - 1 )) * $ (Symbol (' v' , j)) *
@@ -46,19 +46,19 @@ for func in (:exp, :expm1, :exp2, :exp10)
4646 if $ (QuoteNode (func)) == :expm1
4747 ex = :($ ex; v1 = expm1 (v[1 ]))
4848 end
49- ex = :($ ex; TaylorScalar {T, N} (tuple ($ ([Symbol (' v' , i) for i in 1 : N ]. .. ))))
49+ ex = :($ ex; TaylorScalar (tuple ($ ([Symbol (' v' , i) for i in 1 : (N + 1 ) ]. .. ))))
5050 return :(@inbounds $ ex)
5151 end
5252end
5353
5454for func in (:sin , :cos )
5555 @eval @generated function $func (t:: TaylorScalar{T, N} ) where {T, N}
5656 ex = quote
57- v = value (t)
57+ v = flatten (t)
5858 s1 = sin (v[1 ])
5959 c1 = cos (v[1 ])
6060 end
61- for i in 2 : N
61+ for i in 2 : (N + 1 )
6262 ex = :($ ex;
6363 $ (Symbol (' s' , i)) = + ($ ([:($ (binomial (i - 2 , j - 1 )) *
6464 $ (Symbol (' c' , j)) *
@@ -69,9 +69,9 @@ for func in (:sin, :cos)
6969 v[$ (i + 1 - j)]) for j in 1 : (i - 1 )]. .. )))
7070 end
7171 if $ (QuoteNode (func)) == :sin
72- ex = :($ ex; TaylorScalar ($ ([Symbol (' s' , i) for i in 1 : N ]. .. )))
72+ ex = :($ ex; TaylorScalar (tuple ( $ ([Symbol (' s' , i) for i in 1 : (N + 1 ) ]. .. ) )))
7373 else
74- ex = :($ ex; TaylorScalar ($ ([Symbol (' c' , i) for i in 1 : N ]. .. )))
74+ ex = :($ ex; TaylorScalar (tuple ( $ ([Symbol (' c' , i) for i in 1 : (N + 1 ) ]. .. ) )))
7575 end
7676 return quote
7777 @inbounds $ ex
@@ -94,24 +94,27 @@ for op in [:>, :<, :(==), :(>=), :(<=)]
9494 @eval @inline $ op (a:: TaylorScalar , b:: TaylorScalar ) = $ op (value (a)[1 ], value (b)[1 ])
9595end
9696
97- @inline + (a:: TaylorScalar , b:: TaylorScalar ) = TaylorScalar (map (+ , value (a), value (b)))
98- @inline - (a:: TaylorScalar , b:: TaylorScalar ) = TaylorScalar (map (- , value (a), value (b)))
97+ @inline + (a:: TaylorScalar , b:: TaylorScalar ) = TaylorScalar (
98+ value (a) + value (b), map (+ , partials (a), partials (b)))
99+ @inline - (a:: TaylorScalar , b:: TaylorScalar ) = TaylorScalar (
100+ value (a) - value (b), map (- , partials (a), partials (b)))
99101
100102@generated function * (a:: TaylorScalar{T, N} , b:: TaylorScalar{T, N} ) where {T, N}
101103 return quote
102- va, vb = value (a), value (b)
103- @inbounds TaylorScalar ($ ([:(+ ($ ([:($ (binomial (i - 1 , j - 1 )) * va[$ j] *
104- vb[$ (i + 1 - j)]) for j in 1 : i]. .. )))
105- for i in 1 : N]. .. ))
104+ va, vb = flatten (a), flatten (b)
105+ r = tuple ($ ([:(+ ($ ([:($ (binomial (i - 1 , j - 1 )) * va[$ j] *
106+ vb[$ (i + 1 - j)]) for j in 1 : i]. .. )))
107+ for i in 1 : (N + 1 )]. .. ))
108+ @inbounds TaylorScalar (r[1 ], r[2 : end ])
106109 end
107110end
108111
109112@generated function / (a:: TaylorScalar{T, N} , b:: TaylorScalar{T, N} ) where {T, N}
110113 ex = quote
111- va, vb = value (a), value (b)
114+ va, vb = flatten (a), flatten (b)
112115 v1 = va[1 ] / vb[1 ]
113116 end
114- for i in 2 : N
117+ for i in 2 : (N + 1 )
115118 ex = quote
116119 $ ex
117120 $ (Symbol (' v' , i)) = (va[$ i] -
@@ -120,24 +123,28 @@ end
120123 for j in 1 : (i - 1 )]. .. ))) / vb[1 ]
121124 end
122125 end
123- ex = :($ ex; TaylorScalar ($ ([Symbol (' v' , i) for i in 1 : N]. .. )))
126+ ex = quote
127+ $ ex
128+ v = tuple ($ ([Symbol (' v' , i) for i in 1 : (N + 1 )]. .. ))
129+ TaylorScalar (v)
130+ end
124131 return :(@inbounds $ ex)
125132end
126133
127134for R in (Integer, Real)
128135 @eval @generated function ^ (t:: TaylorScalar{T, N} , n:: S ) where {S <: $R , T, N}
129136 ex = quote
130- v = value (t)
137+ v = flatten (t)
131138 w11 = 1
132139 u1 = ^ (v[1 ], n)
133140 end
134- for k in 1 : N
141+ for k in 1 : (N + 1 )
135142 ex = quote
136143 $ ex
137144 $ (Symbol (' p' , k)) = ^ (v[1 ], n - $ (k - 1 ))
138145 end
139146 end
140- for i in 2 : N
147+ for i in 2 : (N + 1 )
141148 subex = quote
142149 $ (Symbol (' w' , i, 1 )) = 0
143150 end
@@ -158,7 +165,11 @@ for R in (Integer, Real)
158165 for k in 2 : i]. .. ))
159166 end
160167 end
161- ex = :($ ex; TaylorScalar ($ ([Symbol (' u' , i) for i in 1 : N]. .. )))
168+ ex = quote
169+ $ ex
170+ v = tuple ($ ([Symbol (' u' , i) for i in 1 : (N + 1 )]. .. ))
171+ TaylorScalar (v)
172+ end
162173 return :(@inbounds $ ex)
163174 end
164175 @eval function ^ (a:: S , t:: TaylorScalar{T, N} ) where {S <: $R , T, N}
@@ -172,11 +183,11 @@ end
172183 t:: TaylorScalar{T, N} ) where {T, M, N} # M + 1 == N
173184 return quote
174185 $ (Expr (:meta , :inline ))
175- vdf, vt = value (df), value (t)
176- @inbounds TaylorScalar (f,
177- $ ([:( + ( $ ([:( $ ( binomial (i - 1 , j - 1 )) * vdf[ $ j] *
178- vt[ $ (i + 2 - j)]) for j in 1 : i ]. .. ) ))
179- for i in 1 : M] . .. ) )
186+ vdf, vt = flatten (df), flatten (t)
187+ partials = tuple ( $ ([:( + ( $ ([:( $ ( binomial (i - 1 , j - 1 )) * vdf[ $ j] *
188+ vt[ $ (i + 2 - j)]) for j in 1 : i] . .. )))
189+ for i in 1 : (M + 1 ) ]. .. ))
190+ @inbounds TaylorScalar (f, partials )
180191 end
181192end
182193
@@ -185,10 +196,10 @@ raise(::T, df::S, t::TaylorScalar{T, N}) where {S <: Number, T, N} = df * t
185196@generated function raiseinv (f:: T , df:: TaylorScalar{T, M} ,
186197 t:: TaylorScalar{T, N} ) where {T, M, N} # M + 1 == N
187198 ex = quote
188- vdf, vt = value (df), value (t)
199+ vdf, vt = flatten (df), flatten (t)
189200 v1 = vt[2 ] / vdf[1 ]
190201 end
191- for i in 2 : M
202+ for i in 2 : (M + 1 )
192203 ex = quote
193204 $ ex
194205 $ (Symbol (' v' , i)) = (vt[$ (i + 1 )] -
@@ -197,6 +208,10 @@ raise(::T, df::S, t::TaylorScalar{T, N}) where {S <: Number, T, N} = df * t
197208 for j in 1 : (i - 1 )]. .. ))) / vdf[1 ]
198209 end
199210 end
200- ex = :($ ex; TaylorScalar (f, $ ([Symbol (' v' , i) for i in 1 : M]. .. )))
211+ ex = quote
212+ $ ex
213+ v = tuple ($ ([Symbol (' v' , i) for i in 1 : (M + 1 )]. .. ))
214+ TaylorScalar (f, v)
215+ end
201216 return :(@inbounds $ ex)
202217end
0 commit comments