Esempi di attività quantistiche su Amazon Braket - 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à.

Esempi di attività quantistiche su Amazon Braket

Questa sezione illustra le fasi dell'esecuzione di un'operazione quantistica di esempio, dalla selezione del dispositivo alla visualizzazione del risultato. Come best practice per Amazon Braket, ti consigliamo di iniziare eseguendo il circuito su un simulatore, ad esempio SV1.

Specificare il dispositivo

Innanzitutto, selezionate e specificate il dispositivo per il vostro compito quantistico. Questo esempio mostra come scegliere il simulatore, SV1.

# choose the on-demand simulator to run the circuit from braket.aws import AwsDevice device = AwsDevice("arn:aws:braket:::device/quantum-simulator/amazon/sv1")

È possibile visualizzare alcune delle proprietà di questo dispositivo come segue:

print (device.name) for iter in device.properties.action['braket.ir.jaqcd.program']: print(iter)
SV1 ('version', ['1.0', '1.1']) ('actionType', <DeviceActionType.JAQCD: 'braket.ir.jaqcd.program'>) ('supportedOperations', ['ccnot', 'cnot', 'cphaseshift', 'cphaseshift00', 'cphaseshift01', 'cphaseshift10', 'cswap', 'cy', 'cz', 'h', 'i', 'iswap', 'pswap', 'phaseshift', 'rx', 'ry', 'rz', 's', 'si', 'swap', 't', 'ti', 'unitary', 'v', 'vi', 'x', 'xx', 'xy', 'y', 'yy', 'z', 'zz']) ('supportedResultTypes', [ResultType(name='Sample', observables=['x', 'y', 'z', 'h', 'i', 'hermitian'], minShots=1, maxShots=100000), ResultType(name='Expectation', observables=['x', 'y', 'z', 'h', 'i', 'hermitian'], minShots=0, maxShots=100000), ResultType(name='Variance', observables=['x', 'y', 'z', 'h', 'i', 'hermitian'], minShots=0, maxShots=100000), ResultType(name='Probability', observables=None, minShots=1, maxShots=100000), ResultType(name='Amplitude', observables=None, minShots=0, maxShots=0)])

Invia un esempio di attività quantistica

Invia un esempio di attività quantistica da eseguire sul simulatore on-demand.

# create a circuit with a result type circ = Circuit().rx(0, 1).ry(1, 0.2).cnot(0,2).variance(observable=Observable.Z(), target=0) # add another result type circ.probability(target=[0, 2]) # set up S3 bucket (where results are stored) my_bucket = "amzn-s3-demo-bucket" # the name of the bucket my_prefix = "your-folder-name" # the name of the folder in the bucket s3_location = (my_bucket, my_prefix) # submit the quantum task to run my_task = device.run(circ, s3_location, shots=1000, poll_timeout_seconds = 100, poll_interval_seconds = 10) # the positional argument for the S3 bucket is optional if you want to specify a bucket other than the default # get results of the quantum task result = my_task.result()

Il device.run() comando crea un'attività quantistica tramite l'API. CreateQuantumTask Dopo un breve periodo di inizializzazione, l'attività quantistica viene messa in coda fino a quando non esiste la capacità necessaria per eseguirla su un dispositivo. In questo caso, il dispositivo è SV1. Dopo che il dispositivo ha completato il calcolo, Amazon Braket scrive i risultati nella posizione Amazon S3 specificata nella chiamata. L'argomento posizionale s3_location è obbligatorio per tutti i dispositivi tranne il simulatore locale.

Nota

L'azione del task quantistico di Braket ha una dimensione limitata a 3 MB.

Invia un'attività parametrizzata

I simulatori locali e su richiesta di Amazon Braket supportano QPUs anche la specificazione di valori di parametri liberi al momento dell'invio delle attività. Puoi farlo utilizzando l'inputsargomento todevice.run(), come mostrato nell'esempio seguente. inputsDeve essere un dizionario di coppie string-float, in cui le chiavi sono i nomi dei parametri.

La compilazione parametrica può migliorare le prestazioni di esecuzione di circuiti parametrici in alcuni casi. QPUs Quando invia un circuito parametrico come attività quantistica a una QPU supportata, Braket compilerà il circuito una sola volta e memorizzerà il risultato nella cache. Non è prevista alcuna ricompilazione per i successivi aggiornamenti dei parametri sullo stesso circuito, con conseguente tempi di esecuzione più rapidi per le attività che utilizzano lo stesso circuito. Braket utilizza automaticamente i dati di calibrazione aggiornati del fornitore di hardware durante la compilazione del circuito per garantire risultati della massima qualità.

