77#include " HybridSchrodingerFeynmanSimulator.hpp"
88#include " PathSimulator.hpp"
99#include " UnitarySimulator.hpp"
10- #include " python/qiskit/QuantumCircuit.hpp"
1110
1211#include < memory>
1312#include < pybind11/numpy.h>
1716namespace py = pybind11;
1817using namespace pybind11 ::literals;
1918
20- static qc::QuantumComputation importCircuit (const py::object& circ) {
21- const py::object quantumCircuit =
22- py::module::import (" qiskit" ).attr (" QuantumCircuit" );
23-
24- auto qc = qc::QuantumComputation ();
25-
26- if (py::isinstance<py::str>(circ)) {
27- const auto file = circ.cast <std::string>();
28- qc.import (file);
29- } else if (py::isinstance (circ, quantumCircuit)) {
30- qc::qiskit::QuantumCircuit::import (qc, circ);
31- } else {
32- throw std::runtime_error (
33- " PyObject is neither py::str nor QuantumCircuit" );
34- }
35-
36- return qc;
37- }
38-
3919template <class Simulator , typename ... Args>
40- std::unique_ptr<Simulator> constructSimulator (const py::object& circ,
41- const double stepFidelity,
42- const unsigned int stepNumber,
43- const std::string& approximationStrategy,
44- const std::int64_t seed,
20+ std::unique_ptr<Simulator> constructSimulator (const qc::QuantumComputation& circ,
21+ const double stepFidelity,
22+ const unsigned int stepNumber,
23+ const std::string& approximationStrategy,
24+ const std::int64_t seed,
4525 Args&&... args) {
46- auto qc = std::make_unique<qc::QuantumComputation>(importCircuit ( circ) );
26+ auto qc = std::make_unique<qc::QuantumComputation>(circ);
4727 const auto approx = ApproximationInfo{stepFidelity, stepNumber, ApproximationInfo::fromString (approximationStrategy)};
4828 if constexpr (std::is_same_v<Simulator, PathSimulator<>>) {
4929 return std::make_unique<Simulator>(std::move (qc),
@@ -62,7 +42,7 @@ std::unique_ptr<Simulator> constructSimulator(const py::object& circ,
6242}
6343
6444template <class Simulator , typename ... Args>
65- std::unique_ptr<Simulator> constructSimulatorWithoutSeed (const py::object & circ, Args&&... args) {
45+ std::unique_ptr<Simulator> constructSimulatorWithoutSeed (const qc::QuantumComputation & circ, Args&&... args) {
6646 return constructSimulator<Simulator>(circ, 1 ., 1 , " fidelity" , -1 , std::forward<Args>(args)...);
6747}
6848
@@ -114,26 +94,9 @@ void getNumPyMatrix(UnitarySimulator<Config>& sim, py::array_t<std::complex<dd::
11494 getNumPyMatrixRec (e, std::complex <dd::fp>{1.0 , 0.0 }, 0 , 0 , dim, dataPtr);
11595}
11696
117- void dumpTensorNetwork (const py::object& circ, const std::string& filename) {
118- const py::object quantumCircuit = py::module::import (" qiskit" ).attr (" QuantumCircuit" );
119-
120- std::unique_ptr<qc::QuantumComputation> qc = std::make_unique<qc::QuantumComputation>();
121-
122- if (py::isinstance<py::str>(circ)) {
123- auto && file1 = circ.cast <std::string>();
124- qc->import (file1);
125- } else if (py::isinstance (circ, quantumCircuit)) {
126- qc::qiskit::QuantumCircuit::import (*qc, circ);
127- } else {
128- throw std::runtime_error (" PyObject is neither py::str nor QuantumCircuit" );
129- }
97+ void dumpTensorNetwork (qc::QuantumComputation& circ, const std::string& filename) {
13098 std::ofstream ofs (filename);
131- qc->dump (ofs, qc::Format::Tensor);
132- }
133-
134- dd::fp expectationValue (CircuitSimulator<>& sim, const py::object& observable) {
135- const auto observableCircuit = importCircuit (observable);
136- return sim.expectationValue (observableCircuit);
99+ circ.dump (ofs, qc::Format::Tensor);
137100}
138101
139102template <class Sim >
@@ -171,7 +134,7 @@ PYBIND11_MODULE(pyddsim, m) {
171134 " approximation_steps" _a = 1 ,
172135 " approximation_strategy" _a = " fidelity" ,
173136 " seed" _a = -1 )
174- .def (" expectation_value" , &expectationValue, " observable" _a);
137+ .def (" expectation_value" , &CircuitSimulator<>:: expectationValue, " observable" _a);
175138
176139 // Hybrid Schrödinger-Feynman Simulator
177140 py::enum_<HybridSchrodingerFeynmanSimulator<>::Mode>(m, " HybridMode" )
0 commit comments