reflectorch 1.3.0__py3-none-any.whl → 1.5.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of reflectorch might be problematic. Click here for more details.
- reflectorch/__init__.py +17 -17
- reflectorch/data_generation/__init__.py +128 -126
- reflectorch/data_generation/dataset.py +210 -210
- reflectorch/data_generation/likelihoods.py +80 -80
- reflectorch/data_generation/noise.py +470 -470
- reflectorch/data_generation/priors/__init__.py +60 -60
- reflectorch/data_generation/priors/base.py +55 -55
- reflectorch/data_generation/priors/exp_subprior_sampler.py +298 -298
- reflectorch/data_generation/priors/independent_priors.py +195 -195
- reflectorch/data_generation/priors/multilayer_models.py +311 -311
- reflectorch/data_generation/priors/multilayer_structures.py +104 -104
- reflectorch/data_generation/priors/no_constraints.py +206 -206
- reflectorch/data_generation/priors/parametric_models.py +841 -841
- reflectorch/data_generation/priors/parametric_subpriors.py +369 -369
- reflectorch/data_generation/priors/params.py +252 -252
- reflectorch/data_generation/priors/sampler_strategies.py +369 -369
- reflectorch/data_generation/priors/scaler_mixin.py +65 -65
- reflectorch/data_generation/priors/subprior_sampler.py +371 -371
- reflectorch/data_generation/priors/utils.py +118 -118
- reflectorch/data_generation/process_data.py +41 -41
- reflectorch/data_generation/q_generator.py +280 -246
- reflectorch/data_generation/reflectivity/__init__.py +102 -102
- reflectorch/data_generation/reflectivity/abeles.py +97 -97
- reflectorch/data_generation/reflectivity/kinematical.py +70 -70
- reflectorch/data_generation/reflectivity/memory_eff.py +105 -105
- reflectorch/data_generation/reflectivity/numpy_implementations.py +120 -120
- reflectorch/data_generation/reflectivity/smearing.py +138 -138
- reflectorch/data_generation/reflectivity/smearing_pointwise.py +109 -109
- reflectorch/data_generation/scale_curves.py +112 -112
- reflectorch/data_generation/smearing.py +98 -98
- reflectorch/data_generation/utils.py +223 -222
- reflectorch/extensions/jupyter/__init__.py +11 -6
- reflectorch/extensions/jupyter/api.py +85 -0
- reflectorch/extensions/jupyter/callbacks.py +34 -34
- reflectorch/extensions/jupyter/components.py +758 -0
- reflectorch/extensions/jupyter/custom_select.py +268 -0
- reflectorch/extensions/jupyter/log_widget.py +241 -0
- reflectorch/extensions/jupyter/model_selection.py +495 -0
- reflectorch/extensions/jupyter/plotly_plot_manager.py +329 -0
- reflectorch/extensions/jupyter/widget.py +625 -0
- reflectorch/extensions/matplotlib/__init__.py +5 -5
- reflectorch/extensions/matplotlib/losses.py +32 -32
- reflectorch/extensions/refnx/refnx_conversion.py +76 -76
- reflectorch/inference/__init__.py +28 -24
- reflectorch/inference/inference_model.py +847 -851
- reflectorch/inference/input_interface.py +239 -0
- reflectorch/inference/loading_data.py +37 -0
- reflectorch/inference/multilayer_fitter.py +171 -171
- reflectorch/inference/multilayer_inference_model.py +193 -193
- reflectorch/inference/plotting.py +524 -98
- reflectorch/inference/preprocess_exp/__init__.py +6 -6
- reflectorch/inference/preprocess_exp/attenuation.py +36 -36
- reflectorch/inference/preprocess_exp/cut_with_q_ratio.py +31 -31
- reflectorch/inference/preprocess_exp/footprint.py +81 -81
- reflectorch/inference/preprocess_exp/interpolation.py +19 -16
- reflectorch/inference/preprocess_exp/normalize.py +21 -21
- reflectorch/inference/preprocess_exp/preprocess.py +121 -121
- reflectorch/inference/query_matcher.py +81 -81
- reflectorch/inference/record_time.py +43 -43
- reflectorch/inference/sampler_solution.py +56 -56
- reflectorch/inference/scipy_fitter.py +272 -248
- reflectorch/inference/torch_fitter.py +87 -87
- reflectorch/ml/__init__.py +32 -32
- reflectorch/ml/basic_trainer.py +292 -292
- reflectorch/ml/callbacks.py +80 -80
- reflectorch/ml/dataloaders.py +26 -26
- reflectorch/ml/loggers.py +55 -55
- reflectorch/ml/schedulers.py +355 -355
- reflectorch/ml/trainers.py +200 -191
- reflectorch/ml/utils.py +2 -2
- reflectorch/models/__init__.py +15 -14
- reflectorch/models/activations.py +50 -50
- reflectorch/models/encoders/__init__.py +19 -17
- reflectorch/models/encoders/conv_encoder.py +218 -218
- reflectorch/models/encoders/conv_res_net.py +115 -115
- reflectorch/models/encoders/fno.py +133 -133
- reflectorch/models/encoders/integral_kernel_embedding.py +390 -0
- reflectorch/models/networks/__init__.py +14 -14
- reflectorch/models/networks/mlp_networks.py +434 -428
- reflectorch/models/networks/residual_net.py +156 -156
- reflectorch/paths.py +29 -27
- reflectorch/runs/__init__.py +31 -31
- reflectorch/runs/config.py +25 -25
- reflectorch/runs/slurm_utils.py +93 -93
- reflectorch/runs/train.py +78 -78
- reflectorch/runs/utils.py +404 -401
- reflectorch/test_config.py +4 -4
- reflectorch/train.py +4 -4
- reflectorch/train_on_cluster.py +4 -4
- reflectorch/utils.py +98 -68
- {reflectorch-1.3.0.dist-info → reflectorch-1.5.0.dist-info}/METADATA +129 -125
- reflectorch-1.5.0.dist-info/RECORD +96 -0
- {reflectorch-1.3.0.dist-info → reflectorch-1.5.0.dist-info}/WHEEL +1 -1
- {reflectorch-1.3.0.dist-info → reflectorch-1.5.0.dist-info}/licenses/LICENSE.txt +20 -20
- reflectorch-1.3.0.dist-info/RECORD +0 -86
- {reflectorch-1.3.0.dist-info → reflectorch-1.5.0.dist-info}/top_level.txt +0 -0
|
@@ -1,32 +1,32 @@
|
|
|
1
|
-
import matplotlib.pyplot as plt
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
def plot_losses(
|
|
5
|
-
losses: dict,
|
|
6
|
-
log: bool = False,
|
|
7
|
-
show: bool = True,
|
|
8
|
-
title: str = 'Losses',
|
|
9
|
-
x_label: str = 'Iterations',
|
|
10
|
-
best_epoch: float = None,
|
|
11
|
-
**kwargs
|
|
12
|
-
):
|
|
13
|
-
func = plt.semilogy if log else plt.plot
|
|
14
|
-
|
|
15
|
-
if len(losses) <= 2:
|
|
16
|
-
losses = {'loss': losses['total_loss']}
|
|
17
|
-
|
|
18
|
-
for k, data in losses.items():
|
|
19
|
-
func(data, label=k, **kwargs)
|
|
20
|
-
|
|
21
|
-
if best_epoch is not None:
|
|
22
|
-
plt.axvline(best_epoch, ls='--', color='red')
|
|
23
|
-
|
|
24
|
-
plt.xlabel(x_label)
|
|
25
|
-
|
|
26
|
-
if len(losses) > 2:
|
|
27
|
-
plt.legend()
|
|
28
|
-
|
|
29
|
-
plt.title(title)
|
|
30
|
-
|
|
31
|
-
if show:
|
|
32
|
-
plt.show()
|
|
1
|
+
import matplotlib.pyplot as plt
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
def plot_losses(
|
|
5
|
+
losses: dict,
|
|
6
|
+
log: bool = False,
|
|
7
|
+
show: bool = True,
|
|
8
|
+
title: str = 'Losses',
|
|
9
|
+
x_label: str = 'Iterations',
|
|
10
|
+
best_epoch: float = None,
|
|
11
|
+
**kwargs
|
|
12
|
+
):
|
|
13
|
+
func = plt.semilogy if log else plt.plot
|
|
14
|
+
|
|
15
|
+
if len(losses) <= 2:
|
|
16
|
+
losses = {'loss': losses['total_loss']}
|
|
17
|
+
|
|
18
|
+
for k, data in losses.items():
|
|
19
|
+
func(data, label=k, **kwargs)
|
|
20
|
+
|
|
21
|
+
if best_epoch is not None:
|
|
22
|
+
plt.axvline(best_epoch, ls='--', color='red')
|
|
23
|
+
|
|
24
|
+
plt.xlabel(x_label)
|
|
25
|
+
|
|
26
|
+
if len(losses) > 2:
|
|
27
|
+
plt.legend()
|
|
28
|
+
|
|
29
|
+
plt.title(title)
|
|
30
|
+
|
|
31
|
+
if show:
|
|
32
|
+
plt.show()
|
|
@@ -1,77 +1,77 @@
|
|
|
1
|
-
import numpy as np
|
|
2
|
-
from functools import reduce
|
|
3
|
-
from operator import or_
|
|
4
|
-
|
|
5
|
-
from reflectorch.inference.inference_model import EasyInferenceModel
|
|
6
|
-
from reflectorch import BasicParams
|
|
7
|
-
|
|
8
|
-
import refnx
|
|
9
|
-
from refnx.dataset import ReflectDataset, Data1D
|
|
10
|
-
from refnx.analysis import Transform, CurveFitter, Objective, Model, Parameter
|
|
11
|
-
from refnx.reflect import SLD, Slab, ReflectModel
|
|
12
|
-
|
|
13
|
-
def covert_reflectorch_prediction_to_refnx_structure(inference_model: EasyInferenceModel, pred_params_object: BasicParams, prior_bounds: np.array):
|
|
14
|
-
assert inference_model.trainer.loader.prior_sampler.param_model.__class__.__name__ == 'StandardModel'
|
|
15
|
-
|
|
16
|
-
n_layers = inference_model.trainer.loader.prior_sampler.max_num_layers
|
|
17
|
-
init_thicknesses = pred_params_object.thicknesses.squeeze().tolist()
|
|
18
|
-
init_roughnesses = pred_params_object.roughnesses.squeeze().tolist()
|
|
19
|
-
init_slds = pred_params_object.slds.squeeze().tolist()
|
|
20
|
-
|
|
21
|
-
sld_objects = []
|
|
22
|
-
|
|
23
|
-
for sld in init_slds:
|
|
24
|
-
sld_objects.append(SLD(value=sld))
|
|
25
|
-
|
|
26
|
-
layer_objects = [SLD(0)()]
|
|
27
|
-
for i in range(n_layers):
|
|
28
|
-
layer_objects.append(sld_objects[i](init_thicknesses[i], init_roughnesses[i]))
|
|
29
|
-
|
|
30
|
-
layer_objects.append(sld_objects[-1](0, init_roughnesses[-1]))
|
|
31
|
-
|
|
32
|
-
thickness_bounds = prior_bounds[:n_layers]
|
|
33
|
-
roughness_bounds = prior_bounds[n_layers:2*n_layers+1]
|
|
34
|
-
sld_bounds = prior_bounds[2*n_layers+1:]
|
|
35
|
-
|
|
36
|
-
for i, layer in enumerate(layer_objects):
|
|
37
|
-
if i == 0:
|
|
38
|
-
print("Ambient (air)")
|
|
39
|
-
print(80 * '-')
|
|
40
|
-
elif i < n_layers+1:
|
|
41
|
-
layer.thick.setp(bounds=thickness_bounds[i-1], vary=True)
|
|
42
|
-
layer.rough.setp(bounds=roughness_bounds[i-1], vary=True)
|
|
43
|
-
layer.sld.real.setp(bounds=sld_bounds[i-1], vary=True)
|
|
44
|
-
|
|
45
|
-
print(f'Layer {i}')
|
|
46
|
-
print(f'Thickness: value {layer.thick.value}, vary {layer.thick.vary}, bounds {layer.thick.bounds}')
|
|
47
|
-
print(f'Roughness: value {layer.rough.value}, vary {layer.rough.vary}, bounds {layer.rough.bounds}')
|
|
48
|
-
print(f'SLD: value {layer.sld.real.value}, vary {layer.sld.real.vary}, bounds {layer.sld.real.bounds}')
|
|
49
|
-
print(80 * '-')
|
|
50
|
-
else: #substrate
|
|
51
|
-
layer.rough.setp(bounds=roughness_bounds[i-1], vary=True)
|
|
52
|
-
layer.sld.real.setp(bounds=sld_bounds[i-1], vary=True)
|
|
53
|
-
|
|
54
|
-
print(f'Substrate')
|
|
55
|
-
print(f'Thickness: value {layer.thick.value}, vary {layer.thick.vary}, bounds {layer.thick.bounds}')
|
|
56
|
-
print(f'Roughness: value {layer.rough.value}, vary {layer.rough.vary}, bounds {layer.rough.bounds}')
|
|
57
|
-
print(f'SLD: value {layer.sld.real.value}, vary {layer.sld.real.vary}, bounds {layer.sld.real.bounds}')
|
|
58
|
-
|
|
59
|
-
refnx_structure = reduce(or_, layer_objects)
|
|
60
|
-
|
|
61
|
-
return refnx_structure
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
###Example usage:
|
|
65
|
-
# refnx_structure = covert_reflectorch_prediction_to_refnx_structure(inference_model, pred_params_object, prior_bounds)
|
|
66
|
-
|
|
67
|
-
# refnx_reflect_model = ReflectModel(refnx_structure, bkg=1e-10, dq=0.0)
|
|
68
|
-
# refnx_reflect_model.scale.setp(bounds=(0.8, 1.2), vary=True)
|
|
69
|
-
# refnx_reflect_model.q_offset.setp(bounds=(-0.01, 0.01), vary=True)
|
|
70
|
-
# refnx_reflect_model.bkg.setp(bounds=(1e-10, 1e-8), vary=True)
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
# data = Data1D(data=(q_model, exp_curve_interp))
|
|
74
|
-
|
|
75
|
-
# refnx_objective = Objective(refnx_reflect_model, data, transform=Transform("logY"))
|
|
76
|
-
# fitter = CurveFitter(refnx_objective)
|
|
1
|
+
import numpy as np
|
|
2
|
+
from functools import reduce
|
|
3
|
+
from operator import or_
|
|
4
|
+
|
|
5
|
+
from reflectorch.inference.inference_model import EasyInferenceModel
|
|
6
|
+
from reflectorch import BasicParams
|
|
7
|
+
|
|
8
|
+
import refnx
|
|
9
|
+
from refnx.dataset import ReflectDataset, Data1D
|
|
10
|
+
from refnx.analysis import Transform, CurveFitter, Objective, Model, Parameter
|
|
11
|
+
from refnx.reflect import SLD, Slab, ReflectModel
|
|
12
|
+
|
|
13
|
+
def covert_reflectorch_prediction_to_refnx_structure(inference_model: EasyInferenceModel, pred_params_object: BasicParams, prior_bounds: np.array):
|
|
14
|
+
assert inference_model.trainer.loader.prior_sampler.param_model.__class__.__name__ == 'StandardModel'
|
|
15
|
+
|
|
16
|
+
n_layers = inference_model.trainer.loader.prior_sampler.max_num_layers
|
|
17
|
+
init_thicknesses = pred_params_object.thicknesses.squeeze().tolist()
|
|
18
|
+
init_roughnesses = pred_params_object.roughnesses.squeeze().tolist()
|
|
19
|
+
init_slds = pred_params_object.slds.squeeze().tolist()
|
|
20
|
+
|
|
21
|
+
sld_objects = []
|
|
22
|
+
|
|
23
|
+
for sld in init_slds:
|
|
24
|
+
sld_objects.append(SLD(value=sld))
|
|
25
|
+
|
|
26
|
+
layer_objects = [SLD(0)()]
|
|
27
|
+
for i in range(n_layers):
|
|
28
|
+
layer_objects.append(sld_objects[i](init_thicknesses[i], init_roughnesses[i]))
|
|
29
|
+
|
|
30
|
+
layer_objects.append(sld_objects[-1](0, init_roughnesses[-1]))
|
|
31
|
+
|
|
32
|
+
thickness_bounds = prior_bounds[:n_layers]
|
|
33
|
+
roughness_bounds = prior_bounds[n_layers:2*n_layers+1]
|
|
34
|
+
sld_bounds = prior_bounds[2*n_layers+1:]
|
|
35
|
+
|
|
36
|
+
for i, layer in enumerate(layer_objects):
|
|
37
|
+
if i == 0:
|
|
38
|
+
print("Ambient (air)")
|
|
39
|
+
print(80 * '-')
|
|
40
|
+
elif i < n_layers+1:
|
|
41
|
+
layer.thick.setp(bounds=thickness_bounds[i-1], vary=True)
|
|
42
|
+
layer.rough.setp(bounds=roughness_bounds[i-1], vary=True)
|
|
43
|
+
layer.sld.real.setp(bounds=sld_bounds[i-1], vary=True)
|
|
44
|
+
|
|
45
|
+
print(f'Layer {i}')
|
|
46
|
+
print(f'Thickness: value {layer.thick.value}, vary {layer.thick.vary}, bounds {layer.thick.bounds}')
|
|
47
|
+
print(f'Roughness: value {layer.rough.value}, vary {layer.rough.vary}, bounds {layer.rough.bounds}')
|
|
48
|
+
print(f'SLD: value {layer.sld.real.value}, vary {layer.sld.real.vary}, bounds {layer.sld.real.bounds}')
|
|
49
|
+
print(80 * '-')
|
|
50
|
+
else: #substrate
|
|
51
|
+
layer.rough.setp(bounds=roughness_bounds[i-1], vary=True)
|
|
52
|
+
layer.sld.real.setp(bounds=sld_bounds[i-1], vary=True)
|
|
53
|
+
|
|
54
|
+
print(f'Substrate')
|
|
55
|
+
print(f'Thickness: value {layer.thick.value}, vary {layer.thick.vary}, bounds {layer.thick.bounds}')
|
|
56
|
+
print(f'Roughness: value {layer.rough.value}, vary {layer.rough.vary}, bounds {layer.rough.bounds}')
|
|
57
|
+
print(f'SLD: value {layer.sld.real.value}, vary {layer.sld.real.vary}, bounds {layer.sld.real.bounds}')
|
|
58
|
+
|
|
59
|
+
refnx_structure = reduce(or_, layer_objects)
|
|
60
|
+
|
|
61
|
+
return refnx_structure
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
###Example usage:
|
|
65
|
+
# refnx_structure = covert_reflectorch_prediction_to_refnx_structure(inference_model, pred_params_object, prior_bounds)
|
|
66
|
+
|
|
67
|
+
# refnx_reflect_model = ReflectModel(refnx_structure, bkg=1e-10, dq=0.0)
|
|
68
|
+
# refnx_reflect_model.scale.setp(bounds=(0.8, 1.2), vary=True)
|
|
69
|
+
# refnx_reflect_model.q_offset.setp(bounds=(-0.01, 0.01), vary=True)
|
|
70
|
+
# refnx_reflect_model.bkg.setp(bounds=(1e-10, 1e-8), vary=True)
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
# data = Data1D(data=(q_model, exp_curve_interp))
|
|
74
|
+
|
|
75
|
+
# refnx_objective = Objective(refnx_reflect_model, data, transform=Transform("logY"))
|
|
76
|
+
# fitter = CurveFitter(refnx_objective)
|
|
77
77
|
# fitter.fit('least_squares')
|
|
@@ -1,24 +1,28 @@
|
|
|
1
|
-
from reflectorch.inference.inference_model import InferenceModel, EasyInferenceModel
|
|
2
|
-
from reflectorch.inference.query_matcher import HuggingfaceQueryMatcher
|
|
3
|
-
from reflectorch.inference.multilayer_inference_model import MultilayerInferenceModel
|
|
4
|
-
from reflectorch.inference.preprocess_exp import (
|
|
5
|
-
StandardPreprocessing,
|
|
6
|
-
standard_preprocessing,
|
|
7
|
-
interp_reflectivity,
|
|
8
|
-
apply_attenuation_correction,
|
|
9
|
-
apply_footprint_correction,
|
|
10
|
-
)
|
|
11
|
-
from reflectorch.inference.torch_fitter import ReflGradientFit
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
"
|
|
16
|
-
"
|
|
17
|
-
"
|
|
18
|
-
"
|
|
19
|
-
"
|
|
20
|
-
"
|
|
21
|
-
"
|
|
22
|
-
"
|
|
23
|
-
"
|
|
24
|
-
|
|
1
|
+
from reflectorch.inference.inference_model import InferenceModel, EasyInferenceModel
|
|
2
|
+
from reflectorch.inference.query_matcher import HuggingfaceQueryMatcher
|
|
3
|
+
from reflectorch.inference.multilayer_inference_model import MultilayerInferenceModel
|
|
4
|
+
from reflectorch.inference.preprocess_exp import (
|
|
5
|
+
StandardPreprocessing,
|
|
6
|
+
standard_preprocessing,
|
|
7
|
+
interp_reflectivity,
|
|
8
|
+
apply_attenuation_correction,
|
|
9
|
+
apply_footprint_correction,
|
|
10
|
+
)
|
|
11
|
+
from reflectorch.inference.torch_fitter import ReflGradientFit
|
|
12
|
+
from reflectorch.inference.input_interface import Layer, Backing, Structure
|
|
13
|
+
|
|
14
|
+
__all__ = [
|
|
15
|
+
"InferenceModel",
|
|
16
|
+
"EasyInferenceModel",
|
|
17
|
+
"MultilayerInferenceModel",
|
|
18
|
+
"HuggingfaceQueryMatcher",
|
|
19
|
+
"StandardPreprocessing",
|
|
20
|
+
"standard_preprocessing",
|
|
21
|
+
"ReflGradientFit",
|
|
22
|
+
"Layer",
|
|
23
|
+
"Backing",
|
|
24
|
+
"Structure",
|
|
25
|
+
"interp_reflectivity",
|
|
26
|
+
"apply_attenuation_correction",
|
|
27
|
+
"apply_footprint_correction",
|
|
28
|
+
]
|