Skip to content

Commit f07a309

Browse files
authored
remove Base function imports (#105)
1 parent 691b4cf commit f07a309

File tree

2 files changed

+43
-49
lines changed

2 files changed

+43
-49
lines changed

src/Quaternion.jl

Lines changed: 42 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -20,37 +20,37 @@ Quaternion(z::Complex) = Quaternion(z.re, z.im, zero(z.re), zero(z.re), abs(z) =
2020
Quaternion(s::Real, a::AbstractVector) = Quaternion(s, a[1], a[2], a[3])
2121
Quaternion(a::AbstractVector) = Quaternion(0, a[1], a[2], a[3])
2222

23-
promote_rule(::Type{Quaternion{T}}, ::Type{S}) where {T <: Real, S <: Real} = Quaternion{promote_type(T, S)}
24-
promote_rule(::Type{Quaternion{T}}, ::Type{Complex{S}}) where {T <: Real, S <: Real} = Quaternion{promote_type(T, S)}
25-
promote_rule(::Type{Quaternion{T}}, ::Type{Quaternion{S}}) where {T <: Real, S <: Real} = Quaternion{promote_type(T, S)}
23+
Base.promote_rule(::Type{Quaternion{T}}, ::Type{S}) where {T <: Real, S <: Real} = Quaternion{promote_type(T, S)}
24+
Base.promote_rule(::Type{Quaternion{T}}, ::Type{Complex{S}}) where {T <: Real, S <: Real} = Quaternion{promote_type(T, S)}
25+
Base.promote_rule(::Type{Quaternion{T}}, ::Type{Quaternion{S}}) where {T <: Real, S <: Real} = Quaternion{promote_type(T, S)}
2626

2727
quat(p, v1, v2, v3) = Quaternion(p, v1, v2, v3)
2828
quat(p, v1, v2, v3, n) = Quaternion(p, v1, v2, v3, n)
2929
quat(x) = Quaternion(x)
3030
quat(s, a) = Quaternion(s, a)
3131

32-
real(::Type{Quaternion{T}}) where {T} = T
33-
real(q::Quaternion) = q.s
32+
Base.real(::Type{Quaternion{T}}) where {T} = T
33+
Base.real(q::Quaternion) = q.s
3434
imag_part(q::Quaternion) = (q.v1, q.v2, q.v3)
3535

36-
(/)(q::Quaternion, x::Real) = Quaternion(q.s / x, q.v1 / x, q.v2 / x, q.v3 / x)
37-
(*)(q::Quaternion, x::Real) = Quaternion(q.s * x, q.v1 * x, q.v2 * x, q.v3 * x)
38-
(*)(x::Real, q::Quaternion) = q * x
36+
Base.:/(q::Quaternion, x::Real) = Quaternion(q.s / x, q.v1 / x, q.v2 / x, q.v3 / x)
37+
Base.:*(q::Quaternion, x::Real) = Quaternion(q.s * x, q.v1 * x, q.v2 * x, q.v3 * x)
38+
Base.:*(x::Real, q::Quaternion) = q * x
3939

40-
conj(q::Quaternion) = Quaternion(q.s, -q.v1, -q.v2, -q.v3, q.norm)
41-
abs(q::Quaternion) = sqrt(abs2(q))
42-
float(q::Quaternion{T}) where T = convert(Quaternion{float(T)}, q)
40+
Base.conj(q::Quaternion) = Quaternion(q.s, -q.v1, -q.v2, -q.v3, q.norm)
41+
Base.abs(q::Quaternion) = sqrt(abs2(q))
42+
Base.float(q::Quaternion{T}) where T = convert(Quaternion{float(T)}, q)
4343
abs_imag(q::Quaternion) = sqrt(q.v2 * q.v2 + (q.v1 * q.v1 + q.v3 * q.v3)) # ordered to match abs2
44-
abs2(q::Quaternion) = (q.s * q.s + q.v2 * q.v2) + (q.v1 * q.v1 + q.v3 * q.v3)
45-
inv(q::Quaternion) = q.norm ? conj(q) : conj(q) / abs2(q)
44+
Base.abs2(q::Quaternion) = (q.s * q.s + q.v2 * q.v2) + (q.v1 * q.v1 + q.v3 * q.v3)
45+
Base.inv(q::Quaternion) = q.norm ? conj(q) : conj(q) / abs2(q)
4646

47-
isreal(q::Quaternion) = iszero(q.v1) & iszero(q.v2) & iszero(q.v3)
48-
isfinite(q::Quaternion) = q.norm | (isfinite(q.s) & isfinite(q.v1) & isfinite(q.v2) & isfinite(q.v3))
49-
iszero(q::Quaternion) = ~q.norm & iszero(real(q)) & iszero(q.v1) & iszero(q.v2) & iszero(q.v3)
50-
isnan(q::Quaternion) = isnan(real(q)) | isnan(q.v1) | isnan(q.v2) | isnan(q.v3)
51-
isinf(q::Quaternion) = ~q.norm & (isinf(q.s) | isinf(q.v1) | isinf(q.v2) | isinf(q.v3))
47+
Base.isreal(q::Quaternion) = iszero(q.v1) & iszero(q.v2) & iszero(q.v3)
48+
Base.isfinite(q::Quaternion) = q.norm | (isfinite(q.s) & isfinite(q.v1) & isfinite(q.v2) & isfinite(q.v3))
49+
Base.iszero(q::Quaternion) = ~q.norm & iszero(real(q)) & iszero(q.v1) & iszero(q.v2) & iszero(q.v3)
50+
Base.isnan(q::Quaternion) = isnan(real(q)) | isnan(q.v1) | isnan(q.v2) | isnan(q.v3)
51+
Base.isinf(q::Quaternion) = ~q.norm & (isinf(q.s) | isinf(q.v1) | isinf(q.v2) | isinf(q.v3))
5252

53-
function normalize(q::Quaternion)
53+
function LinearAlgebra.normalize(q::Quaternion)
5454
if (q.norm)
5555
return q
5656
end
@@ -77,29 +77,29 @@ function normalizeq(q::Quaternion)
7777
end
7878
end
7979

80-
(-)(q::Quaternion) = Quaternion(-q.s, -q.v1, -q.v2, -q.v3, q.norm)
80+
Base.:-(q::Quaternion) = Quaternion(-q.s, -q.v1, -q.v2, -q.v3, q.norm)
8181

82-
(+)(q::Quaternion, w::Quaternion) =
82+
Base.:+(q::Quaternion, w::Quaternion) =
8383
Quaternion(q.s + w.s, q.v1 + w.v1, q.v2 + w.v2, q.v3 + w.v3)
8484

85-
(-)(q::Quaternion, w::Quaternion) =
85+
Base.:-(q::Quaternion, w::Quaternion) =
8686
Quaternion(q.s - w.s, q.v1 - w.v1, q.v2 - w.v2, q.v3 - w.v3)
8787

88-
function (*)(q::Quaternion, w::Quaternion)
88+
function Base.:*(q::Quaternion, w::Quaternion)
8989
s = (q.s * w.s - q.v2 * w.v2) - (q.v1 * w.v1 + q.v3 * w.v3)
9090
v1 = (q.s * w.v1 + q.v1 * w.s) + (q.v2 * w.v3 - q.v3 * w.v2)
9191
v2 = (q.s * w.v2 + q.v2 * w.s) + (q.v3 * w.v1 - q.v1 * w.v3)
9292
v3 = (q.s * w.v3 + q.v3 * w.s) + (q.v1 * w.v2 - q.v2 * w.v1)
9393
return Quaternion(s, v1, v2, v3, q.norm & w.norm)
9494
end
9595

96-
(/)(q::Quaternion, w::Quaternion) = q * inv(w)
96+
Base.:/(q::Quaternion, w::Quaternion) = q * inv(w)
9797

98-
(==)(q::Quaternion, w::Quaternion) = (q.s == w.s) & (q.v1 == w.v1) & (q.v2 == w.v2) & (q.v3 == w.v3) # ignore .norm field
98+
Base.:(==)(q::Quaternion, w::Quaternion) = (q.s == w.s) & (q.v1 == w.v1) & (q.v2 == w.v2) & (q.v3 == w.v3) # ignore .norm field
9999

100100
angleaxis(q::Quaternion) = angle(q), axis(q)
101101

102-
angle(q::Quaternion) = 2 * atan(abs_imag(q), real(q))
102+
Base.angle(q::Quaternion) = 2 * atan(abs_imag(q), real(q))
103103

104104
function axis(q::Quaternion)
105105
q = normalize(q)
@@ -187,24 +187,24 @@ for f in (@static(VERSION ≥ v"1.6" ? (:sincos, :sincospi) : (:sincos,)))
187187
end
188188
end
189189

190-
function log(q::Quaternion)
190+
function Base.log(q::Quaternion)
191191
a = abs(q)
192192
M = abs_imag(q)
193193
theta = atan(M, q.s)
194194
scale = theta / ifelse(iszero(M), oneunit(M), M)
195195
return Quaternion(log(a), q.v1 * scale, q.v2 * scale, q.v3 * scale)
196196
end
197197

198-
(^)(q::Quaternion, w::Quaternion) = exp(w * log(q))
198+
Base.:^(q::Quaternion, w::Quaternion) = exp(w * log(q))
199199

200200
quatrand(rng = Random.GLOBAL_RNG) = quat(randn(rng), randn(rng), randn(rng), randn(rng))
201201
nquatrand(rng = Random.GLOBAL_RNG) = normalize(quatrand(rng))
202202

203-
function rand(rng::AbstractRNG, ::Random.SamplerType{Quaternion{T}}) where {T<:Real}
203+
function Base.rand(rng::AbstractRNG, ::Random.SamplerType{Quaternion{T}}) where {T<:Real}
204204
Quaternion{T}(rand(rng, T), rand(rng, T), rand(rng, T), rand(rng, T), false)
205205
end
206206

207-
function randn(rng::AbstractRNG, ::Type{Quaternion{T}}) where {T<:AbstractFloat}
207+
function Base.randn(rng::AbstractRNG, ::Type{Quaternion{T}}) where {T<:AbstractFloat}
208208
Quaternion{T}(
209209
randn(rng, T) * 1//2,
210210
randn(rng, T) * 1//2,
@@ -322,7 +322,7 @@ function slerp(qa::Quaternion{Ta}, qb::Quaternion{Tb}, t::T) where {Ta, Tb, T}
322322
return slerp(Quaternion{S}(qa),Quaternion{S}(qb),S(t))
323323
end
324324

325-
function sylvester(a::Quaternion{T}, b::Quaternion{T}, c::Quaternion{T}) where {T<:Real}
325+
function LinearAlgebra.sylvester(a::Quaternion{T}, b::Quaternion{T}, c::Quaternion{T}) where {T<:Real}
326326
isreal(a) && return sylvester(real(a), b, c)
327327
isreal(b) && return sylvester(a, real(b), c)
328328
abs2a = abs2(a)
@@ -338,21 +338,21 @@ function sylvester(a::Quaternion{T}, b::Quaternion{T}, c::Quaternion{T}) where {
338338
end
339339
return x
340340
end
341-
sylvester(a::Quaternion, b::Quaternion, c::Quaternion) = sylvester(promote(a, b, c)...)
342-
sylvester(a::Quaternion, b::Quaternion, c::Real) = sylvester(promote(a, b, c)...)
341+
LinearAlgebra.sylvester(a::Quaternion, b::Quaternion, c::Quaternion) = sylvester(promote(a, b, c)...)
342+
LinearAlgebra.sylvester(a::Quaternion, b::Quaternion, c::Real) = sylvester(promote(a, b, c)...)
343343
# if either a or b commute with x, use a simpler expression
344-
sylvester(a::Real, b::Real, c::Quaternion) = c / -(a + b)
345-
sylvester(a::Real, b::Quaternion, c::Quaternion) = c / -(a + b)
346-
sylvester(a::Quaternion, b::Real, c::Quaternion) = -(a + b) \ c
347-
sylvester(a::Real, b::Quaternion, c::Real) = -c / (a + b)
348-
sylvester(a::Quaternion, b::Real, c::Real) = (a + b) \ -c
344+
LinearAlgebra.sylvester(a::Real, b::Real, c::Quaternion) = c / -(a + b)
345+
LinearAlgebra.sylvester(a::Real, b::Quaternion, c::Quaternion) = c / -(a + b)
346+
LinearAlgebra.sylvester(a::Quaternion, b::Real, c::Quaternion) = -(a + b) \ c
347+
LinearAlgebra.sylvester(a::Real, b::Quaternion, c::Real) = -c / (a + b)
348+
LinearAlgebra.sylvester(a::Quaternion, b::Real, c::Real) = (a + b) \ -c
349349

350-
function lyap(a::Quaternion{T}, c::Quaternion{T}) where {T<:Real}
350+
function LinearAlgebra.lyap(a::Quaternion{T}, c::Quaternion{T}) where {T<:Real}
351351
# if a commutes with c, use a simpler expression
352352
(isreal(a) || isreal(c)) && return c / -2real(a)
353353
return (c + a \ c * a) / -4real(a)
354354
end
355-
lyap(a::Quaternion, c::Quaternion) = lyap(promote(a, c)...)
355+
LinearAlgebra.lyap(a::Quaternion, c::Quaternion) = lyap(promote(a, c)...)
356356
# if a commutes with c, use a simpler expression
357-
lyap(a::Real, c::Quaternion) = c / -2a
358-
lyap(a::Quaternion, c::Real) = c / -2real(a)
357+
LinearAlgebra.lyap(a::Real, c::Quaternion) = c / -2a
358+
LinearAlgebra.lyap(a::Quaternion, c::Real) = c / -2real(a)

src/Quaternions.jl

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,8 @@ __precompile__()
22

33
module Quaternions
44

5-
import Base: +, -, *, /, ^, ==
6-
import Base: abs, abs2, angle, conj, cos, exp, inv, isreal, isfinite, isinf, iszero, isnan, log, real, sin, sqrt
7-
import Base: convert, promote_rule, float
8-
import Base: rand, randn
9-
import LinearAlgebra: lyap, norm, normalize, sylvester
10-
using LinearAlgebra: cross, dot
115
using Random
12-
6+
using LinearAlgebra
137

148
include("Quaternion.jl")
159

0 commit comments

Comments
 (0)