27 virtual double compute(
const std::vector<SimDataPair>& fit_objects,
size_t n_pars)
const = 0;
34 double compute(
const std::vector<SimDataPair>& fit_objects,
size_t n_pars)
const override;
43 double compute(
const std::vector<SimDataPair>& fit_objects,
size_t n_pars)
const override;
53 std::unique_ptr<ISimulation> clone(simulation->clone());
95 std::transform(result.begin(), result.end(), sim_values.begin(), result.begin(),
96 [](
double lhs,
double rhs) { return lhs - rhs; });
102 return std::accumulate(
104 [](
size_t acc,
auto& obj) ->
size_t { return acc + obj.numberOfFitElements(); });
231 throw std::runtime_error(
"Fitting was interrupted by the user.");
234 throw std::runtime_error(
"FitObjective::run_simulations() -> Error. "
235 "No simulation/data defined.");
238 obj.runSimulation(params);
243 std::cout <<
"Warning in FitObjective::setChiSquaredModule: setChiSquaredModule is deprecated "
244 "and will be removed in future versions. Please use "
245 "FitObjective::setObjectiveMetric instead."
248 std::unique_ptr<IChiSquaredModule> chi_module(module.
clone());
249 m_metric_module = std::make_unique<ChiModuleWrapper>(std::move(chi_module));
254 m_metric_module = std::make_unique<ObjectiveMetricWrapper>(std::move(metric));
298 std::vector<double> result;
301 std::vector<double> array = (pair.*getter)();
302 std::move(array.begin(), array.end(), std::back_inserter(result));
310 throw std::runtime_error(
"FitObjective::check_index() -> Index outside of range");
322 throw std::runtime_error(
"Error in ChiModuleWrapper: empty chi square module passed");
329 for (
auto& obj : fit_objects) {
330 const auto sim_array = obj.simulation_array();
331 const auto exp_array = obj.experimental_array();
332 const auto weights = obj.user_weights_array();
333 const size_t n_elements = sim_array.size();
334 for (
size_t i = 0; i < n_elements; ++i) {
335 double value =
m_module->residual(sim_array[i], exp_array[i], weights[i]);
336 result += value * value;
338 n_points += n_elements;
341 int fnorm =
static_cast<int>(n_points) -
static_cast<int>(n_pars);
343 throw std::runtime_error(
"Error in ChiModuleWrapper: Normalization shall be positive");
345 return result / fnorm;
352 throw std::runtime_error(
"Error in ObjectiveMetricWrapper: empty objective metric passed");
358 bool use_uncertainties =
true;
359 for (
auto& obj : fit_objects)
360 use_uncertainties = use_uncertainties && obj.containsUncertainties();
363 for (
auto& obj : fit_objects)
364 result +=
m_module->compute(obj, use_uncertainties);
Defines class ChiSquaredModule.
Defines class FitObjective.
std::function< void(const FitObjective &)> fit_observer_t
std::function< std::unique_ptr< ISimulation >(const mumufit::Parameters &)> simulation_builder_t
Defines interface ISimulation.
Defines ObjectiveMetric utilities and corresponding namespace.
Defines ObjectiveMetric classes.
Defines family of PyFittingCallbacks classes.
Metric wrapper for back-compaptibility with old scripts.
std::unique_ptr< IChiSquaredModule > m_module
ChiModuleWrapper(std::unique_ptr< IChiSquaredModule > module)
double compute(const std::vector< SimDataPair > &fit_objects, size_t n_pars) const override
Holds vector of SimDataPairs (experimental data and simulation results) for use in fitting.
SimulationResult uncertaintyData(size_t i_item=0) const
Returns experimental data uncertainties in the form of SimulationResult.
virtual std::vector< double > evaluate_residuals(const mumufit::Parameters ¶ms)
std::unique_ptr< IMetricWrapper > m_metric_module
bool isFirstIteration() const
IterationInfo iterationInfo() const
void addSimulationAndData(simulation_builder_t builder, const OutputData< double > &data, std::unique_ptr< OutputData< double >> uncertainties, double weight=1.0)
Constructs simulation/data pair for later fit.
bool allPairsHaveUncertainties() const
Returns true if all the data pairs in FitObjective instance contain uncertainties.
SimulationResult relativeDifference(size_t i_item=0) const
Returns relative difference between simulation and experimental data in the form of SimulationResult.
void initPlot(int every_nth, PyObserverCallback &callback)
Initializes observer callback to be called on every_nth fit iteration.
std::vector< SimDataPair > m_fit_objects
static simulation_builder_t simulationBuilder(PyBuilderCallback &callback)
virtual double evaluate(const mumufit::Parameters ¶ms)
size_t check_index(size_t index) const
mumufit::MinimizerResult minimizerResult() const
void setObjectiveMetric(const std::string &metric)
std::vector< double > composeArray(DataPairAccessor getter) const
std::vector< double > uncertainties() const
Returns one-dimensional array representing merged data uncertainties.
SimulationResult experimentalData(size_t i_item=0) const
Returns experimental data in the form of SimulationResult.
unsigned fitObjectCount() const
void setChiSquaredModule(const IChiSquaredModule &module)
static std::string availableMetricOptions()
Returns available metrics and norms.
bool containsUncertainties(size_t i_item) const
Returns true if the specified DataPair element contains uncertainties.
SimulationResult simulationResult(size_t i_item=0) const
Returns simulation result in the form of SimulationResult.
void initPrint(int every_nth)
Initializes printing to standard output on every_nth fit iteration.
std::vector< double > weights_array() const
Returns one-dimensional array representing merged user weights.
void run_simulations(const mumufit::Parameters ¶ms)
size_t numberOfFitElements() const
std::vector< double > experimental_array() const
Returns one dimensional array representing merged experimental data.
void finalize(const mumufit::MinimizerResult &result)
Should be explicitely called on last iteration to notify all observers.
SimulationResult absoluteDifference(size_t i_item=0) const
Returns absolute value of difference between simulation and experimental data in the form of Simulati...
bool isInterrupted() const
std::unique_ptr< FitStatus > m_fit_status
const SimDataPair & dataPair(size_t i_item=0) const
Returns a reference to i-th SimDataPair.
std::vector< double > simulation_array() const
Returns one dimensional array representing merged simulated intensities data.
Contains status of the fitting (running, interupted etc) and all intermediate information which has t...
Interface residual calculations.
virtual IChiSquaredModule * clone() const =0
clone method
virtual ~IMetricWrapper()
virtual double compute(const std::vector< SimDataPair > &fit_objects, size_t n_pars) const =0
Stores fit iteration info to track fit flow from various observers.
unsigned iterationCount() const
Returns current number of minimizer iterations.
ObjectiveMetricWrapper(std::unique_ptr< ObjectiveMetric > module)
double compute(const std::vector< SimDataPair > &fit_objects, size_t n_pars) const override
std::unique_ptr< ObjectiveMetric > m_module
Implementation of metric with standard deviation , where is the simulated intensity.
Builds simulation object using a Python callable.
virtual ISimulation * build_simulation(mumufit::Parameters)
Observer for FitObjective based on Python callable.
virtual void update(const FitObjective &)
Holds pair of simulation/experimental data to fit.
std::vector< double > experimental_array() const
Returns the flattened experimental data cut to the ROI area.
SimulationResult absoluteDifference() const
Returns the absolute difference between simulated and experimental data cut to the ROI area.
std::vector< double > user_weights_array() const
Returns a flat array of user weights cut to the ROI area.
std::vector< double > uncertainties_array() const
Returns the flattened experimental uncertainties cut to the ROI area.
std::vector< double > simulation_array() const
Returns the flattened simulated intensities cut to the ROI area.
SimulationResult uncertainties() const
Returns the data uncertainties cut to the ROI area If no uncertainties present, returns zero-filled S...
SimulationResult experimentalData() const
Returns the experimental data cut to the ROI area.
bool containsUncertainties() const
SimulationResult relativeDifference() const
Returns the relative difference between simulated and experimental data cut to the ROI area.
SimulationResult simulationResult() const
Returns the result of last computed simulation.
Wrapper around OutputData<double> that also provides unit conversions.
Result of minimization round.
A collection of fit parameters.
std::string defaultNormName()
Returns default norm name.
std::string availableMetricOptions()
Prints available metric options.
std::unique_ptr< ObjectiveMetric > createMetric(const std::string &metric)
Creates the specified metric with the default norm.