Lista de tipos de resultados - Amazon Braket

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.

Lista de tipos de resultados

Amazon Braket puede devolver diferentes tipos de resultados cuando se mide un circuito utilizando. ResultType 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. Está disponible en SV1 y solo en 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. El objetivo qubits utilizado para medir lo observable debe especificarse, y el número de objetivos especificados debe ser igual al número de qubits sobre el que actúa el observable. Si no se especifica ningún objetivo, 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 las probabilidades marginales de los vectores base sobre los especificados qubits se devuelven. Los simuladores gestionados QPUs están limitados a un máximo de 15 qubits y los simuladores locales están limitados al tamaño de la memoria del sistema.

  • Reduced density matrixdevuelve una matriz de densidad para un subsistema del objetivo especificado qubits de un sistema 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 objetivo específico qubit establecido y observable. Si no se especifica ningún objetivo, 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 de qubits sobre el que actúa el observable.

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

Los tipos de resultados admitidos para los diferentes dispositivos:

Sim local

SV1

DM1

TN1

Rigetti

IonQ

IQM

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

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/Ankaa-3") # print the result types supported by this device for iter in device.properties.action['braket.ir.openqasm.program'].supportedResultTypes: print(iter)
name='Sample' observables=['x', 'y', 'z', 'h', 'i'] minShots=10 maxShots=50000 name='Expectation' observables=['x', 'y', 'z', 'h', 'i'] minShots=10 maxShots=50000 name='Variance' observables=['x', 'y', 'z', 'h', 'i'] minShots=10 maxShots=50000 name='Probability' observables=None minShots=10 maxShots=50000

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 medidas (por ejemplo Rigetti) como resultados y otros proporcionan probabilidades como resultados (por ejemplo IonQ). 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, dispositivos como los proporcionados por IonQ tienen los resultados de medición determinados por la probabilidad, ya que no se devuelven las 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

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

Puede aplicar como máximo un único observable sin identidad a cada uno qubit. Si se especifican dos o más observables distintos que no son de identidad para el mismo qubit, ve un error. Para ello, cada factor de un producto tensorial cuenta como un observable individual, por lo que se permite que varios productos tensoriales actúen sobre el mismo qubit, siempre que el factor que actúa sobre él qubit es el mismo.

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 utilizando 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