Hoạt động tự nhiên của Bristlecone là CZ, không phải CNOT. Tuy nhiên, bạn có thể biến đổi giữa hai với cổng Hadamard vì vậy đây là một sự khác biệt nhỏ.
Bristlecone có thể thực hiện một CZ giữa bất kỳ cặp qubit liền kề nào trên lưới. Bạn có thể xem lưới bằng cách cài đặt cirq và in ra thiết bị Bristlecone:
$ pip install cirq
$ python
>>> import cirq
>>> print(cirq.google.Bristlecone)
(0, 5)────(0, 6)
│ │
│ │
(1, 4)───(1, 5)────(1, 6)────(1, 7)
│ │ │ │
│ │ │ │
(2, 3)───(2, 4)───(2, 5)────(2, 6)────(2, 7)───(2, 8)
│ │ │ │ │ │
│ │ │ │ │ │
(3, 2)───(3, 3)───(3, 4)───(3, 5)────(3, 6)────(3, 7)───(3, 8)───(3, 9)
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
(4, 1)───(4, 2)───(4, 3)───(4, 4)───(4, 5)────(4, 6)────(4, 7)───(4, 8)───(4, 9)───(4, 10)
│ │ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ │ │
(5, 0)───(5, 1)───(5, 2)───(5, 3)───(5, 4)───(5, 5)────(5, 6)────(5, 7)───(5, 8)───(5, 9)───(5, 10)───(5, 11)
│ │ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ │ │
(6, 1)───(6, 2)───(6, 3)───(6, 4)───(6, 5)────(6, 6)────(6, 7)───(6, 8)───(6, 9)───(6, 10)
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
(7, 2)───(7, 3)───(7, 4)───(7, 5)────(7, 6)────(7, 7)───(7, 8)───(7, 9)
│ │ │ │ │ │
│ │ │ │ │ │
(8, 3)───(8, 4)───(8, 5)────(8, 6)────(8, 7)───(8, 8)
│ │ │ │
│ │ │ │
(9, 4)───(9, 5)────(9, 6)────(9, 7)
│ │
│ │
(10, 5)───(10, 6)
Dưới đây là cách bạn có thể nhận được một tập hợp có chứa các hoạt động CZ được phép:
qubits = cirq.google.Bristlecone.qubits
allowed = {cirq.CZ(a, b)
for a in qubits
for b in qubits
if a.is_adjacent(b)}
Bộ này có 121 phần tử trong đó và hơi ngẫu nhiên cho dù bạn có được CZ (x, y) hay CZ (y, x) trong tập hợp, vì vậy tôi sẽ không bao gồm bản in của bộ ở đây.
Một hạn chế bổ sung cần lưu ý là bạn không thể thực hiện hai CZ bên cạnh nhau cùng một lúc. Cirq tính đến điều này khi tạo các mạch nhắm vào Bristlecone. Ví dụ:
import cirq
device = cirq.google.Bristlecone
a, b, c, d, e = device.col(6)[:5]
circuit = cirq.Circuit.from_ops(
cirq.CZ(a, b),
cirq.CZ(c, d),
cirq.CZ(a, b),
cirq.CZ(d, e),
device=device)
print(circuit)
# (0, 6): ───@───────@───
# │ │
# (1, 6): ───@───────@───
#
# (2, 6): ───────@───────
# │
# (3, 6): ───────@───@───
# │
# (4, 6): ───────────@───
Hai hoạt động đầu tiên được đặt so le vì chúng là các CZ liền kề, nhưng hai hoạt động thứ hai không phải vì chúng không hoạt động.