ADR Suggestion Fitting Using Third-Party Minimizers – Design Review & Clarifications
#109
Replies: 2 comments
-
|
Related resources and minimization engines we use: scipy.optimize: nonlinear least-squares and curve fitting Lmfit: non-linear optimization and curve fitting Bumps: curve fitting and uncertainty analysis from a Bayesian perspective DFO-LS: derivative-free optimizer for least-squares minimization |
Beta Was this translation helpful? Give feedback.
-
The
|
Beta Was this translation helpful? Give feedback.
Uh oh!
There was an error while loading. Please reload this page.
-
We currently have an ADR titled "Fitting using third-party minimizers" (#9).
This ADR was created before we established the formal "Protocol for Creating ADRs", so it doesn't have an associated discussion thread suggesting it as a new ADR.
Since a few new questions and concerns have surfaced regarding the current design, I am creating this ADR suggestion to discuss and clarify them. Once we have consensus, we can update the original ADR, if necessary.
Proposed API Improvements
The existing ADR states:
However, it doesn’t explain why the current implementation uses a function rather than a class.
Additionally, it doesn’t provide reasoning for why
AvailableMinimizersis implemented as a separate class.So, we have:
easyscience/fitting/minimizers/factory.pyeasyscience/fitting/available_minimizers.pyThis structure feels unnecessarily complex and potentially confusing.
Below is a simplified class diagram illustrating the current setup:
classDiagram %%%%%%%%%%%%%%%%%%%%%%%%% %% easyscience package %% %%%%%%%%%%%%%%%%%%%%%%%%% class MultiFitter:::fitter { } %% Rename to SingleFitter? class Fitter:::fitter { ... %% Rename to _fitter: fitter_cls? _minimizer: minimizer_cls ... } %% Rename to AvailableFitters? %% Move to FitterFactory class instead? class AvailableMinimizers { ... } %% Rename to AvailableFitter? %% Move to FitterFactory class instead? class AvailableMinimizer { <<dataclass>> } %% Move to FitterFactory class instead? class factory:::factory { factory(...) minimizer_cls } %% Rename to LmfitFitter? class LMFit:::wrapper { } %% Rename to BumpsFitter? class Bumps:::wrapper { } %% Rename to DfolsFitter? class DFO:::wrapper { } %% Rename to FitterBase? class MinimizerBase:::baseclass { <<abstract>> /property/ all_constraints /property/ enum /property/ name _get_method_kwargs(...) _prepare_parameters(...) _fit_function(...) _create_signature(...)$ _error_from_jacobian(...)$ fit_constraints() set_fit_constraint(...) add_fit_constraint(...) remove_fit_constraint(...) evaluate(...) convert_to_pars_obj(...)* fit(...)* supported_methods()$ all_methods()$ convert_to_par_object(...)$ } %%%%%%%%%%%%%%% %% RELATIONS %% %%%%%%%%%%%%%%% %% Refinement/Fitting/Minimization/Optimization %% DiffractionFitter *-- MultiFitter : contains MultiFitter --|> Fitter : inherit Fitter ..> factory : uses Fitter *-- LMFit : contains Fitter *-- Bumps : contains Fitter *-- DFO : contains factory ..> LMFit : creates factory ..> Bumps : creates factory ..> DFO : creates LMFit --|> MinimizerBase : inherit Bumps --|> MinimizerBase : inherit DFO --|> MinimizerBase : inherit Fitter .. AvailableMinimizers : uses factory .. AvailableMinimizers : uses LMFit .. AvailableMinimizers : uses Bumps .. AvailableMinimizers : uses DFO .. AvailableMinimizers : uses MinimizerBase .. AvailableMinimizers : uses AvailableMinimizers --|> AvailableMinimizer : inherit %%%%%%%%%%%%% %% STYLING %% %%%%%%%%%%%%% %% Core Containers (Project, Analysis) classDef container fill:#546E7A,stroke:#263238,stroke-width:1px,color:#FFFFFF; %% Diffraction Fitter classDef fitter fill:#FBC02D,stroke:#F57F17,stroke-width:1px,color:#000000; %% Diffraction Calculator (Core Calculation Logic) classDef calculator fill:#FBC02D,stroke:#F57F17,stroke-width:1px,color:#000000; %% Factories (Factory classes in Minimization/Calculation) classDef factory fill:#2E7D32,stroke:#1B5E20,stroke-width:1px,color:#FFFFFF; %% Wrappers (Crysfml, Cryspy, Pdffit Calculators) classDef wrapper fill:#FB8C00,stroke:#E65100,stroke-width:1px,color:#FFFFFF; %% Abstract Base Classes (MinimizerBase, CalculatorBase) classDef baseclass fill:#3949AB,stroke:#1A237E,stroke-width:1px,color:#FFFFFF;Proposal
I suggest we discuss whether this design can be improved by consolidating the functionality into a single
MinimizerFactoryclass, which would:This could simplify both the internal design and the user-facing API.
User API (No Change Proposed)
Regardless of whether we keep the existing design or adopt a new, unified design, users should not need to access the factory directly.
We have already agreed that the
Analysisobject is responsible for minimization, so the API for users should remain simple and intuitive:Naming Convention Clarification
There is currently a mix of fit-based and minimize-based names in the codebase and documentation.
This inconsistency can lead to confusion.
We should clarify when and where to use:
fit,Fitter,available_fitters, etc.versus
minimize,Minimizer,available_minimizers, etc.I propose we document the chosen convention explicitly as part of this ADR.
Beta Was this translation helpful? Give feedback.
All reactions