1+ ---
2+ title: Diffusion operator loop sparse AD benchmarks
3+ author: Yolhan Mannes
4+ ---
5+
6+ ```julia
7+ using DifferentiationInterface
8+ using DifferentiationInterfaceTest
9+ using LinearAlgebra
10+ using SparseConnectivityTracer: TracerSparsityDetector
11+ using SparseMatrixColorings
12+ import Enzyme,ForwardDiff,Mooncake
13+ ```
14+
15+ ## Backends tested
16+
17+ ```julia
18+ bcks = [
19+ AutoEnzyme(mode=Enzyme.Reverse),
20+ AutoEnzyme(mode=Enzyme.Forward),
21+ AutoMooncake(config=nothing),
22+ AutoForwardDiff(),
23+ AutoSparse(
24+ AutoForwardDiff();
25+ sparsity_detector=TracerSparsityDetector(),
26+ coloring_algorithm=GreedyColoringAlgorithm()
27+ ),
28+ AutoSparse(
29+ AutoEnzyme(mode=Enzyme.Forward);
30+ sparsity_detector=TracerSparsityDetector(),
31+ coloring_algorithm=GreedyColoringAlgorithm()
32+ )
33+ ]
34+ ```
35+
36+ ## Diffusion operator simple loop
37+
38+ ```julia
39+ uin() = 0.0
40+ uout() = 0.0
41+ function Diffusion(u)
42+ du = zero(u)
43+ for i in eachindex(du,u)
44+ if i == 1
45+ ug = uin()
46+ ud = u[i+1]
47+ elseif i == length(u)
48+ ug = u[i-1]
49+ ud = uout()
50+ else
51+ ug = u[i-1]
52+ ud = u[i+1]
53+ end
54+ du[i] = ug + ud -2*u[i]
55+ end
56+ return du
57+ end;
58+ ```
59+
60+ ## Manual jacobian
61+ ```julia
62+ function DDiffusion(u)
63+ A = diagm(
64+ -1 => ones(length(u)-1),
65+ 0=>-2 .*ones(length(u)),
66+ 1 => ones(length(u)-1))
67+ return A
68+ end;
69+ ```
70+
71+ ## Define Scenarios
72+
73+ ```julia
74+ u = rand(1000)
75+ scenarios = [ Scenario{:jacobian,:out}(Diffusion,u,res1=DDiffusion(u))];
76+ ```
77+
78+ ## Run Benchmarks
79+
80+ ```julia
81+ df = benchmark_differentiation(bcks, scenarios)
82+ ```
0 commit comments