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)