Skip to content

Commit e692640

Browse files
Various fixes (#72)
- Fix intervals in `sqrt` - Fix derivatives for `sigmoid` and `bisigmoid` - Add more `MC` constructors
1 parent 083932a commit e692640

File tree

4 files changed

+20
-5
lines changed

4 files changed

+20
-5
lines changed

Project.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
name = "McCormick"
22
uuid = "53c679d3-6890-5091-8386-c291e8c8aaa1"
33
authors = ["Matthew Wilhelm <[email protected]>"]
4-
version = "0.13.10"
4+
version = "0.13.11"
55

66
[deps]
77
DiffRules = "b552c78f-8df3-52c6-915a-8e097449b14b"

src/McCormick.jl

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -363,6 +363,7 @@ function MC{N,T}(cv::Float64, cc::Float64) where {N, T <: RelaxTag}
363363
MC{N,T}(cv, cc, Interval{Float64}(cv, cc), zero(SVector{N,Float64}),
364364
zero(SVector{N,Float64}), true)
365365
end
366+
MC{N,T}(cv::Q, cc::R) where {N, T <: RelaxTag, Q <: NumberNotRelax, R <: NumberNotRelax} = MC{N,T}(Float64(cv), Float64(cc))
366367

367368
"""
368369
MC{N,T}(cv::Float64, cc::Float64, Intv::Interval{Float64})
@@ -374,6 +375,7 @@ function MC{N,T}(cv::Float64, cc::Float64, Intv::Interval{Float64}) where {N, T
374375
MC{N,T}(cv, cc, Intv, zero(SVector{N,Float64}),
375376
zero(SVector{N,Float64}), true)
376377
end
378+
MC{N,T}(cv::Q, cc::R, Intv::Interval{Float64}) where {N, T <: RelaxTag, Q <: NumberNotRelax, R <: NumberNotRelax} = MC{N,T}(Float64(cv), Float64(cc), Intv)
377379

378380
"""
379381
MC{N,T}(val::Float64, Intv::Interval{Float64}, i::Int64)
@@ -385,6 +387,7 @@ with a nonzero ith dimension of length N.
385387
function MC{N,T}(val::Float64, Intv::Interval{Float64}, i::Int64) where {N, T <: RelaxTag}
386388
MC{N,T}(val, val, Intv, seed_gradient(i, Val{N}()), seed_gradient(i, Val{N}()), false)
387389
end
390+
MC{N,T}(val::Q, Intv::Interval{Float64}, i::Int64) where {N, T <: RelaxTag, Q <: NumberNotRelax} = MC{N,T}(Float64(val), Intv, i)
388391
function MC{N,T}(x::MC{N,T}) where {N, T <: RelaxTag}
389392
MC{N,T}(x.cv, x.cc, x.Intv, x.cv_grad, x.cc_grad, x.cnst)
390393
end

src/forward_operators/activation_functions.jl

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -298,7 +298,13 @@ sigmoid
298298
The `sigmoid` activation function `sigmoid(x) = 1.0/(1.0 + exp(-x))`.
299299
=#
300300
@inline sigmoid(x::Interval{Float64}) = 1.0/(1.0 + exp(-x))
301-
@inline sigmoid_deriv(x::Float64) = exp(-x)/(1.0 + exp(-x))^2
301+
@inline function sigmoid_deriv(x::Float64)
302+
if isinf(exp(-x))
303+
return 0.0
304+
else
305+
return exp(-x)/(1.0 + exp(-x))^2
306+
end
307+
end
302308
@inline sigmoid_deriv2(x::Float64) = -exp(x)*(exp(x) - 1.0)/(exp(x) + 1.0)^3
303309
@inline function sigmoid_env(x::Float64, y::Float64, z::Float64)
304310
(x - y)*sigmoid_deriv(x) - (sigmoid(x) - sigmoid(y))
@@ -338,7 +344,13 @@ The `bisigmoid` activation function `bisigmoid(x) = (1.0 - exp(-x))/(1.0 + exp(-
338344
xUc = (1.0 - exp(-xUintv))/(1.0 + exp(-xUintv))
339345
return Interval(xLc.hi, xUc.hi)
340346
end
341-
@inline bisigmoid_deriv(x::Float64) = 2.0*exp(x)/(exp(x) + 1.0)^2
347+
@inline function bisigmoid_deriv(x::Float64)
348+
if isinf(exp(-x))
349+
return 0.0
350+
else
351+
return 2.0*exp(x)/(exp(x) + 1.0)^2
352+
end
353+
end
342354
@inline function bisigmoid_deriv2(x::Float64)
343355
term1 = exp(-x)/(exp(-x) + 1.0)
344356
term2 = 2.0*exp(-2.0*x)/(exp(-x) + 1.0)^2

src/forward_operators/concave_increasing.jl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -97,14 +97,14 @@ end
9797

9898
@inline function sqrt_kernel(x::MC{N, T}, z::Interval{Float64}) where {N, T<:Union{NS, MV}}
9999
isempty(x) && (return empty(x))
100-
(x.Intv.lo < 0.0 || x.Intv.hi < 0.0) && (return nan(MC{N,T}))
100+
(x.Intv.lo < 0.0 || x.Intv.hi < 0.0) && (return MC{N,T}(NaN, NaN, z, fill(0, SVector{N,Float64}), fill(0, SVector{N,Float64}), x.cnst))
101101
xLc = z.lo
102102
xUc = z.hi
103103
xL = x.Intv.lo
104104
xU = x.Intv.hi
105105
midcc, cc_id = mid3(x.cc, x.cv, xU)
106106
midcv, cv_id = mid3(x.cc, x.cv, xL)
107-
dcv = (xUc > xLc) ? (xUc - xLc)/(xU - xL) : 0.0
107+
dcv = (xUc > xLc && !isinf(xUc)) ? (xUc - xLc)/(xU - xL) : 0.0
108108
convex = dcv*(midcv - xL) + xLc
109109
concave = NaNMath.sqrt(midcc)
110110
concave_grad = mid_grad(x.cc_grad, x.cv_grad, cc_id)*(0.5/NaNMath.sqrt(x.cv))

0 commit comments

Comments
 (0)