Skip to content

Commit 681c7d7

Browse files
committed
Remove direct use of boost::python in modelfitting
1 parent f5179a7 commit 681c7d7

File tree

5 files changed

+28
-16
lines changed

5 files changed

+28
-16
lines changed

SEImplementation/SEImplementation/Plugin/FlexibleModelFitting/FlexibleModelFittingParameter.h

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,7 @@
1313
#include <functional>
1414
#include <vector>
1515
#include <mutex>
16-
17-
#include <boost/python/object.hpp>
16+
#include "SEFramework/CoordinateSystem/CoordinateSystem.h"
1817

1918
namespace ModelFitting {
2019
class BasicParameter;
@@ -93,8 +92,12 @@ class FlexibleModelFittingFreeParameter : public FlexibleModelFittingParameter {
9392
class FlexibleModelFittingDependentParameter : public FlexibleModelFittingParameter {
9493

9594
public:
95+
96+
/// The signature of a function that evaluates the dependent parameter. It gets
97+
/// as parameters the values of those parameters on which this one depends.
98+
using ValueFunc = std::function<double(const std::shared_ptr<CoordinateSystem>&, const std::vector<double>&)>;
9699

97-
FlexibleModelFittingDependentParameter(int id, boost::python::object value_calculator,
100+
FlexibleModelFittingDependentParameter(int id, ValueFunc value_calculator,
98101
std::vector<std::shared_ptr<FlexibleModelFittingParameter>> parameters)
99102
: FlexibleModelFittingParameter(id),
100103
m_value_calculator(value_calculator),
@@ -106,8 +109,8 @@ class FlexibleModelFittingDependentParameter : public FlexibleModelFittingParame
106109
const SourceInterface& source) const override;
107110

108111
private:
109-
110-
boost::python::object m_value_calculator;
112+
113+
ValueFunc m_value_calculator;
111114
std::vector<std::shared_ptr<FlexibleModelFittingParameter>> m_parameters;
112115

113116
};

SEImplementation/src/lib/Configuration/ModelFittingConfig.cpp

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -109,8 +109,19 @@ void ModelFittingConfig::initialize(const UserValues&) {
109109
int id = py::extract<int>(param_ids[i]);
110110
params.push_back(m_parameters[id]);
111111
}
112+
113+
auto dependent_func = [py_func](const std::shared_ptr<CoordinateSystem> &cs, const std::vector<double> &params) -> double {
114+
try {
115+
PythonInterpreter::getSingleton().setCoordinateSystem(cs);
116+
return py::extract<double>(py_func(*py::tuple(params)));
117+
}
118+
catch (const py::error_already_set&) {
119+
throw pyToElementsException(logger);
120+
}
121+
};
122+
112123
m_parameters[p.first] = std::make_shared<FlexibleModelFittingDependentParameter>(
113-
p.first, py_func, params);
124+
p.first, dependent_func, params);
114125
}
115126

116127
for (auto& p : getDependency<PythonConfig>().getInterpreter().getPointSourceModels()) {

SEImplementation/src/lib/Plugin/FlexibleModelFitting/FlexibleModelFittingParameter.cpp

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66
*/
77

88
#include <iostream>
9-
#include <boost/python.hpp>
109

1110
#include "ModelFitting/utils.h"
1211

@@ -77,19 +76,14 @@ template<typename ... Parameters>
7776
std::shared_ptr<ModelFitting::BasicParameter> createDependentParameterHelper(
7877
FlexibleModelFittingParameterManager& parameter_manager,
7978
const SourceInterface& source,
80-
boost::python::object value_calculator,
79+
FlexibleModelFittingDependentParameter::ValueFunc value_calculator,
8180
std::shared_ptr<Parameters>... parameters) {
8281
auto coordinate_system = source.getProperty<DetectionFrame>().getFrame()->getCoordinateSystem();
8382

8483
auto calc = [value_calculator, coordinate_system] (decltype(doubleResolver(std::declval<Parameters>()))... params) -> double {
8584
std::lock_guard<std::mutex> guard {python_callback_mutex};
86-
try {
87-
PythonInterpreter::getSingleton().setCoordinateSystem(coordinate_system);
88-
return boost::python::extract<double>(value_calculator(params...));
89-
}
90-
catch (const boost::python::error_already_set &e) {
91-
throw pyToElementsException(logger);
92-
}
85+
std::vector<double> materialized{params...};
86+
return value_calculator(coordinate_system, materialized);
9387
};
9488
return createDependentParameterPtr(calc, *(parameter_manager.getParameter(source, parameters))...);
9589
}

SEImplementation/src/lib/Plugin/FlexibleModelFitting/FlexibleModelFittingPrior.cpp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66
*/
77

88
#include <iostream>
9-
#include <boost/python.hpp>
109
#include <mutex>
1110

1211
#include "ModelFitting/utils.h"

SEImplementation/src/lib/PythonConfig/PythonModule.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
*/
55

66
#include <boost/python.hpp>
7+
#include <boost/python/suite/indexing/vector_indexing_suite.hpp>
78

89
#include <SEImplementation/PythonConfig/ObjectInfo.h>
910
#include <SEImplementation/PythonConfig/PyMeasurementImage.h>
@@ -61,6 +62,10 @@ BOOST_PYTHON_MODULE(_SExtractorPy) {
6162
.def(bp::init<double, double>())
6263
.def_readwrite("x", &ImageCoordinate::m_x)
6364
.def_readwrite("y", &ImageCoordinate::m_y);
65+
66+
bp::class_<std::vector<double> >("_DoubleVector")
67+
.def(bp::vector_indexing_suite<std::vector<double> >())
68+
;
6469
}
6570

6671
} // namespace SExtractor

0 commit comments

Comments
 (0)