Qiskit SDK 2.5 notas de lançamento
2.5.2
Prelúdio
O Qiskit v2.5.2 é uma versão de correção que inclui correções de bugs para problemas identificados desde o lançamento da versão v2.5.1.
Correções de bugs
-
Corrigimos um pequeno vazamento de memória nos métodos de síntese de Suzuki-Trotter, que mantinha as alocações de todas as cadeias de Pauli esparsas durante todo o tempo de execução do programa. Corrige o problema #16677.
-
Corrigimos um bug no mecanismo simbólico em que a soma ou a subtração de duas expressões podia ser otimizada incorretamente para 0. Isso ocorreu quando o mesmo símbolo estava presente em ambas as expressões e as partes numéricas resultaram em 0, por exemplo,
(1 + x) + (-1 + x). -
Colisões de camadas fixas nas janelas de texto e de circuitos “ Matplotlib ” quando um corpo de fluxo de controle atua sobre qubits que estão permutados em relação ao circuito externo, por exemplo
circuit.append(BoxOp(body), [0, 2, 1]). As instruções dentro do corpo agora são organizadas de acordo com a ordem de desenho externa; assim, os portões que se sobrepõem no layout desenhado são colocados em camadas separadas, em vez de serem desenhados uns sobre os outros. Corrigido o #16510. -
Corrigimos um problema com o método
DAGCircuit.depth()que poderia causar um erro grave ao ser chamado após a exclusão do primeiroQubit(ouClbitse não houver objetosQubitno DAG) noDAGCircuit. -
Corrigimos um bug no
OptimizeCliffordTqual, para circuitos transpilados para uma base Clifford+T que excluem eSXGateSXdgGate, a etapa poderia retornar um circuito que não fosse unitariamente equivalente à sua entrada. -
Corrigimos vários erros na simplificação de
ParameterExpressionque resultavam em expressões incorretas.Correção do #16259. Corrige o problema #16260. Corrige o problema #16262. Correção do #16263.
-
Corrigimos uma falta de determinismo na ordem de remoção das arestas em e
DAGCircuit.remove_qubits()remove_clbits(). Isso fez com que as arestas adicionadas posteriormente tivessem identificadores não determinísticos, afetando alguns algoritmos de percurso. Corrigido o #16655. -
Corrigimos um problema em que a etapa do transpiler
SynthesizeRZRotationspoderia entrar em pânico caso o argumentosynthesis_errorfosse definido com valores específicos. Corrigido o #16540. -
Corrigimos uma possível falha de segmentação durante a avaliação de
ParameterExpressionobjetos grandes. Corrigido o #16676. -
O método
DAGCircuit.substitute_node_with_dag()agora transfere corretamente as declarações de variáveis no nível do DAG (variáveis de entrada, capturadas e declaradas, além de trechos) do DAG de substituição para o DAG de destino. Anteriormente, esses elementos eram omitidos durante a substituição. Corrigido o #15509. -
VF2LayoutSaída fixa não determinísticaoptimization_level=2em umTargetmapa de acoplamento simétrico. Anteriormente, essa etapa poderia aplicar critérios de desempate diferentes entre as execuções devido à soma não determinística de números de ponto flutuante. Corrigido o #16490. -
Corrigimos um bug no
StatePreparation.inverse()qualStatePreparationobjetos especificados por um número inteiro e um argumentonum_qubitsexplícito não preservavam o número de qubits. Corrigido o #16430.
2.5.1
Prelúdio
O Qiskit v2.5.1 é uma nova versão de correção de bugs do Qiskit SDK.
Correções de bugs
-
Corrigimos um problema em que os métodos que retornam camadas e
DAGCircuit.layers()DAGCircuit.serial_layers()copiavam o DAG paiglobal_phasepara cada DAG de camada retornado. Corrige o problema #16271. -
Corrigimos um erro de compilação que ocorria quando
CommutativeCancellationuma sequência de rotações de um único qubit ( ) resultava em um ângulo negativo e a porta estava disponível como porta de destino. Veja o nº 16594. -
Corrigiu um possível impasse na etapa do transpiler
Optimize1qGatesDecompositionquando executada com portas de qubit único definidas de forma personalizada em aQuantumCircuitouTarget. Corrigido o #16591. -
A mensagem de erro exibida
SabreLayoutao definir argumentos incompatíveis agora indica corretamente as limitações. Veja o nº 16632. -
Síntese fixa de
PhaseOracle,PhaseOracleGate, eBitFlipOracleGatepara expressões booleanas que são verdadeiras para qualquer atribuição, comox | ~x. Corrigido o #16524.
2.5.0
Prelúdio
O Qiskit v2.5.0 é uma nova versão com novos recursos do Qiskit SDK. Os destaques desta versão são:
- API C ampliada e maior acesso. A API C contém muitas novas funções e tipos (consulte a seção “Recursos da API C” abaixo), principalmente aqueles destinados a inspecionar o fluxo de controle e expressões clássicas.
qiskit.capitambém ganhouctypesligações à API C, para facilitar o acesso à depuração.- Suporte inicial ao gerenciador de passagens em etapas para múltiplos IRs. Uma nova
MultiStagePassManagerfuncionalidade permite compilações que reduzem progressivamente o código por meio de múltiplos IRs. As futuras versões ampliarão os recursos de múltiplos IRs do Qiskit.- Gerenciadores de passagem predefinidos para Clifford+T e PBC. Duas novas funções,
generate_preset_clifford_t_pass_manager()egenerate_preset_pbc_pass_manager(), oferecem pipelines pré-configurados para o cálculo baseado em Clifford+T e no método de Pauli (PBC), respectivamente. Este é um primeiro passo rumo a uma compilação mais robusta e tolerante a falhas no Qiskit.- Novas otimizações padrão para o transpiler de dois qubits. A otimização padrão de ressíntese de dois qubits do Qiskit (ativada nos níveis 2 e 3 nos pipelines predefinidos) agora utiliza uma nova
TwoQubitPeepholeOptimizationetapa. Em comparação com a combinação anterior deConsolidateBlockseUnitarySynthesis, essa opção apresenta melhor desempenho e é mais eficaz na seleção da decomposição de maior fidelidade.- Melhorias no desempenho do transpiler. É comum observar aumentos na velocidade de 2-3x em
benchpressdiversos circuitos. Isso se deve ao fato de várias passagens do transpiler terem ganhado suporte a multithreading, além de muitas outras melhorias, como a nova síntese de dois qubits mencionada acima, aprimoramentos algorítmicos emSabreLayout, otimizações emrustworkx, e rotinas mais eficientes de hash, alocação e álgebra linear.
Recursos da API C
-
Foi adicionado suporte para a inspeção de expressões clássicas na API C, semelhante a
qiskit.circuit.classical. A API C ainda não inclui uma API de construção para esses objetos. Todas as funções e tipos de dados em Expressões Clássicas são novidades nesta versão. -
ControlFlowOpFoi adicionado suporte para inspecionar instruções de fluxo de controle na API C, correspondentes às subclasses do espaço Python. A API C ainda não inclui uma API de construção para esses objetos. Todas as funções e tipos de dados do Control Flow são novidades nesta versão. -
Foram adicionadas funções para consultar um circuito sobre seus registros quânticos e clássicos, bem como sobre diversas propriedades dos próprios registros. Foram adicionadas as seguintes funções:
qk_circuit_num_quantum_registers()qk_circuit_get_quantum_register()qk_circuit_num_classical_registers()qk_circuit_get_classical_register()qk_quantum_register_name()qk_quantum_register_num_bits()qk_quantum_register_circuit_bits()qk_classical_register_name()qk_classical_register_num_bits()qk_classical_register_circuit_bits()
-
qiskit.capiagora contémctypesligações para toda a API do C. Eles estão disponíveis como atributos do módulo com o mesmo nome dos objetos da API C. Por exemplo,qiskit.capi.qk_circuit_newcorresponde aqk_circuit_new(). -
Adicionado
qk_circuit_estimate_fidelity(), que é usado para estimar a fidelidade da simulação de um circuito em um determinadoQkTarget. -
Ampliamos o
qk_transpiler_pass_standalone_litinski_transformation()pass para oferecer suporte a portas de qubit únicoQkGate_RXeQkGate_RYde rotação, bem comoQkPauliProductRotationàs instruções eQkPauliProductMeasurement. -
Portas de rotação de um único qubit e
QkPauliProductRotationobjetos com ângulos que são múltiplos inteiros de — dentro dos limites da aproximação padrão — são agora reconhecidos como portas de Clifford peloqk_transpiler_pass_standalone_litinski_transformation()teste. -
Foram adicionadas
qk_circuit_global_phase()as funções eqk_dag_global_phase(), que recuperam as fases globais deQkCircuiteQkDag, respectivamente. -
Foram adicionadas
qk_circuit_set_global_phase()eqk_dag_set_global_phase(), que definem as fases globais deQkCircuiteQkDag, respectivamente. -
Foram adicionadas duas novas funções à API C,
qk_transpiler_pass_standalone_2q_peephole_optimization()eqk_transpiler_pass_2q_peephole_optimization(), para executar a etapa de otimização unitária do “peephole” de dois qubits a partir do C. Essa é a mesma senha usadaTwoQubitPeepholeOptimizationpara o site Python.
Recursos do Circuits
-
InstructionEspecializadaLinearFunction.inverse()de modo a retornar umLinearFunctionque represente a transformação inversa, em vez de não conseguir construir um opaco. -
loop_parameterQuantumCircuit.for_loop()agora aceita umexpr.Vardotypes.Uinttipo como argumento. Quando usada na forma de gerenciador de contexto, a variável do loop é automaticamente declarada como umainputvariável do corpo do loop e fica disponível para uso dentro do escopo do loop. Por exemplo:from qiskit.circuit import QuantumCircuit, ClassicalRegister from qiskit.circuit.classical import expr, types qc = QuantumCircuit(1, 1) cr = ClassicalRegister(5, "reps") qc.add_register(cr) with qc.for_loop(range(5), expr.Var.new("a", types.Uint(32))) as v: qc.measure(0, 0) qc.store(expr.index(cr, v), qc.clbits[0]) -
Adicionado
QuantumCircuit.estimate_fidelity(), que é usado para estimar a fidelidade da simulação de um circuito em um determinadoTarget. -
ClassicalRegisterObjetos com mais de 65.535 bits agora podem ser usados com oqiskit.circuit.classicalsistema de expressões. -
ParameterVectoragora aceita um argumento opcionaluuidno construtor e expõe sua classe baseUUIDpor meio de seuuuidatributo. Isso pode ser usado para reconstruir vetores cujos elementos sejam iguais entre si.
Artigos sobre Informação Quântica
-
Foi adicionado o
PauliLindbladMap.parity_sample_with_history()método, que é idêntico aoPauliLindbladMap.parity_sample(), exceto pelo fato de também rastrear e retornar o histórico subjacente dos Paulis e sinais que resultaram nos termos amostrados finais. -
QubitSparsePauliList.commutes()Adicionou o método. Este método retorna as relações de comutação entre esteQubitSparsePauliListe outro elemento como uma matriz de valores booleanos.
Recursos do transpiler
-
generate_preset_clifford_t_pass_manager()Foi adicionada uma nova função, que oferece uma maneira prática de criar um gerenciador de passagens predefinidas para a compilação Clifford+T.Você deve dar preferência a esta função em vez de
transpile()ougenerate_preset_pass_manager()com uma base Clifford+T, pois ela disponibiliza argumentos especificamente adaptados para compilações Clifford+T. Em particular, isso corrobora um argumentorz_synthesis_configque controla a síntese das rotações RZ na base de Clifford+T. -
Foram adicionadas equivalências para as portas
C3SXGatepadrão eRC3XGateaoStandardEquivalenceLibrary. -
generate_preset_pbc_pass_manager()Foi adicionada uma nova função, que permite construir um gerenciador de passagens predefinido para compilação em uma representação intermediária PBC (cálculo baseado em Pauli), composta porPauliProductRotationGateobjetos ePauliProductMeasurement, bem comoBarrierporReset,Delay,, e operações de fluxo de controle. -
O
CommutativeCancellationpass agora emitirá umXGateouSXGatese a rotação X monitorada for um múltiplo adequado de e se o portão correspondente estiver no circuitoTargetou no circuito de entrada. -
Agora é possível definir um valor padrão para o
seed_transpilerargumento detranspile()egenerate_preset_pass_manager()por meio dotranspiler_seedcampo no arquivo de configuração do usuário. -
QISKIT_TRANSPILER_SEEDAgora é possível definir um valor padrão para oseed_transpilerargumento detranspile()egenerate_preset_pass_manager()por meio da variável de ambiente, que tem precedência sobre a chave equivalente em um arquivo de configuração do usuário. -
Foi adicionado um novo argumento
getterà etapaFixedPointde análise. Essa função de retorno opcional pode ser fornecida para derivar um valor doPropertySetem vez de ler uma única chave diretamente. -
O passe
ConvertToPauliRotationsagora oferece suporte a circuitos comControlFlowOpobjetos. -
Ampliamos a
ConvertToPauliRotationsetapa do transpiler para lidar com circuitos quePauliProductRotationGateincluem objetos ePauliProductMeasurement. Essas operações são repassadas sem alterações durante a conversão. -
Os
RemoveIdentityEquivalenttranspiladores eCommutativeOptimizationforam ampliados para lidar comPauliProductRotationGateportas. -
Ampliamos o
LitinskiTransformationpass para oferecer suporte a portas de rotação de qubit único do tipo e , bem comoPauliProductRotationGateàs operações ePauliProductMeasurement. -
Portas de rotação de um único qubit e
PauliProductRotationGateobjetos com ângulos que são múltiplos inteiros de — até a aproximação especificada — são agora reconhecidos como portas de Clifford peloLitinskiTransformationteste. -
Foi adicionado um
approximation_degreeargumento à funçãoLitinskiTransformationpass, que define as aproximações permitidas para interpretar rotações próximas de Clifford como portas de Clifford. -
Habilitou verificações baseadas em matriz entre
PauliProductRotationGatee outras portas baseadas em matriz noCommutationChecker. Anteriormente, essas verificações sempre retornavamFalse. -
TwoQubitControlledUDecomposeragora realiza a síntese usando 8 portas de qubit único, em vez de 24. -
O
LitinskiTransformationagora também suporta circuitos comPhaseGateinstruções eU1Gate. Anteriormente, o único portão parametrizado aceito eraRZGate. -
Habilitou fluxos de trabalho de compilação multi-IR utilizando o novo
MultiStagePassManager. Esse gerenciador de passagens oferece um fluxo de execução em etapas, no qual cada etapa pode preservar o IR ou transformá-lo em outro IR. As etapas podem ser definidas de forma genérica por meio da interfaceTask(e da classe baseGenericPass), que pode ser usada para gerar o IR, ou por meio de objetosBasePassManager, o que as torna compatíveis com pipelines existentes, como os fornecidos porgenerate_preset_pass_manager(). -
As funções
generate_preset_pass_manager()etranspile()agora encaminham oapproximation_degreeargumento para asCommutativeOptimizationetapas de compilação eSubstitutePi4Rotations. Como essas duas opções não oferecem suporteapproximation_degree=Nonea, o valor padrão passa a ser1.0quandoNoneé especificado. -
Agora, o
CommutationCheckerpode verificar com eficiência as comutações entre portas padrão e portas baseadas em Pauli, comoPauliEvolutionGate,PauliProductRotationGate,PauliProductMeasurement, ePauli, sem precisar recorrer a verificações baseadas em matrizes. -
Durante o layout e o roteamento no Sabre (
SabreLayouteSabreSwap), alookaheadheurística agora é definida em termos do número de camadas do circuito, em vez do número de portas lógicas. Isso reduz o viés na heurística; para circuitos estreitos, a heurística anterior poderia atribuir o mesmo peso a portas muito distantes e a portas quase roteáveis, enquanto que, para circuitos largos (mais de 40 qubits), ela não seria capaz de rastrear todas as portas, mesmo na única camada atrás da fronteira. -
Melhoria no
CommutationCheckerdesempenho ao avaliar comutações entrePauliProductRotationGateobjetos ePauliProductMeasurement. Isso é alcançado representando seus geradores como Paulis de um único termo e realizando verificações de comutatividade por meio dessas representações. -
Melhoria no desempenho da etapa
CommutativeOptimizationdo transpiler em circuitos que contêmPauliProductRotationGateobjetos ePauliProductMeasurement. -
A etapa do
CommutativeOptimizationtranspiler agora remove portas que são equivalentes à identidade até uma fase global. -
Foi adicionada uma nova etapa do transpiler,
TwoQubitPeepholeOptimization, que substitui a combinação anterior deConsolidateBlockseUnitarySynthesisquandooptimization_levelé 2 ou 3 nos pipelines de compilação predefinidos.A nova passagem unificada é mais capaz de determinar quando blocos de dois qubits podem ser ressintetizados para melhorar a fidelidade estimada do circuito, resultando em compilações de maior qualidade, especialmente no caso de bases supercompletas ou objetos heterogêneos
Target. Além disso, apresenta uma melhor paralelização por threads em suas etapas de análise e síntese.
Recursos de visualização
-
plot_bloch_vector()agora aceitatupleentradas. -
O desenhador de circuitos C-API (
qk_circuit_draw()) agora suportaPauliProductMeasurementportas ePauliProductRotationGate. -
O desenhador de circuitos C-API (
qk_circuit_draw()) agora utiliza uma exibição fracionária para ângulos próximos a frações simples de , semelhante aos visualizadores do espaço Python. -
O desenhador de circuitos C-API (
qk_circuit_draw()) agora representa as medidas eCPhaseGateas operações com maior clareza.
Notas sobre a atualização do transpiler
- A
transpile()função agora utiliza um fluxo de trabalho de compilação diferente e mais eficiente ao compilar para uma base Clifford+T. Neste fluxo de trabalho, não são mais utilizados os plug-ins genéricos de síntese unitária para sintetizar operadores unitários de um único qubit em sequências Clifford+T. Atualmente, o sistema se baseia na compilação em portas de e e na síntese direta dessas portas, o que proporciona melhor qualidade e desempenho em tempo de execução. Como resultado, os"unitary_synthesis_method"argumentos e"unitary_synthesis_plugin_config"não afetam mais a síntese Clifford+T emtranspile(). Em vez disso, a precisão pode ser definida globalmente ao configurar oapproximation_degree, ou usandogenerate_preset_clifford_t_pass_manager()que disponibilizarz_synthesis_configo argumento para passar uma configuração para a síntese do .
Notas diversas sobre a atualização
-
A versão mínima exigida do NumPy é agora a 2.0, em conformidade com as recomendações do SPEC 0.
-
O Qiskit agora conta com uma política formal de versões de dependências, descrita na documentação sobre contribuições do repositório. Isso é:
- NumPy e SciPy seguem o padrão SPEC 0 da comunidade científica Python (dois anos de suporte);
- Todas as demais dependências do Python e do Rust não têm restrições além da compatibilidade com a plataforma;
- As dependências opcionais, exclusivas para compilação e exclusivas para desenvolvedores do Python não têm restrições e não precisam ser compatíveis com todas as versões de tempo de execução do Python nem com todas as plataformas de hospedagem.
Circuitos: Funcionalidades obsoletas
-
O
CommutationCheckernão mantém mais um cache interno de relações de comutação. Os itens a seguir estão, portanto, obsoletos e serão removidos do Qiskit v3.0:- o
cache_max_entriesargumento do construtor; definir isso agora não tem efeito algum. clear_cached_commutations()método; chamá-lo não produz nenhum efeito.- o
num_cached_entries()método; ao chamá-lo, ele sempre retornará 0.
- o
Obras obsoletas da Síntese
-
Vários comportamentos dos argumentos de
qs_decomposition()estão agora obsoletos e serão removidos no Qiskit v3.0.- Não é mais necessário definir
opt_a1eopt_a2; a função determina automaticamente se as otimizações podem ser aplicadas. decomposer_1qedecomposer_2qdevem ser instâncias deOneQubitEulerDecomposerouTwoQubitBasisDecomposer, respectivamente; o uso de funções chamáveis arbitrárias do tipo Python apresenta baixo desempenho em comparação com o núcleo do Rust.
- Não é mais necessário definir
Alterações no sistema de compilação
-
A ferramenta de geração de ligações integrada ao repositório foi renomeada de
qiskit-bindgen-cparaqiskit-bindgen-cli. A receitamake cpreferidaMakefilenão é afetada. -
qiskit-bindgen-cliadquiriu umcheck-abicomando capaz de verificar se duas listas de slots (seja provenientes deqiskit-bindgen-cli show-slotsou compiladas emqiskit-cext-vtable) são compatíveis com o semver para os números de versão relevantes. -
qiskit-bindgen-cliadquiriu oshow-slotscomando, que exibe uma lista das atribuições de slots para a ligação em tempo de execução à API C (por exemplo, por meio do pacote Qiskit com o espaço “ Python ”). -
A versão mínima da dependência
setuptools-rustde compilação foi atualizada para 1.13 para permitir o uso do novoExtension(generated_files=...)argumento. -
Agora, o Qiskit pode ser compilado, opcionalmente, usando o mimalloc como alocador global.
QISKIT_BUILD_WITH_MIMALLOC=1Para ativar o uso do mimalloc, defina a variável de ambiente. Essa opção pode ser usada tanto na compilação do pacote Python quanto ao utilizar o Makefile (make c) para compilar uma biblioteca compartilhada independente. -
A versão mínima compatível do Rust (MSRV) para compilar o Qiskit a partir do código-fonte foi aumentada de 1.85 para 1.87. O Rust 1.87 precisou ser atualizado para as versões mais recentes de nossas dependências de código-fonte. Mais especificamente, o nalgebra 0.34 requer o Rust 1.87.
-
A versão mínima exigida do stestr nos requisitos de teste foi alterada de 2.0 para 3.2.0. Isso foi feito para aproveitar os novos recursos do stestr, principalmente o
stestr historycomando, em tarefas de teste de integração contínua Python.
Problemas Conhecidos
-
O Qiskit v2.2 e v2.3 podem gerar arquivos QPY ilegíveis para circuitos que contenham um
ParameterExpression, nos quais todas as instâncias contidasParameterforam anuladas na expressão final. Por exemplo, se a expressão0*x + 1.5aparecer em um circuito, tanto o Qiskit v2.2 quanto o v2.3 produzirão um arquivo QPY que não poderá ser lido por nenhuma versão do Qiskit, incluindo os próprios e o v2.4, devido a erros na geração do arquivo QPY.Esse erro geralmente aparece (pelo menos no v2.4 do Qiskit) como um
QpyErroracompanhado de uma mensagem do tipo “expressão inválida: a pilha estava vazia antes que a expressão fosse concluída”. -
Os arquivos QPY gerados pelo
qiskit-terrav0.24 e versões anteriores podem definirParameterVectorinstâncias cujos elementos possuam atributos desconectadosParameter.uuid, o que não permite uma conversão completa de ida e volta. Antes desta versão do Qiskit, o QPY emitia um aviso caso detectasse um implícitoParameterVectorque não tivesse sido completamente reconstruído. O QPY não exibirá mais avisos nessa situação.Para observar o comportamento perigoso, é necessário que todos os seguintes requisitos sejam atendidos:
- você carrega duas cargas úteis de circuito QPY distintas (no mesmo arquivo ou em arquivos separados) geradas pelo
qiskit-terrav0.24 ou versões anteriores. ParameterVectorOs dois circuitos utilizamParameterVectorElementinstâncias derivadas do mesmo.- Um circuito utiliza um determinado elemento do vetor, enquanto o outro não o utiliza.
- você tenta comparar o elemento deserializado
ParameterVectorElementdiretamente do circuito que o utilizou com o mesmo índice de elemento, mas recuperado por meio daParameterVectorElement.vectorreferência reversa de um elemento diferente do circuito que não utiliza o elemento comparado.
O aviso foi removido porque, na versão atual do Qiskit, trata-se de um falso positivo com muito mais frequência do que de um problema efetivamente observado. O Qiskit, a partir da versão v2.5, criará, de fato, um conjunto implícito
ParameterVectorcujos elementos são considerados iguais entre os circuitos. - você carrega duas cargas úteis de circuito QPY distintas (no mesmo arquivo ou em arquivos separados) geradas pelo
Problemas de segurança
-
Os analisadores do OpenQASM 2 (
qasm2.load()eqasm2.loads()) agora encerrarão a execução com umRecursionErrorao tentar avaliar uma expressão excessivamente profunda. A profundidade máxima permitida é obtida a partir desys.getrecursionlimit()Python no ponto de entrada nos analisadores.Anteriormente, os analisadores podiam realizar recursões arbitrárias no espaço de Rust, acabando por exceder o espaço máximo da pilha e causando uma falha de segmentação no processo.
Correções de bugs
-
Corrigida
ConstrainedReschedulea geração de umTranspilerErrorao reprogramar um circuito que contém umBarrier. Corrigido o #16135. -
synth_cz_depth_line_mr()agora gerará um erro de espaçoValueError“ Python ” em caso de entradas malformadas, em vez de um panic de espaço “Rust”. Corrigido o #16152. -
Corrigiu um bug em
ElidePermutationseStarPreRoutingao compor layouts de permutação virtual (permutações implícitas aplicadas no final do circuito). -
ConstrainedReschedulenão geraráAttributeErrormais se o argumento opcionaltargetnão for fornecido. Veja o nº 16245. -
CRXGateCorrigiu-se um erro naCommutationCheckeravaliação das relações de comutatividade entre as portas de rotação controlada,CRYGateeCRZGatee outras portas padrão.CommutationAnalysisEm particular, corrigiu-se o comportamento das passagens,CommutativeCancellation,CommutativeOptimizationeqk_transpiler_pass_standalone_commutative_cancellation()na presença dessas portas.Corrigido o #16164.
-
Corrigimos um bug no
InverseCancellationqualCSGateos pares de eCSdgGatecom argumentos de qubit invertidos eram cancelados de forma inconsistente. Anteriormente, uma sequência de (com argumentos de qubit invertidos) foi cancelada, mas não foi. Agora, ambos são cancelados constantemente.Corrigido o #15855.
-
Corrigido
MultiplierGatede forma que sua decomposição padrão preserve o número solicitado de qubits de resultado. Anteriormente, ele ignorava esse argumento e sempre realizava a decomposição utilizando o dobro do número de qubits de estado para os qubits de resultado. Corrigido o #16168. -
Corrigiu uma falha grave que ocorria
RemoveIdentityEquivalentquando a fase global do circuito continhaParameterVectorElementobjetos. The message was:Não é possível clonar um ponteiro na pilha de Python sem que a thread esteja vinculada.
Veja o nº 16053.
-
latex``π/2A visualização do circuito não imprime mais um sinal de grau redundante à esquerda1para ângulos dentro da tolerância de para valores inteiros de (por exemplo1π/2, agora é ), incluindo os modos de saída,mpl, eqasm.Corrige o problema #16170.
-
Corrigido
qpy.load()para versões do QPY >=13, nas quaisDelayinstruções com durações inteiras podiam ser deserializadas para tipos incorretos. Isso poderia fazer com que o código posterior gerasse erros, como, por exemplo,qasm3.dumps_experimental()retornar uma mensagem de erro informando “Falha ao analisar o valor do parâmetro”. Consulte o nº 16076 para obter mais detalhes. -
Corrigida
Statevector.evolve()a modificação do vetor de estado de entrada no próprio local quando a instrução possui uma fase global. Veja o nº 15750. -
Certifique-se de que não ocorra nenhum “pânico de subtração” devido a subfluxo em
ConstrainedReschedule. Corrigido o #16231. -
Corrigiu-se um bug no
UnrollForLoopsqual, ao desdobrar uma função estáticaQuantumCircuit.for_loop()cujo corpo contivesse um valor diferenteQuantumCircuit.global_phasede zero, era adicionada uma cópia extra da fase do corpo.Corrigido o #16185.
-
VF2LayouteVF2PostLayoutnão entrará mais em pânico dizendo “os valores de ponto flutuante não devem retornar nan” ao se deparar com instruções cujos erros são relatados como1.0. -
Corrigido
LinearFunction.inverse(): sempre atendendoCircuitErrorchamadas de plantão. Veja o nº 16184. -
Corrigimos um problema em que o
transpile_optimization_levelcampo do arquivo de configuração do usuário não era respeitado ao chamargenerate_preset_pass_manager().transpile()Anteriormente, isso afetava apenas. -
plot_bloch_vector()não alteralistmais as entradas. -
CouplingMapagora ignorará as arestas que conectam um qubit a si mesmo e exibirá um aviso a respeito. Anteriormente, esses erros eram aceitos silenciosamente de forma incorreta, o que poderia causar erros de longo prazo no código, dependendo do gráfico de acoplamento. -
Corrigido
dagdependency_to_circuit()para preservar corretamente a fase global do circuito durante a conversão. Corrigido o #16166. -
Corrigido
BitArray.bitcount()para que ignore os bits de preenchimento não utilizados no armazenamento de bytes compactados. Veja o nº 16173. -
Corrigimos um bug no
CommutationCheckerqual certos portões baseados em Rust, como oUnitaryGate, podiam contornar a verificação do tamanho da matriz e levar ao cálculo de matrizes grandes. -
Corrigido
circuit_to_dagdependency()o erro que impedia a cópia doglobal_phase. Veja o nº 14537. -
clifford_6_4()Corrigimos os modelos,rzx_xz(),rzx_zz1(),rzx_zz2(), erzx_zz3()para queTemplateOptimizationagora o os aceite e os aplique. Cada um desses modelos implementa a identidade apenas até uma fase global em seu conteúdo de porta, mas não incluía o campo de compensaçãoglobal_phase, o que faziaTemplateOptimizationcom que fossem rejeitados silenciosamente a cada execução. Veja o nº 14538. -
Corrigida
CommutativeCancellationa alteração incorreta da fase global em ao acumular uma rotação de usando a opçãoPhaseGateouU1Gate. Corrigido o #16377. -
Corrigido
Commuting2qGateRouterpara que preserve a fase global do circuito de entrada, em vez de adicioná-la novamente ao compor operações acumuladas não roteadas. Corrigido o #16205. -
Corrigimos um problema em
ConsolidateBlocksque a seleção do portão de base nem sempre era determinística no caso em que o conjunto de bases contivesse múltiplos portões paramétricos ou múltiplos portões não paramétricos de 2 qubits. Isso poderia resultar em circuitos transpilados diferentes entre as execuções. -
Fixo
ForLoopOpcom números inteiros negativos em seu conjunto de índices. Anteriormente, foi levantada umaOverflowErrorquestão. Veja o nº 16412. -
Apenas no Qiskit v2.5.0rc1, o tipo
QkLoopElementsda API em C listava erroneamente seuelementsmembro comoconst size_t *. Isso agoraconst ptrdiff_t *serve para levar em conta valores negativos. -
Corrigimos um bug em
ConsolidateBlocksquandoforce_consolidate=True, no qual os blocos e as sequências não eram consolidados se os portões de base não permitissem a seleção de um decompositor. -
Corrigido
Initialize.gates_to_uncompute()para retornar um circuito com o número correto de qubits, quando a porta foi construída usando uma forma inteira (por exemplo,Initialize(1, num_qubits=2)). Corrigido o #16413. -
Corrigimos uma mensagem de erro ambígua em
Initialize.inverse(), que agora gera imediatamente um erro quando chamada, uma vez que a instrução não é invertível.Veja o nº 15595.
-
Corrigimos um problema com as
qk_transpile()funções da API C eqk_transpile_stage_optimization()ao usaroptimization_level3 noQkTranspileOptions. Anteriormente, a lógica interna de rastreamento do ponto mínimo não atualizava o DAG mesmo após encontrar um circuito melhor. Isso resultou na geração de um circuito cuja profundidade e tamanho não haviam sido otimizados corretamente. -
Corrigimos um bug na etapa do
OptimizeAnnotatedtranspiler em que os modificadores de controle com controles abertos não eram combinados corretamente. Veja o nº 16410. -
ParameterExpressioninstâncias com variáveis anuladas (comox - x) agora manterão a referência axapós uma passagem pelo QPY epickle. -
pickleParameterExpressioninstâncias cujo resultado seja um valor simples (como0*x + 2) agora passarão com sucesso pelo QPY e pelo. -
Corrigiram-se as verificações de comutatividade entre duas
PauliProductMeasurementinstruções que medem o mesmo bit clássico, as quais anteriormente não respeitavam a ordem de gravação observável. -
Corrigimos um problema na serialização para o QPY de
PauliProductMeasurementePauliProductRotationGate, em que os operadores de Pauli eram tratados incorretamente, prejudicando a compatibilidade com versões anteriores do Qiskit. Veja o nº 16099. -
Corrigida
qasm3.dump_experimental()adumps_experimental()exibição incorreta de umussufixo para atrasos especificados emms. Corrigido o #16097. -
Corrigimos a conversão para
nsemqasm3.dump_experimental()edumps_experimental()ao gerar os atrasos especificados emps. Corrigido o #16097. -
Corrigido
synth_qft_line()para sintetizar corretamente circuitos com 32 ou mais qubits. -
Corrigimos um problema em que a execução da
SynthesizeRZRotationsetapa do transpiler várias vezes com diferentes limites de erros poderia gerar resultados incorretos ou provocar erros críticos internos.Veja o nº 16385.
-
Corrigimos o tratamento da fase global em
TemplateOptimization, que anteriormente redefinia silenciosamente a fase global do circuito de entrada para zero e não corrigia as fases globais dos modelos.Corrige o problema #14537.
-
Corrigido
QuantumCircuit.compose()o erro que ocorriaValueErrorquandofront=Trueera usado com um mapeamento explícitoqubits. Veja o nº 15834. -
Corrigimos um bug na etapa
CommutativeOptimizationdo transpiler em que pares deXXPlusYYGateportas que atuavam nos mesmos qubits, mas em ordem invertida, podiam ser simplificados incorretamente. Veja o nº 16161. -
Corrigido um erro no
BasisTranslatorqual um circuito com operações de fluxo de controle aninhadas fazia com que seus blocos ignorassem as transformações calculadas.Veja os números #13162, #14025 e #15734.
-
A desserialização do QPY não emite mais um aviso ao carregar um circuito que utilize alguns, mas não todos, os elementos de um
ParameterVector. -
Corrige um problema em que o
LightConeprocessamento falhava devido a erros de índice ou falhas por falta de memória ao encontrar operações grandes ou complexas. Corrigimos os problemas #15021 e #13828. -
Corrigimos um problema na decomposição de Schur para determinadas matrizes, reimplementando-a usando
faerem vez denalgebra. O problema pode ocorrer ao executar a decomposição de Shannon quântica por meio deqs_decomposition(), bem como por meio daUnitarySynthesisetapa do transpiler ou por meio detranspile().Veja o nº 15870.
-
QuantumCircuit.remove_final_measurements()não exibirá mais um aviso indesejado sobre a tentativa de adicionar registros quando for chamado em um circuito com layout definido. -
Os circuitos com
Resetinstruções agora podem ser agendados em relação a umGenericBackendV2. -
Corrigimos um problema de não determinismo em
random_clifford_circuit(), mesmo quando se define uma semente. Veja o nº 16138.
Aprimoramentos de desempenho
-
A biblioteca interna de álgebra linear utilizada por
TwoQubitBasisDecomposereTwoQubitWeylDecompositioné agora a nalgebra. Isso oferece alocações na pilha e operações otimizadas para matrizes pequenas. Ambas as passagens agora têm melhor desempenho e consomem menos memória. Consulte os números #15928 e #15960 para obter mais detalhes. -
Melhorou-se o desempenho dos níveis de otimização 1, 2 e 3 na compilação para conjuntos de bases Clifford+T, especialmente para circuitos muito profundos. Anteriormente, a profundidade do circuito era usada como indicador para determinar se um ponto fixo nas etapas de otimização havia sido alcançado; esse indicador foi substituído pelas contagens de RZ e T (dependendo da etapa de otimização). Isso não só é significativamente mais rápido, como também reflete melhor a métrica alvo. Consulte o nº 16218 para obter mais detalhes.
-
A etapa do
ConsolidateBlockstranspiler e sua funçãoqk_transpiler_pass_standalone_consolidate_blocks()da API em C agora são multithread, o que resulta em melhor desempenho em tempo de execução. Consulte o nº 16230 para obter mais detalhes. -
Corrigimos uma regressão de desempenho que ocorria apenas em v2.5.0rc1 ao executar
VF2LayouteVF2PostLayoutem mapas de acoplamento de grande porte com conectividade de grau muito elevado. -
PauliProductRotationGate.to_matrix()Melhorou-se o tempo de execução do método. Para os operadores de Paul 10‑qubit, isso resulta em um aumento de velocidade de cerca de 500×. -
As versões pré-compiladas disponíveis em PyPI agora são compiladas utilizando o mimalloc como alocador global. Isso melhora o desempenho em tempo de execução e o uso de memória do Qiskit. Para mais detalhes, consulte o #16024.
-
A etapa
Optimize1qGatesDecompositiondo transpiler e suas funçõesqk_transpiler_pass_optimize_1q_sequences()da API em C eqk_transpiler_pass_standalone_optimize_1q_sequences()agora são multithread, o que resulta em melhor desempenho em tempo de execução. Consulte o nº 15567 para obter mais detalhes. -
A etapa do
CommutationAnalysistranspiler agora é multithread, o que resulta em melhor desempenho em tempo de execução. Consulte o nº 16014 para obter mais detalhes. -
A etapa do
CommutativeCancellationtranspiler agora é parcialmente multithread internamente (quando executa a análise de comutação). Isso resultou em uma melhoria no desempenho em tempo de execução. Consulte o nº 16014 para obter mais detalhes. -
A função
qk_transpiler_pass_standalone_commutative_cancellation()da API C agora é parcialmente multithread internamente (quando executa a análise de comutação). Isso resultou em uma melhoria no desempenho em tempo de execução. Consulte o nº 16014 para obter mais detalhes. -
A etapa do
UnitarySynthesistranspiler agora é multithread quando executada com o plug-in de síntese padrão, o que resulta em melhor desempenho em tempo de execução. Consulte o nº 16275 para obter mais detalhes. -
A função
qk_transpiler_pass_standalone_unitary_synthesis()da API C agora é multithread internamente. Isso resulta em um melhor desempenho em tempo de execução. Consulte o nº 16275 para obter mais detalhes. -
BitArray.bitcount()agora utiliza internamente uma chamada mais eficiente do tipo “ NumPy ”, com um aumento de velocidade de aproximadamente 5x em 100 qubits. Consulte o nº 15836 para obter mais detalhes. -
ParameterVectorfoi reimplementado em Rust. Agora, sua construção é aproximadamente cinco vezes mais rápida, e seus elementos vetoriais ocupam significativamente menos memória. -
O roteamento Sabre (utilizado em
SabreSwapeSabreLayout) agora atualiza sua estrutura de camadas de conjunto estendido no próprio local, em vez de reconstruí-la a cada porta roteada. Trata-se de uma melhoria significativa no desempenho para circuitos amplos com estruturas de camadas densas; um circuito de volume quântico de 115 qubits agora é roteado em aproximadamente 2/3 do tempo anterior. Consulte o nº 14912 para obter mais detalhes. -
Melhorou o desempenho em
SubstitutePi4Rotationscenários práticos. Normalmente, apenas uma fração muito pequena das portas de rotação é substituída por portas equivalentes fixas, e é significativamente mais rápido substituir as operações no próprio código do que reconstruir o DAG. Para circuitos com um grande número de portas, isso pode reduzir significativamente o tempo de execução; por exemplo, uma redução de mais de 10x para um circuito QSVT com 43 milhões de portas. Consulte o #16217 para obter mais detalhes e resultados de testes de desempenho. -
qk_transpiler_pass_standalone_basis_translator()O transpiler passaBasisTranslator,UnitarySynthesis, eSplit2QUnitaries, e suas funções correspondentes da API C,qk_transpiler_pass_standalone_unitary_synthesis(),qk_transpiler_pass_split_2q_unitaries()eqk_transpiler_pass_standalone_split_2q_unitaries(), alteraram internamente a ordenação topológica utilizada na geração de sua saídaDAGCircuit, o que melhora o desempenho em tempo de execução dessas etapas, evitando a sobrecarga causada pela ordenação topológica lexicográfica utilizada anteriormente. Consulte o nº 15987 para obter mais detalhes. -
A nova
TwoQubitPeepholeOptimizationetapa do transpiler agora é utilizada como parte dos gerenciadores de etapas predefinidas, conforme gerados porgenerate_preset_pass_manager()e utilizados internamente portranspile(), para a etapa de otimização nos níveis de otimização 2 e 3. Isso substitui o uso anterior dasConsolidateBlockspassagens de transpilação eUnitarySynthesisnesses níveis na etapa de otimização para realizar a otimização peephole. A nova passagem oferece melhor desempenho em tempo de execução e heurísticas mais precisas para a síntese. -
O algoritmo de hash interno utilizado para os tipos
indexmapdo Rust foi alterado para usar ofoldhashem vez da biblioteca ahash, utilizada anteriormente. Isso resultou em ganhos de velocidade para algumas das funcionalidades que utilizam intensamente o indexmap internamente. Consulte o nº 15920 para obter mais detalhes.