Tipos de resultados - Amazon Braket

¡Aprenda los fundamentos de la computación cuántica con! AWS Inscríbase en el plan de aprendizaje digital Amazon Braket y obtenga su propia insignia digital tras completar una serie de cursos de aprendizaje y una evaluación digital.

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

Tipos de resultados

AmazonBraket puede devolver diferentes tipos de resultados cuando se mide un circuito utilizandoResultType. Un circuito puede devolver los siguientes tipos de resultados.

  • AdjointGradientdevuelve el gradiente (derivado vectorial) del valor esperado de un observable proporcionado. Este observable actúa sobre un objetivo determinado con respecto a parámetros específicos utilizando el método de diferenciación adjunta. Solo puedes usar este método cuando los disparos son iguales a 0.

  • Amplitudedevuelve la amplitud de los estados cuánticos especificados en la función de onda de salida. Solo está disponible en los simuladores SV1 y en los simuladores locales.

  • Expectationdevuelve el valor esperado de un observable dado, que se puede especificar con la Observable clase que se presenta más adelante en este capítulo. Se debe especificar el objetivo qubits utilizado para medir lo observable y el número de objetivos especificados debe ser igual al número qubits sobre el que actúa el observable. Si no se especifican objetivos, el observable debe operar solo en 1 qubit y se aplica a todos qubits en paralelo.

  • Probabilitydevuelve las probabilidades de medir estados básicos computacionales. Si no se especifica ningún objetivo, Probability devuelve la probabilidad de medir todos los estados básicos. Si se especifican los objetivos, solo se devuelven las probabilidades marginales de los vectores base de qubits los especificados.

  • Reduced density matrixdevuelve una matriz de densidad para un subsistema del objetivo especificado de un sistema qubits de. qubits Para limitar el tamaño de este tipo de resultado, Braket limita el número de objetivos qubits a un máximo de 8.

  • StateVectordevuelve el vector de estado completo. Está disponible en el simulador local.

  • Sampledevuelve los recuentos de mediciones de un qubit conjunto objetivo específico y observable. Si no se especifican objetivos, el observable debe operar solo en 1 qubit y se aplica a todos qubits en paralelo. Si se especifican objetivos, el número de objetivos especificados debe ser igual al número qubits sobre el que actúa el observable.

  • Variancedevuelve la varianza (mean([x-mean(x)]2)) del qubit conjunto de objetivos especificado y observable como el tipo de resultado solicitado. Si no se especifican objetivos, el observable debe operar solo en 1 qubit y se aplica a todos qubits en paralelo. De lo contrario, el número de objetivos especificados debe ser igual al número de objetivos qubits a los que se puede aplicar el observable.

Los tipos de resultados admitidos para los distintos dispositivos son los siguientes:

SIM local

SV1

DM1

TN1

Rigetti

IonQ

OQC

Gradiente adjunto

N

Y

N

N

N

N

N

Amplitude

Y

Y

N

N

N

N

N

Expectativa

Y

Y

Y

Y

Y

Y

Y

Probability

Y

Y

Y

N

Y*

Y

Y

Matriz de densidad reducida

Y

N

Y

N

N

N

N

Vector de estado

Y

N

N

N

N

N

N

Muestra

Y

Y

Y

Y

Y

Y

Y

Varianza

Y

Y

Y

Y

Y

Y

Y

nota

* Rigetti solo admite tipos de resultados probabilísticos de hasta 40qubits.

Puede comprobar los tipos de resultados admitidos examinando las propiedades del dispositivo, como se muestra en el siguiente ejemplo.

device = AwsDevice("arn:aws:braket:us-west-1::device/qpu/rigetti/Aspen-M-3") # print the result types supported by this device for iter in device.properties.action['braket.ir.jaqcd.program'].supportedResultTypes: print(iter)
name='Sample' observables=['x', 'y', 'z', 'h', 'i'] minShots=10 maxShots=100000 name='Expectation' observables=['x', 'y', 'z', 'h', 'i'] minShots=10 maxShots=100000 name='Variance' observables=['x', 'y', 'z', 'h', 'i'] minShots=10 maxShots=100000 name='Probability' observables=None minShots=10 maxShots=100000

Para llamar aResultType, añádalo a un circuito, como se muestra en el siguiente ejemplo.

from braket.circuits import Observable circ = Circuit().h(0).cnot(0, 1).amplitude(state=["01", "10"]) circ.probability(target=[0, 1]) circ.probability(target=0) circ.expectation(observable=Observable.Z(), target=0) circ.sample(observable=Observable.X(), target=0) circ.state_vector() circ.variance(observable=Observable.Z(), target=0) # print one of the result types assigned to the circuit print(circ.result_types[0])
nota

