13#include <lagrange/Logger.h>
14#include <lagrange/python/binding.h>
18namespace lagrange::python {
19namespace nb = nanobind;
21template <
typename Scalar,
int Dim>
22using Point = Eigen::Matrix<Scalar, 1, Dim>;
24template <
typename Scalar,
int Dim>
25using NBPoint = nb::ndarray<Scalar, nb::shape<Dim>, nb::c_contig, nb::device::cpu>;
27template <
typename Scalar,
int Dim>
28using GenericPoint = std::variant<nb::list, NBPoint<Scalar, Dim>>;
37template <
typename Scalar,
int Dim>
38Point<Scalar, Dim> to_eigen_point(
const GenericPoint<Scalar, Dim>& p)
41 if (std::holds_alternative<nb::list>(p)) {
42 auto lst = std::get<nb::list>(p);
43 if (lst.size() != Dim) {
44 throw std::runtime_error(fmt::format(
"Point list must have exactly {} elements.", Dim));
46 for (
int i = 0; i < Dim; ++i) {
47 q(i) = nb::cast<Scalar>(lst[i]);
50 auto arr = std::get<NBPoint<Scalar, Dim>>(p);
51 for (
int i = 0; i < Dim; ++i) {