Source code for quantum_launcher.base.translator
1""" Module providing Translation between different universal quantum computers """
2from typing import Any
3from abc import ABC, abstractmethod
4from quantum_launcher.import_management import DependencyError
5
6try:
7 import cirq
8 from cirq.contrib.qasm_import.qasm import circuit_from_qasm
9except ImportError as e:
10 raise DependencyError(e, 'cirq') from e
11
12try:
13 import qiskit
14 from qiskit import qasm2
15 from qiskit.compiler import transpile
16 from qiskit.transpiler.passes import RemoveBarriers
17except ImportError as e:
18 raise DependencyError(e, 'qiskit') from e
19
20
[docs]
21class Translation(ABC):
22 """ Translation layer for circuits written in different languages """
23 basis_gates: list[str] = []
24 language: str = 'None'
25 circuit_object: type = type
26 language_name_mapping: dict[str, "Translation"] = {}
27 circuit_class_mapping: dict[type, "Translation"] = {}
28
29 def __init_subclass__(cls):
30 Translation.language_name_mapping[cls.language] = cls()
31 Translation.circuit_class_mapping[cls.circuit_object] = cls()
32
[docs]
33 @abstractmethod
34 def to_qasm(self, circuit: Any) -> str:
35 """ Translation from given circuit into qasm (as a string) """
36
[docs]
37 @abstractmethod
38 def from_qasm(self, qasm: str) -> Any:
39 """ Translation given in qasm (as a string) circuit into language specific object """
40
[docs]
41 @staticmethod
42 def get_translation(circuit: Any, language: str) -> Any:
43 """ Transpiles circuit into given languages basis_gates, translates it to qasm, and from qasm into desired languages object. """
44 circuit_qasm_translator = Translation.circuit_class_mapping[circuit.__class__]
45 qasm_circuit_translator = Translation.language_name_mapping[language]
46 if isinstance(circuit, qiskit.QuantumCircuit):
47 transpiled_circuit = transpile_circuit(circuit, qasm_circuit_translator.basis_gates)
48 else:
49 transpiled_circuit = circuit # Transpilation is usually not needed
50 qasm = circuit_qasm_translator.to_qasm(transpiled_circuit)
51 return qasm_circuit_translator.from_qasm(qasm)
52
53
[docs]
54class CirqTranslation(Translation):
55 """ Translation class for Cirq """
56 basis_gates = ['x', 'y', 'z', 'cx', 'h', 'rx', 'ry', 'rz']
57 language: str = 'cirq'
58 circuit_object = cirq.Circuit
59
[docs]
60 def to_qasm(self, circuit: cirq.Circuit) -> str:
61 return circuit.to_qasm()
62
[docs]
63 def from_qasm(self, qasm: str) -> cirq.Circuit:
64 return circuit_from_qasm(qasm)
65
66
[docs]
67class QiskitTranslation(Translation):
68 """ Translation class for Qiskit """
69 basis_gates = ['x', 'y', 'z', 'cx', 'h', 'rx', 'ry', 'rz', 'u']
70 language: str = 'qiskit'
71 circuit_object = qiskit.QuantumCircuit
72
[docs]
73 def to_qasm(self, circuit: qiskit.QuantumCircuit) -> str:
74 return qasm2.dumps(circuit)
75
[docs]
76 def from_qasm(self, qasm: str) -> qiskit.QuantumCircuit:
77 return qiskit.QuantumCircuit.from_qasm_str(qasm)
78
79
[docs]
80def transpile_circuit(qc: qiskit.QuantumCircuit, basis_gates: list[str]) -> qiskit.QuantumCircuit:
81 """Makes circuit compatible with cirq
82
83 Args:
84 qc (qiskit.QuantumCircuit): circuit
85
86 Returns:
87 qiskit.QuantumCircuit: transpiled circuit
88 """
89 qc_transpiled = transpile(
90 qc,
91 basis_gates=basis_gates,
92 optimization_level=3
93 )
94
95 return RemoveBarriers()(qc_transpiled)