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. Solo está disponible en los simuladores SV1 y en los 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. 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. -
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 se devuelven las probabilidades marginales de los vectores base de qubits los especificados. 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 de un objetivo específico 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. -
StateVector
devuelve el vector de estado completo. Está disponible en el simulador local. -
Sample
devuelve 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. -
Variance
devuelve 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 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.
from braket.aws import AwsDevice 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 Circuit, 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
Los diferentes dispositivos cuánticos proporcionan resultados en varios formatos. Por ejemplo, Rigetti los dispositivos devuelven mediciones, mientras que IonQ los dispositivos proporcionan probabilidades. El Amazon Braket SDK ofrece una propiedad de medición para todos los resultados. Sin embargo, en el caso de los dispositivos que devuelven probabilidades, estas mediciones se calculan posteriormente y se basan en las probabilidades, ya que las mediciones por disparo no están disponibles. Para determinar si un resultado se ha poscalculado, compruebe el measurements_copied_from_device
objeto resultante. Esta operación se detalla en el archivo gate_model_quantum_task_result.py
Observables
La Observable
clase de Amazon Braket te permite medir un observable específico.
Solo puede aplicar un único observable sin identidad a cada uno. qubit Se produce un error si se especifican dos o más observables distintos que no son de identidad en el mismo. qubit Para ello, cada factor de un producto tensorial cuenta como un observable individual. Esto significa que puede tener varios productos tensoriales al mismo tiempoqubit, siempre y cuando los factores que actúan sobre ellos qubit sigan siendo los mismos.
Se puede escalar un observable y añadir otros observables (escalados o no). Esto crea un Sum
que se puede usar en el tipo de resultado. AdjointGradient
La Observable
clase incluye los siguientes observables.
import numpy as np Observable.I() Observable.H() Observable.X() Observable.Y() Observable.Z() # Get the eigenvalues of the observable print("Eigenvalue:", Observable.H().eigenvalues) # Or rotate the basis to be computational basis print("Basis rotation gates:", Observable.H().basis_rotation_gates) # Get the tensor product of the 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()) # 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 incorporar parámetros libres. Estos parámetros libres solo necesitan construirse una vez para ejecutarse varias veces y se pueden usar para calcular gradientes.
Cada parámetro libre usa un nombre codificado en cadena que se usa para:
-
Establecer los valores de los parámetros
-
Identifique los parámetros que se van a utilizar
from braket.circuits import Circuit, FreeParameter, observables from braket.parametric import FreeParameter theta = FreeParameter("theta") phi = FreeParameter("phi") circ = Circuit().h(0).rx(0, phi).ry(0, phi).cnot(0, 1).xx(0, 1, theta)
Gradiente adjunto
El SV1 dispositivo calcula el gradiente adjunto de un valor esperado observable, incluido el hamiltoniano multitérmino. Para diferenciar los parámetros, especifique su nombre (en formato de cadena) o por referencia directa.
from braket.aws import AwsDevice from braket.devices import Devices device = AwsDevice(Devices.Amazon.SV1) circ.adjoint_gradient(observable=3 * Observable.Z(0) @ Observable.Z(1) - 0.5 * observables.X(0), parameters = ["phi", theta])
Al pasar valores de parámetros fijos como argumentos a un circuito parametrizado, se eliminarán los parámetros libres. Si se ejecuta este circuito con, se AdjointGradient
produce un error, ya que los parámetros libres ya no existen. El siguiente ejemplo de código demuestra el uso correcto e incorrecto:
# Will error, as no free parameters will be present #device.run(circ(0.2), shots=0) # Will succeed device.run(circ, shots=0, inputs={'phi': 0.2, 'theta': 0.2})