Skip to main content
IBM Quantum Platform

Notas de versão do Qiskit SDK 2.0


2.0.3

Prelúdio

O Qiskit v2.0.3 é uma versão de correção de bugs para a série de versões secundárias v2.0.

Correções de bugs

  • ApplyLayout agora tratará corretamente o caso da aplicação de um zero-qubit Layout. Anteriormente, ele alegava que nenhum layout havia sido definido, mesmo que o campo "layout" do arquivo PropertySet fosse igual a Layout().

  • Foi corrigido um problema na passagem do ElidePermutations em que a permutação de saída não era atualizada corretamente na presença de operações PermutationGate operações. Isso resultaria em um circuito de saída incorreto e em uma propriedade virtual_permutation_layout incorreta no property_set que está sendo definido. Quando executado como parte de um PassManager maior, isso também resultaria em um TranspileLayout incorreto sendo retornado no QuantumCircuit.layout no circuito de saída.

  • Foi corrigido um bug na função HighLevelSynthesis ao desenrolar objetos aninhados/personalizados Instruction aninhados/personalizados. Se o QuantumCircuit retornado por Instruction.definition retornado de um objeto personalizado contivesse algum objeto Clbit esses bits clássicos usariam incorretamente o índice interno dentro do objeto Instruction.definition QuantumCircuit em vez de mapeá-los para o índice correspondente no objeto externo QuantumCircuit.

  • Foi corrigido um bug no PauliEvolutionSynthesisDefault e PauliEvolutionSynthesisRustiq que modificava o atributo.synthesis do circuito original ao definir preserve_order=False. O comportamento dos plug-ins foi restaurado e o circuito original agora é preservado em todo o pipeline de transpilação.

  • Foi corrigido um problema de compatibilidade com a versão mínima suportada do rustworkx, 0.15. Com determinadas entradas, o VF2Layout e VF2PostLayout estavam usando anteriormente um método rustworkx que foi adicionado no rustworkx 0.16.0, o que causaria um erro ao usar uma versão mais antiga do rustworkx que está listada como compatível.

  • SabreLayout e SabreSwap não entrará mais em pânico ao aplicar o resultado do roteamento a um circuito que usa expr.Var ou Stretch em um escopo de fluxo de controle aninhado.

  • qiskit.circuit.library.quantum_volume() foi atualizado para lidar com um numpy.random.Generator como entrada para seu argumento seed . Anteriormente, esse argumento de gerador resultava em um TypeError.


2.0.2

Prelúdio

O Qiskit v2.0.2 é uma versão de correção de bugs para a série de versões secundárias v2.0.

Correções de bugs

  • Corrigido o atributo name da classe OrGate de modo que agora ele seja definido como "or" para identificar exclusivamente esse portão. Anteriormente, ele estava incorretamente definido como "and" , o que tornava impossível distingui-lo de AndGate ou ter plug-ins de síntese para sintetizar um OrGate.

  • Foi corrigido um problema na passagem do ConsolidateBlocks em que falhava na consolidação de alguns blocos se a porta KAK selecionada (diretamente ou por meio do destino) fosse supercontrolada e não CXGate. Corrigido #14413

  • Correção de um bug nas funções do circuito evolved_operator_ansatz(), qaoa_ansatz() e hamiltonian_variational_ansatz()em que os parâmetros tinham um componente complexo zero. Normalmente, isso não era um problema, a menos que o parâmetro fosse traduzido para SymPy usando o método ParameterExpression.sympify() o que geraria um erro.


2.0.1

Prelúdio

O Qiskit v2.0.1 é uma versão menor de correção de bugs para a série de versões v2.0.x.

Correções de bugs

  • Correção de um bug de visualização na gaveta de circuito de texto em que as operações de fluxo de controle pós-transpilação podiam ter seu "colchete" de fechamento renderizado verticalmente fora de ordem. Consulte #14271 para obter mais detalhes.

  • Foi corrigido um erro na passagem do UnitarySynthesis onde a passagem ignorava o parâmetro synth_gates e sintetizava apenas os portões unitary . A passagem agora sintetiza corretamente todos os portões especificados no parâmetro synth_gates . Corrigido #14343.

  • Adicionado o suporte repr que faltava para Duration.

  • Foi adicionado o suporte que faltava para Python decapagem de Duration. Isso estava impedindo a transpilação paralela de circuitos com delay() instruções que usam expressões de duração.

  • Foi corrigido um problema na passagem do HighLevelSynthesis que fazia com que ele terminasse erroneamente antes do tempo em determinados circuitos com operações de fluxo de controle. Corrigido #14338

  • Corrigimos a construção de circuitos de tempo polinomial quântico instantâneo (IQP) em IQP e por iqp(). A implementação anterior usava incorretamente potências da porta T\sqrt{T} em vez de potências da porta TT.

  • SabreLayout agora propagará corretamente os valores de name e metadata de um circuito ao ser executado como uma passagem conjunta de layout e roteamento.

  • Foi corrigido um problema no plug-in de síntese SolovayKitaevSynthesis em que a execução repetida do plug-in com diferentes portas de base reutilizava incorretamente as portas de base apenas da primeira execução. Esse problema foi causado pelo fato de ignorar as portas de base ao armazenar aproximações básicas em cache.

  • Foi corrigido um problema na passagem do SolovayKitaev em que a passagem poderia travar devido a uma rotação de 180 graus na recursão interna, que não era tratada corretamente.

  • Foi corrigido um problema na passagem do SolovayKitaev em que a aproximação gerada poderia ter uma fase diferente do valor correto em π\pi. Isso ocorreu devido à representação interna do SO(3)SO(3), que exige um tratamento adicional para obter o sinal correto da matriz de porta de qubit. Corrigido #9552

  • Os circuitos que contêm atrasos com trechos (consulte QuantumCircuit.add_stretch()) agora podem ser compilados com sucesso usando os gerenciadores de passagem predefinidos (transpile() e generate_preset_pass_manager()) ao visar um backend que tenha restrições de alinhamento, por exemplo, dispositivos IBM Quantum Eagle como ibm_sherbrooke.

  • A heurística de erro de fallback em VF2Layout e VF2PostLayoutusada quando não havia taxas de erro relatadas, poderia atribuir previamente erros maiores que um e ter efeitos imprevisíveis nas pontuações de layout resultantes.


2.0.0

Prelúdio

Temos o prazer de lançar o Qiskit v2.0.0, com novos recursos que melhoram seu desempenho e suas capacidades. Os destaques dos recursos do Qiskit v2.0.0 incluem:

  • A introdução de uma API C para criar e interagir com SparseObservable objetos. Essa primeira interface de linguagem compilada representa um marco importante na evolução do Qiskit e seu escopo aumentará ao longo da série de versões v2.x. A iteração inicial da API C é um recurso experimental, e pode haver alterações significativas na API em versões menores, seguindo nossa estratégia de versão.
  • A adição de uma nova BoxOp que mapeia o conceito de caixa do OpenQASM 3 e permite agrupar séries de instruções para processamento posterior e agendamento personalizado. Esse operador é útil para aplicações como giro, aprendizado de ruído e programação baseada em alongamento, entre outras.
  • A capacidade de criar stretch durações para Delay instruções, o que permite expressar relações entre instruções com reconhecimento de tempo. O novo tipo Stretch amplia o sistema de expressão clássica existente, permitindo que a intenção do projeto seja capturada no momento da construção do circuito e resolvida no momento da compilação. Consulte a documentação do site OpenQASM para obter detalhes.
  • Síntese aprimorada quando um Target contém portas de base de dois qubits fracionários com suporte para ângulos arbitrários, como RZXGate ou RZZGateo que reduz significativamente a contagem de portas nos circuitos sintetizados.
  • Desempenho aprimorado do tempo de execução, especialmente durante a etapa de construção do circuito, em que o benchmarking de benchpress mostra um aumento de velocidade de 2x em relação ao Qiskit v1.3. Esse aprimoramento é obtido por meio de uma combinação de contribuições, incluindo o aproveitamento de representações adicionais de portas nativas do Rust, como UnitaryGatee a remoção de elementos do modelo de dados legado.

De acordo com nossa política de controle de versão semântica, documentada no momento da versão v1.0.0, essa versão principal também inclui alterações de API que não são compatíveis com versões anteriores da série de versões v1.x. Em particular, vários componentes obsoletos do modelo de dados do Qiskit foram removidos, como o método .c_if() , o módulo qobj , BackendV1 e qiskit.pulse, bem como as implementações de referência primitiva V1 obsoletas. Consulte as seções de notas de versão de upgrade para obter mais detalhes sobre todas essas remoções e alterações de API. As APIs removidas ainda são compatíveis com a versão do Qiskit v1.4.x, que receberá correções de bugs por mais seis meses e terá atualizações de segurança por um ano.

Novos Recurso

  • O suporte para a plataforma Linux aarch64 foi promovido para suporte de nível 1, conforme documentado em:

    /guides/install-qiskit#operating-system-support

    de seu nível de suporte anterior de nível 2 na série de lançamentos v1.x.

  • Introduziu uma nova API em C para criar e interagir com observáveis esparsos. Embora a superfície da API nesta versão seja relativamente pequena - abrangendo apenas a classe SparseObservable ela representa um marco importante na evolução do Qiskit, pois é a primeira vez que o SDK expõe uma interface pública em C e estabelece a base para futuras expansões da interface C do Qiskit. Como essa é a primeira interface pública em C, trata-se de um recurso experimental e, se necessário, a API poderá ser alterada em um lançamento de versão secundária.

    A sintaxe detalhada e informações adicionais podem ser encontradas na documentação da API C. Um exemplo mínimo para construir o observável de 100 qubits 2 X0 Y1 Z2 é:

    #include <complex.h>
    #include <qiskit.h>
    #include <stdint.h>
    #include <stdio.h>
    
    int main(int argc, char *argv[]) {
        // build a 100-qubit empty observable
        uint32_t num_qubits = 100;
        QkObs *obs = qk_obs_zero(num_qubits);
    
        // add the term 2 * (X0 Y1 Z2) to the observable
        complex double coeff = 2;
        QkBitTerm bit_terms[3] = {QkBitTerm_X, QkBitTerm_Y, QkBitTerm_Z};
        uint32_t indices[3] = {0, 1, 2};
        QkObsTerm term = {coeff, 3, bit_terms, indices, num_qubits};
        qk_obs_add_term(obs, &term);
    
        // print some properties
        printf("num_qubits: %u\n", qk_obs_num_qubits(obs));
        printf("num_terms: %lu\n", qk_obs_num_terms(obs));
    
        // free the memory allocated for the observable
        qk_obs_free(obs);
    
        return 0;
    }

