tensor.cpp
Go to the documentation of this file.
1 /*
2  * Copyright 2023 INRIA
3  */
4 
5 #include <iostream>
6 
7 #include "eigenpy/eigenpy.hpp"
8 namespace bp = boost::python;
9 
10 template <typename Scalar>
11 Eigen::Matrix<Scalar, Eigen::Dynamic, 1> vector1x1(const Scalar& value) {
12  typedef Eigen::Matrix<Scalar, Eigen::Dynamic, 1> ReturnType;
13  return ReturnType::Constant(1, value);
14 }
15 
16 template <typename Scalar>
17 Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic> matrix1x1(
18  const Scalar& value) {
19  typedef Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic> ReturnType;
20  return ReturnType::Constant(1, 1, value);
21 }
22 
23 template <typename Tensor>
24 Eigen::TensorRef<Tensor> make_ref(Tensor& tensor) {
25  return Eigen::TensorRef<Tensor>(tensor);
26 }
27 
28 template <typename Tensor>
29 void fill(Eigen::TensorRef<Tensor> tensor, typename Tensor::Scalar value) {
30  for (Eigen::DenseIndex k = 0; k < tensor.size(); ++k)
31  tensor.coeffRef(k) = value;
32 }
33 
34 template <typename Tensor>
35 void print(const Tensor& tensor) {
36  std::cout << tensor << std::endl;
37 }
38 
39 template <typename Tensor>
40 void print_ref(const Eigen::TensorRef<const Tensor> tensor) {
41  print(tensor);
42 }
43 
44 template <typename Tensor>
45 void print_base(const Eigen::TensorBase<Tensor>& tensor) {
46  print(tensor);
47 }
48 
49 template <typename Tensor>
50 Tensor copy(const Eigen::TensorBase<Tensor>& tensor) {
51  return const_cast<Tensor&>(static_cast<const Tensor&>(tensor));
52 }
53 
54 template <typename Tensor>
55 Eigen::TensorRef<Tensor> ref(Eigen::TensorRef<Tensor> tensor) {
56  return tensor;
57 }
58 
59 template <typename Tensor>
60 const Eigen::TensorRef<const Tensor> const_ref(
61  const Eigen::TensorRef<const Tensor> tensor) {
62  return tensor;
63 }
64 
65 template <typename Scalar, int Rank>
66 Eigen::Tensor<Scalar, Rank> emptyTensor() {
67  return Eigen::Tensor<Scalar, Rank>();
68 }
69 
70 template <typename Scalar>
71 Eigen::Tensor<Scalar, 1> zeroTensor1(const Eigen::DenseIndex r) {
72  Eigen::Tensor<Scalar, 1> tensor(r);
73  tensor.setZero();
74  return tensor;
75 }
76 
77 template <typename Scalar>
78 Eigen::Tensor<Scalar, 2> zeroTensor2(const Eigen::DenseIndex r,
79  const Eigen::DenseIndex s) {
80  Eigen::Tensor<Scalar, 2> tensor(r, s);
81  tensor.setZero();
82  return tensor;
83 }
84 
85 template <typename Scalar>
86 Eigen::Tensor<Scalar, 3> zeroTensor3(const Eigen::DenseIndex r,
87  const Eigen::DenseIndex s,
88  const Eigen::DenseIndex t) {
89  Eigen::Tensor<Scalar, 3> tensor(r, s, t);
90  tensor.setZero();
91  return tensor;
92 }
93 
94 template <typename Scalar>
95 Eigen::Tensor<Scalar, 1> createTensor1(const Eigen::DenseIndex r,
96  Scalar value) {
97  Eigen::Tensor<Scalar, 1> tensor(r);
98  fill(make_ref(tensor), value);
99  return tensor;
100 }
101 
102 template <typename Scalar>
103 Eigen::Tensor<Scalar, 2> createTensor2(const Eigen::DenseIndex r,
104  const Eigen::DenseIndex s,
105  Scalar value) {
106  Eigen::Tensor<Scalar, 2> tensor(r, s);
107  fill(make_ref(tensor), value);
108  return tensor;
109 }
110 
111 template <typename Scalar>
112 Eigen::Tensor<Scalar, 3> createTensor3(const Eigen::DenseIndex r,
113  const Eigen::DenseIndex s,
114  const Eigen::DenseIndex t,
115  Scalar value) {
116  Eigen::Tensor<Scalar, 3> tensor(r, s, t);
117  fill(make_ref(tensor), value);
118  return tensor;
119 }
120 
121 template <typename Scalar, int Rank>
123  typedef Eigen::Tensor<Scalar, Rank> Tensor;
124  typedef Eigen::TensorRef<Tensor> TensorRef;
125  typedef Eigen::Matrix<Scalar, Rank, 1> Dimensions;
126 
127  Tensor m_tensor;
128  TensorContainer(const Dimensions& dims) {
129  typedef Eigen::array<typename Tensor::Index, Rank> InternalDimension;
130  InternalDimension _dims;
131  for (size_t k = 0; k < Rank; ++k) _dims[k] = dims[Eigen::DenseIndex(k)];
132 
133  m_tensor = Tensor(_dims);
134  }
135 
136  Tensor get_copy() const { return m_tensor; }
137  TensorRef get_ref() { return TensorRef(m_tensor); }
138 };
139 
140 template <typename Scalar, int Rank>
143  const std::string class_name = "TensorContainer" + std::to_string(Rank);
144  bp::class_<T>(class_name.c_str(), bp::no_init)
145  .def(bp::init<typename T::Dimensions>())
146  .def("get_copy", &T::get_copy)
147  .def("get_ref", &T::get_ref,
148  bp::with_custodian_and_ward_postcall<0, 1>());
149 }
150 
152  using namespace Eigen;
154 
155  typedef Eigen::Tensor<double, 1> Tensor1;
156  typedef Eigen::Tensor<double, 2> Tensor2;
157  typedef Eigen::Tensor<double, 3> Tensor3;
158 
159  bp::def("emptyTensor1", emptyTensor<double, 1>);
160  bp::def("emptyTensor2", emptyTensor<double, 2>);
161  bp::def("emptyTensor3", emptyTensor<double, 3>);
162 
163  bp::def("zeroTensor1", zeroTensor1<double>);
164  bp::def("zeroTensor2", zeroTensor2<double>);
165  bp::def("zeroTensor3", zeroTensor3<double>);
166 
167  bp::def("createTensor1", createTensor1<double>);
168  bp::def("createTensor2", createTensor2<double>);
169  bp::def("createTensor3", createTensor3<double>);
170 
171  bp::def("print", print<Tensor1>);
172  bp::def("print", print<Tensor2>);
173  bp::def("print", print<Tensor3>);
174 
175  bp::def("print_ref", print_ref<Tensor1>);
176  bp::def("print_ref", print_ref<Tensor2>);
177  bp::def("print_ref", print_ref<Tensor3>);
178 
179  bp::def("print_base", print_base<Tensor1>);
180  bp::def("print_base", print_base<Tensor2>);
181  bp::def("print_base", print_base<Tensor3>);
182 
183  bp::def("copy", copy<Tensor1>);
184  bp::def("copy", copy<Tensor2>);
185  bp::def("copy", copy<Tensor3>);
186 
187  bp::def("fill", fill<Tensor1>);
188  bp::def("fill", fill<Tensor2>);
189  bp::def("fill", fill<Tensor3>);
190 
191  bp::def("ref", ref<Tensor1>, bp::with_custodian_and_ward_postcall<0, 1>());
192  bp::def("ref", ref<Tensor2>, bp::with_custodian_and_ward_postcall<0, 1>());
193  bp::def("ref", ref<Tensor3>, bp::with_custodian_and_ward_postcall<0, 1>());
194 
195  bp::def("const_ref", const_ref<Tensor1>,
196  bp::with_custodian_and_ward_postcall<0, 1>());
197  bp::def("const_ref", const_ref<Tensor2>,
198  bp::with_custodian_and_ward_postcall<0, 1>());
199  bp::def("const_ref", const_ref<Tensor3>,
200  bp::with_custodian_and_ward_postcall<0, 1>());
201 
202  exposeTensorContainer<double, 1>();
203  exposeTensorContainer<double, 2>();
204  exposeTensorContainer<double, 3>();
205 }
Eigen::Matrix< Scalar, Eigen::Dynamic, Eigen::Dynamic > matrix1x1(const Scalar &value)
Definition: tensor.cpp:17
void print_ref(const Eigen::TensorRef< const Tensor > tensor)
Definition: tensor.cpp:40
Eigen::Tensor< Scalar, 2 > createTensor2(const Eigen::DenseIndex r, const Eigen::DenseIndex s, Scalar value)
Definition: tensor.cpp:103
Definition: complex.cpp:7
void EIGENPY_DLLAPI enableEigenPy()
Definition: eigenpy.cpp:29
Eigen::Tensor< Scalar, 1 > createTensor1(const Eigen::DenseIndex r, Scalar value)
Definition: tensor.cpp:95
void print_base(const Eigen::TensorBase< Tensor > &tensor)
Definition: tensor.cpp:45
const Eigen::TensorRef< const Tensor > const_ref(const Eigen::TensorRef< const Tensor > tensor)
Definition: tensor.cpp:60
Eigen::Tensor< Scalar, 3 > zeroTensor3(const Eigen::DenseIndex r, const Eigen::DenseIndex s, const Eigen::DenseIndex t)
Definition: tensor.cpp:86
Tensor get_copy() const
Definition: tensor.cpp:136
Eigen::TensorRef< Tensor > make_ref(Tensor &tensor)
Definition: tensor.cpp:24
Eigen::TensorRef< Tensor > TensorRef
Definition: tensor.cpp:124
Eigen::Tensor< Scalar, 2 > zeroTensor2(const Eigen::DenseIndex r, const Eigen::DenseIndex s)
Definition: tensor.cpp:78
Eigen::Tensor< Scalar, Rank > emptyTensor()
Definition: tensor.cpp:66
TensorContainer(const Dimensions &dims)
Definition: tensor.cpp:128
void exposeTensorContainer()
Definition: tensor.cpp:141
Eigen::TensorRef< Tensor > ref(Eigen::TensorRef< Tensor > tensor)
Definition: tensor.cpp:55
void fill(Eigen::TensorRef< Tensor > tensor, typename Tensor::Scalar value)
Definition: tensor.cpp:29
Tensor copy(const Eigen::TensorBase< Tensor > &tensor)
Definition: tensor.cpp:50
Eigen::Matrix< Scalar, Rank, 1 > Dimensions
Definition: tensor.cpp:125
Tensor m_tensor
Definition: tensor.cpp:127
void print(const Tensor &tensor)
Definition: tensor.cpp:35
Eigen::Tensor< Scalar, 3 > createTensor3(const Eigen::DenseIndex r, const Eigen::DenseIndex s, const Eigen::DenseIndex t, Scalar value)
Definition: tensor.cpp:112
BOOST_PYTHON_MODULE(tensor)
Definition: tensor.cpp:151
Eigen::Tensor< Scalar, 1 > zeroTensor1(const Eigen::DenseIndex r)
Definition: tensor.cpp:71
Eigen::Matrix< Scalar, Eigen::Dynamic, 1 > vector1x1(const Scalar &value)
Definition: tensor.cpp:11
Eigen::Tensor< Scalar, Rank > Tensor
Definition: tensor.cpp:123
TensorRef get_ref()
Definition: tensor.cpp:137


eigenpy
Author(s): Justin Carpentier, Nicolas Mansard
autogenerated on Fri Jun 2 2023 02:10:26