Skip to content

Commit ca98c7e

Browse files
authored
Remove tetris_concat (quantumlib#5659)
Remove deprecated tetris_concat
1 parent 79cd966 commit ca98c7e

File tree

3 files changed

+0
-282
lines changed

3 files changed

+0
-282
lines changed

cirq/circuits/circuit.py

Lines changed: 0 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -1505,64 +1505,6 @@ def concat_ragged(
15051505

15061506
return cirq.Circuit(buffer[offset : offset + n_acc])
15071507

1508-
@_compat.deprecated(deadline='v0.16', fix='Renaming to concat_ragged')
1509-
def tetris_concat(
1510-
*circuits: 'cirq.AbstractCircuit', align: Union['cirq.Alignment', str] = Alignment.LEFT
1511-
) -> 'cirq.AbstractCircuit':
1512-
"""Concatenates circuits while overlapping them if possible.
1513-
1514-
Starts with the first circuit (index 0), then iterates over the other
1515-
circuits while folding them in. To fold two circuits together, they
1516-
are placed one after the other and then moved inward until just before
1517-
their operations would collide. If any of the circuits do not share
1518-
qubits and so would not collide, the starts or ends of the circuits will
1519-
be aligned, acording to the given align parameter.
1520-
1521-
Beware that this method is *not* associative. For example:
1522-
1523-
>>> a, b = cirq.LineQubit.range(2)
1524-
>>> A = cirq.Circuit(cirq.H(a))
1525-
>>> B = cirq.Circuit(cirq.H(b))
1526-
>>> f = cirq.Circuit.tetris_concat
1527-
>>> f(f(A, B), A) == f(A, f(B, A))
1528-
False
1529-
>>> len(f(f(f(A, B), A), B)) == len(f(f(A, f(B, A)), B))
1530-
False
1531-
1532-
Args:
1533-
*circuits: The circuits to concatenate.
1534-
align: When to stop when sliding the circuits together.
1535-
'left': Stop when the starts of the circuits align.
1536-
'right': Stop when the ends of the circuits align.
1537-
'first': Stop the first time either the starts or the ends align. Circuits
1538-
are never overlapped more than needed to align their starts (in case
1539-
the left circuit is smaller) or to align their ends (in case the right
1540-
circuit is smaller)
1541-
1542-
Returns:
1543-
The concatenated and overlapped circuit.
1544-
"""
1545-
if len(circuits) == 0:
1546-
return Circuit()
1547-
n_acc = len(circuits[0])
1548-
1549-
if isinstance(align, str):
1550-
align = Alignment[align.upper()]
1551-
1552-
# Allocate a buffer large enough to append and prepend all the circuits.
1553-
pad_len = sum(len(c) for c in circuits) - n_acc
1554-
buffer = np.zeros(shape=pad_len * 2 + n_acc, dtype=object)
1555-
1556-
# Put the initial circuit in the center of the buffer.
1557-
offset = pad_len
1558-
buffer[offset : offset + n_acc] = circuits[0].moments
1559-
1560-
# Accumulate all the circuits into the buffer.
1561-
for k in range(1, len(circuits)):
1562-
offset, n_acc = _concat_ragged_helper(offset, n_acc, buffer, circuits[k].moments, align)
1563-
1564-
return cirq.Circuit(buffer[offset : offset + n_acc])
1565-
15661508
def get_independent_qubit_sets(self) -> List[Set['cirq.Qid']]:
15671509
"""Divide circuit's qubits into independent qubit sets.
15681510
@@ -1909,14 +1851,6 @@ def concat_ragged(
19091851

19101852
concat_ragged.__doc__ = AbstractCircuit.concat_ragged.__doc__
19111853

1912-
@_compat.deprecated(deadline='v0.16', fix='Renaming to concat_ragged')
1913-
def tetris_concat(
1914-
*circuits: 'cirq.AbstractCircuit', align: Union['cirq.Alignment', str] = Alignment.LEFT
1915-
) -> 'cirq.Circuit':
1916-
return AbstractCircuit.tetris_concat(*circuits, align=align).unfreeze(copy=False)
1917-
1918-
tetris_concat.__doc__ = AbstractCircuit.tetris_concat.__doc__
1919-
19201854
def zip(
19211855
*circuits: 'cirq.AbstractCircuit', align: Union['cirq.Alignment', str] = Alignment.LEFT
19221856
) -> 'cirq.Circuit':

cirq/circuits/circuit_test.py

Lines changed: 0 additions & 207 deletions
Original file line numberDiff line numberDiff line change
@@ -4261,213 +4261,6 @@ def _circuit_diagram_info_(self, args):
42614261
assert '|c>' in circuit._repr_html_()
42624262

42634263

4264-
def test_tetris_concat_deprecated():
4265-
a, b = cirq.LineQubit.range(2)
4266-
empty = cirq.Circuit()
4267-
4268-
with cirq.testing.assert_deprecated('ragged', deadline='v0.16', count=None):
4269-
assert cirq.Circuit.tetris_concat(empty, empty) == empty
4270-
assert cirq.Circuit.tetris_concat() == empty
4271-
assert empty.tetris_concat(empty) == empty
4272-
assert empty.tetris_concat(empty, empty) == empty
4273-
4274-
ha = cirq.Circuit(cirq.H(a))
4275-
hb = cirq.Circuit(cirq.H(b))
4276-
assert ha.tetris_concat(hb) == ha.zip(hb)
4277-
4278-
assert ha.tetris_concat(empty) == ha
4279-
assert empty.tetris_concat(ha) == ha
4280-
4281-
hac = cirq.Circuit(cirq.H(a), cirq.CNOT(a, b))
4282-
assert hac.tetris_concat(hb) == hac + hb
4283-
assert hb.tetris_concat(hac) == hb.zip(hac)
4284-
4285-
zig = cirq.Circuit(cirq.H(a), cirq.CNOT(a, b), cirq.H(b))
4286-
assert zig.tetris_concat(zig) == cirq.Circuit(
4287-
cirq.H(a),
4288-
cirq.CNOT(a, b),
4289-
cirq.Moment(cirq.H(a), cirq.H(b)),
4290-
cirq.CNOT(a, b),
4291-
cirq.H(b),
4292-
)
4293-
4294-
zag = cirq.Circuit(cirq.H(a), cirq.H(a), cirq.CNOT(a, b), cirq.H(b), cirq.H(b))
4295-
assert zag.tetris_concat(zag) == cirq.Circuit(
4296-
cirq.H(a),
4297-
cirq.H(a),
4298-
cirq.CNOT(a, b),
4299-
cirq.Moment(cirq.H(a), cirq.H(b)),
4300-
cirq.Moment(cirq.H(a), cirq.H(b)),
4301-
cirq.CNOT(a, b),
4302-
cirq.H(b),
4303-
cirq.H(b),
4304-
)
4305-
4306-
space = cirq.Circuit(cirq.Moment()) * 10
4307-
f = cirq.Circuit.tetris_concat
4308-
assert len(f(space, ha)) == 10
4309-
assert len(f(space, ha, ha, ha)) == 10
4310-
assert len(f(space, f(ha, ha, ha))) == 10
4311-
assert len(f(space, ha, align='LEFT')) == 10
4312-
assert len(f(space, ha, ha, ha, align='RIGHT')) == 12
4313-
assert len(f(space, f(ha, ha, ha, align='LEFT'))) == 10
4314-
assert len(f(space, f(ha, ha, ha, align='RIGHT'))) == 10
4315-
assert len(f(space, f(ha, ha, ha), align='LEFT')) == 10
4316-
assert len(f(space, f(ha, ha, ha), align='RIGHT')) == 10
4317-
4318-
# L shape overlap (vary c1).
4319-
assert 7 == len(
4320-
f(
4321-
cirq.Circuit(cirq.CZ(a, b), [cirq.H(a)] * 5),
4322-
cirq.Circuit([cirq.H(b)] * 5, cirq.CZ(a, b)),
4323-
)
4324-
)
4325-
assert 7 == len(
4326-
f(
4327-
cirq.Circuit(cirq.CZ(a, b), [cirq.H(a)] * 4),
4328-
cirq.Circuit([cirq.H(b)] * 5, cirq.CZ(a, b)),
4329-
)
4330-
)
4331-
assert 7 == len(
4332-
f(
4333-
cirq.Circuit(cirq.CZ(a, b), [cirq.H(a)] * 1),
4334-
cirq.Circuit([cirq.H(b)] * 5, cirq.CZ(a, b)),
4335-
)
4336-
)
4337-
assert 8 == len(
4338-
f(
4339-
cirq.Circuit(cirq.CZ(a, b), [cirq.H(a)] * 6),
4340-
cirq.Circuit([cirq.H(b)] * 5, cirq.CZ(a, b)),
4341-
)
4342-
)
4343-
assert 9 == len(
4344-
f(
4345-
cirq.Circuit(cirq.CZ(a, b), [cirq.H(a)] * 7),
4346-
cirq.Circuit([cirq.H(b)] * 5, cirq.CZ(a, b)),
4347-
)
4348-
)
4349-
4350-
# L shape overlap (vary c2).
4351-
assert 7 == len(
4352-
f(
4353-
cirq.Circuit(cirq.CZ(a, b), [cirq.H(a)] * 5),
4354-
cirq.Circuit([cirq.H(b)] * 5, cirq.CZ(a, b)),
4355-
)
4356-
)
4357-
assert 7 == len(
4358-
f(
4359-
cirq.Circuit(cirq.CZ(a, b), [cirq.H(a)] * 5),
4360-
cirq.Circuit([cirq.H(b)] * 4, cirq.CZ(a, b)),
4361-
)
4362-
)
4363-
assert 7 == len(
4364-
f(
4365-
cirq.Circuit(cirq.CZ(a, b), [cirq.H(a)] * 5),
4366-
cirq.Circuit([cirq.H(b)] * 1, cirq.CZ(a, b)),
4367-
)
4368-
)
4369-
assert 8 == len(
4370-
f(
4371-
cirq.Circuit(cirq.CZ(a, b), [cirq.H(a)] * 5),
4372-
cirq.Circuit([cirq.H(b)] * 6, cirq.CZ(a, b)),
4373-
)
4374-
)
4375-
assert 9 == len(
4376-
f(
4377-
cirq.Circuit(cirq.CZ(a, b), [cirq.H(a)] * 5),
4378-
cirq.Circuit([cirq.H(b)] * 7, cirq.CZ(a, b)),
4379-
)
4380-
)
4381-
4382-
# When scanning sees a possible hit, continues scanning for earlier hit.
4383-
assert 10 == len(
4384-
f(
4385-
cirq.Circuit(
4386-
cirq.Moment(),
4387-
cirq.Moment(),
4388-
cirq.Moment(),
4389-
cirq.Moment(),
4390-
cirq.Moment(),
4391-
cirq.Moment(cirq.H(a)),
4392-
cirq.Moment(),
4393-
cirq.Moment(),
4394-
cirq.Moment(cirq.H(b)),
4395-
),
4396-
cirq.Circuit(
4397-
cirq.Moment(),
4398-
cirq.Moment(),
4399-
cirq.Moment(),
4400-
cirq.Moment(cirq.H(a)),
4401-
cirq.Moment(),
4402-
cirq.Moment(cirq.H(b)),
4403-
),
4404-
)
4405-
)
4406-
# Correct tie breaker when one operation sees two possible hits.
4407-
for cz_order in [cirq.CZ(a, b), cirq.CZ(b, a)]:
4408-
assert 3 == len(
4409-
f(
4410-
cirq.Circuit(cirq.Moment(cz_order), cirq.Moment(), cirq.Moment()),
4411-
cirq.Circuit(cirq.Moment(cirq.H(a)), cirq.Moment(cirq.H(b))),
4412-
)
4413-
)
4414-
4415-
# Types.
4416-
v = ha.freeze().tetris_concat(empty)
4417-
assert type(v) is cirq.FrozenCircuit and v == ha.freeze()
4418-
v = ha.tetris_concat(empty.freeze())
4419-
assert type(v) is cirq.Circuit and v == ha
4420-
v = ha.freeze().tetris_concat(empty)
4421-
assert type(v) is cirq.FrozenCircuit and v == ha.freeze()
4422-
v = cirq.Circuit.tetris_concat(ha, empty)
4423-
assert type(v) is cirq.Circuit and v == ha
4424-
v = cirq.FrozenCircuit.tetris_concat(ha, empty)
4425-
assert type(v) is cirq.FrozenCircuit and v == ha.freeze()
4426-
4427-
4428-
def test_tetris_concat_alignment_deprecated():
4429-
a, b = cirq.LineQubit.range(2)
4430-
4431-
with cirq.testing.assert_deprecated('ragged', deadline='v0.16', count=None):
4432-
4433-
assert cirq.Circuit.tetris_concat(
4434-
cirq.Circuit(cirq.X(a)),
4435-
cirq.Circuit(cirq.Y(b)) * 4,
4436-
cirq.Circuit(cirq.Z(a)),
4437-
align='first',
4438-
) == cirq.Circuit(
4439-
cirq.Moment(cirq.X(a), cirq.Y(b)),
4440-
cirq.Moment(cirq.Y(b)),
4441-
cirq.Moment(cirq.Y(b)),
4442-
cirq.Moment(cirq.Z(a), cirq.Y(b)),
4443-
)
4444-
4445-
assert cirq.Circuit.tetris_concat(
4446-
cirq.Circuit(cirq.X(a)),
4447-
cirq.Circuit(cirq.Y(b)) * 4,
4448-
cirq.Circuit(cirq.Z(a)),
4449-
align='left',
4450-
) == cirq.Circuit(
4451-
cirq.Moment(cirq.X(a), cirq.Y(b)),
4452-
cirq.Moment(cirq.Z(a), cirq.Y(b)),
4453-
cirq.Moment(cirq.Y(b)),
4454-
cirq.Moment(cirq.Y(b)),
4455-
)
4456-
4457-
assert cirq.Circuit.tetris_concat(
4458-
cirq.Circuit(cirq.X(a)),
4459-
cirq.Circuit(cirq.Y(b)) * 4,
4460-
cirq.Circuit(cirq.Z(a)),
4461-
align='right',
4462-
) == cirq.Circuit(
4463-
cirq.Moment(cirq.Y(b)),
4464-
cirq.Moment(cirq.Y(b)),
4465-
cirq.Moment(cirq.Y(b)),
4466-
cirq.Moment(cirq.X(a), cirq.Y(b)),
4467-
cirq.Moment(cirq.Z(a)),
4468-
)
4469-
4470-
44714264
def test_concat_ragged():
44724265
a, b = cirq.LineQubit.range(2)
44734266
empty = cirq.Circuit()

cirq/circuits/frozen_circuit.py

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@
2020
from cirq.circuits import AbstractCircuit, Alignment, Circuit
2121
from cirq.circuits.insert_strategy import InsertStrategy
2222
from cirq.type_workarounds import NotImplementedType
23-
from cirq import ops, protocols, _compat
2423

2524
if TYPE_CHECKING:
2625
import cirq
@@ -172,14 +171,6 @@ def concat_ragged(
172171

173172
concat_ragged.__doc__ = AbstractCircuit.concat_ragged.__doc__
174173

175-
@_compat.deprecated(deadline='v0.16', fix='Renaming to concat_ragged')
176-
def tetris_concat(
177-
*circuits: 'cirq.AbstractCircuit', align: Union['cirq.Alignment', str] = Alignment.LEFT
178-
) -> 'cirq.FrozenCircuit':
179-
return AbstractCircuit.tetris_concat(*circuits, align=align).freeze()
180-
181-
tetris_concat.__doc__ = AbstractCircuit.tetris_concat.__doc__
182-
183174
def zip(
184175
*circuits: 'cirq.AbstractCircuit', align: Union['cirq.Alignment', str] = Alignment.LEFT
185176
) -> 'cirq.FrozenCircuit':

0 commit comments

Comments
 (0)