Skip to content

Commit c9baae9

Browse files
committed
Add a fitting benchmark
1 parent 86b0a8b commit c9baae9

File tree

2 files changed

+114
-0
lines changed

2 files changed

+114
-0
lines changed

tests/benchmark_fitting.py

+114
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,114 @@
1+
"""Benchmark for using the formula dispersion"""
2+
3+
import elli
4+
import numpy as np
5+
from elli.fitting import ParamsHist, fit
6+
from fixtures import datadir
7+
from pytest import fixture
8+
9+
10+
def test_fitting_structure_creation(benchmark, datadir):
11+
ANGLE = 70
12+
rii_db = elli.db.RII()
13+
Si = rii_db.get_mat("Si", "Aspnes")
14+
15+
psi_delta = (
16+
elli.read_nexus_psi_delta(datadir / "SiO2onSi.ellips.nxs")
17+
.loc[ANGLE]
18+
.loc[210:800]
19+
)
20+
21+
params = ParamsHist()
22+
params.add("SiO2_n0", value=1.6, min=-100, max=100, vary=True)
23+
params.add("SiO2_n1", value=36, min=-40000, max=40000, vary=False)
24+
params.add("SiO2_n2", value=0, min=-40000, max=40000, vary=False)
25+
params.add("SiO2_k0", value=0, min=-100, max=100, vary=False)
26+
params.add("SiO2_k1", value=0, min=-40000, max=40000, vary=False)
27+
params.add("SiO2_k2", value=0, min=-40000, max=40000, vary=False)
28+
params.add("SiO2_d", value=20, min=0, max=40000, vary=True)
29+
30+
@fit(psi_delta, params)
31+
def model(lbda, params):
32+
SiO2 = elli.Cauchy(
33+
params["SiO2_n0"],
34+
params["SiO2_n1"],
35+
params["SiO2_n2"],
36+
params["SiO2_k0"],
37+
params["SiO2_k1"],
38+
params["SiO2_k2"],
39+
).get_mat()
40+
41+
return elli.Structure(
42+
elli.AIR,
43+
[elli.Layer(SiO2, params["SiO2_d"])],
44+
Si,
45+
).evaluate(lbda, ANGLE, solver=elli.Solver4x4, save_experiment=True)
46+
47+
result = benchmark.pedantic(
48+
model.fit,
49+
args=(),
50+
iterations=1,
51+
rounds=10,
52+
)
53+
assert result.chisqr < 0.02
54+
55+
56+
def test_fitting_structure_updates(benchmark, datadir):
57+
ANGLE = 70
58+
rii_db = elli.db.RII()
59+
Si = rii_db.get_mat("Si", "Aspnes")
60+
61+
psi_delta = (
62+
elli.read_nexus_psi_delta(datadir / "SiO2onSi.ellips.nxs")
63+
.loc[ANGLE]
64+
.loc[210:800]
65+
)
66+
67+
params = ParamsHist()
68+
params.add("SiO2_n0", value=1.6, min=-100, max=100, vary=True)
69+
params.add("SiO2_n1", value=36, min=-40000, max=40000, vary=False)
70+
params.add("SiO2_n2", value=0, min=-40000, max=40000, vary=False)
71+
params.add("SiO2_k0", value=0, min=-100, max=100, vary=False)
72+
params.add("SiO2_k1", value=0, min=-40000, max=40000, vary=False)
73+
params.add("SiO2_k2", value=0, min=-40000, max=40000, vary=False)
74+
params.add("SiO2_d", value=20, min=0, max=40000, vary=True)
75+
76+
SiO2 = elli.Cauchy(
77+
params["SiO2_n0"],
78+
params["SiO2_n1"],
79+
params["SiO2_n2"],
80+
params["SiO2_k0"],
81+
params["SiO2_k1"],
82+
params["SiO2_k2"],
83+
)
84+
85+
SiO2_mat = SiO2.get_mat()
86+
87+
layer = elli.Layer(SiO2_mat, params["SiO2_d"])
88+
89+
structure = elli.Structure(
90+
elli.AIR,
91+
[layer],
92+
Si,
93+
)
94+
95+
@fit(psi_delta, params)
96+
def model(lbda, params):
97+
SiO2.single_params["n0"] = params["SiO2_n0"]
98+
SiO2.single_params["n1"] = params["SiO2_n1"]
99+
SiO2.single_params["n2"] = params["SiO2_n2"]
100+
SiO2.single_params["k0"] = params["SiO2_k0"]
101+
SiO2.single_params["k1"] = params["SiO2_k1"]
102+
SiO2.single_params["k2"] = params["SiO2_k2"]
103+
104+
layer.set_thickness(params["SiO2_d"])
105+
106+
return structure.evaluate(lbda, ANGLE, solver=elli.Solver2x2)
107+
108+
result = benchmark.pedantic(
109+
model.fit,
110+
args=(),
111+
iterations=1,
112+
rounds=10,
113+
)
114+
assert result.chisqr < 0.02
118 KB
Binary file not shown.

0 commit comments

Comments
 (0)