Skip to content

Commit 161d227

Browse files
committed
Base vector vs chunk mode on structural length
1 parent 715f4bc commit 161d227

File tree

3 files changed

+14
-14
lines changed

3 files changed

+14
-14
lines changed

src/gradient.jl

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ Set `check` to `Val{false}()` to disable tag checking. This can lead to perturba
1616
function gradient(f::F, x::AbstractArray, cfg::GradientConfig{T} = GradientConfig(f, x), ::Val{CHK}=Val{true}()) where {F, T, CHK}
1717
require_one_based_indexing(x)
1818
CHK && checktag(T, f, x)
19-
if chunksize(cfg) == length(x)
19+
if chunksize(cfg) == structural_length(x)
2020
return vector_mode_gradient(f, x, cfg)
2121
else
2222
return chunk_mode_gradient(f, x, cfg)
@@ -35,7 +35,7 @@ This method assumes that `isa(f(x), Real)`.
3535
function gradient!(result::Union{AbstractArray,DiffResult}, f::F, x::AbstractArray, cfg::GradientConfig{T} = GradientConfig(f, x), ::Val{CHK}=Val{true}()) where {T, CHK, F}
3636
result isa DiffResult ? require_one_based_indexing(x) : require_one_based_indexing(result, x)
3737
CHK && checktag(T, f, x)
38-
if chunksize(cfg) == length(x)
38+
if chunksize(cfg) == structural_length(x)
3939
vector_mode_gradient!(result, f, x, cfg)
4040
else
4141
chunk_mode_gradient!(result, f, x, cfg)
@@ -114,10 +114,10 @@ end
114114

115115
function chunk_mode_gradient_expr(result_definition::Expr)
116116
return quote
117-
@assert length(x) >= N "chunk size cannot be greater than length(x) ($(N) > $(length(x)))"
117+
@assert structural_length(x) >= N "chunk size cannot be greater than ForwardDiff.structural_length(x) ($(N) > $(structural_length(x)))"
118118

119119
# precalculate loop bounds
120-
xlen = length(x)
120+
xlen = structural_length(x)
121121
remainder = xlen % N
122122
lastchunksize = ifelse(remainder == 0, N, remainder)
123123
lastchunkindex = xlen - lastchunksize + 1

src/jacobian.jl

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ Set `check` to `Val{false}()` to disable tag checking. This can lead to perturba
1818
function jacobian(f::F, x::AbstractArray, cfg::JacobianConfig{T} = JacobianConfig(f, x), ::Val{CHK}=Val{true}()) where {F,T,CHK}
1919
require_one_based_indexing(x)
2020
CHK && checktag(T, f, x)
21-
if chunksize(cfg) == length(x)
21+
if chunksize(cfg) == structural_length(x)
2222
return vector_mode_jacobian(f, x, cfg)
2323
else
2424
return chunk_mode_jacobian(f, x, cfg)
@@ -36,7 +36,7 @@ Set `check` to `Val{false}()` to disable tag checking. This can lead to perturba
3636
function jacobian(f!::F, y::AbstractArray, x::AbstractArray, cfg::JacobianConfig{T} = JacobianConfig(f!, y, x), ::Val{CHK}=Val{true}()) where {F,T, CHK}
3737
require_one_based_indexing(y, x)
3838
CHK && checktag(T, f!, x)
39-
if chunksize(cfg) == length(x)
39+
if chunksize(cfg) == structural_length(x)
4040
return vector_mode_jacobian(f!, y, x, cfg)
4141
else
4242
return chunk_mode_jacobian(f!, y, x, cfg)
@@ -57,7 +57,7 @@ Set `check` to `Val{false}()` to disable tag checking. This can lead to perturba
5757
function jacobian!(result::Union{AbstractArray,DiffResult}, f::F, x::AbstractArray, cfg::JacobianConfig{T} = JacobianConfig(f, x), ::Val{CHK}=Val{true}()) where {F,T, CHK}
5858
result isa DiffResult ? require_one_based_indexing(x) : require_one_based_indexing(result, x)
5959
CHK && checktag(T, f, x)
60-
if chunksize(cfg) == length(x)
60+
if chunksize(cfg) == structural_length(x)
6161
vector_mode_jacobian!(result, f, x, cfg)
6262
else
6363
chunk_mode_jacobian!(result, f, x, cfg)
@@ -78,7 +78,7 @@ Set `check` to `Val{false}()` to disable tag checking. This can lead to perturba
7878
function jacobian!(result::Union{AbstractArray,DiffResult}, f!::F, y::AbstractArray, x::AbstractArray, cfg::JacobianConfig{T} = JacobianConfig(f!, y, x), ::Val{CHK}=Val{true}()) where {F,T,CHK}
7979
result isa DiffResult ? require_one_based_indexing(y, x) : require_one_based_indexing(result, y, x)
8080
CHK && checktag(T, f!, x)
81-
if chunksize(cfg) == length(x)
81+
if chunksize(cfg) == structural_length(x)
8282
vector_mode_jacobian!(result, f!, y, x, cfg)
8383
else
8484
chunk_mode_jacobian!(result, f!, y, x, cfg)
@@ -169,10 +169,10 @@ const JACOBIAN_ERROR = DimensionMismatch("jacobian(f, x) expects that f(x) is an
169169
function jacobian_chunk_mode_expr(work_array_definition::Expr, compute_ydual::Expr,
170170
result_definition::Expr, y_definition::Expr)
171171
return quote
172-
@assert length(x) >= N "chunk size cannot be greater than length(x) ($(N) > $(length(x)))"
172+
@assert structural_length(x) >= N "chunk size cannot be greater than ForwardDiff.structural_length(x) ($(N) > $(structural_length(x)))"
173173

174174
# precalculate loop bounds
175-
xlen = length(x)
175+
xlen = structural_length(x)
176176
remainder = xlen % N
177177
lastchunksize = ifelse(remainder == 0, N, remainder)
178178
lastchunkindex = xlen - lastchunksize + 1

src/prelude.jl

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,15 +12,15 @@ function Chunk(input_length::Integer, threshold::Integer = DEFAULT_CHUNK_THRESHO
1212
Base.@nif 12 d->(N == d) d->(Chunk{d}()) d->(Chunk{N}())
1313
end
1414

15-
_length_structural_nonzero_indices(x::AbstractArray) = length(x)
16-
function _length_structural_nonzero_indices(x::Union{LowerTriangular,UpperTriangular})
15+
structural_length(x::AbstractArray) = length(x)
16+
function structural_length(x::Union{LowerTriangular,UpperTriangular})
1717
n = size(x, 1)
1818
return (n * (n + 1)) >> 1
1919
end
20-
_length_structural_nonzero_indices(x::Diagonal) = size(x, 1)
20+
structural_length(x::Diagonal) = size(x, 1)
2121

2222
function Chunk(x::AbstractArray, threshold::Integer = DEFAULT_CHUNK_THRESHOLD)
23-
return Chunk(_length_structural_nonzero_indices(x), threshold)
23+
return Chunk(structural_length(x), threshold)
2424
end
2525

2626
# Constrained to `N <= threshold`, minimize (in order of priority):

0 commit comments

Comments
 (0)