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
dumpaumentou para 8. Essa nova versão do formato adiciona suporte à serialização do atributoQuantumCircuit.layoutatributo.
Correções de bugs
-
Foi corrigida a desserialização de instâncias
DiagonalGateinstâ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
BasicSwapque impedia o funcionamento do métodoBasicSwap.run()funcionasse se o argumento da palavra-chavefake_runfosse definido comoTruequando a classe fosse instanciada. Corrigido #10147 -
Foi corrigido um problema com a cópia de circuitos com o novo estilo
Clbits eQubits (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
CheckMapnã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()emeasure_all()quando as funções são chamadas com o backendBackendV2backend. -
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.primitivesnão causará mais avisos de depreciação decorrentes do móduloqiskit.opflowdepreciado. Esses avisos teriam sido ocultados para os usuários pelos filtros padrão do site Python, mas acionaram a importação ansiosa deopflowo 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 classeGroverOperatorpodem 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
UnitarySynthesisao usar o parâmetrotarget, em que os circuitos com fluxo de controle não eram mapeados corretamente para o destino. -
Corrigido o erro em
VQDem queresult.optimal_valuesera uma cópia deresult.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
ParameterExpressionem umfloatouintconcreto falhava, por exemplo, porque a expressão era naturalmente um número complexo. Corrigido #9187 -
Corrigido
floatconversões paraParameterExpressionque 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 eParameterExpression.is_real()ser verdadeiro. Corrigido #10191 -
Corrigida a
qpyserialização deQuantumCircuit.layoutattribue. Anteriormente, o atributolayoutteria 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-cu11e o uso do pacoteqiskit-aer-gpuagora requer CUDA 12. Se você já é usuário do pacoteqiskit-aer-gpue deseja usar o CUDA 11, será necessário executar:pip uninstall qiskit-aer-gpu && pip install -U qiskit-aer-gpu-cu11para sair das versões anteriores do pacote
qiskit-aer-gpucompatí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 pacoteqiskit-aer-gpunormalmente.
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íamAerCircuits. Esse commit torna os resultados serializáveis, removendoAerCircuits 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.qubitspara 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-aere importando-o como:
import qiskit_aerA 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
Estimatorquandoabelian_grouping=True.
Notas da Atualização
- Desempenho aprimorado quando os mesmos circuitos e vários parâmetros são passados para
Estimatorcomapproximation=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::Configfoi corrigida. Essa classe tem muitos campos, mas é frequentemente copiada emAER::Transpile::CircuitOptimization. Originalmente, ojson_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, oAER::Transpile::CircuitOptimizationnão copia oAER::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
AerSimulatormodificava 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 atualizaNoiseModel.from_backend()ebasic_device_gate_errors()para que eles adicionem uma identidadeQuantumError(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çobarrier()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 especificadorun_options. Essa correção permite a simulação de Qobj semrun_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. -
QuantumCircuitsuporta 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 obsoletoomp_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ânciasInstructionno circuito, em vez de vincular os valores em um pacote deParameterExpression. Essa alteração deve ter pouco impacto sobre o usuário, poisfloat(QuantumCircuit.data[i].operation.params[j])ainda produz umfloat(e é a única maneira de acessar o valor de umParameterExpression). Além disso,Instruction()já podem serfloat, assim como umParameterExpressionportanto, 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 usaisinstancepara verificarParameterExpressione se comporta de forma diferente dependendo do resultado. Além disso, o qpy serializa o valor numérico em um boundParameterExpressionem uma precisão diferente de umfloat(consulte também a nota de correção de bug relacionada sobreQuantumCircuit.assign_parameters()).
Correções de bugs
-
Atualizada
plot_gate_map(),plot_error_map(), eplot_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 'sibm_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 aQuantumCircuit.assign_parameters(). -
Foi corrigido um bug no site
BlockCollapserem que os bits clássicos eram ignorados ao recolher um bloco de nós. -
Corrigido um bug no
replace_block_with_op()ereplace_block_with_op()que levava a ignorar bits clássicos. -
Foi corrigido um erro em
QuantumCircuit.compose()em que o atributoSwitchCaseOp.targetno subcircuito não era mapeado corretamente para um registro no circuito básico. -
Correção de um bug no
RZXCalibrationBuilderem 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 esperadoMissingOptionalLibrary. Corrigido #10079 -
O uso do endereço
initial_layoutem chamadas paratranspile()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 comportamentoQuantumCircuit.mcrz()anterior, useQuantumCircuit.mcp(). -
Foi corrigido um problema com o construtor
PassManagerConfig.from_backend()ao criar um objetoPassManagerConfiga partir de uma instânciaBackendV1que não tinha um atributo de mapa de acoplamento definido. Anteriormente, o construtor criava incorretamente um objetoCouplingMapcom 0 qubits em vez de usarNone. 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
Optimize1qGatesDecompositionem paralelo gerava um erro devido ao fato de OneQubitGateErrorMap não ser selecionável. -
Corrigir um bug no
VF2LayouteVF2PostLayoutem 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:
QuantumInstanceguia de migração: https://qisk.it/qi _migraçãoOpflowguia de migração: https://qisk.it/opflow _migração- Guia de migração de algoritmos: https://qisk.it/algo _migração
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(), edeprecate_func()ao móduloqiskit.utilsmó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 emhelp(). Os decoradores de depreciação deqiskit.utilscalladd_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_funcsubstitui@deprecate_functione é usado para descontinuar uma função inteira. Ele gerará automaticamente a maior parte da mensagem de depreciação para você.@deprecate_argsubstitui@deprecate_argumentse é 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 umpredicatepara 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
HLSConfiga 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 deHighLevelSynthesisPlugine 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 deHighLevelSynthesisPlugin. 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
CouplingMappara ter uma conectividade disjunta. Anteriormente, umCouplingMapsó poderia ser construído se o gráfico fosse conectado. Isso permitirá o uso deCouplingMappara 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 deCouplingMapsubgrafos componentes para um subgrafo disjuntoCouplingMap. Se o objetoCouplingMapestiver conectado, isso retornará apenas um único objetoCouplingMapequivalente ao original. -
Adicionadas novas regras à instância
EquivalenceLibraryincorporada:qiskit.circuit.equivalence_library.SessionEquivalenceLibrary. As novas regras adicionadas são: -
Foram adicionados plug-ins de síntese de alto nível para
LinearFunctione paraqiskit.quantum_info.Cliffordestendendo o conjunto de métodos de síntese que podem ser chamados deHighLevelSynthesispassagem do transpilador.Para
LinearFunctionos plug-ins disponíveis estão listados abaixo:Nome do plug-inPlug-in de síntese de alto níveldefaultDefaultSynthesisLinearFunctionkmsKMSSynthesisLinearFunctionpmhPMHSynthesisLinearFunctionPara
qiskit.quantum_info.Cliffordos plug-ins disponíveis estão listados abaixo:Nome do plug-inPlug-in de síntese de alto níveldefaultDefaultSynthesisCliffordagAGSynthesisCliffordbmBMSynthesisCliffordgreedyGreedySynthesisCliffordlayersLayerSynthesisCliffordlnnLayerLnnSynthesisCliffordConsulte a
qiskit.synthesispara 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,
MinimumPointque é usada principalmente como uma passagem para verificar uma condição de loop em um arquivoPassManager. 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çãoFixedPointque 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étodoDAGCircuitpara 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, umDAGCircuitErroré 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, esynth_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
CRZGatepara umRZZGatemaisRZGateou umCRYGatepara um únicoRZXGatemais 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, aocircuit_to_dag()para permitir, opcionalmente, a desativação da cópia profunda das operações da entradaQuantumCircuitpara a saídaQuantumCircuit. 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 entradaQuantumCircuitfor descartada. -
Foi adicionada uma nova opção,
copy_operations, aodag_to_circuit()para permitir, opcionalmente, a desativação da cópia profunda das operações da entradaDAGCircuitpara a saídaQuantumCircuit. Nos casos em que a entradaDAGCircuitnã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 entradaDAGCircuitfor descartada. -
Adicionada uma nova função
passmanager_stage_plugins()ao móduloqiskit.transpiler.preset_passmanagers.pluginmó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
Erroragora também aceita entradas chamáveis para seu parâmetromsg. Se usados, esses callables de entrada receberão o atributoproperty_setda 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_passfor incluído em um gerenciador de passes, ele apresentará um erro usando a mensagem"The circuit size is: n", em quené o tamanho do circuito definido no conjunto de propriedades (normalmente da execução anterior doSizepassagem). -
O método
build_coupling_map()tem um novo argumento de palavra-chave,filter_idle_qubits, que, quando definido comoTrue, removerá todos os qubits da saídaCouplingMapque não suportam nenhuma operação. -
A passagem do
GateDirectiona passagem do transpilador agora pode lidar corretamente comSwapGateque 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
RZXCalibrationBuildereRZXCalibrationBuilderNoEchoagora usarão corretamente umECRGatepara a porta de entrelaçamento se a porta de entrelaçamento nativa do backend forECRGate. Anteriormente, os passes só funcionavam corretamente se a porta de emaranhamento fosseCXGate. -
Foi adicionado um novo construtor para a classe
Targetclasse,Target.from_configuration()que permite que você construa um objetoTargeta 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
Targetque temUGate,CXGate, eMeasuredisponí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çãoqiskit.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-5QuantumVolumepara um mapa de acoplamento hexagonal pesado de 1081 qubits é reduzido aproximadamente à metade. -
O desempenho do tempo de execução da passagem do
Optimize1qGatesDecompositionfoi 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 dotranspile()com o argumento da palavra-chaveoptimization_leveldefinido como1,2, ou3. -
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
SabreLayoutagora suporta a execução contra um alvo com umCouplingMap. Ao visar um acoplamento disjunto, a entradaDAGCircuité dividida em seus componentes conectados de qubits virtuais, cada componente é mapeado para os componentes conectados da entradaCouplingMapo layout é executado em cada componente conectado isoladamente e, em seguida, todos os layouts são combinados e retornados. Observe que quando o argumentorouting_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.passesagora suportam a aceitação de um objetoTargetque é usado para modelar as restrições de um backend de destino por meio do primeiro argumento posicional (atualmente denominadocoupling_mapoubackend_properties).A lista de passes com o novo suporte para
Targetinput são:CSPLayoutFullAncillaAllocationLayout2qDistanceNoiseAdaptiveLayoutSabreLayoutTrivialLayoutBasicSwapBIPMappingLayoutTransformationLookaheadSwapSabreSwapStochasticSwapCheckMap
-
A função auxiliar de construção do gerenciador de passes
generate_embed_passmanager()agora também aceitará umTargetpara seu único argumento posicional (atualmente denominadocoupling_map). Isso pode ser usado para construir uma incorporação de layoutPassManagera partir de um objetoTargetem vez de um objetoCouplingMap. -
As seguintes passagens do transpilador de layout e roteamento dos módulos
qiskit.transpiler.passestêm um novo argumento de palavra-chave,target, que recebe um objetoTargetque é usado para modelar as restrições de um backend de destino. Se o argumento da palavra-chavetargetfor 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 umCouplingMap,InstructionScheduleMapou uma lista de portas de base. A lista desses passes com o novo argumentotargeté a seguinte: -
A função auxiliar de construção do gerenciador de passes
generate_scheduling()tem um novo argumento de palavra-chavetargetque é usado para especificar um objetoTargetpara modelar as restrições do backend de destino que está sendo compilado ao gerar um novo objetoPassManager. Se especificado, esse novo argumento substituirá o outro argumentoinst_map. -
O plug-in
defaultusado pela passagem doUnitarySynthesisagora escolhe a síntese unitária de um e dois qubits com base nas taxas de erro relatadas no arquivoTarget. 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
UnitarySynthesisPlugintem duas novas propriedades opcionaissupports_gate_lengths_by_qubitesupports_gate_errors_by_qubitque, quando definidas, adicionarão os camposgate_lengths_by_qubitegate_errors_by_qubit, respectivamente, às opções de entrada do métodorun()do plug-in. Esses novos campos são uma visão alternativa dos dados fornecidos porgate_lengthsegate_errors, mas, em vez disso, têm o formato:{(qubits,): [Gate, length]}(em queGateé a instância deGatepara 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çãoForLoopOpoperações em um circuito. Essa passagem desenrola os loops for quando possível, se não houver nenhumContinueLoopOpouBreakLoopOpdentro 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")
-
Adicionado um novo parâmetro
max_trialspara passarVF2PostLayoutque, quando especificado, limita o número de layouts descobertos e comparados ao procurar o melhor layout. Isso difere dos parâmetros existentescall_limitetime_limit(que são usados para limitar o número de visitas de estado realizadas pelo algoritmo VF2 e o tempo total gasto pelo passVF2PostLayoutrespectivamente), 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
CheckMaptranspiler 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 umPassManagerem campos diferentes.
Recursos dos circuitos
-
Adicionada uma nova classe de porta,
GlobalPhaseGateque pode ser usada para adicionar uma fase global na instânciaQuantumCircuitinstância. -
Adicionado um novo atributo,
layoutà classeQuantumCircuitclasse. Esse atributo é normalmente preenchido portranspile()ouPassManager.run()(quando o Layout Stage e o Routing Stage são executados noPassManager) e contém umTranspileLayoutque contém as informações sobre a permutação do circuito de entrada durante otranspile(). -
Foi adicionado um novo argumento,
var_order, ao construtor da classePhaseOraclepara 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()eqasm2.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()eQuantumCircuit.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 aqiskit.qasm2para obter detalhes completos e mais exemplos. -
Aprimore a decomposição de rotações Pauli-X e Pauli-Y multicontroladas com controles
QuantumCircuit.mcrx()eQuantumCircuit.mcry on :math:`n()controles para CX gates, para . Esse aprimoramento é baseado em arXiv:2302.06377. -
O Qiskit agora suporta a representação de declarações
switch, usando a nova instruçãoSwitchCaseOpe o métodoQuantumCircuit.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, eCASE_DEFAULTpode 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
switchtem 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 QPYtranspile()circuitos que a contenham (se o backend anunciar seu suporte para a construção), e ela será serializada para o QPY.A declaração
switchnã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çãoswitch(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à classeAdaptVQEpara 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à classeAdaptVQEque substituirá o atributothresholdno futuro. Esse novo atributo tem o mesmo comportamento que o atributothresholdexistente, mas tem um nome mais preciso, dada a introdução de opções de limite adicionais na classe. -
Adicionado o atributo
EstimationProblem.has_good_stateque permite verificar se umEstimationProblemtem umEstimationProblem.is_good_statepersonalizado ou se ele é o padrão. Isso é útil para verificações em estimadores de amplitude, como oAmplitudeEstimationque suportam apenas a implementação padrão. -
Adiciona um sinalizador
localà classeComputeUncomputeclasse 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
TrotterQRTEclasse. Para facilitar o trabalho com isso, adicionamos o atributonum_timestepse um argumento de palavra-chave correspondente ao construtorTrotterQRTEpara 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
TrotterQRTEclasse. OTimeEvolutionProblem.aux_operatorsé avaliado a cada etapa de tempo se o atributoProductFormula.repsdo argumentoproduct_formulade entrada no construtor estiver definido como 1. -
Foram adicionadas extensões ao algoritmo
VQDque permitem passar uma lista de otimizadores e pontos iniciais para as diferentes execuções de minimização. Por exemplo, ok-ésimo ponto inicial e ok-ésimo otimizador serão usados para a otimização dok-1-ésimo estado exato.
Recursos de informação quântica
-
Foram adicionados dois novos métodos de construção,
Clifford.from_matrix()eClifford.from_operator()que criam um objetoClifforda partir de sua matriz unitária e representação de operador, respectivamente. -
O construtor de
Cliffordagora pode receber qualquer objeto de porta Clifford de até 3 qubits, desde que implemente um métodoto_matrix, inclusive portas parametrizadas comoRz(pi/2), que não eram conversíveis antes. -
Foram adicionadas novas funções utilitárias:
commutator(),anti_commutator(), edouble_commutator()que são usadas para computar comutadores para qualquer objeto que implemente a classe base abstrataLinearOp, comoQuantumChannel,SparsePauliOp,, ouScalarOp. -
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 e, portanto, pode ser gerado por , ou . -
Adicionado um novo método,
partial_transpose()ao métodoqiskit.quantum_infodo móduloDensityMatrixdo 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 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
SparsePauliOpobjetos comParameterExpressionsem 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 eSparsePauliOp.parameterspara atribuir e consultar parâmetros não vinculados dentro de um arquivoSparsePauliOp. 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 faseSawtooth, o comportamento é idêntico ao da função geradora de forma de onda correspondente (por exemplosin()). A fase da classeSawtoothé definida de forma que uma fase de se desloque por um ciclo completo. -
Foi adicionado suporte ao QPY (
qiskit.qpy) para trabalhar com instâncias de pulsoScheduleBlockcom 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 objetoTargetesse 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
BackendV2Convertertem um novo argumento de palavra-chave,filter_faulty, em seu construtor. Quando esse argumento for definido comoTrue, a classe do conversor filtrará todos os qubits ou operações listados como não operacionais naBackendPropertiesna carga útil da entradaBackendV1. Embora não seja muito usado, o objetoBackendPropertiessuporta 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ídaBackendV2e seuTargetincluiria 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 arquivoTarget. 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 arquivoTarget. -
A classe
Optionsagora implementa o protocoloMappinge o método__setitem__. Isso significa que as instânciasOptionsagora 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 umaStagedPassManagerinstâ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çãoplot_bloch_multivector()função. Esse argumento pode ser usado para definir um tamanho para subparcelas individuais da esfera de Bloch. Por exemplo, se houver qubits efigsizeestiver definido como(w, h), a largura total da figura será definida como , enquanto a altura total será definida como . -
Foi adicionado um novo argumento de palavra-chave,
font_size, à funçãoplot_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_sizeetitle_pad, à funçãoplot_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()eBaseEstimator.run()não bloqueiam até que o métodoPrimitiveJob.result()seja chamado.
Notas sobre a atualização do Transpiler
-
O número máximo de tentativas avaliadas ao procurar o melhor layout usando
VF2LayouteVF2PostLayoutagora é limitado emlevel_1_pass_manager(),level_2_pass_manager(), elevel_3_pass_manager()a2 500,25 000, e250 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 manualmenteVF2PostLayoutno circuito transpilado em modo estrito, especificando0paramax_trials. -
O atributo
condition, anteriormente obsoleto, da classeDAGDepNodefoi removido. Ele foi marcado como obsoleto na versão 0.18 (07-2021). Em vez disso, você deve usar o atributoconditiondo atributooppara 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
metadataem ambosDAGCircuiteDAGDependencyfoi alterado deNonepara{}para compatibilidade com o atributometadatacorrespondente deQuantumCircuit. -
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 useCouplingMap() == CouplingMap()para verificar a igualdade de objetos deve ser atualizado paraCouplingMap() is CouplingMap(). -
Ao executar a função
transpile()com um backend baseado emBackendV1ou umBackendPropertiespor meio do argumento da palavra-chavebackend_propertiesque 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 otranspile()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 emBackendPropertiespara sinalizar um qubit ou porta como defeituoso. Se você estava contando com otranspile()para fazer esse remapeamento para você, agora será necessário fazer isso manualmente e passar uma entrada mapeada para os argumentoscoupling_mapebackend_propertiesque 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
SabreSwapeSabreLayoutque 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
QuantumCircuitmetadataagora sempre retorna um dicionário e só pode ser definido como um dicionário. Anteriormente, seu valor padrão eraNone, e podia ser definido manualmente comoNoneou um dicionário.
Notas sobre atualização de algoritmos
- Os módulos obsoletos
factorizerselinear_solvers, contendoHHLeShorforam removidos doqiskit.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 maisKeyErrornemValueErrorquando faltam qubits na instrução de destino ou quandoinst_name_mapnão é fornecido para a instrução indefinida. No primeiro caso, ele simplesmente ignora a definição da entradaInstructionScheduleMappara qubits indefinidos. No último caso, um mapeamento de porta é extraído das portas padrão do Qiskit e, por fim, um objeto opaco personalizadoGatepersonalizado é definido a partir do nome da agenda se nenhum mapeamento for encontrado.
Notas de atualização dos fornecedores
-
O argumento obsoleto
max_creditsparaexecute(),assemble()e todas as configurações deQobj(por exemplo.QasmQobjConfigePulseQobjConfig) 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 campomax_creditsfazia 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çãoBackendV2exponha um campomax_creditsem seu objetoOptionsobjeto. -
O atributo
namenas classes de backend falsas baseadas emBackendV2baseado em classes de backend falsas emqiskit.providers.fake_providerfoi alterado em relação às versões anteriores. Anteriormente, os nomes tinham um sufixo"_v2"para diferenciar a classe daBackendV1versã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
- Os módulos
qiskit.opflow,qiskit.utils.backend_utils,qiskit.utils.mitigation,qiskit.utils.measurement_error_mitigation, classeqiskit.utils.QuantumInstancee os métodosfind_regs_by_name(),run_circuits()foram descontinuados e serão removidos em uma versão futura. UtilizaçãoQuantumInstanceé substituído porBaseSampler. Consulte Migração de Opflow. Consulte QuantumInstance Migration.
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_alignmentna classeTargetfoi substituído pela grafia corretaacquire_alignment. O argumento antigo do construtor aquire_alignment eTarget.aquire_alignmentsão obsoletos e serão removidos em uma versão futura. UseTarget.acquire_alignmentpara obter e definir o valor da restrição de alinhamento.
Descontinuidade de circuitos
- Configurando o
QuantumCircuitmetadataparaNonefoi 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
-
Todos os recursos a seguir estão obsoletos, depois de terem sido suspensos desde 0.22.0. Mais informações estão disponíveis em https://qisk.it/algo _migration.
-
O módulo
qiskit.algorithms.minimum_eigen_solversestá obsoleto e foi substituído peloqiskit.algorithms.minimum_eigensolvers. -
O módulo
qiskit.algorithms.eigen_solversestá obsoleto e foi substituído peloqiskit.algorithms.eigensolvers. -
O módulo
qiskit.algorithms.evolversestá obsoleto e foi substituído peloqiskit.algorithms.time_evolvers. -
Class
qiskit.algorithms.TrotterQRTEestá obsoleta e foi substituída porqiskit.algorithms.time_evolvers.trotterization.TrotterQRTE. -
Usando
QuantumInstanceouBackendestá obsoleto e foi substituído porBaseSamplernas classes a seguir: -
Usando
QuantumInstanceouBackendouExpectationBaseestá obsoleto e foi substituído porBaseSamplerno método estático a seguir:get_fidelity() -
A função
eval_observables()está obsoleta e foi substituída pela funçãoestimate_observables().
-
Depreciações de informações quânticas
- Os endereços
PauliTableeStabilizerTableestão obsoletos e serão removidos em uma versão futura. Em vez disso, oPauliListdeve ser usado. Com essa alteração, o sitetable()foi descontinuado, de modo que você deve operar diretamente do sitetableau()sem ele.
Depreciações de pulso
- A atribuição de valores complexos a
ParameterExpressionem qualquer objeto do Qiskit Pulse agora gera umPendingDeprecationWarning. 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 classeScalableSymbolicPulse. 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
AmplitudeEstimationagora avisa corretamente se uma propriedadeEstimationProblemcom uma propriedadeis_good_statedefinida 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
BarrierBeforeFinalMeasurementseMergeAdjacentBarrierstinham anteriormente uma ordem não determinística de suas instruções emitidasBarrieremitidas. 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, comoPauliOp(Pauli("iX")). Corrigido #9433. -
Correção de um problema com a função de gaveta de circuito
circuit_drawer()eQuantumCircuit.draw()ao exibir parâmetros de instrução do tipoQuantumCircuito que resultava em um desenho ilegível. Corrigido #9908 -
Correção de um problema com a função de gaveta de circuito
circuit_drawer()eQuantumCircuit.draw()ao usar o métodotexte o argumentovertical_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 entradastrouNonepara o argumentoctrl_state. -
Corrigido um caso extremo na construção de instâncias de
Pauliuma string com uma fase opcional e sem qubits agora é um rótulo válido, tornando um operador sem qubits (comoPauli("-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 emBackendV2baseado em um backend. Anteriormente, tentar usarqiskit.pulse.macros.measure()com um backend baseado emBackendV2teria 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 umTypeErrornesse caso. -
Foi corrigido um erro em que o
Parameter.is_real()não retornavaNonequando o parâmetro não estava vinculado. Corrigido #8619. -
Os circuitos que contêm
C3SXGatepodem 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 classeMCXGate,MCXGrayCode, eMCXRecursive, eMCXVChainnão conseguiam ser serializados. Consulte #9390. -
Correção das passagens de roteamento do transpilador
StochasticSwap,SabreSwap,LookaheadSwap, eBasicSwappara que eles gerem consistentemente umTranspilerErrorquando seu respectivo método.run()é chamado se os passes foram inicializados comcoupling_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.dataagora permitirá corretamente que a operação seja qualquer objeto que implementeOperatione não apenas umcircuit.Instruction. Observe que qualquer mutação manual deQuantumCircuit.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
DAGDependencyde dentro da passagem doTemplateOptimizationque 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
UnrollCustomDefinitionsse 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
IterativePhaseEstimationestava 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 dePaulis ou rótulos. Por exemplo, o códigoPauliList(["XXX", "Z"])agora gera umValueErrorem vez de construir o equivalente aPauliList(["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 deUnitaryGate. 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 deCouplingMapfoi 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
figsizedeplot_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 argumentofigsize. -
Foi corrigido um problema em
transpile()comoptimization_level=1(bem como nos gerenciadores de passes predefinidos retornados porgenerate_preset_pass_manager()elevel_1_pass_manager()) em que, anteriormente, se os argumentosrouting_methodelayout_methodnã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 passagemVF2PostLayouttranspiler não seria executado. Isso foi o oposto do comportamento esperado porque oVF2PostLayoutdestina-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
Statevectora partir de umQuantumCircuitcontendo 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
Delayinstrução.PadDelayePadDynamicalDecouplingsã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çõesDelaypara os qubits. Além disso, os passes de agendamento herdadosASAPScheduleeALAPSchedule, que preenchem os atrasos internamente, são corrigidos da mesma forma. Além disso, o sitetranspile()foi corrigido para chamarPadDelaycom um objetotargetpara que funcione corretamente quando chamado com a opçãoscheduling_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 argumentoinplace. -
Foi corrigido um problema de dimensionamento de desempenho com o
VF2LayouteVF2PostLayoutnos gerenciadores de passagem predefinidos etranspile()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 ostate_drawer()fosse chamado. Corrigido #9297.
Aer 0.12.0
Nenhuma mudança
IBM 0.20.2
Nenhuma mudança