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 esempio di task quantistico, 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 = "amazon-braket-your-s3-bucket-name" # 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. CreateQuantumTask API Dopo un breve periodo di inizializzazione, l'operazione 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 un supportoQPU, Braket compilerà il circuito una 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 QPUi dispositivi 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(), SDK inizia il polling di 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 durante l'esecuzione dell'attività quantistica sul simulatore e/o sui dispositivi on-demand. QPU Il valore predefinito è 432.000 secondi, ovvero 5 giorni.

  • Nota: per QPU dispositivi 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 a non QPU è disponibile, viene restituito un errore di timeout locale.

  • poll_interval_secondsè la frequenza con cui viene interrogato il task quantistico. 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 QPU dispositivi 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.