SourceXtractorPlusPlus
0.21
SourceXtractor++, the next generation SExtractor
Loading...
Searching...
No Matches
SEImplementation
src
lib
Plugin
FlexibleModelFitting
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>
31
namespace
bmd = boost::math::differentiation;
32
#else
33
#include <boost/math/tools/numerical_differentiation.hpp>
34
namespace
bmd = boost::math::tools;
35
#endif
36
37
#endif
38
39
#include "AlexandriaKernel/memory_tools.h"
40
#include "ElementsKernel/Logging.h"
41
#include "
ModelFitting/Parameters/ManualParameter.h
"
42
#include "
ModelFitting/Parameters/EngineParameter.h
"
43
#include "
ModelFitting/Parameters/DependentParameter.h
"
44
#include "
ModelFitting/Engine/EngineParameterManager.h
"
45
46
#include "
SEUtils/NumericalDerivative.h
"
47
#include "
SEFramework/Source/SourceInterface.h
"
48
#include "
SEImplementation/Plugin/ReferenceCoordinates/ReferenceCoordinates.h
"
49
#include "
SEImplementation/Plugin/FlexibleModelFitting/FlexibleModelFittingParameter.h
"
50
#include "
SEImplementation/Plugin/FlexibleModelFitting/FlexibleModelFittingParameterManager.h
"
51
#include "
SEImplementation/Plugin/FlexibleModelFitting/FlexibleModelFittingConverterFactory.h
"
52
53
54
static
Elements::Logging
logger
=
Elements::Logging::getLogger
(
"ModelFitting"
);
55
56
57
namespace
SourceXtractor
{
58
59
using namespace
ModelFitting
;
60
61
FlexibleModelFittingParameter::FlexibleModelFittingParameter
(
int
id
) : m_id(id) { }
62
63
int
FlexibleModelFittingParameter::getId
()
const
{
64
return
m_id
;
65
}
66
67
FlexibleModelFittingConstantParameter::FlexibleModelFittingConstantParameter
(
int
id
,
ValueFunc
value)
68
:
FlexibleModelFittingParameter
(id), m_value(value) { }
69
70
std::shared_ptr<ModelFitting::BasicParameter>
FlexibleModelFittingConstantParameter::create
(
71
FlexibleModelFittingParameterManager
&
/*parameter_manager*/
,
72
ModelFitting::EngineParameterManager
&
/*engine_manager*/
,
73
const
SourceInterface
&
source
)
const
{
74
return
std::make_shared<ManualParameter>
(
m_value
(
source
));
75
}
76
77
std::shared_ptr<ModelFitting::BasicParameter>
FlexibleModelFittingFreeParameter::create
(
78
FlexibleModelFittingParameterManager
&
/*parameter_manager*/
,
79
ModelFitting::EngineParameterManager
&
engine_manager
,
80
const
SourceInterface
&
source
)
const
{
81
double
initial_value
=
m_initial_value
(
source
);
82
83
auto
converter =
m_converter_factory
->getConverter(
initial_value
,
source
);
84
auto
parameter
=
std::make_shared<EngineParameter>
(
initial_value
,
std::move
(converter));
85
engine_manager
.registerParameter(
parameter
);
86
87
return
parameter
;
88
}
89
90
std::shared_ptr<ModelFitting::BasicParameter>
FlexibleModelFittingFreeParameter::create
(
91
FlexibleModelFittingParameterManager
&
/*parameter_manager*/
,
92
ModelFitting::EngineParameterManager
&
engine_manager
,
93
const
SourceInterface
&
source
,
94
double
initial_value
,
double
current_value
)
const
{
95
auto
converter =
m_converter_factory
->getConverter(
initial_value
,
source
);
96
auto
parameter
=
std::make_shared<EngineParameter>
(
current_value
,
std::move
(converter));
97
engine_manager
.registerParameter(
parameter
);
98
99
return
parameter
;
100
}
101
102
double
FlexibleModelFittingFreeParameter::getSigma
(
FlexibleModelFittingParameterManager
&
parameter_manager
,
const
SourceInterface
&
source
,
103
const
std::vector<double>
&
free_parameter_sigmas
)
const
{
104
auto
modelfitting_parameter
=
parameter_manager
.getParameter(
source
,
shared_from_this
());
105
return
free_parameter_sigmas
[
parameter_manager
.getParameterIndex(
source
,
shared_from_this
())];
106
}
107
108
double
FlexibleModelFittingFreeParameter::getInitialValue
(
const
SourceInterface
&
source
)
const
{
109
return
m_initial_value
(
source
);
110
}
111
112
namespace
{
113
114
template
<
typename
T>
115
double
doubleResolver
(
const
T&) {
116
return
0;
117
}
118
119
120
template
<
typename
...
Parameters
>
121
std::shared_ptr<ModelFitting::BasicParameter>
createDependentParameterHelper
(
122
FlexibleModelFittingParameterManager&
parameter_manager
,
123
const
SourceInterface&
source
,
124
FlexibleModelFittingDependentParameter::ValueFunc
value_calculator
,
125
std::shared_ptr<Parameters>
...
parameters
) {
126
127
auto
coordinate_system
=
source
.getProperty<ReferenceCoordinates>().getCoordinateSystem();
128
auto
calc
= [
value_calculator
,
coordinate_system
] (
decltype
(
doubleResolver
(
std::declval<Parameters>
()))... params) ->
double
{
129
std::vector<double>
materialized
{params...};
130
return
value_calculator
(
coordinate_system
,
materialized
);
131
};
132
return
createDependentParameter
(
calc
,
parameter_manager
.getParameter(
source
,
parameters
)...);
133
}
134
135
}
136
137
138
std::shared_ptr<ModelFitting::BasicParameter>
FlexibleModelFittingDependentParameter::create
(
139
FlexibleModelFittingParameterManager
&
parameter_manager
,
140
ModelFitting::EngineParameterManager
&,
141
const
SourceInterface
&
source
)
const
{
142
switch
(
m_parameters
.size()) {
143
case
1:
144
return
createDependentParameterHelper
(
parameter_manager
,
source
,
m_value_calculator
,
145
m_parameters
[0]);
146
case
2:
147
return
createDependentParameterHelper
(
parameter_manager
,
source
,
m_value_calculator
,
148
m_parameters
[0],
m_parameters
[1]);
149
case
3:
150
return
createDependentParameterHelper
(
parameter_manager
,
source
,
m_value_calculator
,
151
m_parameters
[0],
m_parameters
[1],
m_parameters
[2]);
152
case
4:
153
return
createDependentParameterHelper
(
parameter_manager
,
source
,
m_value_calculator
,
154
m_parameters
[0],
m_parameters
[1],
m_parameters
[2],
m_parameters
[3]);
155
case
5:
156
return
createDependentParameterHelper
(
parameter_manager
,
source
,
m_value_calculator
,
157
m_parameters
[0],
m_parameters
[1],
m_parameters
[2],
m_parameters
[3],
m_parameters
[4]);
158
case
6:
159
return
createDependentParameterHelper
(
parameter_manager
,
source
,
m_value_calculator
,
160
m_parameters
[0],
m_parameters
[1],
m_parameters
[2],
m_parameters
[3],
m_parameters
[4],
161
m_parameters
[5]);
162
case
7:
163
return
createDependentParameterHelper
(
parameter_manager
,
source
,
m_value_calculator
,
164
m_parameters
[0],
m_parameters
[1],
m_parameters
[2],
m_parameters
[3],
m_parameters
[4],
165
m_parameters
[5],
m_parameters
[6]);
166
case
8:
167
return
createDependentParameterHelper
(
parameter_manager
,
source
,
m_value_calculator
,
168
m_parameters
[0],
m_parameters
[1],
m_parameters
[2],
m_parameters
[3],
m_parameters
[4],
169
m_parameters
[5],
m_parameters
[6],
m_parameters
[7]);
170
case
9:
171
return
createDependentParameterHelper
(
parameter_manager
,
source
,
m_value_calculator
,
172
m_parameters
[0],
m_parameters
[1],
m_parameters
[2],
m_parameters
[3],
m_parameters
[4],
173
m_parameters
[5],
m_parameters
[6],
m_parameters
[7],
m_parameters
[8]);
174
case
10:
175
return
createDependentParameterHelper
(
parameter_manager
,
source
,
m_value_calculator
,
176
m_parameters
[0],
m_parameters
[1],
m_parameters
[2],
m_parameters
[3],
m_parameters
[4],
177
m_parameters
[5],
m_parameters
[6],
m_parameters
[7],
m_parameters
[8],
m_parameters
[9]);
178
}
179
throw
Elements::Exception
() <<
"Dependent parameters can depend on maximum 10 other parameters"
;
180
}
181
182
std::vector<double>
FlexibleModelFittingDependentParameter::getPartialDerivatives
(
183
const
SourceInterface
&
source
,
const
std::vector<double>
&
param_values
)
const
{
184
assert
(
param_values
.size() ==
m_parameters
.size());
185
186
std::vector<double>
result
(
param_values
.size());
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
201
result
[
i
] =
NumericalDerivative::centralDifference
(f,
param_values
[
i
]);
202
#endif
203
}
204
205
return
result
;
206
}
207
208
double
FlexibleModelFittingDependentParameter::getSigma
(
FlexibleModelFittingParameterManager
&
parameter_manager
,
const
SourceInterface
&
source
,
209
const
std::vector<double>
&
free_parameter_sigmas
)
const
{
210
auto
dependees
=
getDependees
();
211
std::vector<double>
values
;
212
213
for
(
auto
&
dependee
:
dependees
) {
214
values
.emplace_back(
parameter_manager
.getParameter(
source
,
dependee
)->getValue());
215
}
216
217
double
sigma = 0.0;
218
auto
partial_derivatives
=
getPartialDerivatives
(
source
,
values
);
219
220
assert
(
dependees
.size() ==
partial_derivatives
.size());
221
for
(
unsigned
int
i
= 0;
i
<
partial_derivatives
.size();
i
++) {
222
auto
dependee_sigma
=
dependees
[
i
]->getSigma(
parameter_manager
,
source
,
free_parameter_sigmas
);
223
sigma +=
partial_derivatives
[
i
] *
partial_derivatives
[
i
] *
dependee_sigma
*
dependee_sigma
;
224
}
225
sigma =
sqrt
(sigma);
226
227
return
sigma;
228
}
229
230
}
DependentParameter.h
EngineParameterManager.h
EngineParameter.h
FlexibleModelFittingConverterFactory.h
FlexibleModelFittingParameterManager.h
logger
static Elements::Logging logger
Definition
FlexibleModelFittingParameter.cpp:54
FlexibleModelFittingParameter.h
ManualParameter.h
x
std::shared_ptr< DependentParameter< std::shared_ptr< EngineParameter > > > x
Definition
MoffatModelFittingTask.cpp:94
NumericalDerivative.h
ReferenceCoordinates.h
SourceInterface.h
Elements::Exception
Elements::Logging
Elements::Logging::getLogger
static Logging getLogger(const std::string &name="")
ModelFitting::EngineParameterManager
Class responsible for managing the parameters the least square engine minimizes.
Definition
EngineParameterManager.h:61
SourceXtractor::FlexibleModelFittingConstantParameter::create
std::shared_ptr< ModelFitting::BasicParameter > create(FlexibleModelFittingParameterManager ¶meter_manager, ModelFitting::EngineParameterManager &engine_manager, const SourceInterface &source) const override
Definition
FlexibleModelFittingParameter.cpp:70
SourceXtractor::FlexibleModelFittingConstantParameter::FlexibleModelFittingConstantParameter
FlexibleModelFittingConstantParameter(int id, ValueFunc value)
Definition
FlexibleModelFittingParameter.cpp:67
SourceXtractor::FlexibleModelFittingConstantParameter::m_value
ValueFunc m_value
Definition
FlexibleModelFittingParameter.h:90
SourceXtractor::FlexibleModelFittingDependentParameter::ValueFunc
std::function< double(const std::shared_ptr< CoordinateSystem > &, const std::vector< double > &)> ValueFunc
Definition
FlexibleModelFittingParameter.h:135
SourceXtractor::FlexibleModelFittingDependentParameter::m_parameters
std::vector< std::shared_ptr< FlexibleModelFittingParameter > > m_parameters
Definition
FlexibleModelFittingParameter.h:160
SourceXtractor::FlexibleModelFittingDependentParameter::getSigma
double getSigma(FlexibleModelFittingParameterManager ¶meter_manager, const SourceInterface &source, const std::vector< double > &free_parameter_sigmas) const override
Definition
FlexibleModelFittingParameter.cpp:208
SourceXtractor::FlexibleModelFittingDependentParameter::m_value_calculator
ValueFunc m_value_calculator
Definition
FlexibleModelFittingParameter.h:159
SourceXtractor::FlexibleModelFittingDependentParameter::getDependees
const std::vector< std::shared_ptr< FlexibleModelFittingParameter > > & getDependees() const
Definition
FlexibleModelFittingParameter.h:148
SourceXtractor::FlexibleModelFittingDependentParameter::getPartialDerivatives
std::vector< double > getPartialDerivatives(const SourceInterface &source, const std::vector< double > ¶m_values) const
Definition
FlexibleModelFittingParameter.cpp:182
SourceXtractor::FlexibleModelFittingDependentParameter::create
std::shared_ptr< ModelFitting::BasicParameter > create(FlexibleModelFittingParameterManager ¶meter_manager, ModelFitting::EngineParameterManager &engine_manager, const SourceInterface &source) const override
Definition
FlexibleModelFittingParameter.cpp:138
SourceXtractor::FlexibleModelFittingFreeParameter::getSigma
double getSigma(FlexibleModelFittingParameterManager ¶meter_manager, const SourceInterface &source, const std::vector< double > &free_parameter_sigmas) const override
Definition
FlexibleModelFittingParameter.cpp:102
SourceXtractor::FlexibleModelFittingFreeParameter::getInitialValue
double getInitialValue(const SourceInterface &source) const
Definition
FlexibleModelFittingParameter.cpp:108
SourceXtractor::FlexibleModelFittingFreeParameter::m_initial_value
InitialValueFunc m_initial_value
Definition
FlexibleModelFittingParameter.h:125
SourceXtractor::FlexibleModelFittingFreeParameter::m_converter_factory
std::shared_ptr< FlexibleModelFittingConverterFactory > m_converter_factory
Definition
FlexibleModelFittingParameter.h:126
SourceXtractor::FlexibleModelFittingFreeParameter::create
std::shared_ptr< ModelFitting::BasicParameter > create(FlexibleModelFittingParameterManager ¶meter_manager, ModelFitting::EngineParameterManager &engine_manager, const SourceInterface &source) const override
Definition
FlexibleModelFittingParameter.cpp:77
SourceXtractor::FlexibleModelFittingParameterManager
Definition
FlexibleModelFittingParameterManager.h:44
SourceXtractor::FlexibleModelFittingParameter
Definition
FlexibleModelFittingParameter.h:45
SourceXtractor::FlexibleModelFittingParameter::getId
virtual int getId() const final
Definition
FlexibleModelFittingParameter.cpp:63
SourceXtractor::FlexibleModelFittingParameter::m_id
int m_id
Definition
FlexibleModelFittingParameter.h:64
SourceXtractor::FlexibleModelFittingParameter::FlexibleModelFittingParameter
FlexibleModelFittingParameter(int id)
Definition
FlexibleModelFittingParameter.cpp:61
SourceXtractor::NumericalDerivative::centralDifference
static double centralDifference(std::function< double(double)> f, double x)
Definition
NumericalDerivative.h:34
SourceXtractor::ReferenceCoordinates
Definition
ReferenceCoordinates.h:26
SourceXtractor::SourceInterface
The SourceInterface is an abstract "source" that has properties attached to it.
Definition
SourceInterface.h:46
std::function< double(const SourceInterface &)>
std::move
T move(T... args)
ModelFitting
Definition
AsinhChiSquareComparator.h:30
ModelFitting::createDependentParameter
std::shared_ptr< DependentParameter< Parameters... > > createDependentParameter(typename DependentParameter< Parameters... >::ValueCalculator value_calculator, Parameters... parameters)
Definition
DependentParameter.h:131
SourceXtractor
Definition
Aperture.h:30
std::enable_shared_from_this< FlexibleModelFittingParameter >::shared_from_this
T shared_from_this(T... args)
std::sqrt
T sqrt(T... args)
Generated by
1.10.0