Skip to content

Commit 658e010

Browse files
Remove some unsupported 2-qubit gates and implement minor fixes
1 parent 63be854 commit 658e010

12 files changed

+23
-143
lines changed

src/qiskit_symb/circuit/__init__.py

+8-12
Original file line numberDiff line numberDiff line change
@@ -51,20 +51,16 @@
5151
'rxx': RXXGate,
5252
'ryy': RYYGate,
5353
'rzz': RZZGate,
54-
'rzx': RZXGate,
55-
'xx_minus_yy': XXMinusYYGate,
56-
'xx_plus_yy': XXPlusYYGate,
5754
}
5855

5956

57+
def get_gates():
58+
"""todo"""
59+
return set(name2class.keys())
60+
61+
6062
def get_class(op):
6163
"""todo"""
62-
if isinstance(op, ControlledGate):
63-
name = 'c' + op.base_gate.name
64-
else:
65-
name = op.name
66-
try:
67-
return name2class[name]
68-
except KeyError as kerr:
69-
error_message = f'Gate "{name}" is not implemented in qiskit-symb'
70-
raise NotImplementedError(error_message) from kerr
64+
is_controlled = isinstance(op, ControlledGate)
65+
name = 'c' + op.base_gate.name if is_controlled else op.name
66+
return name2class[name]

src/qiskit_symb/circuit/library/__init__.py

-3
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,4 @@
2828
RXXGate,
2929
RYYGate,
3030
RZZGate,
31-
RZXGate,
32-
XXMinusYYGate,
33-
XXPlusYYGate,
3431
)

src/qiskit_symb/circuit/library/parametric_gates/__init__.py

-3
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,3 @@
1212
from .rxx import RXXGate
1313
from .ryy import RYYGate
1414
from .rzz import RZZGate
15-
from .rzx import RZXGate
16-
from .xx_minus_yy import XXMinusYYGate
17-
from .xx_plus_yy import XXPlusYYGate

src/qiskit_symb/circuit/library/parametric_gates/rzx.py

-25
This file was deleted.

src/qiskit_symb/circuit/library/parametric_gates/xx_minus_yy.py

-27
This file was deleted.

src/qiskit_symb/circuit/library/parametric_gates/xx_plus_yy.py

-27
This file was deleted.

src/qiskit_symb/circuit/random.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
from qiskit.circuit.random import random_circuit
55

66

7-
def random_parametric_circuit(num_qubits, depth, max_operands=2, seed=None):
7+
def random_parametric_circuit(num_qubits, depth, max_operands=3, seed=None):
88
"""todo"""
99
random_qc = random_circuit(
1010
num_qubits=num_qubits, depth=depth, max_operands=max_operands, seed=seed)

src/qiskit_symb/quantum_info/statevector.py

+11-5
Original file line numberDiff line numberDiff line change
@@ -40,10 +40,13 @@ def __init__(self, data, nqubits=None, params=None):
4040
@staticmethod
4141
def _get_sympy_expr(circuit):
4242
"""todo"""
43+
from ..circuit import get_gates
4344
from ..circuit.gate import Gate
4445
num_qubits = circuit.num_qubits
4546
circuit = QuantumCircuit(num_qubits).compose(circuit)
46-
circuit = transpile(circuit, optimization_level=1)
47+
basis_gates = get_gates()
48+
circuit = transpile(
49+
circuit, basis_gates=basis_gates, optimization_level=1)
4750
zero = [1] + [0] * (2**num_qubits - 1)
4851
state_tensor = sympy.Array(zero, shape=(2,)*num_qubits)
4952
for layer in circuit_to_dag(circuit).layers():
@@ -53,9 +56,8 @@ def _get_sympy_expr(circuit):
5356
gates_tensors = [gate._get_tensor_array() for gate in gates]
5457
state_tensor = opt_einsum.contract(
5558
einsum_contract, state_tensor, *gates_tensors)
56-
print(sympy.flatten(state_tensor))
5759
gph = sympy.exp(sympy.I * circuit.global_phase)
58-
state_tensor = gph * sympy.Array(state_tensor, shape=(2**num_qubits))
60+
state_tensor = gph * sympy.Array(state_tensor, shape=2**num_qubits)
5961
return state_tensor
6062

6163
@classmethod
@@ -79,16 +81,20 @@ def to_numpy(self):
7981
"""todo"""
8082
return numpy.array(self.to_sympy().tolist(), dtype=complex)
8183

