Exemplo de tarefas quânticas no Amazon Braket - Amazon Braket

As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.

Exemplo de tarefas quânticas no Amazon Braket

Esta seção mostra os estágios da execução de um exemplo de tarefa quântica, desde a seleção do dispositivo até a visualização do resultado. Como prática recomendada para o Amazon Braket, recomendamos que você comece executando o circuito em um simulador, como SV1.

Especifique o dispositivo

Primeiro, selecione e especifique o dispositivo para sua tarefa quântica. Este exemplo mostra como escolher o simulador, 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")

Você pode ver algumas das propriedades desse dispositivo da seguinte forma:

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

Envie um exemplo de tarefa quântica

Envie um exemplo de tarefa quântica para ser executada no simulador sob demanda.

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

O device.run() comando cria uma tarefa quântica por meio da CreateQuantumTask API. Após um curto período de inicialização, a tarefa quântica é colocada em fila até que exista a capacidade de executar a tarefa quântica em um dispositivo. Nesse caso, o dispositivo é SV1. Depois que o dispositivo concluir o cálculo, Amazon Braket grava os resultados no local do Amazon S3 especificado na chamada. O argumento posicional s3_location é necessário para todos os dispositivos, exceto para o simulador local.

nota

A ação da tarefa quântica do Braket é limitada a 3 MB de tamanho.

Envie uma tarefa parametrizada

Os simuladores locais e sob demanda do Amazon Braket também oferecem suporte à especificação de valores QPUs de parâmetros gratuitos no envio da tarefa. Você pode fazer isso usando o inputs argumento todevice.run(), conforme mostrado no exemplo a seguir. inputsDeve ser um dicionário de pares string-float, em que as chaves são os nomes dos parâmetros.

A compilação paramétrica pode melhorar o desempenho da execução de circuitos paramétricos em determinados. QPUs Ao enviar um circuito paramétrico como uma tarefa quântica para uma QPU compatível, o Braket compilará o circuito uma vez e armazenará o resultado em cache. Não há recompilação para atualizações subsequentes de parâmetros no mesmo circuito, resultando em tempos de execução mais rápidos para tarefas que usam o mesmo circuito. O Braket usa automaticamente os dados de calibração atualizados do fornecedor de hardware ao compilar seu circuito para garantir resultados da mais alta qualidade.

nota

A compilação paramétrica é suportada em todas as formas supercondutoras baseadas em portas QPUs Rigetti Computing com exceção dos programas de nível de pulso.

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

Especificar shots

A ferramenta shots argumento refere-se ao número de medidas desejadas shots. Simuladores como SV1 suporta dois modos de simulação.

  • Para shots = 0, o simulador executa uma simulação exata, retornando os valores reais para todos os tipos de resultados. (Não disponível em TN1.)

  • Para valores diferentes de zero de shots, o simulador extrai amostras da distribuição de saída para emular o shot ruído real QPUs. Os dispositivos QPU permitem apenas shots > 0.

Para obter informações sobre o número máximo de disparos por tarefa quântica, consulte Braket Quotas.

Enquete para obter resultados

Durante a execuçãomy_task.result(), o SDK começa a pesquisar um resultado com os parâmetros que você define na criação da tarefa quântica:

  • poll_timeout_secondsé o número de segundos para pesquisar a tarefa quântica antes que ela atinja o tempo limite ao executar a tarefa quântica no simulador sob demanda e/ou em dispositivos QPU. O valor padrão é 432.000 segundos, ou seja, 5 dias.

  • Nota: Para dispositivos QPU, como Rigetti and IonQ, recomendamos que você aguarde alguns dias. Se o tempo limite da pesquisa for muito curto, os resultados podem não ser retornados dentro do prazo da pesquisa. Por exemplo, quando uma QPU não está disponível, um erro de tempo limite local é retornado.

  • poll_interval_secondsé a frequência com que a tarefa quântica é pesquisada. Ele especifica com que frequência você liga para o Braket API para obter o status quando a tarefa quântica é executada no simulador sob demanda e em dispositivos QPU. O valor padrão é 1 segundo.

Essa execução assíncrona facilita a interação com dispositivos QPU que nem sempre estão disponíveis. Por exemplo, um dispositivo pode ficar indisponível durante uma janela de manutenção regular.

O resultado retornado contém uma variedade de metadados associados à tarefa quântica. Você pode verificar o resultado da medição com os seguintes comandos:

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}

Veja os resultados de exemplo

Como você também especificou oResultType, você pode ver os resultados retornados. Os tipos de resultados aparecem na ordem em que foram adicionados ao 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]
Gráfico de barras mostrando o número de contagens em diferentes cadeias de bits, com a barra mais alta para “000" contendo mais de 700 contagens.