Skip to content

Commit 76335e6

Browse files
authored
Forbid offsets (#586)
* no offsets * ... and no piracy * import from Base
1 parent 60a6230 commit 76335e6

File tree

5 files changed

+13
-1
lines changed

5 files changed

+13
-1
lines changed

src/ForwardDiff.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ using StaticArrays
66
using Preferences
77
using Random
88
using LinearAlgebra
9-
9+
using Base: require_one_based_indexing
1010
import Printf
1111
import NaNMath
1212
import SpecialFunctions

src/derivative.jl

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ Set `check` to `Val{false}()` to disable tag checking. This can lead to perturba
2424
"""
2525
@inline function derivative(f!, y::AbstractArray, x::Real,
2626
cfg::DerivativeConfig{T} = DerivativeConfig(f!, y, x), ::Val{CHK}=Val{true}()) where {T, CHK}
27+
require_one_based_indexing(y)
2728
CHK && checktag(T, f!, x)
2829
ydual = cfg.duals
2930
seed!(ydual, y)
@@ -42,6 +43,7 @@ This method assumes that `isa(f(x), Union{Real,AbstractArray})`.
4243
"""
4344
@inline function derivative!(result::Union{AbstractArray,DiffResult},
4445
f::F, x::R) where {F,R<:Real}
46+
result isa DiffResult || require_one_based_indexing(result)
4547
T = typeof(Tag(f, R))
4648
ydual = f(Dual{T}(x, one(x)))
4749
result = extract_value!(T, result, ydual)
@@ -60,6 +62,7 @@ Set `check` to `Val{false}()` to disable tag checking. This can lead to perturba
6062
@inline function derivative!(result::Union{AbstractArray,DiffResult},
6163
f!, y::AbstractArray, x::Real,
6264
cfg::DerivativeConfig{T} = DerivativeConfig(f!, y, x), ::Val{CHK}=Val{true}()) where {T, CHK}
65+
result isa DiffResult ? require_one_based_indexing(y) : require_one_based_indexing(result, y)
6366
CHK && checktag(T, f!, x)
6467
ydual = cfg.duals
6568
seed!(ydual, y)

src/gradient.jl

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ This method assumes that `isa(f(x), Real)`.
1414
Set `check` to `Val{false}()` to disable tag checking. This can lead to perturbation confusion, so should be used with care.
1515
"""
1616
function gradient(f, x::AbstractArray, cfg::GradientConfig{T} = GradientConfig(f, x), ::Val{CHK}=Val{true}()) where {T, CHK}
17+
require_one_based_indexing(x)
1718
CHK && checktag(T, f, x)
1819
if chunksize(cfg) == length(x)
1920
return vector_mode_gradient(f, x, cfg)
@@ -32,6 +33,7 @@ This method assumes that `isa(f(x), Real)`.
3233
3334
"""
3435
function gradient!(result::Union{AbstractArray,DiffResult}, f::F, x::AbstractArray, cfg::GradientConfig{T} = GradientConfig(f, x), ::Val{CHK}=Val{true}()) where {T, CHK, F}
36+
result isa DiffResult ? require_one_based_indexing(x) : require_one_based_indexing(result, x)
3537
CHK && checktag(T, f, x)
3638
if chunksize(cfg) == length(x)
3739
vector_mode_gradient!(result, f, x, cfg)

src/hessian.jl

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ This method assumes that `isa(f(x), Real)`.
1212
Set `check` to `Val{false}()` to disable tag checking. This can lead to perturbation confusion, so should be used with care.
1313
"""
1414
function hessian(f, x::AbstractArray, cfg::HessianConfig{T} = HessianConfig(f, x), ::Val{CHK}=Val{true}()) where {T,CHK}
15+
require_one_based_indexing(x)
1516
CHK && checktag(T, f, x)
1617
∇f = y -> gradient(f, y, cfg.gradient_config, Val{false}())
1718
return jacobian(∇f, x, cfg.jacobian_config, Val{false}())
@@ -28,6 +29,7 @@ This method assumes that `isa(f(x), Real)`.
2829
Set `check` to `Val{false}()` to disable tag checking. This can lead to perturbation confusion, so should be used with care.
2930
"""
3031
function hessian!(result::AbstractArray, f, x::AbstractArray, cfg::HessianConfig{T} = HessianConfig(f, x), ::Val{CHK}=Val{true}()) where {T,CHK}
32+
require_one_based_indexing(result, x)
3133
CHK && checktag(T, f, x)
3234
∇f = y -> gradient(f, y, cfg.gradient_config, Val{false}())
3335
jacobian!(result, ∇f, x, cfg.jacobian_config, Val{false}())
@@ -62,6 +64,7 @@ because `isa(result, DiffResult)`, `cfg` is constructed as `HessianConfig(f, res
6264
Set `check` to `Val{false}()` to disable tag checking. This can lead to perturbation confusion, so should be used with care.
6365
"""
6466
function hessian!(result::DiffResult, f, x::AbstractArray, cfg::HessianConfig{T} = HessianConfig(f, result, x), ::Val{CHK}=Val{true}()) where {T,CHK}
67+
require_one_based_indexing(x)
6568
CHK && checktag(T, f, x)
6669
∇f! = InnerGradientForHess(result, cfg, f)
6770
jacobian!(DiffResults.hessian(result), ∇f!, DiffResults.gradient(result), x, cfg.jacobian_config, Val{false}())

src/jacobian.jl

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ This method assumes that `isa(f(x), AbstractArray)`.
1616
Set `check` to `Val{false}()` to disable tag checking. This can lead to perturbation confusion, so should be used with care.
1717
"""
1818
function jacobian(f, x::AbstractArray, cfg::JacobianConfig{T} = JacobianConfig(f, x), ::Val{CHK}=Val{true}()) where {T,CHK}
19+
require_one_based_indexing(x)
1920
CHK && checktag(T, f, x)
2021
if chunksize(cfg) == length(x)
2122
return vector_mode_jacobian(f, x, cfg)
@@ -33,6 +34,7 @@ stored in `y`.
3334
Set `check` to `Val{false}()` to disable tag checking. This can lead to perturbation confusion, so should be used with care.
3435
"""
3536
function jacobian(f!, y::AbstractArray, x::AbstractArray, cfg::JacobianConfig{T} = JacobianConfig(f!, y, x), ::Val{CHK}=Val{true}()) where {T, CHK}
37+
require_one_based_indexing(y, x)
3638
CHK && checktag(T, f!, x)
3739
if chunksize(cfg) == length(x)
3840
return vector_mode_jacobian(f!, y, x, cfg)
@@ -53,6 +55,7 @@ This method assumes that `isa(f(x), AbstractArray)`.
5355
Set `check` to `Val{false}()` to disable tag checking. This can lead to perturbation confusion, so should be used with care.
5456
"""
5557
function jacobian!(result::Union{AbstractArray,DiffResult}, f, x::AbstractArray, cfg::JacobianConfig{T} = JacobianConfig(f, x), ::Val{CHK}=Val{true}()) where {T, CHK}
58+
result isa DiffResult ? require_one_based_indexing(x) : require_one_based_indexing(result, x)
5659
CHK && checktag(T, f, x)
5760
if chunksize(cfg) == length(x)
5861
vector_mode_jacobian!(result, f, x, cfg)
@@ -73,6 +76,7 @@ This method assumes that `isa(f(x), AbstractArray)`.
7376
Set `check` to `Val{false}()` to disable tag checking. This can lead to perturbation confusion, so should be used with care.
7477
"""
7578
function jacobian!(result::Union{AbstractArray,DiffResult}, f!, y::AbstractArray, x::AbstractArray, cfg::JacobianConfig{T} = JacobianConfig(f!, y, x), ::Val{CHK}=Val{true}()) where {T,CHK}
79+
result isa DiffResult ? require_one_based_indexing(y, x) : require_one_based_indexing(result, y, x)
7680
CHK && checktag(T, f!, x)
7781
if chunksize(cfg) == length(x)
7882
vector_mode_jacobian!(result, f!, y, x, cfg)

0 commit comments

Comments
 (0)