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;
46 double compute(
const std::vector<SimDataPair>& fit_objects,
size_t n_pars)
const override;
56 std::unique_ptr<Simulation> clone(simulation->clone());
65 m_fit_status(std::make_unique<
FitStatus>(this))
98 std::transform(result.begin(), result.end(), sim_values.begin(), result.begin(),
99 [](
double lhs,
double rhs) { return lhs - rhs; });
105 return std::accumulate(
107 [](
size_t acc,
auto& obj) ->
size_t { return acc + obj.numberOfFitElements(); });
234 throw std::runtime_error(
"Fitting was interrupted by the user.");
237 throw std::runtime_error(
"FitObjective::run_simulations() -> Error. "
238 "No simulation/data defined.");
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));
257 m_metric_module = std::make_unique<ObjectiveMetricWrapper>(std::move(metric));
301 std::vector<double> result;
304 std::vector<double> array = (pair.*getter)();
305 std::move(array.begin(), array.end(), std::back_inserter(result));
313 throw std::runtime_error(
"FitObjective::check_index() -> Index outside of range");
325 throw std::runtime_error(
"Error in ChiModuleWrapper: empty chi square module passed");
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;
355 throw std::runtime_error(
"Error in ObjectiveMetricWrapper: empty objective metric passed");
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.
std::function< void(const FitObjective &)> fit_observer_t
std::function< std::unique_ptr< Simulation >(const Fit::Parameters &)> simulation_builder_t
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.
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.
void run_simulations(const Fit::Parameters ¶ms)
SimulationResult uncertaintyData(size_t i_item=0) const
Returns experimental data uncertainties in the form of SimulationResult.
std::unique_ptr< IMetricWrapper > m_metric_module
bool isFirstIteration() const
virtual double evaluate(const Fit::Parameters ¶ms)
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 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< SimDataPair > m_fit_objects
static simulation_builder_t simulationBuilder(PyBuilderCallback &callback)
size_t check_index(size_t index) 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.
size_t numberOfFitElements() const
std::vector< double > experimental_array() const
Returns one dimensional array representing merged experimental data.
Fit::MinimizerResult minimizerResult() const
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.
virtual std::vector< double > evaluate_residuals(const Fit::Parameters ¶ms)
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
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 Simulation * build_simulation(Fit::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.
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.