SourceXtractorPlusPlus 0.21
SourceXtractor++, the next generation SExtractor
Loading...
Searching...
No Matches
FlexibleModelFittingParameter.cpp
Go to the documentation of this file.
1
17/*
18 * FlexibleModelFittingParameter.cpp
19 *
20 * Created on: Oct 8, 2018
21 * Author: mschefer
22 */
23
24#include <iostream>
25
26#include <boost/version.hpp>
27#if BOOST_VERSION >= 106700
28
29#if BOOST_VERSION >= 107000
30#include <boost/math/differentiation/finite_difference.hpp>
31namespace bmd = boost::math::differentiation;
32#else
33#include <boost/math/tools/numerical_differentiation.hpp>
34namespace bmd = boost::math::tools;
35#endif
36
37#endif
38
39#include "AlexandriaKernel/memory_tools.h"
40#include "ElementsKernel/Logging.h"
45
52
53
55
56
57namespace SourceXtractor {
58
59using namespace ModelFitting;
60
62
64 return m_id;
65}
66
69
76
89
101
107
111
112namespace {
113
114template <typename T>
115double doubleResolver(const T&) {
116 return 0;
117}
118
119
120template<typename ... Parameters>
122 FlexibleModelFittingParameterManager& parameter_manager,
123 const SourceInterface& source,
126
127 auto coordinate_system = source.getProperty<ReferenceCoordinates>().getCoordinateSystem();
128 auto calc = [value_calculator, coordinate_system] (decltype(doubleResolver(std::declval<Parameters>()))... params) -> double {
131 };
133}
134
135}
136
137
141 const SourceInterface& source) const {
142 switch (m_parameters.size()) {
143 case 1:
145 m_parameters[0]);
146 case 2:
149 case 3:
152 case 4:
155 case 5:
158 case 6:
161 m_parameters[5]);
162 case 7:
166 case 8:
170 case 9:
174 case 10:
178 }
179 throw Elements::Exception() << "Dependent parameters can depend on maximum 10 other parameters";
180}
181
184 assert(param_values.size() == m_parameters.size());
185
187 auto cs = source.getProperty<ReferenceCoordinates>().getCoordinateSystem();
188
189 for (unsigned int i = 0; i < result.size(); i++) {
190
191 auto f = [&](double x) {
192 auto params = param_values;
193 params[i] = x;
194 return m_value_calculator(cs, params);
195 };
196
197#if BOOST_VERSION >= 106700
198 result[i] = bmd::finite_difference_derivative(f, param_values[i]);
199#else
200 // if boost's function is unavailable use our own function
202#endif
203 }
204
205 return result;
206}
207
210 auto dependees = getDependees();
212
213 for (auto& dependee : dependees) {
214 values.emplace_back(parameter_manager.getParameter(source, dependee)->getValue());
215 }
216
217 double sigma = 0.0;
219
220 assert(dependees.size() == partial_derivatives.size());
221 for (unsigned int i = 0; i < partial_derivatives.size(); i++) {
224 }
225 sigma = sqrt(sigma);
226
227 return sigma;
228}
229
230}
static Elements::Logging logger
std::shared_ptr< DependentParameter< std::shared_ptr< EngineParameter > > > x
static Logging getLogger(const std::string &name="")
Class responsible for managing the parameters the least square engine minimizes.
std::shared_ptr< ModelFitting::BasicParameter > create(FlexibleModelFittingParameterManager &parameter_manager, ModelFitting::EngineParameterManager &engine_manager, const SourceInterface &source) const override
std::function< double(const std::shared_ptr< CoordinateSystem > &, const std::vector< double > &)> ValueFunc
std::vector< std::shared_ptr< FlexibleModelFittingParameter > > m_parameters
double getSigma(FlexibleModelFittingParameterManager &parameter_manager, const SourceInterface &source, const std::vector< double > &free_parameter_sigmas) const override
const std::vector< std::shared_ptr< FlexibleModelFittingParameter > > & getDependees() const
std::vector< double > getPartialDerivatives(const SourceInterface &source, const std::vector< double > &param_values) const
std::shared_ptr< ModelFitting::BasicParameter > create(FlexibleModelFittingParameterManager &parameter_manager, ModelFitting::EngineParameterManager &engine_manager, const SourceInterface &source) const override
double getSigma(FlexibleModelFittingParameterManager &parameter_manager, const SourceInterface &source, const std::vector< double > &free_parameter_sigmas) const override
double getInitialValue(const SourceInterface &source) const
std::shared_ptr< FlexibleModelFittingConverterFactory > m_converter_factory
std::shared_ptr< ModelFitting::BasicParameter > create(FlexibleModelFittingParameterManager &parameter_manager, ModelFitting::EngineParameterManager &engine_manager, const SourceInterface &source) const override
static double centralDifference(std::function< double(double)> f, double x)
The SourceInterface is an abstract "source" that has properties attached to it.
T move(T... args)
std::shared_ptr< DependentParameter< Parameters... > > createDependentParameter(typename DependentParameter< Parameters... >::ValueCalculator value_calculator, Parameters... parameters)
T sqrt(T... args)