Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.
Liste des types de résultats
Amazon Braket peut renvoyer différents types de résultats lorsqu'un circuit est mesuré à l'aide de. ResultType
Un circuit peut renvoyer les types de résultats suivants.
-
AdjointGradient
renvoie le gradient (dérivé vectoriel) de la valeur attendue d'un observable fourni. Cet observable agit sur une cible donnée par rapport à des paramètres spécifiés en utilisant la méthode de différenciation adjointe. Vous ne pouvez utiliser cette méthode que lorsque shots=0. -
Amplitude
renvoie l'amplitude des états quantiques spécifiés dans la fonction d'onde de sortie. Il n'est disponible que sur les simulateurs locaux SV1 et sur les simulateurs. -
Expectation
renvoie la valeur attendue d'un observable donné, qui peut être spécifiée avec laObservable
classe présentée plus loin dans ce chapitre. La cible qubits utilisée pour mesurer l'observable doit être spécifiée, et le nombre de cibles spécifiées doit être égal au nombre de cibles qubits sur lesquelles l'observable agit. Si aucune cible n'est spécifiée, l'observable ne doit fonctionner que sur 1 qubit et il est appliqué à tous qubits en parallèle. -
Probability
renvoie les probabilités de mesure des états de base de calcul. Si aucune cible n'est spécifiée,Probability
renvoie la probabilité de mesurer tous les états de base. Si des cibles sont spécifiées, seules les probabilités marginales des vecteurs de base sur les cibles spécifiées qubits sont renvoyées. Les simulateurs gérés QPUs sont limités à 15 qubits maximum, et les simulateurs locaux sont limités à la taille de la mémoire du système. -
Reduced density matrix
renvoie une matrice de densité pour un sous-système d'une cible spécifiée qubits à partir d'un système dequbits. Pour limiter la taille de ce type de résultat, Braket limite le nombre de cibles qubits à un maximum de 8. -
StateVector
renvoie le vecteur d'état complet. Il est disponible sur le simulateur local. -
Sample
renvoie le nombre de mesures d'un qubit ensemble cible spécifié et observable. Si aucune cible n'est spécifiée, l'observable ne doit fonctionner que sur 1 qubit et il est appliqué à tous qubits en parallèle. Si des cibles sont spécifiées, le nombre de cibles spécifiées doit être égal au nombre de cibles qubits sur lesquelles l'observable agit. -
Variance
renvoie la variance (mean([x-mean(x)]2)
) de l'qubitensemble de cibles spécifié et observable en tant que type de résultat demandé. Si aucune cible n'est spécifiée, l'observable ne doit fonctionner que sur 1 qubit et il est appliqué à tous qubits en parallèle. Dans le cas contraire, le nombre de cibles spécifiées doit être égal qubits au nombre auquel l'observable peut être appliqué.
Les types de résultats pris en charge pour les différents appareils :
SIM locale |
SV1 |
DM1 |
TN1 |
Rigetti |
IonQ |
IQM |
|
Gradient Adjoint |
N |
Y |
N |
N |
N |
N |
N |
Amplitude |
Y |
Y |
N |
N |
N |
N |
N |
Espérance |
Y |
Y |
Y |
Y |
Y |
Y |
Y |
Probability |
Y |
Y |
Y |
N |
Y |
Y |
Y |
Matrice à densité réduite |
Y |
N |
Y |
N |
N |
N |
N |
Vecteur d'état |
Y |
N |
N |
N |
N |
N |
N |
Exemple |
Y |
Y |
Y |
Y |
Y |
Y |
Y |
Variance |
Y |
Y |
Y |
Y |
Y |
Y |
Y |
Vous pouvez vérifier les types de résultats pris en charge en examinant les propriétés de l'appareil, comme indiqué dans l'exemple suivant.
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
Pour appeler aResultType
, ajoutez-le à un circuit, comme indiqué dans l'exemple suivant.
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])
Note
Différents appareils quantiques fournissent des résultats sous différents formats. Par exemple, les Rigetti appareils renvoient des mesures, tandis que IonQ les appareils fournissent des probabilités. Le SDK Amazon Braket propose une propriété de mesures pour tous les résultats. Toutefois, pour les appareils qui renvoient des probabilités, ces mesures sont post-calculées et basées sur les probabilités, car les mesures par tir ne sont pas disponibles. Pour déterminer si un résultat a été post-calculé, cochez la case measurements_copied_from_device
sur l'objet du résultat. Cette opération est détaillée dans le fichier gate_model_quantum_task_result.py
Observables
La Observable
classe d'Amazon Braket vous permet de mesurer un observable spécifique.
Vous ne pouvez appliquer qu'une seule observable de non-identité unique à chacun. qubit Une erreur se produit si vous spécifiez deux ou plusieurs observables non identitaires différents pour la même chose. qubit À cette fin, chaque facteur d'un produit tensoriel compte comme un observable individuel. Cela signifie que vous pouvez avoir plusieurs produits tensoriels sur le même produitqubit, à condition que les facteurs agissant sur ceux-ci qubit restent les mêmes.
Un observable peut être redimensionné et ajouter d'autres observables (mis à l'échelle ou non). Cela crée un Sum
qui peut être utilisé dans le type de AdjointGradient
résultat.
La Observable
classe inclut les observables suivants.
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)))
Paramètres
Les circuits peuvent intégrer des paramètres libres. Ces paramètres libres ne doivent être créés qu'une seule fois pour être exécutés plusieurs fois et peuvent être utilisés pour calculer des dégradés.
Chaque paramètre gratuit utilise un nom codé sous forme de chaîne qui permet de :
-
Définir les valeurs des paramètres
-
Identifier les paramètres à utiliser
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)
Gradient adjoint
L'SV1appareil calcule le gradient adjoint d'une valeur attendue observable, y compris un hamiltonien à plusieurs termes. Pour différencier les paramètres, spécifiez leur nom (sous forme de chaîne) ou par référence directe.
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])
Le fait de transmettre des valeurs de paramètres fixes en tant qu'arguments à un circuit paramétré supprimera les paramètres libres. L'exécution de ce circuit AdjointGradient
produit une erreur, car les paramètres libres n'existent plus. L'exemple de code suivant illustre l'utilisation correcte et incorrecte :
# 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})