82-
def to_lambda(self):
84+
def _lambdify(self, sympy_expr):
8385
"""todo"""
84-
sympy_expr = self.to_sympy()
8586
name2symb = {symb.name: symb for symb in sympy_expr.free_symbols}
8687
args = [name2symb[par.name]
8788
if par.name in name2symb
8889
else sympy.Symbol('_')
8990
for par in self._params]
9091
return sympy.lambdify(args=args, expr=sympy_expr, modules='numpy', dummify=True, cse=True)
9192

93+
def to_lambda(self):
94+
"""todo"""
95+
sympy_expr = self.to_sympy()
96+
return self._lambdify(sympy_expr=sympy_expr)
97+
9298
def subs(self, params_dict):
9399
"""todo"""
94100
par2val = {}

tests/test_ctrl_parametric_gates.py

+1
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828

2929

3030
def convert_endian(unitary):
31+
"""todo"""
3132
nq = int(numpy.log2(len(unitary)))
3233
perm = [int(bin(i)[2:].zfill(nq)[::-1], 2) for i in range(len(unitary))]
3334
return unitary[numpy.ix_(perm, perm)]

tests/test_ctrl_standard_gates.py

+1
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828

2929

3030
def convert_endian(unitary):
31+
"""todo"""
3132
nq = int(numpy.log2(len(unitary)))
3233
perm = [int(bin(i)[2:].zfill(nq)[::-1], 2) for i in range(len(unitary))]
3334
return unitary[numpy.ix_(perm, perm)]

tests/test_parametric_gates.py

-40
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,6 @@
1616
RXXGate,
1717
RYYGate,
1818
RZZGate,
19-
RZXGate,
20-
XXMinusYYGate,
21-
XXPlusYYGate,
2219
)
2320
from qiskit_symb.circuit.library import (
2421
UGate as symb_UGate,
@@ -33,9 +30,6 @@
3330
RXXGate as symb_RXXGate,
3431
RYYGate as symb_RYYGate,
3532
RZZGate as symb_RZZGate,
36-
RZXGate as symb_RZXGate,
37-
XXMinusYYGate as symb_XXMinusYYGate,
38-
XXPlusYYGate as symb_XXPlusYYGate,
3933
)
4034

4135
val_range = {'min_value': -2*numpy.pi, 'max_value': 2*numpy.pi}
@@ -169,37 +163,3 @@ def test_rzz(theta):
169163
gate = symb_RZZGate(par, 0, 1)
170164
arr2 = gate.get_numpy_repr(par2val={par: theta})
171165
assert numpy.allclose(arr1, arr2)
172-
173-
174-
@given(theta=strategies.floats(**val_range))
175-
def test_rzx(theta):
176-
"""todo"""
177-
par = Parameter(name='par')
178-
arr1 = RZXGate(theta).to_matrix()
179-
gate = symb_RZXGate(par, 0, 1)
180-
arr2 = gate.get_numpy_repr(par2val={par: theta})
181-
assert numpy.allclose(arr1, arr2)
182-
183-
184-
@given(theta=strategies.floats(**val_range),
185-
beta=strategies.floats(**val_range))
186-
def test_xx_minus_yy(theta, beta):
187-
"""todo"""
188-
pars_vals = [theta, beta]
189-
pars = ParameterVector(name='pars', length=len(pars_vals))
190-
arr1 = XXMinusYYGate(*pars_vals).to_matrix()
191-
gate = symb_XXMinusYYGate(*pars, 0, 1)
192-
arr2 = gate.get_numpy_repr(par2val=dict(zip(pars, pars_vals)))
193-
assert numpy.allclose(arr1, arr2)
194-
195-
196-
@given(theta=strategies.floats(**val_range),
197-
beta=strategies.floats(**val_range))
198-
def test_xx_plus_yy(theta, beta):
199-
"""todo"""
200-
pars_vals = [theta, beta]
201-
pars = ParameterVector(name='pars', length=len(pars_vals))
202-
arr1 = XXPlusYYGate(*pars_vals).to_matrix()
203-
gate = symb_XXPlusYYGate(*pars, 0, 1)
204-
arr2 = gate.get_numpy_repr(par2val=dict(zip(pars, pars_vals)))
205-
assert numpy.allclose(arr1, arr2)

tests/test_standard_gates.py

+1
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@
3838

3939

4040
def convert_endian(unitary):
41+
"""todo"""
4142
nq = int(numpy.log2(len(unitary)))
4243
perm = [int(bin(i)[2:].zfill(nq)[::-1], 2) for i in range(len(unitary))]
4344
return unitary[numpy.ix_(perm, perm)]

0 commit comments

Comments
 (0)