Skip to content

Commit b9c6eac

Browse files
committed
Adjust bindings to new mqt.core.
1 parent 9781f7c commit b9c6eac

File tree

3 files changed

+57
-34
lines changed

3 files changed

+57
-34
lines changed

extern/mqt-core

src/mqt/qcec/verify.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010

1111
from .configuration import ConfigurationOptions
1212

13+
1314
from . import Configuration, EquivalenceCheckingManager
1415
from .configuration import augment_config_from_kwargs
1516
from .parameterized import __is_parameterized, check_parameterized

src/python/bindings.cpp

Lines changed: 55 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,10 @@
44
//
55

66
#include "EquivalenceCheckingManager.hpp"
7+
#include "QuantumComputation.hpp"
78
#include "pybind11/pybind11.h"
89
#include "pybind11/stl.h"
910
#include "pybind11_json/pybind11_json.hpp"
10-
#include "python/qiskit/QasmQobjExperiment.hpp"
11-
#include "python/qiskit/QuantumCircuit.hpp"
1211

1312
#include <exception>
1413
#include <memory>
@@ -17,47 +16,55 @@ namespace py = pybind11;
1716
using namespace pybind11::literals;
1817

1918
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");
2524

26-
auto qc = qc::QuantumComputation();
25+
// auto qc = qc::QuantumComputation();
2726

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+
// }
3939

40-
return qc;
41-
}
40+
// return qc;
41+
// }
4242

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);
5251
}
5352

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");
5555
try {
56-
qc2 = importCircuit(circ2);
56+
return qiskit_to_mqt(circ).cast<qc::QuantumComputation>();
5757
} catch (const std::exception& ex) {
58-
throw std::runtime_error("Could not import second circuit: " +
58+
throw std::runtime_error("Could not import circuit: " +
5959
std::string(ex.what()));
6060
}
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);
6168

6269
return std::make_unique<EquivalenceCheckingManager>(qc1, qc2, configuration);
6370
}
@@ -184,6 +191,21 @@ PYBIND11_MODULE(pyqcec, m) {
184191
"config"_a = Configuration(),
185192
"Create an equivalence checking manager for two circuits and "
186193
"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.")
187209
.def("get_configuration", &EquivalenceCheckingManager::getConfiguration)
188210
// Convenience functions
189211
// Execution

0 commit comments

Comments
 (0)