From d9bfd3bfbf478409bce8b56b4001397fee000889 Mon Sep 17 00:00:00 2001 From: Kristoffer Carlsson Date: Mon, 19 Aug 2024 18:29:00 +0200 Subject: [PATCH] Stop precomputing chunk sizes into a nonconcrete array (#708) This prevents constant propagation of the length of a static array. Alternative to https://github.com/JuliaDiff/ForwardDiff.jl/pull/707 Co-authored-by: David Widmann --- src/prelude.jl | 5 +---- test/GradientTest.jl | 3 +++ test/JacobianTest.jl | 5 ++++- 3 files changed, 8 insertions(+), 5 deletions(-) diff --git a/src/prelude.jl b/src/prelude.jl index 1a5d0cfa..5fe0a9c1 100644 --- a/src/prelude.jl +++ b/src/prelude.jl @@ -14,12 +14,9 @@ const BINARY_PREDICATES = Symbol[:isequal, :isless, :<, :>, :(==), :(!=), :(<=), struct Chunk{N} end -const CHUNKS = [Chunk{i}() for i in 1:DEFAULT_CHUNK_THRESHOLD] - function Chunk(input_length::Integer, threshold::Integer = DEFAULT_CHUNK_THRESHOLD) N = pickchunksize(input_length, threshold) - 0 < N <= DEFAULT_CHUNK_THRESHOLD && return CHUNKS[N] - return Chunk{N}() + Base.@nif 12 d->(N == d) d->(Chunk{d}()) d->(Chunk{N}()) end function Chunk(x::AbstractArray, threshold::Integer = DEFAULT_CHUNK_THRESHOLD) diff --git a/test/GradientTest.jl b/test/GradientTest.jl index 8a28b07e..d806a967 100644 --- a/test/GradientTest.jl +++ b/test/GradientTest.jl @@ -135,6 +135,9 @@ end @test DiffResults.gradient(sresult1) == DiffResults.gradient(result) @test DiffResults.gradient(sresult2) == DiffResults.gradient(result) @test DiffResults.gradient(sresult3) == DiffResults.gradient(result) + + # make sure this is not a source of type instability + @inferred ForwardDiff.GradientConfig(f, sx) end @testset "exponential function at base zero" begin diff --git a/test/JacobianTest.jl b/test/JacobianTest.jl index 7cc9dccb..1fea444c 100644 --- a/test/JacobianTest.jl +++ b/test/JacobianTest.jl @@ -222,6 +222,9 @@ for T in (StaticArrays.SArray, StaticArrays.MArray) @test DiffResults.jacobian(sresult1) == DiffResults.jacobian(result) @test DiffResults.jacobian(sresult2) == DiffResults.jacobian(result) @test DiffResults.jacobian(sresult3) == DiffResults.jacobian(result) + + # make sure this is not a source of type instability + @inferred ForwardDiff.JacobianConfig(f, sx) end @testset "dimension errors for jacobian" begin @@ -233,7 +236,7 @@ end @testset "eigen" begin @test ForwardDiff.jacobian(x -> eigvals(SymTridiagonal(x, x[1:end-1])), [1.,2.]) ≈ [(1 - 3/sqrt(5))/2 (1 - 1/sqrt(5))/2 ; (1 + 3/sqrt(5))/2 (1 + 1/sqrt(5))/2] @test ForwardDiff.jacobian(x -> eigvals(Symmetric(x*x')), [1.,2.]) ≈ [0 0; 2 4] - + x0 = [1.0, 2.0]; ev1(x) = eigen(Symmetric(x*x')).vectors[:,1] @test ForwardDiff.jacobian(ev1, x0) ≈ Calculus.finite_difference_jacobian(ev1, x0)