Composer plusieurs circuits quantiques dans un seul programme quantique dans QISKit


9

Je me demandais s'il y avait un moyen de composer un programme avec plusieurs circuits quantiques sans avoir réinitialisé le registre à pour chaque circuit.0

Plus précisément, je voudrais exécuter un deuxième circuit quantique après avoir exécuté le premier, comme dans cet exemple:

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'))

Malheureusement, ce que j'obtiens est le même résultat pour les deux exécutions (c'est-à-dire un décompte de 11pour B1et B2au lieu de 11et 00pour la seconde, comme s'il B2était exécuté sur un état complètement nouveau initialisé 00après B1.


1
Alors, pourrais-je le comprendre comme vous voulant un long circuit composé de plusieurs parties, et vous voulez pouvoir voir la sortie après chaque partie?
James Wootton

Oui. Imaginez que j'ai une base de code qui me donne des circuits, et je veux pouvoir les composer comme un puzzle :)
asdf

(la mesure est là juste pour vous montrer que ce n'est pas le comportement attendu)
asdf

Réponses:


2

Dans Qiskit, vous pouvez composer deux circuits pour créer un circuit plus grand. Vous pouvez le faire simplement en utilisant l' +opérateur sur les circuits.

Voici votre programme réécrit pour illustrer cela (note: vous avez besoin de la dernière version de Qiskit pour cela, mettez à niveau avec 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

Vous pouvez voir que qc3 est une concaténation de q1 et q2.

print(qc3.qasm())

Rendements:

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

Maintenant, vous semblez vouloir sonder l'état deux fois: une fois où se termine qc1, et une fois lorsque se termine qc2. Vous pouvez le faire dans un simulateur en insérant des snapshotcommandes. Cela sauvera le vecteur d'état à un point donné du circuit. Il n'effondre pas l'État.

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

Vous pouvez maintenant exécuter qc3sur un simulateur.

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

Rendements: [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}

L'état revient donc à | 00> comme prévu.


0

Une fois que vous effectuez une mesure, la fonction d'onde de l'état / registre quantique s'effondre et perd sa nature quantique. Cela n'a pas de sens d'appliquer un autre circuit dessus.


Bien sûr, mais si je supprime la mesure, je m'attendrais à obtenir 00, tandis que j'obtiens 1. La mesure consiste simplement à montrer que je veux démarrer le deuxième circuit avec les qubits initialisés à 11.
asdf

En effet, je veux que ma fonction d'onde s'effondre à l'état quantique et non 00 si vous voulez qu'elle soit mise de cette façon ...
asdf

2
@Vidya Je comprends qu'il s'effondre mais je ne suis pas d'accord qu'il ne serait pas logique d'appliquer un autre circuit sur la sortie effondrée d'un circuit précédent.
JanVdA
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.