Composición de múltiples circuitos cuánticos en un solo programa cuántico en QISKit

9

Me preguntaba si hay una manera de componer un programa con múltiples circuitos cuánticos sin tener el registro reinicializado en para cada circuito.0 0

Específicamente, me gustaría ejecutar un segundo circuito cuántico después de ejecutar el primero, como en este ejemplo:

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

Desafortunadamente, lo que obtengo es el mismo resultado para las dos ejecuciones (es decir, un recuento de 11para B1y en B2lugar de 11y 00para la segunda, como si B2se ejecutara en un estado completamente nuevo inicializado 00después) B1.

asdf
fuente
1
Entonces, ¿podría entenderlo como si quisieras un circuito largo compuesto de varias partes, y quieres poder ver la salida después de cada parte?
James Wootton
si. Imagine que tengo una base de código que me da circuitos, y quiero poder componerlos como un rompecabezas :)
asdf
(la medida está ahí solo para mostrar que ese no es el comportamiento esperado)
asdf

Respuestas:

2

En Qiskit puedes componer dos circuitos para hacer un circuito más grande. Puede hacer esto simplemente usando el +operador en los circuitos.

Aquí está su programa reescrito para ilustrar esto (nota: necesita la última versión de Qiskit para esto, actualice 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

Puede ver que qc3 es una concatenación de q1 y q2.

print(qc3.qasm())

Rendimientos:

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

Ahora, parece que desea sondear el estado dos veces: una donde termina qc1 y otra cuando termina qc2. Puede hacer esto en un simulador insertando snapshotcomandos. Esto guardará el vector de estado en un punto dado del circuito. No colapsa el estado.

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

Ahora puede ejecutar qc3en un simulador.

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

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

Entonces el estado vuelve a | 00> como se esperaba.

Ali Javadi
fuente
0

Una vez que realiza una medición, la función de onda del estado / registro cuántico colapsa y pierde su naturaleza cuántica. No tiene sentido aplicar otro circuito en él.

Vidya Sagar V
fuente
Claro seguro, pero si elimino la medida, esperaría obtener 00, mientras obtengo 1. La medida es solo para mostrar que quiero comenzar el segundo circuito con los qubits inicializados a 11.
asdf
De hecho quiero que mi función de onda colapse en el estado cuántico y no 00 si lo quieres poner de esa manera ...
asdf
2
@Vidya Entiendo que se colapsa, pero no estoy de acuerdo en que no tendría sentido aplicar otro circuito en la salida colapsada de un circuito anterior.
JanVdA