BornAgain  1.19.0
Simulate and fit neutron and x-ray scattering at grazing incidence
GUIFitObserver Class Reference

Serves as observer for FitObjective and saves fit iteration data for later display in GUI widgets. More...

Inheritance diagram for GUIFitObserver:
[legend]
Collaboration diagram for GUIFitObserver:
[legend]

Public Slots

void setInterval (int val)
 

Signals

void updateReady ()
 

Public Member Functions

 GUIFitObserver (QObject *parent=nullptr)
 
 ~GUIFitObserver ()
 
void finishedPlotting ()
 Informs observer that FitSuiteWidget has finished plotting and is ready for next plot. More...
 
FitProgressInfo progressInfo ()
 
void update (const FitObjective *subject)
 

Private Member Functions

bool is_obligatory_iteration (const FitObjective *fitSuite) const
 Returns true if given iteration should be obligary plotted. More...
 
bool is_suitable_iteration (const FitObjective *fitSuite) const
 Returns true if data could be plotted, when there are resources for it. More...
 

Private Attributes

bool m_block_update_plots
 
FitProgressInfo m_iteration_info
 
std::condition_variable m_on_finish_notifier
 
int m_update_interval
 
std::mutex m_update_plot_mutex
 

Detailed Description

Serves as observer for FitObjective and saves fit iteration data for later display in GUI widgets.

Definition at line 30 of file GUIFitObserver.h.

Constructor & Destructor Documentation

◆ GUIFitObserver()

GUIFitObserver::GUIFitObserver ( QObject *  parent = nullptr)

Definition at line 20 of file GUIFitObserver.cpp.

21  : QObject(parent), m_block_update_plots(false), m_update_interval(1)
22 {
23 }
bool m_block_update_plots

◆ ~GUIFitObserver()

GUIFitObserver::~GUIFitObserver ( )
default

Member Function Documentation

◆ finishedPlotting()

void GUIFitObserver::finishedPlotting ( )

Informs observer that FitSuiteWidget has finished plotting and is ready for next plot.

Definition at line 80 of file GUIFitObserver.cpp.

81 {
82  std::unique_lock<std::mutex> lock(m_update_plot_mutex);
83  m_block_update_plots = false;
84  lock.unlock();
85  m_on_finish_notifier.notify_one();
86 }
std::condition_variable m_on_finish_notifier
std::mutex m_update_plot_mutex

References m_block_update_plots, m_on_finish_notifier, and m_update_plot_mutex.

◆ is_obligatory_iteration()

bool GUIFitObserver::is_obligatory_iteration ( const FitObjective fitSuite) const
private

Returns true if given iteration should be obligary plotted.

Definition at line 68 of file GUIFitObserver.cpp.

69 {
70  return fitSuite->isCompleted();
71 }
bool isCompleted() const

References FitObjective::isCompleted().

Referenced by update().

Here is the call graph for this function:

◆ is_suitable_iteration()

bool GUIFitObserver::is_suitable_iteration ( const FitObjective fitSuite) const
private

Returns true if data could be plotted, when there are resources for it.

Definition at line 56 of file GUIFitObserver.cpp.

57 {
58  if (fitSuite->isInterrupted())
59  return false;
60 
61  int n_iter = static_cast<int>(fitSuite->iterationInfo().iterationCount());
62  return fitSuite->isFirstIteration() || n_iter % m_update_interval == 0
63  || fitSuite->isCompleted();
64 }
bool isFirstIteration() const
IterationInfo iterationInfo() const
bool isInterrupted() const
unsigned iterationCount() const
Returns current number of minimizer iterations.

References FitObjective::isCompleted(), FitObjective::isFirstIteration(), FitObjective::isInterrupted(), IterationInfo::iterationCount(), FitObjective::iterationInfo(), and m_update_interval.

Referenced by update().

Here is the call graph for this function:

◆ progressInfo()

FitProgressInfo GUIFitObserver::progressInfo ( )

Definition at line 88 of file GUIFitObserver.cpp.

89 {
90  std::unique_lock<std::mutex> lock(m_update_plot_mutex);
91  m_block_update_plots = true;
92  return m_iteration_info;
93 }
FitProgressInfo m_iteration_info

