Skip to main content
IBM Quantum Platform

Notas de versão do Qiskit 0.43


0.43.3

Terra 0.24.2

Prelúdio

O Qiskit Terra 0.24.2 é uma versão de correção de bugs, que aborda alguns problemas menores identificados desde a versão 0.24.1.

Notas da Atualização

  • A versão do formato QPY emitida por dump aumentou para 8. Essa nova versão do formato adiciona suporte à serialização do atributo QuantumCircuit.layout atributo.

Correções de bugs

  • Foi corrigida a desserialização de instâncias DiagonalGate instâncias por meio do QPY. Corrigido #10364

  • Foi corrigido um problema com a função qs_decomposition() , que faz a decomposição quântica de Shannon. Quando ela era chamada em unidades numéricas triviais que não se beneficiam dessa decomposição, era gerado um erro inesperado. Esse erro foi corrigido para que essas unidades sejam detectadas e o circuito equivalente seja retornado. Corrigido #10036

  • Foi corrigido um problema na classe BasicSwap que impedia o funcionamento do método BasicSwap.run() funcionasse se o argumento da palavra-chave fake_run fosse definido como True quando a classe fosse instanciada. Corrigido #10147

  • Foi corrigido um problema com a cópia de circuitos com o novo estilo Clbits e Qubits (bits sem registros) em que as referências a esses bits do circuito que os contém podiam ser quebradas, causando problemas com a serialização e a visualização do circuito. Corrigido #10409

  • A passagem do CheckMap não apresentará mais erros falsos ao lidar com estruturas condicionais aninhadas criadas pela interface do construtor de fluxo de controle. Consulte #10394.

  • Foi corrigida uma falha do Pulse Builder quando o contexto é inicializado com BackendV2.

  • Fixou a saída do pulso measure() e measure_all() quando as funções são chamadas com o backend BackendV2 backend.

  • Corrigiu as dimensões da matriz de densidade de saída de DensityMatrix.partial_transpose() para que correspondam às dimensões da matriz de densidade de entrada correspondente.

  • A importação qiskit.primitives não causará mais avisos de depreciação decorrentes do módulo qiskit.opflow depreciado. Esses avisos teriam sido ocultados para os usuários pelos filtros padrão do site Python, mas acionaram a importação ansiosa de opflowo que significa que uma importação subsequente por um usuário não acionaria os avisos. Corrigido #10245

  • Foi corrigida a saída OpenQASM 2 de QuantumCircuit.qasm() quando um objeto de portão personalizado continha um portão com o mesmo nome. O ideal é que isso não aconteça na maioria das portas, mas operações algorítmicas complexas, como a classe GroverOperator podem produzir tais estruturas acidentalmente. Consulte #10162.

  • Foi corrigida uma regressão na gaveta LaTeX do QuantumCircuit.draw() quando os arquivos temporários são colocados em um sistema de arquivos separado do diretório de trabalho. Consulte #10211.

  • Foi corrigido um problema com o UnitarySynthesis ao usar o parâmetro target , em que os circuitos com fluxo de controle não eram mapeados corretamente para o destino.

  • Corrigido o erro em VQD em que result.optimal_values era uma cópia de result.optimal_points. Agora, ele retorna os valores correspondentes. Corrigido #10263

  • Foram aprimoradas as mensagens de erro retornadas quando uma tentativa de converter uma expressão totalmente vinculada ParameterExpression em um float ou int concreto falhava, por exemplo, porque a expressão era naturalmente um número complexo. Corrigido #9187

  • Corrigido float conversões para ParameterExpression que tinham, em algum momento de seu histórico de construção, um componente imaginário que foi posteriormente cancelado. Ao usar o Sympy como back-end, essas conversões geralmente já funcionam. Ao usar o Symengine como back-end, essas conversões frequentemente falhavam com erros de tipo, apesar de o resultado ter sido avaliado simbolicamente como real e ParameterExpression.is_real() ser verdadeiro. Corrigido #10191

  • Corrigida a qpy serialização de QuantumCircuit.layout attribue. Anteriormente, o atributo layout teria sido descartado ao serializar um circuito para o QPY. Corrigido #10112

Aer 0.12.2

Prelúdio

O Qiskit Aer 0.12.2 é a segunda versão do patch para 0.12.0. Isso corrige alguns erros que foram descobertos desde o lançamento do site 0.12.1.

Notas da Atualização

  • O Qiskit Aer agora requer a versão CUDA do simulador de GPU para 11.2 ou superior. Anteriormente, a CUDA 10.1 era a versão mínima suportada. Essa alteração foi necessária devido às mudanças no ecossistema CUDA upstream, incluindo o suporte a cuQuantum. Para dar suporte aos usuários que executam diferentes versões do CUDA, agora há um pacote separado disponível para execução com CUDA 11: qiskit-aer-gpu-cu11 e o uso do pacote qiskit-aer-gpu agora requer CUDA 12. Se você já é usuário do pacote qiskit-aer-gpu e deseja usar o CUDA 11, será necessário executar:

    pip uninstall qiskit-aer-gpu && pip install -U qiskit-aer-gpu-cu11

    para sair das versões anteriores do pacote qiskit-aer-gpu compatíveis com CUDA 10.x e atualizar para o novo pacote compatível com CUDA 11. Se você já estiver executando o CUDA 12 localmente, poderá atualizar o pacote qiskit-aer-gpu normalmente.

Correções de bugs

  • Se um circuito tiver parâmetros e condicionais, o circuito não será simulado corretamente porque os vínculos de parâmetros do Aer usaram posições erradas para aplicar os parâmetros. Isso se deve à falta de consideração das operações bfunc injetadas pela condicional. Com esse commit, os parâmetros são definidos para as posições corretas, levando em consideração as operações bfun injetadas.

  • Os parâmetros das fases globais não foram definidos corretamente em #1814. https://github.com/Qiskit/qiskit-aer/pull/1814 Os valores dos parâmetros das fases globais foram copiados para um circuito modelo e não para os circuitos reais a serem simulados. Essa confirmação copia corretamente os valores dos parâmetros para os circuitos a serem simulados.

  • Os resultados de backend.run() não eram serializáveis porque incluíam AerCircuits. Esse commit torna os resultados serializáveis, removendo AerCircuits dos metadados.

  • :meth:QuantumCircuit.save_statevector() não funciona se o circuito for gerado a partir do texto OpenQASM3 porque seus registros quânticos têm instâncias de qubit duplicadas. Com esse commit, o :meth:QuantumCircuit.save_statevector() usa o :data:QuantumCircuit.qubits para obter os qubits a serem salvos.

IBM 0.20.2

Nenhuma alteração.


0.43.2

Como lembrete, a inclusão do Qiskit Aer no pacote qiskit está obsoleta. A próxima versão secundária do Qiskit Aer ( 0.13 ) não será incluída em nenhum lançamento do pacote qiskit , e você deve começar imediatamente a instalar o Aer separadamente:

pip install qiskit-aer

e importando-o como:

import qiskit_aer

A partir do Qiskit 0.44, o comando pip install qiskit não instalará mais o Qiskit Aer ou o obsoleto provedor IBM Q, que já foi substituído pelo novo provedor IBM.

Terra 0.24.1

Nenhuma mudança

Aer 0.12.1

Prelúdio

O Qiskit Aer 0.12.1 é a primeira versão do patch para 0.12.0. Isso corrige alguns erros que foram descobertos desde o lançamento do site 0.12.0.

Problemas Conhecidos

  • Correção de um bug que retorna valores de expectativa incorretos em Estimator quando abelian_grouping=True.

Notas da Atualização

  • Desempenho aprimorado quando os mesmos circuitos e vários parâmetros são passados para Estimator com approximation=True.

Notas de descontinuação

  • As opções de meth:~.AerSimulator.run precisam usar os tipos corretos.

Correções de bugs

  • A regressão de desempenho devido à introdução do AER::Config foi corrigida. Essa classe tem muitos campos, mas é frequentemente copiada em AER::Transpile::CircuitOptimization. Originalmente, o json_t (antiga classe para configuração) também era copiado com frequência, mas ele tem entradas na maioria dos casos e, portanto, essa sobrecarga de cópia não é um problema. Com essa correção, o AER::Transpile::CircuitOptimization não copia o AER::Config.

  • Quando há falha nas chamadas BLAS, como os threads omp não tratam exceções, o Aer falha sem nenhuma mensagem de erro. Essa correção é para que os threads omp capturem exceções corretamente e as lancem novamente fora dos loops omp.

  • Anteriormente, os parâmetros das portas não eram validados em C++. Se os parâmetros forem mais curtos do que o esperado (devido à porta personalizada), serão lançadas falhas de segmentação. Esse commit adiciona verificações para saber se o comprimento do parâmetro é expirado. Esse commit corrigirá os problemas relatados em #1612. https://github.com/Qiskit/qiskit-aer/issues/1612

  • Desde 0.12.0, os valores dos parâmetros nos circuitos são temporariamente substituídos por valores constantes e os valores dos parâmetros são atribuídos na biblioteca C++. Portanto, se parameter_binds for especificado, o simulador retornará resultados com os valores constantes como valores de parâmetro. Com esse commit, o Aer gera um erro se parameter_binds não for especificado, embora os circuitos tenham parâmetros.

  • Os dispositivos e métodos disponíveis não são mais consultados durante a importação de Aer.

  • Anteriormente, o site AerSimulator modificava os metadados do circuito para manter a consistência entre a entrada e a saída da simulação, com o efeito colateral de uma visualização inesperada dos metadados do aplicativo na simulação. Essa correção evita o uso de metadados de circuito para manter a consistência internamente e, em seguida, sempre fornece uma visão consistente dos metadados para o aplicativo.

  • Foi corrigido um bug em que a variação dos metadados em EstimatorResult era complexa e agora retorna um valor flutuante.

  • Corrigida uma falha de compilação para compilar o Qiskit Aer com suporte a cuQuautum (AER_ENABLE_CUQUANTUM=true). Essa alteração não afeta a compilação de binários de CPU e GPU normais.

  • Foi corrigido um bug em from_backend() que gerava um erro quando o backend não tinha valores T1 e T2 (ou seja, None) para um qubit em suas propriedades de qubit. Esse commit atualiza NoiseModel.from_backend() e basic_device_gate_errors() para que eles adicionem uma identidade QuantumError (ou seja, efetivamente nenhum erro de relaxamento térmico) a um qubit sem valores T1 e T2 para todas as portas que atuam em qubits, incluindo o qubit. Corrigidos os números 1779 e 1815.

  • Correção de um problema: mesmo que o número de qubits seja definido por um mapa de acoplamento ou pela configuração do dispositivo, quando o método de simulação é configurado, o número de qubits é substituído de acordo com o método. Corrigido #1769

  • Esta é a correção para a configuração do caminho da biblioteca em CMakeLists.txt para cuQuantum SDK. Como a versão mais recente cuQuantum inclui bibliotecas para CUDA 11.x e 12.x, essa correção usa a versão CUDA retornada de FindCUDA para o caminho das bibliotecas de cuQuantum e cuTENSOR.

  • Esta é uma correção para bibliotecas de link estático do site cuQuantum ao construir com CUQUANTUM_STATIC=true.

  • A paralelização MPI não foi ativada porque não usamos o qobj. Essa correção define corretamente o número de processos e a classificação MPI.

  • AerCircuit é criado a partir de um circuito por meio da iteração de suas operações, ignorando as instruções de barreira. No entanto, o fato de ignorar instruções de barreira faz com que as ligações de parâmetros sejam posicionadas de forma errada. Essa correção adiciona o endereço barrier() e mantém os vínculos de parâmetros corretos.

  • O Aer ainda suporta o Qobj como argumento do run() , embora tenha sido preterido. Entretanto, desde 0.12.0, ele sempre falha se não for especificado run_options . Essa correção permite a simulação de Qobj sem run_options.

  • Desde 0.12.0, AerConfig é usado para a configuração da simulação enquanto realiza a verificação rigorosa do tipo dos argumentos de meth:~.AerSimulator.run. Esse commit adiciona a conversão se os tipos de argumentos não forem esperados.

  • :meth:QuantumCircuit.initialize() com valor int não foi processado corretamente, conforme relatado em #1821 <https://github.com/Qiskit/qiskit-aer/issues/1821>. Esse commit permite essa inicialização decompondo as instruções initialize.

  • QuantumCircuit suporta parametrização para sua fase global. No entanto, o Aer não permitiu essa parametrização e falhou quando o transpilador gerou fases globais parametrizadas. Esse commit oferece suporte à parametrização de global_phase e resolve problemas relacionados a https://github.com/Qiskit/qiskit-aer/issues/1795, https://github.com/Qiskit/qiskit-aer/issues/1781, e https://github.com/Qiskit/qiskit-aer/issues/1798.

  • O Aer agora usará omp_set_max_active_levels() em vez do obsoleto omp_set_nested() quando compilado com versões recentes do OpenMP.

IBM 0.20.2

Nenhuma alteração.


0.43.1

Terra 0.24.1

Prelúdio

O Qiskit Terra 0.24.1 é a primeira versão do patch para 0.24.0. Isso corrige alguns erros que foram descobertos desde o lançamento do site 0.24.0.

Notas da Atualização

  • Alterado QuantumCircuit.assign_parameters() para vincular valores inteiros e flutuantes atribuídos diretamente aos parâmetros de instâncias Instruction no circuito, em vez de vincular os valores em um pacote de ParameterExpression. Essa alteração deve ter pouco impacto sobre o usuário, pois float(QuantumCircuit.data[i].operation.params[j]) ainda produz um float (e é a única maneira de acessar o valor de um ParameterExpression). Além disso, Instruction() já podem ser float , assim como um ParameterExpressionportanto, o código que lida com parâmetros de instrução já deve lidar com ambos os casos. A chance mais provável de impacto no usuário está no código que usa isinstance para verificar ParameterExpression e se comporta de forma diferente dependendo do resultado. Além disso, o qpy serializa o valor numérico em um bound ParameterExpression em uma precisão diferente de um float (consulte também a nota de correção de bug relacionada sobre QuantumCircuit.assign_parameters()).

Correções de bugs

  • Atualizada plot_gate_map(), plot_error_map(), e plot_circuit_layout() para suportar mapas de acoplamento heavy-hex de 433 qubits. Isso permite o acoplamento de visualizações de mapas para o backend IBM Quantum 's ibm_seattle .

  • Alterada a vinculação de valores numéricos com QuantumCircuit.assign_parameters() para evitar uma incompatibilidade entre os valores dos parâmetros de instrução do circuito e as chaves de parâmetros correspondentes no dicionário de calibração do circuito. Corrigidos os números 9764 e 10166. Consulte também a nota de atualização relacionada a QuantumCircuit.assign_parameters().

  • Foi corrigido um bug no site BlockCollapser em que os bits clássicos eram ignorados ao recolher um bloco de nós.

  • Corrigido um bug no replace_block_with_op() e replace_block_with_op() que levava a ignorar bits clássicos.

  • Foi corrigido um erro em QuantumCircuit.compose() em que o atributo SwitchCaseOp.target no subcircuito não era mapeado corretamente para um registro no circuito básico.

  • Correção de um bug no RZXCalibrationBuilder em que chamar a calibração com parâmetros incorretos causava uma falha em vez de gerar uma exceção.

  • Foi corrigido um problema com o método BooleanExpression.from_dimacs_file() onde o tipo de exceção gerado quando o tweedledum não estava instalado não era o esperado MissingOptionalLibrary. Corrigido #10079

  • O uso do endereço initial_layout em chamadas para transpile() não dará mais erro se o circuito contiver qubits que não estejam em nenhum registro ou qubits que existam em mais de um registro. Consulte #10125.

  • Corrigida a decomposição da porta de portas de rotação Z multicontroladas adicionadas via QuantumCircuit.mcrz(). Anteriormente, esse método implementava uma porta de fase multicontrolada, que tem uma diferença de fase relativa à rotação Z. Para obter o comportamento QuantumCircuit.mcrz() anterior, use QuantumCircuit.mcp().

  • Foi corrigido um problema com o construtor PassManagerConfig.from_backend() ao criar um objeto PassManagerConfig a partir de uma instância BackendV1 que não tinha um atributo de mapa de acoplamento definido. Anteriormente, o construtor criava incorretamente um objeto CouplingMap com 0 qubits em vez de usar None. Corrigido #10171

  • Corrige um bug introduzido no Qiskit 0.24.0 em que os ângulos de rotação numéricos não eram mais substituídos por ângulos simbólicos antes da preparação para a síntese de dois qubits. Isso gerou uma exceção porque as rotinas de síntese exigem matrizes numéricas.

  • Correção de um erro no qual a execução de Optimize1qGatesDecomposition em paralelo gerava um erro devido ao fato de OneQubitGateErrorMap não ser selecionável.

  • Corrigir um bug no VF2Layout e VF2PostLayout em que as passagens não estavam levando em conta o componente de erro de 1 qubit ao avaliar um layout em potencial.

Aer 0.12.0

Nenhuma mudança

IBM 0.20.2

Nenhuma mudança


0.43.0

Terra 0.24.0

Prelúdio

Esta é uma versão de recursos importantes que inclui vários novos recursos e correções de bugs.

Esta versão é a versão final com suporte para a execução do Qiskit com Python 3.7. A partir do próximo lançamento de versão secundária, Python >= 3.8 será necessário para executar o Qiskit.

Os destaques desse lançamento:

QuantumInstance, OpFlow, e descontinuação do uso de algoritmos

Esta versão descontinua oficialmente a classe QuantumInstance (e seus métodos e classes auxiliares associados), o módulo qiskit.opflow e qualquer uso deles em qiskit.algorithms. Essa descontinuação é resultado de um longo trabalho que começou no Qiskit Terra 0.21.0 para refatorar o módulo qiskit.algorithms para ser baseado no módulo computacional primitives. Há guias de migração associados para que os usuários existentes migrem para o novo fluxo de trabalho:

OpenQASM2 melhorias

Esta versão inclui uma grande refatoração para o suporte OpenQASM 2.0 no Qiskit. A primeira alteração é a introdução de um novo analisador para OpenQASM 2.0 no módulo qiskit.qasm2 módulo. Esse novo módulo substitui o módulo qiskit.qasm módulo existente. O novo analisador é mais explícito e correto com relação à especificação da linguagem. Ele também é implementado em Rust e é significativamente mais rápido do que o analisador anterior. Emparelhado com o novo analisador, o exportador OpenQASM 2.0 passou por uma grande refatoração que melhorou a correção da saída ao usar o método QuantumCircuit.qasm() para gerar a saída QASM de um objeto QuantumCircuit objeto.

Suporte Transpiler para dispositivos com conectividade separada

O transpilador agora suporta a segmentação de back-ends com conectividade disjunta. Anteriormente, o transpilador suportava apenas backends totalmente conectados (onde há um caminho para executar operações entre todos os pares de qubits no backend). Agora, se um backend tiver conectividade desconectada, o transpilador poderá raciocinar sobre como aplicar o layout (Layout Stage ) e o roteamento (Routing Stage ) para o backend. Se o circuito de entrada não puder ser executado no hardware devido à falta de conectividade entre os componentes conectados, será retornado um erro descritivo.

Por exemplo, o dispositivo Heron descrito no roteiro de hardware do site IBM Quantum descreve um backend futuro que terá hardware de controle compartilhado e comunicação clássica em tempo real entre processadores quânticos separados. Esse suporte permite que o Target modelar com precisão esses tipos de dispositivos futuros ou outro hardware com restrições semelhantes.

Operação do interruptor

Esta versão adiciona uma nova operação de fluxo de controle, a instrução switch. Isso é implementado usando uma nova classe de operação SwitchCaseOp e o método QuantumCircuit.switch() método. Isso permite ligar uma entrada numérica (como um registro ou bit clássico) e executar o circuito que corresponde ao valor correspondente.

Novos Recurso

  • Adicionadas as funções add_deprecation_to_docstring(), deprecate_arg(), e deprecate_func() ao módulo qiskit.utils módulo.

    add_deprecation_to_docstring() reescreverá a docstring da função para incluir uma diretiva do Sphinx .. deprecated:: para que a depreciação apareça na documentação e em help(). Os decoradores de depreciação de qiskit.utils call add_deprecation_to_docstring() já estão disponíveis para você; mas você pode chamá-los diretamente se estiver usando mecanismos diferentes para depreciações.

    @deprecate_func substitui @deprecate_function e é usado para descontinuar uma função inteira. Ele gerará automaticamente a maior parte da mensagem de depreciação para você.

    @deprecate_arg substitui @deprecate_arguments e é usado para descontinuar um argumento em uma função. Ela gerará uma mensagem mais útil do que a função anterior. Também é mais flexível, por exemplo, permite a configuração de um predicate para que você só deprecie determinadas situações, como o uso de um valor ou tipo de dados depreciado.

