From eb865b22deb32f66fd33da42132cda35e84bede3 Mon Sep 17 00:00:00 2001 From: OlivierHnt <38465572+OlivierHnt@users.noreply.github.com> Date: Thu, 10 Oct 2024 14:09:21 -0400 Subject: [PATCH] Extend conversion --- ext/IntervalArithmeticForwardDiffExt.jl | 6 +++++- src/intervals/construction.jl | 4 ++-- src/intervals/exact_literals.jl | 3 --- test/interval_tests/construction.jl | 6 +++--- 4 files changed, 10 insertions(+), 9 deletions(-) diff --git a/ext/IntervalArithmeticForwardDiffExt.jl b/ext/IntervalArithmeticForwardDiffExt.jl index 3ab6c7123..daf9bfbd5 100644 --- a/ext/IntervalArithmeticForwardDiffExt.jl +++ b/ext/IntervalArithmeticForwardDiffExt.jl @@ -1,7 +1,7 @@ module IntervalArithmeticForwardDiffExt using IntervalArithmetic, ForwardDiff -using ForwardDiff: Dual, ≺, value, partials +using ForwardDiff: Dual, Partials, ≺, value, partials # @@ -70,4 +70,8 @@ function Base.:(^)(x::ExactReal, y::Dual{<:Ty}) where {Ty} end end +# resolve ambiguity + +Base.convert(::Type{Dual{T,V,N}}, x::ExactReal) where {T,V,N} = Dual{T}(V(x), zero(Partials{N,V})) + end diff --git a/src/intervals/construction.jl b/src/intervals/construction.jl index 98457093a..b97af7887 100644 --- a/src/intervals/construction.jl +++ b/src/intervals/construction.jl @@ -368,8 +368,8 @@ isguaranteed(x::Complex{<:Interval}) = isguaranteed(real(x)) & isguaranteed(imag isguaranteed(::Number) = false Interval{T}(x::Interval) where {T<:NumTypes} = convert(Interval{T}, x) # needed to resolve method ambiguity -# Interval{T}(x) where {T<:NumTypes} = convert(Interval{T}, x) -# Interval{T}(x::Interval{T}) where {T<:NumTypes} = convert(Interval{T}, x) # needed to resolve method ambiguity +Interval{T}(x::Real) where {T<:NumTypes} = convert(Interval{T}, x) +Interval(x::Real) = convert(Interval{promote_numtype(typeof(x), typeof(x))}, x) # diff --git a/src/intervals/exact_literals.jl b/src/intervals/exact_literals.jl index 08c5dea01..ffc31c274 100644 --- a/src/intervals/exact_literals.jl +++ b/src/intervals/exact_literals.jl @@ -105,9 +105,6 @@ Base.promote_rule(::Type{ExactReal{T}}, ::Type{Interval{S}}) where {T<:Real,S<:N # to Real -# allows Interval{<:NumTypes}(::ExactReal) -(::Type{T})(x::ExactReal) where {T<:Real} = convert(T, x) - Base.convert(::Type{T}, x::ExactReal) where {T<:Real} = convert(T, x.value) Base.promote_rule(::Type{T}, ::Type{ExactReal{S}}) where {T<:Real,S<:Real} = diff --git a/test/interval_tests/construction.jl b/test/interval_tests/construction.jl index 81e882302..e53bcc60c 100644 --- a/test/interval_tests/construction.jl +++ b/test/interval_tests/construction.jl @@ -43,8 +43,8 @@ end @test_throws MethodError BareInterval(1, 2) @test_throws MethodError BareInterval{Float64}(1, 2) - @test_throws MethodError Interval(1) - @test_throws MethodError Interval{Float64}(1) + @test !isguaranteed(Interval(1)) + @test !isguaranteed(Interval{Float64}(1)) @test_throws MethodError Interval(1, 2) @test_throws MethodError Interval{Float64}(1, 2) @@ -163,7 +163,7 @@ end i = interval(IS.Interval(0.1, 2)) @test isequal_interval(i, interval(0.1, 2.)) && !isguaranteed(i) @test interval(Float64, IS.Interval(0.1, 2)) === i - + i = interval(IS.iv"[0.1, Inf)") @test isequal_interval(i, interval(0.1, Inf)) && !isguaranteed(i) @test interval(IS.iv"[0.1, Inf]") === nai(Float64)