Recursos dos circuitos

  • Adicionada uma nova função de conveniência get_control_flow_name_mapping() que retorna um mapeamento dos nomes de operações de fluxo de controle do Qiskit para suas classes correspondentes.

    Exemplo de uso:

    from qiskit.circuit import get_control_flow_name_mapping
    
    ctrl_flow_name_map = get_control_flow_name_mapping()
    if_else_object = ctrl_flow_name_map["if_else"]
    
    print(if_else_object)
    <class 'qiskit.circuit.controlflow.if_else.IfElseOp'>
  • Adicionado um novo método de circuito, QuantumCircuit.estimate_duration()para estimar a duração de um circuito programado após a transpilação. A duração do circuito é estimada ao encontrar o caminho mais longo em um circuito programado com base nas durações fornecidas por um determinado Target. Esse método só funciona para circuitos simples que não contêm fluxo de controle ou outras operações clássicas de avanço.

    Use esse método em vez do atributo QuantumCircuit.duration se você precisar de uma estimativa da duração total do circuito.

    Exemplo de uso:

    from qiskit import QuantumCircuit, transpile
    from qiskit.providers.fake_provider import GenericBackendV2
    
    backend = GenericBackendV2(num_qubits=3, seed=42)
    
    circ = QuantumCircuit(3)
    circ.cx(0, 1)
    circ.measure_all()
    circ.delay(1e15, 2)
    
    circuit_dt = transpile(circ, backend, scheduling_method="asap")
    duration = circuit_dt.estimate_duration(backend.target, unit="s")
    print("Estimated duration: ", duration)
  • Adicionadas duas novas classes: BitFlipOracleGate e PhaseOracleGate. BitFlipOracleGate foi introduzido como uma alternativa para sintetizar diretamente BooleanExpression, que foi removido no Qiskit v2.0. PhaseOracleGate foi adicionado como uma alternativa ao PhaseOraclejá que o último será preterido nas versões do site v2.x. Ambas as classes compartilham a interface de PhaseOracleexceto pelo método evaluate_bitstring , que não está mais presente.

    BitFlipOracleGate sintetiza um oráculo de inversão de bit em vez de um oráculo de inversão de fase, o que significa que ele atua em um qubit adicional e pode ser visto como a aplicação de uma operação X controlada, em que o controle é determinado pelo valor da expressão codificada pelo oráculo.

    from qiskit import QuantumCircuit
    from qiskit.circuit.library.bit_flip_oracle import BitFlipOracleGate
    qc = QuantumCircuit(5)
    bool_expr = "(x0 & x1 | ~x2) & x4"
    oracle = BitFlipOracleGate(bool_expr)
    qc.compose(oracle, inplace=True)
    qc.draw('mpl')
    qc.decompose().draw('mpl')
    _images/release_notes-1_00.png _images/release_notes-1_01.png
    from qiskit import QuantumCircuit
    from qiskit.circuit.library.phase_oracle import PhaseOracleGate
    qc = QuantumCircuit(5)
    bool_expr = "(x0 & x1 | ~x2) & x4"
    oracle = PhaseOracleGate(bool_expr)
    qc.compose(oracle, inplace=True)
    qc.draw('mpl')
    qc.decompose().draw('mpl')
    _images/release_notes-2_00.png _images/release_notes-2_01.png
  • Um novo fluxo de controle op, BoxOpe seu método QuantumCircuit.box() e o gerenciador de contexto associados estão agora disponíveis em qiskit.circuit.

    A maneira normal de construir uma caixa é usar o QuantumCircuit.box() gerenciador de contexto:

    from qiskit.circuit import QuantumCircuit
    
    qc = QuantumCircuit(5)
    
    with qc.box():
      # This box "uses" qubits 0 and 1.
      qc.x(0)
      qc.z(1)
    
    # Boxes can be assigned a duration.
    with qc.box(duration=100, unit="ms"):
      # This box "uses" qubits 2, 3 and 4.
      # Qubit 4 undergoes no operations.
      qc.cx(2, 3)
      qc.noop(4)

    A "caixa" do Qiskit mapeia quase diretamente o conceito de caixa do OpenQASM 3.

    Todos os qubits "usados" pela caixa são sincronizados no início e no final da caixa. Em outras palavras, a caixa tem a mesma "duração" para cada qubit que usa, e os pontos de início são sincronizados. Outras operações no mesmo escopo que a própria BoxOp é válida para comutar uma operação passando por uma caixa inteira se a operação comutar com a ação da caixa inteira, mas geralmente não é válido mover uma operação para dentro ou para fora de uma caixa.

    Os principais usos de uma caixa são agrupar uma série de instruções para processamento posterior (como o agrupamento de uma camada parcial de portas de dois qubits) e programar um bloco composto em um escopo enquanto usa programação relativa dentro do bloco (como o desacoplamento dinâmico de vários qubits em um grupo). O compilador do Qiskit ainda não tem passagens integradas que agruparão instruções ou programarão instruções com um BoxOp.

    O transpilador é compatível com roteamento e layout na presença de caixas e otimizará dentro da caixa (até a configuração optimization_level ), mas ainda não realiza otimizações em torno da estrutura atômica das caixas. A caixa de suporte de gavetas de circuito com base em texto e Matplotlib. A exportação para o QPY e para o OpenQASM 3 é compatível, embora o OpenQASM 3 atualmente não tenha como designar qubits ociosos em uma caixa (espera-se que uma alteração nas especificações adicione isso em um futuro próximo: consulte a proposta de recurso relevante ).

  • Adicionado um novo argumento approximation_degree ao CommutationChecker.commute() e CommutationChecker.commute_nodes(). Esse argumento permite que você defina o limite de aproximação para quando os portões são avaliados como comutadores. Consulte a documentação de CommutationChecker para obter mais informações.

  • Foi adicionado um novo método de circuito, QuantumCircuit.noop()que permite que os qubits sejam explicitamente marcados como usados em um escopo de construtor de fluxo de controle sem adicionar uma operação correspondente a eles.

  • O módulo clássico de expressões em tempo real qiskit.circuit.classical agora pode representar expressões constantes. A classe Expr agora tem um atributo booleano const que indica a constância da expressão. Isso nos permite impor que as expressões em determinados contextos devem ser possíveis de serem avaliadas em tempo de compilação.

    Todas as expressões Var são consideradas não-const, enquanto todas as expressões Value são constantes.

    Uma expressão composta apenas por outras expressões const também é const:

    from qiskit.circuit.classical import expr
    
    assert expr.bit_and(5, 6).const

    Uma expressão que contém qualquer expressão não-constante é não-constante:

    from qiskit.circuit.classical import expr, types
    
    assert not expr.bit_and(5, expr.Var.new("a", types.Uint(5)).const
  • O módulo clássico de expressões em tempo real qiskit.circuit.classical clássico agora pode representar durações usando o novo tipo Duration.

    O módulo qiskit.circuit também tem uma nova classe Duration que pode ser usada como um valor literal em expressões clássicas.

    A função lift() pode ser usada para criar uma expressão de valor a partir de uma Duration instância:

    from qiskit.circuit import Duration
    from qiskit.circuit.classical import expr
    
    expr.lift(Duration.dt(1000))
    # Value(Duration.dt(1000), Duration())
  • O módulo clássico de expressões em tempo real qiskit.circuit.classical agora pode representar IEEE-754 valores de ponto flutuante de precisão dupla usando o novo tipo Float.

    A função lift() pode ser usada para criar uma expressão de valor a partir de um float Python :

    from qiskit.circuit.classical import expr
    
    expr.lift(5.0)
    # >>> Value(5.0, Float())

    Esse tipo é destinado principalmente para uso em expressões relacionadas a tempo (duration e stretch). Não é compatível com operações bit a bit ou lógicas, embora possa ser usado com elas se forem primeiro convertidas explicitamente em outra coisa.

  • Reduziu o número de portas de dois qubits ao decompor portas unitárias de um qubit com controle múltiplo. Por exemplo:

    • Para o controle múltiplo YGate em 10 qubits, a CXGate contagem foi reduzida em 56%.
    • Para o controle múltiplo HGate em 10 qubits, a CXGate contagem foi reduzida em 56%.
    • Para sistemas multicontrolados SXGate e SXdgGate em 10 qubits, a contagem de CXGate contagem foi reduzida em 80%.
    • Para o controle múltiplo UGate em 10 qubits, a CXGate contagem foi reduzida em 31%.
  • O módulo clássico de expressões em tempo real qiskit.circuit.classical agora pode representar operações aritméticas add(), sub(), mul(), e div() em operandos numéricos e de tempo.

    Por exemplo:

    from qiskit.circuit import QuantumCircuit, ClassicalRegister, Duration
    from qiskit.circuit.classical import expr
    
    # Subtract two integers
    cr = ClassicalRegister(4, "cr")
    qc = QuantumCircuit(cr)
    with qc.if_test(expr.equal(expr.sub(cr, 2), 3)):
        pass
    
    # Multiply a Duration by a Float
    with qc.if_test(expr.less(expr.mul(Duration.dt(200), 2.0), Duration.ns(500))):
        pass
    
    # Divide a Duration by a Duration to get a Float
    with qc.if_test(expr.greater(expr.div(Duration.dt(200), Duration.dt(400)), 0.5)):
        pass

    Para obter exemplos adicionais, consulte a documentação em nível de módulo com o link acima.

  • O construtor para UCGate agora tem um novo argumento opcional, mux_simp, que recebe um valor booleano que permite a busca por simplificações de Carvalho et al. Essa otimização é ativada por padrão, identifica e remove controles desnecessários do multiplexador, reduzindo o número de portas CX e a profundidade do circuito, especialmente na preparação de estado separável com Initialize.

  • O PauliEvolutionGate agora suporta nativamente SparseObservables como entrada. Isso permite lidar eficientemente com a evolução em projetores, que são implementados como controles de uma rotação de fase e exigem menos portas do que expandir explicitamente o projetor em termos de Paulis. Por exemplo:

    from qiskit.circuit.library import PauliEvolutionGate
    from qiskit.quantum_info import SparseObservable
    
    obs = SparseObservable("001")
    evo_proj = PauliEvolutionGate(obs, time=1)
    print(evo_proj.definition.draw())
  • Um novo nó de expressão Stretch foi adicionado ao sistema de expressão clássico para representar as variáveis stretch . Para criar uma nova variável stretch , você pode usar QuantumCircuit.add_stretch(). A expressão resultante é uma expressão constante do tipo Durationque pode ser usada como o argumento duration de uma expressão delay().

    Por exemplo, para garantir que uma sequência de portões entre duas barreiras seja alinhada à esquerda, independentemente de suas durações reais, você pode fazer o seguinte:

    from qiskit import QuantumCircuit
    from numpy import pi
    
    qc = QuantumCircuit(5)
    qc.barrier()
    qc.cx(0, 1)
    qc.u(pi/4, 0, pi/2, 2)
    qc.cx(3, 4)
    
    a = qc.add_stretch("a")
    b = qc.add_stretch("b")
    c = qc.add_stretch("c")
    
    # Use the stretches as Delay duration.
    qc.delay(a, [0, 1])
    qc.delay(b, 2)
    qc.delay(c, [3, 4])
    qc.barrier()

    A expressão Stretch é muito semelhante à expressão Var usada para representar variáveis clássicas em um circuito, exceto pelo fato de ser constante e ser sempre do tipo Duration. Ele pode ser usado em outras expressões (por exemplo, você pode multiplicá-lo por uma constante numérica) e QuantumCircuit oferece suporte total ao escopo (por exemplo, pode ser capturado ou declarado em um escopo de fluxo de controle).

    Para obter contexto e exemplos adicionais, consulte a especificação da linguagem OpenQASM 3.

  • Adicionadas Gate versões das portas aritméticas de registro único que permitem que o transpilador execute otimizações de alto nível em comparação com suas QuantumCircuit variantes. São eles:

Recursos primitivos

  • Adicionado um novo método to_bool_array() à classe BitArray que retorna a matriz de bits como uma matriz booleana NumPy. O argumento order pode ser usado para especificar a endianidade da matriz de saída.

Recursos dos provedores

  • Foi adicionada a capacidade de definir a propriedade dt de GenericBackendV2 no inicializador de classe com um novo argumento dt . Exemplo de uso:

    from qiskit.providers.fake_provider import GenericBackendV2
    
    backend = GenericBackendV2(
      num_qubits = 5,
      basis_gates = ["cx", "id", "rz", "sx", "x"],
      dt = 2.22*e-10,
      seed = 42
    )

Recursos de informação quântica

  • Adicionado um novo método SparseObservable.to_sparse_list() para obter uma representação de lista esparsa de um arquivo SparseObservable. Por exemplo:

    from qiskit.quantum_info import SparseObservable
    
    obs = SparseObservable.from_list([("+II", 1), ("-II", 1)])
    print(obs.to_sparse_list())  # [("+", [2], 1), ("-", [2], 1)]
  • Adicionado um novo método SparseObservable.as_paulis() para expressar um observável esparso apenas em termos de Paulis, expandindo todos os projetores. Por exemplo:

    from qiskit.quantum_info import SparseObservable
    
    obs = SparseObservable("+-")
    obs_paulis = obs.as_paulis()  # 1/4 ( II + XI - IX - XX )
  • O Qiskit v2.0.0 suporta a construção de um SparsePauliOp a partir de um SparseObservable usando o novo método SparsePauliOp.from_sparse_observable(). É importante lembrar que SparseObservable podem representar eficientemente os projetores, que exigem um número exponencial de termos na função SparsePauliOp.

  • SparseObservable agora oferece suporte à composição de operadores usando o método compose() semelhante a outras classes quantum_info classes. Isso é análogo à multiplicação de matrizes, embora o método seja totalmente livre de matrizes.

  • SparseObservable.BitTerm tem um novo atributo, labelque contém a cadeia de caracteres de um único caractere Python usada para representar o termo em rótulos de cadeia.

  • O método StabilizerState.expectation_value() agora pode aceitar um operador do tipo SparsePauliOp.

Recursos de síntese

Recursos do Transpiler

  • Foi adicionado suporte para trabalhar com objetos Target que contêm portas de base de dois qubits que contêm ângulos arbitrários, como RZZGateà passagem do ConsolidateBlocks passagem do transpilador. A passagem anterior não estimava corretamente o número de portas necessárias para uma decomposição, o que fazia com que os blocos não fossem consolidados onde UnitarySynthesis poderia potencialmente otimizar o bloco. Internamente, a estimativa da contagem de portas é feita usando a classe TwoQubitControlledUDecomposer classe.

    Por exemplo:

    from qiskit import QuantumCircuit
    from qiskit.transpiler import generate_preset_pass_manager
    from qiskit.transpiler.passes import ConsolidateBlocks
    
    qc = QuantumCircuit(2)
    qc.rzz(0.1, 0, 1)
    qc.rzz(0.2, 0, 1)
    # basis_gates contains fractional gate (rzz)
    consolidate_pass = ConsolidateBlocks(basis_gates=["rz", "rzz", "sx", "x", "rx"])
    block = consolidate_pass(qc)  # consolidate the circuit into a single unitary block
    block.draw(output='mpl')
    
    pm = generate_preset_pass_manager(
        optimization_level=2, basis_gates=["rz", "rzz", "sx", "x", "rx"]
    )
    tqc = pm.run(qc)  # synthesizing the circuit into basis gates
    tqc.draw(output='mpl')
  • Foi adicionado suporte a portas de base fracionária de dois qubits, como RZZGateà passagem do UnitarySynthesis passagem do transpilador. A decomposição é feita usando o TwoQubitControlledUDecomposere suporta portas de base padrão e personalizadas.

    Por exemplo:

    from qiskit import QuantumCircuit
    from qiskit.quantum_info import random_unitary
    from qiskit.transpiler.passes import UnitarySynthesis
    from qiskit.converters import circuit_to_dag, dag_to_circuit
    
    unitary = random_unitary(4, seed=1)
    qc = QuantumCircuit(2)
    qc.append(unitary, [0, 1])
    dag = circuit_to_dag(qc)
    
    # basis_gates contains fractional gate (rzz)
    circ = UnitarySynthesis(basis_gates=['rzz', 'rx', 'rz']).run(dag)
    dag_to_circuit(circ).draw(output='mpl')
  • Adicionada uma nova passagem de transpilador, LightConeque retorna o cone de luz de um circuito ao medir um subconjunto de qubits ou uma string Pauli específica.

    Por exemplo, para o circuito a seguir:

    _images/release_notes-3.png

    a execução do passe eliminaria os portões que não afetam o resultado:

    from qiskit.transpiler.passes.optimization.light_cone import LightCone
    from qiskit.transpiler.passmanager import PassManager
    from qiskit.circuit import QuantumCircuit
    
    qc = QuantumCircuit(3,1)
    qc.h(range(3))
    qc.cx(0,1)
    qc.cx(2,1)
    qc.h(range(3))
    qc.measure(0,0)
    
    pm = PassManager([LightCone()])
    new_circuit = pm.run(qc)
    new_circuit.draw("mpl")
    _images/release_notes-4.png
  • Foi adicionado um novo argumento max_block_width à classe BlockCollector e para as classes CollectLinearFunctions e CollectCliffords passagens do transpilador. Esse argumento permite que você restrinja o número máximo de qubits sobre os quais um bloco de nós é definido.

    Por exemplo:

    from qiskit.circuit import QuantumCircuit
    from qiskit.transpiler.passes import CollectLinearFunctions
    
    qc = QuantumCircuit(5)
    qc.h(0)
    qc.cx(0, 1)
    qc.cx(1, 2)
    qc.cx(2, 3)
    qc.cx(3, 4)
    
    # Collects all CX-gates into a single block 
    qc1 = CollectLinearFunctions()(qc)
    qc1.draw(output='mpl')
    
    # Collects CX-gates into two blocks of width 3 
    qc2 = CollectLinearFunctions(max_block_width=3)(qc)
    qc2.draw(output='mpl')
  • Foi adicionada uma nova opção, collect_from_back, à passagem do CollectMultiQBlocks transpiler pass. Quando definido como True, os blocos são coletados na direção inversa, das saídas para as entradas do circuito. Os blocos ainda são relatados seguindo a ordem topológica normal. Isso leva a uma flexibilidade adicional proporcionada pela passagem e a oportunidades adicionais de otimização quando combinada com um método de ressíntese de circuito.

  • Adicionado um novo argumento approximation_degree ao CommutationAnalysis. Esse argumento permite que você defina o limite de aproximação para quando as portas são avaliadas para comutação. Consulte a documentação da classe para obter mais informações.

  • Um novo passe de transpilador, ContractIdleWiresInControlFlowestá disponível em qiskit.transpiler.passes. Essa passagem remove os qubits dos blocos de fluxo de controle se a semântica permitir e se o qubit permanecer ocioso durante toda a operação de fluxo de controle. Anteriormente, o estágio de roteamento dos gerenciadores de passagem predefinidos podia remover qubits ociosos como um efeito colateral não intencional da forma como as passagens operavam. Agora, esse comportamento é tratado adequadamente como parte de uma passagem de otimização.

  • Foi adicionado um novo estágio de plug-in de roteamento "default" . No Qiskit v2.0.0, isso é simplesmente um alias para o padrão anterior "sabre". O algoritmo padrão subjacente pode mudar no decorrer da série de versões do Qiskit v2.x para alguns ou todos os alvos, mas você sempre pode definir explicitamente routing_method="sabre" para manter o comportamento atual.

  • Adição de um novo estágio do plug-in de tradução "default" . No Qiskit v2.0.0, esse é um alias para o padrão anterior "translator". O algoritmo padrão subjacente pode mudar no decorrer da série Qiskit 2.x para alguns ou todos os alvos, mas você sempre pode definir explicitamente translation_method="translator" para manter o comportamento atual.

  • A passagem do HighLevelSynthesis agora sintetiza objetos do tipo AnnotatedOperation por meio da interface do plug-in.

  • PassManager.run() agora aceita um argumento property_set , que pode ser definido como um objeto Mapping-para fornecer os valores iniciais do objeto PropertySet. Isso pode ser usado para recomeçar uma compilação parcialmente aplicada ou para reutilizar determinada análise de uma compilação anterior em um novo local.

  • O agendamento passa PadDelay e PadDynamicalDecoupling agora têm novos argumentos em seus construtores: target e durations. Eles são usados para especificar o Target ou InstructionDurations respectivamente. Para acessar as durações das instruções quando a passagem é executada, é necessário um dos argumentos.

  • Adicionado um novo método seconds_to_dt() à classe Target classe. Isso é usado para converter uma duração em segundos em um número de etapas de tempo discretizadas da resolução de tempo do sistema especificada no atributo Target.dt atributo. Isso geralmente é útil para converter o valor InstructionProperties.duration para unidades de dt.

  • A passagem do Split2QUnitaries a passagem do transpilador foi atualizada para lidar com o caso em que o unitário em consideração pode ser escrito como um SwapGate e duas portas de um único qubit. Nesse caso, ele divide o unitário e também aplica a troca virtual, semelhante ao que é feito no ElidePermutations. Essa funcionalidade pode ser controlada com um novo argumento, split_swap, no construtor de :class`.Split2QUnitaries`, que pode ser usado para desativar a divisão de portas equivalentes de troca.

Páginas Recursos

  • qiskit.utils agora contém utilitários para oferecer melhor controle e inspeção das configurações de paralelização do Qiskit multiprocessing configurações de paralelização do Qiskit. Em particular, agora é possível usar should_run_in_parallel() para consultar se o parallel_map() (e gerenciadores de passagem) iniciarão subprocessos para entradas adequadas e usar o gerenciador de contexto should_run_in_parallel.override() para substituir temporariamente a maioria das configurações do sistema e do usuário em torno dessa decisão.

    Uma função adicional, default_num_processes()lê o número máximo padrão de subprocessos que o Qiskit usará para o paralelismo baseado em processos.

  • Uma nova variável de ambiente, QISKIT_IGNORE_USER_SETTINGS, agora controla se o arquivo de configurações do usuário deve ser lido em import qiskit. Se definido como a string true, o arquivo de configurações não será lido. Isso é útil para isolar determinadas instâncias do Qiskit do ambiente do sistema, por exemplo, para testes.

Notas da Atualização

  • O Qiskit v2.0 deixou de oferecer suporte ao Linux i686 e ao Windows de 32 bits. A partir do Qiskit v2.0.0, é necessária uma plataforma de 64 bits para executar o Qiskit. Isso se alinha à tendência da comunidade Python científica e permite que a Qiskit se concentre em melhorias de desempenho para hardware de computação quântica cada vez mais complexo.

    O Qiskit v1.4 continuará a oferecer suporte a plataformas de 32 bits até o fim da vida útil (setembro de 2025), mas a partir desta versão 2.0.0, o Qiskit não publicará mais binários pré-compilados para elas e não oferece nenhuma garantia de compilações de código-fonte bem-sucedidas em plataformas de 32 bits.

  • A versão mínima suportada do Rust para criar o Qiskit a partir do código-fonte agora é v1.79. Essa versão foi aumentada de v1.70, a versão Rust mínima compatível anterior na série de versões do Qiskit v1.x.

  • O Qiskit Pulse foi completamente removido nesta versão, após sua descontinuidade no Qiskit v1.3. Isso inclui todos os arquivos de módulo de pulso, funcionalidade de visualização de pulso, suporte para ScheduleBlock e serialização e desserialização de porta de pulso no QPY, gerenciamento de calibrações em QuantumCircuit, Target e DAGCircuite backends falsos baseados em pulso. Para obter mais detalhes sobre os componentes removidos relacionados ao pulso, consulte as seções correspondentes abaixo.

    Observe que a migração do Pulse para o Qiskit Dynamics, como era o plano inicial após a descontinuação do Pulse, foi suspensa devido às prioridades de desenvolvimento do Qiskit Dynamics. Os usuários que desejarem usar o Qiskit Pulse como front-end para dar suporte a back-ends ou em outros casos de uso ainda poderão usá-lo nas versões do Qiskit anteriores a v2.0.0, que incluem a funcionalidade de pulso.

  • As funções sequence e schedule do módulo compiler foram removidas após sua descontinuação no Qiskit v1.3. Eles dependiam da capacidade de traduzir circuitos para componentes de pulso usando definições de back-end, um recurso que não está mais presente. Por esse motivo, elas foram removidas sem nenhuma alternativa proposta. Observe que essas remoções estão relacionadas ao pacote Pulse, que também está sendo removido no Qiskit 2.0.

Notas sobre atualização de circuitos

  • Bit e Register bem como suas subclasses não têm mais a garantia de serem comparáveis usando as verificações de is , devido a conversões de e para Python que podem realocar cada instância exposta a Python.

  • Bit e Register (e suas subclasses) não podem mais ser subclasses. Esse comportamento nunca foi planejado para ser suportado, e isso causaria um comportamento não especificado no Qiskit. Não é mais possível fazer isso como um detalhe de implementação das classes.

  • Não é mais possível criar instâncias da base Bit e Register classes. A instanciação direta dessas classes foi claramente documentada como algo que não era suportado, e a possibilidade de fazê-lo era apenas um artefato de implementação da hierarquia de classes em versões anteriores. A partir do Qiskit v2.0.0, não é mais possível fazer isso.

  • O módulo qiskit.circuit.classicalfunction foi removido após sua descontinuidade no Qiskit v1.4. Isso inclui a classe ClassicalFunction , sua função relacionada classical_function e a classe BooleanExpression . Essa alteração foi feita para remover a dependência da biblioteca tweedledum , que não é mais compatível com todas as plataformas compatíveis com o Qiskit e com as versões do Python. ClassicalFunction era usado exclusivamente em PhaseOracleque foi atualizado para aceitar apenas expressões no formato string (consulte a nota de versão a seguir). BooleanExpression foi substituída pela nova classe BitFlipOracleGate classe.

  • A classe PhaseOracle não depende mais da biblioteca tweedledum , pois a dependência não é mantida ativamente. A interface foi simplificada: ela não aceita mais o parâmetro synthesizer e o parâmetro expression só pode ser uma cadeia de caracteres. O tipo ClassicalFunction aceito anteriormente, obsoleto no Qiskit v1.4, foi removido no Qiskit v2.0.

    Apesar dessas atualizações, o uso padrão da classe PhaseOracle permanece inalterado:

    from qiskit.circuit.library.phase_oracle import PhaseOracle
    bool_expr = "(x0 & x1 | ~x2) & x4"
    oracle = PhaseOracle(bool_expr)
    oracle.draw('mpl')
    _images/release_notes-5.png

    Observe que essa alteração pode afetar a eficácia da síntese, mas foi necessária para a compatibilidade com todas as plataformas compatíveis do Qiskit e com as versões do site Python.

  • Atualizou a métrica usada para verificar as comutações em CommutationChecker. Presume-se que duas portas comutam se a fidelidade média da porta da comutação estiver acima de (1 - 1e-12). Esse valor é escolhido para levar em conta os erros de arredondamento no cálculo da fidelidade e para manter a consistência com RemoveIdentityEquivalent e TwoQubitWeylDecomposition. Consulte a documentação da classe para obter mais informações.

  • O método QuantumCircuit.measure_active() alterou o nome do registro clássico que ele cria, pois o nome anterior entrava em conflito com uma palavra reservada OpenQASM . Em vez de measure, ele agora é chamado de meas, alinhando-se com o nome de registro usado por measure_all().

  • O método DAGCircuit.control_flow_op_nodes() foi atualizado para sempre retornar uma lista, mesmo que ela esteja vazia. Anteriormente, ele retornava None se estivesse vazio e nunca retornava uma lista vazia, o que exigia um tratamento especial. Se você precisar testar explicitamente a vacuidade tanto no Qiskit v1.x quanto no v2.x, você pode fazer isso:

    control_flow_nodes = dag.control_flow_op_nodes()
    if not control_flow_nodes:
        # There are no control-flow nodes.
        pass
  • BlueprintCircuit.copy_empty_like() agora retorna um QuantumCircuit vazio com o mesmo número de qubits e clbits e os mesmos metadados que o circuito original, em vez de um BlueprintCircuit. Essa alteração aborda um comportamento inesperado em que lidar com uma cópia "vazia" de um circuito de blueprint faria com que os dados do circuito fossem reconstruídos. Observe que BlueprintCircuit.copy() ainda retorna um BlueprintCircuit. Embora BlueprintCircuit não seja uma classe pública, pois é um tipo interno usado para criar entradas legadas em qiskit.circuit.library isso afeta suas subclasses, como NLocal e ZZFeatureMap. Consulte a seção qiskit.circuit.library para obter uma lista completa das classes afetadas por essa alteração. Corrigido #13535

  • A função interna qiskit.circuit.add_control.add_control foi removida. Essa função não fazia parte da API pública, tinha pré-condições frágeis para ser mantida e era uma fonte comum de bugs. Os usos de add_control(SomeGate(...), ...) devem ser alterados para SomeGate(...).control(...) usando Gate.control() em vez disso, o que é muito mais seguro.

  • O método ParameterExpression.sympify() agora pode gerar uma exceção MissingOptionalLibrary se o sympy não estiver instalado. Nas versões do Qiskit v1.x, a instalação do sympy sempre foi garantida, mas, a partir do v2.0.0, esse não é mais um requisito obrigatório e pode ser necessário apenas se você estiver usando esse método. Como essa funcionalidade requer explicitamente o site sympy , é necessário garantir que você tenha o site sympy instalado para usar o método.

  • O argumento obsoleto DAGNode dag foi removido da classe DAGNode e de suas subclasses: DAGOpNode, DAGOutNode, e DAGInNode.

    O parâmetro dag era um argumento opcional ao construir esses objetos, mas não foi usado e foi ignorado desde a versão v1.3 e foi descontinuado desde a versão v1.4.

  • Os seguintes QuantumCircuit métodos:

    • cast
    • cbit_argument_conversion
    • cls_instances
    • cls_prefix
    • qbit_argument_conversion

    foram removidos, após sua descontinuidade no Qiskit 1.2. Esses métodos eram funções auxiliares internas e nunca tiveram a intenção de ser uma API pública. Nenhuma substituição é fornecida.

  • Os atributos obsoletos para Instruction e Gateduration e unit foram removidos, portanto, você não pode mais definir os argumentos unit ou duration para qualquer qiskit.circuit.Instruction ou subclasse. Esses atributos foram descontinuados no Qiskit v1.3.0 e foram usados para anexar uma duração de execução personalizada e uma unidade para essa duração a uma instrução individual. No entanto, a fonte de verdade da duração de um portão é o BackendV2 Targetque contém a duração de cada instrução suportada no backend. A duração de uma instrução normalmente não é ajustável pelo usuário e é uma propriedade imutável do backend. Se você já usou esse recurso para experimentar diferentes durações de porta, poderá alterar o campo InstructionProperties.duration em um determinado campo Target para definir uma duração personalizada para uma instrução em um backend. (A unidade está sempre em segundos na seção Target.)

  • O atributo obsoleto para qiskit.circuit.Instruction e Gate: condition foi removido. Essa funcionalidade foi substituída pela classe IfElseOp que pode ser usada para descrever uma condição clássica em um circuito. Esse atributo foi descontinuado na versão v1.3.0.

  • Os métodos obsoletos para Instruction e Gate: c_if e condition_bits foram removidos. Esses métodos foram descontinuados na versão v1.3.0. Essa funcionalidade foi substituída pela classe IfElseOp que pode ser usada para descrever uma condição clássica em um circuito. Por exemplo, um circuito que anteriormente usava Instruction.c_if() como:

    from qiskit.circuit import QuantumCircuit
    
    qc = QuantumCircuit(2, 2)
    qc.h(0)
    qc.x(0).c_if(0, 1)
    qc.z(1.c_if(1, 0)
    qc.measure(0, 0)
    qc.measure(1, 1)

    Pode ser reescrito como:

    qc = QuantumCircuit(2, 2)
    qc.h(0)
    with expected.if_test((expected.clbits[0], True)):
        qc.x(0)
    with expected.if_test((expected.clbits[1], False)):
        qc.z(1)
    qc.measure(0, 0)
    qc.measure(1, 1)
  • O método obsoleto InstructionSet.c_if foi removido. Esse método foi descontinuado na versão 1.3.0. Essa funcionalidade foi substituída pela classe IfElseOp que pode ser usada para descrever uma condição clássica em um circuito.

  • Como parte da remoção do Pulse no Qiskit v2.0.0, a propriedade calibrations foi removida do QuantumCircuit, DAGCircuit e DAGDependency classes. Além disso, o método has_calibration_for foi removido do QuantumCircuit e DAGCircuit e add_calibration foi removido das classes QuantumCircuit.

  • O módulo qiskit.circuit.classicalfunction foi removido. Esse módulo dependia da biblioteca tweedledum , que não é compatível com as versões mais recentes da Python. Como alternativa, o PhaseOracleGate e BitFlipOracleGate podem ser usadas para gerar circuitos a partir de expressões booleanas.

  • A representação interna de UnitaryGate quando adicionada a um QuantumCircuit foi alterada. O objeto armazenado no circuito não necessariamente compartilhará mais uma referência comum ao objeto adicionado ao circuito. Esse comportamento nunca foi garantido, e a alteração do objeto UnitaryGate diretamente ou por referência era sempre insalubre e poderia corromper o circuito, especialmente ao modificar a matriz. Se você precisar alterar um elemento no circuito (o que não é recomendado, pois é ineficiente e propenso a erros), faça algo como:

    from qiskit.circuit import QuantumCircuit
    from qiskit.quantum_info import random_unitary
    from qiskit.circuit.library import UnitaryGate
    import numpy as np
    
    qc = QuantumCircuit(2)
    qc.unitary(np.eye(2, dtype=complex))
    
    new_op = UnitaryGate(random_unitary(2))
    qc.data[0] = qc.data[0].replace(operation=new_op)

    Isso também se aplica a DAGCircuitmas você pode usar DAGCircuit.substitute_node() em vez disso.

  • O atributo CircuitInstruction.params para um atributo CircuitInstruction que contém um UnitaryGate para seu operation não conterá mais a matriz unitária subjacente para a porta. Isso ocorre porque a representação interna da porta não trata mais o objeto matriz como um parâmetro. Se precisar acessar a matriz do portão, você pode fazer isso por meio do botão CircuitInstruction.matrix ou do campo UnitaryGate.params do campo CircuitInstruction.operation.

Notas sobre a atualização dos primitivos

  • Como consequência da remoção do modelo BackendV1 , o BackendSamplerV2 e BackendEstimatorV2 não aceitam mais entradas do tipo BackendV1 em seu argumento de entrada backend .

  • As implementações primitivas do V1 e os aliases de tipo não versionados do V1-exclusive, obsoletos no Qiskit v1.2, foram removidos. Essas interfaces foram substituídas por suas contrapartes no site V2. A remoção inclui as seguintes classes que implementam as interfaces V1 :

    Assim como os seguintes aliases de tipo não versionados:

    Essa remoção NÃO afeta as definições de interface abstrata BaseEstimatorV1 e BaseSamplerV1 com versão explícita ou as classes de resultado e trabalho relacionadas, que foram mantidas para manter a compatibilidade com versões anteriores. Se estiver usando um alias V1-type não versionado, como BaseEstimator, poderá substituí-lo diretamente pelo tipo versionado (BaseEstimatorV1).

    Além disso, as seguintes funções de utilidade foram removidas. Essas funções foram usadas somente em implementações primitivas do V1 :

Notas de atualização dos fornecedores

  • O método configuration de BasicSimulator foi removido após sua descontinuação no Qiskit v1.3. Esse método retornou uma instância BackendConfiguration , uma classe que fazia parte do fluxo de trabalho descontinuado BackendV1 e também foi removida no Qiskit v2.0.0. Os elementos de configuração individuais agora podem ser recuperados diretamente do backend ou da instância Target contida (backend.target).

  • O método run_experiment de BasicSimulator foi removido. Esse método recebeu uma instância da classe QasmQobjExperiment como argumento de entrada, uma classe que está obsoleta desde o Qiskit v1.2 e foi removida com o fluxo de trabalho Qobj no Qiskit v2.0.0.

  • O modelo BackendV1 foi removido após sua descontinuidade no Qiskit 1.2.0. Isso inclui a classe BackendV1 , bem como os módulos e utilitários relacionados, pois eles foram substituídos pelo modelo BackendV2 modelo. A lista de itens removidos inclui:

    • BackendV1 classe: o núcleo do modelo removido

    • Todos os elementos em qiskit/providers/models, pois foram usados para representar componentes do modelo BackendV1 :

      • BackendConfiguration
      • BackendProperties
      • BackendStatus
      • QasmBackendConfiguration
      • PulseBackendConfiguration
      • UchannelLO
      • GateConfig
      • PulseDefaults
      • PulseQobjDef
      • Command
      • GateProperties
      • Nduv
      • JobStatus: Essa classe foi substituída pela classe mais amplamente utilizada JobStatus
      • PulseDefaults
    • BackendV2Converter classe: usada para converter de BackendV1 para BackendV2

    • convert_to_target função: usada para criar uma instância Target instância a partir de componentes legados do site BackendV1 (como BackendConfiguration ou BackendProperties)

    • BackendPropertyError e BackendConfigurationError: exceções vinculadas a classes removidas

  • O BasicSimulator backend não pode mais simular o fluxo de controle clássico. Ele só suportava o uso do .c_if()/.condition para modelar o fluxo de controle, mas essa construção foi removida do modelo de dados do Qiskit.

  • Todas as classes de backend falsas baseadas no obsoleto BackendV1 foram removidas do módulo providers.fake_provider módulo. Essas classes estão obsoletas desde o Qiskit 1.2 e faziam parte do fluxo de trabalho obsoleto BackendV1 . Seu uso em testes foi substituído pela classe GenericBackendV2 que permite criar instâncias personalizadas de BackendV2 que implementam um BackendV2.run(). A remoção afeta:

    • Classes de base:

      • FakeBackend
      • FakePulseBackend
      • FakeQasmBackend
    • Backends falsos para fins de testes especiais:

      • Fake1Q
      • FakeOpenPulse2Q
      • FakeOpenPulse3Q
    • Backends falsos herdados:

      • Fake5QV1
      • Fake20QV1
      • Fake7QPulseV1
      • Fake27QPulseV1
      • Fake127QPulseV1
  • Como parte da remoção de pulsos no Qiskit v2.0.0, os seguintes métodos foram removidos:

    • qiskit.providers.BackendV2.instruction_schedule_map
    • qiskit.providers.BackendV2.drive_channel
    • qiskit.providers.BackendV2.measure_channel
    • qiskit.providers.BackendV2.acquire_channel
    • qiskit.providers.BackendV2.control_channel
  • Como parte da remoção de pulsos no Qiskit v2.0.0, o suporte a pulsos foi removido do GenericBackendV2. Isso inclui a capacidade de inicializar o backend com calibrações personalizadas (argumentocalibrate_instructions ) e atributos de canal de pulso (drive_channel, measure_channel, acquire_channel, control_channel).

  • Removidas as classes básicas abstratas Provider e ProviderV1, que foram descontinuadas desde o Qiskit v1.1.0. A abstração fornecida por essas definições de interface não estava oferecendo valor significativo, incluindo apenas os atributos name, backends e um método get_backend() .

    Um provedor, como conceito, continuará existindo como uma coleção de back-ends. Se você estiver implementando um provedor no momento, poderá ajustar seu código simplesmente removendo ProviderV1 como a classe principal da sua implementação.

    Como parte dessa alteração, você provavelmente desejará adicionar uma implementação do get_backend para compatibilidade com versões anteriores. Por exemplo:

    def get_backend(self, name=None, **kwargs):
      backend = self.backends(name, **kwargs)
      if len(backends) > 1:
        raise QiskitBackendNotFoundError("More than one backend matches the criteria")
      if not backends:
        raise QiskitBackendNotFoundError("No backend matches the criteria")
      return backends[0]

Notas de atualização do QPY

  • A função qpy.load() agora pode gerar uma exceção MissingOptionalLibrary se uma carga útil QPY v10, v11 ou v12 for passada usando expressões simbólicas symengine e symengine não estiver instalado. A exceção também será levantada se o sympy não estiver instalado para qualquer outra carga útil do QPY antes do v13. Nas versões do Qiskit v1.x, symengine e sympy sempre tiveram a garantia de serem instaladas. No entanto, a partir de v2.x, esse não é mais um requisito obrigatório e pode ser necessário apenas se você estiver desserializando um arquivo QPY que foi gerado usando symengine. A análise desses payloads QPY requer symengine , pois seu uso faz parte da especificação de formato para QPY v10, v11 e v12. Se a carga útil exigir isso, a única opção é instalar uma versão compatível do symengine (0.11.0 ou 0.13.0). Da mesma forma, o site sympy foi usado para ParameterExpression codificação para todas as versões 1 a 12 do QPY.

  • A versão mínima de compatibilidade do QPY, QPY_COMPATIBILITY_VERSIONfoi aumentada de 10 (o requisito da versão v1.x ) para 13. Essa versão controla a versão mínima do QPY que pode ser emitida pela função qpy.dump() função. Isso significa que qpy.dump() só pode emitir QPY v13 e v14 nesta versão. O QPY v13 ainda é compatível com o Qiskit v1.3.x e v1.4.x, o que significa que as cargas úteis geradas no Qiskit v2.x com o QPY v13 ainda podem ser carregadas com a série de versões do Qiskit v1.x.

    Essa alteração foi necessária porque as versões 10 a 12 do QPY exigem as bibliotecas sympy ou symengine para gerar uma serialização para objetos ParameterExpression mas no Qiskit 2.x nenhuma das bibliotecas é necessária para o objeto ParameterExpression objeto.

  • Com a remoção do pulse no Qiskit v2.0.0, o suporte à serialização de programas ScheduleBlock por meio da função qiskit.qpy.dump() foi removido. Os usuários ainda podem carregar cargas úteis que contenham portas de pulso usando a função qiskit.qpy.load() no entanto, elas serão tratadas como instruções personalizadas opacas. O carregamento de ScheduleBlock payloads não é mais suportado e causará uma QpyError exceção.

Notas sobre a atualização da síntese

  • O argumento atomic_evolution chamável de ProductFormula (e suas subclasses QDrift, LieTrotter, e SuzukiTrotter ) tem uma nova assinatura de função. A assinatura antiga pegava um operador Pauli e um coeficiente de tempo e retornava o circuito de evolução:

    def atomic_evolution(pauli_op: SparsePauliOp, time: float) -> QuantumCircuit:
      evol_circuit = QuantumCircuit(pauli_op.num_qubits)
      # append operators to circuit
      return evol_circuit

    A nova assinatura pega diretamente um circuito existente e deve anexar a evolução do Pauli fornecido e o tempo dado a esse circuito:

    def atomic_evolution(evol_circuit: QuantumCircuit, pauli_op: SparsePauliOp, time: float):
      # append operators to circuit, in-place modification

    Essa nova implementação se beneficia de um desempenho significativamente melhor.

Notas sobre a atualização do Transpiler

  • Aumento do limite mínimo para quando as portas são consideradas a identidade em RemoveIdentityEquivalent de épsilon de máquina para 1e-12 para levar em conta os erros de arredondamento no cálculo da fidelidade e para manter a consistência com as outras classes, como CommutationAnalysis e TwoQubitWeylDecomposition.

  • O nome de estágio do plug-in de roteamento default agora está reservado para o plug-in incorporado do Qiskit com o mesmo nome.

  • O estágio do plugin de roteamento padrão agora é "default". No Qiskit v2.0.0, isso é simplesmente um alias para o padrão anterior "sabre". O algoritmo padrão subjacente pode mudar no decorrer da série de versões do Qiskit v2.x para alguns ou todos os alvos, mas você sempre pode definir explicitamente routing_method="sabre" para manter o comportamento atual.

  • O nome de estágio do plug-in de tradução default agora está reservado para o plug-in incorporado do Qiskit com o mesmo nome.

  • O estágio do plugin de tradução padrão agora é "default". No Qiskit 2.0, isso é simplesmente um alias para o padrão anterior "translator". O algoritmo padrão subjacente pode mudar no decorrer da série Qiskit 2.x para alguns ou todos os alvos, mas você sempre pode definir explicitamente translation_method="translator" para manter o comportamento atual.

  • Os passes de agendamento herdados ASAPSchedule, ALAPSchedule, DynamicalDecoupling e AlignMeasures foram removidos em favor das alternativas atualizadas ALAPScheduleAnalysis, ASAPScheduleAnalysis, PadDynamicalDecoupling, e ConstrainedReschedule respectivamente. Eles foram descontinuados no Qiskit v1.1 depois que o novo fluxo de trabalho de agendamento substituiu o legado.

  • Caso não seja especificado nem um target nem um conjunto de basis_gates , a passagem do HighLevelSynthesis sintetiza circuitos com operações anotadas com menos camadas de invólucros do que antes (isso acontece, por exemplo, para o circuito produzido por multiplier_cumulative_h18()).

  • O argumento da palavra-chave property_set agora é reservado em BasePassManager.run()e não pode ser usado como um kwarg que será encaminhado para a conversão da subclasse da representação front-end para a representação interna.

  • Os seguintes usos obsoletos do objeto BackendProperties no pipeline de transpilação foram removidos no Qiskit 2.0:

    Os passes a seguir também foram atualizados para aceitar apenas um target em vez de:

    A classe BackendProperties foi descontinuada desde o Qiskit v1.2, porque fazia parte do fluxo de trabalho BackendV1 . Propriedades específicas da instrução, como erros de porta ou durações, podem ser adicionadas a um Target na construção por meio do método Target.add_instruction() e comunicadas às passagens relevantes do transpilador por meio do argumento de entrada target .

  • Como consequência da remoção do modelo BackendV1 , os tipos de entrada aceitos dos seguintes objetos do transpilador foram atualizados:

  • A passagem do ResetAfterMeasureSimplification transpiler pass agora usa um IfElseOp para condicionar a execução do XGate em vez de definir um atributo condition no portão. Isso ocorre porque o atributo condition foi removido do modelo de dados do Qiskit.

  • A passagem obsoleta do transpilador ConvertConditionsToIfOps foi removida. O atributo condition subjacente de Instruction foi removido, de modo que essa passagem do transpilador não tinha mais nada para converter. Em vez disso, você deve usar diretamente IfElseOp para condicionar classicamente a execução de uma operação.

  • O PadDelay e PadDynamicalDecoupling agora exigem um novo argumento quando construídos. Os endereços target ou durations precisam ser especificados com um Target ou InstructionDurations respectivamente. Sem isso, as passagens não podem determinar a duração das instruções no circuito e causarão erros. Anteriormente, esses passes determinavam esses valores a partir do atributo duration , agora removido, dos Instruction objetos.

  • A passagem do transpilador AlignMeasures , anteriormente obsoleta, foi removida. Essa passagem foi descontinuada no Qiskit v1.1.0. Em vez disso, o ConstrainedReschedule deve ser usado. ConstrainedReschedule executa a mesma função e também suporta o alinhamento a restrições de tempo adicionais.

  • Ao programar usando generate_preset_pass_manager() ou transpile()se o argumento instruction_durations for especificado, as durações serão formatadas como list, e estarão em unidades de dt. Você também deve definir o argumento de entrada dt da função de transpilação.

  • Removido o atributo obsoleto DAGNode.sort_key. Esse atributo foi preterido na versão do Qiskit v1.4.0. Como a classificação topológica lexicográfica é feita internamente no Rust e o atributo sort key não era usado, esse atributo foi removido para evitar a sobrecarga da criação do nó DAG. Se você se baseou na chave de classificação, pode reproduzi-la em um determinado nó usando algo como:

    def get_sort_key(node: DAGNode):
        if isinstance(node, (DAGInNode, DAGOutNode)):
            return str(node.wire)
        return ",".join(
            f"{dag.find_bit(q).index:04d}" for q in itertools.chain(node.qargs, node.cargs)
        )
  • O seguinte transpile() e generate_preset_pass_manager() argumentos de entrada, obsoletos desde o Qiskit 1.3, foram removidos da API:

    • instruction_durations
    • timing_constraints

    Além disso, a especificação de portas de base personalizadas por meio do argumento basis gate de transpile() e generate_preset_pass_manager()também obsoleto no Qiskit 1.3, não é mais permitido, e um ValueError será gerado nesses casos.

    As informações anteriormente fornecidas por meio deles ainda podem ser especificadas por meio dos argumentos backend ou target . Você pode criar uma instância Target com durações de instrução definidas:

    Target.from_configuration(..., instruction_durations=...)

    Para restrições específicas de tempo:

    Target.from_configuration(..., timing_constraints=...)

    E para portas de base personalizadas, você pode adicioná-las manualmente ao destino ou usar o site .from_configuration com um mapeamento de nome personalizado, por exemplo:

    from qiskit.circuit.library import XGate
    from qiskit.transpiler.target import Target
    
    basis_gates = ["my_x", "cx"]
    custom_name_mapping = {"my_x": XGate()}
    target = Target.from_configuration(
        basis_gates=basis_gates, num_qubits=2, custom_name_mapping=custom_name_mapping
    )
  • O transpile() e generate_preset_pass_manager() agora geram um UserWarning ao fornecer um coupling_map e/ou basis_gates junto com um backend. Nesses casos, há várias fontes de verdade, as intenções do usuário nem sempre são claras e pode haver conflitos que generate_preset_pass_manager() o usuário pode não saber como resolver. A alternativa sugerida é definir um alvo personalizado que combine as restrições escolhidas.

    Uma dessas situações é a especificação de uma porta com 3 ou mais qubits em backend ou basis_gates juntamente com um coupling_map personalizado. O mapa de acoplamento não fornece os detalhes de conectividade necessários para determinar a ação do portão. Nesses casos, transpile() e generate_preset_pass_manager() agora levantam um ValueError.

  • Como parte da remoção do pulso no Qiskit 2.0, todas as funcionalidades relacionadas a pulso e calibração no transpilador foram removidas.

    Os seguintes passes e funções foram removidos:

    • qiskit.transpiler.passes.PulseGates aprovado
    • qiskit.transpiler.passes.ValidatePulseGates aprovado
    • qiskit.transpiler.passes.RXCalibrationBuilder aprovado
    • qiskit.transpiler.passes.RZXCalibrationBuilder aprovado
    • qiskit.transpiler.passes.RZXCalibrationBuilderNoEcho aprovado
    • qiskit.transpiler.passes.EchoRZXWeylDecomposition aprovado
    • qiskit.transpiler.passes.NoramlizeRXAngle aprovado
    • qiskit.transpiler.passes.rzx_templates() function

    O argumento inst_map foi removido dos seguintes elementos:

    O suporte à calibração foi removido:

    • calibration foi removido do construtor InstructionProperties construtor e não é mais uma propriedade dessa classe.
    • Os métodos has_calibration, get_calibration, instruction_schedule_map e update_from_instruction_schedule_map foram removidos da Target classe.
  • A passagem obsoleta do transpilador StochasticSwap e seu plug-in de estágio de roteamento integrado associado "stochastic" foram removidos. Eles foram marcados como obsoletos na versão do Qiskit v1.3.0. A passagem foi substituída pela classe SabreSwap que deve ser usada em seu lugar, pois oferece melhor desempenho e qualidade de saída. Por exemplo, se a passagem foi invocada anteriormente por meio da função transpile, como:

    from qiskit import transpile
    from qiskit.circuit import QuantumCircuit
    from qiskit.transpiler import CouplingMap
    from qiskit.providers.fake_provider import GenericBackendV2
    
    
    qc = QuantumCircuit(4)
    qc.h(0)
    qc.cx(0, range(1, 4))
    qc.measure_all()
    
    cmap = CouplingMap.from_heavy_hex(3)
    backend = GenericBackendV2(num_qubits=cmap.size(), coupling_map=cmap)
    
    tqc = transpile(
        qc,
        routing_method="stochastic",
        layout_method="dense",
        seed_transpiler=12342,
        target=backend.target
    )

    isso deve ser substituído por:

    tqc = transpile(
        qc,
        routing_method="sabre",
        layout_method="dense",
        seed_transpiler=12342,
        target=backend.target
    )
  • O passe qiskit.transpiler.passes.CXCancellation foi removido. Ele foi preterido em favor do class:.InverseCancellation,, que é mais genérico. CXCancellation() é totalmente equivalente semanticamente a InverseCancellation([CXGate()]).

  • A passagem do SolovayKitaev não levanta mais uma exceção em circuitos que contêm operações de um único qubit sem um método to_matrix (como medidas, barreiras e operações de fluxo de controle) ou operações de um único qubit parametrizadas, mas as deixa inalteradas.

  • Os plug-ins para o estágio de tradução dos gerenciadores de passagem predefinidos agora precisam respeitar a Target a direcionalidade da porta em sua saída. Anteriormente, transpile() e generate_preset_pass_manager() geraria um PassManager que continha passes de correção, se necessário. Agora você deve incluí-los em seu próprio estágio personalizado, se o seu estágio não garantir que ele respeite a direcionalidade.

    Você pode usar o GateDirection para realizar os mesmos reparos que o Qiskit costumava fazer. Por exemplo:

    from qiskit.transpiler import PassManager
    from qiskit.transpiler.passes import GateDirection
    from qiskit.transpiler.preset_passmanagers.plugin import PassManagerStagePlugin
    
    class YourTranslationPlugin(PassManagerStagePlugin):
        def pass_manager(self, pass_manager_config, optimization_level):
            pm = PassManager([
                # ... whatever your current setup is ...
            ])
            # Add the two-qubit directionality-fixing pass.
            pm.append(GateDirection(
                pass_manager_config.coupling_map,
                pass_manager_config.target,
            ))
            return pm
  • Os gerenciadores de passagem predefinidos não preenchem mais o estágio pre_optimization implícito de sua saída StagedPassManager. Agora você pode atribuir com segurança seu próprio PassManager a esse campo. Anteriormente, você só podia anexar ao arquivo PassManager.

  • O valor padrão para o argumento generate_routing_passmanager() argumento seed_transpiler foi alterado de None para -1. Essa alteração foi feita porque esse sinalizador foi usado apenas para configurar a passagem do VF2PostLayout e, para essa passagem, a randomização normalmente prejudica o desempenho e não é desejável. Se você confiou no valor padrão anterior, poderá restaurar esse comportamento definindo explicitamente o argumento seed_transpiler=None. Se você estiver definindo explicitamente um valor inicial para esse parâmetro, não haverá alteração no comportamento.

Notas sobre a atualização da visualização

  • O parâmetro idle_wires em todas as gavetas de circuito foi ampliado com uma nova opção, "auto", que agora é o comportamento padrão. Se você ainda quiser exibir os fios sem instruções, defina explicitamente idle_wires=True.

    Quando definido como "auto", o comportamento é o seguinte:

    • Se o circuito tiver um atributo .layout definido, idle_wires será automaticamente definido como False (ocultando fios ociosos)
    • Caso contrário, o site idle_wires permanecerá True (mostrando todos os fios, como era o padrão anterior)

    O exemplo a seguir mostra um circuito sem um layout exibido por meio do site idle_wires="auto":

    qr_0: ────────
          ┌───┐┌─┐
    qr_1: ┤ H ├┤M├
          └───┘└╥┘
    cr_0: ══════╬═
    
    cr_1: ══════╩═

    Depois que um layout é aplicado, idle_wires="auto" define idle_wires para False, ocultando os fios ociosos:

              ┌───┐┌─┐
    qr_1 -> 1 ┤ H ├┤M├
              └───┘└╥┘
        cr_1: ══════╩═

    Se quiser exibir todos os fios em um circuito disposto, defina explicitamente idle_wires=True :

         qr_0 -> 0 ────────
                   ┌───┐┌─┐
         qr_1 -> 1 ┤ H ├┤M├
                   └───┘└╥┘
    ancilla_0 -> 2 ──────╫─
    
             cr_0: ══════╬═
    
             cr_1: ══════╩═

    À medida que os computadores quânticos são dimensionados para mais qubits, até mesmo circuitos pequenos podem produzir representações de circuitos grandes após a transpilação. A configuração "auto" ajuda a melhorar a legibilidade, ocultando fios desnecessários quando possível.

  • A função array_to_latex() função e o método Operator.draw() agora podem gerar uma exceção MissingOptionalLibrary se a biblioteca sympy não estiver instalada. Nas versões do Qiskit v1.x, symengine e sympy sempre tiveram a garantia de serem instaladas, mas a partir de v2.0.0, isso não é mais um requisito rígido. A visualização LaTeX para uma matriz depende da biblioteca sympy , portanto, se você estiver usando essa funcionalidade, certifique-se de ter o sympy instalado.

  • Como consequência da remoção do modelo BackendV1 , o plot_gate_map(), plot_error_map() e plot_circuit_layout() não aceitam mais entradas do tipo BackendV1 em seu argumento de entrada backend .

  • A gaveta da linha do tempo agora exige que o argumento target seja especificado quando chamado. Como as instruções não contêm mais atributos de duração, esse argumento extra é necessário para especificar as durações de todas as instruções compatíveis. Sem o argumento, a gaveta da linha do tempo não tem acesso a essas informações.

  • Como parte da remoção do Pulse no Qiskit 2.0, o suporte para desenho de pulso via qiskit.visualization.pulse_drawer foi removido.

Páginas Notas da Atualização

  • Os decoradores deprecate_function e deprecate_arguments , obsoletos desde o Qiskit v0.24 (maio de 2023), foram removidos no Qiskit v2.0.0. O atual deprecate_func() atual substitui @deprecate_function e o atual deprecate_arg() substitui @deprecate_arguments.

  • A função assemble e os recursos relacionados (contidos no módulo assembler ) foram removidos da base de código após sua descontinuidade no Qiskit v1.2. assemble foi usado para gerar um Qobj no contexto do fluxo de trabalho BackendV1 obsoleto. A conversão não é mais necessária, pois o pipeline de transpilação e primitivos lida diretamente com os circuitos quânticos, tornando o Qobj obsoleto.

    A remoção inclui os seguintes componentes de API pública:

    • qiskit.compiler.assemble function
    • qiskit.assembler.assemble_circuits function
    • qiskit.assembler.assemble_schedules function
    • qiskit.assembler.disassemble function
    • qiskit.assembler.RunConfig classe
    • método qiskit.circuit.Instruction.assemble
  • A estrutura Qobj e as classes relacionadas, obsoletas no Qiskit v1.2.0, foram removidas. Eles foram introduzidos como parte do fluxo de trabalho BackendV1 e não são mais necessários para interagir com BackendV2 backends. Essa remoção afeta as seguintes classes:

    • QobjExperimentHeader
    • QobjHeader
    • QasmQobj
    • QasmQobjInstruction
    • QasmQobjExperimentConfig
    • QasmQobjExperiment
    • QasmQobjConfig
    • QasmExperimentCalibrations
    • GateCalibration
    • PulseQobj
    • PulseQobjInstruction
    • PulseQobjExperimentConfig
    • PulseQobjExperiment
    • PulseQobjConfig
    • QobjMeasurementOption
    • PulseLibraryItem
  • As classes MeasLevel e MeasReturnType , anteriormente definidas em qobj/utils.py, foram migradas para result/models.py após a remoção do módulo qobj . Essas classes não faziam parte da API pública. O caminho de importação foi atualizado de: from qiskit.qobj.utils import MeasLevel, MeasReturnType para: from qiskit.result import MeasLevel, MeasReturnType.

  • O uso de argumentos posicionais no construtor de Result foi desativado. Defina todos os argumentos usando a sintaxe kwarg, ou seja: Result(backend_name="name", ....). Além disso, o argumento qobj_id não será mais usado na construção dos Result internos. Ainda é possível definir qobj_id como um kwarg genérico, que aparecerá no campo de metadados com os outros kwargs genéricos.

  • Como parte da remoção de pulsos no Qiskit 2.0.0, as funções sequence e schedule_circuit de qiskit.scheduler , juntamente com a classe ScheduleConfig , foram removidas.

  • O módulo qiskit.result.mitigation foi removido após sua descontinuidade no Qiskit v1.3. A remoção inclui as classes LocalReadoutMitigator e CorrelatedReadoutMitigator , bem como os utilitários associados. Não há caminho alternativo no Qiskit, pois sua funcionalidade foi substituída pelo complemento `mthree . <https://github.com/Qiskit/qiskit-addon-mthree> `__

Circuitos obsoletos

  • O atributo obsoleto QuantumCircuit.duration não foi removido nesta versão como planejado originalmente. Em vez disso, ele será removido como parte da versão do Qiskit v3.0.0. Essa funcionalidade foi substituída pelo método QuantumCircuit.estimate_duration() que deve ser usado em seu lugar.

  • A interface obsoleta do tipo tupla para CircuitInstruction não foi removida nesta versão como planejado originalmente. Em vez disso, ele será removido no Qiskit v3.0.0. Em vez disso, use o operation, qubits, e clbits atributos nomeados.

  • A classe de circuito Multiple-Control-Multiple-Target MCMT agora está obsoleta e foi substituída por MCMTGateque é uma subclasse Gate adequada. O uso de uma porta em vez de um circuito permite que o compilador raciocine sobre o objeto em um nível mais alto de abstração e permite a aplicação de vários plug-ins de síntese.

Depreciações do Transpiler

  • O atributo obsoleto DAGCircuit.duration não foi removido nesta versão como planejado originalmente. Em vez disso, ele será removido como parte da versão do Qiskit v3.0.0. Essa funcionalidade foi substituída pelo método QuantumCircuit.estimate_duration() que deve ser usado em seu lugar.

  • O argumento propagate_condition de DAGCircuit.substitute_node() e DAGCircuit.substitute_node_with_dag() foi descontinuado. Com a remoção do Instruction.condition do modelo de dados do Qiskit, essa opção não tem mais utilidade. Se estiver definido, ele não terá mais efeito. Ele não é removido da assinatura para manter a compatibilidade durante a migração do Qiskit 1.x -> 2.0. Essa opção será removida no Qiskit 3.0.

  • A função generate_pre_op_passmanager() está obsoleta. Ele não é mais usado nos gerenciadores de passagem de predefinição do Qiskit e sua finalidade não existe mais; originalmente, ele gerava um estágio de correção para plug-ins de tradução que não respeitavam a direcionalidade do ISA. Agora é necessário que os estágios de tradução respeitem a direcionalidade, portanto, a funcionalidade não é necessária e, muito provavelmente, não será necessário substituí-la.

Problemas de segurança

  • Foi corrigida uma vulnerabilidade de segurança no qpy.load() ao carregar cargas úteis que usam sympy para serializar ParameterExpression objetos e outras expressões simbólicas. Isso inclui potencialmente qualquer carga útil do QPY usando a versão < 10 do QPY e, opcionalmente, 10, 11 e 12, dependendo da codificação simbólica usada na etapa de serialização (qpy.dump()).

Correções de bugs

  • Foi corrigida uma inconsistência no processo de transpilação ao lidar com portas próximas à identidade, em que essas portas eram avaliadas para comutar com tudo por CommutationAnalysismas não eram removidas por RemoveIdentityEquivalent. O problema subjacente foi causado por RemoveIdentityEquivalent e CommutationAnalysis (e, por extensão, CommutativeInverseCancellation) usando métricas diferentes. Ambos agora usam a fidelidade média da porta e o mesmo limite para avaliar se uma porta deve ser tratada como identidade (como uma porta de rotação com ângulo muito pequeno). Consulte a documentação dessas classes para obter mais informações. Corrigido #13547.

  • Foi corrigido um erro no QuantumCircuit.assign_parameters()que ocorria ao atribuir parâmetros a portas padrão cuja definição já havia sido acionada. Nesse caso, os novos valores não foram propagados corretamente para as instâncias do portão. Embora o circuito em si ainda tenha sido compilado conforme o esperado, a inspeção das operações individuais ainda mostraria o parâmetro antigo.

    Por exemplo:

    from qiskit.circuit.library import EfficientSU2
    
    circuit = EfficientSU2(2, flatten=True)
    circuit.assign_parameters([1.25] * circuit.num_parameters, inplace=True)
    print(circuit.data[0].operation.params)  # would print θ[0] instead of 1.25

    Corrigido #13478.

  • Foi corrigido um bug no DAGCircuit que fazia com que os nós de saída Var se tornassem nós de entrada durante deepcopy e a decapagem.

  • Foi corrigido um descuido na classe Target em que a definição de um novo valor para o atributo dt e a chamada subsequente para target.durations() não mostrava o valor atualizado de dt no objeto InstructionDurations retornado. Isso agora foi corrigido por meio de uma invalidação do cache interno de durações de instruções de destino no definidor dt .

  • Foi corrigido um problema na passagem do BasisTranslator em que a fase global do DAG não era atualizada corretamente. Corrigido #14074.

  • Foi corrigido um bug na passagem do HighLevelSynthesis em que ele sintetizava qualquer instrução para a qual um plug-in de síntese estivesse disponível, independentemente de a instrução já ser compatível com o destino ou fazer parte da passagem explícita basis_gates. Esse comportamento foi corrigido, de modo que essas instruções já suportadas não são mais sintetizadas.

  • A InverseCancellation passa a ser executada dentro de blocos de fluxo de controle. Anteriormente, ele ignorava pares de portas que podiam ser canceladas quando eram definidas dentro de blocos clássicos. Consulte #13437 para obter mais detalhes.

  • Foi corrigido um bug com rotações multicontroladas em que o ângulo de rotação era um ParameterExpression. A tentativa de síntese nesse caso levaria a um erro informando que a porta não pode ser sintetizada com um parâmetro não vinculado. Esse bug afetava os métodos de circuito de rotação multicontrolada QuantumCircuit.mcrx(), :meth:.QuantumCircuit.mcry, e QuantumCircuit.mcrz()bem como ao chamar RXGate.control(), RYGate.control(), ou RZGate.control() quando o ângulo de rotação era um ParameterExpression. Agora, esses circuitos de rotação multicontrolados podem ser sintetizados sem gerar erros.

  • Foi corrigido um bug no QPY (qiskit.qpy) em que os circuitos contendo portas da classe MCMTGate não conseguiam ser serializados. Consulte #13965.

  • Foi corrigido um bug que fazia com que o Statevector.expectation_value() produzisse resultados incorretos para o operador de identidade quando o vetor de estado não era normalizado. Corrigido #13029

  • A conversão de um circuito quântico em uma porta com converters.circuit_to_instruction() agora falha corretamente quando o circuito fornecido contém instruções de fluxo de controle.

  • Chamando um AnalysisPass ou um TransformationPass como uma função (como em pass_ = MyPass(); pass_(qc)) agora respeitará todos os requisitos que a passagem possa ter. Por exemplo, as passagens de agendamento, como ALAPScheduleAnalysis exigem que TimeUnitConversion seja executado antes deles. A execução da passagem usando um PassManager sempre respeitou esse requisito, mas, até agora, ele não era respeitado ao chamar a passagem diretamente.

  • Quando uma TranspilerError é levantada por uma passagem dentro de uma chamada para PassManger.run(), a exceção agora será propagada sem perdas, em vez de se tornar uma exceção encadeada com um tipo apagado.

  • SabreSwap não mais contrairá fios de qubit ociosos fora dos blocos de fluxo de controle durante o roteamento. Em geral, essa era uma otimização válida, mas não era um efeito colateral esperado de uma passagem de roteamento. Agora você pode usar o passe ContractIdleWiresInControlFlow para realizar essa contração.

  • Correção de um não determinismo baseado em processo em SparsePauliOp.to_matrix. A ordem exata das operações de ponto flutuante na soma variava anteriormente por processo, mas agora será idêntica entre diferentes invocações do mesmo script. Consulte #13413.

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