Comporre più circuiti quantistici in un singolo programma quantistico in QISKit


9

Mi chiedevo se esiste un modo per comporre un programma con più circuiti quantistici senza reinizializzare il registro a per ciascun circuito.0

In particolare, vorrei eseguire un secondo circuito quantico dopo aver eseguito il primo, come in questo esempio:

qp = QuantumProgram()
qr = qp.create_quantum_register('qr',2)
cr = qp.create_classical_register('cr',2)

qc1 = qp.create_circuit('B1',[qr],[cr])
qc1.x(qr)

qc1.measure(qr[0], cr[0])
qc1.measure(qr[1], cr[1])

qc2 = qp.create_circuit('B2', [qr], [cr])
qc2.x(qr)
qc2.measure(qr[0], cr[0])
qc2.measure(qr[1], cr[1])

#qp.add_circuit('B1', qc1)
#qp.add_circuit('B2', qc2)

pprint(qp.get_qasms())

result = qp.execute()

print(result.get_counts('B1'))
print(result.get_counts('B2'))

Sfortunatamente, quello che ottengo è lo stesso risultato per le due esecuzioni (ovvero il conteggio di 11per B1e B2invece di 11e 00per il secondo, come se B2fosse eseguito su uno stato completamente nuovo inizializzato su 00dopo B1.


1
Quindi potrei capirlo come si desidera un circuito lungo composto da più parti e si desidera poter vedere l'output dopo ogni parte?
James Wootton,

sì. Immagina di avere una base di codice che mi dà circuiti e che voglio essere in grado di comporli come un puzzle :)
asdf

(la misura è lì solo per mostrarti che non è il comportamento previsto)
asdf

Risposte:


2

In Qiskit è possibile comporre due circuiti per creare un circuito più grande. Puoi farlo semplicemente usando l' +operatore sui circuiti.

Ecco il tuo programma riscritto per illustrare questo (nota: per questo ti serve l'ultima versione di Qiskit, aggiorna con pip install -U qiskit).

from qiskit import *
qr = QuantumRegister(2)
cr = ClassicalRegister(2)
qc1 = QuantumCircuit(qr, cr)
qc1.x(qr)

qc2 = QuantumCircuit(qr, cr)
qc2.x(qr)

qc3 = qc1 + qc2

Puoi vedere che qc3 è una concatenazione di q1 e q2.

print(qc3.qasm())

I rendimenti:

OPENQASM 2.0;
include "qelib1.inc";
qreg q0[2];
creg c0[2];
x q0[0];
x q0[1];
x q0[0];
x q0[1];

Ora, sembra che tu voglia sondare lo stato due volte: una volta dove finisce qc1 e una volta quando finisce qc2. Puoi farlo in un simulatore inserendo i snapshotcomandi. Ciò salverà il vettore di stato in un determinato punto del circuito. Non crolla lo stato.

from qiskit.extensions.simulator import *
qc1.snapshot('0')    # save the snapshot in slot "0"
qc2.snapshot('1')    # save the snapshot in slot "1"
qc2.measure(qr, cr)  # measure to get final counts

qc3 = qc1 + qc2

Ora puoi eseguire qc3su un simulatore.

job = execute(qc3, 'local_qasm_simulator')
result = job.result()
print(result.get_snapshot('0'))
print(result.get_snapshot('1'))
print(result.get_counts())

Rendimento: [0. + 0.j 0. + 0.j 0. + 0.j 1. + 0.j] [1. + 0.j 0. + 0.j 0. + 0.j 0. + 0.j] {'00': 1024}

Quindi lo stato ritorna a | 00> come previsto.


0

Una volta effettuata una misurazione, la funzione d'onda dello stato / registro quantico collassa e perde la sua natura quantistica. Non ha senso applicare un altro circuito su di esso.


Certo, ma se rimuovo la misura, mi aspetto di ottenere 00, mentre ottengo 1. La misura serve solo a mostrare che voglio iniziare il secondo circuito con i qubit inizializzati su 11.
asdf

In effetti voglio che la mia funzione d'onda collassi nello stato quantico e non 00 se vuoi che sia messa in quel modo ...
asdf

2
@Vidya Capisco che collassa ma non sono d'accordo che non avrebbe senso applicare un altro circuito sull'uscita collassata di un circuito precedente.
JanVdA,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.