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 de vector) 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 puede usar este método cuando shots = 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 locales. -
Expectationdevuelve el valor esperado de un observable dado, que se puede especificar con la claseObservable, que se presenta más adelante en este capítulo. Para medir el observable, se debe especificar el objetivo qubits utilizado y el número de objetivos especificados debe ser igual al número de qubits sobre los que actúa el observable. Si no se especifican objetivos, el observable debe operar solo en 1 qubit y se aplica a todos los qubits en paralelo. -
Probabilitydevuelve las probabilidades de medir estados básicos computacionales. Si no se especifica ningún objetivo,Probabilitydevuelve la probabilidad de medir todos los estados base. Si se especifican los objetivos, solo se devuelven las probabilidades marginales de los vectores base en los qubits especificados. Los simuladores administrados y las QPU 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 de los qubits objetivo especificados de un sistema de qubits. Para limitar el tamaño de este tipo de resultado, Braket limita el número de qubits objetivo 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 conjunto de qubit objetivo especificado y observable. Si no se especifican objetivos, el observable debe operar solo en 1 qubit y se aplica a todos los 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 conjunto de qubit objetivo especificado y el 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 los qubits en paralelo. De lo contrario, el número de objetivos especificados debe ser igual al número de qubits objetivo 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 |
IQM |
|
|
Gradiente adjunto |
N |
S |
N |
N |
N |
N |
N |
|
Amplitude |
S |
S |
N |
N |
N |
N |
N |
|
Expectativa |
S |
S |
S |
S |
S |
S |
S |
|
Probability |
S |
S |
S |
N |
S |
S |
S |
|
Matriz de densidad reducida |
S |
N |
S |
N |
N |
N |
N |
|
Vector de estado |
S |
N |
N |
N |
N |
N |
N |
|
Muestra |
S |
S |
S |
S |
S |
S |
S |
|
Varianza |
S |
S |
S |
S |
S |
S |
S |
Puede comprobar los tipos de resultados compatibles 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 a ResultType, 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, los dispositivos Rigetti devuelven mediciones, mientras que los dispositivos IonQ ofrecen probabilidades. El SDK de Amazon Braket 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 shot no están disponibles. Para determinar si un resultado se ha computado posteriormente, compruebe las measurements_copied_from_device en el objeto de resultado. Esta operación se detalla en el archivo gate_model_quantum_task_result.py
Observables
La clase Observable de Amazon Braket le permite medir un observable específico.
Solo puede aplicar un único observable no identitario a cada qubit. Se produce un error si se especifican dos o más observables no identitarios diferentes para el mismo qubit. Para este propósito, cada factor de un producto tensorial cuenta como un observable individual. Esto significa que puede tener varios productos tensoriales en el mismo qubit, siempre y cuando los factores que actúen en el qubit sigan siendo los mismos.
Es posible escalar un observable y añadir otros observables (escalados o no). Esto crea una Sum que se puede usar en el tipo de resultado AdjointGradient.
La clase Observable 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 deben construirse una vez para ejecutarse varias veces y pueden utilizarse para calcular gradientes.
Cada parámetro libre utiliza un nombre codificado en cadena que se utiliza para lo siguiente:
-
Establecer valores de parámetros
-
Identificar qué parámetros 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 dispositivo SV1 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 transferir valores de parámetros fijos como argumentos a un circuito parametrizado, se eliminarán los parámetros libres. La ejecución de este circuito con 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})