From 32e0aef4b5c9327270a217119d272b95cb5cdad6 Mon Sep 17 00:00:00 2001 From: Oskar Laverny Date: Wed, 25 Sep 2024 14:18:39 +0200 Subject: [PATCH 1/4] Adding convenient promotions --- src/primitive.jl | 2 ++ src/scalar.jl | 3 +++ 2 files changed, 5 insertions(+) diff --git a/src/primitive.jl b/src/primitive.jl index 0e21b4a..7aa8d13 100644 --- a/src/primitive.jl +++ b/src/primitive.jl @@ -113,6 +113,8 @@ end ex = :($ex; TaylorScalar($([Symbol('v', i) for i in 1:N]...))) return :(@inbounds $ex) end +@inline *(a::TaylorScalar{T1, N}, b::TaylorScalar{T2, N}) where {T1,T2,N} = *(promote(a,b)...) +@inline /(a::TaylorScalar{T1, N}, b::TaylorScalar{T2, N}) where {T1,T2,N} = *(promote(a,b)...) for R in (Integer, Real) @eval @generated function ^(t::TaylorScalar{T, N}, n::S) where {S <: $R, T, N} diff --git a/src/scalar.jl b/src/scalar.jl index ca523fb..16791b5 100644 --- a/src/scalar.jl +++ b/src/scalar.jl @@ -89,6 +89,9 @@ function promote_rule(::Type{TaylorScalar{T, N}}, ::Type{S}) where {T, S, N} TaylorScalar{promote_type(T, S), N} end +function promote_rule(::Type{TaylorScalar{T1, N}}, ::Type{TaylorScalar{T2,N}}) where {T1, T2, N} +TaylorScalar{promote_type(T1,T2), N} +end function (::Type{F})(x::TaylorScalar{T, N}) where {T, N, F <: AbstractFloat} F(primal(x)) From ecf0418ecb2ac5d248d36cbb1c0c244320d446e7 Mon Sep 17 00:00:00 2001 From: Songchen Tan Date: Wed, 25 Sep 2024 14:20:57 +0200 Subject: [PATCH 2/4] Change slicing to tail --- src/primitive.jl | 20 ++++++++++++++++++-- src/scalar.jl | 7 +++---- 2 files changed, 21 insertions(+), 6 deletions(-) diff --git a/src/primitive.jl b/src/primitive.jl index 7aa8d13..17b94a4 100644 --- a/src/primitive.jl +++ b/src/primitive.jl @@ -5,9 +5,21 @@ import Base: asin, acos, atan, acot, asec, acsc, asinh, acosh, atanh, acoth, ase import Base: sinc, cosc import Base: +, -, *, /, \, ^, >, <, >=, <=, == import Base: hypot, max, min +import Base: zero, one, adjoint, conj, transpose + +using Base: tail # Unary +@inline zero(::Type{TaylorScalar{T, N}}) where {T, N} = TaylorScalar{T, N}(zero(T)) +@inline one(::Type{TaylorScalar{T, N}}) where {T, N} = TaylorScalar{T, N}(one(T)) +@inline zero(::TaylorScalar{T, N}) where {T, N} = zero(TaylorScalar{T, N}) +@inline one(::TaylorScalar{T, N}) where {T, N} = one(TaylorScalar{T, N}) + +transpose(t::TaylorScalar) = t +adjoint(t::TaylorScalar) = t +conj(t::TaylorScalar) = t + ## Delegated @inline sqrt(t::TaylorScalar) = t^0.5 @@ -113,8 +125,12 @@ end ex = :($ex; TaylorScalar($([Symbol('v', i) for i in 1:N]...))) return :(@inbounds $ex) end -@inline *(a::TaylorScalar{T1, N}, b::TaylorScalar{T2, N}) where {T1,T2,N} = *(promote(a,b)...) -@inline /(a::TaylorScalar{T1, N}, b::TaylorScalar{T2, N}) where {T1,T2,N} = *(promote(a,b)...) +@inline function *(a::TaylorScalar{T1, N}, b::TaylorScalar{T2, N}) where {T1, T2, N} + *(promote(a, b)...) +end +@inline function /(a::TaylorScalar{T1, N}, b::TaylorScalar{T2, N}) where {T1, T2, N} + *(promote(a, b)...) +end for R in (Integer, Real) @eval @generated function ^(t::TaylorScalar{T, N}, n::S) where {S <: $R, T, N} diff --git a/src/scalar.jl b/src/scalar.jl index 16791b5..8f3814b 100644 --- a/src/scalar.jl +++ b/src/scalar.jl @@ -1,5 +1,3 @@ -import Base: zero, one, adjoint, conj, transpose -import Base: +, -, *, / import Base: convert, promote_rule export TaylorScalar @@ -89,8 +87,9 @@ function promote_rule(::Type{TaylorScalar{T, N}}, ::Type{S}) where {T, S, N} TaylorScalar{promote_type(T, S), N} end -function promote_rule(::Type{TaylorScalar{T1, N}}, ::Type{TaylorScalar{T2,N}}) where {T1, T2, N} -TaylorScalar{promote_type(T1,T2), N} +function promote_rule(::Type{TaylorScalar{T1, N}}, + ::Type{TaylorScalar{T2, N}}) where {T1, T2, N} + TaylorScalar{promote_type(T1, T2), N} end function (::Type{F})(x::TaylorScalar{T, N}) where {T, N, F <: AbstractFloat} From 474bd3c858d29145965e5a6053b39e2ed74b94f3 Mon Sep 17 00:00:00 2001 From: Oskar Laverny Date: Wed, 25 Sep 2024 14:20:57 +0200 Subject: [PATCH 3/4] up --- src/primitive.jl | 22 ++++++++++------------ src/scalar.jl | 2 ++ 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/src/primitive.jl b/src/primitive.jl index 17b94a4..b5b2e6b 100644 --- a/src/primitive.jl +++ b/src/primitive.jl @@ -5,20 +5,18 @@ import Base: asin, acos, atan, acot, asec, acsc, asinh, acosh, atanh, acoth, ase import Base: sinc, cosc import Base: +, -, *, /, \, ^, >, <, >=, <=, == import Base: hypot, max, min -import Base: zero, one, adjoint, conj, transpose - -using Base: tail +import Base: tail # Unary - -@inline zero(::Type{TaylorScalar{T, N}}) where {T, N} = TaylorScalar{T, N}(zero(T)) -@inline one(::Type{TaylorScalar{T, N}}) where {T, N} = TaylorScalar{T, N}(one(T)) -@inline zero(::TaylorScalar{T, N}) where {T, N} = zero(TaylorScalar{T, N}) -@inline one(::TaylorScalar{T, N}) where {T, N} = one(TaylorScalar{T, N}) - -transpose(t::TaylorScalar) = t -adjoint(t::TaylorScalar) = t -conj(t::TaylorScalar) = t +@inline +(a::Number, b::TaylorScalar) = TaylorScalar((a + value(b)[1]), tail(value(b))...) +@inline -(a::Number, b::TaylorScalar) = TaylorScalar((a - value(b)[1]), .-tail(value(b))...) +@inline *(a::Number, b::TaylorScalar) = TaylorScalar((a .* value(b))...) +@inline /(a::Number, b::TaylorScalar) = /(promote(a, b)...) + +@inline +(a::TaylorScalar, b::Number) = TaylorScalar((value(a)[1] + b), tail(value(a))...) +@inline -(a::TaylorScalar, b::Number) = TaylorScalar((value(a)[1] - b), tail(value(a))...) +@inline *(a::TaylorScalar, b::Number) = TaylorScalar((value(a) .* b)...) +@inline /(a::TaylorScalar, b::Number) = TaylorScalar((value(a) ./ b)...) ## Delegated diff --git a/src/scalar.jl b/src/scalar.jl index 8f3814b..1f3413a 100644 --- a/src/scalar.jl +++ b/src/scalar.jl @@ -1,3 +1,5 @@ +import Base: zero, one, adjoint, conj, transpose +import Base: +, -, *, / import Base: convert, promote_rule export TaylorScalar From dd67fd55ab05f1b7874e1a71ee12e04686584ce0 Mon Sep 17 00:00:00 2001 From: Oskar Laverny Date: Wed, 25 Sep 2024 14:23:18 +0200 Subject: [PATCH 4/4] up --- src/primitive.jl | 6 ------ src/scalar.jl | 4 ---- 2 files changed, 10 deletions(-) diff --git a/src/primitive.jl b/src/primitive.jl index b5b2e6b..caff022 100644 --- a/src/primitive.jl +++ b/src/primitive.jl @@ -123,12 +123,6 @@ end ex = :($ex; TaylorScalar($([Symbol('v', i) for i in 1:N]...))) return :(@inbounds $ex) end -@inline function *(a::TaylorScalar{T1, N}, b::TaylorScalar{T2, N}) where {T1, T2, N} - *(promote(a, b)...) -end -@inline function /(a::TaylorScalar{T1, N}, b::TaylorScalar{T2, N}) where {T1, T2, N} - *(promote(a, b)...) -end for R in (Integer, Real) @eval @generated function ^(t::TaylorScalar{T, N}, n::S) where {S <: $R, T, N} diff --git a/src/scalar.jl b/src/scalar.jl index 1f3413a..ca523fb 100644 --- a/src/scalar.jl +++ b/src/scalar.jl @@ -89,10 +89,6 @@ function promote_rule(::Type{TaylorScalar{T, N}}, ::Type{S}) where {T, S, N} TaylorScalar{promote_type(T, S), N} end -function promote_rule(::Type{TaylorScalar{T1, N}}, - ::Type{TaylorScalar{T2, N}}) where {T1, T2, N} - TaylorScalar{promote_type(T1, T2), N} -end function (::Type{F})(x::TaylorScalar{T, N}) where {T, N, F <: AbstractFloat} F(primal(x))