28     virtual double compute(
const std::vector<SimDataPair>& fit_objects, 
size_t n_pars) 
const = 0;
 
   36     double compute(
const std::vector<SimDataPair>& fit_objects, 
size_t n_pars) 
const override;
 
   39     std::unique_ptr<IChiSquaredModule> m_module;
 
   46     double compute(
const std::vector<SimDataPair>& fit_objects, 
size_t n_pars) 
const override;
 
   49     std::unique_ptr<ObjectiveMetric> m_module;
 
   55         auto simulation = callback.build_simulation(params);
 
   56         std::unique_ptr<Simulation> clone(simulation->clone());
 
   62 FitObjective::FitObjective()
 
   65       m_fit_status(std::make_unique<
FitStatus>(this))
 
   69 FitObjective::~FitObjective() = 
default;
 
   81     m_fit_objects.emplace_back(builder, data, std::move(
uncertainties), weight);
 
   86     run_simulations(params);
 
   87     const double metric_value = m_metric_module->compute(m_fit_objects, params.size());
 
   88     m_fit_status->update(params, metric_value);
 
   92 std::vector<double> FitObjective::evaluate_residuals(
const Fit::Parameters& params)
 
   98     std::transform(result.begin(), result.end(), sim_values.begin(), result.begin(),
 
   99                    [](
double lhs, 
double rhs) { return lhs - rhs; });
 
  103 size_t FitObjective::numberOfFitElements()
 const 
  105     return std::accumulate(
 
  106         m_fit_objects.begin(), m_fit_objects.end(), 0u,
 
  107         [](
size_t acc, 
auto& obj) -> 
size_t { return acc + obj.numberOfFitElements(); });
 
  172     return m_fit_objects[check_index(i_item)];
 
  177     m_fit_status->initPrint(every_nth);
 
  182     m_fit_status->addObserver(every_nth, observer);
 
  187     fit_observer_t observer = [&](
const FitObjective& objective) { callback.update(objective); };
 
  188     m_fit_status->addObserver(every_nth, observer);
 
  191 bool FitObjective::isCompleted()
 const 
  193     return m_fit_status->isCompleted();
 
  198     return m_fit_status->iterationInfo();
 
  203     return m_fit_status->minimizerResult();
 
  208     m_fit_status->finalize(result);
 
  211 unsigned FitObjective::fitObjectCount()
 const 
  213     return static_cast<unsigned>(m_fit_objects.size());
 
  216 void FitObjective::interruptFitting()
 
  218     m_fit_status->setInterrupted();
 
  221 bool FitObjective::isInterrupted()
 const 
  223     return m_fit_status->isInterrupted();
 
  226 bool FitObjective::isFirstIteration()
 const 
  233     if (m_fit_status->isInterrupted())
 
  234         throw std::runtime_error(
"Fitting was interrupted by the user.");
 
  236     if (m_fit_objects.empty())
 
  237         throw std::runtime_error(
"FitObjective::run_simulations() -> Error. " 
  238                                  "No simulation/data defined.");
 
  240     for (
auto& obj : m_fit_objects)
 
  241         obj.runSimulation(params);
 
  246     std::cout << 
"Warning in FitObjective::setChiSquaredModule: setChiSquaredModule is deprecated " 
  247                  "and will be removed in future versions. Please use " 
  248                  "FitObjective::setObjectiveMetric instead." 
  251     std::unique_ptr<IChiSquaredModule> chi_module(module.
clone());
 
  252     m_metric_module = std::make_unique<ChiModuleWrapper>(std::move(chi_module));
 
  255 void FitObjective::setObjectiveMetric(std::unique_ptr<ObjectiveMetric> metric)
 
  257     m_metric_module = std::make_unique<ObjectiveMetricWrapper>(std::move(metric));
 
  260 void FitObjective::setObjectiveMetric(
const std::string& metric)
 
  262     m_metric_module = std::make_unique<ObjectiveMetricWrapper>(
 
  263         ObjectiveMetricUtils::createMetric(metric, ObjectiveMetricUtils::defaultNormName()));
 
  266 void FitObjective::setObjectiveMetric(
const std::string& metric, 
const std::string& norm)
 
  269         std::make_unique<ObjectiveMetricWrapper>(ObjectiveMetricUtils::createMetric(metric, norm));
 
  275     return dataPair(i_item).containsUncertainties();
 
  282     for (
size_t i = 0, size = fitObjectCount(); i < size; ++i)
 
  283         result = result && 
