L'operazione nativa di Bristlecone è la CZ, non i CNOT. Tuttavia, puoi trasformarti tra i due con le porte Hadamard, quindi questa è una sorta di banale differenza.
Bristlecone può eseguire una CZ tra qualsiasi coppia adiacente di qubit su una griglia. Puoi vedere la griglia installando cirq e stampando il dispositivo 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)
Ecco come è possibile ottenere un set contenente le operazioni CZ consentite:
qubits = cirq.google.Bristlecone.qubits
allowed = {cirq.CZ(a, b)
for a in qubits
for b in qubits
if a.is_adjacent(b)}
Il set contiene 121 elementi ed è in qualche modo casuale se si ottengono CZ (x, y) o CZ (y, x) nel set, quindi non includerò una stampa del set qui.
Un ulteriore vincolo da tenere a mente è che non è possibile eseguire contemporaneamente due CZ uno accanto all'altro. Cirq tiene conto di ciò nella creazione di circuiti destinati a Bristlecone. Per esempio:
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): ───────────@───
Le prime due operazioni sono state scaglionate perché sono CZ adiacenti, ma le seconde non lo erano perché non lo sono.