13#include <lagrange/Logger.h>
14#include <lagrange/python/binding.h>
15#include <lagrange/utils/fmt/format.h>
19namespace lagrange::python {
20namespace nb = nanobind;
22template <
typename Scalar,
int Dim>
23using Point = Eigen::Matrix<Scalar, 1, Dim>;
25template <
typename Scalar,
int Dim>
26using NBPoint = nb::ndarray<Scalar, nb::shape<Dim>, nb::c_contig, nb::device::cpu>;
28template <
typename Scalar,
int Dim>
29using GenericPoint = std::variant<nb::list, NBPoint<Scalar, Dim>>;
38template <
typename Scalar,
int Dim>
39Point<Scalar, Dim> to_eigen_point(
const GenericPoint<Scalar, Dim>& p)
42 if (std::holds_alternative<nb::list>(p)) {
43 auto lst = std::get<nb::list>(p);
44 if (lst.size() != Dim) {
45 throw std::runtime_error(
46 lagrange::format(
"Point list must have exactly {} elements.", Dim));
48 for (
int i = 0; i < Dim; ++i) {
49 q(i) = nb::cast<Scalar>(lst[i]);
52 auto arr = std::get<NBPoint<Scalar, Dim>>(p);
53 for (
int i = 0; i < Dim; ++i) {