Algunos dispositivos proporcionan mediciones (por ejemploRigetti) como resultados y otros proporcionan probabilidades como resultados (por ejemplo, IonQ yOQC). El SDK proporciona una propiedad de medición en los resultados, pero en el caso de los dispositivos que devuelven probabilidades, se calcula posteriormente. Por lo tanto, los dispositivos como los que proporciona IonQ y OQC cuyos resultados de medición están determinados por la probabilidad, ya que no se obtienen mediciones por disparo. Puede comprobar si un resultado se ha poscalculado consultando measurements_copied_from_device el objeto resultante, tal y como se muestra en este archivo.

Observables

AmazonBraket incluye una Observable clase que se puede utilizar para especificar un observable que se va a medir.

Puede aplicar como máximo un observable no identitario único a cada uno. qubit Si especificas dos o más observables distintos que no son de identidad en un mismo objetoqubit, aparecerá un error. Para ello, cada factor de un producto tensorial cuenta como un observable individual, por lo que está permitido tener varios productos tensoriales actuando sobre el mismoqubit, siempre que el factor que actúa sobre ellos sea el mismo. qubit

También puede escalar un observable y añadir observables (escalados o no). Esto crea una Sum que se puede utilizar en el AdjointGradient tipo de resultado.

La Observable clase incluye los siguientes observables.

Observable.I() Observable.H() Observable.X() Observable.Y() Observable.Z() # get the eigenvalues of the observable print("Eigenvalue:", Observable.H().eigenvalues) # or whether to rotate the basis to be computational basis print("Basis rotation gates:",Observable.H().basis_rotation_gates) # get the tensor product of observable for the multi-qubit case tensor_product = Observable.Y() @ Observable.Z() # view the matrix form of an observable by using print("The matrix form of the observable:\n",Observable.Z().to_matrix()) print("The matrix form of the tensor product:\n",tensor_product.to_matrix()) # also factorize an observable in the tensor form print("Factorize an observable:",tensor_product.factors) # self-define observables given it is a Hermitian print("Self-defined Hermitian:",Observable.Hermitian(matrix=np.array([[0, 1],[1, 0]]))) print("Sum of other (scaled) observables:", 2.0 * Observable.X() @ Observable.X() + 4.0 * Observable.Z() @ Observable.Z())
Eigenvalue: [ 1 -1] Basis rotation gates: (Ry('angle': -0.7853981633974483, 'qubit_count': 1),) The matrix form of the observable: [[ 1.+0.j 0.+0.j] [ 0.+0.j -1.+0.j]] The matrix form of the tensor product: [[ 0.+0.j 0.+0.j 0.-1.j 0.-0.j] [ 0.+0.j -0.+0.j 0.-0.j 0.+1.j] [ 0.+1.j 0.+0.j 0.+0.j 0.+0.j] [ 0.+0.j -0.-1.j 0.+0.j -0.+0.j]] Factorize an observable: (Y('qubit_count': 1), Z('qubit_count': 1)) Self-defined Hermitian: Hermitian('qubit_count': 1, 'matrix': [[0.+0.j 1.+0.j], [1.+0.j 0.+0.j]]) Sum of other (scaled) observables: Sum(TensorProduct(X('qubit_count': 1), X('qubit_count': 1)), TensorProduct(Z('qubit_count': 1), Z('qubit_count': 1)))

Parámetros

Los circuitos pueden incluir parámetros libres, que se pueden utilizar para «construir una vez y ejecutar varias veces» y para calcular gradientes. Los parámetros libres tienen un nombre codificado en cadena que se puede utilizar para especificar sus valores o para determinar si hay que diferenciarlos con respecto a ellos.

from braket.circuits import Circuit, FreeParameter, Observable theta = FreeParameter("theta") phi = FreeParameter("phi") circ = Circuit().h(0).rx(0, phi).ry(0, phi).cnot(0, 1).xx(0, 1, theta) circ.adjoint_gradient(observable=Observable.Z() @ Observable.Z(), target=[0, 1], parameters = ["phi", theta]

Para los parámetros que desee diferenciar, especifíquelos utilizando su nombre (en forma de cadena) o mediante referencia directa. Tenga en cuenta que el cálculo del gradiente mediante el tipo de AdjointGradient resultado se realiza con respecto al valor esperado del observable.

Nota: Si ha fijado los valores de los parámetros libres pasándolos como argumentos al circuito parametrizado, al ejecutar un circuito con AdjointGradient el tipo de resultado y los parámetros especificados se producirá un error. Esto se debe a que los parámetros que utilizamos para diferenciar ya no están presentes. Consulte el siguiente ejemplo.

device.run(circ(0.2), shots=0) # will error, as no free parameters will be present device.run(circ, shots=0, inputs={'phi'=0.2, 'theta'=0.2) # will succeed