References m_block_update_plots, m_iteration_info, and m_update_plot_mutex.

◆ setInterval

void GUIFitObserver::setInterval ( int  val)
slot

Definition at line 73 of file GUIFitObserver.cpp.

74 {
75  m_update_interval = val;
76 }

References m_update_interval.

◆ update()

void GUIFitObserver::update ( const FitObjective subject)

Definition at line 27 of file GUIFitObserver.cpp.

28 {
29  if (!is_suitable_iteration(subject))
30  return;
31 
32  std::unique_lock<std::mutex> lock(m_update_plot_mutex);
34  return; // plotting still works, will skip iteration
35 
37  m_on_finish_notifier.wait(lock, [this]() { return m_block_update_plots; });
38 
39  FitProgressInfo info;
40  info.m_chi2 = subject->iterationInfo().chi2();
41  info.m_iteration_count = static_cast<int>(subject->iterationInfo().iterationCount());
42  info.m_values = subject->iterationInfo().parameters().values();
43 
44  if (subject->isCompleted())
45  info.m_log_info = subject->minimizerResult().toString();
46 
47  auto data = subject->dataPair().simulationResult().data();
48  info.m_sim_values = data->getRawDataVector();
49 
50  m_iteration_info = info;
51  emit updateReady();
52 }
mumufit::MinimizerResult minimizerResult() const
const SimDataPair & dataPair(size_t i_item=0) const
Returns a reference to i-th SimDataPair.
The FitProgressInfo class contains all essential information about fit progress.
std::string m_log_info
std::vector< double > m_values
std::vector< double > m_sim_values
bool is_suitable_iteration(const FitObjective *fitSuite) const
Returns true if data could be plotted, when there are resources for it.
bool is_obligatory_iteration(const FitObjective *fitSuite) const
Returns true if given iteration should be obligary plotted.
void updateReady()
mumufit::Parameters parameters() const
double chi2() const
SimulationResult simulationResult() const
Returns the result of last computed simulation.
Definition: SimDataPair.cpp:96
std::unique_ptr< OutputData< double > > data(Axes::Units units=Axes::Units::DEFAULT) const
std::string toString() const
Returns multi-line string representing minimization results.
std::vector< double > values() const
Definition: Parameters.cpp:56

References IterationInfo::chi2(), SimulationResult::data(), FitObjective::dataPair(), is_obligatory_iteration(), is_suitable_iteration(), FitObjective::isCompleted(), IterationInfo::iterationCount(), FitObjective::iterationInfo(), m_block_update_plots, FitProgressInfo::m_chi2, FitProgressInfo::m_iteration_count, m_iteration_info, FitProgressInfo::m_log_info, m_on_finish_notifier, FitProgressInfo::m_sim_values, m_update_plot_mutex, FitProgressInfo::m_values, FitObjective::minimizerResult(), IterationInfo::parameters(), SimDataPair::simulationResult(), mumufit::MinimizerResult::toString(), updateReady(), and mumufit::Parameters::values().

Here is the call graph for this function:

◆ updateReady

void GUIFitObserver::updateReady ( )
signal

Member Data Documentation

◆ m_block_update_plots

bool GUIFitObserver::m_block_update_plots
private

Definition at line 53 of file GUIFitObserver.h.

Referenced by finishedPlotting(), progressInfo(), and update().

◆ m_iteration_info

FitProgressInfo GUIFitObserver::m_iteration_info
private

Definition at line 57 of file GUIFitObserver.h.

Referenced by progressInfo(), and update().

◆ m_on_finish_notifier

std::condition_variable GUIFitObserver::m_on_finish_notifier
private

Definition at line 55 of file GUIFitObserver.h.

Referenced by finishedPlotting(), and update().

◆ m_update_interval

int GUIFitObserver::m_update_interval
private

Definition at line 56 of file GUIFitObserver.h.

Referenced by is_suitable_iteration(), and setInterval().

◆ m_update_plot_mutex

std::mutex GUIFitObserver::m_update_plot_mutex
private

Definition at line 54 of file GUIFitObserver.h.

Referenced by finishedPlotting(), progressInfo(), and update().


The documentation for this class was generated from the following files: