Notas de versão do Qiskit 0.37
0.37.2
Terra 0.21.2
Prelúdio
O Qiskit Terra 0.21.2 é principalmente uma versão de correção de bugs e também vem com várias páginas de documentação aprimoradas.
Correções de bugs
-
aer_simulator_statevector_gpuagora será reconhecido corretamente como método statevector em alguma função ao usar os simuladores de GPU do Qiskit Aer emQuantumInstancee outros executores de algoritmos. -
Corrigido o método
UCGate.inverse()que anteriormente não invertia a fase global. -
QuantumCircuit.compose()agora funcionará corretamente quando usado com o argumentoinplace=Trueem contextos de construtor de fluxo de controle. Anteriormente, as instruções eram adicionadas fora do escopo do fluxo de controle. Corrigido #8433. -
Foi corrigido um bug em que uma expressão vinculada
ParameterExpressionnão era identificado como real se o sitesymengineestivesse instalado e a expressão de limite não fosse um simples1j. Por exemplo:from qiskit.circuit import Parameter x = Parameter("x") expr = 1j * x bound = expr.bind({x: 2}) print(bound.is_real()) # used to be True, but is now False -
Correção da serialização e desserialização do QPY de
ControlledGatecom controles abertos (ou seja, aqueles cujoctrl_statenão é "all ones"). Corrigido #8549. -
Todos os back-ends falsos em
qiskit.providers.fake_provider.backendsforam atualizados para retornar os objetos de canal de pulso correspondentes com a chamada de método dedrive_channel(),measure_channel(),acquire_channel(),control_channel(). -
Corrigido o suporte à execução do site
Z2Symmetries.taper()em problemas maiores. Anteriormente, o método exigia uma grande quantidade de memória, o que normalmente causava falhas em problemas maiores. Como efeito colateral dessa correção, o desempenho melhorou significativamente.
Aer 0.10.4
Nenhuma mudança
IBM 0.19.2
Nenhuma mudança
0.37.1
Terra 0.21.1
Correções de bugs
-
Foi corrigido um problema no método
QuantumCircuit.decompose()ao passar uma lista de classesGatepara o argumentogates_to_decompose. Se alguma porta do circuito tivesse um rótulo definido, esse argumento não seria tratado corretamente e faria com que a decomposição de saída ignorasse incorretamente as portas explicitamente na listagates_to_decompose. -
Correção
to_instruction()que anteriormente tentava criar umUnitaryGatesem exponenciar o operador para evoluir. Como esse operador geralmente não é unitário, isso gerou um erro (e se o operador tivesse sido unitário por acaso, não teria sido o resultado esperado).Agora, chamar
to_instruction()produz corretamente uma porta que implementa a evolução temporal do operador que ela mantém:>>> from qiskit.opflow import EvolvedOp, X >>> op = EvolvedOp(0.5 * X) >>> op.to_instruction() Instruction( name='unitary', num_qubits=1, num_clbits=0, params=[array([[0.87758256+0.j, 0.-0.47942554j], [0.-0.47942554j, 0.87758256+0.j]])] ) -
Corrigido um problema com a função
marginal_distribution()quando uma matriz numpy era passada para o argumentoindices, a função gerava um erro. Corrigido #8283 -
Anteriormente, não era possível associar um
CircuitStateFnque tenha sido construído a partir de umVectorStateFn. Isso se deve ao fato de o vetor de estado ter sido convertido em um circuito com a instruçãoInitialize, que não é unitária. Esse problema agora é corrigido com o uso da instruçãoStatePreparationque pode ser usada, pois se presume que o estado comece no estado totalmente 0.Por exemplo, agora podemos fazer:
from qiskit import QuantumCircuit from qiskit.opflow import StateFn left = StateFn([0, 1]) left_circuit = left.to_circuit_op().primitive right_circuit = QuantumCircuit(1) right_circuit.x(0) overlap = left_circuit.inverse().compose(right_circuit) # this line raised an error before! -
Corrigir um bug nas classes
Optimizerem que a reconstrução de uma nova instância do otimizador a partir de uma instância existente anteriormentesettingsredefinia as configurações do otimizador novo e anterior para os padrões. Isso levou a um bug, principalmente se os objetosOptimizerfossem enviados como entrada para os programas Qiskit Runtime.Agora os objetos do otimizador são reconstruídos corretamente:
>>> from qiskit.algorithms.optimizers import COBYLA >>> original = COBYLA(maxiter=1) >>> reconstructed = COBYLA(**original.settings) >>> reconstructed._options["maxiter"] 1 # used to be 1000! -
Foi corrigido um problema em que o argumento
limit_amplitudeem um arquivoSymbolicPulseouWaveformnão era refletido corretamente pela validação de parâmetros. Além disso, o QPY scheduledump()foi corrigido para armazenar corretamente o valorlimit_amplitudevinculado à instância, em vez de salvar a variável de classe global. -
Fixe a estrutura de emaranhamento em pares para
NLocalcircuitos. Isso levou a um erro noZZFeatureMaponde o uso doentanglement="pairwise"gerava um erro. Agora ele produz corretamente o mapa de recursos desejado:from qiskit.circuit.library import ZZFeatureMap encoding = ZZFeatureMap(4, entanglement="pairwise", reps=1) print(encoding.decompose().draw())As impressões acima:
┌───┐┌─────────────┐ q_0: ┤ H ├┤ P(2.0*x[0]) ├──■────────────────────────────────────■──────────────────────────────────────────── ├───┤├─────────────┤┌─┴─┐┌──────────────────────────────┐┌─┴─┐ q_1: ┤ H ├┤ P(2.0*x[1]) ├┤ X ├┤ P(2.0*(π - x[0])*(π - x[1])) ├┤ X ├──■────────────────────────────────────■── ├───┤├─────────────┤└───┘└──────────────────────────────┘└───┘┌─┴─┐┌──────────────────────────────┐┌─┴─┐ q_2: ┤ H ├┤ P(2.0*x[2]) ├──■────────────────────────────────────■──┤ X ├┤ P(2.0*(π - x[1])*(π - x[2])) ├┤ X ├ ├───┤├─────────────┤┌─┴─┐┌──────────────────────────────┐┌─┴─┐└───┘└──────────────────────────────┘└───┘ q_3: ┤ H ├┤ P(2.0*x[3]) ├┤ X ├┤ P(2.0*(π - x[2])*(π - x[3])) ├┤ X ├────────────────────────────────────────── └───┘└─────────────┘└───┘└──────────────────────────────┘└───┘ -
Foi corrigido um problema no tratamento da fase global da classe
UCGateclasse.
Aer 0.10.4
Nenhuma mudança
IBM 0.19.2
Nenhuma mudança
0.37.0
Esta versão marca oficialmente o fim do suporte ao projeto Qiskit Ignis da Qiskit. Ele foi originalmente descontinuado na versão 0.33.0 e, como foi documentado nessa versão, o pacote qiskit-ignis foi removido do metapacote do Qiskit, o que significa que, na versão futura, o pip install qiskit não incluirá mais o qiskit-ignis. No entanto, observe que, devido a limitações no empacotamento do python, não podemos remover automaticamente uma instalação pré-existente do qiskit-ignis. Se estiver atualizando a partir de uma versão anterior, é recomendável desinstalar manualmente o Qiskit Ignis com pip uninstall qiskit-ignis ou instalar o metapacote em um ambiente python novo.
O Qiskit Ignis foi superado pelo projeto Qiskit Experiments. Você pode consultar o guia de migração para obter detalhes sobre como mudar do Qiskit Ignis para o Qiskit Experiments.
Terra 0.21.0
Prelúdio
Os destaques da versão do Qiskit 0.21.0 são:
- Suporte à serialização de um pulso
ScheduleBlockviaqiskit.qpy. O formato QPY foi atualizado para a versão 5, que inclui uma definição para incluir as programações de pulso. Para dar suporte a isso, uma nova classeSymbolicPulsefoi introduzida para permitir a definição de formas de onda de pulso paramétrico por meio de expressões simbólicas.- Aprimoramentos no trabalho com gerenciadores de passes predefinidos. Uma nova função
generate_preset_pass_manager()permite gerar facilmente um gerenciador de passes equivalente ao que otranspile()usará internamente. Além disso, os gerenciadores de passagem predefinidos agora são instâncias deStagedPassManagero que facilita a modificação das seções.- Uma refatoração da estrutura de dados interna do atributo
QuantumCircuit.dataatributo. Antes era uma lista de tuplas no formato(instruction, qubits, clbits)e agora é uma lista deCircuitInstructionobjetos. Os objetosCircuitInstructioné compatível com as versões anteriores do acesso baseado em tuplas, porém com custo adicional de tempo de execução.
Além disso, o transpilador foi aprimorado para permitir saídas de melhor qualidade. Isso inclui a introdução de novos passes, como VF2PostLayout e ToqmSwap.
Novos Recurso
-
Adicionada uma nova classe,
qiskit.transpiler.StagedPassManagerque é uma subclassePassManagerque tem um pipeline com fases definidas para realizar a compilação de circuitos. Cada fase é um objetoPassManagerobjeto que será executado em uma ordem fixa. Por exemplo:from qiskit.transpiler.passes import * from qiskit.transpiler import PassManager, StagedPassManager basis_gates = ['rx', 'ry', 'rxx'] init = PassManager([UnitarySynthesis(basis_gates, min_qubits=3), Unroll3qOrMore()]) translate = PassManager([Collect2qBlocks(), ConsolidateBlocks(basis_gates=basis_gates), UnitarySynthesis(basis_gates)]) staged_pm = StagedPassManager(stages=['init', 'translation'], init=init, translation=translate) -
Adicionados os métodos
PauliList.group_commuting()eSparsePauliOp.group_commuting()que dividem esses operadores em sublistas em que cada elemento comuta com todos os outros. Por exemplo:from qiskit.quantum_info import PauliList, SparsePauliOp groups = PauliList(["XX", "YY", "IZ", "ZZ"]).group_commuting() # 'groups' is [PauliList(['IZ', 'ZZ']), PauliList(['XX', 'YY'])] op = SparsePauliOp.from_list([("XX", 2), ("YY", 1), ("IZ", 2j), ("ZZ", 1j)]) groups = op.group_commuting() # 'groups' is [ # SparsePauliOp(['IZ', 'ZZ'], coeffs=[0.+2.j, 0.+1.j]), # SparsePauliOp(['XX', 'YY'], coeffs=[2.+0.j, 1.+0.j]), # ] -
Adicionada uma nova função,
marginal_distribution()que é usada para marginalizar um dicionário de entrada de bitstrings para um número inteiro (comoCounts). A funcionalidade é semelhante à da funçãomarginal_counts()existente, com três diferenças importantes. A primeira é que omarginal_counts()funciona com um dicionário de contagens ou com um objetoResults, enquantomarginal_distribution()só funciona com um dicionário. A segunda é que omarginal_counts()não respeita a ordem dos índices em seu argumentoindices, enquantomarginal_distribution()respeita e permutará os bits de saída com base na ordemindices. A terceira diferença é que omarginal_distribution()deve ser mais rápido, pois sua implementação foi escrita em Rust e simplificada para apenas marginalizar uma entrada de dicionário. -
Adição do operador binário
@(__matmul__) às subclassesBaseOperatorno móduloqiskit.quantum_infomódulo. Essa é uma forma abreviada de chamar o métododotdas classes (A @ B == A.dot(B)). -
Adicionado um novo argumento opcional,
reps, aoQuantumCircuit.decompose()que permite a decomposição repetida do circuito. Por exemplo:from qiskit import QuantumCircuit circuit = QuantumCircuit(1) circuit.ry(0.5, 0) # Equivalent to circuit.decompose().decompose() circuit.decompose(reps=2) # decompose 2 times, but only RY gate 2 times and R gate 1 times circuit.decompose(gates_to_decompose=['ry','r'], reps=2) -
Adição de uma nova classe base de pulso
SymbolicPulse. Esse é um substituto do convencionalParametricPulseconvencional, que será descontinuado. Na nova classe base, as funções de envelope de pulso e de validação de parâmetro são representadas por objetos de expressão simbólica. A nova classe fornece dados de pulso autônomos e portáteis, pois essas equações simbólicas podem ser facilmente serializadas por meio de bibliotecas de computação simbólica. -
Adicionado suporte para operadores não hermitianos em
AerPauliExpectation. Isso permite o uso dos cálculos rápidos de expectativa de instantâneos do Aer em algoritmos comoQEOM. -
Foi adicionado um novo estilo de desenho de circuito,
textbook, que usa o esquema de cores do Qiskit Textbook. -
Um novo atributo
QuantumCircuit.op_start_timesé preenchido quando uma das passagens de análise de agendamento é executada no circuito. Ele pode ser usado para obter instruções de circuito com tempo de instrução, por exemplo:from qiskit import QuantumCircuit, transpile from qiskit.providers.fake_provider import FakeMontreal backend = FakeMontreal() qc = QuantumCircuit(2) qc.h(0) qc.cx(0, 1) qct = transpile( qc, backend, initial_layout=[0, 1], coupling_map=[[0, 1]], scheduling_method="alap" ) scheduled_insts = list(zip(qct.op_start_times, qct.data)) -
Adicionado um novo método
QuantumCircuit.clear()que é usado para remover todas as instruções de um arquivoQuantumCircuit. -
Adicionado um novo método
QuantumCircuit.copy_empty_like()que é usado para obter uma cópia limpa de uma instânciaQuantumCircuitinstância. Isso é logicamente equivalente aqc.copy().clear(), mas é significativamente mais rápido e eficiente em termos de memória. Isso é útil quando se precisa de um novo circuito vazio com todos os mesmos recursos (qubits, bits clássicos, metadados e assim por diante) já adicionados. -
O método
Target.instruction_supported()agora suporta dois novos argumentos de palavra-chave,operation_classeparameters. Usando esses argumentos, o métodoinstruction_supported()pode agora ser usado para verificar se uma operação específica com valores de parâmetros é compatível com um objetoTargetobjeto. Por exemplo, se você quiser verificar se um siteTargetchamadotargetsuporta a execução de umRXGatecom , você faria algo como:from math import pi from qiskit.circuit.library import RXGate target.instruction_supported(operation_class=RXGate, parameters=[pi/2])que retornará
Truesetargetsuportar a execuçãoRXGatecom eFalsecaso contrário. -
Adição de um algoritmo de evolução quântica em tempo real baseado em Trotterização
qiskit.algorithms.TrotterQRTE. Ele está em conformidade com a nova estrutura de evolução do tempo quântico e faz uso das funçõesProductFormulaePauliEvolutionGateimplementações.from qiskit.algorithms import EvolutionProblem from qiskit.algorithms.evolvers.trotterization import TrotterQRTE from qiskit.opflow import X, Z, StateFn, SummedOp operator = SummedOp([X, Z]) initial_state = StateFn([1, 0]) time = 1 evolution_problem = EvolutionProblem(operator, time, initial_state) trotter_qrte = TrotterQRTE() evolution_result = trotter_qrte.evolve(evolution_problem) evolved_state_circuit = evolution_result.evolved_state -
Adicionada uma nova função
generate_preset_pass_manager()que pode ser usada para gerar rapidamente um objeto predefinidoPassManagerque espelha o objetoPassManagerusado internamente pela funçãotranspile()função. Por exemplo:from qiskit.transpiler.preset_passmanagers import generate_preset_pass_manager from qiskit.providers.fake_provider import FakeWashingtonV2 # Generate an optimization level 3 pass manager targeting FakeWashingtonV2 pass_manager = generate_preset_pass_manager(3, FakeWashingtonV2()) -
Adicionada uma nova função
marginal_memory()que é usada para marginalizar matrizes de memória de captura. Fornecida com a matriz de memória de disparo e os índices de interesse, a função retornará uma matriz de memória de disparo maginizada. Essa função é diferente do suporte à memória no métodomarginal_counts()que só funciona no campomemoryem um objetoResults. -
A interface de primitivos foi ampliada para aceitar objetos, além de índices, como argumentos para o método
__call__. O argumentoparameter_valuesagora pode ser opcional. -
O exportador do OpenQASM 3 (
qiskit.qasm3) agora oferece suporte à exportação de circuitos com atrasos explícitos, como os doQuantumCircuit.delay(). -
Adicionado um novo método de layout e roteamento ao
transpile()com base no documento "Time-optimal qubit mapping". Para usá-lo, o pacote opcional Qiskit TOQM deve ser instalado. O kwargrouting_methoddetranspile()suporta um valor adicional,'toqm', que é usado para ativar o layout e o roteamento via TOQM.Para instalar o
qiskit-toqmjunto com o Terra, execute:pip install qiskit-terra[toqm] -
Inclusão de um novo módulo
qiskit.quantum_info.synthesis.qsdpara aplicar a Decomposição Quântica de Shannon em unidades arbitrárias. Essa funcionalidade substitui a abordagem anterior baseada em isometria na passagem padrão do transpilador de síntese unitária, bem como ao adicionar unitários a um circuito usando umUnitaryGate.A Decomposição Quântica de Shannon usa cerca de metade das portas cnot como a implementação de isometria ao decompor matrizes unitárias de mais de dois qubits.
-
As classes no módulo
quantum_infoque suportam a multiplicação escalar agora podem ser multiplicadas por um escalar da esquerda ou da direita. Anteriormente, eles só aceitavam multiplicadores escalares da esquerda. -
A passagem do transpilador
LookaheadSwap(usado portranspile()quandorouting_method="lookahead") teve algumas melhorias de desempenho e agora será aproximadamente três vezes mais rápida. Isso é apenas ser mais eficiente em seus cálculos e não altera a complexidade do algoritmo. Na maioria dos casos, um algoritmo de roteamento mais moderno, como oSabreSwap(routing_method="sabre") terá um desempenho muito melhor. -
Novos passes de transpiladores foram adicionados. A passagem do transpilador
Commuting2qGateRouterusa estratégias de troca para rotear um bloco de portas de comutação para o mapa de acoplamento. De fato, o roteamento é um problema difícil, mas é significativamente mais fácil quando os portões se alternam, como nas redes CZ. Blocos de portões de deslocamento também são normalmente encontrados na QAOA. Esses casos podem ser tratados com estratégias de troca que aplicam um conjunto predefinido de camadas de portas SWAP. Além disso, a nova passagem do transpiladorFindCommutingPauliEvolutionsidentifica blocos de evoluções de Pauli feitos de termos de dois qubits comutáveis. Aqui, uma estratégia de troca é especificada pela classeSwapStrategy. As estratégias de troca precisam ser adaptadas ao mapa de acoplamento e, idealmente, ao circuito para obter os melhores resultados. -
Introduziu um novo otimizador na biblioteca Qiskit, que adiciona suporte à otimização de parâmetros de algoritmos quânticos variacionais. Esse é o Algoritmo de Distribuição Marginal Univariada (UMDA), que é um tipo específico de Algoritmos de Estimativa de Distribuição. Por exemplo:
from qiskit.opflow import X, Z, I from qiskit import Aer from qiskit.algorithms.optimizers import UMDA from qiskit.algorithms import QAOA from qiskit.utils import QuantumInstance H2_op = (-1.052373245772859 * I ^ I) + \ (0.39793742484318045 * I ^ Z) + \ (-0.39793742484318045 * Z ^ I) + \ (-0.01128010425623538 * Z ^ Z) + \ (0.18093119978423156 * X ^ X) p = 2 # Toy example: 2 layers with 2 parameters in each layer: 4 variables opt = UMDA(maxiter=100, size_gen=20) backend = Aer.get_backend('statevector_simulator') vqe = QAOA(opt, quantum_instance=QuantumInstance(backend=backend), reps=p) result = vqe.compute_minimum_eigenvalue(operator=H2_op) -
O construtor da passagem
Unroll3qOrMoretranspiler pass tem dois novos argumentos opcionais de palavra-chave,targetebasis_gates. Essas opções permitem que você especifique oTargetou as portas de base suportadas, respectivamente, para descrever o backend de destino. Se alguma das operações no circuito estiver emtargetoubasis_gates, elas não serão desenroladas pela passagem, pois o dispositivo de destino tem suporte nativo para a operação. -
A serialização QPY foi atualizada para suportar
ScheduleBlock. Agora você pode salvar o programa de pulso em binário e carregá-lo posteriormente:from qiskit import pulse, qpy with pulse.build() as schedule: pulse.play(pulse.Gaussian(160, 0.1, 40), pulse.DriveChannel(0)) with open('schedule.qpy', 'wb') as fd: qpy.dump(schedule, fd) with open('schedule.qpy', 'rb') as fd: new_schedule = qpy.load(fd)[0]Isso usa a interface QPY comum ao
QuantumCircuit. Consulte SCHEDULE_BLOCK para obter detalhes sobre a estrutura de dados. -
Adicionada uma nova passagem de transpilador,
VF2PostLayout. Essa passagem é de um novo tipo para executar uma nova fase/função no pipeline de compilação, pós-layout ou seleção de qubit pós-otimização. A ideia por trás dessa passagem é que, depois de terminarmos o loop de otimização no transpiler, saberemos quais serão as contagens finais de portas em cada qubit do circuito, de modo que possamos encontrar um subconjunto de qubits com melhor desempenho em um backend para executar o circuito. A passagem procurará um subgrafo isomórfico no gráfico de conectividade do backend de destino e examinará a taxa de erro total do circuito completo em qualquer subgrafo encontrado e retornará o layout encontrado com a menor taxa de erro para o circuito.Essa passagem é semelhante à passagem
VF2Layoute ambas usam internamente a mesma implementação VF2 do retworkx. No entanto,VF2PostLayoutfoi projetado para ser executado após a execução do layout inicial, do roteamento, da conversão de base e de quaisquer passes de otimização, e só funcionará se um layout já tiver sido aplicado, se o circuito tiver sido roteado e se todas as portas estiverem na base de destino. Isso é necessário para que, quando um novo layout for aplicado, o circuito ainda possa ser executado no dispositivo de destino.VF2Layoutpor outro lado, foi projetado para encontrar um layout inicial perfeito e pode funcionar com qualquer circuito. -
A passagem do
ApplyLayoutagora tem suporte para atualizar um layout em um circuito depois que um layout já foi aplicado uma vez. Se o campopost_layoutestiver presente (além do campo obrigatóriolayout), oproperty_set, quando aApplyLayoutfor executada, a passagem atualizará o layout para aplicar o novo layout. Isso retornará umDAGCircuitcom os qubits na nova ordem física e o conjunto de propriedadeslayoutserá atualizado de modo a mapear os qubits virtuais do layout original para os qubits físicos no novo campopost_layout. -
Os gerentes de passagem predefinidos gerados por
level_1_pass_manager(),level_2_pass_manager(), elevel_3_pass_manager()que correspondem aoptimization_level1, 2 e 3, respectivamente, na funçãotranspile()agora executam a passagemVF2PostLayoutdepois de executar a passagem de roteamento. Isso permite que o transpilador encontre um conjunto diferente de qubits físicos no backend de destino para executar o circuito com taxas de erro mais baixas. A passagemVF2PostLayoutnão será executada se você especificar manualmente os argumentoslayout_method,routing_method, ouinitial_layoutparatranspile(). Se o passe puder encontrar um subconjunto de qubits de melhor desempenho no backend para executar o circuito físico, ele ajustará o layout do circuito para usar os qubits alternativos. -
O algoritmo calcula iterativamente cada estado próprio, começando pelo estado fundamental (que é calculado como no VQE) e, em seguida, otimizando uma função de custo modificada que tenta calcular estados próprios que sejam ortogonais aos estados calculados nas iterações anteriores e que tenham a menor energia quando calculados sobre o ansatz. A interface implementada é muito semelhante à do VQE e tem o seguinte formato:
from qiskit.algorithms import VQD from qiskit.utils import QuantumInstance from qiskit.circuit.library import TwoLocal from qiskit.algorithms.optimizers import COBYLA from qiskit import BasicAer from qiskit.opflow import I,Z,X h2_op = ( -1.052373245772859 * (I ^ I) + 0.39793742484318045 * (I ^ Z) - 0.39793742484318045 * (Z ^ I) - 0.01128010425623538 * (Z ^ Z) + 0.18093119978423156 * (X ^ X) ) vqd = VQD(k =2, ansatz = TwoLocal(rotation_blocks="ry", entanglement_blocks="cz"),optimizer = COBYLA(maxiter = 0), quantum_instance = QuantumInstance( BasicAer.get_backend("qasm_simulator"), shots = 2048) ) vqd_res = vqd.compute_eigenvalues(op)Esse trecho de código específico gera 2 autovalores (estado fundamental e primeiro estado excitado) Os testes também foram implementados.
Notas da Atualização
-
As classes de pulso em
qiskit.pulse.libraryagora são subclasses deSymbolicPulseem vez deParametricPulse. As classes disponíveis permanecem inalteradas comoGaussian,GaussianSquare,Drag, eConstant.SymbolicPulsetem total compatibilidade com versões anteriores, e não deve haver perda de funcionalidade. -
O tipo de dados de cada elemento em
QuantumCircuit.datafoi alterado. Costumava ser uma simples tripla de anInstruction, uma lista deQubits, e uma lista deClbits, enquanto agora é uma instância deCircuitInstruction.Os atributos dessa nova classe são
operation,qubitseclbitscorrespondentes aos elementos da tupla anterior. No entanto,qubitseclbitssão agora instâncias detuple, e nãolists.Essa nova classe se comportará exatamente como a antiga 3-tupla se alguém tentar acessar seu índice, seus elementos ou iterar por ela. Isso inclui o uso de
qubitseclbitspara listas. Isso é para ajudar na compatibilidade com versões anteriores. A partir do Qiskit Terra 0.21, essa não é mais a maneira preferida de acessar esses elementos. Em vez disso, você deve usar o formulário de acesso a atributos descrito acima.Isso foi feito para permitir novos desenvolvimentos da estrutura de dados
QuantumCircuitestrutura de dados no Terra, sem quebrar constantemente a compatibilidade com versões anteriores. Os desenvolvimentos planejados incluem circuitos parametrizados dinâmicos e uma redução geral no uso de memória de circuitos profundos. -
A dependência
python-constraint, que é usada somente pela passagemCSPLayoutnão está mais na lista de requisitos do pacote Qiskit Terra. Isso ocorre porque o passeCSPLayoutnão é mais usado por padrão em nenhum dos gerenciadores de passes predefinidos para otranspile(). Embora o passe ainda esteja disponível, se você o estiver usando, precisará instalar manualmente opython-contraintou, quando instalar oqiskit-terra, poderá usar o extracsp-layout, por exemplo:pip install "qiskit-terra[csp-layout]" -
A versão do formato de versão QPY emitida por
qpy.dump()foi aumentada para a versão 5. Essa nova versão do formato é incompatível com as versões anteriores e resultará em um erro ao tentar carregá-la com um desserializador que não seja capaz de lidar com o QPY versão 5. Essa alteração foi necessária para corrigir o suporte para representar corretamente as portas controladas e os estados de controle não padrão. -
As extensões Rust compiladas do Qiskit Terra agora têm uma versão Rust mínima suportada (MSRV) de 1.56.1. Isso significa que, ao compilar o Qiskit Terra a partir do código-fonte, a versão mais antiga do compilador Rust suportada é 1.56.1. Se estiver usando uma versão mais antiga do compilador Rust, será necessário atualizar para uma versão mais recente para continuar a compilar o Qiskit a partir do código-fonte. Essa alteração foi necessária porque várias dependências upstream também atualizaram suas versões mínimas suportadas.
-
A programação de circuitos agora é executada em paralelo quando mais de um circuito é fornecido para
schedule(). Consulte o número 2695 para obter mais detalhes. -
As classes
BaseBackend,BaseJobeBaseProvider, anteriormente obsoletas, foram removidas. Eles foram originalmente descontinuados na versão 0.18.0. Em vez dessas classes, você deve usar as classes de interface de provedores com versão, sendo as mais recentesBackendV2,JobV1, eProviderV1. -
O argumento
backend, anteriormente obsoleto, para o construtor da passagemRZXCalibrationBuildertranspiler pass foi removido. Ele foi originalmente preterido na versão 0.19.0. Em vez disso, você deve consultar o objetoBackendpara os endereçosinstruction_schedule_mapequbit_channel_mappinge passá-los diretamente para o construtor. Por exemplo, com umBackendV1backend:from qiskit.transpiler.passes import RZXCalibrationBuilder from qiskit.providers.fake_provider import FakeMumbai backend = FakeMumbai() inst_map = backend.defaults().instruction_schedule_map channel_map = backend.configuration().qubit_channel_mapping cal_pass = RZXCalibrationBuilder( instruction_schedule_map=inst_map, qubit_channel_mapping=channel_map, )ou com um
BackendV2backend:from qiskit.transpiler.passes import RZXCalibrationBuilder from qiskit.providers.fake_provider import FakeMumbaiV2 backend = FakeMumbaiV2() inst_map = backend.instruction_schedule_map channel_map = {bit: backend.drive_channel(bit) for bit in range(backend.num_qubits)} cal_pass = RZXCalibrationBuilder( instruction_schedule_map=inst_map, qubit_channel_mapping=channel_map, ) -
O limite de medições para o backend
BasicAerfoi removido. -
Para o
DAGNode, os kwargs e atributos anteriormente obsoletostype,op,qargs,cargsewireforam removidos. Eles foram originalmente descontinuados na versão 0.19.0. Os kwargs e atributosop,qargsecargssó podem ser acessados em instâncias deDAGOpNode, e o kwarg e o atributowiresó podem ser acessados em instâncias deDAGInNodeouDAGOutNode. -
A função obsoleta
pauli_group()foi removida. Ele foi originalmente descontinuado no Qiskit Terra 0.17. -
Vários métodos obsoletos em
Pauliforam removidos, os quais foram originalmente descontinuados no Qiskit Terra 0.17. Foram eles:sgn_prodUsar
Pauli.compose()ouPauli.dot()em vez disso.to_spmatrixUse
Pauli.to_matrix()com o argumentosparse=Trueem vez disso.kronUse
Pauli.expand()mas lembre-se de que ele retorna um novo objeto, em vez de alterar o existente.update_zeupdate_xDefina os atributos
zexdo objeto diretamente.insert_paulisUse
Pauli.insert().append_paulisUse
Pauli.expand().delete_qubitsUse
Pauli.delete().pauli_singleConstrua o rótulo manualmente e passe diretamente para o inicializador, por exemplo:
Pauli("I" * index + pauli_label + "I" * (num_qubits - index - len(pauli_label)))randomUse
quantum_info.random_pauli()em vez disso. -
Removido o método
optimizedas classesOptimizerque foi substituído pelo métodominimize()como substituição direta. A única exceção éSPSAonde o aviso de depreciação não foi acionado, portanto, o método ainda é mantido. -
Resultfoi modificado para que sempre contenha os atributosdate,statuseheader(definido comoNonese não for especificado). -
Para Python 3.7 shared-memory38 agora é uma dependência. Isso foi adicionado como uma dependência para Python 3.7 para permitir o aproveitamento das construções de memória compartilhada na biblioteca padrão das versões mais recentes do Python. Se você estiver executando em Python >= 3.8, não será necessária nenhuma dependência extra.
-
Instructionos rótulos agora são verificados quanto ao tipo na criação da instrução. -
A serialização do QPY foi atualizada para serializar
QuantumCircuitcomQuantumCircuit.calibrations. A partir da versão 5 do QPY, somente as entradas de calibração do tipoScheduleBlockpodem ser serializadas. -
A definição de
XXPlusYYGatefoi alterada. Consulte o número 7969 para obter detalhes. -
Os gerentes de passagem predefinidos gerados por
level_1_pass_manager(),level_2_pass_manager(), elevel_3_pass_manager()e usados pelo argumentotranspile()da funçãooptimization_levelem 1, 2 e 3, respectivamente, não definem mais um limite de tempo rígido para aVF2Layoutpassagem do transpilador. Isso significa que a passagem não vai mais parar de tentar encontrar uma alternativa melhor para o layout perfeito até um limite de tempo fixo ( 100ms para o nível 1, 10 segundos para o nível 2 e 60 segundos para o nível 3), pois isso limitava a reprodutibilidade da compilação quando um layout perfeito estava disponível. Isso significa que a saída ao usar a passagem pode ser diferente da anterior, embora em todos os casos ela só mude se for possível encontrar um conjunto de qubits com menos ruído em relação à saída anterior. Se quiser manter o comportamento anterior, você pode criar umPassManagerpersonalizado que define o argumentotime_limitno construtor para a passagemVF2Layout.
Notas de descontinuação
-
Chamada
timeline_drawer()com um circuito não programado foi descontinuada. Todos os circuitos, mesmo os que consistem apenas em instruções de atraso, devem ser transpilados com o argumento da palavra-chavescheduling_methoddetranspile()set, para gerar informações de programação que estão sendo armazenadas emQuantumCircuit.op_start_times. -
As funções do conversor NetworkX para
DAGCircuit.to_networkx()efrom_networkx(), juntamente com o métodoDAGDependency.to_networkx()foram descontinuadas e serão removidas em uma versão futura. O Qiskit tem usado o retworkx como sua biblioteca de gráficos desde a versão do qiskit-terra 0.12.0 e, desde então, as funções do conversor networkx têm sofrido perdas. Elas foram originalmente adicionadas para que os usuários pudessem aproveitar a funcionalidade da biblioteca de algoritmos NetworkX’s não presente no retworkx. Desde aquela época, o retworkx amadureceu e oferece mais funcionalidades, e oDAGCircuitestá fortemente acoplado ao retworkx para sua operação. Ter esses métodos de conversão oferece valor limitado no futuro e, portanto, serão removidos em uma versão futura. -
O acesso a vários toggles antigos (
HAS_MATPLOTLIB,HAS_PDFTOCAIRO,HAS_PYLATEXeHAS_PIL) do móduloqiskit.visualizationagora está obsoleto, e esses caminhos de importação serão removidos em uma versão futura do Qiskit Terra. Em vez disso, os mesmos objetos devem ser acessados por meio doqiskit.utils.optionalsque contém testadores para quase todas as dependências opcionais do Terra. -
O módulo
qiskit.test.mockestá obsoleto. As classes de backend falso e provedor falso que estavam disponíveis anteriormente emqiskit.test.mockestão acessíveis emqiskit.providers.fake_providerdesde o Terra 0.20.0. Essa alteração representa um compromisso adequado de oferecer suporte às classes de back-end falsas como parte do Qiskit, enquanto anteriormente elas eram apenas parte do conjunto de testes internos e eram expostas aos usuários como um efeito colateral. -
Os nomes dos argumentos ao chamar um
EstimatorouSamplercomo uma função são renomeados decircuit_indiceseobservable_indicesparacircuitseobservables. -
Os argumentos de palavra-chave
qobj_ideqobj_headerpara a funçãoexecute()foram preteridos e serão removidos em uma versão futura. Desde a remoção da classeBaseBackend, esses argumentos não têm nenhum efeito, pois nenhum backend suporta a execução com um objetoQobjdiretamente e, em vez disso, só funciona com objetosQuantumCircuitdiretamente. -
Os argumentos
x,zelabelpara o inicializador dePauliforam documentados como obsoletos no Qiskit Terra 0.17, mas um erro impediu que o aviso esperado fosse exibido em tempo de execução. Agora, o aviso será exibido corretamente e os argumentos serão removidos no Qiskit Terra 0.23 ou posterior. Um par dexezdeve ser passado de forma posicional como uma única tupla (Pauli((z, x))). Uma cadeia de caractereslabeldeve ser passada em posição no primeiro argumento (Pauli("XYZ")). -
O método
SPSA.optimize()está obsoleto em favor do métodoSPSA.minimize()que pode ser usado como substituto direto. Observe que esse método retorna um objeto de resultado completo com mais informações do que as disponíveis anteriormente. -
O argumento
circuitsdeqpy.dump()foi descontinuado e substituído porprograms, pois agora o QPY oferece suporte a vários tipos de dados além de circuitos. -
AlignmentKind.to_dict()foi preterido e será removido.
Correções de bugs
-
Uma validação extra foi adicionada ao
DiagonalGatepara verificar se o argumento tem módulo um. -
Os índices de qubit duplicados fornecidos a
SparsePauliOp.from_sparse_list()agora gerarão corretamente um erro, em vez de sobrescrever silenciosamente os valores anteriores. O comportamento antigo pode ser acessado passando o argumento da palavra-chave newdo_checks=False. -
A visualização
timeline_drawer()não mais desalinhará os slots de registro clássicos. -
A validação de parâmetros para
GaussianSquareagora é consistente antes e depois da construção. Consulte o número 7882 para obter mais detalhes. -
Os
BackendV2-baseados em backends falsos no móduloqiskit.providers.fake_providercomo oFakeMontrealV2agora suportam a operaçãoDelayem seus atributostargetatributos. Anteriormente,QuantumCircuitque continham atrasos não podiam ser compilados para esses back-ends. -
Corrigido um bug no site
TridiagonalToeplitz.eigs_bounds(), que fazia com que limites incorretos de valores próprios fossem retornados em alguns casos com valores próprios negativos. Consulte o número 7939 para obter mais detalhes. -
Foi corrigido um erro no qual a gaveta do vetor de estado LaTeX ignorava o parâmetro
max_size. -
Suporte fixo no método
PassManagerConfig.from_backend()para criar um objetoPassManagerConfiga partir de uma instânciaBackendV2instância. Anteriormente, isso não era tratado corretamente e falhava ao ser executado com um objetoBackendV2objeto. -
Corrigido o suporte para serialização (
qpy.dump()) e desserialização (qpy.load()) de umQuantumCircuitcontendo objetosControlledGatepersonalizados. Anteriormente, uma exceção era gerada porqpy.load()ao tentar reconstruir o arquivo personalizadoControlledGate. Corrigido #7999. -
Corrigido o suporte para serialização (
qpy.dump()) e desserialização (qpy.load()) de umQuantumCircuitcontendo objetosMCPhaseGatepersonalizados. Anteriormente, uma exceção era gerada porqpy.load()ao tentar reconstruir o arquivoMCPhaseGate. -
Corrigido o suporte para serialização (
qpy.dump()) e desserialização (qpy.load()) de um objetoQuantumCircuitcontendo portas controladas com um estado de controle aberto. Anteriormente, o estado de controle aberto era perdido pelo processo de serialização e pelo circuito reconstruído. -
Fixo
QuantumCircuit.reverse_bits()com circuitos que contenhamQubiteClbit. Por exemplo, o seguinte funcionará agora:from qiskit.circuit import QuantumCircuit, Qubit, Clbit qc = QuantumCircuit([Qubit(), Clbit()]) qc.h(0).c_if(qc.clbits[0], 0) qc.reverse_bits() -
Foi corrigido o atributo
ConfigurableFakeBackend.t2, que anteriormente era definido incorretamente com base no valor fornecido emt1. -
Foi corrigido um problema com as classes de back-end falsas baseadas em
BackendV2-baseado em classes de backend falsas do móduloqiskit.providers.fake_providertais comoFakeMontrealV2em que o valor do atributodt(e o atributoTarget.dt) não estavam sendo convertidos corretamente em segundos. Isso causaria problemas ao usar esses back-ends falsos com agendamento. -
Corrigido um erro no
plot_histogram()quando o argumentonumber_to_keepera menor que o número de chaves. O código a seguir não gerará mais erros e será alinhado corretamente:from qiskit.visualization import plot_histogram data = {'00': 3, '01': 5, '11': 8, '10': 11} plot_histogram(data, number_to_keep=2) -
Melhorou o desempenho da criação e do trabalho com instâncias parametrizadas
QuantumCircuitcom muitas portas que compartilham um número relativamente pequeno de parâmetros. -
O exportador OpenQASM 3 (
qiskit.qasm3) não tentará mais produzir definições para portas não padrão na opçãobasis_gates. -
Corrigido o getter de
OptimizerResult.nitque anteriormente retornava o número de avaliações Jacobianas em vez do número de iterações. -
Foi corrigido um bug na representação de strings de objetos
Resultque fazia com que os atributos fossem especificados incorretamente. -
Foi corrigido um problema com o
transpile()em que, em alguns casos, o fornecimento de uma lista de cadeias de portas de base com o argumento da palavra-chavebasis_gatesou implicitamente por meio de uma entradaTargetpor meio do argumento da palavra-chavetargetnão era interpretado corretamente e resultava em um subconjunto das portas listadas sendo usadas para cada circuito. -
Foi corrigido um problema na passagem do
UnitarySynthesisque resultava em um erro quando umTargetque não tinha nenhuma restrição de qubit nas operações (por exemplo, no caso de um alvo de simulador ideal) era especificado com o argumento da palavra-chavetargetpara o construtor. -
O método
qiskit.result.marginal_counts(), quando passado umResultde um backend de pulso, falharia, pois contém uma matriz de objetosExperimentResult, cada um dos quais tem umQobjExperimentHeader, e essesExperimentHeadersnão têm variáveis de instância creg_sizes. Se oResultviesse de um backend de simulador (por exemplo, Aer), essa variável de instância estaria lá. Corrigimos o sitemarginal_countspara que ele ignore a lógica que precisa de creg_sizes se o campo não estiver presente ou for diferente de None. -
O exportador do OpenQASM 2 (
QuantumCircuit.qasm()) agora definirá corretamente os parâmetros do qubit para operaçõesUnitaryGateque não afetam todos os qubits sobre os quais são definidos. Corrigido #8224. -
Corrigido um problema com a reprodutibilidade da função
transpile()quando executada comoptimization_level1, 2 e 3. Anteriormente, em algumas condições, quando havia vários layouts perfeitos (um layout que não exige nenhuma porta SWAP) disponíveis, o layout selecionado e o circuito de saída podiam variar independentemente de o argumentoseed_transpilerter sido definido.
Aer 0.10.4
Nenhuma mudança
IBM 0.19.2
Correções de bugs
- Na próxima versão do Terra, haverá um candidato à versão marcado antes da versão final. No entanto, a alteração da string da versão do pacote está bloqueada no qiskit-ibmq-provider no momento, porque ele está tentando analisar a versão e está assumindo que não haverá sufixo prelease na string da versão (consulte o número 8200 para obter detalhes). O PR #1135 corrige essa análise de versão para usar o regex do projeto pypa/packaging, que lida com todas as versões do pacote PEP440 e inclui sufixos de pré-lançamento. Isso permitirá que o terra libere uma tag 0.21.0rc1 sem quebrar o qiskit-ibmq-provider.
threading.currentThreadenotifyAllforam descontinuados em Python 3.10 (outubro de 2021) e serão removidos em Python 3.12 (outubro de 2023). O PR nº 1133 os substitui porthreading.current_thread,notify_alladicionado em Python 2.6 (outubro de 2008).