Skip to content

Commit 34ebd44

Browse files
add from_openqasm method
1 parent 953e2cf commit 34ebd44

File tree

5 files changed

+55
-7
lines changed

5 files changed

+55
-7
lines changed

.gitignore

+1
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
data
12
.prettierignore
23
.idea/
34
dataset

CHANGELOG.md

+8
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,14 @@
22

33
## Unreleased
44

5+
### Added
6+
7+
- Add native support for `rxx`, `ryy` and `rzz` gates for translation from qiskit
8+
9+
- Add `from_openqasm` and `from_openqasm_file` methods for `Circuit`
10+
11+
- Add `circuit_params` argument for translation from qiskit to make the interface universal and consistent with other `from_` methods
12+
513
## 0.5.0
614

715
### Added

tensorcircuit/abstractcircuit.py

+26-2
Original file line numberDiff line numberDiff line change
@@ -520,6 +520,26 @@ def to_openqasm(self, **kws: Any) -> str:
520520
"""
521521
return self.to_qiskit().qasm(**kws) # type: ignore
522522

523+
@classmethod
524+
def from_openqasm(
525+
cls, qasmstr: str, circuit_params: Optional[Dict[str, Any]] = None
526+
) -> "AbstractCircuit":
527+
from qiskit.circuit import QuantumCircuit
528+
529+
qiskit_circ = QuantumCircuit.from_qasm_str(qasmstr)
530+
c = cls.from_qiskit(qiskit_circ, circuit_params=circuit_params)
531+
return c
532+
533+
@classmethod
534+
def from_openqasm_file(
535+
cls, file: str, circuit_params: Optional[Dict[str, Any]] = None
536+
) -> "AbstractCircuit":
537+
from qiskit.circuit import QuantumCircuit
538+
539+
qiskit_circ = QuantumCircuit.from_qasm_file(file)
540+
c = cls.from_qiskit(qiskit_circ, circuit_params=circuit_params)
541+
return c
542+
523543
def draw(self, **kws: Any) -> Any:
524544
"""
525545
Visualise the circuit.
@@ -543,7 +563,11 @@ def draw(self, **kws: Any) -> Any:
543563

544564
@classmethod
545565
def from_qiskit(
546-
cls, qc: Any, n: Optional[int] = None, inputs: Optional[List[float]] = None
566+
cls,
567+
qc: Any,
568+
n: Optional[int] = None,
569+
inputs: Optional[List[float]] = None,
570+
circuit_params: Optional[Dict[str, Any]] = None,
547571
) -> "AbstractCircuit":
548572
"""
549573
Import Qiskit QuantumCircuit object as a ``tc.Circuit`` object.
@@ -571,7 +595,7 @@ def from_qiskit(
571595
if n is None:
572596
n = qc.num_qubits
573597

574-
return qiskit2tc(qc.data, n, inputs, is_dm=cls.is_dm) # type: ignore
598+
return qiskit2tc(qc.data, n, inputs, is_dm=cls.is_dm, circuit_params=circuit_params) # type: ignore
575599

576600
def vis_tex(self, **kws: Any) -> str:
577601
"""

tensorcircuit/translation.py

+10-5
Original file line numberDiff line numberDiff line change
@@ -194,6 +194,7 @@ def qiskit2tc(
194194
n: int,
195195
inputs: Optional[List[float]] = None,
196196
is_dm: bool = False,
197+
circuit_params: Optional[Dict[str, Any]] = None,
197198
) -> Any:
198199
r"""
199200
Generate a tensorcircuit circuit using the quantum circuit data in qiskit.
@@ -220,10 +221,14 @@ def qiskit2tc(
220221
Circ = DMCircuit2
221222
else:
222223
Circ = Circuit # type: ignore
223-
if inputs is None:
224-
tc_circuit: Any = Circ(n)
225-
else:
226-
tc_circuit = Circ(n, inputs=inputs)
224+
if circuit_params is None:
225+
circuit_params = {}
226+
if "nqubits" not in circuit_params:
227+
circuit_params["nqubits"] = n
228+
if inputs is not None:
229+
circuit_params["inputs"] = inputs
230+
231+
tc_circuit: Any = Circ(**circuit_params)
227232
for gate_info in qcdata:
228233
idx = [qb.index for qb in gate_info[1]]
229234
gate_name = gate_info[0].name
@@ -250,7 +255,7 @@ def qiskit2tc(
250255
getattr(tc_circuit, gate_name[:-1])(*idx)
251256
elif gate_name in ["cx_o0", "cy_o0", "cz_o0"]:
252257
getattr(tc_circuit, "o" + gate_name[1])(*idx)
253-
elif gate_name in ["rx", "ry", "rz", "crx", "cry", "crz"]:
258+
elif gate_name in ["rx", "ry", "rz", "crx", "cry", "crz", "rxx", "ryy", "rzz"]:
254259
getattr(tc_circuit, gate_name)(*idx, theta=parameters)
255260
elif gate_name in ["crx_o0", "cry_o0", "crz_o0"]:
256261
getattr(tc_circuit, "o" + gate_name[1:-3])(*idx, theta=parameters)

tests/test_circuit.py

+10
Original file line numberDiff line numberDiff line change
@@ -976,6 +976,8 @@ def test_qiskit2tc():
976976
qisc.cz(0, 1, ctrl_state=0)
977977
qisc.cy(0, 1, ctrl_state=0)
978978
qisc.cx(0, 1, ctrl_state=0)
979+
qisc.rxx(0.3, 1, 2)
980+
qisc.rzz(-0.8, 2, 0)
979981
qisc.u(0.3, 0.9, -1.2, 2)
980982
qisc.rx(np.random.uniform(), 1)
981983
qisc.ry(np.random.uniform(), 2)
@@ -1219,4 +1221,12 @@ def test_to_openqasm():
12191221
c.cnot(2, 1)
12201222
c.rzz(0, 1, theta=-1.0)
12211223
c.ccx(1, 2, 0)
1224+
c.u(2, theta=0.5, lbd=1.3)
12221225
print(c.to_openqasm(formatted=True))
1226+
s = c.to_openqasm()
1227+
c1 = tc.Circuit.from_openqasm(s)
1228+
print(c1.draw())
1229+
np.testing.assert_allclose(c.state(), c1.state())
1230+
c.to_openqasm(filename="test.qasm")
1231+
c2 = tc.Circuit.from_openqasm_file("test.qasm")
1232+
np.testing.assert_allclose(c.state(), c2.state())

0 commit comments

Comments
 (0)