Notas de versão do Qiskit 0.13
0.13.0
Terra 0.10.0
Prelúdio
A versão 0.10.0 inclui vários novos recursos e correções de bugs. A maior mudança desta versão é o acréscimo do suporte inicial para o uso do Qiskit com backends de armadilhas de íons presos.
Novos Recurso
-
Introduziu novos métodos no site
QuantumCircuitque permitem a adição ou remoção contínua de medições no final de um circuito.measure_all()Adiciona um
barrierseguido de uma operaçãomeasurea todos os qubits do circuito. Cria umClassicalRegisterde tamanho igual ao número de qubits no circuito, que armazena as medições.measure_active()Adiciona um
barrierseguido de uma operaçãomeasurea todos os qubits ativos no circuito. Um qubit está ativo se tiver pelo menos uma outra operação atuando sobre ele. Cria umClassicalRegisterde tamanho igual ao número de qubits ativos no circuito, que armazena as medições.remove_final_measurements()Remove todas as medições finais e as anteriores
barrierde um circuito. Uma medição é considerada "final" se não for seguida por nenhuma outra operação, excluindo barreiras e outras medições. Depois que as medições forem removidas, se todos os bits clássicos noClassicalRegisterestiverem ociosos (não tiverem operações associadas a eles), oClassicalRegisterserá removido.Exemplos:
# Using measure_all() circuit = QuantumCircuit(2) circuit.h(0) circuit.measure_all() circuit.draw() # A ClassicalRegister with prefix measure was created. # It has 2 clbits because there are 2 qubits to measure ┌───┐ ░ ┌─┐ q_0: |0>┤ H ├─░─┤M├─── └───┘ ░ └╥┘┌─┐ q_1: |0>──────░──╫─┤M├ ░ ║ └╥┘ measure_0: 0 ═════════╩══╬═ ║ measure_1: 0 ════════════╩═ # Using measure_active() circuit = QuantumCircuit(2) circuit.h(0) circuit.measure_active() circuit.draw() # This ClassicalRegister only has 1 clbit because only 1 qubit is active ┌───┐ ░ ┌─┐ q_0: |0>┤ H ├─░─┤M├ └───┘ ░ └╥┘ q_1: |0>──────░──╫─ ░ ║ measure_0: 0 ═════════╩═ # Using remove_final_measurements() # Assuming circuit_all and circuit_active are the circuits from the measure_all and # measure_active examples above respectively circuit_all.remove_final_measurements() circuit_all.draw() # The ClassicalRegister is removed because, after the measurements were removed, # all of its clbits were idle ┌───┐ q_0: |0>┤ H ├ └───┘ q_1: |0>───── circuit_active.remove_final_measurements() circuit_active.draw() # This will result in the same circuit ┌───┐ q_0: |0>┤ H ├ └───┘ q_1: |0>───── -
Foi adicionado o suporte inicial para a execução de experimentos em backends de armadilhas de íons.
-
Uma porta Rxx (rxx) e uma porta global Mølmer-Sørensen (ms) foram adicionadas ao conjunto de portas padrão.
-
Um decompositor de Cnot para Rxx/Rx/Ry
cnot_rxx_decomposee um decompositor de ângulo de Euler de um único qubitOneQubitEulerDecomposerforam adicionados ao móduloquantum_info.synthesis. -
Uma passagem de transpilador
MSBasisDecomposerfoi adicionada para desenrolar circuitos definidos em U3 e portas Cnot em um circuito definido em Rxx,Ry e Rx. Essa passagem será incluída em gerenciadores de passagens predefinidas para backends que incluem a porta 'rxx' em suas portas de base suportadas. -
Os backends em
qiskit.test.mockagora contêm um instantâneo dos dados reais de calibração do dispositivo. Isso pode ser acessado pelo métodoproperties()para cada backend. Isso pode ser usado para testar qualquer código que dependa de propriedades de back-end, como passagens de transpilador adaptáveis a ruído ou modelos de ruído de dispositivo para simulação. Isso criará um ciclo de teste e desenvolvimento mais rápido, sem a necessidade de ir para back-ends ativos. -
Permite que a classe Result retorne resultados parciais. Se for carregado um esquema de resultados válido que contenha alguns experimentos bem-sucedidos e outros que falharam, isso permitirá o acesso aos dados dos experimentos bem-sucedidos, ao mesmo tempo em que será gerada uma exceção para os experimentos que falharam e será exibida a mensagem de erro apropriada para os resultados que falharam.
-
Um kwarg
axfoi adicionado às seguintes funções de visualização:qiskit.visualization.plot_histogramqiskit.visualization.plot_state_paulivecqiskit.visualization.plot_state_qsphereqiskit.visualization.circuit_drawer(mplbackend only)qiskit.QuantumCircuit.draw(mplbackend only)
Esse kwarg é usado para passar um objeto
matplotlib.axes.Axespara as funções de visualização. Isso permite a integração dessas funções de visualização em um fluxo de trabalho de visualização maior. Além disso, se um kwarg ax for especificado, não haverá retorno das funções de visualização. -
Um kwarg
ax_realeax_imagfoi adicionado às seguintes funções de visualização:qiskit.visualization.plot_state_hintonqiskit.visualization.plot_state_city
Esses novos kargs funcionam da mesma forma que os recém-adicionados
axkwargs para outras funções de visualização. No entanto, como esses gráficos usam dois eixos (um para o componente real e outro para o componente imaginário). Ter dois kwargs também oferece a flexibilidade de gerar uma visualização apenas para um dos componentes, em vez de sempre fazer os dois. Por exemplo:from matplotlib import pyplot as plt from qiskit.visualization import plot_state_hinton ax = plt.gca() plot_state_hinton(psi, ax_real=ax)gerará apenas um gráfico do componente real.
-
Um determinado gerenciador de passes agora pode ser editado com o novo método replace. Esse método permite substituir um estágio específico em um gerenciador de passagens, o que pode ser útil ao lidar com gerenciadores de passagens predefinidos. Por exemplo, vamos editar o seletor de layout do gerenciador de passagens usado no nível de otimização 0:
from qiskit.transpiler.preset_passmanagers.level0 import level_0_pass_manager from qiskit.transpiler.transpile_config import TranspileConfig pass_manager = level_0_pass_manager(TranspileConfig(coupling_map=CouplingMap([[0,1]]))) pass_manager.draw()[0] FlowLinear: SetLayout [1] Conditional: TrivialLayout [2] FlowLinear: FullAncillaAllocation, EnlargeWithAncilla, ApplyLayout [3] FlowLinear: UnrollerA seleção do layout é definida no estágio [1]. Vamos substituí-lo por DenseLayout:
from qiskit.transpiler.passes import DenseLayout pass_manager.replace(1, DenseLayout(coupling_map), condition=lambda property_set: not property_set['layout']) pass_manager.draw()[0] FlowLinear: SetLayout [1] Conditional: DenseLayout [2] FlowLinear: FullAncillaAllocation, EnlargeWithAncilla, ApplyLayout [3] FlowLinear: UnrollerSe quiser substituí-lo sem nenhuma condição, você pode usar o atalho set-item:
pass_manager[1] = DenseLayout(coupling_map) pass_manager.draw()[0] FlowLinear: SetLayout [1] FlowLinear: DenseLayout [2] FlowLinear: FullAncillaAllocation, EnlargeWithAncilla, ApplyLayout [3] FlowLinear: Unroller -
Introduziu um novo comando de pulso
Delayque pode ser inserido em um pulsoSchedule. Esse comando aceita umduratione pode ser adicionado a qualquerChannel. Outros comandos não podem ser programados em um canal durante um atraso.O atraso pode ser adicionado como qualquer outro comando de pulso. Por exemplo:
from qiskit import pulse from qiskit.pulse.utils import pad dc0 = pulse.DriveChannel(0) delay = pulse.Delay(1) test_pulse = pulse.SamplePulse([1.0]) sched = pulse.Schedule() sched += test_pulse(dc0).shift(1) # build padded schedule by hand ref_sched = delay(dc0) | sched # pad schedule padded_sched = pad(sched) assert padded_sched == ref_schedTambém é possível passar canais adicionais para serem preenchidos e um tempo para preencher até, por exemplo:
from qiskit import pulse from qiskit.pulse.utils import pad dc0 = pulse.DriveChannel(0) dc1 = pulse.DriveChannel(1) delay = pulse.Delay(1) test_pulse = pulse.SamplePulse([1.0]) sched = pulse.Schedule() sched += test_pulse(dc0).shift(1) # build padded schedule by hand ref_sched = delay(dc0) | delay(dc1) | sched # pad schedule across both channels until up until the first time step padded_sched = pad(sched, channels=[dc0, dc1], until=1) assert padded_sched == ref_sched
Notas da Atualização
-
As atribuições e modificações no atributo
datados objetosqiskit.QuantumCircuitagora são validadas de acordo com as mesmas regras usadas em toda a APIQuantumCircuit. Isso foi feito para melhorar o desempenho da API de circuitos, pois agora podemos presumir que o atributodataestá em um formato conhecido. Se você estava modificando manualmente o atributodatade um objeto de circuito antes, isso pode não funcionar mais se suas modificações resultarem em uma estrutura de dados diferente da lista de instruções com contexto no formato[(instruction, qargs, cargs)] -
O gerenciador de senhas padrão do transpilador para o nível de otimização 2 agora usa o mecanismo de seleção de layout
DenseLayoutpor padrão, em vez deNoiseAdaptiveLayout. A passagemDenselayouttambém foi modificada para se tornar sensível a ruídos. -
A classe obsoleta
DeviceSpecificationfoi removida. Em vez disso, você deve usar o endereçoPulseChannelSpec. Por exemplo, você pode executar algo como:device = pulse.PulseChannelSpec.from_backend(backend) device.drives[0] # for DeviceSpecification, this was device.q[0].drive device.memoryslots # this was device.mem -
O módulo obsoleto
qiskit.pulse.opsfoi removido. Use os métodosScheduleeInstructiondiretamente. Por exemplo, em vez de:ops.union(schedule_0, schedule_1) ops.union(instruction, schedule) # etcEm vez disso, use:
schedule_0.union(schedule_1) instruction.union(schedule)Esse mesmo padrão se aplica a outras funções do
ops:insert,shift,append, eflatten.
Notas de descontinuação
- O uso da propriedade
controldeqiskit.circuit.Instructionpara controle clássico está obsoleto. No futuro, essa propriedade será usada para controle quântico. Em vez disso, as operações condicionadas clássicas serão tratadas pela propriedadeconditiondeqiskit.circuit.Instruction. - O suporte à configuração dos parâmetros de
qiskit.circuit.Instructioncom um objeto do tipoqiskit.qasm.node.Nodefoi descontinuado.Nodeque foram usados anteriormente como parâmetros devem ser convertidos em um tipo compatível antes de inicializar um novo objetoInstructionou chamar o setterInstruction.params. Os tipos suportados sãoint,float,complex,str,qiskit.circuit.ParameterExpression, ounumpy.ndarray. - Na versão 0.9.0 do qiskit, a representação dos bits (qubits e bits clássicos) mudou de tuplas do formato
(register, index)para instâncias das classesqiskit.circuit.Qubiteqiskit.circuit.Clbit. Para fins de compatibilidade com versões anteriores, a comparação da igualdade entre uma tupla herdada e as classes de bits foi suportada quando tudo passou de tuplas para objetos. Esse suporte está obsoleto e será removido no futuro. Tudo deve usar as classes de bits em vez de tuplas daqui para frente. - Quando a saída
mplé usada paraqiskit.QuantumCircuit.draw()ouqiskit.visualization.circuit_drawer()e o kwargstyleé usado, a passagem de chaves de dicionário não suportadas como parte do dicionáriostyle`agora está obsoleta. Se antes esses argumentos desconhecidos eram silenciosamente ignorados, no futuro, as chaves sem suporte gerarão uma exceção. - O kwarg
line lengthpara o métodoqiskit.QuantumCircuit.draw()e a funçãoqiskit.visualization.circuit_drawer()com o modo de saída de texto está obsoleto. Ele foi substituído pelofoldkwarg, que se comportará de forma idêntica no modo de saída de texto (mas agora também é compatível com o modo de saída mpl).line_lengthserá removido em uma versão futura, portanto, as chamadas devem ser atualizadas para usarfold. - O campo
foldno kwargstyledict para o métodoqiskit.QuantumCircuit.draw()e a funçãoqiskit.visualization.circuit_drawer()foi preterido. Ele foi substituído pelofoldkwarg em ambas as funções. Esse kwarg se comporta de forma idêntica ao campo no ditado de estilo.
Correções de bugs
- As camadas de instruções, que são a base de todos os tipos de desenho de circuitos, foram alteradas para abordar a justificação direita/esquerda. Às vezes, isso resulta em um resultado topologicamente equivalente à renderização em versões anteriores, mas visualmente diferente da renderização anterior. Corrige o problema #2802
- Adicione
memory_slotsaQobjExperimentHeaderdo Qobj de pulso. Isso corrige um bug no formato de dados dos resultados demeas_level=2de experimentos de pulso. Os estados quânticos medidos são retornados como uma cadeia de bits com preenchimento zero com base no número definido paramemory_slots. - Corrigida a visualização da porta rzz na gaveta do circuito de látex para corresponder à porta cu1 e refletir a simetria da porta rzz. A correção é baseada no comando cds do pacote qcircuit latex. Corrige o problema nº 1957
Outras observações
matplotlib.figure.Figureretornados por funções de visualização não são mais sempre fechados por padrão. Em vez disso, os objetos de figura retornados só serão fechados se o backend matplotlib configurado for um backend jupyter em linha (definido com%matplotlib inlineou%matplotlib notebook). Os objetos de figura de saída ainda são fechados com esses backends para evitar saídas duplicadas nos notebooks do jupyter (razão pela qual oFigure.close()foi originalmente adicionado).
Aer 0.3
Nenhuma mudança
Ignis 0.2
Nenhuma mudança
Aqua 0.6
Nenhuma mudança
IBM 0.3
Nenhuma mudança