7#include "pinocchio/autodiff/casadi.hpp" 9#define PINOCCHIO_PYTHON_SCALAR_TYPE ::casadi::SX 10#include "pinocchio/bindings/python/context/generic.hpp" 11#undef PINOCCHIO_PYTHON_SCALAR_TYPE 13#define PINOCCHIO_PYTHON_SKIP_COMPARISON_OPERATIONS 14#define PINOCCHIO_PYTHON_NO_SERIALIZATION 15#define PINOCCHIO_PYTHON_SKIP_REACHABLE_WORKSPACE 16#define PINOCCHIO_PYTHON_SKIP_ALGORITHM_CONSTRAINED_DYNAMICS 18#define PINOCCHIO_PYTHON_SKIP_CASADI_UNSUPPORTED 20#include <eigenpy/eigenpy.hpp> 21#include <eigenpy/user-type.hpp> 22#include <eigenpy/ufunc.hpp> 23#include <eigenpy/swig.hpp> 28 namespace bp = boost::python;
35 static PyTypeObject * getSXType()
37 return reinterpret_cast<PyTypeObject *
>(getInstance().casadi_SX_type.ptr());
41 static const CasadiType & getInstance()
43 static CasadiType elt;
49 casadi_module = bp::import(
"casadi");
50 casadi_SX_type = casadi_module.attr(
"SX");
51 Py_INCREF(casadi_module.ptr());
56 casadi_SX_type.~object();
60 bp::object casadi_module;
61 bp::object casadi_SX_type;
66 template<
typename CasadiScalar,
int Rows,
int Cols,
int Options,
int MaxRows,
int MaxCols>
67 struct expected_pytype_for_arg<
68 Eigen::Matrix<::casadi::Matrix<CasadiScalar>, Rows, Cols, Options, MaxRows, MaxCols>,
70 Eigen::Matrix<::casadi::Matrix<CasadiScalar>, Rows, Cols, Options, MaxRows, MaxCols>>>
72 static PyTypeObject
const * get_pytype()
74 return ::eigenpy::casadi::CasadiType::getSXType();
78 template<
typename CasadiScalar,
int Rows,
int Cols,
int Options,
int MaxRows,
int MaxCols>
80 Eigen::Matrix<::casadi::Matrix<CasadiScalar>, Rows, Cols, Options, MaxRows, MaxCols>>
82 typedef ::casadi::Matrix<CasadiScalar> CasadiMatrix;
83 typedef Eigen::Matrix<::casadi::Matrix<CasadiScalar>, Rows, Cols, Options, MaxRows, MaxCols>
87 static void * convertible(PyObject * pyObj);
90 static void construct(PyObject * pyObj, bp::converter::rvalue_from_python_stage1_data * memory);
92 static void registration();
95 template<
typename CasadiScalar,
int Rows,
int Cols,
int Options,
int MaxRows,
int MaxCols>
97 Eigen::Matrix<::casadi::Matrix<CasadiScalar>, Rows, Cols, Options, MaxRows, MaxCols>>::
98 convertible(PyObject * pyObj)
100 if (std::strcmp(pyObj->ob_type->tp_name, CasadiMatrix::type_name().c_str()) != 0)
103#define RETURN_VALUE(value) \ 105 Py_DECREF(reinterpret_cast<PyObject *>(casadi_matrix_swig_obj)); \ 109 eigenpy::PySwigObject * casadi_matrix_swig_obj = eigenpy::get_PySwigObject(pyObj);
110 if (casadi_matrix_swig_obj == NULL)
113 CasadiMatrix * casadi_matrix_ptr =
114 reinterpret_cast<CasadiMatrix *
>(casadi_matrix_swig_obj->ptr);
115 const CasadiMatrix & casadi_matrix = *casadi_matrix_ptr;
117 const casadi_int R = casadi_matrix.rows(), C = casadi_matrix.columns(),
118 size = casadi_matrix.numel();
120 const int ndim = (R == 0 || C == 0) ? 0 : (R == 1 || C == 1) ? 1 : 2;
122 if (MatType::IsVectorAtCompileTime)
124 const Eigen::Index size_at_compile_time =
125 MatType::IsRowMajor ? MatType::ColsAtCompileTime : MatType::RowsAtCompileTime;
132 if (size_at_compile_time != Eigen::Dynamic)
135 if (size == size_at_compile_time)
137 if (MatType::ColsAtCompileTime != C || MatType::RowsAtCompileTime != R)
153 assert(R > 1 && C > 1);
167 if ((MatType::RowsAtCompileTime != R) && (MatType::RowsAtCompileTime != Eigen::Dynamic))
169 if ((MatType::ColsAtCompileTime != C) && (MatType::ColsAtCompileTime != Eigen::Dynamic))
178 template<
typename CasadiScalar,
int Rows,
int Cols,
int Options,
int MaxRows,
int MaxCols>
180 Eigen::Matrix<::casadi::Matrix<CasadiScalar>, Rows, Cols, Options, MaxRows, MaxCols>>::
181 construct(PyObject * pyObj, bp::converter::rvalue_from_python_stage1_data * memory)
183 eigenpy::PySwigObject * casadi_matrix_swig_obj = eigenpy::get_PySwigObject(pyObj);
184 assert(casadi_matrix_swig_obj != NULL);
186 CasadiMatrix * casadi_matrix_ptr =
187 reinterpret_cast<CasadiMatrix *
>(casadi_matrix_swig_obj->ptr);
188 const CasadiMatrix & casadi_matrix = *casadi_matrix_ptr;
190 const casadi_int R = casadi_matrix.rows(), C = casadi_matrix.columns();
192 bp::converter::rvalue_from_python_storage<MatType> * storage =
193 reinterpret_cast<bp::converter::rvalue_from_python_storage<MatType> *
>(
194 reinterpret_cast<void *
>(memory));
197 void * storage_ptr = storage->storage.bytes;
198 MatType * eigen_matrix_ptr =
199 ::eigenpy::details::init_matrix_or_array<MatType>::run(R, C, storage_ptr);
202 pinocchio::casadi::copy(casadi_matrix, *eigen_matrix_ptr);
204 memory->convertible = storage->storage.bytes;
205 Py_DECREF(
reinterpret_cast<PyObject *
>(casadi_matrix_swig_obj));
208 template<
typename CasadiScalar,
int Rows,
int Cols,
int Options,
int MaxRows,
int MaxCols>
210 Eigen::Matrix<::casadi::Matrix<CasadiScalar>, Rows, Cols, Options, MaxRows, MaxCols>>::
213 bp::converter::registry::push_back(
214 reinterpret_cast<void * (*)(_object *)
>(&EigenFromPy::convertible), &EigenFromPy::construct,
215 bp::type_id<MatType>()
216#ifndef BOOST_PYTHON_NO_PY_SIGNATURES
218 &eigenpy::expected_pytype_for_arg<MatType>::get_pytype
223 template<
typename MatType>
224 struct EigenToPy<MatType, ::casadi::Matrix<::casadi::SXElem>>
226 typedef ::casadi::Matrix<::casadi::SXElem> CasadiMatrix;
229 convert(
typename boost::add_reference<
typename boost::add_const<MatType>::type>::type mat)
232 (mat.rows() < INT_MAX) && (mat.cols() < INT_MAX)
233 &&
"Matrix range larger than int ... should never happen.");
235 PyObject * casadi_matrix_py_ptr =
236 PyObject_CallObject(
reinterpret_cast<PyObject *
>(casadi::CasadiType::getSXType()), NULL);
238 eigenpy::PySwigObject * casadi_matrix_swig_obj =
239 eigenpy::get_PySwigObject(casadi_matrix_py_ptr);
240 assert(casadi_matrix_swig_obj != NULL);
242 CasadiMatrix * casadi_matrix_obj_ptr =
243 reinterpret_cast<CasadiMatrix *
>(casadi_matrix_swig_obj->ptr);
244 pinocchio::casadi::copy(mat, *casadi_matrix_obj_ptr);
246 Py_DECREF(
reinterpret_cast<PyObject *
>(casadi_matrix_swig_obj));
247 return casadi_matrix_py_ptr;
250 static PyTypeObject
const * get_pytype()
252 return ::eigenpy::casadi::CasadiType::getSXType();
256 template<
typename TensorType,
typename _Scalar>
257 struct expose_eigen_type_impl<
259 Eigen::TensorBase<TensorType>,
260 ::casadi::Matrix<_Scalar>>
267 template<
typename SparseType,
typename _Scalar>
268 struct expose_eigen_type_impl<
270 Eigen::SparseMatrixBase<SparseType>,
271 ::casadi::Matrix<_Scalar>>
278 template<
typename MatType,
int Options,
typename Str
ide>
279 struct EigenToPy<Eigen::Ref<MatType, Options, Stride>, ::casadi::Matrix<::casadi::SXElem>>
281 typedef ::casadi::Matrix<::casadi::SXElem> CasadiMatrix;
283 static PyObject * convert(
const Eigen::Ref<MatType, Options, Stride> & mat)
286 (mat.rows() < INT_MAX) && (mat.cols() < INT_MAX)
287 &&
"Matrix range larger than int ... should never happen.");
288 PyObject * casadi_matrix_py_ptr =
289 PyObject_CallObject(
reinterpret_cast<PyObject *
>(casadi::CasadiType::getSXType()), NULL);
291 eigenpy::PySwigObject * casadi_matrix_swig_obj =
292 eigenpy::get_PySwigObject(casadi_matrix_py_ptr);
293 assert(casadi_matrix_swig_obj != NULL);
295 CasadiMatrix * casadi_matrix_obj_ptr =
296 reinterpret_cast<CasadiMatrix *
>(casadi_matrix_swig_obj->ptr);
297 pinocchio::casadi::copy(mat.derived(), *casadi_matrix_obj_ptr);
299 Py_DECREF(
reinterpret_cast<PyObject *
>(casadi_matrix_swig_obj));
300 return casadi_matrix_py_ptr;
303 static PyTypeObject
const * get_pytype()
305 return ::eigenpy::casadi::CasadiType::getSXType();
313 inline npy_bool SpecialMethods<pinocchio::python::context::Scalar, NPY_USERDEF>::nonzero(
314 void * ip,
void * array)
317 typedef pinocchio::python::context::Scalar Scalar;
318 PyArrayObject * py_array =
static_cast<PyArrayObject *
>(array);
319 if (py_array == NULL || PyArray_ISBEHAVED_RO(py_array))
321 const Scalar & value = *
static_cast<Scalar *
>(ip);
322 return (npy_bool)(value.is_zero());
327 PyArray_Descr * descr = PyArray_DESCR(py_array);
328 PyArray_ArrFuncs * f = PyDataType_GetArrFuncs(descr);
329 f->copyswap(&tmp_value, ip, PyArray_ISBYTESWAPPED(py_array), array);
330 return (npy_bool)(tmp_value.is_zero());
343 template<
typename CasadiMatrix>
347 static PyObject * convert(CasadiMatrix
const & x)
349 PyObject * casadi_matrix_py_ptr = PyObject_CallObject(
350 reinterpret_cast<PyObject *
>(eigenpy::casadi::CasadiType::getSXType()), NULL);
351 eigenpy::PySwigObject * casadi_matrix_swig_obj =
352 eigenpy::get_PySwigObject(casadi_matrix_py_ptr);
353 assert(casadi_matrix_swig_obj != NULL);
355 CasadiMatrix * casadi_matrix_obj_ptr =
356 reinterpret_cast<CasadiMatrix *
>(casadi_matrix_swig_obj->ptr);
357 *casadi_matrix_obj_ptr = x;
359 Py_DECREF(
reinterpret_cast<PyObject *
>(casadi_matrix_swig_obj));
360 return casadi_matrix_py_ptr;
363 static PyTypeObject
const * get_pytype()
365 return ::eigenpy::casadi::CasadiType::getSXType();
368 static void registration()
370 boost::python::to_python_converter<CasadiMatrix, CasadiMatrixToPython, true>();
374 template<
typename CasadiMatrix>
379 static CasadiMatrix & execute(PyObject * )
381 throw std::runtime_error(
"Should never be called");
385 static void registration()
387 boost::python::converter::registry::insert(
388 &extract, boost::python::detail::extractor_type_id(&Extractor::execute)
389#ifndef BOOST_PYTHON_NO_PY_SIGNATURES
397 static void * extract(PyObject * pyObj)
399 if (!PyObject_TypeCheck(pyObj, ::eigenpy::casadi::CasadiType::getSXType()))
402 eigenpy::PySwigObject * casadi_matrix_swig_obj = eigenpy::get_PySwigObject(pyObj);
403 return casadi_matrix_swig_obj->ptr;
405#ifndef BOOST_PYTHON_NO_PY_SIGNATURES 406 static PyTypeObject
const * get_pytype()
408 return ::eigenpy::casadi::CasadiType::getSXType();
448 inline boost::python::object getScalarType()
450 namespace bp = boost::python;
452 PyObject * pyObj =
reinterpret_cast<PyObject *
>(::eigenpy::casadi::CasadiType::getSXType());
453 bp::object scalar_type(bp::handle<>(bp::borrowed(pyObj)));
458 inline void exposeSpecificTypeFeatures()
460 typedef pinocchio::python::context::Scalar Scalar;
461 CasadiMatrixToPython<Scalar>::registration();
462 CasadiMatrixFromPython<Scalar>::registration();
463 boost::python::implicitly_convertible<double, Scalar>();
464 boost::python::implicitly_convertible<float, Scalar>();
465 boost::python::implicitly_convertible<int, Scalar>();
466 boost::python::implicitly_convertible<long, Scalar>();
467 boost::python::implicitly_convertible<bool, Scalar>();
476 template<
typename Scalar>
477 struct has_operator_equal<::casadi::Matrix<Scalar>> : boost::false_type
Main pinocchio namespace.