|
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