Notas de versão do Qiskit 0.25
0.25.4
Terra 0.17.2
Prelúdio
Esta é uma versão de correção de bugs que corrige vários problemas da versão 0.17.1. Mais importante ainda, essa versão corrige a compatibilidade da classe QuantumInstance quando executada em backends baseados na classe BackendV1 classe abstrata. Isso corrige todos os algoritmos e aplicativos criados em qiskit.algorithms ou qiskit.opflow quando executados em backends mais recentes.
Correções de bugs
- Foi corrigido um problema com a passagem do
BasisTranslatorque, em alguns casos, traduzia portas que já estavam na base de destino. Isso poderia resultar em um tempo de execução mais longo e em resultados menos otimizados. Corrigido #6085 - Foi corrigido um problema no site
SPSAquando o otimizador era inicializado com uma função de retorno de chamada por meio do kwargcallback, o que poderia causar um erro. - Foi corrigido um problema em que o kwarg
qiskit.quantum_info.Statevector.expectation_value()eqiskit.quantum_info.DensityMatrix.expectation_value`methods where the ``qargs`()kwarg eram ignorados se o operador fosse umPauliouSparsePauliOpobjeto operador. Corrigido #6303 - Foi corrigido um problema no método
qiskit.quantum_info.Pauli.evolve()que poderia ter resultado no retorno do Pauli incorreto quando evoluído por umCZGate,CYGate, ou umSwapGateportão. - Foi corrigido um problema no método
qiskit.opflow.SparseVectorStateFn.to_dict_fn(), que anteriormente tinha no máximo uma entrada para o estado totalmente zero devido a um erro de índice. - Foi corrigido um problema no método
qiskit.opflow.SparseVectorStateFn.equals()para que ele retorne corretamenteTrueouFalseem vez de uma comparação de vetor esparso dos elementos individuais. - Corrige um problema no
StatevectoreDensityMatrixmétodos de probabilidadeqiskit.quantum_info.Statevector.probabilities(),qiskit.quantum_info.Statevector.probabilities_dict(),qiskit.quantum_info.DensityMatrix.probabilities(),qiskit.quantum_info.DensityMatrix.probabilities_dict()em que as probabilidades retornadas podem ter ordenação incorreta para determinados valores doqargskwarg. Corrigido #6320 - Foi corrigido um problema em que a classe
TaperedPauliSumOpnão suportava a multiplicação com o objetoParameterExpressione também não tinha um métodoassign_parameters()necessário para trabalhar com objetosParameterExpressionobjetos. Corrigido #6127 - Corrigida a compatibilidade da classe
QuantumInstancequando executada em backends baseados na classe abstrataBackendV1classe abstrata. Corrigido #6280
Aer 0.8.2
Nenhuma mudança
Ignis 0.6.0
Nenhuma mudança
Aqua 0.9.1
Nenhuma mudança
IBM 0.12.3
Nenhuma mudança
0.25.3
Terra 0.17.1
Nenhuma mudança
Aer 0.8.2
Problemas Conhecidos
- Os sites
SaveExpectationValueeSaveExpectationValueVarianceforam desativados para o método extended_stabilizer dos sitesQasmSimulatoreAerSimulatordevido ao fato de retornarem o valor incorreto para determinados componentes do operador Pauli. Consulte #1227 <https://github.com/Qiskit/qiskit-aer/issues/1227> para obter mais informações e exemplos.
Correções de bugs
- Corrige o problema de desempenho com a forma como o atributo de configuração
basis_gatesfoi definido. Anteriormente, havia efeitos colaterais não intencionais na classe de back-end que podiam fazer com que o tempo de execução de simulações repetidas aumentasse gradativamente. Consulte #1229 <https://github.com/Qiskit/qiskit-aer/issues/1229> para obter mais informações e exemplos. - Corrige um erro na instrução do simulador
"multiplexer"em que a ordem dos qubits de destino e de controle era invertida em relação à ordem da instrução Qiskit. - Corrige um bug introduzido em 0.8.0, no qual as simulações de GPU alocavam memória de host desnecessária, além da memória da GPU.
- Corrige um erro no método do simulador
stabilizerdos sitesQasmSimulatoreAerSimulator, no qual o valor de expectativa para os sitessave_expectation_valueesnapshot_expectation_valuepoderia ter o sinal errado para determinados Pauli's doY.
Ignis 0.6.0
Nenhuma mudança
Aqua 0.9.1
Nenhuma mudança
IBM 0.12.3
Nenhuma mudança
0.25.2
Terra 0.17.1
Nenhuma mudança
Aer 0.8.1
Nenhuma mudança
Ignis 0.6.0
Nenhuma mudança
Aqua 0.9.1
Nenhuma mudança
IBM 0.12.3
Outras observações
- O atributo
qiskit.providers.ibmq.experiment.analysis_result.AnalysisResultfitagora é opcional.
0.25.1
Terra 0.17.1
Prelúdio
Esta é uma versão de correção de bugs que corrige vários problemas da versão 0.17.0. O mais importante é que essa versão corrige o pacote sdist construído incorretamente para a versão 0.17.0, que não era realmente compilável e estava bloqueando a instalação em plataformas sem binários pré-compilados disponíveis.
Correções de bugs
-
Foi corrigido um problema em que o atributo
global_phasenão era preservado no objeto de saídaQuantumCircuitquando o métodoqiskit.circuit.QuantumCircuit.reverse_bits()era chamado. Por exemplo:import math from qiskit import QuantumCircuit qc = QuantumCircuit(3, 2, global_phase=math.pi) qc.h(0) qc.s(1) qc.cx(0, 1) qc.measure(0, 1) qc.x(0) qc.y(1) reversed = qc.reverse_bits() print(reversed.global_phase)agora imprimirá corretamente .
-
Foi corrigido um problema em que a passagem do transpilador
Unrollernão preservava a fase global no caso de instruções aninhadas com uma regra em sua definição. Corrigido #6134 -
Foi corrigido um problema em que o atributo
parameterde um objetoControlledGatecriado a partir de um objetoUnitaryGatenão estava sendo definido como a matriz unitária do objetoUnitaryGate. Anteriormente,control()estava criando uma matrizControlledGatecom o atributoparameterdefinido como a versão controlada da matrizUnitaryGate. Isso levaria a uma modificação doparameterdo objeto baseUnitaryGatee as chamadas subsequentes parainverse()estava criando o inverso de umUnitaryGatecom controle duplo. Corrigido #5750 -
Correção de um problema com os gerenciadores de passes predefinidos
level_0_pass_managerelevel_1_pass_manager(que correspondem aoptimization_level0 e 1 paratranspile()) onde, em alguns casos, eles produziam circuitos que não estavam na base solicitada. -
Correção de um bug em que o uso do
SPSAcom calibração automática da taxa de aprendizado e perturbação (ou sejalearning_rateeperturbationsãoNoneno inicializador), armazena a calibração para todas as otimizações futuras. Em vez disso, a calibração deve ser feita para cada nova função objetiva.
Aer 0.8.1
Correções de bugs
- Foi corrigido um problema com o uso do método
matrix_product_statedos simuladoresAerSimulatoreQasmSimulatorao executar uma simulação com ruído e erros de Kraus. Anteriormente, o método de simulação do estado do produto da matriz não propagava as alterações para os qubits vizinhos após a aplicação da matriz Kraus. Isso foi corrigido para que o resultado da simulação esteja correto. Corrigido #1184 e #1205 - Foi corrigido um problema em que a instrução
qiskit.extensions.Initializedesativava a otimização da amostragem de medição para os métodos de simulaçãostatevectorematrix_product_statedos simuladoresAerSimulatoreQasmSimulator, mesmo quando era a primeira instrução de circuito ou aplicada a todos os qubits e, portanto, determinística. Corrigido #1210 - Corrigir um problema com as instruções
SaveStatevectoreSnapshotStatevectorquando usadas com o método de simulaçãoextended_stabilizerdos simuladoresAerSimulatoreQasmSimulator, em que ele retornava um vetor de estado não normalizado. Corrigido #1196 - O método de simulação
matrix_product_stateagora tem suporte para a instrução de estado definido que não existia anteriormente,qiskit.providers.aer.library.SetMatrixProductState, que permite definir o estado de uma simulação em um circuito.
Ignis 0.6.0
Nenhuma mudança
Aqua 0.9.1
IBM 0.12.2
Nenhuma mudança
0.25.0
Esta versão descontinua oficialmente o projeto Qiskit Aqua. Dessa forma, em uma versão futura, o pacote qiskit-aqua será removido do metapacote do Qiskit, o que significa que, nessa versão futura, o pip install qiskit não incluirá mais o qiskit-aqua. Os módulos de aplicativos que são fornecidos pelo qiskit-aqua foram divididos em vários novos pacotes: qiskit-optimization, qiskit-nature, qiskit-machine-learning, e qiskit-finance. Esses pacotes podem ser instalados sozinhos (por meio do comando padrão pip install, por exemplo, pip install qiskit-nature) ou com o restante do metapacote do Qiskit como extras opcionais (por exemplo pip install 'qiskit[finance,optimization]' ou pip install 'qiskit[all]' Os algoritmos principais e o fluxo do operador agora existem como parte do qiskit-terra em qiskit.algorithms e qiskit.opflow. Dependendo do seu uso atual do Aqua, você deve usar os pacotes de aplicativos ou os novos módulos no Qiskit Terra. Para obter mais detalhes sobre como migrar do Qiskit Aqua, você pode consultar o guia de migração.
Terra 0.17.0
Prelúdio
O Qiskit Terra 0.17.0 inclui muitos recursos novos e correções de bugs. O principal recurso novo dessa versão é a introdução das funções qiskit.algorithms e qiskit.opflow que foram migrados e adaptados do projeto qiskit.aqua .
Novos Recurso
-
A função
qiskit.pulse.call()agora pode receber um objetoParameterjuntamente com uma sub-rotina parametrizada. Isso permite atribuir valores diferentes aosParameterobjetos para cada chamada de subrotina.Por exemplo,
from qiskit.circuit import Parameter from qiskit import pulse amp = Parameter('amp') with pulse.build() as subroutine: pulse.play(pulse.Gaussian(160, amp, 40), DriveChannel(0)) with pulse.build() as main_prog: pulse.call(subroutine, amp=0.1) pulse.call(subroutine, amp=0.3) -
O
qiskit.providers.models.QasmBackendConfigurationtem um novo campoprocessor_typeque pode ser usado opcionalmente para fornecer informações sobre o processador de um backend no formato:{"family": <str>, "revision": <str>, segment: <str>}. Por exemplo:{"family": "Canary", "revision": "1.0", segment: "A"} -
As classes
qiskit.pulse.Scheduleqiskit.pulse.Instruction, eqiskit.pulse.Channelagora têm uma propriedadeparameterque retornará todos osParameterusados no objeto e um métodois_parameterized()que retornaráTruese algum parâmetro for usado no objeto.Por exemplo:
from qiskit.circuit import Parameter from qiskit import pulse shift = Parameter('alpha') schedule = pulse.Schedule() schedule += pulse.SetFrequency(shift, pulse.DriveChannel(0)) assert schedule.is_parameterized() == True print(schedule.parameters) -
Adicionado um
PiecewiseChebyshevaoqiskit.circuit.librarypara implementar uma aproximação Chebyshev por partes de uma função de entrada. Para uma determinada função e grau , essa classe implementa uma aproximação de Chebyshev polinomial por partes em qubits para nos intervalos fornecidos. Todos os polinômios na aproximação são de grau .Por exemplo:
import numpy as np from qiskit import QuantumCircuit from qiskit.circuit.library.arithmetic.piecewise_chebyshev import PiecewiseChebyshev f_x, degree, breakpoints, num_state_qubits = lambda x: np.arcsin(1 / x), 2, [2, 4], 2 pw_approximation = PiecewiseChebyshev(f_x, degree, breakpoints, num_state_qubits) pw_approximation._build() qc = QuantumCircuit(pw_approximation.num_qubits) qc.h(list(range(num_state_qubits))) qc.append(pw_approximation.to_instruction(), qc.qubits) qc.draw(output='mpl') -
A classe
BackendPropertiesagora tem um métodoreadout_length()que retorna o comprimento de leitura [sec] do qubit fornecido. -
Uma nova classe,
ScheduleBlockfoi adicionada ao móduloqiskit.pulsemódulo. Essa classe fornece uma nova representação de um programa de pulso. Essa representação é mais adequada para a sintaxe do construtor de pulsos e baseia-se na ordenação relativa de instruções.Essa representação usa
alignment_contextem vez de especificar o horário de iníciot0para cada instrução. A hora de início da instrução é alocada implicitamente com a transformação especificada e a posição relativa das instruções.O
ScheduleBlockpermite o agendamento de instruções preguiçosas, o que significa que podemos atribuir parâmetros arbitrários à duração das instruções.Por exemplo:
from qiskit.pulse import ScheduleBlock, DriveChannel, Gaussian from qiskit.pulse.instructions import Play, Call from qiskit.pulse.transforms import AlignRight from qiskit.circuit import Parameter dur = Parameter('rabi_duration') block = ScheduleBlock(alignment_context=AlignRight()) block += Play(Gaussian(dur, 0.1, dur/4), DriveChannel(0)) block += Call(measure_sched) # subroutine defined elsewhereesse código define um experimento de varredura da duração de um pulso gaussiano seguido de uma medição
measure_sched, ou seja, um experimento Rabi. Você pode reutilizar o objetoblockpara cada duração digitalizada atribuindo um valor de duração de destino. -
Adicionada uma nova função
array_to_latex()ao móduloqiskit.visualizationque pode ser usada para representar e visualizar vetores e matrizes com LaTeX.from qiskit.visualization import array_to_latex from numpy import sqrt, exp, pi mat = [[0, exp(pi*.75j)], [1/sqrt(8), 0.875]] array_to_latex(mat) -
O
StatevectoreDensityMatrixagora têm métodosdraw()que permitem que os objetos sejam desenhados como matrizes de texto, objetos IPython Latex, fonte Latex, esferas Q, esferas Bloch e gráficos Hinton. Por padrão, o tipo de saída é a saída equivalente de__repr__, mas esse padrão pode ser alterado em um arquivo de configuração do usuário definindo a opçãostate_drawer. Por exemplo:from qiskit.quantum_info import DensityMatrix dm = DensityMatrix.from_label('r0') dm.draw('latex')from qiskit.quantum_info import Statevector sv = Statevector.from_label('+r') sv.draw('qsphere')Além disso, o método
draw()agora é usado para a exibição ipython dessas classes, portanto, se você alterar o tipo de saída padrão em um arquivo de configuração do usuário, quando umStatevectorou um objetoDensityMatrixforem exibidos em um notebook jupyter, esse tipo de saída será usado para o objeto. -
Pulso
qiskit.pulse.Instructionobjetos e objetos de pulso paramétrico (por exemploGaussianagora suportam o uso deParametereParameterExpressionpara o parâmetroduration. Por exemplo:from qiskit.circuit import Parameter from qiskit.pulse import Gaussian dur = Parameter('x_pulse_duration') double_dur = dur * 2 rx_pulse = Gaussian(dur, 0.1, dur/4) double_rx_pulse = Gaussian(double_dir, 0.1, dur/4)Observe que, embora possamos criar uma instrução com um parâmetro
duration, adicionar uma instrução com um parâmetro não vinculadodurationa uma programação é compatível apenas com a representação recém-introduzidaScheduleBlock. Consulte a seção de notas de versão de problemas conhecidos para obter mais detalhes. -
O
run()para o métodoQasmSimulatorPy,StatevectorSimulatorPy, eUnitarySimulatorPyagora recebe umQuantumCircuit(ou uma lista de objetosQuantumCircuitobjetos) como entrada. O objetoQasmQobjainda é suportado por enquanto, mas será descontinuado em uma versão futura.Para obter um exemplo de como usar isso, consulte:
from qiskit import transpile, QuantumCircuit from qiskit.providers.basicaer import BasicAer backend = BasicAer.get_backend('qasm_simulator') circuit = QuantumCircuit(2) circuit.h(0) circuit.cx(0, 1) circuit.measure_all() tqc = transpile(circuit, backend) result = backend.run(tqc, shots=4096).result() -
A passagem do
CommutativeCancellationtem um novo kwarg opcional no construtorbasis_gates, que recebe uma lista dos nomes das portas de base para o backend de destino. Quando especificado, o passe usará apenas portões nobasis_gateskwarg. Anteriormente, o passe substituía automaticamente os portões consecutivos que se deslocam comZGatecom oU1Gateincondicionalmente. O kwargbasis_gatespermite que você especifique quais portas de rotação z estão presentes na base de destino para evitar isso. -
Os construtores da classe
Bite das subclasses,Qubit,Clbit, eAncillaQubitforam atualizados de forma que seus dois parâmetros,registereindex, agora são opcionais. Isso permite a criação de objetos de bits que são independentes de um registro. -
Uma nova classe,
BooleanExpressionfoi adicionada ao móduloqiskit.circuit.classicalfunctionmódulo. Essa classe permite a criação de um oráculo a partir de uma expressão booleana Python. Por exemplo:from qiskit.circuit import BooleanExpression, QuantumCircuit expression = BooleanExpression('~x & (y | z)') circuit = QuantumCircuit(4) circuit.append(expression, [0, 1, 2, 3]) circuit.draw('mpl')circuit.decompose().draw('mpl')O
BooleanExpressiontambém inclui um método,from_dimacs_file()que permite carregar fórmulas descritas no formato DIMACS-CNF. Por exemplo:from qiskit.circuit import BooleanExpression, QuantumCircuit boolean_exp = BooleanExpression.from_dimacs_file("simple_v3_c2.cnf") circuit = QuantumCircuit(boolean_exp.num_qubits) circuit.append(boolean_exp, range(boolean_exp.num_qubits)) circuit.draw('text')┌───────────────────┐ q_0: ┤0 ├ │ │ q_1: ┤1 ├ │ SIMPLE_V3_C2.CNF │ q_2: ┤2 ├ │ │ q_3: ┤3 ├ └───────────────────┘circuit.decompose().draw('text')q_0: ──o────o──────────── │ │ q_1: ──■────o────■─────── │ │ │ q_2: ──■────┼────o────■── ┌─┴─┐┌─┴─┐┌─┴─┐┌─┴─┐ q_3: ┤ X ├┤ X ├┤ X ├┤ X ├ └───┘└───┘└───┘└───┘ -
Adicionada uma nova classe,
PhaseOraclefoi adicionada ao móduloqiskit.circuit.librarymódulo. Essa classe permite a construção de circuitos de oráculo de fase a partir de Python expressões booleanas.from qiskit.circuit.library.phase_oracle import PhaseOracle oracle = PhaseOracle('x1 & x2 & (not x3)') oracle.draw('mpl')Esses oráculos de fase podem ser usados como parte de um algoritmo maior, por exemplo, com
qiskit.algorithms.AmplificationProblem:from qiskit.algorithms import AmplificationProblem, Grover from qiskit import BasicAer backend = BasicAer.get_backend('qasm_simulator') problem = AmplificationProblem(oracle, is_good_state=oracle.evaluate_bitstring) grover = Grover(quantum_instance=backend) result = grover.amplify(problem) result.top_measurementA classe
PhaseOracletambém inclui um métodofrom_dimacs_file()que permite a construção de um oráculo de fase a partir de um arquivo que descreve uma fórmula no formato DIMACS-CNF.from qiskit.circuit.library.phase_oracle import PhaseOracle oracle = PhaseOracle.from_dimacs_file("simple_v3_c2.cnf") oracle.draw('text')state_0: ─o───────o────────────── │ ┌───┐ │ ┌───┐ state_1: ─■─┤ X ├─■─┤ X ├─■────── │ └───┘ └───┘ │ ┌───┐ state_2: ─■───────────────o─┤ Z ├ └───┘ -
Todas as passagens do transpilador (ou seja, quaisquer instâncias de
BasePass) agora podem ser chamadas diretamente. A chamada de uma passagem fornece uma interface conveniente para executar a passagem em um objetoQuantumCircuitobjeto.Por exemplo, a execução de uma única passagem de transformação, como
BasisTranslatorpode ser feita com:from qiskit import QuantumCircuit from qiskit.transpiler.passes import BasisTranslator from qiskit.circuit.equivalence_library import SessionEquivalenceLibrary as sel circuit = QuantumCircuit(1) circuit.h(0) pass_instance = BasisTranslator(sel, ['rx', 'rz', 'cx']) result = pass_instance(circuit) result.draw(output='mpl')Ao executar uma passagem de análise, um conjunto de propriedades (como
dictouPropertySet) precisa ser adicionado como parâmetro e pode ser modificado "no local". Por exemplo:from qiskit import QuantumCircuit from qiskit.transpiler.passes import Depth circuit = QuantumCircuit(1) circuit.h(0) property_set = {} pass_instance = Depth() pass_instance(circuit, property_set) print(property_set) -
A classe
QasmQobjConfigagora tem um kwarg opcional parameas_levelemeas_return. Esses campos podem ser usados para permitir a geração deQasmQobjcargas de trabalho que suportammeas_level=1(dados kernelizados) para trabalhos de circuito (anteriormente, isso era exposto apenas paraPulseQobjobjetos). A funçãoassemble()foi atualizada para definir esse campo para os objetosQasmQobjobjetos que ela gera. -
Um novo método
tensor()foi adicionado à classeQuantumCircuitclasse. Esse método permite tensionar outro circuito com um circuito existente. Esse método funciona de forma análoga aoqiskit.quantum_info.Operator.tensor()e é consistente com a convenção little-endian do Qiskit.Por exemplo:
from qiskit import QuantumCircuit top = QuantumCircuit(1) top.x(0); bottom = QuantumCircuit(2) bottom.cry(0.2, 0, 1); bottom.tensor(top).draw(output='mpl') -
A classe
qiskit.circuit.QuantumCircuitagora suporta metadados arbitrários de forma livre com o atributometadataatributo. Um usuário (ou programa criado com base noQuantumCircuit) pode anexar metadados a um circuito para uso no rastreamento do circuito. Por exemplo:from qiskit.circuit import QuantumCircuit qc = QuantumCircuit(2, user_metadata_field_1='my_metadata', user_metadata_field_2='my_other_value')ou:
from qiskit.circuit import QuantumCircuit qc = QuantumCircuit(2) qc.metadata = {'user_metadata_field_1': 'my_metadata', 'user_metadata_field_2': 'my_other_value'}Esses metadados não serão usados para influenciar a execução do circuito, mas apenas para rastrear o circuito durante a vida útil do objeto. O atributo
metadatapersistirá entre quaisquer transformações de circuito, incluindotranspile()eassemble(). A expectativa é que os provedores associem os metadados ao resultado que retornam, para que os usuários possam filtrar os resultados com base nos metadados do circuito, da mesma forma que podem fazer atualmente comQuantumCircuit.name. -
Adicionar uma nova classe de operador
CNOTDihedralfoi adicionada ao móduloqiskit.quantum_infomódulo. Essa classe é usada para representar o grupo CNOT-Dihedral, que é gerado pelas portas quânticasCXGate,TGate, eXGate. -
Adiciona um operador binário
&(__and__) às subclassesBaseOperator(por exemploqiskit.quantum_info.Operator) no móduloqiskit.quantum_infomódulo. Isso é uma forma abreviada de chamar o método classescompose()(ou seja,A & B == A.compose(B)).Por exemplo:
import qiskit.quantum_info as qi qi.Pauli('X') & qi.Pauli('Y') -
Adiciona um operador binário
&(__and__) aqiskit.quantum_info.Statevectoreqiskit.quantum_info.DensityMatrixclasses. Isso é uma forma abreviada de chamar o método classesevolve()(ou seja,psi & U == psi.evolve(U)).Por exemplo:
import qiskit.quantum_info as qi qi.Statevector.from_label('0') & qi.Pauli('X') -
Uma nova porta de 2 qubits,
ECRGatea ressonância cruzada de eco (ECR), foi adicionada ao móduloqiskit.circuit.libraryjuntamente com um método correspondente,ecr()para aQuantumCircuitclasse. A porta ECR é composta por dois pulsos com umXGateentre eles para o eco. Essa porta é localmente equivalente a umCXGate(pode ser convertida em um CNOT com pré ou pós-rotação local). É a porta nativa no hardware atual do IBM e a compilação para ele permite que as pré/pós-rotações sejam mescladas com o restante do circuito. -
Um novo kwarg
approximation_degreefoi adicionado à funçãotranspile()para permitir a compilação aproximada. Os valores válidos variam de 0 a 1, e um valor mais alto significa menos aproximação. Esse é um mostrador heurístico para experimentar aproximações de circuitos. A interpretação concreta desse número é deixada para cada passe, que pode usá-lo para realizar alguma versão aproximada do passe. Exemplos específicos incluem oUnitarySynthesispass ou os tradutores or para conjuntos de portas discretas. Se uma passagem não for compatível com essa opção, ela implica a transformação exata. -
Duas novas passagens de transpiladores,
GateDirectioneqiskit.transpiler.passes.CheckGateDirectionforam adicionadas ao móduloqiskit.transpiler.passesmódulo. Esses novos passes têm a intenção de ser substitutos mais gerais paraCXDirectioneCheckCXDirection(que agora estão obsoletos, consulte as notas de obsoletos para obter mais detalhes) que executam a mesma função, mas funcionam com outras portas além de apenasCXGate. -
Ao executar no Windows, a execução paralela com a função
parallel_map()agora pode ser ativada (ela ainda está desativada por padrão). Para fazer isso, você pode definirparallel = Trueem um arquivo de configuração do usuário ou definir a variável de ambienteQISKIT_PARALLELcomoTRUE(isso também afetarátranspile()eassemble()que usamparallel_map()internamente). É importante observar que, ao ativar o paralelismo no Windows, há limitações quanto à forma como o Python inicia processos para o Windows. Consulte a seção Problemas conhecidos abaixo para obter mais detalhes sobre as limitações da execução paralela no Windows. -
Uma nova função,
hellinger_distance()para calcular a distância de Hellinger entre duas distribuições de contagem foi adicionada ao móduloqiskit.quantum_infomódulo. -
A função
decompose_clifford()no móduloqiskit.quantum_info(que é usada internamente pelo métodoqiskit.quantum_info.Clifford.to_circuit()) tem um novo kwargmethodque permite selecionar o método de síntese usado, definindo-o como'AG'ou'greedy'. Por padrão, para mais de três qubits, ele é definido como'greedy', que usa uma rotina de compilação gulosa não otimizada para a síntese de elementos de Clifford, por Bravyi et al. al, que normalmente produz um melhor custo de CX em comparação com o método Aaronson-Gottesman usado anteriormente (para mais de dois qubits). Você pode usar o kwargmethodpara reverter para o método Aaronson-Gottesman padrão anterior, definindomethod='AG'. -
A classe
Initializeno móduloqiskit.extensionsagora pode ser construída usando um número inteiro. Os bits '1' do inteiro inserirão umResete umXGateno circuito do qubit correspondente. Isso será feito usando a convenção padrão little-endian do qiskit, ou seja, o bit mais à direita do inteiro definirá o qubit 0. Por exemplo, a configuração do parâmetro emInitializeigual a5definirá os qubits 0 e 2 com o valor 1.from qiskit.extensions import Initialize initialize = Initialize(13) initialize.definition.draw('mpl') -
A classe
Initializeno móduloqiskit.extensionsagora suporta a construção direta de um rótulo Pauli (análogo ao métodoqiskit.quantum_info.Statevector.from_label()método). O rótulo de Pauli se refere aos estados básicos dos estados próprios de Pauli Z, X, Y. Esses rótulos usam a notação little-endian padrão do Qiskit; por exemplo, um rótulo de'01'inicializaria o qubit 0 em e o qubit 1 em .from qiskit.extensions import Initialize initialize = Initialize("10+-lr") initialize.definition.draw('mpl') -
O kwarg,
template_list, para o construtor da passagemqiskit.transpiler.passes.TemplateOptimizationagora suporta o recebimento de uma lista de ambosQuantumCircuiteDAGDependencyobjetos. Anteriormente, apenasQuantumCircuiteram aceitos (que eram internamente convertidos em objetosDAGDependency) na lista de entrada. -
Um novo transpiler pass,
qiskit.transpiler.passes.RZXCalibrationBuildercapaz de gerar calibrações e adicioná-las a um circuito quântico, foi introduzida. Essa passagem usa objetos calibradosCXGatee cria as calibrações para objetosqiskit.circuit.library.RZXGateobjetos com um ângulo de rotação arbitrário. As programações são criadas esticando e comprimindo os pulsosGaussianSquaredas portas de ressonância cruzada com eco. -
Novos circuitos de modelo para usar
qiskit.circuit.library.RZXGatesão adicionados ao móduloqiskit.circuit.library(por exemplorzx_yz). Isso permite o emparelhamento doTemplateOptimizationcom aqiskit.transpiler.passes.RZXCalibrationBuilderpara encontrar e substituir automaticamente sequências de portas, comoCNOT - P(theta) - CNOT, por circuitos mais eficientes baseados emqiskit.circuit.library.RZXGatecom uma calibração. -
O tipo de saída do matplotlib para o
circuit_drawer()e o métododraw()para a classeQuantumCircuitagora suporta arquivos de configuração para definir o estilo de visualização. Nas versões anteriores, havia uma funcionalidade básica que permitia que os usuários passassem um kwargstyleque recebia umdictpara personalizar as cores e outros recursos de exibição da gavetampl. Isso agora foi expandido para que esses dicionários possam ser carregados diretamente de arquivos JSON sem a necessidade de passar um dicionário. Isso permite que os usuários criem novos arquivos de estilo e usem esse estilo para visualizações, passando o nome do arquivo de estilo como uma string para o kwargstyle.Para aproveitar esse recurso, é necessário definir a opção
circuit_mpl_style_pathem um arquivo de configuração do usuário. Essa opção deve ser definida como o caminho que você deseja que o qiskit procure por arquivos JSON de estilo. Se estiver especificando várias entradas de caminho, elas devem ser separadas por:. Por exemplo, a definição decircuit_mpl_style_path = ~/.qiskit:~/user_stylesem um arquivo de configuração do usuário procurará arquivos JSON em~/.qiskite~/user_styles. -
Um novo kwarg,
format_marginal, foi adicionado à funçãomarginal_counts()que, quando definido comoTrue, formata a saída de contagens de acordo com ocregsno circuito e os índices ausentes são representados com um_. Por exemplo:from qiskit import QuantumCircuit, execute, BasicAer, result from qiskit.result.utils import marginal_counts qc = QuantumCircuit(5, 5) qc.x(0) qc.measure(0, 0) result = execute(qc, BasicAer.get_backend('qasm_simulator')).result() print(marginal_counts(result.get_counts(), [0, 2, 4], format_marginal=True)) -
Melhorou o desempenho de
qiskit.quantum_info.Statevector.expectation_value()eqiskit.quantum_info.DensityMatrix.expectation_value()quando o operador de argumento é um operadorPauliouSparsePauliOpoperador. -
O arquivo de configuração do usuário tem duas novas opções de configuração,
num_processeseparallel, que são usadas para controlar o comportamento padrão doparallel_map(). A opçãoparallelé um booleano usado para determinar separallel_map()será executado em vários processos ou não. Se for definido comoFalse, as chamadas paraparallel_map()serão executadas em série, enquanto que se for definido comoTrue, a execução paralela será ativada. A opçãonum_processesrecebe um número inteiro que define quantas CPUs devem ser usadas na execução em paralelo. Por padrão, ele usará o número de núcleos de CPU em um sistema. -
Há duas novas variáveis de ambiente,
QISKIT_PARALLELeQISKIT_NUM_PROCS, que podem ser usadas para controlar o comportamento padrão doparallel_map(). A opçãoQISKIT_PARALLELpode ser definida comoTRUE(qualquer capitalização) para definir o padrão para execução em vários processos quandoparallel_map()for chamado. Se for definido com qualquer outro valor, oparallel_map()será executado em série.QISKIT_NUM_PROCSrecebe um número inteiro (por exemplo,QISKIT_NUM_PROCS=5) que será usado como o número padrão de processos a serem executados. Ambas terão precedência sobre a opção equivalente definida no arquivo de configuração do usuário. -
Um novo método,
gradient()foi adicionado à classeParameterExpressionclasse. Esse método é usado para avaliar o gradiente de um objetoParameterExpressionobjeto. -
O método
__eq__(ou seja, o que é chamado quando o operador==é usado) para o operadorParameterExpressionagora permite a comparação com um valor numérico. Anteriormente, só era possível comparar duas instâncias deParameterExpressioncom==. Por exemplo:from qiskit.circuit import Parameter x = Parameter("x") y = x + 2 y = y.assign(x, -1) assert y == 1 -
A classe
PauliFeatureMapno móduloqiskit.circuit.libraryagora suporta o ajuste do fator rotacional, , por meio da configuração usando o kwargalphano construtor ou definindo o atributoalphaapós a criação. Anteriormente, esse valor era fixado em2.0. O ajuste desse atributo permite um melhor controle dos limites de decisão e oferece flexibilidade adicional no manuseio dos recursos de entrada sem a necessidade de dimensioná-los explicitamente no conjunto de dados. -
Uma nova
Gateclasse,PauliGatefoi adicionada ao móduloqiskit.circuit.librarye o método correspondente,pauli()foi adicionado à classeQuantumCircuitclasse. Essa nova classe de porta permite aplicar várias portas pauli individuais a diferentes qubits ao mesmo tempo. Isso é útil principalmente para simuladores que podem usar essa nova porta para implementar com mais eficiência várias portas Pauli simultâneas. -
Aprimore o
qiskit.quantum_info.Paulioperador. Essa classe agora representa um elemento do grupo Pauli de N-qubit completo, incluindo coeficientes complexos. Ele agora é compatível com os métodos da API do operador, incluindocompose(),dot(),tensor()etc., em que compose e dot são definidos com relação ao grupo Pauli completo.Essa classe também permite a conversão de e para a representação de string de Pauli por conveniência.
Por exemplo:
from qiskit.quantum_info import Pauli P1 = Pauli('XYZ') P2 = Pauli('YZX') P1.dot(P2)Os Pauli's também podem ser anexados diretamente aos
QuantumCircuitobjetosfrom qiskit import QuantumCircuit from qiskit.quantum_info import Pauli circ = QuantumCircuit(3) circ.append(Pauli('XYZ'), [0, 1, 2]) circ.draw(output='mpl')Métodos adicionais permitem calcular quando dois Pauli's comutam (usando o método
commutes()) ou anticomutação (usando o métodoanticommutes()), e calcular o Pauli resultante da conjugação de Clifford usando o métodoevolve()método.Consulte a documentação da API da classe
Paulipara obter informações adicionais. -
Uma nova função,
random_pauli()para gerar um elemento aleatório do grupo N-qubit Pauli foi adicionada ao móduloqiskit.quantum_infomódulo. -
Uma nova classe,
PiecewisePolynomialPauliRotationsfoi adicionada ao móduloqiskit.circuit.librarymódulo. Esse elemento da biblioteca de circuitos é usado para mapear uma função polinomial por partes, , que é definida por meio de pontos de interrupção e coeficientes, em amplitudes de qubit. Os pontos de interrupção são um subconjunto de , em que é o número de qubits de estado. Os coeficientes correspondentes , onde é o grau mais alto entre todos os polinômios. Então, é definido como:
onde assumimos implicitamente . E o mapeamento aplicado às amplitudes é dado por
Esse mapeamento é baseado em rotações Y de Pauli controladas e construído usando o PolynomialPauliRotations.
-
Um novo módulo
qiskit.algorithmsfoi introduzido. Esse módulo contém funcionalidade equivalente ao que foi fornecido anteriormente pelo móduloqiskit.aqua.algorithms(que agora está obsoleto) e fornece os blocos de construção para a construção de algoritmos quânticos. Para obter detalhes sobre a migração deqiskit-aquapara esse novo módulo, consulte o guia de migração. -
Um novo módulo
qiskit.opflowfoi introduzido. Esse módulo contém funcionalidade equivalente ao que foi fornecido anteriormente pelo móduloqiskit.aqua.operators(que agora está obsoleto) e fornece os operadores e as funções de estado que são usados para criar algoritmos quânticos. Para obter detalhes sobre a migração deqiskit-aquapara esse novo módulo, consulte o guia de migração. -
Esta é a primeira versão que inclui rodas binárias pré-compiladas para os sistemas Linux aarch64. Se você estiver executando um sistema manylinux2014 compatível com aarch64 Linux, agora há rodas pré-compiladas disponíveis em PyPI,. Não é mais necessário compilar a partir do código-fonte para instalar o qiskit-terra.
-
A função
qiskit.quantum_info.process_fidelity()agora pode ser usada com um canal de destino não unitário. Nesse caso, o valor retornado é equivalente ao valorqiskit.quantum_info.state_fidelity()das matrizesqiskit.quantum_info.Choinormalizadas para os canais.Observe que os
qiskit.quantum_info.average_gate_fidelity()eqiskit.quantum_info.gate_error()ainda exigem que o canal de destino seja unitário e gerarão uma exceção se não for. -
Foi adicionada uma nova função de criação de pulsos,
qiskit.pulse.macro(). Isso permite que as funções normais do Python sejam decoradas como macros. Isso permite que as funções do construtor de pulsos sejam usadas dentro da função decorada. A macro do construtor pode então ser chamada em um contexto de construção de pulso, permitindo a reutilização do código.Por exemplo:
from qiskit import pulse @pulse.macro def measure(qubit: int): pulse.play(pulse.GaussianSquare(16384, 256, 15872), pulse.MeasureChannel(qubit)) mem_slot = pulse.MemorySlot(0) pulse.acquire(16384, pulse.AcquireChannel(0), mem_slot) return mem_slot with pulse.build(backend=backend) as sched: mem_slot = measure(0) print(f"Qubit measured into {mem_slot}") sched.draw() -
Uma nova classe,
PauliTwoDesignfoi adicionada aoqiskit.circuit.libraryque implementa uma forma particular de um circuito de 2 projetos de https://arxiv.org/pdf/1803.11173.pdf Por exemplo, esse circuito pode se parecer com:from qiskit.circuit.library import PauliTwoDesign circuit = PauliTwoDesign(4, reps=2, seed=5, insert_barriers=True) circuit.decompose().draw(output='mpl') -
Uma nova gaveta de pulsos
qiskit.visualization.pulse_v2.draw()(cujo pseudônimo éqiskit.visualization.pulse_drawer_v2) já está disponível. Essa nova gaveta de pulso oferece suporte a vários recursos novos que não estão presentes na gaveta de pulso original (pulse_drawer()).- Truncamento de instruções de pulso longo.
- Visualização de pulsos paramétricos.
- Novas folhas de estilo
IQXStandard,IQXSimple,IQXDebugging. - Visualização das informações do sistema (frequência do canal, etc.) especificando
qiskit.providers.Backendobjetos para visualização. - Especificação de objetos
axispara plotagem, a fim de permitir uma extensão adicional das plotagens geradas, ou seja, para manipulações de publicação.
As novas folhas de estilo podem usar funções de retorno de chamada que modificam dinamicamente a aparência da imagem de saída, por exemplo, remontando uma coleção de canais, mostrando detalhes de instruções, atualizando a aparência de envelopes de pulso etc Você pode criar funções de retorno de chamada personalizadas e alimentá-las em uma instância de folha de estilo para modificar a aparência da figura sem modificar o código do drawer. Consulte a documentação do módulo de gaveta de pulso para obter detalhes.
Observe que o salvamento de arquivos agora é delegado a Matplotlib. Para salvar arquivos de imagem, você precisa chamar o método
savefigcom o objetoFigureretornado. -
Adiciona um método
reverse_qargs()ao métodoqiskit.quantum_info.Statevectoreqiskit.quantum_info.DensityMatrixclasses. Esse método inverte a ordem dos subsistemas nos estados e é equivalente ao métodoqiskit.circuit.QuantumCircuit.reverse_bits()para estados de N-qubit. Por exemplo:from qiskit.circuit.library import QFT from qiskit.quantum_info import Statevector circ = QFT(3) state1 = Statevector.from_instruction(circ) state2 = Statevector.from_instruction(circ.reverse_bits()) state1.reverse_qargs() == state2 -
Adiciona um método
reverse_qargs()à classeqiskit.quantum_info.Operatorclasse. Esse método inverte a ordem dos subsistemas no operador e é equivalente ao métodoqiskit.circuit.QuantumCircuit.reverse_bits()para operadores de N-qubit. Por exemplo:from qiskit.circuit.library import QFT from qiskit.quantum_info import Operator circ = QFT(3) op1 = Operator(circ) op2 = Operator(circ.reverse_bits()) op1.reverse_qargs() == op2 -
O método de saída
latexpara a funçãoqiskit.visualization.circuit_drawer()e o métododraw()agora usarão um rótulo definido pelo usuário nos portões da visualização de saída. Por exemplo:import math from qiskit.circuit import QuantumCircuit qc = QuantumCircuit(2) qc.h(0) qc.rx(math.pi/2, 0, label='My Special Rotation') qc.draw(output='latex') -
O kwarg
routing_methodpara a funçãotranspile()agora aceita uma nova opção,'none'. Emrouting_method='none', nenhuma passagem de roteamento será executada como parte da transpilação. Se o circuito não se encaixar no mapa de acoplamento, umaTranspilerErrorserá gerada uma exceção. -
Uma nova classe de portão,
RVGatefoi adicionada ao móduloqiskit.circuit.libraryjuntamente com o métodoQuantumCircuitmétodorv(). ORVGateé uma porta de rotação geral, semelhante à portaUGatemas, em vez de especificar os ângulos de Euler, são especificados os três componentes de um vetor de rotação, em que a direção do vetor especifica o eixo de rotação e a magnitude especifica o ângulo de rotação sobre o eixo em radianos. Por exemplo:import math import np from qiskit.circuit import QuantumCircuit qc = QuantumCircuit(1) theta = math.pi / 5 phi = math.pi / 3 # RGate axis: axis = np.array([math.cos(phi), math.sin(phi)]) rotation_vector = theta * axis qc.rv(*rotation_vector, 0) -
Não vinculados
Parameterusados em um objetoQuantumCircuitagora serão classificados por nome. Isso entrará em vigor para os parâmetros retornados pelo atributoparametersatributo. Além disso, oqiskit.circuit.QuantumCircuit.bind_parameters()eqiskit.circuit.QuantumCircuit.assign_parameters()agora podem receber uma lista de valores a que os vincularão/atribuirão aos parâmetros em ordem ordenada por nome. Anteriormente, esses métodos recebiam apenas um dicionário de parâmetros e valores. Por exemplo:from qiskit.circuit import QuantumCircuit, Parameter circuit = QuantumCircuit(1) circuit.rx(Parameter('x'), 0) circuit.ry(Parameter('y'), 0) print(circuit.parameters) bound = circuit.bind_parameters([1, 2]) bound.draw(output='mpl') -
Os construtores para os arquivos
qiskit.quantum_info.Statevectoreqiskit.quantum_info.DensityMatrixagora podem receber um objetoQuantumCircuitpara construir um objetoStatevectoreDensityMatrixa partir desse circuito, supondo que os qubits sejam inicializados em . Por exemplo:from qiskit import QuantumCircuit from qiskit.quantum_info import Statevector qc = QuantumCircuit(2) qc.h(0) qc.cx(0, 1) statevector = Statevector(qc) statevector.draw(output='latex') -
Novas classes de backend falsas estão disponíveis em
qiskit.test.mock. Isso incluiu versões simuladas deibmq_casablanca,ibmq_sydney,ibmq_mumbai,ibmq_lima,ibmq_belem,ibmq_quito. Como nos outros backends falsos, eles incluem instantâneos de dados de calibração (ou seja,backend.defaults()) e dados de erro (ou seja,backend.properties()) retirados do sistema real e podem ser usados para testes locais, compilação e simulação.
Problemas Conhecidos
-
Tentativa de adicionar um objeto
qiskit.pulse.Instructioncom umdurationparametrizado (ou seja, o valor dedurationé um objeto não vinculadoParameterouParameterExpression) a um objetoqiskit.pulse.Schedulenão é compatível. A tentativa de fazer isso resultará emUnassignedDurationErrorPulseErrorseja acionado. Essa é uma limitação de como as restrições de sobreposição doInstructionsão avaliadas atualmente. Isso é suportado porScheduleBlockno qual as restrições de sobreposição são avaliadas imediatamente antes da execução. -
Nos sistemas Windows, quando a execução paralela está ativada para
parallel_map()o paralelismo pode não funcionar quando chamado de um script executado fora de um blocoif __name__ == '__main__':. Isso se deve ao fato de o Python iniciar processos paralelos no Windows. Se umRuntimeErrorouAttributeErrorfor gerado por scripts que chamamparallel_map()(incluindo o uso de funções que usamparallel_map()internamente, comotranspile()) com o Windows e o paralelismo ativados, você pode tentar incorporar as chamadas de script emif __name__ == '__main__':para contornar o problema. Por exemplo:from qiskit import QuantumCircuit, QiskitError from qiskit import execute, Aer qc1 = QuantumCircuit(2, 2) qc1.h(0) qc1.cx(0, 1) qc1.measure([0,1], [0,1]) # making another circuit: superpositions qc2 = QuantumCircuit(2, 2) qc2.h([0,1]) qc2.measure([0,1], [0,1]) execute([qc1, qc2], Aer.get_backend('qasm_simulator'))Deve ser mudada para:
from qiskit import QuantumCircuit, QiskitError from qiskit import execute, Aer def main(): qc1 = QuantumCircuit(2, 2) qc1.h(0) qc1.cx(0, 1) qc1.measure([0,1], [0,1]) # making another circuit: superpositions qc2 = QuantumCircuit(2, 2) qc2.h([0,1]) qc2.measure([0,1], [0,1]) execute([qc1, qc2], Aer.get_backend('qasm_simulator')) if __name__ == '__main__': main()se algum erro for encontrado com o paralelismo no Windows.
Notas da Atualização
-
Os gerentes de passagem predefinidos
level_1_pass_manager,level_2_pass_manager, elevel_3_pass_manager(que são usados paraoptimization_level1, 2 e 3 nos arquivostranspile()eexecute()) agora usam incondicionalmente a passagemOptimize1qGatesDecompositionpara otimização da porta de 1 qubit. Anteriormente, esses gerenciadores de passe usavam o passeOptimize1qGatesse os portões da base contivessemu1,u2, ouu3. Se você ainda quiser usar o antigoOptimize1qGatesantigo, será necessário criar umPassManagerpersonalizado com o passe. -
Após a transpilação de um parâmetro
QuantumCircuitparametrizado, o atributoglobal_phasedo circuito de saída não poderá mais ser retornado em uma forma simplificada, se a fase global for umParameterExpression.Por exemplo:
qc = QuantumCircuit(1) theta = Parameter('theta') qc.rz(theta, 0) qc.rz(-theta, 0) print(transpile(qc, basis_gates=['p']).global_phase)anteriormente retornava
0, mas agora retornará-0.5*theta + 0.5*theta. Essa alteração foi necessária para evitar uma grande penalidade de desempenho no tempo de execução, pois a simplificação de expressões simbólicas pode ser bastante lenta, especialmente se houver muitos objetos em um circuitoParameterExpressionobjetos em um circuito. -
Os
BasicAerJobos objetos de trabalho retornados dos back-ends BasicAer agora são instâncias síncronas deJobV1. Isso significa que as chamadas para orun()serão bloqueadas até que a simulação termine de ser executada. Se você quiser restaurar o comportamento assíncrono anterior, precisará envolver orun()com algo que será executado em um thread ou processo separado, comofutures.ThreadPoolExecutoroufutures.ProcessPoolExecutor. -
A opção
allow_sample_measuringpara o simulador BasicAerQasmSimulatorPyfoi alterada de um padrão deFalseparaTrue. Isso foi feito para refletir melhor o comportamento padrão real do simulador, que usaria a medição de amostras se o circuito de entrada fosse compatível com isso (mesmo que não estivesse ativado). Se estiver executando um circuito que não seja compatível com a medição de amostras (ou seja, ele tem operaçõesResetou se houver operações após uma medição em um qubit), certifique-se de definir explicitamente essa opção comoFalseao chamarrun(). -
A passagem do
CommutativeCancellationagora está ciente das portas da base de destino, o que significa que usará apenas as portas na base especificada. Anteriormente, o passe substituía incondicionalmente os portões consecutivos que comutam comZGatecom oU1Gate. No entanto, agora que a passagem é sensível à base e tem um kwarg,basis_gates, para especificar a base de destino, há uma possível mudança de comportamento se o kwarg não for definido. Quando o kwargbasis_gatesnão for usado e não houver portas de rotação z variáveis no circuito, não ocorrerá nenhum cancelamento comutativo. -
Register(que é a classe principal daQuantumRegistereClassicalRegistereBit(que é a classe pai deQubiteClbit) agora são imutáveis. Nas versões anteriores, era possível ajustar o valor de umsizeounamede um objetoRegistere os atributosindexouregisterde um objetoBitdepois que ele foi criado inicialmente. No entanto, isso levaria a um comportamento inadequado que corromperia a estrutura do contêiner que depende de um hash (como um dict), pois esses atributos são tratados como propriedades imutáveis de um registro ou bit (consulte o número 4705 para obter mais detalhes). Para evitar esse comportamento inadequado, os atributos de umRegistereBitnão podem mais ser definidos após a criação inicial. Se você já estava ajustando os objetos em tempo de execução, agora precisará criar um novo objetoRegisterouBitcom os novos valores. -
O método
DAGCircuit.__eq__(que é usado pelo operador==), que é usado para verificar a igualdade estrutural deDAGCircuiteQuantumCircuitagora incluirá as instânciasglobal_phaseecalibrationsnos campos verificados quanto à igualdade. Isso significa que os circuitos que teriam sido avaliados como iguais em versões anteriores podem não ser mais se o siteglobal_phaseoucalibrationsdiferir entre os circuitos. Por exemplo, em versões anteriores, isso retornariaTrue:import math from qiskit import QuantumCircuit qc1 = QuantumCircuit(1) qc1.x(0) qc2 = QuantumCircuit(1, global_phase=math.pi) qc2.x(0) print(qc2 == qc1)No entanto, agora, como o atributo
global_phasedos circuitos é diferente, o retorno seráFalse. -
Os métodos anteriormente obsoletos
qubits()eclbits()da classeDAGCircuitque foram descontinuados na versão 0.15.0 Terra, foram removidos. Em vez disso, você deve usar os atributosqubitseclbitsda classeDAGCircuitclasse. Por exemplo, se você estivesse executando:from qiskit.dagcircuit import DAGCircuit dag = DAGCircuit() qubits = dag.qubits()Isso seria substituído por:
from qiskit.dagcircuit import DAGCircuit dag = DAGCircuit() qubits = dag.qubits -
Os
PulseDefaultsretornados pelos backends de pulso falsoqiskit.test.mock.FakeOpenPulse2Qeqiskit.test.mock.FakeOpenPulse3Qforam atualizados para ter definições de sequência de pulso mais realistas. Se você estiver usando essas classes de back-end falsas, talvez seja necessário atualizar seu uso devido a essas alterações. -
O método de síntese padrão usado pela função
decompose_clifford()no móduloquantum_info(que é usada internamente pelo métodoqiskit.quantum_info.Clifford.to_circuit()) para mais de 3 qubits agora usa uma rotina de compilação gulosa não otimizada para síntese de elementos de Clifford, por Bravyi et. al. al, que normalmente gera um melhor custo de CX em comparação com o padrão antigo. Se você precisar reverter para o método Aaronson-Gottesman anterior, isso pode ser feito definindomethod='AG'. -
O módulo
qiskit.visualization.interactive, que foi descontinuado na versão 0.15.0, foi removido. Em vez disso, você deve usar as visualizações baseadas no matplotlib:Função interativa removidaFunção matplotlib equivalenteiplot_bloch_multivectorqiskit.visualization.plot_bloch_multivector()iplot_state_cityqiskit.visualization.plot_state_city()iplot_state_qsphereqiskit.visualization.plot_state_qsphere()iplot_state_hintonqiskit.visualization.plot_state_hinton()iplot_histogramqiskit.visualization.plot_histogram()iplot_state_paulivecqiskit.visualization.plot_state_paulivec() -
Os atributos de nível superior
qiskit.Aereqiskit.IBMQagora são carregados lentamente. Isso significa que os objetos sempre existirão e os avisos não serão mais emitidos na importação seqiskit-aerouqiskit-ibmq-providernão estiverem instalados (ou não puderem ser encontrados por Python ). Se você estava verificando a presença deqiskit-aerouqiskit-ibmq-providerusando esses atributos de módulo e comparando explicitamente comNoneou procurando a ausência do atributo, isso não funcionará mais porque agora eles são sempre definidos como um objeto. Em outras palavras, executar algo como:try: from qiskit import Aer except ImportError: print("Aer not available") or:: try: from qiskit import IBMQ except ImportError: print("IBMQ not available")não funcionará mais. Em vez disso, para determinar se esses provedores estão presentes, você pode usar explicitamente
qiskit.providers.aer.Aereqiskit.providers.ibmq.IBMQ:try: from qiskit.providers.aer import Aer except ImportError: print("Aer not available") try: from qiskit.providers.ibmq import IBMQ except ImportError: print("IBMQ not available")ou, em vez disso, verifique
bool(qiskit.Aer)ebool(qiskit.IBMQ), por exemplo:import qiskit if not qiskit.Aer: print("Aer not available") if not qiskit.IBMQ: print("IBMQ not available")Essa alteração foi necessária para evitar possíveis problemas de ciclo de importação entre os pacotes qiskit e também para melhorar o tempo de importação quando o Aer ou o IBMQ não estiverem sendo usados.
-
A opção do arquivo de configuração do usuário
suppress_packaging_warningsno arquivo de configuração do usuário e a variável de ambienteQISKIT_SUPPRESS_PACKAGING_WARNINGSnão têm mais efeito e serão silenciosamente ignoradas. Os avisos que essa opção controlava foram removidos e não serão mais emitidos no momento da importação do móduloqiskit. -
O kwarg
conditionanteriormente obsoleto paraqiskit.dagcircuit.DAGNodefoi removido. Ele foi descontinuado na versão 0.15.0. Em vez disso, agora você deve definir a condição clássica no objetoInstructionpassado para o construtorDAGNodeao criar um novo nóop. -
Ao criar uma nova classe
Register(que é a classe pai deQuantumRegistereClassicalRegister) ouQuantumCircuitcom um número de bits (por exemplo,QuantumCircuit(2)), agora é necessário que o número de bits seja especificado como um número inteiro ou outro tipo que possa ser convertido em números inteiros não ambíguos (por exemplo,2.0). Os valores não inteiros agora geram um erro, pois a intenção nesses casos não era clara (você não pode ter bits fracionários). Para obter mais informações sobre por que isso foi alterado, consulte: #4855 -
o networkx não é mais um requisito para o qiskit-terra. Todo o uso do networkx no qiskit-terra foi removido, com exceção de três métodos:
qiskit.dagcircuit.DAGCircuit.to_networkxqiskit.dagcircuit.DAGCircuit.from_networkxqiskit.dagcircuit.DAGDependency.to_networkx
Se estiver usando qualquer um desses métodos, será necessário instalar manualmente o networkx em seu ambiente para continuar a usá-los.
-
Por padrão, em macOS com Python >= 3.8
parallel_map()não será mais executado em vários processos. Essa é uma mudança em relação às versões anteriores, em que o comportamento padrão era que oparallel_map()iniciava vários processos. Essa alteração foi feita porque, nas versões mais recentes de macOS com Python 3.8 e 3.9, o multiprocessamento não é confiável ou adiciona uma sobrecarga significativa devido à alteração em Python 3.8 para iniciar novos processos comspawnem vez defork. Para reativar a execução paralela em macOS com Python >= 3.8, você pode usar a opção do arquivo de configuração do usuárioparallelou definir a variável de ambienteQISKIT_PARALLELparaTrue. -
O kwarg
callback, anteriormente obsoleto, no construtor da classePassManagerfoi removido. Esse kwarg foi descontinuado desde a versão 0.13.0 (9 de abril de 2020). Em vez disso, você pode passar o kwargcallbackpara o métodoqiskit.transpiler.PassManager.run()diretamente. Por exemplo, se você estivesse usando:from qiskit.circuit.random import random_circuit from qiskit.transpiler import PassManager qc = random_circuit(2, 2) def callback(**kwargs) print(kwargs['pass_']) pm = PassManager(callback=callback) pm.run(qc)isso pode ser substituído por:
from qiskit.circuit.random import random_circuit from qiskit.transpiler import PassManager qc = random_circuit(2, 2) def callback(**kwargs) print(kwargs['pass_']) pm = PassManager() pm.run(qc, callback=callback) -
Agora não é mais possível instanciar um canal básico sem um prefixo, como
qiskit.pulse.Channelouqiskit.pulse.PulseChannel. Essas classes são projetadas para classificar tipos de diferentes classes de canais voltados para o usuário, comoqiskit.pulse.DriveChannel, mas não têm uma definição como recurso de destino. Se você estava instanciando diretamenteqiskit.pulse.Channelouqiskit.pulse.PulseChannel, isso não é mais permitido. Use a subclasse apropriada. -
Quando os kwargs
require_cpe/ourequire_tpdeqiskit.quantum_info.process_fidelity(),qiskit.quantum_info.average_gate_fidelity(),qiskit.quantum_info.gate_error()sãoTrue, eles agora registrarão apenas um aviso em vez do comportamento anterior de gerar umaQiskitErrorse o canal de entrada for não-CP ou não-TP, respectivamente. -
A classe
QFTno móduloqiskit.circuit.libraryagora calcula a transformada de Fourier usando uma representação little-endian de tensores, ou seja, o estado mapeia para assumindo que a base computacional corresponda à ordenação de bits little-endian dos inteiros. etc. Isso foi feito para torná-lo mais consistente com o restante do Qiskit, que usa uma convenção little-endian para a ordem dos bits. Se você estava dependendo da ordem de bits anterior, pode usar o métodoreverse_bits()para reverter para o comportamento anterior. Por exemplo:from qiskit.circuit.library import QFT qft = QFT(5).reverse_bits() -
O atributo do módulo
qiskit.__qiskit_version__, que antes era umdict, agora retornará um objetoMappingpersonalizado somente leitura que verifica a versão dos elementos do qiskit no tempo de execução, em vez de no tempo de importação. Isso foi feito para acelerar o caminho de importação do qiskit e eliminar um possível ciclo de importação, importando apenas os pacotes de elementos em tempo de execução se a versão for necessária do pacote. Isso deve ser totalmente compatível com odictretornado anteriormente e, na maioria dos casos de uso normal, não haverá diferença. No entanto, se alguns aplicativos dependiam da mutação do conteúdo ou da verificação explícita do tipo, pode ser necessário fazer atualizações para se adaptar a essa mudança. -
O módulo
qiskit.executefoi renomeado paraqiskit.execute_function. Isso foi necessário para evitar um conflito de nome potencial entre a funçãoexecute()que é reexportada comoqiskit.execute.qiskit.executea função em algumas situações poderia entrar em conflito comqiskit.executeo módulo, o que levaria a um erro enigmático porque Python estava tratandoqiskit.executecomo o módulo quando a intenção era a função ou vice-versa. A renomeação do módulo foi necessária para evitar esse conflito. Se você estiver importandoqiskit.executepara obter o módulo (o uso típico erafrom qiskit.execute import execute), será necessário atualizar isso para usarqiskit.execute_function.qiskit.executeagora sempre resolverá para a função. -
Os módulos
qiskit.compiler.transpile,qiskit.compiler.assemble,qiskit.compiler.scheduleeqiskit.compiler.sequenceforam renomeados paraqiskit.compiler.transpiler,qiskit.compiler.assembler,qiskit.compiler.schedulereqiskit.compiler.sequence, respectivamente. Isso foi necessário para evitar um conflito potencial de nomes entre os módulos e os caminhos de função reexportadosqiskit.compiler.transpile(),qiskit.compiler.assemble(),qiskit.compiler.schedule(), eqiskit.compiler.sequence(). Em algumas situações, esse conflito de nomes entre o caminho do módulo e o caminho da função reexportada levaria a um erro enigmático porque o Python estava tratando uma importação como o módulo quando a intenção era usar a função ou vice-versa. A renomeação do módulo foi necessária para evitar esse conflito. Se você estava usando as importações para obter os módulos antes (o uso típico seria como``from qiskit.compiler.transpile import transpile``), será necessário atualizar isso para usar os novos caminhos de módulo.qiskit.compiler.transpile(),qiskit.compiler.assemble(),qiskit.compiler.schedule(),, eqiskit.compiler.sequence()agora sempre serão resolvidos para as funções. -
A classe
qiskit.quantum_info.Quaternionfoi movida do submóduloqiskit.quantum_info.operatorpara o submóduloqiskit.quantum_info.synthesispara refletir melhor sua finalidade. Nenhuma alteração será necessária se você estiver importando-o do módulo raizqiskit.quantum_infomas, se estiver importando deqiskit.quantum_info.operator, será necessário atualizar o caminho de importação. -
Removido o método
QuantumCircuit.mcmt, que está obsoleto desde o lançamento do Qiskit Terra 0.14.0 em abril de 2020. Em vez de usar o método, use a classeMCMTpara construir um portão de vários controles e vários alvos e use o métodoqiskit.circuit.QuantumCircuit.append()ouqiskit.circuit.QuantumCircuit.compose()para adicioná-la a um circuito.Por exemplo, você pode substituir:
circuit.mcmt(ZGate(), [0, 1, 2], [3, 4])com:
from qiskit.circuit.library import MCMT mcmt = MCMT(ZGate(), 3, 2) circuit.compose(mcmt, range(5)) -
Removido o método
QuantumCircuit.diag_gateque foi descontinuado desde o lançamento do Qiskit Terra 0.14.0 em abril de 2020. Em vez disso, use o métododiagonal()método deQuantumCircuit. -
Removido o método
QuantumCircuit.ucyque foi descontinuado desde o lançamento do Qiskit Terra 0.14.0 em abril de 2020. Em vez disso, use o métodoucry()método deQuantumCircuit. -
O método
mirror(), anteriormente obsoleto, paraqiskit.circuit.QuantumCircuitfoi removido. Ele foi descontinuado na versão 0.15.0. O métodoqiskit.circuit.QuantumCircuit.reverse_ops()deve ser usado, pois o espelhamento pode ser confundido com a troca dos qubits de saída do circuito. O métodoreverse_ops()apenas inverte a ordem das portas que são aplicadas em vez de espelhar. -
O suporte anteriormente obsoleto à passagem de um float (para o
scalekwarg como o primeiro argumento posicional para oqiskit.circuit.QuantumCircuit.draw()foi removido. Ele foi descontinuado na versão 0.12.0. O primeiro argumento posicional do métodoqiskit.circuit.QuantumCircuit.draw()é agora ooutputkwarg, que não aceita um float. Em vez disso, você deve usarscalecomo um kwarg nomeado em vez de usá-lo de forma posicional.Por exemplo, se você estava ligando anteriormente para
drawcom:from qiskit import QuantumCircuit qc = QuantumCircuit(2) qc.draw(0.75, output='mpl')isso agora precisaria ser:
from qiskit import QuantumCircuit qc = QuantumCircuit(2) qc.draw(output='mpl', scale=0.75)ou:
qc.draw('mpl', scale=0.75) -
Os recursos do Qiskit Pulse (
qiskit.pulse) que foram descontinuados na versão 0.15.0 (agosto de 2020) foram removidos. O conjunto completo de alterações é o seguinte:MóduloAntigoNovoqiskit.pulse.librarySamplePulseWaveformqiskit.pulse.libraryConstantPulseConstant(renomeação do módulo) pulse.pulse_libMóduloqiskit.pulse.libraryClasseMétodo antigoNovo métodoParametricPulseget_sample_pulseget_waveformInstructioncommandN/A. Os comandos e as instruções foram unificados. Use operands()para obter informações sobre os dados da instrução.Acquireacquires,mem_slots,reg_slotsacquire(),mem_slot(),reg_slot(). (A instruçãoAcquirenão transmite mais por vários qubits) -
O dicionário anteriormente mantido nas
DAGCircuitbordas foi removido. Em vez disso, as bordas agora contêm a instânciaBitque havia sido incluída anteriormente no dicionário como seu campo'wire'. Observe que o gráfico NetworkX retornado porto_networkx()ainda terá um dicionário para seus atributos de borda, mas o campo'name'não será mais preenchido. -
O atributo
parametersda classeQuantumCircuitnão está mais retornando umset. Em vez disso, ele retorna um objetoParameterViewque implementa todos os métodos que osetoferece (embora obsoletos). Isso foi feito para dar suporte a um modelo que preserva os parâmetros classificados por nome. Ele deve ser totalmente compatível com qualquer uso anterior dosetretornado pelo atributoparametersexceto nos casos em que foi feita a verificação explícita do tipo de um conjunto. -
Ao executar
transpile()em umQuantumCircuitcom instruçõesdelay()as unidades serão convertidas para dt se o valor de dt (tempo de amostragem) for conhecido portranspile()explicitamente por meio do kwargdtou por meio do kwargBackendConfigurationpara um objetoBackendpassado por meio do kwargbackend. -
A interpretação de
meas_map(que é um atributo de umPulseBackendConfigurationou como o kwargmeas_mapcorrespondente no objetoschedule(),assemble(),sequence(), ouexecute()) foi atualizada para corresponder melhor às restrições reais do hardware. O formato desses dados é uma lista de listas, em que os itens da lista interna são números inteiros que especificam rótulos de qubit. Por exemplo:[[A, B, C], [D, E, F, G]]Anteriormente, a restrição
meas_mapera interpretada de forma que, se um qubit fosse adquirido (por exemplo, A), todos os outros qubits que compartilham um subgrupo com esse qubit (B e C) teriam que ser adquiridos ao mesmo tempo e com a mesma duração. Essa restrição foi relaxada. Uma aquisição não requer mais aquisições. (Se A for adquirido, B e C não precisarão ser adquiridos) Em vez disso, os qubits no mesmo grupo de medição não podem ser adquiridos de forma parcialmente sobreposta - pense nomeas_mapcomo uma especificação de um recurso de aquisição compartilhado (se adquirirmos A det=1000parat=2000, não poderemos adquirir B a partir de1000<t<2000). Por exemplo:# Good meas_map = [[0, 1]] # Acquire a subset of [0, 1] sched = pulse.Schedule() sched = sched.append(pulse.Acquire(10, acq_q0)) # Acquire 0 and 1 together (same start time, same duration) sched = pulse.Schedule() sched = sched.append(pulse.Acquire(10, acq_q0)) sched = sched.append(pulse.Acquire(10, acq_q1)) # Acquire 0 and 1 disjointly sched = pulse.Schedule() sched = sched.append(pulse.Acquire(10, acq_q0)) sched = sched.append(pulse.Acquire(10, acq_q1)) << 10 # Acquisitions overlap, but 0 and 1 aren't in the same measurement # grouping meas_map = [[0], [1]] sched = pulse.Schedule() sched = sched.append(pulse.Acquire(10, acq_q0)) sched = sched.append(pulse.Acquire(10, acq_q1)) << 1 # Bad: 0 and 1 are in the same grouping, but acquisitions # partially overlap meas_map = [[0, 1]] sched = pulse.Schedule() sched = sched.append(pulse.Acquire(10, acq_q0)) sched = sched.append(pulse.Acquire(10, acq_q1)) << 1
Notas de descontinuação
-
Dois novos argumentos foram adicionados a
qiskit.dagcircuit.DAGNode.semantic_eq()bit_indices1ebit_indices2, que devem mapear as instâncias deBitinstâncias em cadaDAGNodepara seu índice na listaqubitsouclbitsde suas respectivas listasDAGCircuit. Durante o período de depreciação, esses argumentos são opcionais e, quando não forem especificados, os mapeamentos serão construídos automaticamente com base nas propriedadesregistereindexde cadaBitinstância. No entanto, em uma versão futura, eles serão argumentos obrigatórios e o mapeamento precisará ser fornecido pelo usuário. -
As
pulsefunções do construtor:qiskit.pulse.call_circuit()qiskit.pulse.call_schedule()
são obsoletos e serão removidos em uma versão futura. Essas funções são unificadas em
qiskit.pulse.call(), que deve ser usado em seu lugar. -
O método
qiskit.pulse.Schedulemétodoqiskit.pulse.Schedule.flatten()está obsoleto e será removido em uma versão futura. Em vez disso, você pode usar a funçãoqiskit.pulse.transforms.flatten()que executará a mesma operação. -
O site
assign_parameters()para as seguintes classes:qiskit.pulse.channels.Channel,qiskit.pulse.library.Pulse,qiskit.pulse.instructions.Instruction,
e todas as suas subclasses estão obsoletas e serão removidas em uma versão futura. Essa funcionalidade foi incorporada
ScheduleBlockque é a direção futura para a construção de programas de pulso parametrizados. -
O atributo
parameterspara as seguintes classes:está obsoleto e será removido em uma versão futura. Essa funcionalidade foi incorporada
ScheduleBlockque é a direção futura para a construção de programas de pulso parametrizados. -
Python 3.6 foi preterido e será removido em uma versão futura. Quando o suporte for removido, será necessário atualizar a versão Python que você está usando para Python 3.7 ou superior.
-
Dois
QuantumCircuitcombine()eextend()juntamente com seus operadores correspondentes Python+e+=estão obsoletos e serão removidos em uma versão futura. Em vez disso, o métodoQuantumCircuitmétodocompose()deve ser usado. O métodocompose()permite mais flexibilidade na composição de dois circuitos que não têm registros correspondentes. Entretanto, ele não adiciona automaticamente qubits/clbits, ao contrário dos métodos obsoletos. Para adicionar um circuito em novos qubits/clbits, o métodoqiskit.circuit.QuantumCircuit.tensor()pode ser usado. Por exemplo:from qiskit.circuit import QuantumRegister, QuantumCircuit a = QuantumRegister(2, 'a') circuit_a = QuantumCircuit(a) circuit_a.cx(0, 1) b = QuantumRegister(2, 'b') circuit_b = QuantumCircuit(b) circuit_b.cz(0, 1) # same as circuit_a + circuit_b (or combine) added_with_different_regs = circuit_b.tensor(circuit_a) # same as circuit_a + circuit_a (or combine) added_with_same_regs = circuit_a.compose(circuit_a) # same as circuit_a += circuit_b (or extend) circuit_a = circuit_b.tensor(circuit_a) # same as circuit_a += circuit_a (or extend) circuit_a.compose(circuit_a, inplace=True) -
Suporte para passar instâncias
Qubitpara o kwargqubitsdo métodoqiskit.transpiler.InstructionDurations.get()foi preterido e será removido em uma versão futura. Em vez disso, você deve chamar o métodoget()com os índices inteiros dos qubits desejados. -
O uso de
@(__matmul__) para invocar o métodocomposedas subclasses deBaseOperator(por exemploOperator) está obsoleto e será removido em uma versão futura. O métodoqiskit.quantum_info.Operator.compose()pode ser usado diretamente ou também invocado usando o operador&(__and__). -
Usar
*(__mul__) para chamar o métododot()das subclasses deBaseOperator(por exemploqiskit.quantum_info.Operator) está obsoleto e será removido em uma versão futura. Em vez disso, você pode simplesmente chamar odot()diretamente. -
Usando
@(__matmul__) para invocar o métodoevolve()dos métodosqiskit.quantum_info.Statevectoreqiskit.quantum_info.DensityMatrixestá obsoleto e será removido em uma versão futura. O métodoevolvepode ser usado diretamente ou também invocado usando o operador&(__and__). -
A classe
qiskit.pulse.schedule.ParameterizedSchedulefoi preterida e será removida em uma versão futura. Em vez disso, você pode parametrizar diretamente os objetos de pulsoSchedulecom um objetoParameterpor exemplo:from qiskit.circuit import Parameter from qiskit.pulse import Schedule from qiskit.pulse import ShiftPhase, DriveChannel theta = Parameter('theta') target_schedule = Schedule() target_schedule.insert(0, ShiftPhase(theta, DriveChannel(0)), inplace=True) -
A classe
qiskit.pulse.ScheduleComponentno móduloqiskit.pulsefoi preterida e será removida em uma versão futura. Seu uso deve ser substituído por umqiskit.pulse.Scheduleouqiskit.pulse.Instructiondiretamente. Além disso, o objetivo principal da classeScheduleComponentera ser uma classe de base comum para as classesScheduleeInstructionpara qualquer lugar que estivesse explicitamente verificando o tipo ou documentando a aceitação de uma entradaScheduleComponentdeveria ser atualizado para aceitarInstructionouSchedule. -
Os arquivos de esquema JSON e o uso das cargas úteis da API do IBMQ estão obsoletos e serão removidos em uma versão futura. Isso inclui tudo no módulo
qiskit.schemase no móduloqiskit.validation. Isso também inclui ovalidatekwargs paraqiskit.qobj.QasmQobj.to_dict()eqiskit.qobj.QasmQobj.to_dict()juntamente com os validadores fastjsonschema em nível de módulo emqiskit.qobj(que não geram um aviso de depreciação). Os arquivos de esquema foram movidos para o repositório Qiskit/ibmq-schemas e devem ser tratados como as versões canônicas dos esquemas da API. No futuro, somente esses esquemas receberão atualizações e serão usados como fonte de verdade para os esquemas. Se você estava contando com os esquemas incluídos no qiskit-terra, deve atualizar para usar esse repositório. -
O módulo
qiskit.utilfoi descontinuado e será removido em uma versão futura. Ele foi substituído peloqiskit.utilsque oferece a mesma funcionalidade e será expandido no futuro. Observe que nenhumDeprecationWarningserá emitido com relação a essa descontinuidade, uma vez que ela não era viável em Python 3.6. -
A passagem do transpilador
CXDirectionno móduloqiskit.transpiler.passesfoi preterida e será removida em uma versão futura. Em vez disso, oGateDirectiondeve ser usado. Ele se comporta de forma idêntica aoCXDirection, exceto pelo fato de que agora ele também suporta a transformação de um circuito comECRGatealém de portasCXGateportas. -
A passagem do transpilador
CheckCXDirectionno móduloqiskit.transpiler.passesfoi preterida e será removida em uma versão futura. Em vez disso, o passeCheckGateDirectiondeve ser usado. Ele se comporta de forma idêntica aoCheckCXDirection, exceto pelo fato de que agora também suporta a verificação da direção de todos os portões de 2 qubit, não apenas dos portõesCXGategates. -
O método
WeightedAddernum_ancilla_qubits()está obsoleto e será removido em uma versão futura. Ele foi substituído pelo atributoqiskit.circuit.library.WeightedAdder.num_ancillasque é consistente com as APIs de outras bibliotecas de circuitos. -
Os seguintes métodos legados da classe
qiskit.quantum_info.Pauliforam descontinuados. Consulte a documentação do método para obter o uso de substituição na classe Pauli atualizada.from_label()sgn_prod()to_spmatrix()kron()update_z()update_x()insert_paulis()append_paulis()delete_qubits()pauli_single()random()
-
Usando um
listounumpy.ndarraycomo o argumentochanneloutargetpara o comandoqiskit.quantum_info.process_fidelity(),qiskit.quantum_info.average_gate_fidelity(),qiskit.quantum_info.gate_error(), eqiskit.quantum_info.diamond_norm()foi preterido e não terá suporte em uma versão futura. Em vez disso, as entradas devem ser um objetoGateou um objeto da subclasseBaseOperator(por exemplo.Operator,Choi, etc.) -
Acessando referências de
QubiteClbitpara os registros que as contêm por meio deregisterouindexfoi preterido e será removido em uma versão futura. Em vez disso,Registerpodem ser consultados para encontrar os objetosBitobjetos que eles contêm. -
A funcionalidade atual da função
qiskit.visualization.pulse_drawer()está obsoleta e será substituída porqiskit.visualization.pulse_drawer_v2()(que não é compatível com versões anteriores) em uma versão futura. -
O uso de métodos herdados do tipo
setna saída do atributoparameters(que costumava ser umset) da classeQuantumCircuitestá obsoleto e será removido em uma versão futura. Isso inclui os métodos dos sitesadd(),difference(),difference_update(),discard(),intersection(),intersection_update(),issubset(),issuperset(),symmetric_difference(),symmetric_difference_update(),union(),update(),__isub__()(que é o operador-=) e__ixor__()(que é o operador^=). -
O nome do primeiro (e único) argumento posicional do método
qiskit.circuit.QuantumCircuit.bind_parameters()foi alterado devalue_dictparavalues. A passagem de um argumento com o nomevalues_dictestá obsoleta e será removida em uma versão futura. Por exemplo, se você estava chamando anteriormentebind_parameters()com uma chamada do tipo:bind_parameters(values_dict={}), isso está obsoleto e deve ser substituído porbind_parameters(values={})ou, melhor ainda, basta passar o argumento de forma posicionalbind_parameters({}). -
O nome do primeiro (e único) argumento posicional do método
qiskit.circuit.QuantumCircuit.assign_parameters()foi alterado deparam_dictparaparameters. A passagem de um argumento com o nomeparam_dictestá obsoleta e será removida em uma versão futura. Por exemplo, se você estava chamando anteriormenteassign_parameters()com uma chamada do tipo:assign_parameters(param_dict={}), isso está obsoleto e deve ser substituído porassign_parameters(values={})ou, melhor ainda, basta passar o argumento de forma posicionalassign_parameters({}).
Correções de bugs
-
Foi corrigido um problema em que a função
execute()levantava aQiskitErrorexceção quando um objetoParameterVectorera passado para o kwargparameter_bind. . Por exemplo, agora é possível chamar algo como:execute(circuit, backend, parameter_binds=[{pv1: [...], pv2: [...]}])em que
pv1epv2sãoParameterVectorobjetos. Corrigido #5467 -
Foi corrigido um problema em que os rótulos dos pulsos paramétricos na classe
PulseQobjInstructionnão estavam sendo definidos corretamente, como acontece com os pulsos amostrados. Isso também significa que os nomes de pulsos que são importados doPulseDefaultsretornados por umBackendcomox90,x90m, etc., serão definidos corretamente. Corrigido #5363 -
Foi corrigido um problema em que os parâmetros não vinculados só ocorriam no atributo
global_phasede um objetoQuantumCircuitnão eram exibidos no atributoparameterse não podiam ser vinculados. Corrigido #5806 -
O atributo
calibrationsdos objetosQuantumCircuitagora são preservados quando o+=(ou seja, o métodoextend()) e o+(ou seja, o métodocombine()) são usados. Corrigidos os números 5930 e 5908 -
O método
namesetter da classeRegister(que é a classe pai deQuantumRegistereClassicalRegister) anteriormente não verificava se a string atribuída era um nome de registro válido de acordo com a especificação OpenQASM. Essa verificação era realizada anteriormente apenas quando o nome era especificado no construtor. Agora, isso foi corrigido para que a configuração do atributonamediretamente com um valor inválido também gere uma exceção. Corrigido #5461 -
Foi corrigido um problema com a função
qiskit.visualization.circuit_drawer()função eqiskit.circuit.QuantumCircuit.draw()ao visualizar umQuantumCircuitcom umGateque tem uma condição clássica após umMeasureque usou o mesmoClassicalRegisterera possível que a condicionalGatefosse exibida à esquerda doMeasure. Corrigido #5387 -
Na passagem do transpilador
qiskit.transpiler.passes.CSPLayoutfoi possível observar uma tendência em direção aos qubits com números mais baixos. Esse viés indesejável foi corrigido embaralhando os candidatos para randomizar os resultados. Além disso, o uso doCSPLayoutno campopreset_passmanagers(para os níveis 2 e 3) foi ajustado para usar uma semente configurada se oseed_transpilerkwarg estiver definido quando otranspile()for chamado. Corrigido #5990 -
Corrige um bug em que o campo
channelsde um objetoPulseBackendConfigurationnão estava sendo incluído na saída do métodoqiskit.providers.models.PulseBackendConfiguration.to_dictmétodo. Corrigido #5579 -
Corrigido o emaranhamento
'circular'na classeqiskit.circuit.library.NLocalpara o caso extremo em que o circuito tem o mesmo tamanho que o bloco de emaranhamento (por exemplo, um circuito de dois qubits e portas de emaranhamento CZ). Nesse caso, deveria haver apenas uma porta de emaranhamento, mas foi adicionada acidentalmente uma segunda porta na direção inversa da primeira. Fixo qiskit-community/qiskit-aqua#1452 -
Foi corrigido o tratamento de pontos de interrupção na classe
PiecewisePolynomialPauliRotationsna classeqiskit.circuit.library. Agora, para intervalos den, são permitidos pontos de interrupção den+1. Isso permite especificar outro intervalo final diferente de . Isso é importante porque, do final do último intervalo até , a função é a identidade. -
Foi corrigido um problema na classe
qiskit.circuit.library.Permutationem que algumas permutações não eram geradas corretamente. Esse problema também poderia afetar oqiskit.circuit.library.QuantumVolumese ele fosse chamado com classical_permutation=False`. Corrigido #5812 -
Foi corrigido um problema em que a geração de saída QASM com o método
qasm()para um objetoQuantumCircuitque tem um controleControlledGatecom um controle aberto, a saída seria como se todos os controles estivessem fechados, independentemente do estado de controle especificado. Isso resultaria em um circuito diferente sendo criado a partir defrom_qasm_str()se o QASM gerado fosse analisado.Isso foi corrigido com a atualização da saída QASM de
qasm()definindo uma porta composta que usaXGatepara implementar os controles de abertura. A porta composta é nomeada como<original_gate_name>_o<ctrl_state>, em queosignifica controle aberto ectrl_stateé o valor inteiro do estado de controle. Corrigido #5443 -
Foi corrigido um problema em que a vinculação de objetos
Parameterem um objetoQuantumCircuitcom o endereçoparameter_bindsna funçãoexecutefazia com que todos os objetosQuantumCircuittivessem o mesmoname, o que significava que os nomes dos resultados também não eram exclusivos. Essa correção faz com que obind_parameters()eassign_parameters()atribuam um nome de circuito exclusivo quandoinplace=Falseas:<base name>-<class instance no.>[-<pid name>]em que
<base name>é o nome fornecido pelo kwarg "name"; caso contrário, o padrão é "circuit". O número da instância da classe é incrementado toda vez que uma instância da classe é gerada.<pid name>é anexado se for chamado fora do processo principal. Corrigido #5185 -
Foi corrigido um problema com a função
scheduler(), que gerava uma exceção se um circuito de entrada contivesse um objetoQuantumCircuitnão vinculado. Corrigido #5304 -
Foi corrigido um problema nas passagens do
qiskit.transpiler.passes.TemplateOptimizationpassagens do transpilador em que os circuitos de modelo que continham objetos não vinculadosParameternão vinculados travavam em alguns cenários se os parâmetros não pudessem ser vinculados durante a correspondência de modelos. Agora, se osParameternão puderem ser vinculados, os modelos comParameterserão descartados e ignorados peloTemplateOptimizationpass. Corrigido #5533 -
Foi corrigido um problema com a função
qiskit.visualization.timeline_drawer()em que os bits clássicos eram tratados de forma inadequada. Corrigido #5361 -
Foi corrigido um problema na função
qiskit.visualization.circuit_drawer()e no métodoqiskit.circuit.QuantumCircuit.draw()método em que asDelayinstruções em um objetoQuantumCircuitnão estavam sendo tratadas corretamente como tempo ocioso. Portanto, quando o kwarg doidle_wiresfoi definido comoFalse, os fios com osDelayainda seriam exibidos. Isso foi corrigido para que os fios ociosos sejam removidos da visualização se houver apenasDelayobjetos em um fio. -
Anteriormente, quando a opção
layout_methodkwarg era fornecida para a funçãotranspile()e ooptimization_levelkwarg era definido como >= 2 para que a passagemqiskit.transpiler.passes.CSPLayoutfosse executado, seCSPLayoutencontrasse uma solução, o método emlayout_methodnão era executado. Isso foi corrigido para que, se especificado, olayout_methodseja sempre respeitado. Corrigido #5409 -
Quando o argumento
coupling_map=None(definido explicitamente, definido implicitamente como o valor padrão ou por meio do kwargbackend), o processo de transpilação não estava "incorporando" o circuito. Ou seja, mesmo quando uminitial_layoutfoi especificado, os qubits virtuais não foram atribuídos a qubits físicos. Isso foi corrigido, de modo que agora a funçãoqiskit.compiler.transpile()honre o argumentoinitial_layoutao incorporar o circuito:from qiskit import QuantumCircuit, QuantumRegister from qiskit.compiler import transpile qr = QuantumRegister(2, name='qr') circ = QuantumCircuit(qr) circ.h(qr[0]) circ.cx(qr[0], qr[1]) transpile(circ, initial_layout=[1, 0]).draw(output='mpl')Se o site
initial_layoutse referir a mais qubits do que no circuito, o processo de transpilação estenderá o circuito com ancillas.from qiskit import QuantumCircuit, QuantumRegister from qiskit.compiler import transpile qr = QuantumRegister(2, name='qr') circ = QuantumCircuit(qr) circ.h(qr[0]) circ.cx(qr[0], qr[1]) transpile(circ, initial_layout=[4, 2], coupling_map=None).draw()Corrigido #5345
-
Um novo kwarg,
user_cost_dict, foi adicionado ao construtor para aqiskit.transpiler.passes.TemplateOptimizationtranspiler pass. Isso permite que os usuários forneçam um dicionário de custos personalizado para as portas do algoritmo de correspondência de modelos subjacente. Por exemplo:from qiskit.transpiler.passes import TemplateOptimization cost_dict = {'id': 0, 'x': 1, 'y': 1, 'z': 1, 'h': 1, 't': 1} pass = TemplateOptimization(user_cost_dict=cost_dict) -
Um problema ao passar o objeto
Countsretornado porget_counts()paramarginal_counts()produzia um objetoCountscom determinadas entradas foi corrigido. Correções #5424 -
Aprimorou a alocação de qubits auxiliares em
PolynomialPauliRotationsePiecewiseLinearPauliRotationso que torna a implementação desses circuitos mais eficiente. Corrigido #5320 e #5322 -
Corrigir o uso dos qubits auxiliares alocados no
MCXGatena classeWeightedAdderclasse. Eles foram alocados anteriormente, mas não foram usados antes dessa correção. Corrigido #5321 -
Em vários casos, o método de saída
latexpara a funçãoqiskit.visualization.circuit_drawer()e o métododraw()não exibiam o nome da porta corretamente e, em outros casos, não incluíam os parâmetros da porta onde deveriam estar. Agora, os nomes das portas serão exibidos da mesma forma que são exibidos com o método de saídampl, e os parâmetros serão exibidos para todas as portas que os tiverem. Além disso, alguns dos portões não eram exibidos na forma correta, e isso foi corrigido. Correções #5605, #4938 e #3765 -
Foi corrigido um problema em que, se o método
qiskit.circuit.Instruction.to_instruction()fosse usado em um subcircuito que contivesse registros clássicos e esse objetoInstructionera então adicionado a um objetoQuantumCircuitentão a saída da funçãoqiskit.visualization.circuit_drawer()e do métodoqiskit.circuit.QuantumCircuit.draw()exibia, em alguns casos, o subcircuito à esquerda de uma medida, quando deveria ser exibido à direita. Corrigido #5947 -
Foi corrigido um problema com
Delayem um objetoQuantumCircuitondeqiskit.compiler.transpile()não convertiam as unidades do objetoDelaypara as unidades doBackendse o kwargbackendestivesse definido emtranspile(). Isso pode resultar em um comportamento incorreto devido a uma incompatibilidade de unidades, por exemplo, em execução:from qiskit import transpile, execute from qiskit.circuit import QuantumCircuit qc = QuantumCircuit(1) qc.delay(100, [0], unit='us') qc = transpile(qc, backend) job = execute(qc, backend)teria resultado anteriormente no atraso do backend de 100 intervalos de tempo (cada um com duração dt) em vez dos intervalos de tempo esperados ( 100e-6 / dt). Isso foi corrigido para que a função
qiskit.compiler.transpile()converta corretamente as unidades.
Outras observações
- Os snapshots de todos os backends falsos/mock em
qiskit.test.mockforam atualizados para refletir as alterações recentes nos dispositivos. Isso inclui uma alteração no atributobasis_gatespara o atributoBackendConfigurationpara['cx', 'rz', 'sx', 'x', 'id'], a adição de uma propriedadereadout_lengthàs propriedades do qubit noBackendPropertiese a atualização doPulseDefaultspara que todos os backends de simulação suportem instâncias baseadas em pulso paramétricoInstructionScheduleMapinstâncias.
Aer 0.8.0
Prelúdio
A versão 0.8 inclui vários novos recursos e correções de bugs. Os destaques desta versão são: a introdução de um backend unificado do AerSimulator para executar simulações de circuitos usando qualquer um dos métodos de simulação suportados; uma biblioteca de instruções do simulador (qiskit.providers.aer.library) que inclui instruções personalizadas para salvar vários tipos de dados do simulador; suporte a MPI para executar grandes simulações em um ambiente de computação distribuída.
Novos Recurso
-
Python 3.9 foi adicionado a esta versão. Agora você pode executar o Qiskit Aer usando Python 3.9 sem construir a partir da fonte.
-
Adicione o sinalizador do CMake
DISABLE_CONAN(padrão=``OFF```)s. Ao instalar a partir do código-fonte, definir isso comoONpermite ignorar o gerenciador de pacotes Conan para encontrar bibliotecas que já estejam instaladas em seu sistema. Isso também está disponível como uma variável de ambienteDISABLE_CONAN, que tem precedência sobre o sinalizador do CMake. Esse não é o procedimento oficial para criar o AER. Portanto, o usuário é responsável por fornecer todas as bibliotecas necessárias e os arquivos correspondentes para que possam ser encontrados pelo CMake. -
Essa versão inclui suporte para a criação do qiskit-aer com suporte a MPI para executar grandes simulações em um ambiente de computação distribuída. Consulte o guia de contribuição para obter instruções sobre a criação e a execução em um ambiente MPI.
-
Agora é possível criar o qiskit-aer com o CUDA ativado no Windows. Consulte o guia de contribuição para obter instruções sobre a compilação a partir do código-fonte com suporte a GPU.
-
Ao compilar a extensão qiskit-aer Python a partir da fonte, várias dependências de compilação precisam ser pré-instaladas para permitir a compilação do C++. Para conveniência do usuário, ao criar a extensão, qualquer uma dessas dependências de compilação que estivesse faltando seria instalada automaticamente usando
pipantes das etapas normais de instalação dosetuptools. No entanto, anteriormente não era possível evitar essa instalação automática. Para resolver esse problema, uma nova variável de ambienteDISABLE_DEPENDENCY_INSTALLfoi adicionada. Se estiver definido como1ouONao compilar a extensão python a partir da fonte, isso desativará a instalação automática dessas dependências de compilação ausentes. -
Adiciona suporte para a porta Pauli de N-qubit otimizada (
qiskit.circuit.library.PauliGate) aos sitesStatevectorSimulator,UnitarySimulator, e aos métodos de matriz de densidade e vetor de estado dos sitesQasmSimulatoreAerSimulator. -
O método
run()para os backendsAerSimulator,QasmSimulator,StatevectorSimulatoreUnitarySimulatoragora aceita umQuantumCircuit(ou uma lista de objetosQuantumCircuitobjetos) como entrada. O objetoQasmQobjainda é suportado por enquanto, mas será descontinuado em uma versão futura.Para obter um exemplo de como usar isso, consulte:
from qiskit import transpile, QuantumCircuit from qiskit.providers.aer import Aer backend = Aer.get_backend('aer_simulator') circuit = QuantumCircuit(2) qc.h(0) qc.cx(0, 1) qc.measure_all() tqc = transpile(circuit, backend) result = backend.run(tqc, shots=4096).result() -
O método
run()para o backendPulseSimulatoragora aceita umSchedule(ou uma lista de objetosScheduleobjetos) como entrada. O objetoPulseQobjainda é suportado por enquanto, mas será descontinuado em uma versão futura. -
Adiciona o novo back-end do simulador
AerSimulatorcom suporte aos seguintes métodos de simulaçãoautomaticstatevectorstabilizerdensity_matrixmatrix_product_stateunitarysuperop
O método automático padrão escolherá automaticamente um método de simulação separadamente para cada circuito de execução com base nas instruções do circuito e no modelo de ruído (se houver). A inicialização de um simulador com um método específico pode ser feita usando a opção de método.
A simulação de GPU para os métodos de vetor de estado, matriz de densidade e unitário pode ser ativada com a configuração da opção de backend
device='GPU'.Observe que os métodos
unitaryesuperopnão são compatíveis com a medição, pois simulam a matriz unitária ou a matriz de superoperador do circuito de execução; portanto, uma das novas instruçõessave_unitary(),save_superop()ousave_state()deve ser usada para salvar o estado do simulador nos resultados retornados. Da mesma forma, o estado dos outros métodos de simulação pode ser salvo usando as instruções apropriadas. Consulte os documentos da APIqiskit.providers.aer.librarypara obter mais detalhes.Observe que o simulador
AerSimulatorsubstitui os backendsQasmSimulator,StatevectorSimulatoreUnitarySimulator, que serão descontinuados em uma versão futura. -
Atualiza a classe
AerProviderpara incluir vários backendsAerSimulatorpré-configurados para todos os métodos de simulação e dispositivos de simulação disponíveis. Os novos back-ends podem ser acessados por meio da interface do provedor usando os nomes"aer_simulator""aer_simulator_statevector""aer_simulator_stabilizer""aer_simulator_density_matrix""aer_simulator_matrix_product_state""aer_simulator_extended_stabilizer""aer_simulator_unitary""aer_simulator_superop"
Além disso, se o Aer tiver sido instalado com suporte a GPU em um sistema compatível, os seguintes back-ends de GPU também estarão disponíveis
"aer_simulator_statevector_gpu""aer_simulator_density_matrix_gpu""aer_simulator_unitary_gpu"
Por exemplo:
from qiskit import Aer # Get the GPU statevector simulator backend backend = Aer.get_backend('aer_simulator_statevector_gpu') -
Adição de um novo método
norm estimationpara realizar medições ao usar o método de simulação"extended_stabilizer". Esse método de estimativa de norma pode ser usado passando as seguintes opções para os backendsAerSimulatoreQasmSimulatorsimulator = QasmSimulator( method='extended_stabilizer', extended_stabilizer_sampling_method='norm_estimation')O método de estimativa de norma é mais lento do que as opções alternativas
metropolisouresampled_metropolis, mas oferece melhor desempenho em circuitos com distribuições de saída esparsas. Consulte a documentação do siteQasmSimulatorpara obter mais informações. -
Adiciona instruções para salvar o estado do simulador em vários formatos. Essas instruções são
qiskit.providers.aer.library.SaveDensityMatrixqiskit.providers.aer.library.SaveMatrixProductStateqiskit.providers.aer.library.SaveStabilizerqiskit.providers.aer.library.SaveStateqiskit.providers.aer.library.SaveStatevectorqiskit.providers.aer.library.SaveStatevectorDictqiskit.providers.aer.library.SaveUnitary
Essas instruções podem ser anexadas a um circuito quântico usando os métodos de circuito
save_density_matrix,save_matrix_product_state,save_stabilizer,save_state,save_statevector,save_statevector_dict,save_unitaryque são adicionados aQuantumCircuitao importar o Aer.Consulte a documentação da API
qiskit.providers.aer.librarypara obter detalhes sobre a compatibilidade de métodos para cada instrução.Observe que as instruções de snapshot
SnapshotStatevector,SnapshotDensityMatrix,SnapshotStabilizerainda são compatíveis, mas serão preteridas em uma versão futura. -
Adiciona as instruções de circuito quântico
qiskit.providers.aer.library.SaveExpectationValueeqiskit.providers.aer.library.SaveExpectationValueVariancepara salvar o valor de expectativa , ou o valor de expectativa e a variação , de um operador hermitiano para o estado do simulador . Essas instruções podem ser anexadas a um circuito quântico usando os métodos de circuitosave_expectation_valueesave_expectation_value_varianceque são adicionados aQuantumCircuitao importar Aer.Observe que a instrução de instantâneo
SnapshotExpectationValue, ainda é compatível, mas será preterida em uma versão futura. -
Adiciona as instruções de circuito quântico
qiskit.providers.aer.library.SaveProbabilitieseqiskit.providers.aer.library.SaveProbabilitiesDictpara salvar todas as probabilidades de resultados de medição para medições de base Z do estado do simulador. Essas instruções podem ser anexadas a um circuito quântico usando os métodos de circuitosave_probabilitiesesave_probabilities_dict, que são adicionados aQuantumCircuitao importar o Aer.Observe que a instrução de instantâneo
SnapshotProbabilities, ainda é compatível, mas será preterida em uma versão futura. -
Adiciona as instruções de circuito
qiskit.providers.aer.library.SaveAmplitudeseqiskit.providers.aer.library.SaveAmplitudesSquaredpara salvar amplitudes de vetores de estado complexos selecionados ou selecionar probabilidades (amplitudes ao quadrado) para métodos de simulação compatíveis. Essas instruções podem ser anexadas a um circuito quântico usando os métodos de circuitosave_amplitudesesave_amplitudes_squared, que são adicionados aQuantumCircuitao importar o Aer. -
Adiciona instruções para definir o estado dos simuladores. Essas instruções devem ser definidas no número total de qubits do circuito. Eles podem ser aplicados em qualquer ponto de um circuito e substituirão o estado do simulador pelo especificado. As instruções adicionadas são
qiskit.providers.aer.library.SetDensityMatrixqiskit.providers.aer.library.SetStabilizerqiskit.providers.aer.library.SetStatevectorqiskit.providers.aer.library.SetUnitary
Essas instruções podem ser anexadas a um circuito quântico usando os métodos de circuito
set_density_matrix,set_stabilizer,set_statevector,set_unitaryque são adicionados aQuantumCircuitao importar o Aer.Consulte a documentação da API
qiskit.providers.aer.librarypara obter detalhes sobre a compatibilidade de métodos para cada instrução. -
Foi adicionado suporte a portas diagonais ao método de simulação
"matrix_product_state". -
Foi adicionado suporte à instrução
initializeao método de simulação"matrix_product_state".
Problemas Conhecidos
- Há um problema conhecido em que a simulação de determinados circuitos com um modelo de ruído Kraus usando o método de simulação
"matrix_product_state"pode causar o travamento do simulador. Consulte o item 306 para obter mais informações.
Notas da Atualização
-
A versão mínima do Conan foi aumentada para 1.31.2. Isso foi necessário para corrigir um problema de compatibilidade com versões mais recentes do urllib3 (que é uma dependência do Conan). Ele também adiciona suporte nativo para AppleClang 12, o que é útil para usuários com novos computadores Apple.
-
pybind11a versão mínima necessária é 2.6 em vez de 2.4. Isso é necessário para dar suporte à compilação habilitada para CUDA no Windows. -
O Cython foi removido como uma dependência de compilação.
-
Removida a decomposição do portão x90 dos modelos de ruído que estavam obsoletos no qiskit-aer 0.7. Essa decomposição agora é feita com o uso de portas de base de modelo de ruído regular e o transpilador qiskit.
-
As seguintes opções do método de simulação
"extended_stabilizer"foram alteradas.extended_stabilizer_measure_sampling: Essa opção foi substituída pelas opçõesextended_stabilizer_sampling_method, que controla como simulamos a medição de qubit.extended_stabilizer_mixing_time: Essa opção foi renomeada comoextended_stabilizer_metropolis_mixing_timepara esclarecer que só se aplica aos métodos de amostragemmetropoliseresampled_metropolis.extended_stabilizer_norm_estimation_samples: Essa opção foi renomeada paraextended_stabilizer_norm_estimation_default_samples.
Foi acrescentada uma opção adicional,
extended_stabilizer_norm_estimation_repetitions, que controla parte do comportamento do método de amostragem de estimativa de norma.
Notas de descontinuação
- Python 3.6 foi preterido e será removido em uma versão futura. Quando o suporte for removido, será necessário atualizar a versão Python que você está usando para Python 3.7 ou superior.
Correções de bugs
- Corrige o bug com
AerProvider, em que as opções definidas nos backends retornados usandoset_options()eram armazenadas no provedor e persistiam nas chamadas subsequentes paraget_backend()para o mesmo backend nomeado. Agora, cada chamada parabackends()retorna uma nova instância do backend do simulador que pode ser configurado. - Corrige o bug na mensagem de erro retornada quando um circuito contém instruções de simulador não suportadas. Anteriormente, algumas instruções com suporte também estavam sendo listadas na mensagem de erro junto com as instruções sem suporte.
- Corrige o problema com a configuração de
QasmSimulatorbasis gates ao usar as opções"method"e"noise_model"juntas e ao usá-las com um simulador construído usandofrom_backend(). Agora, os portões básicos listados serão a interseção dos portões suportados pela configuração de back-end, pelo método de simulação e pelos portões básicos do modelo de ruído. Se a interseção das portas de base do modelo de ruído e das portas de base do simulador estiver vazia, um aviso será registrado. - Correção do erro em que a porta
"sx"`SXGatenão era listada como uma porta suportada no código C++, emStateOpSetdematrix_product_state.hp. - Corrigir o erro em que
"csx","cu2","cu3"estavam incorretamente listados como portas de base compatíveis com o método"density_matrix"doQasmSimulator. - Correção do bug em que os parâmetros eram passados incorretamente entre as funções em
matrix_product_state_internal.cpp, causando simulação incorreta e atingindo estados inválidos, o que, por sua vez, causava um loop infinito. - Corrige um bug que fazia com que o
c_ifnão funcionasse quando a largura do registro condicional era maior que 64. Consulte #1077. - Corrige um bug (nº 1153 ) em que o ruído em portas condicionais estava sempre sendo aplicado, independentemente de a porta condicional ter sido realmente aplicada com base no valor do registro clássico. Agora, o ruído em uma porta condicional só será aplicado no caso em que a porta condicional for aplicada.
- Corrige um bug com o sinalizador OpenMP aninhado que estava sendo definido como verdadeiro quando não deveria.
- Corrige um erro ao aplicar o truncamento no método de estado do produto da matriz do site QasmSimulator.
- Corrigido o problema nº 1126 : erro ao relatar a medição de um único qubit. O erro ocorria ao copiar o valor medido para a estrutura de dados de saída.
- No MPS, o apply_kraus estava operando diretamente nos bits de entrada nos qubits de parâmetro, em vez de nos qubits internos. No algoritmo MPS, os qubits estão em constante movimento, portanto, todas as operações devem ser aplicadas aos qubits internos.
- Ao invocar MPS::sample_measure, precisamos primeiro classificar os qubits de acordo com a ordenação padrão, pois essa é a suposição em qasm_controller.This. Isso é feito invocando o método move_all_qubits_to_sorted_ordering. Ele estava correto em sample_measure_using_apply_measure, mas ausente em sample_measure_using_probabilities.
- Corrige o erro no método
from_backend()doQasmSimulatorque definia o atributolocalda configuração como o valor de backend em vez de sempre ser definido comoTrue. - Corrige um erro em
from_backend()efrom_backend(), em quebasis_gatesera definido incorretamente para dispositivos IBMQ com o conjunto de portas de base['id', 'rz', 'sx', 'x', 'cx']. Agora, o modelo de ruído sempre terá as mesmas portas de base que as portas de base de backend, independentemente de essas instruções terem erros no modelo de ruído ou não. - Corrige um problema em que o método de simulação estendido "extended_stabilizer" apresentava resultados incorretos em circuitos quânticos com distribuições de saída esparsas. Consulte o item 306 para obter mais informações e exemplos.
Ignis 0.6.0
Novos Recurso
- A função
qiskit.ignis.mitigation.expval_meas_mitigator_circuits()foi aprimorada para que o número de circuitos gerados pela função usada para calibração pelo método CTMP seja reduzido de para (em que é o número de qubits).
Notas da Atualização
- A função
qiskit.ignis.verification.randomized_benchmarking_seq()agora está usando a classe CNOTDihedral atualizada,qiskit.ignis.verification.CNOTDihedral, que permite realizar o CNOT-Dihedral Randomized Benchmarking em mais de dois qubits. - O pacote python
retworkxagora é um requisito para a instalação do qiskit-ignis. Ele substitui o uso anterior donetworkx(que não é mais um requisito) para obter melhor desempenho. - A dependência
scikit-learnnão é mais necessária e agora é um requisito opcional. Se estiver usando os discriminadores de medição de QI (IQDiscriminationFitter,LinearIQDiscriminationFitter,QuadraticIQDiscriminationFitter, ouSklearnIQDiscriminator), você precisará instalar manualmente o scikit-learn, executandopip install scikit-learnou quando também estiver instalando o qiskit-ignis compip install qiskit-ignis[iq].
Correções de bugs
- Foi corrigido um problema no método de valor de expectativa
expectation_value(), para as classes de atenuação de errosTensoredExpvalMeasMitigatoreCTMPExpvalMeasMitigator, se o kwargqubitsnão fosse especificado, ele usaria incorretamente o número total de qubits do atenuador, em vez do número de bits clássicos no dicionário de contagem, o que reduziria muito o desempenho. Corrigido #561 - Corrija o método
"auto"dos sitesTomographyFitter,StateTomographyFittereProcessTomographyFitterpara usar apenas o"cvx"se o CVXPY estiver instalado e um solver SDP de terceiros que não seja o SCS estiver disponível. Isso ocorre porque o solucionador SCS tem uma precisão menor do que outros métodos de solucionador e, muitas vezes, retorna uma matriz de densidade ou matriz Choi que não é completamente positiva e falha na validação quando usada com o métodoqiskit.quantum_info.state_fidelity()ouqiskit.quantum_info.process_fidelity().
Aqua 0.9.0
Esta versão descontinua oficialmente o projeto Qiskit Aqua. No futuro (não antes de 3 meses a partir desta versão), o projeto Aqua terá sua versão final e será arquivado. Todas as funcionalidades que o qiskit-aqua oferece foram migradas para novos pacotes ou para outros pacotes do qiskit. Os módulos de aplicativos que são fornecidos pelo qiskit-aqua foram divididos em vários novos pacotes: qiskit-optimization, qiskit-nature, qiskit-machine-learning, e qiskit-finance. Esses pacotes podem ser instalados sozinhos (por meio do comando pip install padrão, ou seja, pip install qiskit-nature) ou com o restante do metapacote do Qiskit como extras opcionais (ou seja, pip install 'qiskit[finance,optimization]' ou pip install 'qiskit[all]'. Os principais blocos de construção de algoritmos e o fluxo do operador agora existem como parte do qiskit-terra em qiskit.algorithms e qiskit.opflow. Dependendo do seu uso atual do Aqua, você deve usar os pacotes de aplicativos ou os novos módulos no Qiskit Terra.
Para obter mais detalhes sobre como migrar do uso do Qiskit Aqua, consulte o guia de migração.
IBM 0.12.2
Nenhuma mudança