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.
-
AdjointGradient
devuelve 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. -
Amplitude
devuelve 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. -
Expectation
devuelve el valor esperado de un observable dado, que se puede especificar con laObservable
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. -
Probability
devuelve 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 matrix
devuelve 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. -
StateVector
devuelve el vector de estado completo. Está disponible en el simulador local. -
Sample
devuelve 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. -
Variance
devuelve 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