|
32 | 32 |
|
33 | 33 | # Approximate Jacobian Sparsity Detection |
34 | 34 | ## Right now we hardcode it to use `ForwardDiff` |
35 | | -function (alg::ApproximateJacobianSparsity)(ad::AbstractSparseADType, f, x; kwargs...) |
| 35 | +function (alg::ApproximateJacobianSparsity)(ad::AbstractSparseADType, f, x; fx = nothing, |
| 36 | + kwargs...) |
36 | 37 | @unpack ntrials, rng = alg |
| 38 | + fx = fx === nothing ? f(x) : fx |
| 39 | + J = fill!(similar(fx, length(fx), length(x)), 0) |
37 | 40 | cfg = ForwardDiff.JacobianConfig(f, x) |
38 | | - J = sum(1:ntrials) do _ |
39 | | - local x_ = similar(x) |
40 | | - rand!(rng, x_) |
41 | | - abs.(ForwardDiff.jacobian(f, x_, cfg)) |
| 41 | + for _ in 1:ntrials |
| 42 | + x_ = similar(x) |
| 43 | + randn!(rng, x_) |
| 44 | + J .+= abs.(ForwardDiff.jacobian(f, x_, cfg)) |
42 | 45 | end |
43 | 46 | return (JacPrototypeSparsityDetection(; jac_prototype = sparse(J), alg.alg))(ad, f, x; |
44 | | - kwargs...) |
| 47 | + fx, kwargs...) |
45 | 48 | end |
46 | 49 |
|
47 | 50 | function (alg::ApproximateJacobianSparsity)(ad::AbstractSparseADType, f!, fx, x; kwargs...) |
48 | 51 | @unpack ntrials, rng = alg |
49 | 52 | cfg = ForwardDiff.JacobianConfig(f!, fx, x) |
50 | | - J = sum(1:ntrials) do _ |
51 | | - local x_ = similar(x) |
52 | | - rand!(rng, x_) |
53 | | - abs.(ForwardDiff.jacobian(f!, fx, x_, cfg)) |
| 53 | + J = fill!(similar(fx, length(fx), length(x)), 0) |
| 54 | + for _ in 1:ntrials |
| 55 | + x_ = similar(x) |
| 56 | + randn!(rng, x_) |
| 57 | + J .+= abs.(ForwardDiff.jacobian(f!, fx, x_, cfg)) |
54 | 58 | end |
55 | 59 | return (JacPrototypeSparsityDetection(; jac_prototype = sparse(J), alg.alg))(ad, f!, fx, |
56 | 60 | x; kwargs...) |
|
0 commit comments