pairinteraction
A Rydberg Interaction Calculator
Ket.py.cpp
Go to the documentation of this file.
1// SPDX-FileCopyrightText: 2024 Pairinteraction Developers
2// SPDX-License-Identifier: LGPL-3.0-or-later
3
4#include "./Ket.py.hpp"
5
13
14#include <complex>
15#include <nanobind/nanobind.h>
16#include <nanobind/operators.h>
17#include <nanobind/stl/shared_ptr.h>
18#include <nanobind/stl/string.h>
19#include <nanobind/stl/vector.h>
20#include <sstream>
21
22namespace nb = nanobind;
23using namespace pairinteraction;
24
25static void declare_ket(nb::module_ &m) {
26 std::string pyclass_name = "Ket";
27 nb::class_<Ket> pyclass(m, pyclass_name.c_str());
28 pyclass.def("get_energy", &Ket::get_energy)
29 .def("get_quantum_number_f", &Ket::get_quantum_number_f)
30 .def("get_quantum_number_m", &Ket::get_quantum_number_m)
31 .def("get_parity", &Ket::get_parity)
32 .def("get_label", &Ket::get_label)
33 .def("__str__", [](Ket const &self) {
34 std::stringstream ss;
35 ss << self;
36 return ss.str();
37 });
38}
39
40static void declare_ket_atom(nb::module_ &m) {
41 std::string pyclass_name = "KetAtom";
42 nb::class_<KetAtom, Ket> pyclass(m, pyclass_name.c_str());
43 pyclass.def("get_species", &KetAtom::get_species)
44 .def("get_quantum_number_n", &KetAtom::get_quantum_number_n)
45 .def("get_quantum_number_nu", &KetAtom::get_quantum_number_nu)
46 .def("get_quantum_number_nui", &KetAtom::get_quantum_number_nui)
47 .def("get_quantum_number_l", &KetAtom::get_quantum_number_l)
48 .def("get_quantum_number_s", &KetAtom::get_quantum_number_s)
49 .def("get_quantum_number_j", &KetAtom::get_quantum_number_j)
50 .def("get_quantum_number_l_ryd", &KetAtom::get_quantum_number_l_ryd)
51 .def("get_quantum_number_j_ryd", &KetAtom::get_quantum_number_j_ryd)
52 .def("get_quantum_number_nui_std", &KetAtom::get_quantum_number_nui_std)
53 .def("get_quantum_number_l_std", &KetAtom::get_quantum_number_l_std)
54 .def("get_quantum_number_s_std", &KetAtom::get_quantum_number_s_std)
55 .def("get_quantum_number_j_std", &KetAtom::get_quantum_number_j_std)
56 .def("get_quantum_number_l_ryd_std", &KetAtom::get_quantum_number_l_ryd_std)
57 .def("get_quantum_number_j_ryd_std", &KetAtom::get_quantum_number_j_ryd_std)
58 .def("is_j_total_momentum", &KetAtom::is_j_total_momentum)
59 .def("is_calculated_with_mqdt", &KetAtom::is_calculated_with_mqdt)
60 .def("get_underspecified_channel_contribution",
61 &KetAtom::get_underspecified_channel_contribution)
62 .def(nb::self == nb::self) // NOLINT(misc-redundant-expression)
63 .def("__hash__", [](const KetAtom &self) { return KetAtom::hash{}(self); });
64}
65
66static void declare_ket_atom_creator(nb::module_ &m) {
67 std::string pyclass_name = "KetAtomCreator";
68 nb::class_<KetAtomCreator> pyclass(m, pyclass_name.c_str());
69 pyclass.def(nb::init<>())
70 .def(nb::init<std::string, int, double, double, double>())
71 .def("set_species", &KetAtomCreator::set_species)
72 .def("set_energy", &KetAtomCreator::set_energy)
73 .def("set_quantum_number_f", &KetAtomCreator::set_quantum_number_f)
74 .def("set_quantum_number_m", &KetAtomCreator::set_quantum_number_m)
75 .def("set_parity", &KetAtomCreator::set_parity)
76 .def("set_quantum_number_n", &KetAtomCreator::set_quantum_number_n)
77 .def("set_quantum_number_nu", &KetAtomCreator::set_quantum_number_nu)
78 .def("set_quantum_number_nui", &KetAtomCreator::set_quantum_number_nui)
79 .def("set_quantum_number_l", &KetAtomCreator::set_quantum_number_l)
80 .def("set_quantum_number_s", &KetAtomCreator::set_quantum_number_s)
81 .def("set_quantum_number_j", &KetAtomCreator::set_quantum_number_j)
82 .def("set_quantum_number_l_ryd", &KetAtomCreator::set_quantum_number_l_ryd)
83 .def("set_quantum_number_j_ryd", &KetAtomCreator::set_quantum_number_j_ryd)
84 .def("create", &KetAtomCreator::create);
85}
86
87template <typename T>
88static void declare_ket_pair(nb::module_ &m, std::string const &type_name) {
89 std::string pyclass_name = "KetPair" + type_name;
90 nb::class_<KetPair<T>, Ket> pyclass(m, pyclass_name.c_str());
91 pyclass.def("get_atomic_states", &KetPair<T>::get_atomic_states)
92 .def(nb::self == nb::self) // NOLINT(misc-redundant-expression)
93 .def("__hash__", [](const KetPair<T> &self) { return typename KetPair<T>::hash{}(self); });
94}
95
96void bind_ket(nb::module_ &m) {
97 declare_ket(m);
98 declare_ket_atom(m);
99 declare_ket_atom_creator(m);
100 declare_ket_pair<double>(m, "Real");
101 declare_ket_pair<std::complex<double>>(m, "Complex");
102}
void bind_ket(nb::module_ &m)
Definition: Ket.py.cpp:96
Class for representing atomic kets.
Definition: KetAtom.hpp:21
Base class for a ket.
Definition: Ket.hpp:25