SourceXtractorPlusPlus  0.10
Please provide a description of the project.
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
FlexibleModelFittingParameterManager.h
Go to the documentation of this file.
1 
17 /*
18  * FlexibleModelFittingParameterManager.h
19  *
20  * Created on: Oct 9, 2018
21  * Author: mschefer
22  */
23 
24 #ifndef _SEIMPLEMENTATION_PLUGIN_FLEXIBLEMODELFITTING_FLEXIBLEMODELFITTINGPARAMETERMANAGER_H_
25 #define _SEIMPLEMENTATION_PLUGIN_FLEXIBLEMODELFITTING_FLEXIBLEMODELFITTINGPARAMETERMANAGER_H_
26 
27 #include <map>
28 #include <vector>
29 
33 
34 namespace SourceXtractor {
35 
36 // Needed to store the source in a reference_wrapper
37 inline bool operator<(std::reference_wrapper<const SourceInterface> a, std::reference_wrapper<const SourceInterface> b) {
38  return &a.get() < &b.get();
39 }
40 
41 class FlexibleModelFittingParameter;
42 
44 
45 public:
46 
49 
50 
53  auto key = std::make_tuple(std::cref(source), parameter);
54  m_accessed_params.insert(key);
55  followDependencies(source, parameter);
56  return m_params.at(key);
57  }
58 
61  m_params[std::make_tuple(std::cref(source), parameter)] = engine_parameter;
62 
63  if (std::dynamic_pointer_cast<const FlexibleModelFittingFreeParameter>(parameter)) {
64  m_parameter_indices[engine_parameter] = m_current_parameter_index++;
65  }
66  }
67 
68  int getParameterNb() const {
69  return m_params.size();
70  }
71 
73  m_accessed_params.clear();
74  }
75 
77  auto key = std::make_tuple(std::cref(source), parameter);
78  return m_accessed_params.count(key) > 0;
79  }
80 
82  return m_parameter_indices.at(engine_parameter);
83  }
84 
86  return getParameterIndex(getParameter(source, parameter));
87  }
88 
89 private:
92 
93  // remember the order of the parameters for model fitting (used to retrieve sigma)
96 
97  // Propagate access to dependees
99  auto dependent_parameter = std::dynamic_pointer_cast<const FlexibleModelFittingDependentParameter>(parameter).get();
100  if (dependent_parameter) {
101  for (auto &dependee : dependent_parameter->getDependees()) {
102  auto key_dependee = std::make_tuple(std::cref(source), dependee);
103  m_accessed_params.insert(key_dependee);
104  followDependencies(source, dependee);
105  }
106  }
107  }
108 };
109 
110 }
111 
112 
113 
114 #endif /* _SEIMPLEMENTATION_PLUGIN_FLEXIBLEMODELFITTING_FLEXIBLEMODELFITTINGPARAMETERMANAGER_H_ */
int getParameterIndex(const SourceInterface &source, std::shared_ptr< const FlexibleModelFittingParameter > parameter) const
void addParameter(const SourceInterface &source, std::shared_ptr< const FlexibleModelFittingParameter > parameter, std::shared_ptr< ModelFitting::BasicParameter > engine_parameter)
std::set< std::tuple< std::reference_wrapper< const SourceInterface >, std::shared_ptr< const FlexibleModelFittingParameter > > > m_accessed_params
std::map< std::tuple< std::reference_wrapper< const SourceInterface >, std::shared_ptr< const FlexibleModelFittingParameter > >, std::shared_ptr< ModelFitting::BasicParameter > > m_params
int getParameterIndex(std::shared_ptr< ModelFitting::BasicParameter > engine_parameter) const
T make_tuple(T...args)
std::map< std::shared_ptr< ModelFitting::BasicParameter >, int > m_parameter_indices
STL class.
void followDependencies(const SourceInterface &source, std::shared_ptr< const FlexibleModelFittingParameter > parameter) const
T dynamic_pointer_cast(T...args)
bool isParamAccessed(const SourceInterface &source, std::shared_ptr< const FlexibleModelFittingParameter > parameter) const
STL class.
T cref(T...args)
std::shared_ptr< ModelFitting::BasicParameter > getParameter(const SourceInterface &source, std::shared_ptr< const FlexibleModelFittingParameter > parameter) const
The SourceInterface is an abstract &quot;source&quot; that has properties attached to it.