Skip to content
Snippets Groups Projects
Commit c29edd71 authored by Wilson Jallet's avatar Wilson Jallet :clapper:
Browse files

unittest: test where subclass modifies input C++ matrix

* test fails, problem in stride ? only first column modified
parent cdd9c6a9
No related branches found
No related tags found
No related merge requests found
Pipeline #18388 failed
......@@ -52,6 +52,27 @@ const Eigen::Ref<const MatType> asConstRef(Eigen::Ref<MatType> mat) {
return Eigen::Ref<const MatType>(mat);
}
struct modify_block
{
MatrixXd J;
modify_block() : J(10, 10) { J.setZero(); }
void modify(int n, int m)
{
call(J.topLeftCorner(n, m));
}
virtual void call(Eigen::Ref<MatrixXd> mat) = 0;
};
struct modify_wrap : modify_block, bp::wrapper<modify_block>
{
modify_wrap() : modify_block() {}
void call(Eigen::Ref<MatrixXd> mat)
{
this->get_override("call")(mat);
}
};
BOOST_PYTHON_MODULE(eigen_ref) {
namespace bp = boost::python;
eigenpy::enableEigenPy();
......@@ -77,4 +98,11 @@ BOOST_PYTHON_MODULE(eigen_ref) {
(Eigen::Ref<MatrixXd>(*)(Eigen::Ref<MatrixXd>))asRef<MatrixXd>);
bp::def("asConstRef", (const Eigen::Ref<const MatrixXd> (*)(
Eigen::Ref<MatrixXd>))asConstRef<MatrixXd>);
bp::class_<modify_wrap, boost::noncopyable>("modify_block", bp::init<>())
.def_readonly("J", &modify_block::J)
.def("modify", &modify_block::modify)
.def("call", bp::pure_virtual(&modify_wrap::call))
;
}
......@@ -24,6 +24,23 @@ def test(mat):
const_ref = asConstRef(mat)
assert np.all(const_ref == mat)
class ModifyBlockImpl(modify_block):
def __init__(self):
super().__init__()
def call(self, mat):
mat[:, :] = 1.
modify = ModifyBlockImpl()
print("Field J init:\n{}".format(modify.J))
modify.modify(2, 3)
print("Field J after:\n{}".format(modify.J))
Jref = np.zeros((10, 10))
Jref[:2, :3] = 1.
print("Should be:\n{}".format(Jref))
assert np.array_equal(Jref, modify.J)
rows = 10
cols = 30
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment