Skip to content

Commit 67d0cad

Browse files
authored
Move DualNumbers to an extension (JuliaApproximation#888)
* Move DualNumbers to an extension * only define dualcfsFun in ApproxFun * fix path
1 parent ad974a1 commit 67d0cad

File tree

4 files changed

+37
-13
lines changed

4 files changed

+37
-13
lines changed

Project.toml

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,13 +42,20 @@ SpecialFunctions = "1.1, 2"
4242
StaticArrays = "1"
4343
julia = "1.6"
4444

45+
[extensions]
46+
ApproxFunDualNumbersExt = "DualNumbers"
47+
4548
[extras]
4649
ApproxFunBaseTest = "a931bfaf-0cfd-4a5c-b69c-bf2eed002b43"
4750
Aqua = "4c88cf16-eb10-579e-8560-4a9242c79595"
4851
BlockBandedMatrices = "ffab5731-97b5-5995-9138-79e8c1846df0"
4952
Documenter = "e30172f5-a6a5-5a46-863b-614d45cd2de4"
53+
DualNumbers = "fa6b7ba4-c1ee-5f82-b5fc-ecf0adba8f74"
5054
Random = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c"
5155
Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40"
5256

5357
[targets]
54-
test = ["ApproxFunBaseTest", "Aqua", "BlockBandedMatrices", "Documenter", "Random", "Test"]
58+
test = ["ApproxFunBaseTest", "Aqua", "BlockBandedMatrices", "Documenter", "DualNumbers", "Random", "Test"]
59+
60+
[weakdeps]
61+
DualNumbers = "fa6b7ba4-c1ee-5f82-b5fc-ecf0adba8f74"

src/Extras/dualnumbers.jl renamed to ext/ApproxFunDualNumbersExt.jl

Lines changed: 23 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,24 @@
1+
module ApproxFunDualNumbersExt
2+
3+
using DualNumbers
4+
using ApproxFun
5+
using ApproxFun: TransformPlan, ITransformPlan
6+
import ApproxFunBase: valsdomain_type_promote
7+
using DomainSets
8+
import FastTransforms: ChebyshevTransformPlan, plan_chebyshevtransform,
9+
plan_chebyshevtransform!, plan_ichebyshevtransform,
10+
plan_ichebyshevtransform!
11+
112
# Dual number support. Should there be realpart and dualpart of Space and Domain?
213
DualNumbers.realpart(f::Fun{S,T}) where {S,T<:Dual} = Fun(space(f),realpart.(coefficients(f)))
314
DualNumbers.dualpart(f::Fun{S,T}) where {S,T<:Dual} = Fun(space(f),dualpart.(coefficients(f)))
415

516

617
DualNumbers.realpart(d::Segment{<:Dual}) = Segment(realpart(leftendpoint(d)),realpart(rightendpoint(d)))
718

8-
indomain(x::Number, d::Segment{<:Dual}) = in(x,realpart(d))
9-
indomain(x::Dual, d::Segment{<:Dual}) = in(realpart(x),realpart(d))
10-
isempty(d::Segment{<:Dual}) = isempty(realpart(d))
19+
DomainSets.indomain(x::Number, d::Segment{<:Dual}) = in(x,realpart(d))
20+
DomainSets.indomain(x::Dual, d::Segment{<:Dual}) = in(realpart(x),realpart(d))
21+
Base.isempty(d::Segment{<:Dual}) = isempty(realpart(d))
1122

1223

1324

@@ -33,22 +44,22 @@ plan_ichebyshevtransform(v::AbstractVector{D}, ::Val{kind}) where {D<:Dual,kind}
3344

3445

3546

36-
*(P::ChebyshevTransformPlan,v::AbstractVector{<:Dual}) = dual.(P*realpart.(v),P*dualpart.(v))
47+
Base.:(*)(P::ChebyshevTransformPlan,v::AbstractVector{<:Dual}) = dual.(P*realpart.(v),P*dualpart.(v))
3748

3849
#TODO: Hardy{false}
3950
for (OP,TransPlan) in ((:plan_transform,:TransformPlan),(:plan_itransform,:ITransformPlan)),
4051
TYP in (:Fourier,:Laurent,:SinSpace)
4152
@eval begin
42-
function $OP(sp::$TYP{D},x::AbstractVector{T}) where {T<:Dual,D<:Domain}
53+
function ApproxFun.$OP(sp::$TYP{D},x::AbstractVector{T}) where {T<:Dual,D<:Domain}
4354
plan = $OP(sp,realpart.(x))
4455
$TransPlan{T,typeof(sp),false,typeof(plan)}(sp,plan)
4556
end
46-
*(P::$TransPlan{T,$TYP{D},false},x::AbstractVector{T}) where {T<:Dual,D<:Domain} =
57+
Base.:(*)(P::$TransPlan{T,$TYP{D},false},x::AbstractVector{T}) where {T<:Dual,D<:Domain} =
4758
dual(P.plan*realpart.(x),P.plan*dualpart.(x))
4859
end
4960
end
5061

51-
chop!(f::Fun,d::Dual)=chop!(f,realpart(d))
62+
ApproxFun.chop!(f::Fun,d::Dual)=chop!(f,realpart(d))
5263

5364

5465

@@ -62,12 +73,12 @@ function simplifycfs!(cfs::AbstractVector{DD},tol::Float64=4E-16) where DD<:Dual
6273
end
6374

6475

65-
function dualFun(f,S,n)
76+
function ApproxFun.dualFun(f,S,n)
6677
pts=points(S,n) + Dual{Float64}[dual(0.,rand(Bool)) for k=1:n]
6778
Fun(transform(S,map(f,pts)),S)
6879
end
6980

70-
function dualcfsFun(f,S)
81+
function ApproxFun.dualcfsFun(f,S)
7182
T = real(float(eltype(domain(S))))
7283
r=checkpoints(S)
7384
f0=f(first(r))
@@ -84,7 +95,7 @@ function dualcfsFun(f,S)
8495
for logn = 4:20
8596
n=2^logn
8697

87-
cf=dualFun(f,S,n)
98+
cf = dualFun(f,S,n)
8899

89100
if maximum(abs,realpart(cf.coefficients[end-8:end]))<maximum(abs,dualpart(cf.coefficients[end-8:end]))*tol &&
90101
all(k->norm(cf(r[k])-fr[k],1)<1E-4,1:length(r))
@@ -95,3 +106,5 @@ function dualcfsFun(f,S)
95106

96107
Fun(f,S,2^21)
97108
end
109+
110+
end

src/ApproxFun.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
module ApproxFun
22
using Base, Reexport,
3-
AbstractFFTs, FFTW, DualNumbers, FastTransforms,
3+
AbstractFFTs, FFTW, FastTransforms,
44
LinearAlgebra, RecipesBase, DomainSets, SpecialFunctions #, Arpack
55

66
import Calculus

src/Extras/Extras.jl

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,10 @@ include("simplify.jl")
2020
include("autodifferentiation.jl")
2121
include("fractional.jl")
2222

23+
function dualFun end
24+
function dualcfsFun end
2325

24-
include("dualnumbers.jl")
26+
if !isdefined(Base, :get_extension)
27+
include(joinpath(dirname(dirname(pathof(@__MODULE__))), "ext", "ApproxFunDualNumbersExt.jl"))
28+
end
2529
include("lanczos.jl")

0 commit comments

Comments
 (0)