Elenco dei tipi di risultati - Amazon Braket

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

Elenco dei tipi di risultati

Amazon Braket può restituire diversi tipi di risultati quando un circuito viene misurato utilizzando. ResultType Un circuito può restituire i seguenti tipi di risultati.

  • AdjointGradientrestituisce il gradiente (derivata vettoriale) del valore atteso di un osservabile fornito. Questo osservabile agisce su un obiettivo fornito rispetto a parametri specificati utilizzando il metodo di differenziazione aggiuntiva. Puoi usare questo metodo solo quando shots=0.

  • Amplituderestituisce l'ampiezza degli stati quantistici specificati nella funzione d'onda di uscita. È disponibile su SV1 e solo simulatori locali.

  • Expectationrestituisce il valore di aspettativa di un dato osservabile, che può essere specificato con la Observable classe introdotta più avanti in questo capitolo. L'obiettivo qubits utilizzato per misurare l'osservabile deve essere specificato e il numero di obiettivi specificati deve essere uguale al numero di qubits su cui agisce l'osservabile. Se non viene specificato alcun obiettivo, l'osservabile deve operare solo su 1 qubit e si applica a tutti qubits in parallelo.

  • Probabilityrestituisce le probabilità di misurazione degli stati di base computazionali. Se non viene specificato alcun obiettivo, Probability restituisce la probabilità di misurare tutti gli stati di base. Se vengono specificati obiettivi, solo le probabilità marginali dei vettori di base sul valore specificato qubits vengono restituiti. I simulatori gestiti QPUs sono limitati a un massimo di 15 qubit, mentre i simulatori locali sono limitati alla dimensione della memoria del sistema.

  • Reduced density matrixrestituisce una matrice di densità per un sottosistema di un obiettivo specificato qubits da un sistema di qubits. Per limitare la dimensione di questo tipo di risultato, Braket limita il numero di obiettivi qubits a un massimo di 8.

  • StateVectorrestituisce il vettore di stato completo. È disponibile sul simulatore locale.

  • Samplerestituisce i conteggi delle misurazioni di un obiettivo specificato qubit impostato e osservabile. Se non viene specificato alcun obiettivo, l'osservabile deve operare solo su 1 qubit e si applica a tutti qubits in parallelo. Se vengono specificati obiettivi, il numero di obiettivi specificati deve essere uguale al numero di qubits su cui agisce l'osservabile.

  • Variancerestituisce la varianza (mean([x-mean(x)]2)) del target specificato qubit impostato e osservabile come tipo di risultato richiesto. Se non viene specificato alcun obiettivo, l'osservabile deve funzionare solo su 1 qubit e si applica a tutti qubits in parallelo. Altrimenti, il numero di obiettivi specificato deve essere uguale al numero di qubits a cui può essere applicato l'osservabile.

I tipi di risultati supportati per diversi dispositivi:

Sim locale

SV1

DM1

TN1

Rigetti

IonQ

IQM

Aggiungi Gradiente

N

Y

N

N

N

N

N

Amplitude

Y

Y

N

N

N

N

N

Aspettativa

Y

Y

Y

Y

Y

Y

Y

Probability

Y

Y

Y

N

Y

Y

Y

Matrice a densità ridotta

Y

N

Y

N

N

N

N

Vettore di stato

Y

N

N

N

N

N

N

Project N.E.M.O.

Y

Y

Y

Y

Y

Y

Y

Varianza

Y

Y

Y

Y

Y

Y

Y

È possibile verificare i tipi di risultati supportati esaminando le proprietà del dispositivo, come illustrato nell'esempio seguente.

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

Per chiamare aResultType, aggiungetelo a un circuito, come illustrato nell'esempio seguente.

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

Alcuni dispositivi forniscono misurazioni (ad esempio Rigetti) come risultati e altri forniscono probabilità come risultati (ad esempio IonQ). L'SDK fornisce una proprietà di misurazione sui risultati, ma per i dispositivi che restituiscono probabilità, viene post-calcolata. Pertanto, dispositivi come quelli forniti da IonQ hanno risultati di misurazione determinati in base alla probabilità poiché le misurazioni per colpo non vengono restituite. È possibile verificare se un risultato è stato post-calcolato visualizzando l'measurements_copied_from_deviceoggetto del risultato, come mostrato in questo file.

Osservabili

Amazon Braket include una Observable classe, che può essere utilizzata per specificare un osservabile da misurare.

È possibile applicare al massimo un osservabile univoco non identitario a ciascuno qubit. Se si specificano due o più osservabili non identici diversi allo stesso qubit, viene visualizzato un errore. A tal fine, ogni fattore di un prodotto tensoriale conta come un singolo osservabile, quindi è consentito che più prodotti tensoriali agiscano sullo stesso qubit, a condizione che il fattore che agisce su questo qubit è lo stesso.

Puoi anche ridimensionare un osservabile e aggiungere osservabili (ridimensionati o meno). Questo crea un valore Sum che può essere utilizzato nel tipo di risultato. AdjointGradient

La Observable classe include i seguenti osservabili.

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

Parametri

I circuiti possono includere parametri liberi, che possono essere utilizzati in modo «costruisci una volta ed esegui più volte» e per calcolare i gradienti. I parametri liberi hanno un nome codificato in una stringa che potete usare per specificarne i valori o per determinare se differenziarli rispetto ad essi.

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]

Per i parametri da differenziare, specificateli utilizzando il loro nome (come stringa) o tramite riferimento diretto. Nota che il calcolo del gradiente utilizzando il tipo di AdjointGradient risultato viene eseguito rispetto al valore atteso dell'osservabile.

Nota: se avete fissato i valori dei parametri liberi passandoli come argomenti al circuito parametrizzato, l'esecuzione di un circuito con AdjointGradient come risultato il tipo e i parametri specificati produrrà un errore. Questo perché i parametri che utilizziamo per differenziare non sono più presenti. Guarda l'esempio seguente.

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