Skip to main content
IBM Quantum Platform

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 QuantumCircuit que permitem a adição ou remoção contínua de medições no final de um circuito.


    measure_all()

    Adiciona um barrier seguido de uma operação measure a todos os qubits do circuito. Cria um ClassicalRegister de tamanho igual ao número de qubits no circuito, que armazena as medições.


    measure_active()

    Adiciona um barrier seguido de uma operação measure a todos os qubits ativos no circuito. Um qubit está ativo se tiver pelo menos uma outra operação atuando sobre ele. Cria um ClassicalRegister de 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 barrier de 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 no ClassicalRegister estiverem ociosos (não tiverem operações associadas a eles), o ClassicalRegister será 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_decompose e um decompositor de ângulo de Euler de um único qubit OneQubitEulerDecomposer foram adicionados ao módulo quantum_info.synthesis .

  • Uma passagem de transpilador MSBasisDecomposer foi 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.mock agora contêm um instantâneo dos dados reais de calibração do dispositivo. Isso pode ser acessado pelo método properties() 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 ax foi adicionado às seguintes funções de visualização:

    • qiskit.visualization.plot_histogram
    • qiskit.visualization.plot_state_paulivec
    • qiskit.visualization.plot_state_qsphere
    • qiskit.visualization.circuit_drawer (mpl backend only)
    • qiskit.QuantumCircuit.draw (mpl backend only)

    Esse kwarg é usado para passar um objeto matplotlib.axes.Axes para 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_real e ax_imag foi adicionado às seguintes funções de visualização:

    • qiskit.visualization.plot_state_hinton
    • qiskit.visualization.plot_state_city

    Esses novos kargs funcionam da mesma forma que os recém-adicionados ax kwargs 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: Unroller

    A 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: Unroller

    Se 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 Delay que pode ser inserido em um pulso Schedule. Esse comando aceita um duration e pode ser adicionado a qualquer Channel. 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_sched

    També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 data dos objetos qiskit.QuantumCircuit agora são validadas de acordo com as mesmas regras usadas em toda a API QuantumCircuit . Isso foi feito para melhorar o desempenho da API de circuitos, pois agora podemos presumir que o atributo data está em um formato conhecido. Se você estava modificando manualmente o atributo data de 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 DenseLayout por padrão, em vez de NoiseAdaptiveLayout. A passagem Denselayout também foi modificada para se tornar sensível a ruídos.

  • A classe obsoleta DeviceSpecification foi removida. Em vez disso, você deve usar o endereço PulseChannelSpec. 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.ops foi removido. Use os métodos Schedule e Instruction diretamente. Por exemplo, em vez de:

    ops.union(schedule_0, schedule_1)
    ops.union(instruction, schedule)  # etc

    Em 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, e flatten.

Notas de descontinuação

  • O uso da propriedade control de qiskit.circuit.Instruction para 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 propriedade condition de qiskit.circuit.Instruction.
  • O suporte à configuração dos parâmetros de qiskit.circuit.Instruction com um objeto do tipo qiskit.qasm.node.Node foi descontinuado. Node que foram usados anteriormente como parâmetros devem ser convertidos em um tipo compatível antes de inicializar um novo objeto Instruction ou chamar o setter Instruction.params . Os tipos suportados são int, float, complex, str, qiskit.circuit.ParameterExpression, ou numpy.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 classes qiskit.circuit.Qubit e qiskit.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 para qiskit.QuantumCircuit.draw() ou qiskit.visualization.circuit_drawer() e o kwarg style é usado, a passagem de chaves de dicionário não suportadas como parte do dicionário style` 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 length para o método qiskit.QuantumCircuit.draw() e a função qiskit.visualization.circuit_drawer() com o modo de saída de texto está obsoleto. Ele foi substituído pelo fold kwarg, 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_length será removido em uma versão futura, portanto, as chamadas devem ser atualizadas para usar fold .
  • O campo fold no kwarg style dict para o método qiskit.QuantumCircuit.draw() e a função qiskit.visualization.circuit_drawer() foi preterido. Ele foi substituído pelo fold kwarg 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_slots a QobjExperimentHeader do Qobj de pulso. Isso corrige um bug no formato de dados dos resultados de meas_level=2 de 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 para memory_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.Figure retornados 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 inline ou %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 o Figure.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

Esta página foi útil?
Relate um bug, erro de digitação ou solicite conteúdo no GitHub.