From 66bab9f73f688df0796c6ea69112f78a2ca3c3bc Mon Sep 17 00:00:00 2001 From: henrikjacobsenfys Date: Mon, 22 Jun 2026 12:00:08 +0200 Subject: [PATCH 1/2] Standardize repr strings --- src/easydynamics/analysis/analysis.py | 8 ++ src/easydynamics/analysis/analysis1d.py | 8 ++ src/easydynamics/analysis/analysis_base.py | 5 +- src/easydynamics/analysis/fit_binding.py | 11 +-- .../analysis/parameter_analysis.py | 11 ++- .../convolution/analytical_convolution.py | 9 +++ src/easydynamics/convolution/convolution.py | 10 +++ .../convolution/numerical_convolution.py | 10 +++ .../convolution/numerical_convolution_base.py | 80 +++++++++++-------- .../sample_model/background_model.py | 9 +++ .../sample_model/component_collection.py | 5 +- .../components/damped_harmonic_oscillator.py | 11 +-- .../sample_model/components/delta_function.py | 9 ++- .../sample_model/components/exponential.py | 11 +-- .../components/expression_component.py | 7 +- .../sample_model/components/gaussian.py | 11 +-- .../sample_model/components/lorentzian.py | 11 +-- .../components/model_component.py | 2 +- .../sample_model/components/polynomial.py | 7 +- .../sample_model/components/voigt.py | 11 +-- .../brownian_translational_diffusion.py | 6 +- .../diffusion_model/delta_lorentz.py | 10 +-- .../diffusion_model/diffusion_model_base.py | 5 +- .../jump_translational_diffusion.py | 5 +- .../sample_model/instrument_model.py | 3 +- src/easydynamics/sample_model/model_base.py | 7 +- .../sample_model/resolution_model.py | 9 +++ src/easydynamics/sample_model/sample_model.py | 11 +-- .../analysis/test_analysis_base.py | 2 +- .../easydynamics/analysis/test_fit_binding.py | 4 +- .../analysis/test_parameter_analysis.py | 4 +- .../test_numerical_convolution_base.py | 2 +- .../test_damped_harmonic_oscillator.py | 10 +-- .../components/test_delta_function.py | 8 +- .../components/test_exponential.py | 10 +-- .../sample_model/components/test_gaussian.py | 10 +-- .../components/test_lorentzian.py | 10 +-- .../components/test_polynomial.py | 4 +- .../sample_model/components/test_voigt.py | 12 +-- .../sample_model/test_model_base.py | 4 +- .../sample_model/test_sample_model.py | 2 +- 41 files changed, 237 insertions(+), 147 deletions(-) diff --git a/src/easydynamics/analysis/analysis.py b/src/easydynamics/analysis/analysis.py index 665f28f8..96be529a 100644 --- a/src/easydynamics/analysis/analysis.py +++ b/src/easydynamics/analysis/analysis.py @@ -818,3 +818,11 @@ def _create_components_dataset( ############# # Dunder methods ############# + + def __repr__(self) -> str: + return ( + f'{self.__class__.__name__}(' + f'display_name={self.display_name!r}, ' + f'unique_name={self.unique_name!r}, ' + f'n_analyses={len(self._analysis_list)})' + ) diff --git a/src/easydynamics/analysis/analysis1d.py b/src/easydynamics/analysis/analysis1d.py index 3739bc68..a11ed1ff 100644 --- a/src/easydynamics/analysis/analysis1d.py +++ b/src/easydynamics/analysis/analysis1d.py @@ -814,3 +814,11 @@ def _to_scipp_array( 'Q': self.Q[self.Q_index], }, ) + + def __repr__(self) -> str: + return ( + f'{self.__class__.__name__}(' + f'display_name={self.display_name!r}, ' + f'unique_name={self.unique_name!r}, ' + f'Q_index={self._Q_index})' + ) diff --git a/src/easydynamics/analysis/analysis_base.py b/src/easydynamics/analysis/analysis_base.py index 8e19a90d..598daea6 100644 --- a/src/easydynamics/analysis/analysis_base.py +++ b/src/easydynamics/analysis/analysis_base.py @@ -654,6 +654,7 @@ def __repr__(self) -> str: A string representation of the Analysis. """ return ( - f'{self.__class__.__name__} (display_name={self.display_name}, ' - f'unique_name={self.unique_name})' + f'{self.__class__.__name__}(' + f'display_name={self.display_name!r}, ' + f'unique_name={self.unique_name!r})' ) diff --git a/src/easydynamics/analysis/fit_binding.py b/src/easydynamics/analysis/fit_binding.py index cbd108dc..b7b95101 100644 --- a/src/easydynamics/analysis/fit_binding.py +++ b/src/easydynamics/analysis/fit_binding.py @@ -327,9 +327,10 @@ def __repr__(self) -> str: A string representation of the FitBinding. """ return ( - f'FitBinding(parameter_name={self.parameter_name},\n ' - f'model={self.model.display_name},\n ' - f'modes={self.modes},\n ' - f'display_name={self.display_name},\n ' - f'unique_name={self.unique_name})' + f'{self.__class__.__name__}(' + f'parameter_name={self.parameter_name!r},\n' + f' model={self.model.display_name!r},\n' + f' modes={self.modes},\n' + f' display_name={self.display_name!r},\n' + f' unique_name={self.unique_name!r})' ) diff --git a/src/easydynamics/analysis/parameter_analysis.py b/src/easydynamics/analysis/parameter_analysis.py index 2283ba83..aabd0647 100644 --- a/src/easydynamics/analysis/parameter_analysis.py +++ b/src/easydynamics/analysis/parameter_analysis.py @@ -556,10 +556,9 @@ def __repr__(self) -> str: return ( f'{cls}(\n' - f'display_name={self.display_name},\n' - f'unique_name={self.unique_name},\n' - f'n_parameters={n_params},\n' - f'parameter_names={param_names},\n' - f'bindings={binding_info}\n' - f')' + f' display_name={self.display_name!r},\n' + f' unique_name={self.unique_name!r},\n' + f' n_parameters={n_params},\n' + f' parameter_names={param_names},\n' + f' bindings={binding_info})' ) diff --git a/src/easydynamics/convolution/analytical_convolution.py b/src/easydynamics/convolution/analytical_convolution.py index dc07a26f..535bea98 100644 --- a/src/easydynamics/convolution/analytical_convolution.py +++ b/src/easydynamics/convolution/analytical_convolution.py @@ -485,3 +485,12 @@ def _voigt_eval( return area * voigt_profile( self.energy_with_offset.values - center, gaussian_width, lorentzian_width ) + + def __repr__(self) -> str: + return ( + f'{self.__class__.__name__}(' + f'display_name={self.display_name!r}, ' + f'unique_name={self.unique_name!r}, ' + f'unit={self._unit}, ' + f'energy_len={len(self.energy)})' + ) diff --git a/src/easydynamics/convolution/convolution.py b/src/easydynamics/convolution/convolution.py index d2151e42..4ec2a300 100644 --- a/src/easydynamics/convolution/convolution.py +++ b/src/easydynamics/convolution/convolution.py @@ -303,3 +303,13 @@ def __setattr__(self, name: str, value: any) -> None: # avoid issues during __init__ if getattr(self, '_reactions_enabled', False) and name in self._invalidate_plan_on_change: self.convolution_settings.convolution_plan_is_valid = False + + def __repr__(self) -> str: + return ( + f'{self.__class__.__name__}(' + f'display_name={self.display_name!r}, ' + f'unique_name={self.unique_name!r}, ' + f'unit={self.unit}, ' + f'energy_len={len(self.energy)}, ' + f'temperature={self.temperature})' + ) diff --git a/src/easydynamics/convolution/numerical_convolution.py b/src/easydynamics/convolution/numerical_convolution.py index 7deac048..e0ddde05 100644 --- a/src/easydynamics/convolution/numerical_convolution.py +++ b/src/easydynamics/convolution/numerical_convolution.py @@ -84,3 +84,13 @@ def convolution( ) return convolved + + def __repr__(self) -> str: + return ( + f'{self.__class__.__name__}(' + f'display_name={self.display_name!r}, ' + f'unique_name={self.unique_name!r}, ' + f'unit={self.unit}, ' + f'energy_len={len(self.energy)}, ' + f'temperature={self.temperature})' + ) diff --git a/src/easydynamics/convolution/numerical_convolution_base.py b/src/easydynamics/convolution/numerical_convolution_base.py index da17cae8..3f6599b5 100644 --- a/src/easydynamics/convolution/numerical_convolution_base.py +++ b/src/easydynamics/convolution/numerical_convolution_base.py @@ -41,10 +41,10 @@ def __init__( energy_offset: Numeric | Parameter = 0.0, convolution_settings: ConvolutionSettings | None = None, temperature: Parameter | Numeric | None = None, - temperature_unit: str | sc.Unit = 'K', + temperature_unit: str | sc.Unit = "K", detailed_balance_settings: DetailedBalanceSettings | None = None, - unit: str | sc.Unit = 'meV', - display_name: str | None = 'MyConvolution', + unit: str | sc.Unit = "meV", + display_name: str | None = "MyConvolution", unique_name: str | None = None, ) -> None: """ @@ -91,11 +91,13 @@ def __init__( unique_name=unique_name, ) - if temperature is not None and not isinstance(temperature, (Numeric, Parameter)): - raise TypeError('Temperature must be None, a number or a Parameter.') + if temperature is not None and not isinstance( + temperature, (Numeric, Parameter) + ): + raise TypeError("Temperature must be None, a number or a Parameter.") if not isinstance(temperature_unit, (str, sc.Unit)): - raise TypeError('Temperature_unit must be a string or sc.Unit.') + raise TypeError("Temperature_unit must be a string or sc.Unit.") self._temperature_unit = temperature_unit self._temperature = None self.temperature = temperature @@ -108,7 +110,7 @@ def __init__( detailed_balance_settings = DetailedBalanceSettings() if not isinstance(detailed_balance_settings, DetailedBalanceSettings): raise TypeError( - 'detailed_balance_settings must be a DetailedBalanceSettings instance.' + "detailed_balance_settings must be a DetailedBalanceSettings instance." ) self._detailed_balance_settings = detailed_balance_settings @@ -147,7 +149,7 @@ def convolution_settings(self, settings: ConvolutionSettings) -> None: If settings is not a ConvolutionSettings instance. """ if not isinstance(settings, ConvolutionSettings): - raise TypeError('settings must be a ConvolutionSettings instance.') + raise TypeError("settings must be a ConvolutionSettings instance.") self._convolution_settings = settings self._convolution_settings.convolution_plan_is_valid = False @@ -259,7 +261,7 @@ def temperature(self, temp: Parameter | Numeric | None) -> None: self._temperature.value = float(temp) else: self._temperature = Parameter( - name='temperature', + name="temperature", value=float(temp), unit=self._temperature_unit, fixed=True, @@ -267,7 +269,7 @@ def temperature(self, temp: Parameter | Numeric | None) -> None: elif isinstance(temp, Parameter): self._temperature = temp else: - raise TypeError('Temperature must be None, a float or a Parameter.') + raise TypeError("Temperature must be None, a float or a Parameter.") @property def detailed_balance_settings(self) -> DetailedBalanceSettings: @@ -297,7 +299,9 @@ def detailed_balance_settings(self, value: DetailedBalanceSettings) -> None: If value is not a DetailedBalanceSettings. """ if not isinstance(value, DetailedBalanceSettings): - raise TypeError('detailed_balance_settings must be a DetailedBalanceSettings') + raise TypeError( + "detailed_balance_settings must be a DetailedBalanceSettings" + ) self._detailed_balance_settings = value def _create_energy_grid( @@ -326,7 +330,7 @@ def _create_energy_grid( is_uniform = np.allclose(energy_diff, energy_diff[0]) if not is_uniform: raise ValueError( - 'Input array `energy` must be uniformly spaced if upsample_factor is not given.' # noqa: E501 + "Input array `energy` must be uniformly spaced if upsample_factor is not given." # noqa: E501 ) energy_dense = self.energy.values @@ -343,7 +347,7 @@ def _create_energy_grid( energy_span_dense = extended_max - extended_min if len(energy_dense) < 2: - raise ValueError('Energy array must have at least two points.') + raise ValueError("Energy array must have at least two points.") energy_dense_step = energy_dense[1] - energy_dense[0] # Handle offset for even length of energy_dense in convolution. @@ -356,7 +360,9 @@ def _create_energy_grid( # select the 4 central points we either get # indices [2,3,4,5] or [1,2,3,4], both of which are offset by # 0.5*dx from the true center at index 3.5. - energy_even_length_offset = -0.5 * energy_dense_step if len(energy_dense) % 2 == 0 else 0.0 + energy_even_length_offset = ( + -0.5 * energy_dense_step if len(energy_dense) % 2 == 0 else 0.0 + ) # Handle the case when energy_dense is not symmetric around 0. # The resolution is still centered around zero (or close to it), @@ -400,27 +406,33 @@ def _check_width_thresholds( components = model if isinstance(model, ComponentCollection) else [model] for comp in components: - if hasattr(comp, 'width'): - if comp.width.value > LARGE_WIDTH_THRESHOLD * self._energy_grid.energy_span_dense: + if hasattr(comp, "width"): + if ( + comp.width.value + > LARGE_WIDTH_THRESHOLD * self._energy_grid.energy_span_dense + ): warnings.warn( ( f"The width of the {model_name} component '{comp.unique_name}' " - f'({comp.width.value}) is large compared to the span of the input ' - f'array ({self._energy_grid.energy_span_dense}). ' - f'This may lead to inaccuracies in the convolution. ' - f'Increase extension_factor to improve accuracy.' + f"({comp.width.value}) is large compared to the span of the input " + f"array ({self._energy_grid.energy_span_dense}). " + f"This may lead to inaccuracies in the convolution. " + f"Increase extension_factor to improve accuracy." ), UserWarning, stacklevel=3, ) - if comp.width.value < SMALL_WIDTH_THRESHOLD * self._energy_grid.energy_dense_step: + if ( + comp.width.value + < SMALL_WIDTH_THRESHOLD * self._energy_grid.energy_dense_step + ): warnings.warn( ( f"The width of the {model_name} component '{comp.unique_name}' " - f'({comp.width.value}) is small compared to the spacing of the input ' - f'array ({self._energy_grid.energy_dense_step}). ' - f'This may lead to inaccuracies in the convolution. ' - f'Increase upsample_factor to improve accuracy.' + f"({comp.width.value}) is small compared to the spacing of the input " + f"array ({self._energy_grid.energy_dense_step}). " + f"This may lead to inaccuracies in the convolution. " + f"Increase upsample_factor to improve accuracy." ), UserWarning, stacklevel=3, @@ -436,13 +448,13 @@ def __repr__(self) -> str: A string representation of the NumericalConvolutionBase. """ return ( - f'{self.__class__.__name__}(' - f'energy=array of shape {self.energy.values.shape},\n ' - f'sample_components={self.sample_components!r}, \n' - f'resolution_components={self.resolution_components!r},\n ' - f'unit={self.unit}, ' - f'upsample_factor={self.upsample_factor}, ' - f'extension_factor={self.extension_factor}, ' - f'temperature={self.temperature}, ' - f'detailed_balance={self.detailed_balance_settings!r})' + f"{self.__class__.__name__}(" + f" energy=array of shape {self.energy.values.shape},\n" + f" sample_components={self.sample_components!r},\n" + f" resolution_components={self.resolution_components!r},\n" + f" unit={self.unit}, " + f" upsample_factor={self.upsample_factor}, " + f" extension_factor={self.extension_factor}, " + f" temperature={self.temperature}, " + f" detailed_balance={self.detailed_balance_settings!r})" ) diff --git a/src/easydynamics/sample_model/background_model.py b/src/easydynamics/sample_model/background_model.py index bd403ea2..1169ecd4 100644 --- a/src/easydynamics/sample_model/background_model.py +++ b/src/easydynamics/sample_model/background_model.py @@ -46,3 +46,12 @@ def __init__( components=components, Q=Q, ) + + def __repr__(self) -> str: + return ( + f'{self.__class__.__name__}(' + f'unique_name={self.unique_name!r}, ' + f'unit={self.unit}, ' + f'Q_len={None if self._Q is None else len(self._Q)}, ' + f'components={self.components})' + ) diff --git a/src/easydynamics/sample_model/component_collection.py b/src/easydynamics/sample_model/component_collection.py index b556103a..5d2e9c59 100644 --- a/src/easydynamics/sample_model/component_collection.py +++ b/src/easydynamics/sample_model/component_collection.py @@ -376,8 +376,9 @@ def __repr__(self) -> str: comp_names = ', '.join(c.name for c in self) or 'No components' return ( - f"ComponentCollection(name='{self.name}', unit='{self.unit}', \n" - f'Components: {comp_names})' + f'{self.__class__.__name__}(' + f'name={self.name!r}, unit={self.unit},\n' + f' components=[{comp_names}])' ) def to_dict(self) -> dict: diff --git a/src/easydynamics/sample_model/components/damped_harmonic_oscillator.py b/src/easydynamics/sample_model/components/damped_harmonic_oscillator.py index e7ea9561..9c47ddb8 100644 --- a/src/easydynamics/sample_model/components/damped_harmonic_oscillator.py +++ b/src/easydynamics/sample_model/components/damped_harmonic_oscillator.py @@ -221,9 +221,10 @@ def __repr__(self) -> str: A string representation of the Damped Harmonic Oscillator. """ return ( - f'DampedHarmonicOscillator(name = {self.name}, display_name = {self.display_name}, ' - f'unit = {self._unit},\n ' - f' area = {self.area},\n ' - f' center = {self.center},\n ' - f' width = {self.width})' + f'{self.__class__.__name__}(' + f'name={self.name!r}, display_name={self.display_name!r}, ' + f'unit={self._unit},\n' + f' area={self.area},\n' + f' center={self.center},\n' + f' width={self.width})' ) diff --git a/src/easydynamics/sample_model/components/delta_function.py b/src/easydynamics/sample_model/components/delta_function.py index c10e6185..54682298 100644 --- a/src/easydynamics/sample_model/components/delta_function.py +++ b/src/easydynamics/sample_model/components/delta_function.py @@ -200,8 +200,9 @@ def __repr__(self) -> str: """ return ( - f'DeltaFunction(name = {self.name}, display_name = {self.display_name}, ' - f'unit = {self.unit},\n' - f' area = {self.area},\n' - f' center = {self.center})' + f'{self.__class__.__name__}(' + f'name={self.name!r}, display_name={self.display_name!r}, ' + f'unit={self.unit},\n' + f' area={self.area},\n' + f' center={self.center})' ) diff --git a/src/easydynamics/sample_model/components/exponential.py b/src/easydynamics/sample_model/components/exponential.py index 8894a065..d6eba37c 100644 --- a/src/easydynamics/sample_model/components/exponential.py +++ b/src/easydynamics/sample_model/components/exponential.py @@ -273,9 +273,10 @@ def __repr__(self) -> str: """ return ( - f'Exponential(name = {self.name}, display_name = {self.display_name}, ' - f'unit = {self._unit},\n ' - f' amplitude = {self.amplitude},\n ' - f' center = {self.center},\n ' - f' rate = {self.rate})' + f'{self.__class__.__name__}(' + f'name={self.name!r}, display_name={self.display_name!r}, ' + f'unit={self._unit},\n' + f' amplitude={self.amplitude},\n' + f' center={self.center},\n' + f' rate={self.rate})' ) diff --git a/src/easydynamics/sample_model/components/expression_component.py b/src/easydynamics/sample_model/components/expression_component.py index 5255a940..557fb802 100644 --- a/src/easydynamics/sample_model/components/expression_component.py +++ b/src/easydynamics/sample_model/components/expression_component.py @@ -370,8 +370,9 @@ def __repr__(self) -> str: """ param_str = ', '.join(f'{k}={v.value}' for k, v in self._parameters.items()) return ( - f'ExpressionComponent(name={self.name}, display_name={self.display_name}, ' + f'{self.__class__.__name__}(' + f'name={self.name!r}, display_name={self.display_name!r}, ' f'unit={self._unit},\n' - f" expr='{self._expression_str}',\n" - f' parameters={{ {param_str} }} )' + f' expr={self._expression_str!r},\n' + f' parameters={{{param_str}}})' ) diff --git a/src/easydynamics/sample_model/components/gaussian.py b/src/easydynamics/sample_model/components/gaussian.py index 8b7f824a..2ad609ed 100644 --- a/src/easydynamics/sample_model/components/gaussian.py +++ b/src/easydynamics/sample_model/components/gaussian.py @@ -229,9 +229,10 @@ def __repr__(self) -> str: """ return ( - f'Gaussian(name = {self.name}, display_name = {self.display_name}, ' - f'unit = {self._unit},\n' - f' area = {self.area},\n' - f' center = {self.center},\n' - f' width = {self.width})' + f'{self.__class__.__name__}(' + f'name={self.name!r}, display_name={self.display_name!r}, ' + f'unit={self._unit},\n' + f' area={self.area},\n' + f' center={self.center},\n' + f' width={self.width})' ) diff --git a/src/easydynamics/sample_model/components/lorentzian.py b/src/easydynamics/sample_model/components/lorentzian.py index 88051d16..d36fdd1b 100644 --- a/src/easydynamics/sample_model/components/lorentzian.py +++ b/src/easydynamics/sample_model/components/lorentzian.py @@ -220,9 +220,10 @@ def __repr__(self) -> str: A string representation of the Lorentzian. """ return ( - f'Lorentzian(name = {self.name}, display_name = {self.display_name}, ' - f'unit = {self._unit},\n' - f' area = {self.area},\n' - f' center = {self.center},\n' - f' width = {self.width})' + f'{self.__class__.__name__}(' + f'name={self.name!r}, display_name={self.display_name!r}, ' + f'unit={self._unit},\n' + f' area={self.area},\n' + f' center={self.center},\n' + f' width={self.width})' ) diff --git a/src/easydynamics/sample_model/components/model_component.py b/src/easydynamics/sample_model/components/model_component.py index 84c88453..878f501f 100644 --- a/src/easydynamics/sample_model/components/model_component.py +++ b/src/easydynamics/sample_model/components/model_component.py @@ -232,4 +232,4 @@ def __repr__(self) -> str: A string representation of the ModelComponent. """ - return f'{self.__class__.__name__}(unique_name={self.unique_name}, unit={self._unit})' + return f'{self.__class__.__name__}(unique_name={self.unique_name!r}, unit={self._unit})' diff --git a/src/easydynamics/sample_model/components/polynomial.py b/src/easydynamics/sample_model/components/polynomial.py index 03e7eae7..88e88fd4 100644 --- a/src/easydynamics/sample_model/components/polynomial.py +++ b/src/easydynamics/sample_model/components/polynomial.py @@ -272,7 +272,8 @@ def __repr__(self) -> str: coeffs_str = ', '.join(f'{param.name}={param.value}' for param in self._coefficients) return ( - f'Polynomial(name = {self.name}, display_name = {self.display_name}, ' - f'unit = {self._unit},\n' - f' coefficients = [{coeffs_str}])' + f'{self.__class__.__name__}(' + f'name={self.name!r}, display_name={self.display_name!r}, ' + f'unit={self._unit},\n' + f' coefficients=[{coeffs_str}])' ) diff --git a/src/easydynamics/sample_model/components/voigt.py b/src/easydynamics/sample_model/components/voigt.py index 5c5787b6..d8eccaea 100644 --- a/src/easydynamics/sample_model/components/voigt.py +++ b/src/easydynamics/sample_model/components/voigt.py @@ -265,9 +265,10 @@ def __repr__(self) -> str: """ return ( - f'Voigt(name = {self.name}, display_name = {self.display_name}, unit = {self._unit},\n' - f' area = {self.area},\n' - f' center = {self.center},\n' - f' gaussian_width = {self.gaussian_width},\n' - f' lorentzian_width = {self.lorentzian_width})' + f'{self.__class__.__name__}(' + f'name={self.name!r}, display_name={self.display_name!r}, unit={self._unit},\n' + f' area={self.area},\n' + f' center={self.center},\n' + f' gaussian_width={self.gaussian_width},\n' + f' lorentzian_width={self.lorentzian_width})' ) diff --git a/src/easydynamics/sample_model/diffusion_model/brownian_translational_diffusion.py b/src/easydynamics/sample_model/diffusion_model/brownian_translational_diffusion.py index 11f10b1b..e4aa1d39 100644 --- a/src/easydynamics/sample_model/diffusion_model/brownian_translational_diffusion.py +++ b/src/easydynamics/sample_model/diffusion_model/brownian_translational_diffusion.py @@ -380,8 +380,8 @@ def __repr__(self) -> str: String representation of the BrownianTranslationalDiffusion model. """ return ( - f'BrownianTranslationalDiffusion(name={self.name}, ' - f'display_name={self.display_name}, \n' - f' diffusion_coefficient={self.diffusion_coefficient}, \n' + f'{self.__class__.__name__}(' + f'name={self.name!r}, display_name={self.display_name!r},\n' + f' diffusion_coefficient={self.diffusion_coefficient},\n' f' scale={self.scale})' ) diff --git a/src/easydynamics/sample_model/diffusion_model/delta_lorentz.py b/src/easydynamics/sample_model/diffusion_model/delta_lorentz.py index 150015a7..567f4048 100644 --- a/src/easydynamics/sample_model/diffusion_model/delta_lorentz.py +++ b/src/easydynamics/sample_model/diffusion_model/delta_lorentz.py @@ -1072,10 +1072,10 @@ def __repr__(self) -> str: String representation of the DeltaLorentz model. """ return ( - f'DeltaLorentz(display_name={self.display_name},' - f'unit={self.unit}, \n' - f' mean_u_squared={self.mean_u_squared}, \n' - f' A_0={self.A_0}, A_1={self.A_1}, \n' - f' lorentzian_width={self.lorentzian_width}, \n' + f'{self.__class__.__name__}(' + f'display_name={self.display_name!r}, unit={self.unit},\n' + f' mean_u_squared={self.mean_u_squared},\n' + f' A_0={self.A_0}, A_1={self.A_1},\n' + f' lorentzian_width={self.lorentzian_width},\n' f' scale={self.scale})' ) diff --git a/src/easydynamics/sample_model/diffusion_model/diffusion_model_base.py b/src/easydynamics/sample_model/diffusion_model/diffusion_model_base.py index 1df008b2..7d752b82 100644 --- a/src/easydynamics/sample_model/diffusion_model/diffusion_model_base.py +++ b/src/easydynamics/sample_model/diffusion_model/diffusion_model_base.py @@ -538,7 +538,8 @@ def __repr__(self) -> str: String representation of the DiffusionModel. """ return ( - f'{self.__class__.__name__}(name={self.name}, display_name={self.display_name}, ' - f'unit={self.unit}), \n' + f'{self.__class__.__name__}(' + f'name={self.name!r}, display_name={self.display_name!r}, ' + f'unit={self.unit},\n' f' scale={self.scale})' ) diff --git a/src/easydynamics/sample_model/diffusion_model/jump_translational_diffusion.py b/src/easydynamics/sample_model/diffusion_model/jump_translational_diffusion.py index a8632272..2bf84d0b 100644 --- a/src/easydynamics/sample_model/diffusion_model/jump_translational_diffusion.py +++ b/src/easydynamics/sample_model/diffusion_model/jump_translational_diffusion.py @@ -453,7 +453,8 @@ def __repr__(self) -> str: String representation of the JumpTranslationalDiffusion model. """ return ( - f'JumpTranslationalDiffusion(name={self.name}, display_name={self.display_name},\n ' - f' diffusion_coefficient={self.diffusion_coefficient}, \n' + f'{self.__class__.__name__}(' + f'name={self.name!r}, display_name={self.display_name!r},\n' + f' diffusion_coefficient={self.diffusion_coefficient},\n' f' scale={self.scale})' ) diff --git a/src/easydynamics/sample_model/instrument_model.py b/src/easydynamics/sample_model/instrument_model.py index e906d14a..3abf07f7 100644 --- a/src/easydynamics/sample_model/instrument_model.py +++ b/src/easydynamics/sample_model/instrument_model.py @@ -581,6 +581,5 @@ def __repr__(self) -> str: f'unit={self.unit}, ' f'Q_len={None if self._Q is None else len(self._Q)}, ' f'resolution_model={self._resolution_model!r}, ' - f'background_model={self._background_model!r}' - f')' + f'background_model={self._background_model!r})' ) diff --git a/src/easydynamics/sample_model/model_base.py b/src/easydynamics/sample_model/model_base.py index c6c773d2..a2f1d776 100644 --- a/src/easydynamics/sample_model/model_base.py +++ b/src/easydynamics/sample_model/model_base.py @@ -428,6 +428,9 @@ def __repr__(self) -> str: A string representation of the ModelBase. """ return ( - f'{self.__class__.__name__}(unique_name={self.unique_name}, ' - f'unit={self.unit}), Q = {self.Q}, components = {self.components}' + f'{self.__class__.__name__}(' + f'unique_name={self.unique_name!r}, ' + f'unit={self.unit}, ' + f'Q={self.Q}, ' + f'components={self.components})' ) diff --git a/src/easydynamics/sample_model/resolution_model.py b/src/easydynamics/sample_model/resolution_model.py index 7ded2568..6378bc01 100644 --- a/src/easydynamics/sample_model/resolution_model.py +++ b/src/easydynamics/sample_model/resolution_model.py @@ -142,3 +142,12 @@ def from_sample_model( resolution_model.fix_all_parameters() return resolution_model + + def __repr__(self) -> str: + return ( + f'{self.__class__.__name__}(' + f'unique_name={self.unique_name!r}, ' + f'unit={self.unit}, ' + f'Q_len={None if self._Q is None else len(self._Q)}, ' + f'components={self.components})' + ) diff --git a/src/easydynamics/sample_model/sample_model.py b/src/easydynamics/sample_model/sample_model.py index a6203071..2e6d862d 100644 --- a/src/easydynamics/sample_model/sample_model.py +++ b/src/easydynamics/sample_model/sample_model.py @@ -562,9 +562,10 @@ def __repr__(self) -> str: """ return ( - f'{self.__class__.__name__}(unique_name={self.unique_name}, unit={self.unit}), ' - f'Q = {self.Q}, \n ' - f'components = {self.components}, diffusion_models = {self.diffusion_models}, ' - f'temperature = {self.temperature}, ' - f'detailed_balance_settings = {self.detailed_balance_settings}' + f'{self.__class__.__name__}(' + f'unique_name={self.unique_name!r}, unit={self.unit},\n' + f' Q={self.Q},\n' + f' components={self.components}, diffusion_models={self.diffusion_models},\n' + f' temperature={self.temperature},\n' + f' detailed_balance_settings={self.detailed_balance_settings})' ) diff --git a/tests/unit/easydynamics/analysis/test_analysis_base.py b/tests/unit/easydynamics/analysis/test_analysis_base.py index e9f0426a..7507b0b3 100644 --- a/tests/unit/easydynamics/analysis/test_analysis_base.py +++ b/tests/unit/easydynamics/analysis/test_analysis_base.py @@ -556,5 +556,5 @@ def test_repr(self, analysis_base): # THEN EXPECT assert 'AnalysisBase' in repr_str - assert 'display_name=TestAnalysis' in repr_str + assert "display_name='TestAnalysis'" in repr_str assert 'unique_name=' in repr_str diff --git a/tests/unit/easydynamics/analysis/test_fit_binding.py b/tests/unit/easydynamics/analysis/test_fit_binding.py index a59e0f70..191d1ba1 100644 --- a/tests/unit/easydynamics/analysis/test_fit_binding.py +++ b/tests/unit/easydynamics/analysis/test_fit_binding.py @@ -284,6 +284,6 @@ def test_repr(self, fit_binding): # THEN EXPECT assert 'FitBinding' in repr_str - assert 'parameter_name=parameter1' in repr_str - assert 'model=Gaussian' in repr_str + assert "parameter_name='parameter1'" in repr_str + assert "model='Gaussian'" in repr_str assert 'modes=None' in repr_str diff --git a/tests/unit/easydynamics/analysis/test_parameter_analysis.py b/tests/unit/easydynamics/analysis/test_parameter_analysis.py index 94fe9ddb..14d9c58c 100644 --- a/tests/unit/easydynamics/analysis/test_parameter_analysis.py +++ b/tests/unit/easydynamics/analysis/test_parameter_analysis.py @@ -878,8 +878,8 @@ def test_repr(self, parameter_analysis): # THEN EXPECT assert isinstance(repr_str, str) assert 'ParameterAnalysis' in repr_str - assert f'display_name={parameter_analysis.display_name}' in repr_str - assert f'unique_name={parameter_analysis.unique_name}' in repr_str + assert f"display_name='{parameter_analysis.display_name}'" in repr_str + assert f"unique_name='{parameter_analysis.unique_name}'" in repr_str assert f'n_parameters={len(parameter_analysis.parameters)}' in repr_str assert 'parameter_names=' in repr_str assert 'bindings=' in repr_str diff --git a/tests/unit/easydynamics/convolution/test_numerical_convolution_base.py b/tests/unit/easydynamics/convolution/test_numerical_convolution_base.py index a40e4388..73bcee0b 100644 --- a/tests/unit/easydynamics/convolution/test_numerical_convolution_base.py +++ b/tests/unit/easydynamics/convolution/test_numerical_convolution_base.py @@ -638,7 +638,7 @@ def test_repr(self, default_numerical_convolution_base): # Sample and resolution models assert 'ComponentCollection' in repr_str - assert 'Components: No components' in repr_str + assert 'components=[No components]' in repr_str assert 'sample_components=' in repr_str assert 'resolution_components=' in repr_str diff --git a/tests/unit/easydynamics/sample_model/components/test_damped_harmonic_oscillator.py b/tests/unit/easydynamics/sample_model/components/test_damped_harmonic_oscillator.py index 87f9556c..02fc31df 100644 --- a/tests/unit/easydynamics/sample_model/components/test_damped_harmonic_oscillator.py +++ b/tests/unit/easydynamics/sample_model/components/test_damped_harmonic_oscillator.py @@ -202,8 +202,8 @@ def test_repr(self, dho: DampedHarmonicOscillator): # EXPECT assert 'DampedHarmonicOscillator' in repr_str - assert 'name = TestDHOName' in repr_str - assert 'unit = meV' in repr_str - assert 'area =' in repr_str - assert 'center =' in repr_str - assert 'width =' in repr_str + assert "name='TestDHOName'" in repr_str + assert 'unit=meV' in repr_str + assert 'area=' in repr_str + assert 'center=' in repr_str + assert 'width=' in repr_str diff --git a/tests/unit/easydynamics/sample_model/components/test_delta_function.py b/tests/unit/easydynamics/sample_model/components/test_delta_function.py index 0747731b..de3148b7 100644 --- a/tests/unit/easydynamics/sample_model/components/test_delta_function.py +++ b/tests/unit/easydynamics/sample_model/components/test_delta_function.py @@ -221,7 +221,7 @@ def test_repr(self, delta_function: DeltaFunction): # EXPECT assert 'DeltaFunction' in repr_str - assert 'name = DeltaFunctionName' in repr_str - assert 'unit = meV' in repr_str - assert 'area =' in repr_str - assert 'center =' in repr_str + assert "name='DeltaFunctionName'" in repr_str + assert 'unit=meV' in repr_str + assert 'area=' in repr_str + assert 'center=' in repr_str diff --git a/tests/unit/easydynamics/sample_model/components/test_exponential.py b/tests/unit/easydynamics/sample_model/components/test_exponential.py index 6c2a1c50..b7fa5503 100644 --- a/tests/unit/easydynamics/sample_model/components/test_exponential.py +++ b/tests/unit/easydynamics/sample_model/components/test_exponential.py @@ -205,8 +205,8 @@ def test_repr(self, exponential: Exponential): # THEN EXPECT assert 'Exponential' in repr_str - assert 'name = ExponentialName' in repr_str - assert 'unit = meV' in repr_str - assert 'amplitude =' in repr_str - assert 'center =' in repr_str - assert 'rate =' in repr_str + assert "name='ExponentialName'" in repr_str + assert 'unit=meV' in repr_str + assert 'amplitude=' in repr_str + assert 'center=' in repr_str + assert 'rate=' in repr_str diff --git a/tests/unit/easydynamics/sample_model/components/test_gaussian.py b/tests/unit/easydynamics/sample_model/components/test_gaussian.py index f5acf10c..a370e74f 100644 --- a/tests/unit/easydynamics/sample_model/components/test_gaussian.py +++ b/tests/unit/easydynamics/sample_model/components/test_gaussian.py @@ -223,8 +223,8 @@ def test_repr(self, gaussian: Gaussian): repr_str = repr(gaussian) # EXPECT assert 'Gaussian' in repr_str - assert 'name = GaussianName' in repr_str - assert 'unit = meV' in repr_str - assert 'area =' in repr_str - assert 'center =' in repr_str - assert 'width =' in repr_str + assert "name='GaussianName'" in repr_str + assert 'unit=meV' in repr_str + assert 'area=' in repr_str + assert 'center=' in repr_str + assert 'width=' in repr_str diff --git a/tests/unit/easydynamics/sample_model/components/test_lorentzian.py b/tests/unit/easydynamics/sample_model/components/test_lorentzian.py index 6056bab9..1aefee6a 100644 --- a/tests/unit/easydynamics/sample_model/components/test_lorentzian.py +++ b/tests/unit/easydynamics/sample_model/components/test_lorentzian.py @@ -201,8 +201,8 @@ def test_repr(self, lorentzian: Lorentzian): # EXPECT assert 'Lorentzian' in repr_str - assert 'name = LorentzianName' in repr_str - assert 'unit = meV' in repr_str - assert 'area =' in repr_str - assert 'center =' in repr_str - assert 'width =' in repr_str + assert "name='LorentzianName'" in repr_str + assert 'unit=meV' in repr_str + assert 'area=' in repr_str + assert 'center=' in repr_str + assert 'width=' in repr_str diff --git a/tests/unit/easydynamics/sample_model/components/test_polynomial.py b/tests/unit/easydynamics/sample_model/components/test_polynomial.py index 3111c00a..2ba3f552 100644 --- a/tests/unit/easydynamics/sample_model/components/test_polynomial.py +++ b/tests/unit/easydynamics/sample_model/components/test_polynomial.py @@ -197,5 +197,5 @@ def test_repr(self, polynomial: Polynomial): repr_str = repr(polynomial) # EXPECT - assert 'name = PolynomialName' in repr_str - assert 'coefficients =' in repr_str + assert "name='PolynomialName'" in repr_str + assert 'coefficients=' in repr_str diff --git a/tests/unit/easydynamics/sample_model/components/test_voigt.py b/tests/unit/easydynamics/sample_model/components/test_voigt.py index 5f42704d..8b8d44cf 100644 --- a/tests/unit/easydynamics/sample_model/components/test_voigt.py +++ b/tests/unit/easydynamics/sample_model/components/test_voigt.py @@ -293,9 +293,9 @@ def test_repr(self, voigt: Voigt): # EXPECT assert 'Voigt' in repr_str - assert 'name = VoigtName' in repr_str - assert 'unit = meV' in repr_str - assert 'area =' in repr_str - assert 'center =' in repr_str - assert 'gaussian_width =' in repr_str - assert 'lorentzian_width =' in repr_str + assert "name='VoigtName'" in repr_str + assert 'unit=meV' in repr_str + assert 'area=' in repr_str + assert 'center=' in repr_str + assert 'gaussian_width=' in repr_str + assert 'lorentzian_width=' in repr_str diff --git a/tests/unit/easydynamics/sample_model/test_model_base.py b/tests/unit/easydynamics/sample_model/test_model_base.py index dfcbd1ad..5b58370d 100644 --- a/tests/unit/easydynamics/sample_model/test_model_base.py +++ b/tests/unit/easydynamics/sample_model/test_model_base.py @@ -386,5 +386,5 @@ def test_repr(self, model_base): # THEN / EXPECT assert 'unique_name' in repr_str assert 'unit' in repr_str - assert 'Q = ' in repr_str - assert 'components = ' in repr_str + assert 'Q=' in repr_str + assert 'components=' in repr_str diff --git a/tests/unit/easydynamics/sample_model/test_sample_model.py b/tests/unit/easydynamics/sample_model/test_sample_model.py index bbbb30b9..8086c92e 100644 --- a/tests/unit/easydynamics/sample_model/test_sample_model.py +++ b/tests/unit/easydynamics/sample_model/test_sample_model.py @@ -532,7 +532,7 @@ def test_repr(self, sample_model): # THEN / EXPECT assert 'SampleModel' in repr_str assert 'unit=' in repr_str - assert 'Q = ' in repr_str + assert 'Q=' in repr_str assert 'components' in repr_str assert 'diffusion_models' in repr_str assert 'temperature' in repr_str From 2098571b4f8ef24500e42d776dba5a745afa745a Mon Sep 17 00:00:00 2001 From: henrikjacobsenfys Date: Mon, 22 Jun 2026 12:01:53 +0200 Subject: [PATCH 2/2] pixi run fix --- .../convolution/numerical_convolution_base.py | 86 ++++++++----------- 1 file changed, 37 insertions(+), 49 deletions(-) diff --git a/src/easydynamics/convolution/numerical_convolution_base.py b/src/easydynamics/convolution/numerical_convolution_base.py index 3f6599b5..322c30cf 100644 --- a/src/easydynamics/convolution/numerical_convolution_base.py +++ b/src/easydynamics/convolution/numerical_convolution_base.py @@ -41,10 +41,10 @@ def __init__( energy_offset: Numeric | Parameter = 0.0, convolution_settings: ConvolutionSettings | None = None, temperature: Parameter | Numeric | None = None, - temperature_unit: str | sc.Unit = "K", + temperature_unit: str | sc.Unit = 'K', detailed_balance_settings: DetailedBalanceSettings | None = None, - unit: str | sc.Unit = "meV", - display_name: str | None = "MyConvolution", + unit: str | sc.Unit = 'meV', + display_name: str | None = 'MyConvolution', unique_name: str | None = None, ) -> None: """ @@ -64,13 +64,13 @@ def __init__( The settings for the convolution. If None, default settings will be used. temperature : Parameter | Numeric | None, default=None The temperature to use for detailed balance correction. - temperature_unit : str | sc.Unit, default='K' + temperature_unit : str | sc.Unit, default="K" The unit of the temperature parameter. detailed_balance_settings : DetailedBalanceSettings | None, default=None The settings for detailed balance. If None, default settings will be used. - unit : str | sc.Unit, default='meV' + unit : str | sc.Unit, default="meV" The unit of the energy. - display_name : str | None, default='MyConvolution' + display_name : str | None, default="MyConvolution" Display name of the model. unique_name : str | None, default=None Unique name of the model. If None, a unique name will be generated. @@ -91,13 +91,11 @@ def __init__( unique_name=unique_name, ) - if temperature is not None and not isinstance( - temperature, (Numeric, Parameter) - ): - raise TypeError("Temperature must be None, a number or a Parameter.") + if temperature is not None and not isinstance(temperature, (Numeric, Parameter)): + raise TypeError('Temperature must be None, a number or a Parameter.') if not isinstance(temperature_unit, (str, sc.Unit)): - raise TypeError("Temperature_unit must be a string or sc.Unit.") + raise TypeError('Temperature_unit must be a string or sc.Unit.') self._temperature_unit = temperature_unit self._temperature = None self.temperature = temperature @@ -110,7 +108,7 @@ def __init__( detailed_balance_settings = DetailedBalanceSettings() if not isinstance(detailed_balance_settings, DetailedBalanceSettings): raise TypeError( - "detailed_balance_settings must be a DetailedBalanceSettings instance." + 'detailed_balance_settings must be a DetailedBalanceSettings instance.' ) self._detailed_balance_settings = detailed_balance_settings @@ -149,7 +147,7 @@ def convolution_settings(self, settings: ConvolutionSettings) -> None: If settings is not a ConvolutionSettings instance. """ if not isinstance(settings, ConvolutionSettings): - raise TypeError("settings must be a ConvolutionSettings instance.") + raise TypeError('settings must be a ConvolutionSettings instance.') self._convolution_settings = settings self._convolution_settings.convolution_plan_is_valid = False @@ -261,7 +259,7 @@ def temperature(self, temp: Parameter | Numeric | None) -> None: self._temperature.value = float(temp) else: self._temperature = Parameter( - name="temperature", + name='temperature', value=float(temp), unit=self._temperature_unit, fixed=True, @@ -269,7 +267,7 @@ def temperature(self, temp: Parameter | Numeric | None) -> None: elif isinstance(temp, Parameter): self._temperature = temp else: - raise TypeError("Temperature must be None, a float or a Parameter.") + raise TypeError('Temperature must be None, a float or a Parameter.') @property def detailed_balance_settings(self) -> DetailedBalanceSettings: @@ -299,9 +297,7 @@ def detailed_balance_settings(self, value: DetailedBalanceSettings) -> None: If value is not a DetailedBalanceSettings. """ if not isinstance(value, DetailedBalanceSettings): - raise TypeError( - "detailed_balance_settings must be a DetailedBalanceSettings" - ) + raise TypeError('detailed_balance_settings must be a DetailedBalanceSettings') self._detailed_balance_settings = value def _create_energy_grid( @@ -330,7 +326,7 @@ def _create_energy_grid( is_uniform = np.allclose(energy_diff, energy_diff[0]) if not is_uniform: raise ValueError( - "Input array `energy` must be uniformly spaced if upsample_factor is not given." # noqa: E501 + 'Input array `energy` must be uniformly spaced if upsample_factor is not given.' # noqa: E501 ) energy_dense = self.energy.values @@ -347,7 +343,7 @@ def _create_energy_grid( energy_span_dense = extended_max - extended_min if len(energy_dense) < 2: - raise ValueError("Energy array must have at least two points.") + raise ValueError('Energy array must have at least two points.') energy_dense_step = energy_dense[1] - energy_dense[0] # Handle offset for even length of energy_dense in convolution. @@ -360,9 +356,7 @@ def _create_energy_grid( # select the 4 central points we either get # indices [2,3,4,5] or [1,2,3,4], both of which are offset by # 0.5*dx from the true center at index 3.5. - energy_even_length_offset = ( - -0.5 * energy_dense_step if len(energy_dense) % 2 == 0 else 0.0 - ) + energy_even_length_offset = -0.5 * energy_dense_step if len(energy_dense) % 2 == 0 else 0.0 # Handle the case when energy_dense is not symmetric around 0. # The resolution is still centered around zero (or close to it), @@ -406,33 +400,27 @@ def _check_width_thresholds( components = model if isinstance(model, ComponentCollection) else [model] for comp in components: - if hasattr(comp, "width"): - if ( - comp.width.value - > LARGE_WIDTH_THRESHOLD * self._energy_grid.energy_span_dense - ): + if hasattr(comp, 'width'): + if comp.width.value > LARGE_WIDTH_THRESHOLD * self._energy_grid.energy_span_dense: warnings.warn( ( f"The width of the {model_name} component '{comp.unique_name}' " - f"({comp.width.value}) is large compared to the span of the input " - f"array ({self._energy_grid.energy_span_dense}). " - f"This may lead to inaccuracies in the convolution. " - f"Increase extension_factor to improve accuracy." + f'({comp.width.value}) is large compared to the span of the input ' + f'array ({self._energy_grid.energy_span_dense}). ' + f'This may lead to inaccuracies in the convolution. ' + f'Increase extension_factor to improve accuracy.' ), UserWarning, stacklevel=3, ) - if ( - comp.width.value - < SMALL_WIDTH_THRESHOLD * self._energy_grid.energy_dense_step - ): + if comp.width.value < SMALL_WIDTH_THRESHOLD * self._energy_grid.energy_dense_step: warnings.warn( ( f"The width of the {model_name} component '{comp.unique_name}' " - f"({comp.width.value}) is small compared to the spacing of the input " - f"array ({self._energy_grid.energy_dense_step}). " - f"This may lead to inaccuracies in the convolution. " - f"Increase upsample_factor to improve accuracy." + f'({comp.width.value}) is small compared to the spacing of the input ' + f'array ({self._energy_grid.energy_dense_step}). ' + f'This may lead to inaccuracies in the convolution. ' + f'Increase upsample_factor to improve accuracy.' ), UserWarning, stacklevel=3, @@ -448,13 +436,13 @@ def __repr__(self) -> str: A string representation of the NumericalConvolutionBase. """ return ( - f"{self.__class__.__name__}(" - f" energy=array of shape {self.energy.values.shape},\n" - f" sample_components={self.sample_components!r},\n" - f" resolution_components={self.resolution_components!r},\n" - f" unit={self.unit}, " - f" upsample_factor={self.upsample_factor}, " - f" extension_factor={self.extension_factor}, " - f" temperature={self.temperature}, " - f" detailed_balance={self.detailed_balance_settings!r})" + f'{self.__class__.__name__}(' + f' energy=array of shape {self.energy.values.shape},\n' + f' sample_components={self.sample_components!r},\n' + f' resolution_components={self.resolution_components!r},\n' + f' unit={self.unit}, ' + f' upsample_factor={self.upsample_factor}, ' + f' extension_factor={self.extension_factor}, ' + f' temperature={self.temperature}, ' + f' detailed_balance={self.detailed_balance_settings!r})' )