BornAgain  1.19.0
Simulate and fit neutron and x-ray scattering at grazing incidence
FitObjectiveBuilder.cpp
Go to the documentation of this file.
1 // ************************************************************************************************
2 //
3 // BornAgain: simulate and fit reflection and scattering
4 //
5 //! @file GUI/coregui/Views/FitWidgets/FitObjectiveBuilder.cpp
6 //! @brief Implements class SimulationBuilder
7 //!
8 //! @homepage http://www.bornagainproject.org
9 //! @license GNU General Public License v3 or higher (see COPYING)
10 //! @copyright Forschungszentrum Jülich GmbH 2018
11 //! @authors Scientific Computing Group at MLZ (see CITATION, AUTHORS)
12 //
13 // ************************************************************************************************
14 
19 #include "Fit/Kernel/Minimizer.h"
30 
31 FitObjectiveBuilder::FitObjectiveBuilder(JobItem* jobItem) : m_jobItem(jobItem)
32 {
34 }
35 
37 
39 {
41 
43  m_fit_objective->setObjectiveMetric(std::move(module));
44 
45  if (m_observer) {
46  fit_observer_t plot_observer = [&](const FitObjective& obj) { m_observer->update(&obj); };
47  m_fit_objective->initPlot(1, plot_observer);
48  }
49 
50  auto minimizer_impl = createMinimizer();
51  const bool requires_residuals = minimizer_impl->requiresResiduals();
52 
53  mumufit::Minimizer minimizer;
54  minimizer.setMinimizer(minimizer_impl.release());
55 
56  auto result = requires_residuals ? minimizer.minimize(
57  [&](const mumufit::Parameters& params) {
58  return m_fit_objective->evaluate_residuals(params);
59  },
61  : minimizer.minimize(
62  [&](const mumufit::Parameters& params) {
63  return m_fit_objective->evaluate(params);
64  },
66  m_fit_objective->finalize(result);
67 }
68 
69 std::unique_ptr<FitObjective> FitObjectiveBuilder::createFitObjective() const
70 {
71  std::unique_ptr<FitObjective> result(new FitObjective);
72 
73  simulation_builder_t builder = [&](const mumufit::Parameters& params) {
74  return buildSimulation(params);
75  };
76 
77  result->addSimulationAndData(builder, *createOutputData(), nullptr, 1.0);
78 
79  return result;
80 }
81 
82 std::unique_ptr<IMinimizer> FitObjectiveBuilder::createMinimizer() const
83 {
85 }
86 
88 {
90 }
91 
92 void FitObjectiveBuilder::attachObserver(std::shared_ptr<GUIFitObserver> observer)
93 {
94  m_observer = observer;
95 }
96 
98 {
99  m_fit_objective->interruptFitting();
100 }
101 
102 std::unique_ptr<ISimulation>
104 {
105  static std::mutex build_simulation_mutex;
106  std::unique_lock<std::mutex> lock(build_simulation_mutex);
107 
108  update_fit_parameters(params);
112 }
113 
114 std::unique_ptr<OutputData<double>> FitObjectiveBuilder::createOutputData() const
115 {
116  auto realDataItem = m_jobItem->realDataItem();
117  if (!realDataItem)
118  throw GUIHelpers::Error("FitObjectiveBuilder::createOutputData() -> No Real Data defined.");
119 
120  const DataItem* intensity_item = realDataItem->dataItem();
121  ASSERT(intensity_item);
122  ASSERT(intensity_item->getOutputData());
123 
124  return std::unique_ptr<OutputData<double>>(intensity_item->getOutputData()->clone());
125 }
126 
128 {
129  QVector<double> values = GUIHelpers::fromStdVector(params.values());
130 
131  auto fitParContainer = m_jobItem->fitParameterContainerItem();
133 }
#define ASSERT(condition)
Definition: Assert.h:31
Declares class DataItem.
Defines class DomainSimulationBuilder.
Defines class FitObjectiveBuilder.
Defines class FitObjective.
Defines FitParameterItems family of classes.
Defines class FitSuiteItem.
std::function< void(const FitObjective &)> fit_observer_t
Definition: FitTypes.h:35
std::function< std::unique_ptr< ISimulation >(const mumufit::Parameters &)> simulation_builder_t
Definition: FitTypes.h:33
Implements class GUIFitObserver.
Defines class GUIHelpers functions.
Defines interface IMinimizer.
Defines interface ISimulation.
Defines class JobItem.
Defines MinimizerItem class.
Defines class Minimizer.
Defines ObjectiveMetric classes.
Defines class RealDataItem.
Provides common functionality for IntensityDataItem and SpecularDataItem.
Definition: DataItem.h:29
OutputData< double > * getOutputData()
Definition: DataItem.h:36
void attachObserver(std::shared_ptr< GUIFitObserver > observer)
std::unique_ptr< ISimulation > buildSimulation(const mumufit::Parameters &params) const
std::unique_ptr< IMinimizer > createMinimizer() const
FitObjectiveBuilder(JobItem *jobItem)
std::shared_ptr< GUIFitObserver > m_observer
std::unique_ptr< FitObjective > createFitObjective() const
mumufit::Parameters createParameters() const
std::unique_ptr< FitObjective > m_fit_objective
std::unique_ptr< OutputData< double > > createOutputData() const
void update_fit_parameters(const mumufit::Parameters &params) const
Holds vector of SimDataPairs (experimental data and simulation results) for use in fitting.
Definition: FitObjective.h:33
mumufit::Parameters createParameters() const
void setValuesInParameterContainer(const QVector< double > &values, class ParameterContainerItem *parameterContainer)
Propagate values to the corresponding parameter tree items of parameterContainer.
MinimizerContainerItem * minimizerContainerItem()
FitParameterContainerItem * fitParameterContainerItem()
InstrumentItem * instrumentItem()
Definition: JobItem.cpp:224
FitParameterContainerItem * fitParameterContainerItem()
Definition: JobItem.cpp:251
FitSuiteItem * fitSuiteItem()
Definition: JobItem.cpp:235
RealDataItem * realDataItem()
Definition: JobItem.cpp:259
SimulationOptionsItem * simulationOptionsItem()
Definition: JobItem.cpp:290
MultiLayerItem * multiLayerItem()
Definition: JobItem.cpp:219
ParameterContainerItem * parameterContainerItem()
Definition: JobItem.cpp:240
std::unique_ptr< IMinimizer > createMinimizer() const
std::unique_ptr< ObjectiveMetric > createMetric() const
OutputData * clone() const
Definition: OutputData.h:259
A main class to run fitting.
Definition: Minimizer.h:37
void setMinimizer(const std::string &minimizerName, const std::string &algorithmName="", const std::string &options="")
Definition: Minimizer.cpp:23
MinimizerResult minimize(fcn_scalar_t fcn, const Parameters &parameters)
Definition: Minimizer.cpp:36
A collection of fit parameters.
Definition: Parameters.h:26
std::vector< double > values() const
Definition: Parameters.cpp:56
std::unique_ptr< ISimulation > createSimulation(const MultiLayerItem *sampleItem, const InstrumentItem *instrumentItem, const SimulationOptionsItem *optionsItem=nullptr)
Creates domain simulation from sample and instrument items.
QVector< double > fromStdVector(const std::vector< double > &data)
Definition: GUIHelpers.cpp:225