12#include <nanobind/eigen/sparse.h>
13#include <nanobind/nanobind.h>
14#include <nanobind/operators.h>
15#include <nanobind/stl/complex.h>
16#include <nanobind/stl/shared_ptr.h>
17#include <nanobind/stl/vector.h>
19namespace nb = nanobind;
23static void declare_operator(nb::module_ &m, std::string
const &type_name) {
24 std::string pyclass_name =
"Operator" + type_name;
28 pyclass_name.c_str());
29 pyclass.def(nb::init<std::shared_ptr<const basis_t>>())
41 .def(scalar_t() * nb::self)
42 .def(nb::self * scalar_t())
43 .def(nb::self / scalar_t())
44 .def(nb::self + nb::self)
45 .def(nb::self - nb::self);
49static void declare_operator_atom(nb::module_ &m, std::string
const &type_name) {
50 std::string pyclass_name =
"OperatorAtom" + type_name;
53 pyclass.def(nb::init<std::shared_ptr<const basis_t>>())
54 .def(nb::init<std::shared_ptr<const basis_t>,
OperatorType,
int>());
58static void declare_operator_pair(nb::module_ &m, std::string
const &type_name) {
59 std::string pyclass_name =
"OperatorPair" + type_name;
62 pyclass.def(nb::init<std::shared_ptr<const basis_t>>())
63 .def(nb::init<std::shared_ptr<const basis_t>,
OperatorType>());
67 declare_operator<OperatorAtom<double>>(m,
"OperatorAtomReal");
68 declare_operator<OperatorAtom<std::complex<double>>>(m,
"OperatorAtomComplex");
69 declare_operator_atom<double>(m,
"Real");
70 declare_operator_atom<std::complex<double>>(m,
"Complex");
72 declare_operator<OperatorPair<double>>(m,
"OperatorPairReal");
73 declare_operator<OperatorPair<std::complex<double>>>(m,
"OperatorPairComplex");
74 declare_operator_pair<double>(m,
"Real");
75 declare_operator_pair<std::complex<double>>(m,
"Complex");
void bind_operator(nb::module_ &m)
typename traits::CrtpTraits< Type >::basis_t basis_t
typename traits::CrtpTraits< Type >::basis_t basis_t
typename traits::CrtpTraits< Derived >::scalar_t scalar_t
typename traits::CrtpTraits< Derived >::basis_t basis_t