Nota

La compilazione parametrica è supportata su tutti i moduli superconduttori basati su gate QPUs Rigetti Computing ad eccezione dei programmi a livello di impulso.

from braket.circuits import Circuit, FreeParameter, Observable # create the free parameters alpha = FreeParameter('alpha') beta = FreeParameter('beta') # create a circuit with a result type circ = Circuit().rx(0, alpha).ry(1, alpha).cnot(0,2).xx(0, 2, beta) circ.variance(observable=Observable.Z(), target=0) # add another result type circ.probability(target=[0, 2]) # submit the quantum task to run my_task = device.run(circ, inputs={'alpha': 0.1, 'beta':0.2})

Specificare shots

Il shots argomento si riferisce al numero di misurazioni desiderate shots. Simulatori come SV1 supporta due modalità di simulazione.

  • In shots = 0, il simulatore esegue una simulazione esatta, restituendo i valori reali per tutti i tipi di risultati. (Non disponibile su TN1.)

  • Per valori diversi da zero di shots, il simulatore campiona i campioni dalla distribuzione di uscita per emulare il shot rumore del reale. QPUs I dispositivi QPU lo consentono solo shots > 0.

Per informazioni sul numero massimo di scatti per operazione quantistica, consulta Braket Quotas.

Sondaggio per visualizzare i risultati

Durante l'esecuzionemy_task.result(), l'SDK inizia a ricercare un risultato con i parametri definiti al momento della creazione dell'attività quantistica:

  • poll_timeout_secondsè il numero di secondi necessari per eseguire il polling dell'attività quantistica prima che scada quando si esegue l'attività quantistica sul simulatore on-demand e/o sui dispositivi QPU. Il valore predefinito è 432.000 secondi, ovvero 5 giorni.

  • Nota: per dispositivi QPU come Rigetti e IonQ, ti consigliamo di attendere alcuni giorni. Se il timeout per i sondaggi è troppo breve, è possibile che i risultati non vengano restituiti entro il tempo di votazione. Ad esempio, quando una QPU non è disponibile, viene restituito un errore di timeout locale.

  • poll_interval_secondsè la frequenza con cui viene eseguito il polling dell'attività quantistica. Specifica la frequenza con cui si chiama il Braket API per ottenere lo stato quando l'attività quantistica viene eseguita sul simulatore on-demand e sui dispositivi QPU. Il valore predefinito è 1 secondo.

Questa esecuzione asincrona facilita l'interazione con dispositivi QPU che non sono sempre disponibili. Ad esempio, un dispositivo potrebbe non essere disponibile durante una normale finestra di manutenzione.

Il risultato restituito contiene una serie di metadati associati al task quantistico. È possibile controllare il risultato della misurazione con i seguenti comandi:

print('Measurement results:\n',result.measurements) print('Counts for collapsed states:\n',result.measurement_counts) print('Probabilities for collapsed states:\n',result.measurement_probabilities)
Measurement results: [[1 0 1] [0 0 0] [1 0 1] ... [0 0 0] [0 0 0] [0 0 0]] Counts for collapsed states: Counter({'000': 761, '101': 226, '010': 10, '111': 3}) Probabilities for collapsed states: {'101': 0.226, '000': 0.761, '111': 0.003, '010': 0.01}

Visualizza i risultati di esempio

Poiché hai anche specificato ilResultType, puoi visualizzare i risultati restituiti. I tipi di risultati vengono visualizzati nell'ordine in cui sono stati aggiunti al circuito.

print('Result types include:\n', result.result_types) print('Variance=',result.values[0]) print('Probability=',result.values[1]) # you can plot the result and do some analysis import matplotlib.pyplot as plt plt.bar(result.measurement_counts.keys(), result.measurement_counts.values()); plt.xlabel('bitstrings'); plt.ylabel('counts');
Result types include: [ResultTypeValue(type={'observable': ['z'], 'targets': [0], 'type': 'variance'}, value=0.7062359999999999), ResultTypeValue(type={'targets': [0, 2], 'type': 'probability'}, value=array([0.771, 0. , 0. , 0.229]))] Variance= 0.7062359999999999 Probability= [0.771 0. 0. 0.229]
Grafico a barre che mostra il numero di conteggi per diverse stringhe di bit, con la barra più alta per «000" contenente oltre 700 conteggi.