Notas de versão do Qiskit SDK 2.0
2.0.3
Prelúdio
O Qiskit v2.0.3 é uma versão de correção de bugs para a série de versões secundárias v2.0.
Correções de bugs
-
ApplyLayoutagora tratará corretamente o caso da aplicação de um zero-qubitLayout. Anteriormente, ele alegava que nenhum layout havia sido definido, mesmo que o campo"layout"do arquivoPropertySetfosse igual aLayout(). -
Foi corrigido um problema na passagem do
ElidePermutationsem que a permutação de saída não era atualizada corretamente na presença de operaçõesPermutationGateoperações. Isso resultaria em um circuito de saída incorreto e em uma propriedadevirtual_permutation_layoutincorreta noproperty_setque está sendo definido. Quando executado como parte de umPassManagermaior, isso também resultaria em umTranspileLayoutincorreto sendo retornado noQuantumCircuit.layoutno circuito de saída. -
Foi corrigido um bug na função
HighLevelSynthesisao desenrolar objetos aninhados/personalizadosInstructionaninhados/personalizados. Se oQuantumCircuitretornado porInstruction.definitionretornado de um objeto personalizado contivesse algum objetoClbitesses bits clássicos usariam incorretamente o índice interno dentro do objetoInstruction.definitionQuantumCircuitem vez de mapeá-los para o índice correspondente no objeto externoQuantumCircuit. -
Foi corrigido um bug no
PauliEvolutionSynthesisDefaultePauliEvolutionSynthesisRustiqque modificava o atributo.synthesis do circuito original ao definirpreserve_order=False. O comportamento dos plug-ins foi restaurado e o circuito original agora é preservado em todo o pipeline de transpilação. -
Foi corrigido um problema de compatibilidade com a versão mínima suportada do rustworkx, 0.15. Com determinadas entradas, o
VF2LayouteVF2PostLayoutestavam usando anteriormente um método rustworkx que foi adicionado no rustworkx 0.16.0, o que causaria um erro ao usar uma versão mais antiga do rustworkx que está listada como compatível. -
SabreLayouteSabreSwapnão entrará mais em pânico ao aplicar o resultado do roteamento a um circuito que usaexpr.VarouStretchem um escopo de fluxo de controle aninhado. -
qiskit.circuit.library.quantum_volume()foi atualizado para lidar com umnumpy.random.Generatorcomo entrada para seu argumentoseed. Anteriormente, esse argumento de gerador resultava em umTypeError.
2.0.2
Prelúdio
O Qiskit v2.0.2 é uma versão de correção de bugs para a série de versões secundárias v2.0.
Correções de bugs
-
Corrigido o atributo
nameda classeOrGatede modo que agora ele seja definido como"or"para identificar exclusivamente esse portão. Anteriormente, ele estava incorretamente definido como"and", o que tornava impossível distingui-lo deAndGateou ter plug-ins de síntese para sintetizar umOrGate. -
Foi corrigido um problema na passagem do
ConsolidateBlocksem que falhava na consolidação de alguns blocos se a porta KAK selecionada (diretamente ou por meio do destino) fosse supercontrolada e nãoCXGate. Corrigido #14413 -
Correção de um bug nas funções do circuito
evolved_operator_ansatz(),qaoa_ansatz()ehamiltonian_variational_ansatz()em que os parâmetros tinham um componente complexo zero. Normalmente, isso não era um problema, a menos que o parâmetro fosse traduzido para SymPy usando o métodoParameterExpression.sympify()o que geraria um erro.
2.0.1
Prelúdio
O Qiskit v2.0.1 é uma versão menor de correção de bugs para a série de versões v2.0.x.
Correções de bugs
-
Correção de um bug de visualização na gaveta de circuito de texto em que as operações de fluxo de controle pós-transpilação podiam ter seu "colchete" de fechamento renderizado verticalmente fora de ordem. Consulte #14271 para obter mais detalhes.
-
Foi corrigido um erro na passagem do
UnitarySynthesisonde a passagem ignorava o parâmetrosynth_gatese sintetizava apenas os portõesunitary. A passagem agora sintetiza corretamente todos os portões especificados no parâmetrosynth_gates. Corrigido #14343. -
Adicionado o suporte
reprque faltava paraDuration. -
Foi adicionado o suporte que faltava para Python decapagem de
Duration. Isso estava impedindo a transpilação paralela de circuitos comdelay()instruções que usam expressões de duração. -
Foi corrigido um problema na passagem do
HighLevelSynthesisque fazia com que ele terminasse erroneamente antes do tempo em determinados circuitos com operações de fluxo de controle. Corrigido #14338 -
Corrigimos a construção de circuitos de tempo polinomial quântico instantâneo (IQP) em
IQPe poriqp(). A implementação anterior usava incorretamente potências da porta em vez de potências da porta . -
SabreLayoutagora propagará corretamente os valores denameemetadatade um circuito ao ser executado como uma passagem conjunta de layout e roteamento. -
Foi corrigido um problema no plug-in de síntese
SolovayKitaevSynthesisem que a execução repetida do plug-in com diferentes portas de base reutilizava incorretamente as portas de base apenas da primeira execução. Esse problema foi causado pelo fato de ignorar as portas de base ao armazenar aproximações básicas em cache. -
Foi corrigido um problema na passagem do
SolovayKitaevem que a passagem poderia travar devido a uma rotação de 180 graus na recursão interna, que não era tratada corretamente. -
Foi corrigido um problema na passagem do
SolovayKitaevem que a aproximação gerada poderia ter uma fase diferente do valor correto em . Isso ocorreu devido à representação interna do , que exige um tratamento adicional para obter o sinal correto da matriz de porta de qubit. Corrigido #9552 -
Os circuitos que contêm atrasos com trechos (consulte
QuantumCircuit.add_stretch()) agora podem ser compilados com sucesso usando os gerenciadores de passagem predefinidos (transpile()egenerate_preset_pass_manager()) ao visar um backend que tenha restrições de alinhamento, por exemplo, dispositivos IBM Quantum Eagle comoibm_sherbrooke. -
A heurística de erro de fallback em
VF2LayouteVF2PostLayoutusada quando não havia taxas de erro relatadas, poderia atribuir previamente erros maiores que um e ter efeitos imprevisíveis nas pontuações de layout resultantes.
2.0.0
Prelúdio
Temos o prazer de lançar o Qiskit v2.0.0, com novos recursos que melhoram seu desempenho e suas capacidades. Os destaques dos recursos do Qiskit v2.0.0 incluem:
- A introdução de uma API C para criar e interagir com
SparseObservableobjetos. Essa primeira interface de linguagem compilada representa um marco importante na evolução do Qiskit e seu escopo aumentará ao longo da série de versões v2.x. A iteração inicial da API C é um recurso experimental, e pode haver alterações significativas na API em versões menores, seguindo nossa estratégia de versão.- A adição de uma nova
BoxOpque mapeia o conceito de caixa do OpenQASM 3 e permite agrupar séries de instruções para processamento posterior e agendamento personalizado. Esse operador é útil para aplicações como giro, aprendizado de ruído e programação baseada em alongamento, entre outras.- A capacidade de criar
stretchdurações paraDelayinstruções, o que permite expressar relações entre instruções com reconhecimento de tempo. O novo tipoStretchamplia o sistema de expressão clássica existente, permitindo que a intenção do projeto seja capturada no momento da construção do circuito e resolvida no momento da compilação. Consulte a documentação do site OpenQASM para obter detalhes.- Síntese aprimorada quando um
Targetcontém portas de base de dois qubits fracionários com suporte para ângulos arbitrários, comoRZXGateouRZZGateo que reduz significativamente a contagem de portas nos circuitos sintetizados.- Desempenho aprimorado do tempo de execução, especialmente durante a etapa de construção do circuito, em que o benchmarking de benchpress mostra um aumento de velocidade de 2x em relação ao Qiskit v1.3. Esse aprimoramento é obtido por meio de uma combinação de contribuições, incluindo o aproveitamento de representações adicionais de portas nativas do Rust, como
UnitaryGatee a remoção de elementos do modelo de dados legado.
De acordo com nossa política de controle de versão semântica, documentada no momento da versão v1.0.0, essa versão principal também inclui alterações de API que não são compatíveis com versões anteriores da série de versões v1.x. Em particular, vários componentes obsoletos do modelo de dados do Qiskit foram removidos, como o método .c_if() , o módulo qobj , BackendV1 e qiskit.pulse, bem como as implementações de referência primitiva V1 obsoletas. Consulte as seções de notas de versão de upgrade para obter mais detalhes sobre todas essas remoções e alterações de API. As APIs removidas ainda são compatíveis com a versão do Qiskit v1.4.x, que receberá correções de bugs por mais seis meses e terá atualizações de segurança por um ano.
Novos Recurso
-
O suporte para a plataforma Linux aarch64 foi promovido para suporte de nível 1, conforme documentado em:
/guides/install-qiskit#operating-system-support
de seu nível de suporte anterior de nível 2 na série de lançamentos v1.x.
-
Introduziu uma nova API em C para criar e interagir com observáveis esparsos. Embora a superfície da API nesta versão seja relativamente pequena - abrangendo apenas a classe
SparseObservableela representa um marco importante na evolução do Qiskit, pois é a primeira vez que o SDK expõe uma interface pública em C e estabelece a base para futuras expansões da interface C do Qiskit. Como essa é a primeira interface pública em C, trata-se de um recurso experimental e, se necessário, a API poderá ser alterada em um lançamento de versão secundária.A sintaxe detalhada e informações adicionais podem ser encontradas na documentação da API C. Um exemplo mínimo para construir o observável de 100 qubits
2 X0 Y1 Z2é:#include <complex.h> #include <qiskit.h> #include <stdint.h> #include <stdio.h> int main(int argc, char *argv[]) { // build a 100-qubit empty observable uint32_t num_qubits = 100; QkObs *obs = qk_obs_zero(num_qubits); // add the term 2 * (X0 Y1 Z2) to the observable complex double coeff = 2; QkBitTerm bit_terms[3] = {QkBitTerm_X, QkBitTerm_Y, QkBitTerm_Z}; uint32_t indices[3] = {0, 1, 2}; QkObsTerm term = {coeff, 3, bit_terms, indices, num_qubits}; qk_obs_add_term(obs, &term); // print some properties printf("num_qubits: %u\n", qk_obs_num_qubits(obs)); printf("num_terms: %lu\n", qk_obs_num_terms(obs)); // free the memory allocated for the observable qk_obs_free(obs); return 0; }
Recursos dos circuitos
-
Adicionada uma nova função de conveniência
get_control_flow_name_mapping()que retorna um mapeamento dos nomes de operações de fluxo de controle do Qiskit para suas classes correspondentes.Exemplo de uso:
from qiskit.circuit import get_control_flow_name_mapping ctrl_flow_name_map = get_control_flow_name_mapping() if_else_object = ctrl_flow_name_map["if_else"] print(if_else_object)<class 'qiskit.circuit.controlflow.if_else.IfElseOp'> -
Adicionado um novo método de circuito,
QuantumCircuit.estimate_duration()para estimar a duração de um circuito programado após a transpilação. A duração do circuito é estimada ao encontrar o caminho mais longo em um circuito programado com base nas durações fornecidas por um determinadoTarget. Esse método só funciona para circuitos simples que não contêm fluxo de controle ou outras operações clássicas de avanço.Use esse método em vez do atributo
QuantumCircuit.durationse você precisar de uma estimativa da duração total do circuito.Exemplo de uso:
from qiskit import QuantumCircuit, transpile from qiskit.providers.fake_provider import GenericBackendV2 backend = GenericBackendV2(num_qubits=3, seed=42) circ = QuantumCircuit(3) circ.cx(0, 1) circ.measure_all() circ.delay(1e15, 2) circuit_dt = transpile(circ, backend, scheduling_method="asap") duration = circuit_dt.estimate_duration(backend.target, unit="s") print("Estimated duration: ", duration) -
Adicionadas duas novas classes:
BitFlipOracleGateePhaseOracleGate.BitFlipOracleGatefoi introduzido como uma alternativa para sintetizar diretamenteBooleanExpression, que foi removido no Qiskit v2.0.PhaseOracleGatefoi adicionado como uma alternativa aoPhaseOraclejá que o último será preterido nas versões do site v2.x. Ambas as classes compartilham a interface dePhaseOracleexceto pelo métodoevaluate_bitstring, que não está mais presente.BitFlipOracleGatesintetiza um oráculo de inversão de bit em vez de um oráculo de inversão de fase, o que significa que ele atua em um qubit adicional e pode ser visto como a aplicação de uma operação X controlada, em que o controle é determinado pelo valor da expressão codificada pelo oráculo.from qiskit import QuantumCircuit from qiskit.circuit.library.bit_flip_oracle import BitFlipOracleGate qc = QuantumCircuit(5) bool_expr = "(x0 & x1 | ~x2) & x4" oracle = BitFlipOracleGate(bool_expr) qc.compose(oracle, inplace=True) qc.draw('mpl') qc.decompose().draw('mpl')
from qiskit import QuantumCircuit from qiskit.circuit.library.phase_oracle import PhaseOracleGate qc = QuantumCircuit(5) bool_expr = "(x0 & x1 | ~x2) & x4" oracle = PhaseOracleGate(bool_expr) qc.compose(oracle, inplace=True) qc.draw('mpl') qc.decompose().draw('mpl')
-
Um novo fluxo de controle op,
BoxOpe seu métodoQuantumCircuit.box()e o gerenciador de contexto associados estão agora disponíveis emqiskit.circuit.A maneira normal de construir uma caixa é usar o
QuantumCircuit.box()gerenciador de contexto:from qiskit.circuit import QuantumCircuit qc = QuantumCircuit(5) with qc.box(): # This box "uses" qubits 0 and 1. qc.x(0) qc.z(1) # Boxes can be assigned a duration. with qc.box(duration=100, unit="ms"): # This box "uses" qubits 2, 3 and 4. # Qubit 4 undergoes no operations. qc.cx(2, 3) qc.noop(4)A "caixa" do Qiskit mapeia quase diretamente o conceito de caixa do OpenQASM 3.
Todos os qubits "usados" pela caixa são sincronizados no início e no final da caixa. Em outras palavras, a caixa tem a mesma "duração" para cada qubit que usa, e os pontos de início são sincronizados. Outras operações no mesmo escopo que a própria
BoxOpé válida para comutar uma operação passando por uma caixa inteira se a operação comutar com a ação da caixa inteira, mas geralmente não é válido mover uma operação para dentro ou para fora de uma caixa.Os principais usos de uma caixa são agrupar uma série de instruções para processamento posterior (como o agrupamento de uma camada parcial de portas de dois qubits) e programar um bloco composto em um escopo enquanto usa programação relativa dentro do bloco (como o desacoplamento dinâmico de vários qubits em um grupo). O compilador do Qiskit ainda não tem passagens integradas que agruparão instruções ou programarão instruções com um
BoxOp.O transpilador é compatível com roteamento e layout na presença de caixas e otimizará dentro da caixa (até a configuração
optimization_level), mas ainda não realiza otimizações em torno da estrutura atômica das caixas. A caixa de suporte de gavetas de circuito com base em texto e Matplotlib. A exportação para o QPY e para o OpenQASM 3 é compatível, embora o OpenQASM 3 atualmente não tenha como designar qubits ociosos em uma caixa (espera-se que uma alteração nas especificações adicione isso em um futuro próximo: consulte a proposta de recurso relevante ). -
Adicionado um novo argumento
approximation_degreeaoCommutationChecker.commute()eCommutationChecker.commute_nodes(). Esse argumento permite que você defina o limite de aproximação para quando os portões são avaliados como comutadores. Consulte a documentação deCommutationCheckerpara obter mais informações. -
Foi adicionado um novo método de circuito,
QuantumCircuit.noop()que permite que os qubits sejam explicitamente marcados como usados em um escopo de construtor de fluxo de controle sem adicionar uma operação correspondente a eles. -
O módulo clássico de expressões em tempo real
qiskit.circuit.classicalagora pode representar expressões constantes. A classeExpragora tem um atributo booleanoconstque indica a constância da expressão. Isso nos permite impor que as expressões em determinados contextos devem ser possíveis de serem avaliadas em tempo de compilação.Todas as expressões
Varsão consideradas não-const, enquanto todas as expressõesValuesão constantes.Uma expressão composta apenas por outras expressões const também é const:
from qiskit.circuit.classical import expr assert expr.bit_and(5, 6).constUma expressão que contém qualquer expressão não-constante é não-constante:
from qiskit.circuit.classical import expr, types assert not expr.bit_and(5, expr.Var.new("a", types.Uint(5)).const -
O módulo clássico de expressões em tempo real
qiskit.circuit.classicalclássico agora pode representar durações usando o novo tipoDuration.O módulo
qiskit.circuittambém tem uma nova classeDurationque pode ser usada como um valor literal em expressões clássicas.A função
lift()pode ser usada para criar uma expressão de valor a partir de umaDurationinstância:from qiskit.circuit import Duration from qiskit.circuit.classical import expr expr.lift(Duration.dt(1000)) # Value(Duration.dt(1000), Duration()) -
O módulo clássico de expressões em tempo real
qiskit.circuit.classicalagora pode representar IEEE-754 valores de ponto flutuante de precisão dupla usando o novo tipoFloat.A função
lift()pode ser usada para criar uma expressão de valor a partir de um float Python :from qiskit.circuit.classical import expr expr.lift(5.0) # >>> Value(5.0, Float())Esse tipo é destinado principalmente para uso em expressões relacionadas a tempo (
durationestretch). Não é compatível com operações bit a bit ou lógicas, embora possa ser usado com elas se forem primeiro convertidas explicitamente em outra coisa. -
Reduziu o número de portas de dois qubits ao decompor portas unitárias de um qubit com controle múltiplo. Por exemplo:
- Para o controle múltiplo
YGateem 10 qubits, aCXGatecontagem foi reduzida em 56%. - Para o controle múltiplo
HGateem 10 qubits, aCXGatecontagem foi reduzida em 56%. - Para sistemas multicontrolados
SXGateeSXdgGateem 10 qubits, a contagem deCXGatecontagem foi reduzida em 80%. - Para o controle múltiplo
UGateem 10 qubits, aCXGatecontagem foi reduzida em 31%.
- Para o controle múltiplo
-
O módulo clássico de expressões em tempo real
qiskit.circuit.classicalagora pode representar operações aritméticasadd(),sub(),mul(), ediv()em operandos numéricos e de tempo.Por exemplo:
from qiskit.circuit import QuantumCircuit, ClassicalRegister, Duration from qiskit.circuit.classical import expr # Subtract two integers cr = ClassicalRegister(4, "cr") qc = QuantumCircuit(cr) with qc.if_test(expr.equal(expr.sub(cr, 2), 3)): pass # Multiply a Duration by a Float with qc.if_test(expr.less(expr.mul(Duration.dt(200), 2.0), Duration.ns(500))): pass # Divide a Duration by a Duration to get a Float with qc.if_test(expr.greater(expr.div(Duration.dt(200), Duration.dt(400)), 0.5)): passPara obter exemplos adicionais, consulte a documentação em nível de módulo com o link acima.
-
O construtor para
UCGateagora tem um novo argumento opcional,mux_simp, que recebe um valor booleano que permite a busca por simplificações de Carvalho et al. Essa otimização é ativada por padrão, identifica e remove controles desnecessários do multiplexador, reduzindo o número de portas CX e a profundidade do circuito, especialmente na preparação de estado separável comInitialize. -
O
PauliEvolutionGateagora suporta nativamenteSparseObservables como entrada. Isso permite lidar eficientemente com a evolução em projetores, que são implementados como controles de uma rotação de fase e exigem menos portas do que expandir explicitamente o projetor em termos de Paulis. Por exemplo:from qiskit.circuit.library import PauliEvolutionGate from qiskit.quantum_info import SparseObservable obs = SparseObservable("001") evo_proj = PauliEvolutionGate(obs, time=1) print(evo_proj.definition.draw()) -
Um novo nó de expressão
Stretchfoi adicionado ao sistema de expressão clássico para representar as variáveisstretch. Para criar uma nova variávelstretch, você pode usarQuantumCircuit.add_stretch(). A expressão resultante é uma expressão constante do tipoDurationque pode ser usada como o argumentodurationde uma expressãodelay().Por exemplo, para garantir que uma sequência de portões entre duas barreiras seja alinhada à esquerda, independentemente de suas durações reais, você pode fazer o seguinte:
from qiskit import QuantumCircuit from numpy import pi qc = QuantumCircuit(5) qc.barrier() qc.cx(0, 1) qc.u(pi/4, 0, pi/2, 2) qc.cx(3, 4) a = qc.add_stretch("a") b = qc.add_stretch("b") c = qc.add_stretch("c") # Use the stretches as Delay duration. qc.delay(a, [0, 1]) qc.delay(b, 2) qc.delay(c, [3, 4]) qc.barrier()A expressão
Stretché muito semelhante à expressãoVarusada para representar variáveis clássicas em um circuito, exceto pelo fato de ser constante e ser sempre do tipoDuration. Ele pode ser usado em outras expressões (por exemplo, você pode multiplicá-lo por uma constante numérica) eQuantumCircuitoferece suporte total ao escopo (por exemplo, pode ser capturado ou declarado em um escopo de fluxo de controle).Para obter contexto e exemplos adicionais, consulte a especificação da linguagem OpenQASM 3.
-
Adicionadas
Gateversões das portas aritméticas de registro único que permitem que o transpilador execute otimizações de alto nível em comparação com suasQuantumCircuitvariantes. São eles:ExactReciprocalGate(substituindoExactReciprocal)IntegerComparatorGate(substituindoIntegerComparator)LinearPauliRotationsGate(substituindoLinearPauliRotations)PiecewiseLinearPauliRotationsGate(substituindoPiecewiseLinearPauliRotations)PiecewiseChebyshevGate(substituindoPiecewiseChebyshev)PiecewisePolynomialPauliRotationsGate(substituindoPiecewisePolynomialPauliRotations)PolynomialPauliRotationsGate(substituindoPolynomialPauliRotations)LinearAmplitudeFunctionGate(substituindoLinearAmplitudeFunction)QuadraticFormGate(substituindoQuadraticForm)WeightedSumGate(substituindoWeightedAdder)
Recursos primitivos
- Adicionado um novo método
to_bool_array()à classeBitArrayque retorna a matriz de bits como uma matriz booleana NumPy. O argumentoorderpode ser usado para especificar a endianidade da matriz de saída.
Recursos dos provedores
-
Foi adicionada a capacidade de definir a propriedade
dtdeGenericBackendV2no inicializador de classe com um novo argumentodt. Exemplo de uso:from qiskit.providers.fake_provider import GenericBackendV2 backend = GenericBackendV2( num_qubits = 5, basis_gates = ["cx", "id", "rz", "sx", "x"], dt = 2.22*e-10, seed = 42 )
Recursos de informação quântica
-
Adicionado um novo método
SparseObservable.to_sparse_list()para obter uma representação de lista esparsa de um arquivoSparseObservable. Por exemplo:from qiskit.quantum_info import SparseObservable obs = SparseObservable.from_list([("+II", 1), ("-II", 1)]) print(obs.to_sparse_list()) # [("+", [2], 1), ("-", [2], 1)] -
Adicionado um novo método
SparseObservable.as_paulis()para expressar um observável esparso apenas em termos de Paulis, expandindo todos os projetores. Por exemplo:from qiskit.quantum_info import SparseObservable obs = SparseObservable("+-") obs_paulis = obs.as_paulis() # 1/4 ( II + XI - IX - XX ) -
O Qiskit v2.0.0 suporta a construção de um
SparsePauliOpa partir de umSparseObservableusando o novo métodoSparsePauliOp.from_sparse_observable(). É importante lembrar queSparseObservablepodem representar eficientemente os projetores, que exigem um número exponencial de termos na funçãoSparsePauliOp. -
SparseObservableagora oferece suporte à composição de operadores usando o métodocompose()semelhante a outras classesquantum_infoclasses. Isso é análogo à multiplicação de matrizes, embora o método seja totalmente livre de matrizes. -
SparseObservable.BitTermtem um novo atributo,labelque contém a cadeia de caracteres de um único caractere Python usada para representar o termo em rótulos de cadeia. -
O método
StabilizerState.expectation_value()agora pode aceitar um operador do tipoSparsePauliOp.
Recursos de síntese
-
Adicionada uma nova classe
TwoQubitControlledUDecomposerque decompõe qualquer unitário de dois qubits em termos de portas fracionárias de dois qubits de base, comoRZZGate(ou portas de dois qubits que são localmente equivalentes aRZZGate, até portas de um único qubit).Por exemplo:
from qiskit.circuit.library import RZZGate from qiskit.synthesis import TwoQubitControlledUDecomposer from qiskit.quantum_info import random_unitary unitary = random_unitary(4, seed=1) decomposer = TwoQubitControlledUDecomposer(RZZGate, euler_basis="ZXZ") circ = decomposer(unitary) circ.draw(output='mpl') -
O passe
synth_cnot_depth_line_kms()foi portada para o Rust, com benchmarks preliminares apontando para um fator de 20x aumento de velocidade. -
O passe
synth_cx_cz_depth_line_my()foi portada para o Rust, com benchmarks preliminares apontando para um fator de 70x aumento de velocidade. -
Funções de síntese adicionadas
synth_integer_comparator_2s()esynth_integer_comparator_greedy()para compilar portas que implementam uma comparação de números inteiros, comoIntegerComparatorGate. Os plug-ins de síntese de alto nível correspondentes sãoIntComparatorSynthesis2seIntComparatorSynthesisNoAux. Para permitir que o compilador selecione a decomposição ideal com base nos qubits auxiliares disponíveis, useIntComparatorSynthesisDefault. -
Adicionado
synth_weighted_sum_carry()para sintetizar objetosWeightedSumGateobjetos. Atualmente, esse é o único método de síntese disponível para oWeightedSumGatecom o plug-in de síntese de alto nível correspondenteWeightedSumSynthesisDefault.
Recursos do Transpiler
-
Foi adicionado suporte para trabalhar com objetos
Targetque contêm portas de base de dois qubits que contêm ângulos arbitrários, comoRZZGateà passagem doConsolidateBlockspassagem do transpilador. A passagem anterior não estimava corretamente o número de portas necessárias para uma decomposição, o que fazia com que os blocos não fossem consolidados ondeUnitarySynthesispoderia potencialmente otimizar o bloco. Internamente, a estimativa da contagem de portas é feita usando a classeTwoQubitControlledUDecomposerclasse.Por exemplo:
from qiskit import QuantumCircuit from qiskit.transpiler import generate_preset_pass_manager from qiskit.transpiler.passes import ConsolidateBlocks qc = QuantumCircuit(2) qc.rzz(0.1, 0, 1) qc.rzz(0.2, 0, 1) # basis_gates contains fractional gate (rzz) consolidate_pass = ConsolidateBlocks(basis_gates=["rz", "rzz", "sx", "x", "rx"]) block = consolidate_pass(qc) # consolidate the circuit into a single unitary block block.draw(output='mpl') pm = generate_preset_pass_manager( optimization_level=2, basis_gates=["rz", "rzz", "sx", "x", "rx"] ) tqc = pm.run(qc) # synthesizing the circuit into basis gates tqc.draw(output='mpl') -
Foi adicionado suporte a portas de base fracionária de dois qubits, como
RZZGateà passagem doUnitarySynthesispassagem do transpilador. A decomposição é feita usando oTwoQubitControlledUDecomposere suporta portas de base padrão e personalizadas.Por exemplo:
from qiskit import QuantumCircuit from qiskit.quantum_info import random_unitary from qiskit.transpiler.passes import UnitarySynthesis from qiskit.converters import circuit_to_dag, dag_to_circuit unitary = random_unitary(4, seed=1) qc = QuantumCircuit(2) qc.append(unitary, [0, 1]) dag = circuit_to_dag(qc) # basis_gates contains fractional gate (rzz) circ = UnitarySynthesis(basis_gates=['rzz', 'rx', 'rz']).run(dag) dag_to_circuit(circ).draw(output='mpl') -
Adicionada uma nova passagem de transpilador,
LightConeque retorna o cone de luz de um circuito ao medir um subconjunto de qubits ou uma string Pauli específica.Por exemplo, para o circuito a seguir:
a execução do passe eliminaria os portões que não afetam o resultado:
from qiskit.transpiler.passes.optimization.light_cone import LightCone from qiskit.transpiler.passmanager import PassManager from qiskit.circuit import QuantumCircuit qc = QuantumCircuit(3,1) qc.h(range(3)) qc.cx(0,1) qc.cx(2,1) qc.h(range(3)) qc.measure(0,0) pm = PassManager([LightCone()]) new_circuit = pm.run(qc) new_circuit.draw("mpl")
-
Foi adicionado um novo argumento
max_block_widthà classeBlockCollectore para as classesCollectLinearFunctionseCollectCliffordspassagens do transpilador. Esse argumento permite que você restrinja o número máximo de qubits sobre os quais um bloco de nós é definido.Por exemplo:
from qiskit.circuit import QuantumCircuit from qiskit.transpiler.passes import CollectLinearFunctions qc = QuantumCircuit(5) qc.h(0) qc.cx(0, 1) qc.cx(1, 2) qc.cx(2, 3) qc.cx(3, 4) # Collects all CX-gates into a single block qc1 = CollectLinearFunctions()(qc) qc1.draw(output='mpl') # Collects CX-gates into two blocks of width 3 qc2 = CollectLinearFunctions(max_block_width=3)(qc) qc2.draw(output='mpl') -
Foi adicionada uma nova opção,
collect_from_back, à passagem doCollectMultiQBlockstranspiler pass. Quando definido comoTrue, os blocos são coletados na direção inversa, das saídas para as entradas do circuito. Os blocos ainda são relatados seguindo a ordem topológica normal. Isso leva a uma flexibilidade adicional proporcionada pela passagem e a oportunidades adicionais de otimização quando combinada com um método de ressíntese de circuito. -
Adicionado um novo argumento
approximation_degreeaoCommutationAnalysis. Esse argumento permite que você defina o limite de aproximação para quando as portas são avaliadas para comutação. Consulte a documentação da classe para obter mais informações. -
Um novo passe de transpilador,
ContractIdleWiresInControlFlowestá disponível emqiskit.transpiler.passes. Essa passagem remove os qubits dos blocos de fluxo de controle se a semântica permitir e se o qubit permanecer ocioso durante toda a operação de fluxo de controle. Anteriormente, o estágio de roteamento dos gerenciadores de passagem predefinidos podia remover qubits ociosos como um efeito colateral não intencional da forma como as passagens operavam. Agora, esse comportamento é tratado adequadamente como parte de uma passagem de otimização. -
Foi adicionado um novo estágio de plug-in de roteamento
"default". No Qiskit v2.0.0, isso é simplesmente um alias para o padrão anterior"sabre". O algoritmo padrão subjacente pode mudar no decorrer da série de versões do Qiskit v2.x para alguns ou todos os alvos, mas você sempre pode definir explicitamenterouting_method="sabre"para manter o comportamento atual. -
Adição de um novo estágio do plug-in de tradução
"default". No Qiskit v2.0.0, esse é um alias para o padrão anterior"translator". O algoritmo padrão subjacente pode mudar no decorrer da série Qiskit 2.x para alguns ou todos os alvos, mas você sempre pode definir explicitamentetranslation_method="translator"para manter o comportamento atual. -
A passagem do
HighLevelSynthesisagora sintetiza objetos do tipoAnnotatedOperationpor meio da interface do plug-in. -
PassManager.run()agora aceita um argumentoproperty_set, que pode ser definido como um objetoMapping-para fornecer os valores iniciais do objetoPropertySet. Isso pode ser usado para recomeçar uma compilação parcialmente aplicada ou para reutilizar determinada análise de uma compilação anterior em um novo local. -
O agendamento passa
PadDelayePadDynamicalDecouplingagora têm novos argumentos em seus construtores:targetedurations. Eles são usados para especificar oTargetouInstructionDurationsrespectivamente. Para acessar as durações das instruções quando a passagem é executada, é necessário um dos argumentos. -
Adicionado um novo método
seconds_to_dt()à classeTargetclasse. Isso é usado para converter uma duração em segundos em um número de etapas de tempo discretizadas da resolução de tempo do sistema especificada no atributoTarget.dtatributo. Isso geralmente é útil para converter o valorInstructionProperties.durationpara unidades dedt. -
A passagem do
Split2QUnitariesa passagem do transpilador foi atualizada para lidar com o caso em que o unitário em consideração pode ser escrito como umSwapGatee duas portas de um único qubit. Nesse caso, ele divide o unitário e também aplica a troca virtual, semelhante ao que é feito noElidePermutations. Essa funcionalidade pode ser controlada com um novo argumento,split_swap, no construtor de :class`.Split2QUnitaries`, que pode ser usado para desativar a divisão de portas equivalentes de troca.
Páginas Recursos
-
qiskit.utilsagora contém utilitários para oferecer melhor controle e inspeção das configurações de paralelização do Qiskitmultiprocessingconfigurações de paralelização do Qiskit. Em particular, agora é possível usarshould_run_in_parallel()para consultar se oparallel_map()(e gerenciadores de passagem) iniciarão subprocessos para entradas adequadas e usar o gerenciador de contextoshould_run_in_parallel.override()para substituir temporariamente a maioria das configurações do sistema e do usuário em torno dessa decisão.Uma função adicional,
default_num_processes()lê o número máximo padrão de subprocessos que o Qiskit usará para o paralelismo baseado em processos. -
Uma nova variável de ambiente,
QISKIT_IGNORE_USER_SETTINGS, agora controla se o arquivo de configurações do usuário deve ser lido emimport qiskit. Se definido como a stringtrue, o arquivo de configurações não será lido. Isso é útil para isolar determinadas instâncias do Qiskit do ambiente do sistema, por exemplo, para testes.
Notas da Atualização
-
O Qiskit v2.0 deixou de oferecer suporte ao Linux i686 e ao Windows de 32 bits. A partir do Qiskit v2.0.0, é necessária uma plataforma de 64 bits para executar o Qiskit. Isso se alinha à tendência da comunidade Python científica e permite que a Qiskit se concentre em melhorias de desempenho para hardware de computação quântica cada vez mais complexo.
O Qiskit v1.4 continuará a oferecer suporte a plataformas de 32 bits até o fim da vida útil (setembro de 2025), mas a partir desta versão 2.0.0, o Qiskit não publicará mais binários pré-compilados para elas e não oferece nenhuma garantia de compilações de código-fonte bem-sucedidas em plataformas de 32 bits.
-
A versão mínima suportada do Rust para criar o Qiskit a partir do código-fonte agora é v1.79. Essa versão foi aumentada de v1.70, a versão Rust mínima compatível anterior na série de versões do Qiskit v1.x.
-
O Qiskit Pulse foi completamente removido nesta versão, após sua descontinuidade no Qiskit v1.3. Isso inclui todos os arquivos de módulo de pulso, funcionalidade de visualização de pulso, suporte para
ScheduleBlocke serialização e desserialização de porta de pulso no QPY, gerenciamento de calibrações emQuantumCircuit,TargeteDAGCircuite backends falsos baseados em pulso. Para obter mais detalhes sobre os componentes removidos relacionados ao pulso, consulte as seções correspondentes abaixo.Observe que a migração do Pulse para o Qiskit Dynamics, como era o plano inicial após a descontinuação do Pulse, foi suspensa devido às prioridades de desenvolvimento do Qiskit Dynamics. Os usuários que desejarem usar o Qiskit Pulse como front-end para dar suporte a back-ends ou em outros casos de uso ainda poderão usá-lo nas versões do Qiskit anteriores a v2.0.0, que incluem a funcionalidade de pulso.
-
As funções
sequenceescheduledo módulocompilerforam removidas após sua descontinuação no Qiskit v1.3. Eles dependiam da capacidade de traduzir circuitos para componentes de pulso usando definições de back-end, um recurso que não está mais presente. Por esse motivo, elas foram removidas sem nenhuma alternativa proposta. Observe que essas remoções estão relacionadas ao pacote Pulse, que também está sendo removido no Qiskit 2.0.
Notas sobre atualização de circuitos
-
BiteRegisterbem como suas subclasses não têm mais a garantia de serem comparáveis usando as verificações deis, devido a conversões de e para Python que podem realocar cada instância exposta a Python. -
BiteRegister(e suas subclasses) não podem mais ser subclasses. Esse comportamento nunca foi planejado para ser suportado, e isso causaria um comportamento não especificado no Qiskit. Não é mais possível fazer isso como um detalhe de implementação das classes. -
Não é mais possível criar instâncias da base
BiteRegisterclasses. A instanciação direta dessas classes foi claramente documentada como algo que não era suportado, e a possibilidade de fazê-lo era apenas um artefato de implementação da hierarquia de classes em versões anteriores. A partir do Qiskit v2.0.0, não é mais possível fazer isso. -
O módulo
qiskit.circuit.classicalfunctionfoi removido após sua descontinuidade no Qiskit v1.4. Isso inclui a classeClassicalFunction, sua função relacionadaclassical_functione a classeBooleanExpression. Essa alteração foi feita para remover a dependência da bibliotecatweedledum, que não é mais compatível com todas as plataformas compatíveis com o Qiskit e com as versões do Python.ClassicalFunctionera usado exclusivamente emPhaseOracleque foi atualizado para aceitar apenas expressões no formatostring(consulte a nota de versão a seguir).BooleanExpressionfoi substituída pela nova classeBitFlipOracleGateclasse. -
A classe
PhaseOraclenão depende mais da bibliotecatweedledum, pois a dependência não é mantida ativamente. A interface foi simplificada: ela não aceita mais o parâmetrosynthesizere o parâmetroexpressionsó pode ser uma cadeia de caracteres. O tipoClassicalFunctionaceito anteriormente, obsoleto no Qiskit v1.4, foi removido no Qiskit v2.0.Apesar dessas atualizações, o uso padrão da classe
PhaseOraclepermanece inalterado:from qiskit.circuit.library.phase_oracle import PhaseOracle bool_expr = "(x0 & x1 | ~x2) & x4" oracle = PhaseOracle(bool_expr) oracle.draw('mpl')
Observe que essa alteração pode afetar a eficácia da síntese, mas foi necessária para a compatibilidade com todas as plataformas compatíveis do Qiskit e com as versões do site Python.
-
Atualizou a métrica usada para verificar as comutações em
CommutationChecker. Presume-se que duas portas comutam se a fidelidade média da porta da comutação estiver acima de(1 - 1e-12). Esse valor é escolhido para levar em conta os erros de arredondamento no cálculo da fidelidade e para manter a consistência comRemoveIdentityEquivalenteTwoQubitWeylDecomposition. Consulte a documentação da classe para obter mais informações. -
O método
QuantumCircuit.measure_active()alterou o nome do registro clássico que ele cria, pois o nome anterior entrava em conflito com uma palavra reservadaOpenQASM. Em vez demeasure, ele agora é chamado demeas, alinhando-se com o nome de registro usado pormeasure_all(). -
O método
DAGCircuit.control_flow_op_nodes()foi atualizado para sempre retornar uma lista, mesmo que ela esteja vazia. Anteriormente, ele retornavaNonese estivesse vazio e nunca retornava uma lista vazia, o que exigia um tratamento especial. Se você precisar testar explicitamente a vacuidade tanto no Qiskit v1.x quanto no v2.x, você pode fazer isso:control_flow_nodes = dag.control_flow_op_nodes() if not control_flow_nodes: # There are no control-flow nodes. pass -
BlueprintCircuit.copy_empty_like()agora retorna umQuantumCircuitvazio com o mesmo número de qubits e clbits e os mesmos metadados que o circuito original, em vez de umBlueprintCircuit. Essa alteração aborda um comportamento inesperado em que lidar com uma cópia "vazia" de um circuito de blueprint faria com que os dados do circuito fossem reconstruídos. Observe queBlueprintCircuit.copy()ainda retorna umBlueprintCircuit. EmboraBlueprintCircuitnão seja uma classe pública, pois é um tipo interno usado para criar entradas legadas emqiskit.circuit.libraryisso afeta suas subclasses, comoNLocaleZZFeatureMap. Consulte a seçãoqiskit.circuit.librarypara obter uma lista completa das classes afetadas por essa alteração. Corrigido #13535 -
A função interna
qiskit.circuit.add_control.add_controlfoi removida. Essa função não fazia parte da API pública, tinha pré-condições frágeis para ser mantida e era uma fonte comum de bugs. Os usos deadd_control(SomeGate(...), ...)devem ser alterados paraSomeGate(...).control(...)usandoGate.control()em vez disso, o que é muito mais seguro. -
O método
ParameterExpression.sympify()agora pode gerar uma exceçãoMissingOptionalLibraryse osympynão estiver instalado. Nas versões do Qiskit v1.x, a instalação dosympysempre foi garantida, mas, a partir do v2.0.0, esse não é mais um requisito obrigatório e pode ser necessário apenas se você estiver usando esse método. Como essa funcionalidade requer explicitamente o sitesympy, é necessário garantir que você tenha o sitesympyinstalado para usar o método. -
O argumento obsoleto
DAGNodedagfoi removido da classeDAGNodee de suas subclasses:DAGOpNode,DAGOutNode, eDAGInNode.O parâmetro
dagera um argumento opcional ao construir esses objetos, mas não foi usado e foi ignorado desde a versão v1.3 e foi descontinuado desde a versão v1.4. -
Os seguintes
QuantumCircuitmétodos:castcbit_argument_conversioncls_instancescls_prefixqbit_argument_conversion
foram removidos, após sua descontinuidade no Qiskit 1.2. Esses métodos eram funções auxiliares internas e nunca tiveram a intenção de ser uma API pública. Nenhuma substituição é fornecida.
-
Os atributos obsoletos para
InstructioneGatedurationeunitforam removidos, portanto, você não pode mais definir os argumentosunitoudurationpara qualquerqiskit.circuit.Instructionou subclasse. Esses atributos foram descontinuados no Qiskit v1.3.0 e foram usados para anexar uma duração de execução personalizada e uma unidade para essa duração a uma instrução individual. No entanto, a fonte de verdade da duração de um portão é oBackendV2Targetque contém a duração de cada instrução suportada no backend. A duração de uma instrução normalmente não é ajustável pelo usuário e é uma propriedade imutável do backend. Se você já usou esse recurso para experimentar diferentes durações de porta, poderá alterar o campoInstructionProperties.durationem um determinado campoTargetpara definir uma duração personalizada para uma instrução em um backend. (A unidade está sempre em segundos na seçãoTarget.) -
O atributo obsoleto para
qiskit.circuit.InstructioneGate:conditionfoi removido. Essa funcionalidade foi substituída pela classeIfElseOpque pode ser usada para descrever uma condição clássica em um circuito. Esse atributo foi descontinuado na versão v1.3.0. -
Os métodos obsoletos para
InstructioneGate:c_ifecondition_bitsforam removidos. Esses métodos foram descontinuados na versão v1.3.0. Essa funcionalidade foi substituída pela classeIfElseOpque pode ser usada para descrever uma condição clássica em um circuito. Por exemplo, um circuito que anteriormente usavaInstruction.c_if()como:from qiskit.circuit import QuantumCircuit qc = QuantumCircuit(2, 2) qc.h(0) qc.x(0).c_if(0, 1) qc.z(1.c_if(1, 0) qc.measure(0, 0) qc.measure(1, 1)Pode ser reescrito como:
qc = QuantumCircuit(2, 2) qc.h(0) with expected.if_test((expected.clbits[0], True)): qc.x(0) with expected.if_test((expected.clbits[1], False)): qc.z(1) qc.measure(0, 0) qc.measure(1, 1) -
O método obsoleto
InstructionSet.c_iffoi removido. Esse método foi descontinuado na versão 1.3.0. Essa funcionalidade foi substituída pela classeIfElseOpque pode ser usada para descrever uma condição clássica em um circuito. -
Como parte da remoção do Pulse no Qiskit v2.0.0, a propriedade
calibrationsfoi removida doQuantumCircuit,DAGCircuiteDAGDependencyclasses. Além disso, o métodohas_calibration_forfoi removido doQuantumCircuiteDAGCircuiteadd_calibrationfoi removido das classesQuantumCircuit. -
O módulo
qiskit.circuit.classicalfunctionfoi removido. Esse módulo dependia da bibliotecatweedledum, que não é compatível com as versões mais recentes da Python. Como alternativa, oPhaseOracleGateeBitFlipOracleGatepodem ser usadas para gerar circuitos a partir de expressões booleanas. -
A representação interna de
UnitaryGatequando adicionada a umQuantumCircuitfoi alterada. O objeto armazenado no circuito não necessariamente compartilhará mais uma referência comum ao objeto adicionado ao circuito. Esse comportamento nunca foi garantido, e a alteração do objetoUnitaryGatediretamente ou por referência era sempre insalubre e poderia corromper o circuito, especialmente ao modificar a matriz. Se você precisar alterar um elemento no circuito (o que não é recomendado, pois é ineficiente e propenso a erros), faça algo como:from qiskit.circuit import QuantumCircuit from qiskit.quantum_info import random_unitary from qiskit.circuit.library import UnitaryGate import numpy as np qc = QuantumCircuit(2) qc.unitary(np.eye(2, dtype=complex)) new_op = UnitaryGate(random_unitary(2)) qc.data[0] = qc.data[0].replace(operation=new_op)Isso também se aplica a
DAGCircuitmas você pode usarDAGCircuit.substitute_node()em vez disso. -
O atributo
CircuitInstruction.paramspara um atributoCircuitInstructionque contém umUnitaryGatepara seuoperationnão conterá mais a matriz unitária subjacente para a porta. Isso ocorre porque a representação interna da porta não trata mais o objeto matriz como um parâmetro. Se precisar acessar a matriz do portão, você pode fazer isso por meio do botãoCircuitInstruction.matrixou do campoUnitaryGate.paramsdo campoCircuitInstruction.operation.
Notas sobre a atualização dos primitivos
-
Como consequência da remoção do modelo
BackendV1, oBackendSamplerV2eBackendEstimatorV2não aceitam mais entradas do tipoBackendV1em seu argumento de entradabackend. -
As implementações primitivas do V1 e os aliases de tipo não versionados do V1-exclusive, obsoletos no Qiskit v1.2, foram removidos. Essas interfaces foram substituídas por suas contrapartes no site V2. A remoção inclui as seguintes classes que implementam as interfaces V1 :
Estimatorem favor do equivalente em V2,StatevectorEstimatorSamplerem favor do equivalente em V2,StatevectorSamplerBackendEstimatorem favor do equivalente em V2,BackendEstimatorV2BackendSamplerem favor do equivalente em V2,BackendSamplerV2
Assim como os seguintes aliases de tipo não versionados:
BaseEstimator, pseudônimo deBaseEstimatorV1BaseSampler, pseudônimo deBaseSamplerV1
Essa remoção NÃO afeta as definições de interface abstrata
BaseEstimatorV1eBaseSamplerV1com versão explícita ou as classes de resultado e trabalho relacionadas, que foram mantidas para manter a compatibilidade com versões anteriores. Se estiver usando um alias V1-type não versionado, comoBaseEstimator, poderá substituí-lo diretamente pelo tipo versionado (BaseEstimatorV1).Além disso, as seguintes funções de utilidade foram removidas. Essas funções foram usadas somente em implementações primitivas do V1 :
init_circuitpara inicializar um circuito a partir de umStatevectoruseQuantumCircuit.initialize()em vez disso.init_observable: use o construtor deSparsePauliOpem vez disso.final_measurement_mapping: useQuantumCircuit.layout()eSparsePauliOp.apply_layout()para ajustar um operador para um layout. Caso contrário, usemthree.utils.final_measurement_mapping. Consulte as funções do Mthree Utility para obter detalhes.
Notas de atualização dos fornecedores
-
O método
configurationdeBasicSimulatorfoi removido após sua descontinuação no Qiskit v1.3. Esse método retornou uma instânciaBackendConfiguration, uma classe que fazia parte do fluxo de trabalho descontinuadoBackendV1e também foi removida no Qiskit v2.0.0. Os elementos de configuração individuais agora podem ser recuperados diretamente do backend ou da instânciaTargetcontida (backend.target). -
O método
run_experimentdeBasicSimulatorfoi removido. Esse método recebeu uma instância da classeQasmQobjExperimentcomo argumento de entrada, uma classe que está obsoleta desde o Qiskit v1.2 e foi removida com o fluxo de trabalhoQobjno Qiskit v2.0.0. -
O modelo
BackendV1foi removido após sua descontinuidade no Qiskit 1.2.0. Isso inclui a classeBackendV1, bem como os módulos e utilitários relacionados, pois eles foram substituídos pelo modeloBackendV2modelo. A lista de itens removidos inclui:-
BackendV1classe: o núcleo do modelo removido -
Todos os elementos em
qiskit/providers/models, pois foram usados para representar componentes do modeloBackendV1:BackendConfigurationBackendPropertiesBackendStatusQasmBackendConfigurationPulseBackendConfigurationUchannelLOGateConfigPulseDefaultsPulseQobjDefCommandGatePropertiesNduvJobStatus: Essa classe foi substituída pela classe mais amplamente utilizadaJobStatusPulseDefaults
-
BackendV2Converterclasse: usada para converter deBackendV1paraBackendV2 -
convert_to_targetfunção: usada para criar uma instânciaTargetinstância a partir de componentes legados do siteBackendV1(comoBackendConfigurationouBackendProperties) -
BackendPropertyErroreBackendConfigurationError: exceções vinculadas a classes removidas
-
-
O
BasicSimulatorbackend não pode mais simular o fluxo de controle clássico. Ele só suportava o uso do.c_if()/.conditionpara modelar o fluxo de controle, mas essa construção foi removida do modelo de dados do Qiskit. -
Todas as classes de backend falsas baseadas no obsoleto
BackendV1foram removidas do móduloproviders.fake_providermódulo. Essas classes estão obsoletas desde o Qiskit 1.2 e faziam parte do fluxo de trabalho obsoletoBackendV1. Seu uso em testes foi substituído pela classeGenericBackendV2que permite criar instâncias personalizadas deBackendV2que implementam umBackendV2.run(). A remoção afeta:-
Classes de base:
FakeBackendFakePulseBackendFakeQasmBackend
-
Backends falsos para fins de testes especiais:
Fake1QFakeOpenPulse2QFakeOpenPulse3Q
-
Backends falsos herdados:
Fake5QV1Fake20QV1Fake7QPulseV1Fake27QPulseV1Fake127QPulseV1
-
-
Como parte da remoção de pulsos no Qiskit v2.0.0, os seguintes métodos foram removidos:
qiskit.providers.BackendV2.instruction_schedule_mapqiskit.providers.BackendV2.drive_channelqiskit.providers.BackendV2.measure_channelqiskit.providers.BackendV2.acquire_channelqiskit.providers.BackendV2.control_channel
-
Como parte da remoção de pulsos no Qiskit v2.0.0, o suporte a pulsos foi removido do
GenericBackendV2. Isso inclui a capacidade de inicializar o backend com calibrações personalizadas (argumentocalibrate_instructions) e atributos de canal de pulso (drive_channel,measure_channel,acquire_channel,control_channel). -
Removidas as classes básicas abstratas
ProvidereProviderV1, que foram descontinuadas desde o Qiskit v1.1.0. A abstração fornecida por essas definições de interface não estava oferecendo valor significativo, incluindo apenas os atributosname,backendse um métodoget_backend().Um provedor, como conceito, continuará existindo como uma coleção de back-ends. Se você estiver implementando um provedor no momento, poderá ajustar seu código simplesmente removendo
ProviderV1como a classe principal da sua implementação.Como parte dessa alteração, você provavelmente desejará adicionar uma implementação do
get_backendpara compatibilidade com versões anteriores. Por exemplo:def get_backend(self, name=None, **kwargs): backend = self.backends(name, **kwargs) if len(backends) > 1: raise QiskitBackendNotFoundError("More than one backend matches the criteria") if not backends: raise QiskitBackendNotFoundError("No backend matches the criteria") return backends[0]
Notas de atualização do QPY
-
A função
qpy.load()agora pode gerar uma exceçãoMissingOptionalLibraryse uma carga útil QPY v10, v11 ou v12 for passada usando expressões simbólicassymengineesymenginenão estiver instalado. A exceção também será levantada se osympynão estiver instalado para qualquer outra carga útil do QPY antes do v13. Nas versões do Qiskit v1.x,symengineesympysempre tiveram a garantia de serem instaladas. No entanto, a partir de v2.x, esse não é mais um requisito obrigatório e pode ser necessário apenas se você estiver desserializando um arquivo QPY que foi gerado usandosymengine. A análise desses payloads QPY requersymengine, pois seu uso faz parte da especificação de formato para QPY v10, v11 e v12. Se a carga útil exigir isso, a única opção é instalar uma versão compatível dosymengine(0.11.0ou0.13.0). Da mesma forma, o sitesympyfoi usado paraParameterExpressioncodificação para todas as versões 1 a 12 do QPY. -
A versão mínima de compatibilidade do QPY,
QPY_COMPATIBILITY_VERSIONfoi aumentada de 10 (o requisito da versão v1.x ) para 13. Essa versão controla a versão mínima do QPY que pode ser emitida pela funçãoqpy.dump()função. Isso significa queqpy.dump()só pode emitir QPY v13 e v14 nesta versão. O QPY v13 ainda é compatível com o Qiskit v1.3.x e v1.4.x, o que significa que as cargas úteis geradas no Qiskit v2.x com o QPY v13 ainda podem ser carregadas com a série de versões do Qiskit v1.x.Essa alteração foi necessária porque as versões 10 a 12 do QPY exigem as bibliotecas
sympyousymenginepara gerar uma serialização para objetosParameterExpressionmas no Qiskit 2.x nenhuma das bibliotecas é necessária para o objetoParameterExpressionobjeto. -
Com a remoção do pulse no Qiskit v2.0.0, o suporte à serialização de programas
ScheduleBlockpor meio da funçãoqiskit.qpy.dump()foi removido. Os usuários ainda podem carregar cargas úteis que contenham portas de pulso usando a funçãoqiskit.qpy.load()no entanto, elas serão tratadas como instruções personalizadas opacas. O carregamento deScheduleBlockpayloads não é mais suportado e causará umaQpyErrorexceção.
Notas sobre a atualização da síntese
-
O argumento
atomic_evolutionchamável deProductFormula(e suas subclassesQDrift,LieTrotter, eSuzukiTrotter) tem uma nova assinatura de função. A assinatura antiga pegava um operador Pauli e um coeficiente de tempo e retornava o circuito de evolução:def atomic_evolution(pauli_op: SparsePauliOp, time: float) -> QuantumCircuit: evol_circuit = QuantumCircuit(pauli_op.num_qubits) # append operators to circuit return evol_circuitA nova assinatura pega diretamente um circuito existente e deve anexar a evolução do Pauli fornecido e o tempo dado a esse circuito:
def atomic_evolution(evol_circuit: QuantumCircuit, pauli_op: SparsePauliOp, time: float): # append operators to circuit, in-place modificationEssa nova implementação se beneficia de um desempenho significativamente melhor.
Notas sobre a atualização do Transpiler
-
Aumento do limite mínimo para quando as portas são consideradas a identidade em
RemoveIdentityEquivalentde épsilon de máquina para1e-12para levar em conta os erros de arredondamento no cálculo da fidelidade e para manter a consistência com as outras classes, comoCommutationAnalysiseTwoQubitWeylDecomposition. -
O nome de estágio do plug-in de roteamento
defaultagora está reservado para o plug-in incorporado do Qiskit com o mesmo nome. -
O estágio do plugin de roteamento padrão agora é
"default". No Qiskit v2.0.0, isso é simplesmente um alias para o padrão anterior"sabre". O algoritmo padrão subjacente pode mudar no decorrer da série de versões do Qiskit v2.x para alguns ou todos os alvos, mas você sempre pode definir explicitamenterouting_method="sabre"para manter o comportamento atual. -
O nome de estágio do plug-in de tradução
defaultagora está reservado para o plug-in incorporado do Qiskit com o mesmo nome. -
O estágio do plugin de tradução padrão agora é
"default". No Qiskit 2.0, isso é simplesmente um alias para o padrão anterior"translator". O algoritmo padrão subjacente pode mudar no decorrer da série Qiskit 2.x para alguns ou todos os alvos, mas você sempre pode definir explicitamentetranslation_method="translator"para manter o comportamento atual. -
Os passes de agendamento herdados
ASAPSchedule,ALAPSchedule,DynamicalDecouplingeAlignMeasuresforam removidos em favor das alternativas atualizadasALAPScheduleAnalysis,ASAPScheduleAnalysis,PadDynamicalDecoupling, eConstrainedReschedulerespectivamente. Eles foram descontinuados no Qiskit v1.1 depois que o novo fluxo de trabalho de agendamento substituiu o legado. -
Caso não seja especificado nem um
targetnem um conjunto debasis_gates, a passagem doHighLevelSynthesissintetiza circuitos com operações anotadas com menos camadas de invólucros do que antes (isso acontece, por exemplo, para o circuito produzido pormultiplier_cumulative_h18()). -
O argumento da palavra-chave
property_setagora é reservado emBasePassManager.run()e não pode ser usado como umkwargque será encaminhado para a conversão da subclasse da representação front-end para a representação interna. -
Os seguintes usos obsoletos do objeto
BackendPropertiesno pipeline de transpilação foram removidos no Qiskit 2.0:backend_propertiesargumento de entrada emtranspile()backend_propertiesargumento de entrada emPassManagerConfigbackend_propertiesargumento de entrada emgenerate_preset_pass_manager()backend_propertiesargumento de entrada emgenerate_routing_passmanager()backend_propertiesargumento de entrada emgenerate_translation_passmanager()backend_propertiesargumento de entradaTarget.from_configuration()
Os passes a seguir também foram atualizados para aceitar apenas um
targetem vez de:backend_propargumento de entrada emDenseLayoutpropertiesargumento de entrada emVF2Layoutpropertiesecoupling_mapargumentos de entrada emVF2PostLayoutbackend_propsargumento de entrada emUnitarySynthesis
A classe
BackendPropertiesfoi descontinuada desde o Qiskit v1.2, porque fazia parte do fluxo de trabalhoBackendV1. Propriedades específicas da instrução, como erros de porta ou durações, podem ser adicionadas a umTargetna construção por meio do métodoTarget.add_instruction()e comunicadas às passagens relevantes do transpilador por meio do argumento de entradatarget. -
Como consequência da remoção do modelo
BackendV1, os tipos de entrada aceitos dos seguintes objetos do transpilador foram atualizados:- O
generate_preset_pass_manager()etranspile()não aceitam mais entradas do tipoBackendV1em seu argumento de entradabackend. - O método
Target.from_configuration()não aceita mais o argumentobackend_properties - O método
Target.target_to_backend_properties()foi removido
- O
-
A passagem do
ResetAfterMeasureSimplificationtranspiler pass agora usa umIfElseOppara condicionar a execução doXGateem vez de definir um atributoconditionno portão. Isso ocorre porque o atributoconditionfoi removido do modelo de dados do Qiskit. -
A passagem obsoleta do transpilador
ConvertConditionsToIfOpsfoi removida. O atributoconditionsubjacente deInstructionfoi removido, de modo que essa passagem do transpilador não tinha mais nada para converter. Em vez disso, você deve usar diretamenteIfElseOppara condicionar classicamente a execução de uma operação. -
O
PadDelayePadDynamicalDecouplingagora exigem um novo argumento quando construídos. Os endereçostargetoudurationsprecisam ser especificados com umTargetouInstructionDurationsrespectivamente. Sem isso, as passagens não podem determinar a duração das instruções no circuito e causarão erros. Anteriormente, esses passes determinavam esses valores a partir do atributoduration, agora removido, dosInstructionobjetos. -
A passagem do transpilador
AlignMeasures, anteriormente obsoleta, foi removida. Essa passagem foi descontinuada no Qiskit v1.1.0. Em vez disso, oConstrainedRescheduledeve ser usado.ConstrainedRescheduleexecuta a mesma função e também suporta o alinhamento a restrições de tempo adicionais. -
Ao programar usando
generate_preset_pass_manager()outranspile()se o argumentoinstruction_durationsfor especificado, as durações serão formatadas comolist, e estarão em unidades dedt. Você também deve definir o argumento de entradadtda função de transpilação. -
Removido o atributo obsoleto
DAGNode.sort_key. Esse atributo foi preterido na versão do Qiskit v1.4.0. Como a classificação topológica lexicográfica é feita internamente no Rust e o atributo sort key não era usado, esse atributo foi removido para evitar a sobrecarga da criação do nó DAG. Se você se baseou na chave de classificação, pode reproduzi-la em um determinado nó usando algo como:def get_sort_key(node: DAGNode): if isinstance(node, (DAGInNode, DAGOutNode)): return str(node.wire) return ",".join( f"{dag.find_bit(q).index:04d}" for q in itertools.chain(node.qargs, node.cargs) ) -
O seguinte
transpile()egenerate_preset_pass_manager()argumentos de entrada, obsoletos desde o Qiskit 1.3, foram removidos da API:instruction_durationstiming_constraints
Além disso, a especificação de portas de base personalizadas por meio do argumento
basisgate detranspile()egenerate_preset_pass_manager()também obsoleto no Qiskit 1.3, não é mais permitido, e umValueErrorserá gerado nesses casos.As informações anteriormente fornecidas por meio deles ainda podem ser especificadas por meio dos argumentos
backendoutarget. Você pode criar uma instância Target com durações de instrução definidas:Target.from_configuration(..., instruction_durations=...)Para restrições específicas de tempo:
Target.from_configuration(..., timing_constraints=...)E para portas de base personalizadas, você pode adicioná-las manualmente ao destino ou usar o site
.from_configurationcom um mapeamento de nome personalizado, por exemplo:from qiskit.circuit.library import XGate from qiskit.transpiler.target import Target basis_gates = ["my_x", "cx"] custom_name_mapping = {"my_x": XGate()} target = Target.from_configuration( basis_gates=basis_gates, num_qubits=2, custom_name_mapping=custom_name_mapping ) -
O
transpile()egenerate_preset_pass_manager()agora geram umUserWarningao fornecer umcoupling_mape/oubasis_gatesjunto com umbackend. Nesses casos, há várias fontes de verdade, as intenções do usuário nem sempre são claras e pode haver conflitos quegenerate_preset_pass_manager()o usuário pode não saber como resolver. A alternativa sugerida é definir um alvo personalizado que combine as restrições escolhidas.Uma dessas situações é a especificação de uma porta com 3 ou mais qubits em
backendoubasis_gatesjuntamente com umcoupling_mappersonalizado. O mapa de acoplamento não fornece os detalhes de conectividade necessários para determinar a ação do portão. Nesses casos,transpile()egenerate_preset_pass_manager()agora levantam umValueError. -
Como parte da remoção do pulso no Qiskit 2.0, todas as funcionalidades relacionadas a pulso e calibração no transpilador foram removidas.
Os seguintes passes e funções foram removidos:
qiskit.transpiler.passes.PulseGatesaprovadoqiskit.transpiler.passes.ValidatePulseGatesaprovadoqiskit.transpiler.passes.RXCalibrationBuilderaprovadoqiskit.transpiler.passes.RZXCalibrationBuilderaprovadoqiskit.transpiler.passes.RZXCalibrationBuilderNoEchoaprovadoqiskit.transpiler.passes.EchoRZXWeylDecompositionaprovadoqiskit.transpiler.passes.NoramlizeRXAngleaprovadoqiskit.transpiler.passes.rzx_templates()function
O argumento
inst_mapfoi removido dos seguintes elementos:- O
generate_preset_pass_manager()etranspile()funções - O método
Target.from_configuration()método - O construtor da
PassManagerConfigclasse
O suporte à calibração foi removido:
calibrationfoi removido do construtorInstructionPropertiesconstrutor e não é mais uma propriedade dessa classe.- Os métodos
has_calibration,get_calibration,instruction_schedule_mapeupdate_from_instruction_schedule_mapforam removidos daTargetclasse.
-
A passagem obsoleta do transpilador
StochasticSwape seu plug-in de estágio de roteamento integrado associado "stochastic" foram removidos. Eles foram marcados como obsoletos na versão do Qiskit v1.3.0. A passagem foi substituída pela classeSabreSwapque deve ser usada em seu lugar, pois oferece melhor desempenho e qualidade de saída. Por exemplo, se a passagem foi invocada anteriormente por meio da função transpile, como:from qiskit import transpile from qiskit.circuit import QuantumCircuit from qiskit.transpiler import CouplingMap from qiskit.providers.fake_provider import GenericBackendV2 qc = QuantumCircuit(4) qc.h(0) qc.cx(0, range(1, 4)) qc.measure_all() cmap = CouplingMap.from_heavy_hex(3) backend = GenericBackendV2(num_qubits=cmap.size(), coupling_map=cmap) tqc = transpile( qc, routing_method="stochastic", layout_method="dense", seed_transpiler=12342, target=backend.target )isso deve ser substituído por:
tqc = transpile( qc, routing_method="sabre", layout_method="dense", seed_transpiler=12342, target=backend.target ) -
O passe
qiskit.transpiler.passes.CXCancellationfoi removido. Ele foi preterido em favor do class:.InverseCancellation,, que é mais genérico.CXCancellation()é totalmente equivalente semanticamente aInverseCancellation([CXGate()]). -
A passagem do
SolovayKitaevnão levanta mais uma exceção em circuitos que contêm operações de um único qubit sem um métodoto_matrix(como medidas, barreiras e operações de fluxo de controle) ou operações de um único qubit parametrizadas, mas as deixa inalteradas. -
Os plug-ins para o estágio de tradução dos gerenciadores de passagem predefinidos agora precisam respeitar a
Targeta direcionalidade da porta em sua saída. Anteriormente,transpile()egenerate_preset_pass_manager()geraria umPassManagerque continha passes de correção, se necessário. Agora você deve incluí-los em seu próprio estágio personalizado, se o seu estágio não garantir que ele respeite a direcionalidade.Você pode usar o
GateDirectionpara realizar os mesmos reparos que o Qiskit costumava fazer. Por exemplo:from qiskit.transpiler import PassManager from qiskit.transpiler.passes import GateDirection from qiskit.transpiler.preset_passmanagers.plugin import PassManagerStagePlugin class YourTranslationPlugin(PassManagerStagePlugin): def pass_manager(self, pass_manager_config, optimization_level): pm = PassManager([ # ... whatever your current setup is ... ]) # Add the two-qubit directionality-fixing pass. pm.append(GateDirection( pass_manager_config.coupling_map, pass_manager_config.target, )) return pm -
Os gerenciadores de passagem predefinidos não preenchem mais o estágio
pre_optimizationimplícito de sua saídaStagedPassManager. Agora você pode atribuir com segurança seu próprioPassManagera esse campo. Anteriormente, você só podia anexar ao arquivoPassManager. -
O valor padrão para o argumento
generate_routing_passmanager()argumentoseed_transpilerfoi alterado deNonepara-1. Essa alteração foi feita porque esse sinalizador foi usado apenas para configurar a passagem doVF2PostLayoute, para essa passagem, a randomização normalmente prejudica o desempenho e não é desejável. Se você confiou no valor padrão anterior, poderá restaurar esse comportamento definindo explicitamente o argumentoseed_transpiler=None. Se você estiver definindo explicitamente um valor inicial para esse parâmetro, não haverá alteração no comportamento.
Notas sobre a atualização da visualização
-
O parâmetro
idle_wiresem todas as gavetas de circuito foi ampliado com uma nova opção,"auto", que agora é o comportamento padrão. Se você ainda quiser exibir os fios sem instruções, defina explicitamenteidle_wires=True.Quando definido como
"auto", o comportamento é o seguinte:- Se o circuito tiver um atributo
.layoutdefinido,idle_wiresserá automaticamente definido comoFalse(ocultando fios ociosos) - Caso contrário, o site
idle_wirespermaneceráTrue(mostrando todos os fios, como era o padrão anterior)
O exemplo a seguir mostra um circuito sem um layout exibido por meio do site
idle_wires="auto":qr_0: ──────── ┌───┐┌─┐ qr_1: ┤ H ├┤M├ └───┘└╥┘ cr_0: ══════╬═ ║ cr_1: ══════╩═Depois que um layout é aplicado,
idle_wires="auto"defineidle_wiresparaFalse, ocultando os fios ociosos:┌───┐┌─┐ qr_1 -> 1 ┤ H ├┤M├ └───┘└╥┘ cr_1: ══════╩═Se quiser exibir todos os fios em um circuito disposto, defina explicitamente
idle_wires=True:qr_0 -> 0 ──────── ┌───┐┌─┐ qr_1 -> 1 ┤ H ├┤M├ └───┘└╥┘ ancilla_0 -> 2 ──────╫─ ║ cr_0: ══════╬═ ║ cr_1: ══════╩═À medida que os computadores quânticos são dimensionados para mais qubits, até mesmo circuitos pequenos podem produzir representações de circuitos grandes após a transpilação. A configuração
"auto"ajuda a melhorar a legibilidade, ocultando fios desnecessários quando possível. - Se o circuito tiver um atributo
-
A função
array_to_latex()função e o métodoOperator.draw()agora podem gerar uma exceçãoMissingOptionalLibraryse a bibliotecasympynão estiver instalada. Nas versões do Qiskit v1.x,symengineesympysempre tiveram a garantia de serem instaladas, mas a partir de v2.0.0, isso não é mais um requisito rígido. A visualização LaTeX para uma matriz depende da bibliotecasympy, portanto, se você estiver usando essa funcionalidade, certifique-se de ter osympyinstalado. -
Como consequência da remoção do modelo
BackendV1, oplot_gate_map(),plot_error_map()eplot_circuit_layout()não aceitam mais entradas do tipoBackendV1em seu argumento de entradabackend. -
A gaveta da linha do tempo agora exige que o argumento
targetseja especificado quando chamado. Como as instruções não contêm mais atributos de duração, esse argumento extra é necessário para especificar as durações de todas as instruções compatíveis. Sem o argumento, a gaveta da linha do tempo não tem acesso a essas informações. -
Como parte da remoção do Pulse no Qiskit 2.0, o suporte para desenho de pulso via
qiskit.visualization.pulse_drawerfoi removido.
Páginas Notas da Atualização
-
Os decoradores
deprecate_functionedeprecate_arguments, obsoletos desde o Qiskit v0.24 (maio de 2023), foram removidos no Qiskit v2.0.0. O atualdeprecate_func()atual substitui@deprecate_functione o atualdeprecate_arg()substitui@deprecate_arguments. -
A função
assemblee os recursos relacionados (contidos no móduloassembler) foram removidos da base de código após sua descontinuidade no Qiskit v1.2.assemblefoi usado para gerar umQobjno contexto do fluxo de trabalhoBackendV1obsoleto. A conversão não é mais necessária, pois o pipeline de transpilação e primitivos lida diretamente com os circuitos quânticos, tornando oQobjobsoleto.A remoção inclui os seguintes componentes de API pública:
qiskit.compiler.assemblefunctionqiskit.assembler.assemble_circuitsfunctionqiskit.assembler.assemble_schedulesfunctionqiskit.assembler.disassemblefunctionqiskit.assembler.RunConfigclasse- método
qiskit.circuit.Instruction.assemble
-
A estrutura
Qobje as classes relacionadas, obsoletas no Qiskit v1.2.0, foram removidas. Eles foram introduzidos como parte do fluxo de trabalhoBackendV1e não são mais necessários para interagir comBackendV2backends. Essa remoção afeta as seguintes classes:QobjExperimentHeaderQobjHeaderQasmQobjQasmQobjInstructionQasmQobjExperimentConfigQasmQobjExperimentQasmQobjConfigQasmExperimentCalibrationsGateCalibrationPulseQobjPulseQobjInstructionPulseQobjExperimentConfigPulseQobjExperimentPulseQobjConfigQobjMeasurementOptionPulseLibraryItem
-
As classes
MeasLeveleMeasReturnType, anteriormente definidas emqobj/utils.py, foram migradas pararesult/models.pyapós a remoção do móduloqobj. Essas classes não faziam parte da API pública. O caminho de importação foi atualizado de:from qiskit.qobj.utils import MeasLevel, MeasReturnTypepara:from qiskit.result import MeasLevel, MeasReturnType. -
O uso de argumentos posicionais no construtor de
Resultfoi desativado. Defina todos os argumentos usando a sintaxe kwarg, ou seja:Result(backend_name="name", ....). Além disso, o argumentoqobj_idnão será mais usado na construção dosResultinternos. Ainda é possível definirqobj_idcomo um kwarg genérico, que aparecerá no campo de metadados com os outros kwargs genéricos. -
Como parte da remoção de pulsos no Qiskit 2.0.0, as funções
sequenceeschedule_circuitdeqiskit.scheduler, juntamente com a classeScheduleConfig, foram removidas. -
O módulo
qiskit.result.mitigationfoi removido após sua descontinuidade no Qiskit v1.3. A remoção inclui as classesLocalReadoutMitigatoreCorrelatedReadoutMitigator, bem como os utilitários associados. Não há caminho alternativo no Qiskit, pois sua funcionalidade foi substituída pelo complemento`mthree. <https://github.com/Qiskit/qiskit-addon-mthree> `__
Circuitos obsoletos
-
O atributo obsoleto
QuantumCircuit.durationnão foi removido nesta versão como planejado originalmente. Em vez disso, ele será removido como parte da versão do Qiskit v3.0.0. Essa funcionalidade foi substituída pelo métodoQuantumCircuit.estimate_duration()que deve ser usado em seu lugar. -
A interface obsoleta do tipo tupla para
CircuitInstructionnão foi removida nesta versão como planejado originalmente. Em vez disso, ele será removido no Qiskit v3.0.0. Em vez disso, use ooperation,qubits, eclbitsatributos nomeados. -
A classe de circuito Multiple-Control-Multiple-Target
MCMTagora está obsoleta e foi substituída porMCMTGateque é uma subclasseGateadequada. O uso de uma porta em vez de um circuito permite que o compilador raciocine sobre o objeto em um nível mais alto de abstração e permite a aplicação de vários plug-ins de síntese.
Depreciações do Transpiler
-
O atributo obsoleto
DAGCircuit.durationnão foi removido nesta versão como planejado originalmente. Em vez disso, ele será removido como parte da versão do Qiskit v3.0.0. Essa funcionalidade foi substituída pelo métodoQuantumCircuit.estimate_duration()que deve ser usado em seu lugar. -
O argumento
propagate_conditiondeDAGCircuit.substitute_node()eDAGCircuit.substitute_node_with_dag()foi descontinuado. Com a remoção doInstruction.conditiondo modelo de dados do Qiskit, essa opção não tem mais utilidade. Se estiver definido, ele não terá mais efeito. Ele não é removido da assinatura para manter a compatibilidade durante a migração do Qiskit 1.x -> 2.0. Essa opção será removida no Qiskit 3.0. -
A função
generate_pre_op_passmanager()está obsoleta. Ele não é mais usado nos gerenciadores de passagem de predefinição do Qiskit e sua finalidade não existe mais; originalmente, ele gerava um estágio de correção para plug-ins de tradução que não respeitavam a direcionalidade do ISA. Agora é necessário que os estágios de tradução respeitem a direcionalidade, portanto, a funcionalidade não é necessária e, muito provavelmente, não será necessário substituí-la.
Problemas de segurança
- Foi corrigida uma vulnerabilidade de segurança no
qpy.load()ao carregar cargas úteis que usamsympypara serializarParameterExpressionobjetos e outras expressões simbólicas. Isso inclui potencialmente qualquer carga útil do QPY usando a versão < 10 do QPY e, opcionalmente, 10, 11 e 12, dependendo da codificação simbólica usada na etapa de serialização (qpy.dump()).
Correções de bugs
-
Foi corrigida uma inconsistência no processo de transpilação ao lidar com portas próximas à identidade, em que essas portas eram avaliadas para comutar com tudo por
CommutationAnalysismas não eram removidas porRemoveIdentityEquivalent. O problema subjacente foi causado porRemoveIdentityEquivalenteCommutationAnalysis(e, por extensão,CommutativeInverseCancellation) usando métricas diferentes. Ambos agora usam a fidelidade média da porta e o mesmo limite para avaliar se uma porta deve ser tratada como identidade (como uma porta de rotação com ângulo muito pequeno). Consulte a documentação dessas classes para obter mais informações. Corrigido #13547. -
Foi corrigido um erro no
QuantumCircuit.assign_parameters()que ocorria ao atribuir parâmetros a portas padrão cuja definição já havia sido acionada. Nesse caso, os novos valores não foram propagados corretamente para as instâncias do portão. Embora o circuito em si ainda tenha sido compilado conforme o esperado, a inspeção das operações individuais ainda mostraria o parâmetro antigo.Por exemplo:
from qiskit.circuit.library import EfficientSU2 circuit = EfficientSU2(2, flatten=True) circuit.assign_parameters([1.25] * circuit.num_parameters, inplace=True) print(circuit.data[0].operation.params) # would print θ[0] instead of 1.25Corrigido #13478.
-
Foi corrigido um bug no
DAGCircuitque fazia com que os nós de saídaVarse tornassem nós de entrada durantedeepcopye a decapagem. -
Foi corrigido um descuido na classe
Targetem que a definição de um novo valor para o atributodte a chamada subsequente paratarget.durations()não mostrava o valor atualizado dedtno objetoInstructionDurationsretornado. Isso agora foi corrigido por meio de uma invalidação do cache interno de durações de instruções de destino no definidordt. -
Foi corrigido um problema na passagem do
BasisTranslatorem que a fase global do DAG não era atualizada corretamente. Corrigido #14074. -
Foi corrigido um bug na passagem do
HighLevelSynthesisem que ele sintetizava qualquer instrução para a qual um plug-in de síntese estivesse disponível, independentemente de a instrução já ser compatível com o destino ou fazer parte da passagem explícitabasis_gates. Esse comportamento foi corrigido, de modo que essas instruções já suportadas não são mais sintetizadas. -
A
InverseCancellationpassa a ser executada dentro de blocos de fluxo de controle. Anteriormente, ele ignorava pares de portas que podiam ser canceladas quando eram definidas dentro de blocos clássicos. Consulte #13437 para obter mais detalhes. -
Foi corrigido um bug com rotações multicontroladas em que o ângulo de rotação era um
ParameterExpression. A tentativa de síntese nesse caso levaria a um erro informando que a porta não pode ser sintetizada com um parâmetro não vinculado. Esse bug afetava os métodos de circuito de rotação multicontroladaQuantumCircuit.mcrx(), :meth:.QuantumCircuit.mcry, eQuantumCircuit.mcrz()bem como ao chamarRXGate.control(),RYGate.control(), ouRZGate.control()quando o ângulo de rotação era umParameterExpression. Agora, esses circuitos de rotação multicontrolados podem ser sintetizados sem gerar erros. -
Foi corrigido um bug no QPY (
qiskit.qpy) em que os circuitos contendo portas da classeMCMTGatenão conseguiam ser serializados. Consulte #13965. -
Foi corrigido um bug que fazia com que o
Statevector.expectation_value()produzisse resultados incorretos para o operador de identidade quando o vetor de estado não era normalizado. Corrigido #13029 -
A conversão de um circuito quântico em uma porta com
converters.circuit_to_instruction()agora falha corretamente quando o circuito fornecido contém instruções de fluxo de controle. -
Chamando um
AnalysisPassou umTransformationPasscomo uma função (como empass_ = MyPass(); pass_(qc)) agora respeitará todos os requisitos que a passagem possa ter. Por exemplo, as passagens de agendamento, comoALAPScheduleAnalysisexigem queTimeUnitConversionseja executado antes deles. A execução da passagem usando umPassManagersempre respeitou esse requisito, mas, até agora, ele não era respeitado ao chamar a passagem diretamente. -
Quando uma
TranspilerErroré levantada por uma passagem dentro de uma chamada paraPassManger.run(), a exceção agora será propagada sem perdas, em vez de se tornar uma exceção encadeada com um tipo apagado. -
SabreSwapnão mais contrairá fios de qubit ociosos fora dos blocos de fluxo de controle durante o roteamento. Em geral, essa era uma otimização válida, mas não era um efeito colateral esperado de uma passagem de roteamento. Agora você pode usar o passeContractIdleWiresInControlFlowpara realizar essa contração. -
Correção de um não determinismo baseado em processo em
SparsePauliOp.to_matrix. A ordem exata das operações de ponto flutuante na soma variava anteriormente por processo, mas agora será idêntica entre diferentes invocações do mesmo script. Consulte #13413.