Skip to content

Commit 3a38ab8

Browse files
Add parameter container to python bindings
1 parent 5ccea65 commit 3a38ab8

4 files changed

Lines changed: 45 additions & 0 deletions

File tree

python/core/py_core.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ void declareCore(py::module& m) {
3737

3838
declareEigenTypes(m);
3939
declareParameter(m);
40+
declareParameterContainer(m);
4041
declareG2OBatchStatistics(m);
4142

4243
declareJacobianWorkspace(m);

python/core/py_optimizable_graph.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
#include "g2o/core/robust_kernel.h" // IWYU pragma: keep
1111

1212
namespace g2o {
13+
class ParameterContainer;
1314

1415
void declareOptimizableGraph(py::module& m) {
1516
using CLS = OptimizableGraph;
@@ -235,6 +236,10 @@ void declareOptimizableGraph(py::module& m) {
235236
py::keep_alive<1, 2>()); // Parameter* -> bool
236237
cls.def("parameter", &CLS::parameter,
237238
"id"_a); // int -> Parameter*
239+
cls.def(
240+
"parameters",
241+
[](CLS& self) -> ParameterContainer& { return self.parameters(); },
242+
py::return_value_policy::reference_internal);
238243

239244
cls.def("verify_information_matrices", &CLS::verifyInformationMatrices,
240245
"verbose"_a = false); // bool -> bool

python/core/py_parameter.h

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
#pragma once
22

33
#include <g2o/core/parameter.h>
4+
#include <g2o/core/parameter_container.h>
45

56
#include "g2opy.h"
67

@@ -14,4 +15,18 @@ inline void declareParameter(py::module& m) {
1415
.def("element_type", &Parameter::elementType);
1516
}
1617

18+
inline void declareParameterContainer(py::module& m) {
19+
py::classh<ParameterContainer>(m, "ParameterContainer")
20+
.def(py::init<>())
21+
.def("add_parameter", &ParameterContainer::addParameter, "parameter"_a,
22+
py::keep_alive<1, 2>())
23+
.def("get_parameter", &ParameterContainer::getParameter, "id"_a)
24+
.def("detach_parameter", &ParameterContainer::detachParameter, "id"_a)
25+
.def("clear", &ParameterContainer::clear)
26+
.def("size", &ParameterContainer::size)
27+
.def("__len__", [](const ParameterContainer& self) {
28+
return static_cast<py::ssize_t>(self.size());
29+
});
30+
}
31+
1732
} // end namespace g2o

python/tests/test_core.py

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,30 @@ def test_connected_components(self, simple_se2_graph):
7575
assert simple_se2_graph.num_connected_components(1) == 2
7676

7777

78+
class TestParameterContainer:
79+
"""Tests for OptimizableGraph parameter container access."""
80+
81+
def test_optimizer_parameters(self):
82+
optimizer = g2o.SparseOptimizer()
83+
parameters = optimizer.parameters()
84+
assert len(parameters) == 0
85+
86+
camera_parameters = g2o.CameraParameters(1.0, [0.0, 0.0], 0.0)
87+
camera_parameters.set_id(42)
88+
89+
assert optimizer.add_parameter(camera_parameters)
90+
assert len(parameters) == 1
91+
92+
parameter = parameters.get_parameter(42)
93+
assert parameter is not None
94+
assert parameter.id() == 42
95+
96+
detached = parameters.detach_parameter(42)
97+
assert detached is not None
98+
assert detached.id() == 42
99+
assert len(parameters) == 0
100+
101+
78102
class TestBlockSolvers:
79103
"""Test BlockSolver configurations."""
80104

0 commit comments

Comments
 (0)