24
24
ClassicalRegister ,
25
25
execute ,
26
26
)
27
- from qiskit .quantum_info import SparsePauliOp # type: ignore
27
+ from qiskit .quantum_info import SparsePauliOp , Statevector , Operator # type: ignore
28
28
from qiskit .transpiler import PassManager # type: ignore
29
29
from qiskit .circuit .library import RYGate , MCMT , XXPlusYYGate , PauliEvolutionGate , UnitaryGate , RealAmplitudes # type: ignore
30
30
import qiskit .circuit .library .standard_gates as qiskit_gates # type: ignore
31
31
from qiskit .circuit import Parameter
32
32
from qiskit .synthesis import SuzukiTrotter # type: ignore
33
33
from qiskit_aer import Aer # type: ignore
34
- from qiskit .quantum_info import Statevector , Operator
34
+ from qiskit .transpiler .passes import BasisTranslator # type: ignore
35
+ from qiskit .circuit .equivalence_library import StandardEquivalenceLibrary # type: ignore
36
+ from qiskit .providers .fake_provider import FakeGuadalupe # type: ignore
37
+ from qiskit .circuit .parameterexpression import ParameterExpression # type: ignore
35
38
36
39
from pytket .circuit import (
37
40
Circuit ,
50
53
from pytket .extensions .qiskit .qiskit_convert import _gate_str_2_optype
51
54
from pytket .extensions .qiskit .tket_pass import TketPass , TketAutoPass
52
55
from pytket .extensions .qiskit .result_convert import qiskit_result_to_backendresult
53
- from pytket .passes import RebaseTket , DecomposeBoxes , FullPeepholeOptimise , SequencePass
56
+ from pytket .passes import (
57
+ RebaseTket ,
58
+ DecomposeBoxes ,
59
+ FullPeepholeOptimise ,
60
+ SequencePass ,
61
+ CliffordSimp ,
62
+ )
63
+
54
64
from pytket .utils .results import (
55
65
compare_statevectors ,
56
66
permute_rows_cols_in_unitary ,
@@ -72,6 +82,28 @@ def _get_qiskit_statevector(qc: QuantumCircuit) -> np.ndarray:
72
82
return np .array (job .result ().data ()["statevector" ].reverse_qargs ().data )
73
83
74
84
85
+ def test_parameterised_circuit_global_phase () -> None :
86
+ pass_1 = BasisTranslator (
87
+ StandardEquivalenceLibrary ,
88
+ target_basis = FakeGuadalupe ().configuration ().basis_gates ,
89
+ )
90
+ pass_2 = CliffordSimp ()
91
+
92
+ qc = QuantumCircuit (2 )
93
+ qc .ryy (Parameter ("MyParam" ), 0 , 1 )
94
+
95
+ pm = PassManager (pass_1 )
96
+ qc = pm .run (qc )
97
+
98
+ tket_qc = qiskit_to_tk (qc )
99
+
100
+ pass_2 .apply (tket_qc )
101
+
102
+ qc_2 = tk_to_qiskit (tket_qc )
103
+
104
+ assert type (qc_2 .global_phase ) == ParameterExpression
105
+
106
+
75
107
def test_classical_barrier_error () -> None :
76
108
c = Circuit (1 , 1 )
77
109
c .add_barrier ([0 ], [0 ])
@@ -398,24 +430,17 @@ def test_conditions() -> None:
398
430
399
431
400
432
def test_condition_errors () -> None :
401
- with pytest .raises (Exception ) as errorinfo :
402
- c = Circuit (2 , 2 )
403
- c .X (0 , condition_bits = [0 ], condition_value = 1 )
404
- tk_to_qiskit (c )
405
- assert "OpenQASM conditions must be an entire register" in str (errorinfo .value )
406
433
with pytest .raises (Exception ) as errorinfo :
407
434
c = Circuit (2 , 2 )
408
435
b = c .add_c_register ("b" , 2 )
409
436
c .X (Qubit (0 ), condition_bits = [b [0 ], Bit (0 )], condition_value = 1 )
410
437
tk_to_qiskit (c )
411
- assert "OpenQASM conditions can only use a single register" in str (errorinfo .value )
438
+ assert "Conditions can only use a single register" in str (errorinfo .value )
412
439
with pytest .raises (Exception ) as errorinfo :
413
440
c = Circuit (2 , 2 )
414
441
c .X (0 , condition_bits = [1 , 0 ], condition_value = 1 )
415
442
tk_to_qiskit (c )
416
- assert "OpenQASM conditions must be an entire register in order" in str (
417
- errorinfo .value
418
- )
443
+ assert "Conditions must be an entire register in order" in str (errorinfo .value )
419
444
420
445
421
446
def test_correction () -> None :
@@ -857,6 +882,26 @@ def test_ccx_conversion() -> None:
857
882
)
858
883
859
884
885
+ def test_conditional_conversion () -> None :
886
+ c = Circuit (1 , 2 , "conditional_circ" )
887
+ c .X (0 , condition_bits = [0 ], condition_value = 1 )
888
+
889
+ c_qiskit = tk_to_qiskit (c )
890
+ c_tket = qiskit_to_tk (c_qiskit )
891
+
892
+ assert c_tket .to_dict () == c .to_dict ()
893
+
894
+
895
+ def test_conditional_conversion_2 () -> None :
896
+ c = Circuit (1 , 2 , "conditional_circ_2" )
897
+ c .X (0 , condition_bits = [1 ], condition_value = 1 )
898
+
899
+ c_qiskit = tk_to_qiskit (c )
900
+ c_tket = qiskit_to_tk (c_qiskit )
901
+
902
+ assert c_tket .to_dict () == c .to_dict ()
903
+
904
+
860
905
# https://github.com/CQCL/pytket-qiskit/issues/100
861
906
def test_state_prep_conversion_array_or_list () -> None :
862
907
# State prep with list of real amplitudes
0 commit comments