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