4
4
//
5
5
6
6
#include " EquivalenceCheckingManager.hpp"
7
+ #include " QuantumComputation.hpp"
7
8
#include " pybind11/pybind11.h"
8
9
#include " pybind11/stl.h"
9
10
#include " pybind11_json/pybind11_json.hpp"
10
- #include " python/qiskit/QasmQobjExperiment.hpp"
11
- #include " python/qiskit/QuantumCircuit.hpp"
12
11
13
12
#include < exception>
14
13
#include < memory>
@@ -17,47 +16,55 @@ namespace py = pybind11;
17
16
using namespace pybind11 ::literals;
18
17
19
18
namespace ec {
20
- static qc::QuantumComputation importCircuit (const py::object& circ) {
21
- const py::object quantumCircuit =
22
- py::module::import (" qiskit" ).attr (" QuantumCircuit" );
23
- const py::object pyQasmQobjExperiment =
24
- py::module::import (" qiskit.qobj" ).attr (" QasmQobjExperiment" );
19
+ // static qc::QuantumComputation importCircuit(const py::object& circ) {
20
+ // const py::object quantumCircuit =
21
+ // py::module::import("qiskit").attr("QuantumCircuit");
22
+ // const py::object pyQasmQobjExperiment =
23
+ // py::module::import("qiskit.qobj").attr("QasmQobjExperiment");
25
24
26
- auto qc = qc::QuantumComputation ();
25
+ // auto qc = qc::QuantumComputation();
27
26
28
- if (py::isinstance<py::str>(circ)) {
29
- const auto file = circ.cast <std::string>();
30
- qc.import (file);
31
- } else if (py::isinstance (circ, quantumCircuit)) {
32
- qc::qiskit::QuantumCircuit::import (qc, circ);
33
- } else if (py::isinstance (circ, pyQasmQobjExperiment)) {
34
- qc::qiskit::QasmQobjExperiment::import (qc, circ);
35
- } else {
36
- throw std::runtime_error (
37
- " PyObject is neither py::str, QuantumCircuit, nor QasmQobjExperiment" );
38
- }
27
+ // if (py::isinstance<py::str>(circ)) {
28
+ // const auto file = circ.cast<std::string>();
29
+ // qc.import(file);
30
+ // } else if (py::isinstance(circ, quantumCircuit)) {
31
+ // qc::qiskit::QuantumCircuit::import(qc, circ);
32
+ // } else if (py::isinstance(circ, pyQasmQobjExperiment)) {
33
+ // qc::qiskit::QasmQobjExperiment::import(qc, circ);
34
+ // } else {
35
+ // throw std::runtime_error(
36
+ // "PyObject is neither py::str, QuantumCircuit, nor
37
+ // QasmQobjExperiment");
38
+ // }
39
39
40
- return qc;
41
- }
40
+ // return qc;
41
+ // }
42
42
43
- static std::unique_ptr<EquivalenceCheckingManager>
44
- createManagerFromConfiguration (const py::object& circ1, const py::object& circ2,
45
- const Configuration& configuration = {}) {
46
- qc::QuantumComputation qc1;
47
- try {
48
- qc1 = importCircuit (circ1);
49
- } catch (const std::exception& ex) {
50
- throw std::runtime_error (" Could not import first circuit: " +
51
- std::string (ex.what ()));
43
+ static qc::QuantumComputation qcFromPy (const py::object& circ) {
44
+ if (py::isinstance<qc::QuantumComputation>(circ)) {
45
+ return circ.cast <qc::QuantumComputation>();
46
+ }
47
+
48
+ if (py::isinstance<py::str>(circ)) {
49
+ const auto file = circ.cast <std::string>();
50
+ return qc::QuantumComputation (file);
52
51
}
53
52
54
- qc::QuantumComputation qc2;
53
+ py::object qiskit = py::module_::import (" mqt.core.plugins.qiskit" );
54
+ py::object qiskit_to_mqt = qiskit.attr (" qiskit_to_mqt" );
55
55
try {
56
- qc2 = importCircuit (circ2 );
56
+ return qiskit_to_mqt (circ). cast <qc::QuantumComputation>( );
57
57
} catch (const std::exception& ex) {
58
- throw std::runtime_error (" Could not import second circuit: " +
58
+ throw std::runtime_error (" Could not import circuit: " +
59
59
std::string (ex.what ()));
60
60
}
61
+ return qc::QuantumComputation ();
62
+ }
63
+ static std::unique_ptr<EquivalenceCheckingManager>
64
+ createManagerFromConfiguration (const py::object& circ1, const py::object& circ2,
65
+ const Configuration& configuration = {}) {
66
+ auto qc1 = qcFromPy (circ1);
67
+ auto qc2 = qcFromPy (circ2);
61
68
62
69
return std::make_unique<EquivalenceCheckingManager>(qc1, qc2, configuration);
63
70
}
@@ -184,6 +191,21 @@ PYBIND11_MODULE(pyqcec, m) {
184
191
" config" _a = Configuration (),
185
192
" Create an equivalence checking manager for two circuits and "
186
193
" configure it with a :class:`Configuration` object." )
194
+ // .def(py::init([](const py::object& circ1,
195
+ // const py::object&
196
+ // circ2, const
197
+ // Configuration& config)
198
+ // {
199
+ // py::object qiskit =
200
+ // py::module_::import("mqt.core.plugins.qiskit"); py::object
201
+ // qiskit_to_mqt = qiskit.attr("qiskit_to_mqt"); return
202
+ // std::make_unique<EquivalenceCheckingManager>(
203
+ // qiskit_to_mqt(circ1).cast<qc::QuantumComputation>(),
204
+ // qiskit_to_mqt(circ2).cast<qc::QuantumComputation>(),
205
+ // config);}),
206
+ // "circ1"_a, "circ2"_a, "config"_a = Configuration(),
207
+ // "Create an equivalence checking manager for two circuits and "
208
+ // "configure it with a :class:`Configuration` object.")
187
209
.def (" get_configuration" , &EquivalenceCheckingManager::getConfiguration)
188
210
// Convenience functions
189
211
// Execution
0 commit comments