Складання декількох квантових схем в одній квантовій програмі в QISKit


9

Мені було цікаво, чи є спосіб скласти програму з декількома квантовими схемами, не реєтинізуючи реєстр при для кожної схеми.0

Зокрема, я хотів би запустити другий квантовий контур після запуску першого, як у цьому прикладі:

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

На жаль, те, що я отримую, є однаковим результатом для двох прогонів (тобто рахунку 11для B1і B2замість, 11і 00для другого, як ніби B2виконується у абсолютно новому стані, ініціалізованому 00після B1.


1
Тож чи можу я зрозуміти це, як ви хочете одну довгу схему, що складається з декількох частин, і ви хочете мати можливість бачити вихід після кожної частини?
Джеймс Вуттон

так. Уявіть, у мене є база коду, яка дає мені схеми, і я хочу вміти їх складати як головоломку :)
asdf

(міра існує лише для того, щоб показати вам, що це не очікувана поведінка)
asdf

Відповіді:


2

У Qiskit ви можете скласти два схеми, щоб зробити більшу схему. Зробити це можна просто за допомогою +оператора на схемах.

Ось ваша програма переписана, щоб проілюструвати це (зверніть увагу: вам потрібна остання версія Qiskit для цього, оновлення до 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

Ви можете бачити, що qc3 - це конкатенація q1 і q2.

print(qc3.qasm())

Врожайність:

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

Тепер, здається, ви хочете перевірити стан двічі: один раз, коли закінчується qc1, і один раз, коли закінчується qc2. Це можна зробити в тренажері, вставивши snapshotкоманди. Це збереже вектор стану в заданій точці ланцюга. Це не розвалює державу.

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

Тепер ви можете виконати qc3на тренажері.

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

Виходи: [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}

Тож стан повертається до | 00> як очікувалося.


0

Після того, як ви зробите вимірювання, хвильова функція квантового стану / регістру руйнується і вона втрачає свою квантову природу. Немає сенсу застосовувати до нього іншу схему.


Впевнений, але якщо я зніму міру, я б розраховував отримати 00, тоді як я отримаю 1. Захід полягає лише в тому, щоб показати, що я хочу запустити другий контур з кубітами, ініціалізованими до 11.
asdf

Дійсно, я хочу, щоб моя хвильова функція руйнувалася в квантовому стані, а не 00, якщо ви хочете, щоб це було зроблено таким чином ...
asdf

2
@Vidya Я розумію, що вона руйнується, але я не згоден, не було б сенсу застосовувати іншу схему на згорнутому виході попереднього контуру.
JanVdA
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.