16 # pragma warning(disable: 4996) // C4996: std::unary_negation is deprecated
19 #include <Eigen/Cholesky>
21 using MatrixXdR = Eigen::Matrix<double, Eigen::Dynamic, Eigen::Dynamic, Eigen::RowMajor>;
28 for (
int i = 0;
i <
x.rows();
i++)
for (
int j = 0; j <
x.cols(); j++)
29 x(
i, j) = 11 + 10*
i + j;
34 static Eigen::MatrixXd *
x;
36 x =
new Eigen::MatrixXd(3, 3);
57 double get_elem(Eigen::Ref<const Eigen::MatrixXd>
m) {
return m(2, 1); };
62 template <
typename MatrixArgType> Eigen::MatrixXd
adjust_matrix(MatrixArgType
m) {
63 Eigen::MatrixXd ret(
m);
64 for (
int c = 0; c <
m.cols(); c++)
65 for (
int r = 0; r <
m.rows(); r++)
66 ret(r, c) += 10*r + 100*c;
73 Eigen::Matrix4d
a = Eigen::Matrix4d::Zero();
74 Eigen::Matrix4d
b = Eigen::Matrix4d::Identity();
80 using FixedMatrixR = Eigen::Matrix<float, 5, 6, Eigen::RowMajor>;
81 using FixedMatrixC = Eigen::Matrix<float, 5, 6>;
82 using DenseMatrixR = Eigen::Matrix<float, Eigen::Dynamic, Eigen::Dynamic, Eigen::RowMajor>;
83 using DenseMatrixC = Eigen::Matrix<float, Eigen::Dynamic, Eigen::Dynamic>;
84 using FourRowMatrixC = Eigen::Matrix<float, 4, Eigen::Dynamic>;
85 using FourColMatrixC = Eigen::Matrix<float, Eigen::Dynamic, 4>;
86 using FourRowMatrixR = Eigen::Matrix<float, 4, Eigen::Dynamic>;
87 using FourColMatrixR = Eigen::Matrix<float, Eigen::Dynamic, 4>;
88 using SparseMatrixR = Eigen::SparseMatrix<float, Eigen::RowMajor>;
89 using SparseMatrixC = Eigen::SparseMatrix<float>;
92 m.def(
"double_col", [](
const Eigen::VectorXf &
x) -> Eigen::VectorXf {
return 2.0f *
x; });
93 m.def(
"double_row", [](
const Eigen::RowVectorXf &
x) -> Eigen::RowVectorXf {
return 2.0f *
x; });
94 m.def(
"double_complex", [](
const Eigen::VectorXcf &
x) -> Eigen::VectorXcf {
return 2.0f *
x; });
95 m.def(
"double_threec", [](py::EigenDRef<Eigen::Vector3f>
x) {
x *= 2; });
96 m.def(
"double_threer", [](py::EigenDRef<Eigen::RowVector3f>
x) {
x *= 2; });
97 m.def(
"double_mat_cm", [](Eigen::MatrixXf
x) -> Eigen::MatrixXf {
return 2.0f *
x; });
98 m.def(
"double_mat_rm", [](DenseMatrixR
x) -> DenseMatrixR {
return 2.0f *
x; });
102 m.def(
"cholesky1", [](Eigen::Ref<MatrixXdR>
x) -> Eigen::MatrixXd {
return x.llt().matrixL(); });
103 m.def(
"cholesky2", [](
const Eigen::Ref<const MatrixXdR> &
x) -> Eigen::MatrixXd {
return x.llt().matrixL(); });
104 m.def(
"cholesky3", [](
const Eigen::Ref<MatrixXdR> &
x) -> Eigen::MatrixXd {
return x.llt().matrixL(); });
105 m.def(
"cholesky4", [](Eigen::Ref<const MatrixXdR>
x) -> Eigen::MatrixXd {
return x.llt().matrixL(); });
112 auto add_rm = [](Eigen::Ref<MatrixXdR>
x,
int r,
int c,
double v) {
x(r,c) += v; };
113 auto add_cm = [](Eigen::Ref<Eigen::MatrixXd>
x,
int r,
int c,
double v) {
x(r,c) += v; };
116 m.def(
"add_rm", add_rm);
117 m.def(
"add_cm", add_cm);
119 m.def(
"add1", add_rm);
120 m.def(
"add1", add_cm);
121 m.def(
"add2", add_cm);
122 m.def(
"add2", add_rm);
124 m.def(
"add_any", [](py::EigenDRef<Eigen::MatrixXd>
x,
int r,
int c,
double v) {
x(r,c) += v; });
127 m.def(
"get_cm_ref", []() {
return Eigen::Ref<Eigen::MatrixXd>(
get_cm()); });
128 m.def(
"get_rm_ref", []() {
return Eigen::Ref<MatrixXdR>(
get_rm()); });
130 m.def(
"get_cm_const_ref", []() {
return Eigen::Ref<const Eigen::MatrixXd>(
get_cm()); });
131 m.def(
"get_rm_const_ref", []() {
return Eigen::Ref<const MatrixXdR>(
get_rm()); });
136 m.def(
"incr_matrix", [](Eigen::Ref<Eigen::MatrixXd>
m,
double v) {
137 m += Eigen::MatrixXd::Constant(
m.rows(),
m.cols(), v);
139 }, py::return_value_policy::reference);
142 m.def(
"incr_matrix_any", [](py::EigenDRef<Eigen::MatrixXd>
m,
double v) {
143 m += Eigen::MatrixXd::Constant(
m.rows(),
m.cols(), v);
145 }, py::return_value_policy::reference);
148 m.def(
"even_rows", [](py::EigenDRef<Eigen::MatrixXd>
m) {
149 return py::EigenDMap<Eigen::MatrixXd>(
150 m.data(), (
m.rows() + 1) / 2,
m.cols(),
152 }, py::return_value_policy::reference);
155 m.def(
"even_cols", [](py::EigenDRef<Eigen::MatrixXd>
m) {
156 return py::EigenDMap<Eigen::MatrixXd>(
157 m.data(),
m.rows(), (
m.cols() + 1) / 2,
159 }, py::return_value_policy::reference);
162 m.def(
"diagonal", [](
const Eigen::Ref<const Eigen::MatrixXd> &
x) {
return x.diagonal(); });
163 m.def(
"diagonal_1", [](
const Eigen::Ref<const Eigen::MatrixXd> &
x) {
return x.diagonal<1>(); });
164 m.def(
"diagonal_n", [](
const Eigen::Ref<const Eigen::MatrixXd> &
x,
int index) {
return x.diagonal(index); });
167 m.def(
"block", [](
const Eigen::Ref<const Eigen::MatrixXd> &
x,
int start_row,
int start_col,
int block_rows,
int block_cols) {
168 return x.block(start_row, start_col, block_rows, block_cols);
174 Eigen::MatrixXd mat = create();
178 static Eigen::MatrixXd create() {
return Eigen::MatrixXd::Ones(10, 10); }
179 static const Eigen::MatrixXd createConst() {
return Eigen::MatrixXd::Ones(10, 10); }
180 Eigen::MatrixXd &get() {
return mat; }
181 Eigen::MatrixXd *getPtr() {
return &mat; }
182 const Eigen::MatrixXd &view() {
return mat; }
183 const Eigen::MatrixXd *viewPtr() {
return &mat; }
184 Eigen::Ref<Eigen::MatrixXd>
ref() {
return mat; }
185 Eigen::Ref<const Eigen::MatrixXd> refConst() {
return mat; }
186 Eigen::Block<Eigen::MatrixXd> block(
int r,
int c,
int nrow,
int ncol) {
return mat.block(r, c, nrow, ncol); }
187 Eigen::Block<const Eigen::MatrixXd> blockConst(
int r,
int c,
int nrow,
int ncol)
const {
return mat.block(r, c, nrow, ncol); }
188 py::EigenDMap<Eigen::Matrix2d> corners() {
return py::EigenDMap<Eigen::Matrix2d>(mat.data(),
189 py::EigenDStride(mat.outerStride() * (mat.outerSize()-1), mat.innerStride() * (mat.innerSize()-1))); }
190 py::EigenDMap<const Eigen::Matrix2d> cornersConst()
const {
return py::EigenDMap<const Eigen::Matrix2d>(mat.data(),
191 py::EigenDStride(mat.outerStride() * (mat.outerSize()-1), mat.innerStride() * (mat.innerSize()-1))); }
194 py::class_<ReturnTester>(
m,
"ReturnTester")
196 .def_static(
"create", &ReturnTester::create)
197 .def_static(
"create_const", &ReturnTester::createConst)
198 .def(
"get", &ReturnTester::get, rvp::reference_internal)
199 .def(
"get_ptr", &ReturnTester::getPtr, rvp::reference_internal)
200 .def(
"view", &ReturnTester::view, rvp::reference_internal)
201 .def(
"view_ptr", &ReturnTester::view, rvp::reference_internal)
202 .def(
"copy_get", &ReturnTester::get)
203 .def(
"copy_view", &ReturnTester::view)
205 .def(
"ref_const", &ReturnTester::refConst)
207 .def(
"ref_const_safe", &ReturnTester::refConst, rvp::reference_internal)
209 .def(
"copy_ref_const", &ReturnTester::refConst, rvp::copy)
210 .def(
"block", &ReturnTester::block)
211 .def(
"block_safe", &ReturnTester::block, rvp::reference_internal)
212 .def(
"block_const", &ReturnTester::blockConst, rvp::reference_internal)
213 .def(
"copy_block", &ReturnTester::block, rvp::copy)
214 .def(
"corners", &ReturnTester::corners, rvp::reference_internal)
215 .def(
"corners_const", &ReturnTester::cornersConst, rvp::reference_internal)
220 m.def(
"incr_diag", [](
int k) {
221 Eigen::DiagonalMatrix<int, Eigen::Dynamic>
m(k);
222 for (
int i = 0;
i < k;
i++)
m.diagonal()[
i] =
i+1;
227 m.def(
"symmetric_lower", [](
const Eigen::MatrixXi &
m) {
228 return m.selfadjointView<Eigen::Lower>();
231 m.def(
"symmetric_upper", [](
const Eigen::MatrixXi &
m) {
232 return m.selfadjointView<Eigen::Upper>();
236 Eigen::MatrixXf mat(5, 6);
237 mat << 0, 3, 0, 0, 0, 11,
244 m.def(
"fixed_r", [mat]() -> FixedMatrixR {
return FixedMatrixR(mat); });
245 m.def(
"fixed_r_const", [mat]() ->
const FixedMatrixR {
return FixedMatrixR(mat); });
246 m.def(
"fixed_c", [mat]() -> FixedMatrixC {
return FixedMatrixC(mat); });
247 m.def(
"fixed_copy_r", [](
const FixedMatrixR &
m) -> FixedMatrixR {
return m; });
248 m.def(
"fixed_copy_c", [](
const FixedMatrixC &
m) -> FixedMatrixC {
return m; });
250 m.def(
"fixed_mutator_r", [](Eigen::Ref<FixedMatrixR>) {});
251 m.def(
"fixed_mutator_c", [](Eigen::Ref<FixedMatrixC>) {});
252 m.def(
"fixed_mutator_a", [](py::EigenDRef<FixedMatrixC>) {});
254 m.def(
"dense_r", [mat]() -> DenseMatrixR {
return DenseMatrixR(mat); });
255 m.def(
"dense_c", [mat]() -> DenseMatrixC {
return DenseMatrixC(mat); });
256 m.def(
"dense_copy_r", [](
const DenseMatrixR &
m) -> DenseMatrixR {
return m; });
257 m.def(
"dense_copy_c", [](
const DenseMatrixC &
m) -> DenseMatrixC {
return m; });
259 m.def(
"sparse_r", [mat]() -> SparseMatrixR {
return Eigen::SparseView<Eigen::MatrixXf>(mat); });
260 m.def(
"sparse_c", [mat]() -> SparseMatrixC {
return Eigen::SparseView<Eigen::MatrixXf>(mat); });
261 m.def(
"sparse_copy_r", [](
const SparseMatrixR &
m) -> SparseMatrixR {
return m; });
262 m.def(
"sparse_copy_c", [](
const SparseMatrixC &
m) -> SparseMatrixC {
return m; });
264 m.def(
"partial_copy_four_rm_r", [](
const FourRowMatrixR &
m) -> FourRowMatrixR {
return m; });
265 m.def(
"partial_copy_four_rm_c", [](
const FourColMatrixR &
m) -> FourColMatrixR {
return m; });
266 m.def(
"partial_copy_four_cm_r", [](
const FourRowMatrixC &
m) -> FourRowMatrixC {
return m; });
267 m.def(
"partial_copy_four_cm_c", [](
const FourColMatrixC &
m) -> FourColMatrixC {
return m; });
271 m.def(
"cpp_copy", [](py::handle
m) {
return m.cast<Eigen::MatrixXd>()(1, 0); });
272 m.def(
"cpp_ref_c", [](py::handle
m) {
return m.cast<Eigen::Ref<Eigen::MatrixXd>>()(1, 0); });
273 m.def(
"cpp_ref_r", [](py::handle
m) {
return m.cast<Eigen::Ref<MatrixXdR>>()(1, 0); });
274 m.def(
"cpp_ref_any", [](py::handle
m) {
return m.cast<py::EigenDRef<Eigen::MatrixXd>>()(1, 0); });
283 m.def(
"get_elem_nocopy", [](Eigen::Ref<const Eigen::MatrixXd>
m) ->
double {
return get_elem(
m); },
284 py::arg{}.noconvert());
286 m.def(
"get_elem_rm_nocopy", [](Eigen::Ref<
const Eigen::Matrix<long, -1, -1, Eigen::RowMajor>> &
m) ->
long {
return m(2, 1); },
287 py::arg{}.noconvert());
293 m.def(
"iss738_f1", &
adjust_matrix<
const Eigen::Ref<const Eigen::MatrixXd> &>, py::arg{}.noconvert());
294 m.def(
"iss738_f2", &
adjust_matrix<
const Eigen::Ref<
const Eigen::Matrix<double, -1, -1, Eigen::RowMajor>> &>, py::arg{}.noconvert());
300 m.def(
"iss1105_col", [](Eigen::VectorXd) {
return true; });
301 m.def(
"iss1105_row", [](Eigen::RowVectorXd) {
return true; });
305 m.def(
"matrix_multiply", [](
const py::EigenDRef<const Eigen::MatrixXd>
A,
const py::EigenDRef<const Eigen::MatrixXd>
B)
307 if (
A.cols() !=
B.rows())
throw std::domain_error(
"Nonconformable matrices!");
309 }, py::arg(
"A"), py::arg(
"B"));
312 py::class_<CustomOperatorNew>(
m,
"CustomOperatorNew")
321 m.def(
"get_elem_direct", [](Eigen::Ref<const Eigen::VectorXd> v) {
322 py::module_::import(
"numpy").attr(
"ones")(10);
325 m.def(
"get_elem_indirect", [](std::vector<Eigen::Ref<const Eigen::VectorXd>> v) {
326 py::module_::import(
"numpy").attr(
"ones")(10);