Skip to content

Commit 4b16d77

Browse files
authored
Rename RandomGate -> MatrixGate (#897)
`RandomGate` -> `MatrixGate`
1 parent 371613e commit 4b16d77

6 files changed

Lines changed: 31 additions & 39 deletions

File tree

Lines changed: 7 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -15,14 +15,13 @@
1515

1616
import numpy as np
1717
from attrs import field, frozen
18-
from cirq.testing import random_unitary
1918

2019
from qualtran import GateWithRegisters, Signature
2120

2221

2322
@frozen
24-
class RandomGate(GateWithRegisters):
25-
"""Gate with a uniformly random unitary action
23+
class MatrixGate(GateWithRegisters):
24+
"""A unitary n-qubit defined entirely by its numpy matrix.
2625
2726
Args:
2827
bitsize: number of qubits $n$
@@ -48,18 +47,15 @@ def signature(self) -> Signature:
4847
return Signature.build(q=self.bitsize)
4948

5049
@classmethod
51-
def create(cls, bitsize: int, *, random_state=None) -> 'RandomGate':
50+
def random(cls, bitsize: int, *, random_state=None) -> 'MatrixGate':
5251
"""generate a uniformly random unitary on `bitsize` qubits"""
52+
from cirq.testing import random_unitary
53+
5354
matrix = random_unitary(2**bitsize, random_state=random_state)
5455
return cls(bitsize, matrix)
5556

5657
def _unitary_(self):
5758
return np.array(self.matrix)
5859

59-
def adjoint(self) -> 'RandomGate':
60-
return RandomGate(self.bitsize, np.conj(self.matrix).T)
61-
62-
def __pow__(self, power):
63-
if power == -1:
64-
return self.adjoint()
65-
return NotImplemented
60+
def adjoint(self) -> 'MatrixGate':
61+
return MatrixGate(self.bitsize, np.conj(self.matrix).T)

qualtran/bloqs/for_testing/random_gate_test.py renamed to qualtran/bloqs/for_testing/matrix_gate_test.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,13 +15,13 @@
1515
import numpy as np
1616
import pytest
1717

18-
from .random_gate import RandomGate
18+
from .matrix_gate import MatrixGate
1919

2020

2121
@pytest.mark.parametrize("bitsize", [1, 2, 3])
2222
def test_create_and_unitary(bitsize: int):
2323
random_state = np.random.RandomState(42)
2424
for _ in range(5):
25-
gate = RandomGate.create(bitsize, random_state=random_state)
25+
gate = MatrixGate.random(bitsize, random_state=random_state)
2626
np.testing.assert_allclose(cirq.unitary(gate), gate.matrix)
2727
np.testing.assert_allclose(cirq.unitary(gate**-1), np.conj(gate.matrix).T)

qualtran/bloqs/for_testing/random_select_and_prepare.py

Lines changed: 13 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -21,14 +21,14 @@
2121
from numpy.typing import NDArray
2222

2323
from qualtran import BloqBuilder, BoundedQUInt, QBit, Register, SoquetT
24-
from qualtran.bloqs.for_testing.random_gate import RandomGate
24+
from qualtran.bloqs.for_testing.matrix_gate import MatrixGate
2525
from qualtran.bloqs.qubitization_walk_operator import QubitizationWalkOperator
2626
from qualtran.bloqs.select_and_prepare import PrepareOracle, SelectOracle
2727

2828

2929
@frozen
30-
class RandomPrepareOracle(PrepareOracle):
31-
r"""Gate that prepares a randomly chosen state with real amplitudes.
30+
class TestPrepareOracle(PrepareOracle):
31+
r"""Gate that prepares a fixed state with real amplitudes using a MatrixGate.
3232
3333
It is an $n$-qubit unitary $U$ such that
3434
@@ -39,13 +39,13 @@ class RandomPrepareOracle(PrepareOracle):
3939
where $\alpha_x \ge 0$ such that $\sum_x \alpha_x = 1$.
4040
4141
Args:
42-
U: A `RandomGate` whose matrix is the unitary of the oracle.
42+
U: A `MatrixGate` whose matrix is the unitary of the oracle.
4343
4444
Registers:
4545
selection: $n$-qubit register
4646
"""
4747

48-
U: RandomGate
48+
U: MatrixGate
4949

5050
def __attrs_post_init__(self):
5151
# check that first column is all reals
@@ -57,32 +57,28 @@ def selection_registers(self) -> tuple[Register, ...]:
5757
return (Register('selection', BoundedQUInt(bitsize=self.U.bitsize)),)
5858

5959
@classmethod
60-
def create(cls, bitsize: int, *, random_state: np.random.RandomState):
61-
matrix = RandomGate.create(bitsize, random_state=random_state).matrix
60+
def random(cls, bitsize: int, *, random_state: np.random.RandomState):
61+
"""Generate a random unitary s.t. the first column has all real amplitudes"""
62+
matrix = MatrixGate.random(bitsize, random_state=random_state).matrix
6263
matrix = np.array(matrix)
6364

6465
# make the first column (weights \sqrt{alpha_i}) all reals
6566
column = matrix[:, 0]
6667
matrix = matrix * (column.conj() / np.abs(column))[:, None]
6768

68-
return cls(RandomGate(bitsize, matrix))
69+
return cls(MatrixGate(bitsize, matrix))
6970

7071
def build_composite_bloq(self, bb: BloqBuilder, selection: SoquetT) -> dict[str, SoquetT]:
7172
selection = bb.add(self.U, q=selection)
7273
return {'selection': selection}
7374

74-
def __pow__(self, power):
75-
if power == -1:
76-
return self.U.adjoint()
77-
return NotImplemented
78-
7975
@cached_property
8076
def alphas(self):
8177
return np.array(self.U.matrix)[:, 0] ** 2
8278

8379

8480
@frozen
85-
class PauliSelectOracle(SelectOracle):
81+
class TestPauliSelectOracle(SelectOracle):
8682
r"""Paulis acting on $m$ qubits, controlled by an $n$-qubit register.
8783
8884
Given $2^n$ multi-qubit-Paulis (acting on $m$ qubits) $U_j$,
@@ -113,7 +109,7 @@ class PauliSelectOracle(SelectOracle):
113109
@classmethod
114110
def random(
115111
cls, select_bitsize: int, target_bitsize: int, *, random_state: np.random.RandomState
116-
) -> 'PauliSelectOracle':
112+
) -> 'TestPauliSelectOracle':
117113
dps = tuple(
118114
cirq.DensePauliString(random_state.randint(0, 4, size=target_bitsize))
119115
for _ in range(2**select_bitsize)
@@ -197,8 +193,8 @@ def random_qubitization_walk_operator(
197193
Returns:
198194
WalkOperator for $H$, and the Hamiltonian $H$.
199195
"""
200-
prepare = RandomPrepareOracle.create(select_bitsize, random_state=random_state)
201-
select = PauliSelectOracle.random(select_bitsize, target_bitsize, random_state=random_state)
196+
prepare = TestPrepareOracle.random(select_bitsize, random_state=random_state)
197+
select = TestPauliSelectOracle.random(select_bitsize, target_bitsize, random_state=random_state)
202198

203199
np.testing.assert_allclose(np.linalg.norm(prepare.alphas, 1), 1)
204200

qualtran/bloqs/hamiltonian_simulation/hamiltonian_simulation_by_gqsp_test.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
import scipy
1919
from numpy.typing import NDArray
2020

21-
from qualtran.bloqs.for_testing.random_gate import RandomGate
21+
from qualtran.bloqs.for_testing.matrix_gate import MatrixGate
2222
from qualtran.bloqs.for_testing.random_select_and_prepare import random_qubitization_walk_operator
2323
from qualtran.bloqs.qsp.generalized_qsp_test import (
2424
assert_matrices_almost_equal,
@@ -54,7 +54,7 @@ def test_generalized_qsp_with_exp_cos_approx_on_random_unitaries(
5454
random_state = np.random.RandomState(42)
5555

5656
for _ in range(5):
57-
U = RandomGate.create(bitsize, random_state=random_state)
57+
U = MatrixGate.random(bitsize, random_state=random_state)
5858
gqsp = HamiltonianSimulationByGQSP(_walk_op, t=t, alpha=1, precision=precision).gqsp
5959
P, Q = gqsp.P, gqsp.Q
6060

qualtran/bloqs/qsp/generalized_qsp_test.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@
2525
from qualtran import Bloq, bloq_example, Controlled, CtrlSpec, GateWithRegisters
2626
from qualtran.bloqs.basic_gates.su2_rotation import SU2RotationGate
2727
from qualtran.bloqs.for_testing.atom import TestGWRAtom
28-
from qualtran.bloqs.for_testing.random_gate import RandomGate
28+
from qualtran.bloqs.for_testing.matrix_gate import MatrixGate
2929
from qualtran.bloqs.qubitization_walk_operator_test import get_walk_operator_for_1d_ising_model
3030
from qualtran.resource_counting import SympySymbolAllocator
3131
from qualtran.resource_counting.symbolic_counting_utils import Shaped
@@ -170,7 +170,7 @@ def test_generalized_qsp_with_real_poly_on_random_unitaries(bitsize: int, degree
170170
random_state = np.random.RandomState(42)
171171

172172
for _ in range(10):
173-
U = RandomGate.create(bitsize, random_state=random_state)
173+
U = MatrixGate.random(bitsize, random_state=random_state)
174174
P = random_qsp_polynomial(degree, random_state=random_state, only_real_coeffs=True)
175175
verify_generalized_qsp(U, P)
176176

@@ -185,7 +185,7 @@ def test_generalized_qsp_with_complex_poly_on_random_unitaries(
185185
random_state = np.random.RandomState(42)
186186

187187
for _ in range(10):
188-
U = RandomGate.create(bitsize, random_state=random_state)
188+
U = MatrixGate.random(bitsize, random_state=random_state)
189189
P = random_qsp_polynomial(degree, random_state=random_state)
190190
verify_generalized_qsp(U, P, negative_power=negative_power)
191191

@@ -202,7 +202,7 @@ def catch_rotations(bloq: Bloq) -> Bloq:
202202
return arbitrary_rotation
203203
return bloq
204204

205-
U = RandomGate.create(1, random_state=random_state)
205+
U = MatrixGate.random(1, random_state=random_state)
206206
P = (0.5, 0, 0.5)
207207
gsqp_U = GeneralizedQSP.from_qsp_polynomial(U, P, negative_power=negative_power)
208208

@@ -349,4 +349,4 @@ def test_complementary_polynomials_for_jacobi_anger_approximations(t: float, pre
349349
check_polynomial_pair_on_random_points_on_unit_circle(
350350
P, Q, random_state=random_state, rtol=precision
351351
)
352-
verify_generalized_qsp(RandomGate.create(1, random_state=random_state), P, Q)
352+
verify_generalized_qsp(MatrixGate.random(1, random_state=random_state), P, Q)

qualtran/serialization/resolver_dict.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@
7575
import qualtran.bloqs.for_testing.casting
7676
import qualtran.bloqs.for_testing.interior_alloc
7777
import qualtran.bloqs.for_testing.many_registers
78-
import qualtran.bloqs.for_testing.random_gate
78+
import qualtran.bloqs.for_testing.matrix_gate
7979
import qualtran.bloqs.for_testing.with_call_graph
8080
import qualtran.bloqs.for_testing.with_decomposition
8181
import qualtran.bloqs.hubbard_model
@@ -263,7 +263,7 @@
263263
"qualtran.bloqs.for_testing.many_registers.TestMultiRegister": qualtran.bloqs.for_testing.many_registers.TestMultiRegister,
264264
"qualtran.bloqs.for_testing.many_registers.TestMultiTypedRegister": qualtran.bloqs.for_testing.many_registers.TestMultiTypedRegister,
265265
"qualtran.bloqs.for_testing.many_registers.TestQFxp": qualtran.bloqs.for_testing.many_registers.TestQFxp,
266-
"qualtran.bloqs.for_testing.random_gate.RandomGate": qualtran.bloqs.for_testing.random_gate.RandomGate,
266+
"qualtran.bloqs.for_testing.matrix_gate.MatrixGate": qualtran.bloqs.for_testing.matrix_gate.MatrixGate,
267267
"qualtran.bloqs.for_testing.with_call_graph.TestBloqWithCallGraph": qualtran.bloqs.for_testing.with_call_graph.TestBloqWithCallGraph,
268268
"qualtran.bloqs.for_testing.with_decomposition.TestIndependentParallelCombo": qualtran.bloqs.for_testing.with_decomposition.TestIndependentParallelCombo,
269269
"qualtran.bloqs.for_testing.with_decomposition.TestParallelCombo": qualtran.bloqs.for_testing.with_decomposition.TestParallelCombo,

0 commit comments

Comments
 (0)