dataPair(i).containsUncertainties();
 
  290     return ObjectiveMetricUtils::availableMetricOptions();
 
  293 std::vector<double> FitObjective::composeArray(DataPairAccessor getter)
 const 
  295     const size_t n_objs = m_fit_objects.size();
 
  299         return (m_fit_objects[0].*getter)();
 
  301     std::vector<double> result;
 
  302     result.reserve(numberOfFitElements());
 
  303     for (
auto& pair : m_fit_objects) {
 
  304         std::vector<double> array = (pair.*getter)();
 
  305         std::move(array.begin(), array.end(), std::back_inserter(result));
 
  310 size_t FitObjective::check_index(
size_t index)
 const 
  312     if (index >= m_fit_objects.size())
 
  313         throw std::runtime_error(
"FitObjective::check_index() -> Index outside of range");
 
  319 IMetricWrapper::~IMetricWrapper() = 
default;
 
  321 ChiModuleWrapper::ChiModuleWrapper(std::unique_ptr<IChiSquaredModule> module)
 
  325         throw std::runtime_error(
"Error in ChiModuleWrapper: empty chi square module passed");
 
  328 double ChiModuleWrapper::compute(
const std::vector<SimDataPair>& fit_objects, 
size_t n_pars)
 const 
  332     for (
auto& obj : fit_objects) {
 
  333         const auto sim_array = obj.simulation_array();
 
  334         const auto exp_array = obj.experimental_array();
 
  335         const auto weights = obj.user_weights_array();
 
  336         const size_t n_elements = sim_array.size();
 
  337         for (
size_t i = 0; i < n_elements; ++i) {
 
  338             double value = m_module->residual(sim_array[i], exp_array[i], weights[i]);
 
  339             result += value * value;
 
  341         n_points += n_elements;
 
  344     int fnorm = 
static_cast<int>(n_points) - 
static_cast<int>(n_pars);
 
  346         throw std::runtime_error(
"Error in ChiModuleWrapper: Normalization shall be positive");
 
  348     return result / fnorm;
 
  351 ObjectiveMetricWrapper::ObjectiveMetricWrapper(std::unique_ptr<ObjectiveMetric> module)
 
  355         throw std::runtime_error(
"Error in ObjectiveMetricWrapper: empty objective metric passed");
 
  358 double ObjectiveMetricWrapper::compute(
const std::vector<SimDataPair>& fit_objects, 
size_t)
 const 
  361     bool use_uncertainties = 
true;
 
  362     for (
auto& obj : fit_objects)
 
  363         use_uncertainties = use_uncertainties && obj.containsUncertainties();
 
  366     for (
auto& obj : fit_objects)
 
  367         result += m_module->compute(obj, use_uncertainties);
 
Defines class ChiSquaredModule.
 
Defines class FitObjective.
 
Defines ObjectiveMetric utilities and corresponding namespace.
 
Defines ObjectiveMetric classes.
 
Defines family of PyFittingCallbacks classes.
 
Defines class Simulation.
 
Metric wrapper for back-compaptibility with old scripts.
 
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.
 
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 finalize(const Fit::MinimizerResult &result)
Should be explicitely called on last iteration to notify all observers.
 
void initPlot(int every_nth, PyObserverCallback &callback)
Initializes observer callback to be called on every_nth fit iteration.
 
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.
 
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.
 
std::vector< double > experimental_array() const
Returns one dimensional array representing merged experimental data.
 
SimulationResult absoluteDifference(size_t i_item=0) const
Returns absolute value of difference between simulation and experimental data in the form of Simulati...
 
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...
 
Result of minimization round.
 
A collection of fit parameters.
 
Interface residual calculations.
 
virtual IChiSquaredModule * clone() const =0
clone method
 
Stores fit iteration info to track fit flow from various observers.
 
unsigned iterationCount() const
Returns current number of minimizer iterations.
 
Implementation of  metric with standard deviation , where  is the simulated intensity.
 
Builds simulation object using a Python callable.
 
Observer for FitObjective based on Python callable.
 
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.
 
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.