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.