Skip to content

Commit bafcaee

Browse files
committed
update controller to pty-chi 1.0 api
1 parent ba2b647 commit bafcaee

File tree

9 files changed

+312
-51
lines changed

9 files changed

+312
-51
lines changed

pyproject.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ globus = ["gladier", "gladier-tools>=0.5.4"]
3131
gui = ["PyQt5"]
3232
ptychonn = ["ptychonn==0.3.*,>=0.3.7"]
3333
tike = ["tike==0.25.*,>=0.25.3"]
34+
ptychi = ["ptychi==1.*"]
3435

3536
[tool.setuptools.package-data]
3637
"ptychodus" = ["py.typed"]

src/ptychodus/controller/ptychi/core.py

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ def __init__(
4343

4444
# FIXME verify tooltips
4545
self._reconstructor_view_controller = PtyChiReconstructorViewController(
46-
model.reconstructor_settings,
46+
model.settings,
4747
autodiff_settings,
4848
dm_settings,
4949
lsqml_settings,
@@ -55,23 +55,24 @@ def __init__(
5555
dm_settings,
5656
lsqml_settings,
5757
pie_settings,
58-
model.reconstructor_settings.num_epochs,
58+
model.settings.num_epochs,
5959
model.enumerators,
6060
)
6161
self._probe_view_controller = PtyChiProbeViewController(
6262
model.probe_settings,
63+
dm_settings,
6364
lsqml_settings,
6465
pie_settings,
65-
model.reconstructor_settings.num_epochs,
66+
model.settings.num_epochs,
6667
model.enumerators,
6768
)
6869
self._probe_positions_view_controller = PtyChiProbePositionsViewController(
6970
model.probe_position_settings,
70-
model.reconstructor_settings.num_epochs,
71+
model.settings.num_epochs,
7172
model.enumerators,
7273
)
7374
self._opr_view_controller = PtyChiOPRViewController(
74-
model.opr_settings, model.reconstructor_settings.num_epochs, model.enumerators
75+
model.opr_settings, model.settings.num_epochs, model.enumerators
7576
)
7677

7778
layout = QVBoxLayout()

src/ptychodus/controller/ptychi/object.py

Lines changed: 136 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,43 @@
2828
__all__ = ['PtyChiObjectViewController']
2929

3030

31+
class PtyChiOptimizeSliceSpacingViewController(CheckableGroupBoxParameterViewController):
32+
def __init__(
33+
self,
34+
optimize_slice_spacing: BooleanParameter,
35+
start: IntegerParameter,
36+
stop: IntegerParameter,
37+
stride: IntegerParameter,
38+
optimizer: StringParameter,
39+
step_size: RealParameter,
40+
num_epochs: IntegerParameter,
41+
enumerators: PtyChiEnumerators,
42+
) -> None:
43+
super().__init__(
44+
optimize_slice_spacing,
45+
'Optimize Slice Spacing',
46+
tool_tip='Whether to optimize the slice spacing.',
47+
)
48+
self._plan_view_controller = PtyChiOptimizationPlanViewController(
49+
start,
50+
stop,
51+
stride,
52+
num_epochs,
53+
)
54+
self._optimizer_view_controller = PtyChiOptimizerParameterViewController(
55+
optimizer, enumerators
56+
)
57+
self._step_size_view_controller = DecimalLineEditParameterViewController(
58+
step_size, tool_tip='Optimizer step size'
59+
)
60+
61+
layout = QFormLayout()
62+
layout.addRow('Plan:', self._plan_view_controller.get_widget())
63+
layout.addRow('Optimizer:', self._optimizer_view_controller.get_widget())
64+
layout.addRow('Step Size:', self._step_size_view_controller.get_widget())
65+
self.get_widget().setLayout(layout)
66+
67+
3168
class PtyChiConstrainL1NormViewController(CheckableGroupBoxParameterViewController):
3269
def __init__(
3370
self,
@@ -57,6 +94,35 @@ def __init__(
5794
self.get_widget().setLayout(layout)
5895

5996

97+
class PtyChiConstrainL2NormViewController(CheckableGroupBoxParameterViewController):
98+
def __init__(
99+
self,
100+
constrain_l2_norm: BooleanParameter,
101+
start: IntegerParameter,
102+
stop: IntegerParameter,
103+
stride: IntegerParameter,
104+
weight: RealParameter,
105+
num_epochs: IntegerParameter,
106+
) -> None:
107+
super().__init__(
108+
constrain_l2_norm,
109+
'Constrain L\u2082 Norm',
110+
tool_tip='Whether to constrain the L\u2082 norm.',
111+
)
112+
self._plan_view_controller = PtyChiOptimizationPlanViewController(
113+
start, stop, stride, num_epochs
114+
)
115+
self._weight_view_controller = DecimalLineEditParameterViewController(
116+
weight,
117+
tool_tip='Weight of the L\u2082 norm constraint.',
118+
)
119+
120+
layout = QFormLayout()
121+
layout.addRow('Plan:', self._plan_view_controller.get_widget())
122+
layout.addRow('Weight:', self._weight_view_controller.get_widget())
123+
self.get_widget().setLayout(layout)
124+
125+
60126
class PtyChiConstrainSmoothnessViewController(CheckableGroupBoxParameterViewController):
61127
def __init__(
62128
self,
@@ -209,6 +275,29 @@ def __init__(
209275
self.get_widget().setLayout(layout)
210276

211277

278+
class PtyChiRemoveObjectProbeAmbiguityViewController(CheckableGroupBoxParameterViewController):
279+
def __init__(
280+
self,
281+
remove_object_probe_ambiguity: BooleanParameter,
282+
start: IntegerParameter,
283+
stop: IntegerParameter,
284+
stride: IntegerParameter,
285+
num_epochs: IntegerParameter,
286+
) -> None:
287+
super().__init__(
288+
remove_object_probe_ambiguity,
289+
'Remove Object Probe Ambiguity',
290+
tool_tip='Whether to remove object-probe ambiguity.',
291+
)
292+
self._plan_view_controller = PtyChiOptimizationPlanViewController(
293+
start, stop, stride, num_epochs
294+
)
295+
296+
layout = QFormLayout()
297+
layout.addRow('Plan:', self._plan_view_controller.get_widget())
298+
self.get_widget().setLayout(layout)
299+
300+
212301
class PtyChiObjectViewController(CheckableGroupBoxParameterViewController):
213302
def __init__(
214303
self,
@@ -236,10 +325,15 @@ def __init__(
236325
self._step_size_view_controller = DecimalLineEditParameterViewController(
237326
settings.step_size, tool_tip='Optimizer step size'
238327
)
239-
self._patch_interpolator_view_controller = ComboBoxParameterViewController(
240-
settings.patch_interpolator,
241-
enumerators.patch_interpolation_methods(),
242-
tool_tip='Interpolation method used for extracting and updating patches of the object.',
328+
self._optimize_slice_spacing_view_controller = PtyChiOptimizeSliceSpacingViewController(
329+
settings.optimize_slice_spacing,
330+
settings.optimize_slice_spacing_start,
331+
settings.optimize_slice_spacing_stop,
332+
settings.optimize_slice_spacing_stride,
333+
settings.optimize_slice_spacing_optimizer,
334+
settings.optimize_slice_spacing_step_size,
335+
num_epochs,
336+
enumerators,
243337
)
244338
self._constrain_l1_norm_view_controller = PtyChiConstrainL1NormViewController(
245339
settings.constrain_l1_norm,
@@ -249,6 +343,14 @@ def __init__(
249343
settings.constrain_l1_norm_weight,
250344
num_epochs,
251345
)
346+
self._constrain_l2_norm_view_controller = PtyChiConstrainL2NormViewController(
347+
settings.constrain_l2_norm,
348+
settings.constrain_l2_norm_start,
349+
settings.constrain_l2_norm_stop,
350+
settings.constrain_l2_norm_stride,
351+
settings.constrain_l2_norm_weight,
352+
num_epochs,
353+
)
252354
self._constrain_smoothness_view_controller = PtyChiConstrainSmoothnessViewController(
253355
settings.constrain_smoothness,
254356
settings.constrain_smoothness_start,
@@ -291,17 +393,40 @@ def __init__(
291393
num_epochs,
292394
enumerators,
293395
)
396+
self._patch_interpolator_view_controller = ComboBoxParameterViewController(
397+
settings.patch_interpolator,
398+
enumerators.patch_interpolation_methods(),
399+
tool_tip='Interpolation method used for extracting and updating patches of the object.',
400+
)
401+
self._remove_object_probe_ambiguity_view_controller = (
402+
PtyChiRemoveObjectProbeAmbiguityViewController(
403+
settings.remove_object_probe_ambiguity,
404+
settings.remove_object_probe_ambiguity_start,
405+
settings.remove_object_probe_ambiguity_stop,
406+
settings.remove_object_probe_ambiguity_stride,
407+
num_epochs,
408+
)
409+
)
410+
self._build_preconditioner_with_all_modes_view_controller = CheckBoxParameterViewController(
411+
settings.build_preconditioner_with_all_modes,
412+
'Build Preconditioner with All Modes',
413+
tool_tip='Whether to build the preconditioner using all modes.',
414+
)
294415

295416
layout = QFormLayout()
296417
layout.addRow('Plan:', self._optimization_plan_view_controller.get_widget())
297418
layout.addRow('Optimizer:', self._optimizer_view_controller.get_widget())
298419
layout.addRow('Step Size:', self._step_size_view_controller.get_widget())
299-
layout.addRow('Patch Interpolator:', self._patch_interpolator_view_controller.get_widget())
420+
layout.addRow(self._optimize_slice_spacing_view_controller.get_widget())
300421
layout.addRow(self._constrain_l1_norm_view_controller.get_widget())
422+
layout.addRow(self._constrain_l2_norm_view_controller.get_widget())
301423
layout.addRow(self._constrain_smoothness_view_controller.get_widget())
302424
layout.addRow(self._constrain_total_variation_view_controller.get_widget())
303425
layout.addRow(self._remove_grid_artifacts_view_controller.get_widget())
304426
layout.addRow(self._regularize_multislice_view_controller.get_widget())
427+
layout.addRow('Patch Interpolator:', self._patch_interpolator_view_controller.get_widget())
428+
layout.addRow(self._remove_object_probe_ambiguity_view_controller.get_widget())
429+
layout.addRow(self._build_preconditioner_with_all_modes_view_controller.get_widget())
305430

306431
if dm_settings is not None:
307432
self._amplitude_clamp_limit_view_controller = DecimalLineEditParameterViewController(
@@ -312,6 +437,12 @@ def __init__(
312437
'Amplitude Clamp Limit:', self._amplitude_clamp_limit_view_controller.get_widget()
313438
)
314439

440+
self._inertia_view_controller = DecimalLineEditParameterViewController(
441+
dm_settings.object_inertia,
442+
tool_tip='Inertia for the object update.',
443+
)
444+
layout.addRow('Inertia:', self._inertia_view_controller.get_widget())
445+
315446
if lsqml_settings is not None:
316447
self._object_optimal_step_size_scaler_view_controller = (
317448
DecimalLineEditParameterViewController(

src/ptychodus/controller/ptychi/opr.py

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -77,16 +77,16 @@ def __init__(
7777
self._step_size_view_controller = DecimalLineEditParameterViewController(
7878
settings.step_size, tool_tip='Optimizer step size'
7979
)
80-
self._optimize_intensities_view_controller = CheckBoxParameterViewController(
81-
settings.optimize_intensities,
82-
'Optimize Intensities',
83-
tool_tip='Whether to optimize intensity variation (i.e., the weight of the first OPR mode).',
84-
)
8580
self._optimize_eigenmode_weights_view_controller = CheckBoxParameterViewController(
8681
settings.optimize_eigenmode_weights,
8782
'Optimize Eigenmode Weights',
8883
tool_tip='Whether to optimize eigenmode weights (i.e., the weights of the second and following OPR modes).',
8984
)
85+
self._optimize_intensities_view_controller = CheckBoxParameterViewController(
86+
settings.optimize_intensities,
87+
'Optimize Intensities',
88+
tool_tip='Whether to optimize intensity variation (i.e., the weight of the first OPR mode).',
89+
)
9090
self._smooth_mode_weights_view_controller = PtyChiSmoothOPRModeWeightsViewController(
9191
settings.smooth_mode_weights,
9292
settings.smooth_mode_weights_start,
@@ -109,4 +109,5 @@ def __init__(
109109
layout.addRow(self._optimize_intensities_view_controller.get_widget())
110110
layout.addRow(self._optimize_eigenmode_weights_view_controller.get_widget())
111111
layout.addRow(self._smooth_mode_weights_view_controller.get_widget())
112+
layout.addRow('Relax Update:', self._relax_update_view_controller.get_widget())
112113
self.get_widget().setLayout(layout)

src/ptychodus/controller/ptychi/positions.py

Lines changed: 83 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,53 @@ def _update(self, observable: Observable) -> None:
6565
self._sync_model_to_view()
6666

6767

68+
class PtyChiConstrainAffineTransformViewController(CheckableGroupBoxParameterViewController):
69+
def __init__(
70+
self,
71+
is_optimizable: BooleanParameter,
72+
start: IntegerParameter,
73+
stop: IntegerParameter,
74+
stride: IntegerParameter,
75+
degrees_of_freedom: IntegerParameter,
76+
position_weight_update_interval: IntegerParameter,
77+
apply_constraint: BooleanParameter,
78+
max_expected_error_px: RealParameter,
79+
num_epochs: IntegerParameter,
80+
) -> None:
81+
super().__init__(
82+
is_optimizable,
83+
'Constrain Affine Transform',
84+
tool_tip='Constrain the affine transform during position correction.',
85+
)
86+
self._plan_view_controller = PtyChiOptimizationPlanViewController(
87+
start, stop, stride, num_epochs
88+
)
89+
# FIXME affine degrees of freedom: checkable combo box?
90+
self._position_weight_update_interval_view_controller = SpinBoxParameterViewController(
91+
position_weight_update_interval,
92+
tool_tip='Interval for updating the position weight.',
93+
)
94+
self._apply_constraint_view_controller = CheckBoxParameterViewController(
95+
apply_constraint, 'Apply Constraint', tool_tip='Whether to apply the constraint.'
96+
)
97+
self._max_expected_error_px_view_controller = DecimalLineEditParameterViewController(
98+
max_expected_error_px, tool_tip='Maximum expected error in pixels.'
99+
)
100+
101+
layout = QFormLayout()
102+
layout.addRow('Plan:', self._plan_view_controller.get_widget())
103+
# FIXE layout.addRow('Degrees of Freedom:', self._degrees_of_freedom_view_controller.get_widget())
104+
layout.addRow(
105+
'Position Weight Update Interval:',
106+
self._position_weight_update_interval_view_controller.get_widget(),
107+
)
108+
layout.addRow(self._apply_constraint_view_controller.get_widget())
109+
layout.addRow(
110+
'Max Expected Error [px]:', self._max_expected_error_px_view_controller.get_widget()
111+
)
112+
self.get_widget().setLayout(layout)
113+
114+
68115
class PtyChiProbePositionsViewController(CheckableGroupBoxParameterViewController):
69116
def __init__(
70117
self,
@@ -89,28 +136,57 @@ def __init__(
89136
self._step_size_view_controller = DecimalLineEditParameterViewController(
90137
settings.step_size, tool_tip='Optimizer step size'
91138
)
92-
self._algorithm_view_controller = ComboBoxParameterViewController(
139+
self._constrain_centroid_view_controller = CheckBoxParameterViewController(
140+
settings.constrain_centroid,
141+
'Constrain Centroid',
142+
tool_tip='Whether to subtract the mean from positions after updating positions.',
143+
)
144+
self._correction_type_view_controller = ComboBoxParameterViewController(
93145
settings.correction_type,
94146
enumerators.position_correction_types(),
95147
tool_tip='Algorithm used to calculate the position correction update.',
96148
)
149+
self._differentiation_method_view_controller = ComboBoxParameterViewController(
150+
settings.differentiation_method,
151+
enumerators.image_gradient_methods(),
152+
tool_tip='Method for calculating the object gradient.',
153+
)
97154
self._cross_correlation_view_controller = PtyChiCrossCorrelationViewController(
98155
settings.correction_type,
99156
settings.cross_correlation_scale,
100157
settings.cross_correlation_real_space_width,
101158
settings.cross_correlation_probe_threshold,
102159
)
103-
self._constrain_centroid_view_controller = CheckBoxParameterViewController(
104-
settings.constrain_centroid,
105-
'Constrain Centroid',
106-
tool_tip='Whether to subtract the mean from positions after updating positions.',
160+
self._update_magnitude_limit_view_controller = DecimalLineEditParameterViewController(
161+
settings.update_magnitude_limit,
162+
tool_tip='Maximum allowed magnitude of position update in each axis.',
163+
) # FIXME verify inf is handled correctly
164+
self._constrain_affine_transform_view_controller = (
165+
PtyChiConstrainAffineTransformViewController(
166+
settings.constrain_affine_transform,
167+
settings.constrain_affine_transform_start,
168+
settings.constrain_affine_transform_stop,
169+
settings.constrain_affine_transform_stride,
170+
settings.constrain_affine_transform_degrees_of_freedom,
171+
settings.constrain_affine_transform_position_weight_update_interval,
172+
settings.constrain_affine_transform_apply_constraint,
173+
settings.constrain_affine_transform_max_expected_error_px,
174+
num_epochs,
175+
)
107176
)
108177

109178
layout = QFormLayout()
110179
layout.addRow('Plan:', self._optimization_plan_view_controller.get_widget())
111180
layout.addRow('Optimizer:', self._optimizer_view_controller.get_widget())
112181
layout.addRow('Step Size:', self._step_size_view_controller.get_widget())
113-
layout.addRow('Algorithm:', self._algorithm_view_controller.get_widget())
114-
layout.addRow(self._cross_correlation_view_controller.get_widget())
115182
layout.addRow(self._constrain_centroid_view_controller.get_widget())
183+
layout.addRow('Correction Type:', self._correction_type_view_controller.get_widget())
184+
layout.addRow(
185+
'Differentiation Method:', self._differentiation_method_view_controller.get_widget()
186+
)
187+
layout.addRow(self._cross_correlation_view_controller.get_widget())
188+
layout.addRow(
189+
'Update Magnitude Limit:', self._update_magnitude_limit_view_controller.get_widget()
190+
)
191+
layout.addRow(self._constrain_affine_transform_view_controller.get_widget())
116192
self.get_widget().setLayout(layout)

0 commit comments

Comments
 (0)