Recursos do Transpiler
  • Foi adicionada uma maneira alternativa de especificar em HLSConfig a lista de métodos de síntese usados para um determinado objeto de alto nível. Como antes, um método de síntese pode ser especificado como uma tupla que consiste no nome do método e em argumentos adicionais. Além disso, um método de síntese pode ser especificado como uma tupla que consiste em uma instância de HighLevelSynthesisPlugin e argumentos adicionais. Além disso, quando não há argumentos adicionais, um método de síntese pode ser especificado simplesmente pelo nome ou por uma instância de HighLevelSynthesisPlugin. O exemplo a seguir ilustra a nova funcionalidade:

    from qiskit import QuantumCircuit
    from qiskit.circuit.library.generalized_gates import PermutationGate
    from qiskit.transpiler import PassManager
    from qiskit.transpiler.passes.synthesis.high_level_synthesis import HLSConfig, HighLevelSynthesis
    from qiskit.transpiler.passes.synthesis.high_level_synthesis import ACGSynthesisPermutation
    
    qc = QuantumCircuit(6)
    qc.append(PermutationGate([1, 2, 3, 0]), [1, 2, 3, 4])
    
    # All of the ways to specify hls_config are equivalent
    hls_config = HLSConfig(permutation=[("acg", {})])
    hls_config = HLSConfig(permutation=["acg"])
    hls_config = HLSConfig(permutation=[(ACGSynthesisPermutation(), {})])
    hls_config = HLSConfig(permutation=[ACGSynthesisPermutation()])
    
    # The hls_config can then be passed as an argument to HighLevelSynthesis
    pm = PassManager(HighLevelSynthesis(hls_config=hls_config))
    qc_synthesized = pm.run(qc)
  • Foi adicionado suporte ao objeto CouplingMap para ter uma conectividade disjunta. Anteriormente, um CouplingMap só poderia ser construído se o gráfico fosse conectado. Isso permitirá o uso de CouplingMap para representar hardware com qubits separados, como hardware com qubits em vários chips separados.

  • Adicionado um novo método CouplingMap.connected_components() que é usado para obter uma lista de CouplingMap subgrafos componentes para um subgrafo disjunto CouplingMap. Se o objeto CouplingMap estiver conectado, isso retornará apenas um único objeto CouplingMap equivalente ao original.

  • Adicionadas novas regras à instância EquivalenceLibrary incorporada: qiskit.circuit.equivalence_library.SessionEquivalenceLibrary. As novas regras adicionadas são:

  • Foram adicionados plug-ins de síntese de alto nível para LinearFunction e para qiskit.quantum_info.Cliffordestendendo o conjunto de métodos de síntese que podem ser chamados de HighLevelSynthesis passagem do transpilador.

    Para LinearFunction os plug-ins disponíveis estão listados abaixo:

    Nome do plug-in
    Plug-in de síntese de alto nível
    defaultDefaultSynthesisLinearFunction
    kmsKMSSynthesisLinearFunction
    pmhPMHSynthesisLinearFunction

    Para qiskit.quantum_info.Clifford os plug-ins disponíveis estão listados abaixo:

    Nome do plug-in
    Plug-in de síntese de alto nível
    defaultDefaultSynthesisClifford
    agAGSynthesisClifford
    bmBMSynthesisClifford
    greedyGreedySynthesisClifford
    layersLayerSynthesisClifford
    lnnLayerLnnSynthesisClifford

    Consulte a qiskit.synthesis para obter mais informações sobre cada método individual.

    O exemplo a seguir ilustra alguns dos novos plug-ins:

    from qiskit.circuit import QuantumCircuit
    from qiskit.circuit.library import LinearFunction
    from qiskit.quantum_info import Clifford
    from qiskit.transpiler.passes.synthesis.high_level_synthesis import HLSConfig, HighLevelSynthesis
    
    # Create a quantum circuit with one linear function and one clifford
    qc1 = QuantumCircuit(3)
    qc1.cx(0, 1)
    qc1.swap(0, 2)
    lin_fun = LinearFunction(qc1)
    
    qc2 = QuantumCircuit(3)
    qc2.h(0)
    qc2.cx(0, 2)
    cliff = Clifford(qc2)
    
    qc = QuantumCircuit(4)
    qc.append(lin_fun, [0, 1, 2])
    qc.append(cliff, [1, 2, 3])
    
    # Choose synthesis methods that adhere to linear-nearest-neighbour connectivity
    hls_config = HLSConfig(linear_function=["kms"], clifford=["lnn"])
    
    # Synthesize
    qct = HighLevelSynthesis(hls_config)(qc)
    print(qct.decompose())
  • Adicionada uma nova passagem de transpilador, MinimumPoint que é usada principalmente como uma passagem para verificar uma condição de loop em um arquivo PassManager. Essa passagem rastreará o estado dos campos no conjunto de propriedades em suas execuções anteriores e definirá um campo booleano quando um ponto fixo for atingido sobre a profundidade de retrocesso ou selecionando o valor mínimo encontrado se a profundidade de retrocesso for atingida. Essa é uma alternativa à função FixedPoint que simplesmente verifica se há um valor fixo em um campo de conjunto de propriedades entre execuções subsequentes.

  • Adicionado um novo método, swap_nodes()ao método DAGCircuit para permitir a troca de nós que estão parcialmente conectados. Parcialmente conectado aqui significa que os dois nós compartilham pelo menos uma borda (que representa um qubit ou clbit). Se os nós não compartilharem nenhuma aresta, um DAGCircuitError é criado.

  • Adicionar um novo algoritmo de síntese synth_cz_depth_line_mr() de um circuito CZ para conectividade linear do vizinho mais próximo (LNN) em profundidade de 2 qubits de 2n+2 usando CX e portas de fase (S, Sdg ou Z). O circuito sintetizado reverte a ordem dos qubits. O algoritmo de síntese é baseado no artigo de Maslov e Roetteler ( https://arxiv.org/abs/1705.09176 ).

  • Adicionar um novo algoritmo de síntese synth_clifford_depth_lnn() de um circuito de Clifford para conectividade LNN em profundidade de 2 qubit de 9n+4 (que ainda não é ideal), usando a síntese de Clifford em camadas (synth_clifford_layers()), synth_cnot_depth_line_kms() para sintetizar a camada CX em profundidade 5n, e synth_cz_depth_line_mr() para sintetizar cada uma das camadas CZ em profundidade 2n+2. Esse PR será seguido por outro PR baseado no recente artigo de Maslov e Yang ( https://arxiv.org/abs/2210.16195 ), que sintetiza as camadas CX-CZ em profundidade 5n para conectividade LNN e realiza uma otimização adicional e, portanto, reduz a profundidade de um circuito Clifford para 7n-4 para conectividade LNN.

  • As equivalências entre as rotações Pauli controladas e as traduções para rotações de dois Pauli estão agora disponíveis na biblioteca de equivalências para portas padrão Qiskit. Isso permite, por exemplo, traduzir um CRZGate para um RZZGate mais RZGate ou um CRYGate para um único RZXGate mais portas de um único qubit:

    from qiskit.circuit import QuantumCircuit
    from qiskit.compiler import transpile
    
    angle = 0.123
    circuit = QuantumCircuit(2)
    circuit.cry(angle, 0, 1)
    
    basis = ["id", "sx", "x", "rz", "rzx"]
    transpiled = transpile(circuit, basis_gates=basis)
    print(transpiled.draw())
  • Foi adicionada uma nova opção, copy_operations, ao circuit_to_dag() para permitir, opcionalmente, a desativação da cópia profunda das operações da entrada QuantumCircuit para a saída QuantumCircuit. Nos casos em que a entrada :class`~.QuantumCircuit` não é mais usada após a conversão, essa cópia profunda é uma sobrecarga desnecessária, pois qualquer referência compartilhada não teria nenhum efeito colateral indesejado em potencial se a entrada QuantumCircuit for descartada.

  • Foi adicionada uma nova opção, copy_operations, ao dag_to_circuit() para permitir, opcionalmente, a desativação da cópia profunda das operações da entrada DAGCircuit para a saída QuantumCircuit. Nos casos em que a entrada DAGCircuit não é mais usada após a conversão, essa cópia profunda é uma sobrecarga desnecessária, pois quaisquer referências compartilhadas não teriam efeitos colaterais indesejados em potencial se a entrada DAGCircuit for descartada.

  • Adicionada uma nova função passmanager_stage_plugins() ao módulo qiskit.transpiler.preset_passmanagers.plugin módulo. Essa função é usada para obter um mapeamento de nomes de plug-ins para seus tipos de classe. Isso permite identificar e consultar a documentação de qualquer plug-in de estágio do gerenciador de passes definido. Por exemplo:

    >>> from qiskit.transpiler.preset_passmanagers.plugin import passmanager_stage_plugins
    >>> passmanager_stage_plugins('routing')['lookahead'].__class__
    
    qiskit.transpiler.preset_passmanagers.builtin_plugins.LookaheadSwapPassManager
    
    >>> help(passmanager_stage_plugins('routing')['lookahead'])
    Help on BasicSwapPassManager in module qiskit.transpiler.preset_passmanagers.builtin_plugins object:
    
    class BasicSwapPassManager(qiskit.transpiler.preset_passmanagers.plugin.PassManagerStagePlugin)
    |  Plugin class for routing stage with :class:`~.BasicSwap`
    ...
  • A passagem do transpilador Error agora também aceita entradas chamáveis para seu parâmetro msg . Se usados, esses callables de entrada receberão o atributo property_set da passagem e deverão retornar uma string que será usada para a mensagem de erro quando a passagem for executada. Por exemplo:

    from qiskit.transpiler.passes import Error
    
    def error_message(property_set):
    
        size = property_set["size']
        return f"The circuit size is: {size}"
    
    error_pass = Error(error_message)

    Quando error_pass for incluído em um gerenciador de passes, ele apresentará um erro usando a mensagem "The circuit size is: n" , em que n é o tamanho do circuito definido no conjunto de propriedades (normalmente da execução anterior do Size passagem).

  • O método build_coupling_map() tem um novo argumento de palavra-chave, filter_idle_qubits , que, quando definido como True , removerá todos os qubits da saída CouplingMap que não suportam nenhuma operação.

  • A passagem do GateDirection a passagem do transpilador agora pode lidar corretamente com SwapGate que podem estar presentes no circuito durante a execução em um circuito. Nesses casos, se os argumentos do qubit da porta de troca estiverem na direção não nativa de uma borda, a passagem inverterá a ordem dos argumentos.

  • O RZXCalibrationBuilder e RZXCalibrationBuilderNoEcho agora usarão corretamente um ECRGate para a porta de entrelaçamento se a porta de entrelaçamento nativa do backend for ECRGate. Anteriormente, os passes só funcionavam corretamente se a porta de emaranhamento fosse CXGate.

  • Foi adicionado um novo construtor para a classe Target classe, Target.from_configuration()que permite que você construa um objeto Target a partir dos tipos de objetos separados para descrever as restrições de um backend (por exemplo, portas de base, CouplingMap, BackendProperties, etc.). Por exemplo:

    target = Target.from_configuration(
        basis_gates=["u", "cx", "measure"],
        coupling_map=CouplingMap.from_line(25),
    )

    Isso construirá um objeto Target que tem UGate, CXGate, e Measure disponíveis globalmente em 25 qubits que estão conectados em uma linha.

  • Adição de uma nova função synth_cnot_phase_aam() que é usada para sintetizar circuitos de fase cnot para arquiteturas all-to-all usando o método Amy, Azimzadeh e Mosca. Essa função é idêntica à função qiskit.transpiler.synthesis.graysynth() disponível, mas tem um nome mais descritivo e está posicionada de forma mais lógica na árvore de pacotes. Essa nova função substitui a função legada, que provavelmente será descontinuada em uma versão futura.

  • Ajustes internos no algoritmo de roteamento do SabreSwapusados na transpilação de circuitos não dinâmicos em todos os níveis de otimização diferentes de zero, aceleraram o roteamento de circuitos muito grandes. Por exemplo, o tempo para rotear um circuito depth-5 QuantumVolume para um mapa de acoplamento hexagonal pesado de 1081 qubits é reduzido aproximadamente à metade.

  • O desempenho do tempo de execução da passagem do Optimize1qGatesDecomposition foi significativamente aprimorado. Isso foi feito reescrevendo todo o cálculo da passagem em Rust e também diminuindo a quantidade de objetos intermediários criados como parte da execução da passagem. Isso também deve corresponder a uma melhoria semelhante no desempenho do tempo de execução do transpile() com o argumento da palavra-chave optimization_level definido como 1, 2, ou 3.

  • Adicionar um novo método de síntese synth_stabilizer_layers() de um estado estabilizador em camadas. Ele fornece uma decomposição semelhante à síntese descrita no Lema 8 de Bravyi e Maslov, ( arxiv:2003.09412 ) sem o subcircuito inicial livre de Hadamard que não afeta o estado do estabilizador.

  • Adicione um novo método de síntese synth_stabilizer_lnn() de um estado estabilizador para conectividade linear do vizinho mais próximo na profundidade de 2 qubit de 2n+2 e duas camadas distintas de CX, usando CX e portas de fase (S, Sdg ou Z). O algoritmo de síntese é baseado no artigo de Maslov e Roetteler ( https://arxiv.org/abs/1705.09176 ).

  • A passagem SabreLayout agora suporta a execução contra um alvo com um CouplingMap. Ao visar um acoplamento disjunto, a entrada DAGCircuit é dividida em seus componentes conectados de qubits virtuais, cada componente é mapeado para os componentes conectados da entrada CouplingMapo layout é executado em cada componente conectado isoladamente e, em seguida, todos os layouts são combinados e retornados. Observe que quando o argumento routing_pass é definido, a passagem não suporta a execução com conectividade disjunta.

  • As seguintes passagens do transpilador de layout e roteamento dos módulos qiskit.transpiler.passes agora suportam a aceitação de um objeto Target que é usado para modelar as restrições de um backend de destino por meio do primeiro argumento posicional (atualmente denominado coupling_map ou backend_properties).

    A lista de passes com o novo suporte para Target input são:

  • A função auxiliar de construção do gerenciador de passes generate_embed_passmanager() agora também aceitará um Target para seu único argumento posicional (atualmente denominado coupling_map). Isso pode ser usado para construir uma incorporação de layout PassManager a partir de um objeto Target em vez de um objeto CouplingMap.

  • As seguintes passagens do transpilador de layout e roteamento dos módulos qiskit.transpiler.passes têm um novo argumento de palavra-chave, target , que recebe um objeto Target que é usado para modelar as restrições de um backend de destino. Se o argumento da palavra-chave target for especificado, ele será usado como a fonte de verdade para quaisquer restrições de hardware usadas na operação da passagem do transpilador. Ele substituirá quaisquer outros argumentos para especificar restrições de hardware, normalmente os argumentos que recebem um CouplingMap, InstructionScheduleMap ou uma lista de portas de base. A lista desses passes com o novo argumento target é a seguinte:

  • A função auxiliar de construção do gerenciador de passes generate_scheduling() tem um novo argumento de palavra-chave target que é usado para especificar um objeto Target para modelar as restrições do backend de destino que está sendo compilado ao gerar um novo objeto PassManager. Se especificado, esse novo argumento substituirá o outro argumento inst_map.

  • O plug-in default usado pela passagem do UnitarySynthesis agora escolhe a síntese unitária de um e dois qubits com base nas taxas de erro relatadas no arquivo Target. Em particular, ele executa todos os métodos de síntese possíveis compatíveis com o plug-in e escolhe a opção que resultará no menor erro. Para uma decomposição de um qubit, ela pode ter como alvo a base de Pauli (por exemplo, RZ-RX-RZ ou RZ-RY-RZ), a base unitária genérica (por exemplo, U) e algumas outras. Para uma decomposição de dois qubits, ela pode ter como alvo qualquer base supercontrolada (por exemplo, CNOT, iSWAP, B) ou base controlada múltipla (por exemplo, CZ, CH, ZZ^.5, ZX^.2, etc.).

  • A interface para UnitarySynthesisPlugin tem duas novas propriedades opcionais supports_gate_lengths_by_qubit e supports_gate_errors_by_qubit que, quando definidas, adicionarão os campos gate_lengths_by_qubit e gate_errors_by_qubit , respectivamente, às opções de entrada do método run() do plug-in. Esses novos campos são uma visão alternativa dos dados fornecidos por gate_lengths e gate_errors , mas, em vez disso, têm o formato: {(qubits,): [Gate, length]} (em que Gate é a instância de Gate para essa definição). Isso permite que os plug-ins raciocinem sobre o trabalho com portas do mesmo tipo, mas que tenham parâmetros diferentes definidos.

  • Adicionada uma nova passagem de transpilador, UnrollForLoopsque é usada para desenrolar qualquer operação ForLoopOp operações em um circuito. Essa passagem desenrola os loops for quando possível, se não houver nenhum ContinueLoopOp ou BreakLoopOp dentro do bloco do corpo do loop. Por exemplo:

    from qiskit.transpiler.passes import UnrollForLoops
    from qiskit import QuantumCircuit
    
    unroll_pass = UnrollForLoops()
    
    qc = QuantumCircuit(1)
    # For loop over range 5
    with qc.for_loop(range(5)) as i:
        qc.rx(i, 0)
    # Unroll loop into 5 rx gates
    unroll_pass(qc).draw("mpl")
    _images/legacy_release_notes-1.png
  • Adicionado um novo parâmetro max_trials para passar VF2PostLayout que, quando especificado, limita o número de layouts descobertos e comparados ao procurar o melhor layout. Isso difere dos parâmetros existentes call_limit e time_limit (que são usados para limitar o número de visitas de estado realizadas pelo algoritmo VF2 e o tempo total gasto pelo pass VF2PostLayoutrespectivamente), pois é usado para colocar um limite superior no tempo gasto na pontuação de layouts potenciais, o que pode ser útil para dispositivos maiores.

  • A passagem CheckMap transpiler pass tem um novo argumento de palavra-chave em seu construtor, property_set_field. Esse argumento pode ser usado para especificar um campo no conjunto de propriedades para armazenar os resultados da análise. Anteriormente, só era possível armazenar o resultado no campo "is_swap_mapped" (que é o padrão). Isso permite que você armazene o resultado de várias instâncias da passagem em um PassManager em campos diferentes.

Recursos dos circuitos
  • Adicionada uma nova classe de porta, GlobalPhaseGateque pode ser usada para adicionar uma fase global na instância QuantumCircuit instância.

  • Adicionado um novo atributo, layoutà classe QuantumCircuit classe. Esse atributo é normalmente preenchido por transpile() ou PassManager.run() (quando o Layout Stage e o Routing Stage são executados no PassManager) e contém um TranspileLayout que contém as informações sobre a permutação do circuito de entrada durante o transpile().

  • Foi adicionado um novo argumento, var_order, ao construtor da classe PhaseOracle para permitir a definição da ordem em que as variáveis na expressão lógica estão sendo consideradas. Por exemplo:

    from qiskit.tools.visualization import plot_histogram
    from qiskit.primitives import Sampler
    from qiskit.circuit.library import PhaseOracle
    from qiskit.algorithms import Grover, AmplificationProblem
    
    oracle = PhaseOracle('((A & C) | (B & D)) & ~(C & D)', var_order=['A', 'B', 'C', 'D'])
    problem = AmplificationProblem(oracle=oracle, is_good_state=oracle.evaluate_bitstring)
    grover = Grover(sampler=Sampler())
    result = grover.amplify(problem)
    print(result.circuit_results[0])
  • Um novo analisador OpenQASM 2 está disponível em qiskit.qasm2. Ele tem dois pontos de entrada: qasm2.load() e qasm2.loads()para ler o código-fonte de um arquivo e de uma cadeia de caracteres, respectivamente:

    import qiskit.qasm2
    program = """
      OPENQASM 2.0;
      include "qelib1.inc";
      qreg q[2];
      h q[0];
      cx q[0], q[1];
    """
    bell = qiskit.qasm2.loads(program)

    Esse novo analisador é aproximadamente 10x mais rápido do que os existentes em QuantumCircuit.from_qasm_file() e QuantumCircuit.from_qasm_str() para arquivos grandes, e também tem menos sobrecarga em cada chamada. O novo analisador é mais extensível, personalizável e, em geral, também mais seguro quanto ao tipo; ele não tentará gerar objetos personalizados do Qiskit quando a definição no arquivo OpenQASM 2 entrar em conflito com o objeto do Qiskit, ao contrário do exportador atual. Consulte a qiskit.qasm2 para obter detalhes completos e mais exemplos.

  • Aprimore a decomposição de rotações Pauli-X e Pauli-Y multicontroladas com controles QuantumCircuit.mcrx() e QuantumCircuit.mcry on :math:`n() controles para 16n4016n - 40 CX gates, para n4n \geq 4. Esse aprimoramento é baseado em arXiv:2302.06377.

  • O Qiskit agora suporta a representação de declarações switch , usando a nova instrução SwitchCaseOp e o método QuantumCircuit.switch() método. Isso permite ligar uma entrada numérica (como um registro ou bit clássico) e executar o circuito que corresponde ao valor correspondente. Vários valores podem apontar para o mesmo circuito, e CASE_DEFAULT pode ser usado como um rótulo sempre correspondente.

    Também é possível usar uma interface de construtor, semelhante às outras construções de fluxo de controle, para criar essas instruções de alternância:

    from qiskit import QuantumCircuit, QuantumRegister, ClassicalRegister
    
    qreg = QuantumRegister(2)
    creg = ClassicalRegister(2)
    qc = QuantumCircuit(qreg, creg)
    
    qc.h([0, 1])
    qc.measure([0, 1], [0, 1])
    with qc.switch(creg) as case:
      with case(0):  # if the register is '00'
        qc.z(0)
      with case(1, 2):  # if the register is '01' or '10'
        qc.cx(0, 1)
      with case(case.DEFAULT):  # the default case
        qc.h(0)

    A instrução switch tem suporte em toda a pilha do compilador Qiskit; você pode criar circuitos que a contenham (se o backend anunciar seu suporte para a construção) e ela será serializada para o QPY transpile() circuitos que a contenham (se o backend anunciar seu suporte para a construção), e ela será serializada para o QPY.

    A declaração switch não é atualmente um recurso do OpenQASM 3, mas está sendo projetada e considerada ativamente, e espera-se que seja adotada em um futuro próximo. O Qiskit Terra tem suporte experimental para exportar essa declaração para a sintaxe OpenQASM 3 proposta na solicitação pull vinculada, usando um sinalizador de recurso experimental. Para exportar um circuito de declaração switch (como o criado acima) para OpenQASM 3 usando esse suporte especulativo, faça o seguinte:

    from qiskit import qasm3
    
    qasm3.dumps(qc, experimental=qasm3.ExperimentalFeatures.SWITCH_CASE_V1)
Recursos dos algoritmos
  • Adicionado um novo atributo eigenvalue_threshold à classe AdaptVQE para configurar um novo tipo de limite para encerrar o algoritmo quando o valor próprio mudar menos do que um valor definido.

  • Adicionado um novo atributo gradient_threshold à classe AdaptVQE que substituirá o atributo threshold no futuro. Esse novo atributo tem o mesmo comportamento que o atributo threshold existente, mas tem um nome mais preciso, dada a introdução de opções de limite adicionais na classe.

  • Adicionado o atributo EstimationProblem.has_good_state que permite verificar se um EstimationProblem tem um EstimationProblem.is_good_state personalizado ou se ele é o padrão. Isso é útil para verificações em estimadores de amplitude, como o AmplitudeEstimationque suportam apenas a implementação padrão.

  • Adiciona um sinalizador local à classe ComputeUncompute classe de fidelidade de estado que permite calcular a fidelidade local, que é definida pela média dos projetores de um único qubit.

  • As classes de gradiente reorganizam o resultado do gradiente de acordo com a ordem dos parâmetros de entrada.

    Exemplo:

    from qiskit.algorithms.gradients import ParamShiftEstimatorGradient
    from qiskit.circuit import QuantumCircuit, Parameter
    from qiskit.primitives import Estimator
    from qiskit.quantum_info import SparsePauliOp
    
    # Create a circuit with a parameter
    p = {i: Parameter(f'p{i}') for i in range(3)}
    qc = QuantumCircuit(1)
    qc.rx(p[0], 0)
    qc.ry(p[1], 0)
    qc.rz(p[2], 0)
    op = SparsePauliOp.from_list([("Z", 1)])
    param_values = [0.1, 0.2, 0.3]
    
    # Create a gradient object
    estimator = Estimator()
    grad = ParamShiftEstimatorGradient(estimator)
    result = grad.run(qc, op, [param_values]).result()
    # would produce a gradient of the form [df/dp0, df/dp1, df/dp2]
    result = grad.run(qc, op, [param_values], parameters=[[p[2], p[0]]]).result()
    # would produce a gradient of the form [df/dp2, df/dp0]
  • Foi adicionado suporte para lidar com Hamiltonianos dependentes do tempo (ou seja, operadores parametrizados individualmente) à classe TrotterQRTE classe. Para facilitar o trabalho com isso, adicionamos o atributo num_timesteps e um argumento de palavra-chave correspondente ao construtor TrotterQRTE para controlar o número de etapas de tempo para dividir a evolução completa.

  • Foi adicionado suporte para avaliações observáveis em cada etapa de tempo durante a execução da TrotterQRTE classe. O TimeEvolutionProblem.aux_operators é avaliado a cada etapa de tempo se o atributo ProductFormula.reps do argumento product_formula de entrada no construtor estiver definido como 1.

  • Foram adicionadas extensões ao algoritmo VQD que permitem passar uma lista de otimizadores e pontos iniciais para as diferentes execuções de minimização. Por exemplo, o k-ésimo ponto inicial e o k-ésimo otimizador serão usados para a otimização do k-1-ésimo estado exato.

Recursos de informação quântica
  • Foram adicionados dois novos métodos de construção, Clifford.from_matrix() e Clifford.from_operator()que criam um objeto Clifford a partir de sua matriz unitária e representação de operador, respectivamente.

  • O construtor de Clifford agora pode receber qualquer objeto de porta Clifford de até 3 qubits, desde que implemente um método to_matrix , inclusive portas parametrizadas como Rz(pi/2), que não eram conversíveis antes.

  • Foram adicionadas novas funções utilitárias: commutator(), anti_commutator(), e double_commutator() que são usadas para computar comutadores para qualquer objeto que implemente a classe base abstrata LinearOp , como QuantumChannel, SparsePauliOp,, ou ScalarOp.

  • Foi adicionado o método StabilizerState.equiv, que verifica se os conjuntos geradores de dois estados estabilizadores geram o mesmo grupo estabilizador. Por exemplo, o grupo estabilizador do estado de Bell de dois qubits contém os quatro elementos {II,XX,YY,ZZ}\{II, XX, -YY, ZZ\} e, portanto, pode ser gerado por [XX,ZZ][XX, ZZ], [XX,YY][XX, -YY] ou [YY,ZZ][-YY, ZZ].

  • Adicionado um novo método, partial_transpose()ao método qiskit.quantum_info do módulo DensityMatrix do módulo. Esse método é usado para calcular a transposição parcial de uma matriz de densidade, necessária para detectar o emaranhamento entre sistemas quânticos bipartidos.

  • Adicionado um método qiskit.quantum_info.Operator.apply_permutation() que pré-compõe ou pós-compõe um Operator com uma Permutation. Esse método funciona para os qudits em geral.

    Aqui está um exemplo para calcular P.O.PP^\dagger.O.P que reordena os bits do operador:

    import numpy as np
    from qiskit.quantum_info.operators import Operator
    
    op = Operator(np.array(range(576)).reshape((24, 24)), input_dims=(2, 3, 4), output_dims=(2, 3, 4))
    perm = [1, 2, 0]
    inv_perm = [2, 0, 1]
    conjugate_op = op.apply_permutation(inv_perm, front=True).apply_permutation(perm, front=False)

    O operador conjugado tem dimensões (4, 2, 3) x (4, 2, 3), o que é consistente com a permutação que move o qutrit para a posição 0, o qubit para a posição 1 e o 4-qudit para a posição 2.

  • Suporte nativo à construção de SparsePauliOp objetos com ParameterExpression sem exigir a construção explícita de uma matriz de objetos. Agora, há suporte para o seguinte:

    from qiskit.circuit import Parameter
    from qiskit.quantum_info import SparsePauliOp
    
    x = Parameter("x")
    op = SparsePauliOp(["Z", "X"], coeffs=[1, x])
  • Adicionado o método SparsePauliOp.assign_parameters() método e SparsePauliOp.parameters para atribuir e consultar parâmetros não vinculados dentro de um arquivo SparsePauliOp. Essa função pode, por exemplo, ser usada como:

    from qiskit.circuit import Parameter
    from qiskit.quantum_info import SparsePauliOp
    
    x = Parameter("x")
    op = SparsePauliOp(["Z", "X"], coeffs=[1, x])
    
    # free_params will be: ParameterView([x])
    free_params = op.parameters
    
    # assign the value 2 to the parameter x
    bound = op.assign_parameters([2])
Recursos do Pulse
  • Adicionadas novas SymbolicPulse à biblioteca de pulsos (qiskit.pulse.library) Os novos pulsos na biblioteca são:

    Essas novas classes são instâncias de ScalableSymbolicPulse. Com exceção da fase Sawtooth , o comportamento é idêntico ao da função geradora de forma de onda correspondente (por exemplo sin()). A fase da classe Sawtooth é definida de forma que uma fase de 2π2\pi se desloque por um ciclo completo.

  • Foi adicionado suporte ao QPY (qiskit.qpy) para trabalhar com instâncias de pulso ScheduleBlock com referências não atribuídas e preservação da estrutura de dados para a referência a subrotinas. Esse recurso permite que os usuários serializem e desserializem um programa de pulso modelo para tarefas como calibração de pulso. Por exemplo:

    from qiskit import pulse
    from qiskit import qpy
    
    with pulse.build() as schedule:
        pulse.reference("cr45p", "q0", "q1")
        pulse.reference("x", "q0")
        pulse.reference("cr45p", "q0", "q1")
    
    with open('template_ecr.qpy', 'wb') as fd:
        qpy.dump(schedule, fd)
  • Um novo método CalibrationEntry.user_provided() foi adicionado às entradas de calibração. Esse método pode ser chamado para verificar se a entrada é definida por um usuário final ou backend.

  • Adicionado um novo método Target.get_calibration() que fornece acesso conveniente à calibração de uma instrução em um objeto Target esse método pode ser chamado com args e kwargs de parâmetro e retorna uma programação de pulso criada com parâmetros quando a calibração é modelada com parâmetros.

Recursos dos provedores
  • A classe BackendV2Converter tem um novo argumento de palavra-chave, filter_faulty, em seu construtor. Quando esse argumento for definido como True , a classe do conversor filtrará todos os qubits ou operações listados como não operacionais na BackendProperties na carga útil da entrada BackendV1. Embora não seja muito usado, o objeto BackendProperties suporta a anotação de qubits e portas como não operacionais. Anteriormente, se um backend tivesse definido esse sinalizador em qualquer qubits ou gates, a instância de saída BackendV2 e seu Target incluiria todas as operações, estivessem elas listadas como operacionais ou não. Ao aproveitar o novo sinalizador, você pode filtrar esses qubits e portas não operacionais do arquivo Target. Quando o sinalizador estiver definido, o backend de saída ainda será listado como a largura total (por exemplo, um backend de 24 qubits com 4 qubits listados como não operacionais ainda mostrará que tem 24 qubits), mas os qubits defeituosos não terão nenhuma operação listada como suportada no arquivo Target.

  • A classe Options agora implementa o protocolo Mapping e o método __setitem__ . Isso significa que as instâncias Options agora oferecem a mesma interface que os dicionários padrão, exceto pelos métodos de exclusão (__delitem__, pop, clear). As atribuições de chaves são validadas pelos validadores, se houver algum registrado.

Recursos de visualização
  • Foi adicionada uma nova função, staged_pass_manager_drawer(), que é usada para visualizar uma StagedPassManager instância. Ele desenha o gerenciador de passes completo com cada estágio representado como uma caixa externa.

    Por exemplo:

    from qiskit.visualization import staged_pass_manager_drawer
    from qiskit.transpiler.preset_passmanagers import generate_preset_pass_manager
    from qiskit.providers.fake_provider import FakeSherbrooke
    
    backend = FakeSherbrooke()
    pm = generate_preset_pass_manager(3, backend)
    staged_pass_manager_drawer(pm)
  • O método StagedPassManager.draw() foi atualizado para incluir a visualização dos estágios, além do gerenciador geral de passes. Os estágios são representados por caixas externas na visualização. Nas versões anteriores, os estágios não eram incluídos na visualização. Por exemplo:

    from qiskit.transpiler.preset_passmanagers import generate_preset_pass_manager
    from qiskit.providers.fake_provider import FakeSherbrooke
    
    backend = FakeSherbrooke()
    pm = generate_preset_pass_manager(3, backend)
    pm.draw(pm)
  • Foi adicionado um novo argumento de palavra-chave, figsize, à função plot_bloch_multivector() função. Esse argumento pode ser usado para definir um tamanho para subparcelas individuais da esfera de Bloch. Por exemplo, se houver nn qubits e figsize estiver definido como (w, h), a largura total da figura será definida como nwn \cdot w, enquanto a altura total será definida como hh.

  • Foi adicionado um novo argumento de palavra-chave, font_size, à função plot_bloch_multivector() função. Esse argumento pode ser usado para controlar o tamanho da fonte na visualização de saída.

  • Foram adicionados dois novos argumentos de palavra-chave, title_font_size e title_pad, à função plot_bloch_multivector() função. Esses argumentos podem ser usados para controlar o tamanho da fonte do título geral e seu preenchimento, respectivamente.

Notas da Atualização

  • A versão mínima compatível do Rust (MSRV) foi aumentada de 1.56.1 para 1.61.0. Se você estiver compilando o Qiskit a partir do código-fonte, agora precisará garantir que tenha pelo menos o Rust 1.61.0 instalado para poder compilar o Qiskit. Essa alteração foi feita porque várias dependências upstream aumentaram seus MSRVs.

  • Removido o uso de primitivos com o gerenciador de contexto e a inicialização com circuitos (observáveis apenas para Estimator) e parâmetros que foram descontinuados na versão do Qiskit Terra 0.22.0 em outubro de 2022.

  • PrimitiveJob.submit() não bloqueia mais ao final da execução. Como resultado, Sampler.run(), BackendSampler.run(), Estimator.run() e BaseEstimator.run() não bloqueiam até que o método PrimitiveJob.result() seja chamado.

Notas sobre a atualização do Transpiler
  • O número máximo de tentativas avaliadas ao procurar o melhor layout usando VF2Layout e VF2PostLayout agora é limitado em level_1_pass_manager(), level_2_pass_manager(), e level_3_pass_manager() a 2 500, 25 000, e 250 000, respectivamente. Anteriormente, todos os layouts possíveis encontrados foram avaliados. Essa alteração foi feita para evitar que a transpilação ficasse suspensa durante a pontuação do layout para circuitos com muitos componentes conectados em dispositivos maiores, o que é escalonado de forma combinatória, pois cada componente conectado seria avaliado em todas as posições possíveis no dispositivo. Para realizar uma pesquisa completa como antes, execute manualmente VF2PostLayout no circuito transpilado em modo estrito, especificando 0 para max_trials.

  • O atributo condition , anteriormente obsoleto, da classe DAGDepNode foi removido. Ele foi marcado como obsoleto na versão 0.18 (07-2021). Em vez disso, você deve usar o atributo condition do atributo op para acessar a condição de um nó de operação. Para outros tipos de nós, não há condição de acesso.

  • O valor padrão de metadata em ambos DAGCircuit e DAGDependency foi alterado de None para {} para compatibilidade com o atributo metadata correspondente de QuantumCircuit.

  • O método CouplingMap.__eq__`() foi atualizado para verificar se as listas de bordas dos gráficos subjacentes contêm os mesmos elementos. Partindo do pressuposto de que os gráficos subjacentes estão conectados, essa verificação também garante que os gráficos tenham o mesmo número de nós com os mesmos rótulos. Qualquer código que use CouplingMap() == CouplingMap() para verificar a igualdade de objetos deve ser atualizado para CouplingMap() is CouplingMap().

  • Ao executar a função transpile() com um backend baseado em BackendV1 ou um BackendProperties por meio do argumento da palavra-chave backend_properties que tenha qubits ou portas sinalizados como defeituosos, a função não tentará mais remapear automaticamente os qubits com base nessas informações. O método pelo qual o transpile() tentava fazer esse remapeamento era fundamentalmente falho e, na maioria dos casos desse tipo de backend, resultaria na geração de um erro interno. Na prática, pouquíssimos backends definem os campos em BackendProperties para sinalizar um qubit ou porta como defeituoso. Se você estava contando com o transpile() para fazer esse remapeamento para você, agora será necessário fazer isso manualmente e passar uma entrada mapeada para os argumentos coupling_map e backend_properties que filtraram os qubits e gates defeituosos e, em seguida, mapear manualmente a saída.

  • O resultado das transpilações para sementes fixas pode ter mudado em comparação com as versões anteriores do Qiskit Terra. Isso se deve a ajustes internos no algoritmo de roteamento usado pelo SabreSwap e SabreLayoutque são os passes padrão de roteamento e layout, respectivamente, para torná-los significativamente mais rápidos em circuitos grandes.

Notas sobre atualização de circuitos
  • O QuantumCircuit metadata agora sempre retorna um dicionário e só pode ser definido como um dicionário. Anteriormente, seu valor padrão era None, e podia ser definido manualmente como None ou um dicionário.
Notas sobre atualização de algoritmos
  • Os módulos obsoletos factorizers e linear_solvers, contendo HHL e Shor foram removidos do qiskit.algorithms. Essas funcionalidades foram originalmente descontinuadas como parte da versão 0.22.0 (lançada em 13 de outubro de 2022). Em vez disso, você pode acessar o código por meio do Qiskit Textbook: Solucionadores lineares (HHL), Fatoradores (Shor)
Notas sobre a atualização do Pulse
  • Target.update_from_instruction_schedule_map() não gera mais KeyError nem ValueError quando faltam qubits na instrução de destino ou quando inst_name_map não é fornecido para a instrução indefinida. No primeiro caso, ele simplesmente ignora a definição da entrada InstructionScheduleMappara qubits indefinidos. No último caso, um mapeamento de porta é extraído das portas padrão do Qiskit e, por fim, um objeto opaco personalizado Gate personalizado é definido a partir do nome da agenda se nenhum mapeamento for encontrado.
Notas de atualização dos fornecedores
  • O argumento obsoleto max_credits para execute(), assemble() e todas as configurações de Qobj (por exemplo. QasmQobjConfig e PulseQobjConfig) foram removidos. Esse argumento remonta às primeiras versões do Qiskit, que estava mais ligado à oferta de serviços do IBM Quantum. Naquela época, o campo max_credits fazia parte do "sistema de crédito" usado pela oferta de serviços do IBM Quantum. No entanto, esse sistema de crédito não está em uso nos back-ends do IBM Quantum há quase três anos e o Qiskit não está mais vinculado às ofertas de serviços do IBM Quantum (e não está mais há muito tempo). Se você estiver contando com essa opção de alguma forma para um backend, precisará garantir que sua implementação BackendV2 exponha um campo max_credits em seu objeto Options objeto.

  • O atributo name nas classes de backend falsas baseadas em BackendV2 baseado em classes de backend falsas em qiskit.providers.fake_provider foi alterado em relação às versões anteriores. Anteriormente, os nomes tinham um sufixo "_v2" para diferenciar a classe da BackendV1 versão. Esse sufixo foi removido, pois a existência do sufixo poderia levar a inconsistências com outros dados de instantâneos usados para construir o objeto de backend.

Notas de descontinuação

Depreciações do Transpiler
  • A passagem de roteamento do transpilador, BIPMapping , foi preterida e será removida em uma versão futura. Ele foi substituído por um pacote de plug-in externo: qiskit-bip-mapper. Os detalhes desse novo pacote podem ser encontrados no repositório github do pacote:

    https://github.com/qiskit-community/qiskit-bip-mapper

    O passe foi transformado em um pacote de plug-in separado por dois motivos: primeiro, a dependência do CPLEX dificulta o uso e, segundo, o pacote de plug-in se integra de forma mais limpa ao transpile().

  • Erro de ortografia em aquire_alignment na classe Target foi substituído pela grafia correta acquire_alignment. O argumento antigo do construtor aquire_alignment e Target.aquire_alignment são obsoletos e serão removidos em uma versão futura. Use Target.acquire_alignment para obter e definir o valor da restrição de alinhamento.

Descontinuidade de circuitos
  • Configurando o QuantumCircuit metadata para None foi preterida e não será mais suportada em uma versão futura. Em vez disso, os usuários devem defini-lo como um dicionário vazio se quiserem que ele não contenha dados.
Algoritmos obsoletos
Depreciações de informações quânticas
  • Os endereços PauliTable e StabilizerTable estão obsoletos e serão removidos em uma versão futura. Em vez disso, o PauliList deve ser usado. Com essa alteração, o site table() foi descontinuado, de modo que você deve operar diretamente do site tableau() sem ele.
Depreciações de pulso
  • A atribuição de valores complexos a ParameterExpression em qualquer objeto do Qiskit Pulse agora gera um PendingDeprecationWarning. Isso alinhará o módulo Pulse com outros módulos em que essa atribuição não era possível no início. O caso de uso típico de parâmetros complexos no módulo foi a biblioteca SymbolicPulse. A partir do Qiskit-Terra 0.23.0, todos os pulsos da biblioteca foram convertidos da representação de amplitude complexa para a representação real usando dois floats (amp,angle), conforme usado na classe ScalableSymbolicPulse . Isso eliminou a necessidade de parâmetros complexos. Qualquer uso de parâmetros complexos (e principalmente pulsos personalizados) deve ser convertido de forma semelhante para evitar o uso de parâmetros complexos.

Correções de bugs

  • A classe AmplitudeEstimation agora avisa corretamente se uma propriedade EstimationProblem com uma propriedade is_good_state definida for passada como entrada, pois isso não é suportado e é ignorado. Anteriormente, o algoritmo ignorava silenciosamente essa opção, o que levava a resultados inesperados.

  • QuantumCircuit.append() agora gerará corretamente um erro se for fornecido um número incorreto de bits clássicos para aplicar a uma operação. Correção #9385.

  • O BarrierBeforeFinalMeasurements e MergeAdjacentBarriers tinham anteriormente uma ordem não determinística de suas instruções emitidas Barrier emitidas. Isso não alterou a semântica dos circuitos, mas poderia, em casos limitados em que houvesse barreiras que não fossem de largura total, fazer com que as passagens posteriores do transpilador estocástico vissem uma ordenação topológica diferente do circuito e, consequentemente, tivessem resultados diferentes para sementes fixas. As passagens foram feitas de forma determinística para evitar isso.

  • O tipo de retorno de run() agora será sempre o mesmo que o de seu primeiro argumento. Passar um único circuito retorna um único circuito, passar uma lista de circuitos, mesmo de comprimento 1, retorna uma lista de circuitos. Consulte #9798.

  • Corrigido um bug em que o PauliOp.adjoint() não retornava um valor correto para Paulis com coeficientes complexos, como PauliOp(Pauli("iX")). Corrigido #9433.

  • Correção de um problema com a função de gaveta de circuito circuit_drawer() e QuantumCircuit.draw() ao exibir parâmetros de instrução do tipo QuantumCircuit o que resultava em um desenho ilegível. Corrigido #9908

  • Correção de um problema com a função de gaveta de circuito circuit_drawer() e QuantumCircuit.draw() ao usar o método text e o argumento vertical_compression="low" , que usava um caractere incorreto para o canto superior direito das caixas usadas para representar portas no circuito.

  • Foi corrigido um problema com o método Gate.control() no qual ele anteriormente tratava incorretamente os tipos de entrada str ou None para o argumento ctrl_state .

  • Corrigido um caso extremo na construção de instâncias de Pauli uma string com uma fase opcional e sem qubits agora é um rótulo válido, tornando um operador sem qubits (como Pauli("-i")). Isso já era possível ao usar os formulários de matriz ou fatias vazias. Corrigido #9720.

  • Foi corrigido um problema ao usar a macro pulsemeasure() ao trabalhar com um backend baseado em BackendV2 baseado em um backend. Anteriormente, tentar usar qiskit.pulse.macros.measure() com um backend baseado em BackendV2 teria resultado em um erro. Corrigido #9488

  • Foi corrigido um problema com a função marginal_distribution() em que ela incorretamente gerava um erro quando um dicionário de contagens de entrada estava usando um tipo numpy integer em vez do tipo Python int. A função subjacente sempre lidaria com os diferentes tipos corretamente, mas a verificação do tipo de entrada estava incorretamente levantando um TypeError nesse caso.

  • Foi corrigido um erro em que o Parameter.is_real() não retornava None quando o parâmetro não estava vinculado. Corrigido #8619.

  • Os circuitos que contêm C3SXGate podem agora ser emitidos e lidos novamente com segurança a partir do exportador OpenQASM 2.0 (QuantumCircuit.qasm()) e do analisador (QuantumCircuit.from_qasm_str()).

  • Foi corrigido um bug no QPY (qiskit.qpy) em que os circuitos contendo portas da classe MCXGate, MCXGrayCode, e MCXRecursive, e MCXVChain não conseguiam ser serializados. Consulte #9390.

  • Correção das passagens de roteamento do transpilador StochasticSwap, SabreSwap, LookaheadSwap, e BasicSwap para que eles gerem consistentemente um TranspilerError quando seu respectivo método .run() é chamado se os passes foram inicializados com coupling_map=None. Anteriormente, essas passagens geravam erros nesse caso, mas todos eles eram causados por efeitos colaterais e a exceção específica não era previsível. Corrigido #7127

  • A configuração manual de um item em QuantumCircuit.data agora permitirá corretamente que a operação seja qualquer objeto que implemente Operatione não apenas um circuit.Instruction. Observe que qualquer mutação manual de QuantumCircuit.data é desencorajada; geralmente não é mais eficiente do que criar um novo objeto de circuito, pois a verificação das invariantes que envolvem os objetos parametrizados pode ser surpreendentemente cara.

  • Foi corrigido um erro ao construir DAGDependency de dentro da passagem do TemplateOptimization que poderia levar a otimizações incorretas.

  • Foi corrigido um erro no TensoredOp.to_matrix() em que o coeficiente global do operador era multiplicado à matriz final mais de uma vez. Agora, o coeficiente global é aplicado corretamente, independentemente do número de operadores ou estados tensionados. Corrigido #9398.

  • Corrigido o tratamento da fase global na passagem do UnrollCustomDefinitions se a instrução em questão tivesse uma fase global, mas nenhuma instrução em seu campo de definição.

  • Corrigidas as anotações de tipo para a função transpile() função. O tipo de retorno agora é restringido corretamente, dependendo do fato de ter sido passado um único circuito ou uma lista de circuitos.

  • Corrigido um bug em que o IterativePhaseEstimation estava gerando o circuito errado, fazendo com que o algoritmo falhasse em casos simples. Corrigido #9280.

  • Foi corrigido um bug que permitia a transmissão quando um PauliList é inicializado a partir de Paulis ou rótulos. Por exemplo, o código PauliList(["XXX", "Z"]) agora gera um ValueError em vez de construir o equivalente a PauliList(["XXX", "ZZZ"]).

  • O exportador do OpenQASM 2 (QuantumCircuit.qasm()) não emitirá mais definições duplicadas para portas que aparecem nas definições de outras portas. Consulte #7771, #8086, #8402, #8558 e #9805.

  • O exportador do OpenQASM 2 (QuantumCircuit.qasm()) agora tratará definições múltiplas e aninhadas de UnitaryGate. Consulte #4623, #6712, #7772 e #8222.

  • O exportador do OpenQASM 2 (QuantumCircuit.qasm()) agora produzirá definições para portas usadas somente nas definições de outras portas em uma ordem correta. Consulte #7769 e #7773.

  • As portas padrão definidas pelo Qiskit, como RZXGateagora terão definições devidamente parametrizadas quando exportadas usando o exportador OpenQASM 2 (QuantumCircuit.qasm()). Consulte #7172.

  • Os circuitos de volume quântico (QuantumVolume) agora são compatíveis com o exportador OpenQASM 2 (QuantumCircuit.qasm()). Consulte #6466 e #7051.

  • O exportador OpenQASM 2 agora produzirá portas sem definição conhecida com as instruções opaque , em vez de falhar. Consulte #5036.

  • Um problema que impedia o funcionamento do site transpile() quando era passada uma lista de CouplingMap foi corrigido. Observe que a transmissão dessa lista de mapas de acoplamento está obsoleta e não será possível a partir do Qiskit Terra 0.25. Correções #9885.

  • Anteriormente a esta versão, o argumento figsize de plot_bloch_multivector() não era usado pela visualização, impossibilitando a alteração de seu tamanho (por exemplo, para reduzi-lo para estados de um único qubit). Esta versão corrige esse problema introduzindo um uso para o argumento figsize .

  • Foi corrigido um problema em transpile() com optimization_level=1 (bem como nos gerenciadores de passes predefinidos retornados por generate_preset_pass_manager() e level_1_pass_manager()) em que, anteriormente, se os argumentos routing_method e layout_method não estivessem definidos e nenhuma operação de fluxo de controle estivesse presente no circuito, nos casos em que o roteamento fosse necessário, a passagem VF2PostLayout transpiler não seria executado. Isso foi o oposto do comportamento esperado porque o VF2PostLayout destina-se a encontrar um layout com desempenho potencialmente melhor após a execução de uma passagem heurística de layout e roteamento. Corrigido #9936

  • Construção de um Statevector a partir de um QuantumCircuit contendo operações de zero qubit não gerará mais um erro. Essas operações conferem uma fase global ao vetor de estado resultante.

  • Foi corrigido um problema nas passagens do tranpiler para atrasos de preenchimento, que não respeitavam as restrições do alvo e inseriam atrasos mesmo para qubits que não suportavam a instrução Delay instrução. PadDelay e PadDynamicalDecoupling são fixos de modo que não preencham nenhum tempo ocioso dos qubits, de modo que o destino não ofereça suporte a instruções Delay para os qubits. Além disso, os passes de agendamento herdados ASAPSchedule e ALAPSchedule, que preenchem os atrasos internamente, são corrigidos da mesma forma. Além disso, o site transpile() foi corrigido para chamar PadDelay com um objeto target para que funcione corretamente quando chamado com a opção scheduling_method . Corrigido #9993

  • Corrigidas as anotações de tipo no método QuantumCircuit.assign_parameters() para refletir corretamente a mudança no tipo de retorno, dependendo do valor do argumento inplace .

  • Foi corrigido um problema de dimensionamento de desempenho com o VF2Layout e VF2PostLayout nos gerenciadores de passagem predefinidos e transpile()que ocorria ao transpilar circuitos com muitos componentes conectados em dispositivos grandes. Agora o transpilador passa a definir limites superiores para o número de layouts potenciais que serão avaliados.

  • Foi corrigido um problema na função state_to_latex() , que poderia produzir um LaTeX inválido devido ao arredondamento não intencional do coeficiente. Isso também poderia resultar em erros quando o state_drawer() fosse chamado. Corrigido #9297.

Aer 0.12.0

Nenhuma mudança

IBM 0.20.2

Nenhuma mudança

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