Program Listing for File jacobi-rotation.hpp

Return to documentation for file (include/nanoeigenpy/geometry/jacobi-rotation.hpp)

#pragma once

#include "nanoeigenpy/fwd.hpp"
#include <nanobind/operators.h>

namespace nanoeigenpy {
namespace nb = nanobind;
using namespace nb::literals;

template <typename Scalar>
void exposeJacobiRotation(nb::module_ m, const char* name) {
  using JacobiRotation = Eigen::JacobiRotation<Scalar>;
  using RealScalar = typename Eigen::NumTraits<Scalar>::Real;

  if (check_registration_alias<JacobiRotation>(m)) {
    return;
  }
  nb::class_<JacobiRotation>(
      m, name, "This class represents a Jacobi or Givens rotation.")
      .def(nb::init<>(), "Default constructor")
      .def(nb::init<const Scalar&, const Scalar&>(), "c"_a, "s"_a,
           "Construct a planar rotation from a cosine-sine pair (c, s).")

      .def_prop_rw(
          "c", [](const JacobiRotation& self) { return self.c(); },
          [](JacobiRotation& self, const Scalar& value) { self.c() = value; })
      .def_prop_rw(
          "s", [](const JacobiRotation& self) { return self.s(); },
          [](JacobiRotation& self, const Scalar& value) { self.s() = value; })

      .def("__mul__", &JacobiRotation::operator*, "other"_a,
           "Concatenates two planar rotations")

      .def("transpose", &JacobiRotation::transpose)
      .def("adjoint", &JacobiRotation::adjoint)

      .def(
          "makeJacobi",
          [](JacobiRotation& self, const RealScalar& x, const Scalar& y,
             const RealScalar& z) { return self.makeJacobi(x, y, z); },
          "x"_a, "y"_a, "z"_a)

      .def(
          "makeJacobi",
          [](JacobiRotation& self, const Eigen::MatrixXd& m, Eigen::Index p,
             Eigen::Index q) { return self.makeJacobi(m, p, q); },
          "matrix"_a, "p"_a, "q"_a)

      .def(
          "makeGivens",
          [](JacobiRotation& self, const Scalar& p, const Scalar& q) {
            self.makeGivens(p, q, nullptr);
          },
          "p"_a, "q"_a)

      .def(
          "makeGivens",
          [](JacobiRotation& self, const Scalar& p, const Scalar& q,
             Scalar* r) { self.makeGivens(p, q, r); },
          "p"_a, "q"_a, "r"_a)

      .def(IdVisitor());
}

}  // namespace nanoeigenpy