Notas de versão do Qiskit 0.20
0.20.1
Terra 0.15.2
Correções de bugs
- Ao acessar o atributo
definitionde uma instânciaGateparametrizada, oQuantumCircuitgerado tinha sido gerado com umParameterTableinválido, de modo que a leitura deQuantumCircuit.parametersou a chamada deQuantumCircuit.bind_parametersinformaria incorretamente os parâmetros não vinculados. Isto foi resolvido. SXGate().inverse()havia retornado anteriormente uma porta 'sx_dg' com umdefinitioncorreto, mas umto_matrixincorreto. Isso foi atualizado de forma queSXGate().inverse()retorna umSXdgGate()e vice-versa.Instruction.inverse()quando não substituído por uma subclasse, em alguns casos retornaria uma instância deGatecom um métodoto_matrixincorreto. As instâncias dos métodosto_matrixincorretos foram removidas.- Para
C3XGatecom umanglediferente de zero, a inversão da porta viaC3XGate.inverse()gerou anteriormente uma porta inversa incorreta. Isso foi corrigido. - Os modos de
MCXGateforam atualizados para retornar uma porta do mesmo modo ao chamar.inverse(). Isso resolve um problema em que, em alguns casos, a transpilação de um circuito contendo o inverso de uma portaMCXVChaingerava um erro. - Anteriormente, ao criar uma porta de fase controlada por múltiplos via
PhaseGate.control, uma portaMCU1Gateera retornada. Isso foi corrigido para que umMCPhaseGateseja retornado. - Anteriormente, a tentativa de decompor um circuito contendo um
MCPhaseGategerava um erro devido a uma inconsistência na definição doMCPhaseGate. Isso foi corrigido. QuantumCircuit.composeeDAGCircuit.composetinham, em alguns casos, traduzido incorretamente as portas condicionais se o circuito de entrada contivesse mais de umClassicalRegister. Isto foi resolvido.- Foi corrigido um problema ao criar um objeto
qiskit.result.Countsa partir de um dicionário de dados vazio. Agora, isso criará um objetoCountsvazio. O métodomost_frequent()também foi atualizado para gerar uma exceção mais descritiva quando o objeto estiver vazio. Correções #5017 - A extensão de circuitos com registros diferentes atualizou as propriedades
qregsecregsde acordo, mas não as listasqubitseclbits. Como eles não são mais gerados a partir dos registros, mas são listas armazenadas em cache, isso leva a uma discrepância de registros e bits. Isso foi corrigido e o métodoextendatualiza explicitamente as listas de bits armazenadas em cache. - Corrija os erros das implementações concretas do método meth:~qiskit.circuit.ControlledGate.inverse que não preservam o parâmetro
ctrl_state. - Foi corrigido um bug que fazia com que programações de pulsos longos gerassem um erro de recursão.
Aer 0.6.1
Nenhuma mudança
Ignis 0.4.0
Nenhuma mudança
Aqua 0.7.5
Nenhuma mudança
IBM 0.8.0
Nenhuma mudança
0.20.0
Terra 0.15.1
Prelúdio
A versão 0.15.0 inclui vários novos recursos e correções de bugs. Alguns destaques desse lançamento são:
Essa versão inclui a introdução da tradução de base arbitrária para o transpilador. Isso inclui suporte para direcionar diretamente uma gama mais ampla de conjuntos de base de dispositivos, por exemplo, backends que implementam portas RZ, RY, RZ, CZ ou iSwap.
A classe QuantumCircuit agora rastreia a fase global. Isso significa que o controle de um circuito que tem fase global agora adiciona corretamente uma fase relativa, e as definições de matriz de porta agora são exatas em vez de iguais a uma fase global.
Novos Recurso
-
Uma nova classe DAG
qiskit.dagcircuit.DAGDependencypara representar a forma de dependência do circuito. Nesse DAG, os nós são operações (portas, medidas, barreiras, etc.) e as bordas correspondem à não comutação entre duas operações. -
Quatro novas funções foram adicionadas ao
qiskit.converterspara conversão de ida e volta paraDAGDependency. Essas funções são:circuit_to_dagdependency()para converter de um objetoQuantumCircuitpara um objetoDAGDependencyobjeto.dagdependency_to_circuit()para converter de um objetoDAGDependencypara um objetoQuantumCircuitobjeto.dag_to_dagdependency()para converter de um objetoDAGCircuitpara um objetoDAGDependencyobjeto.dagdependency_to_dag()para converter de um objetoDAGDependencypara um objetoDAGCircuitobjeto.
Por exemplo:
from qiskit.converters.dagdependency_to_circuit import dagdependency_to_circuit from qiskit import QuantumRegister, ClassicalRegister, QuantumCircuit circuit_in = QuantumCircuit(2) circuit_in.h(qr[0]) circuit_in.h(qr[1]) dag_dependency = circuit_to_dagdependency(circuit_in) circuit_out = dagdepency_to_circuit(dag_dependency) -
Dois novos passes de transpiladores foram adicionados ao
qiskit.transpiler.passesA primeira,UnrollCustomDefinitions, desenrola todas as instruções no circuito de acordo com suas propriedadesdefinitionparando ao atingir o endereçobasis_gatesespecificado ou um conjunto de portas na propriedadeEquivalenceLibrary. A segunda,BasisTranslatorusa o conjunto de traduções noEquivalenceLibrarypara reescrever as instruções do circuito em uma base específica. -
Um novo argumento da palavra-chave
translation_methodfoi adicionado atranspile()para permitir a seleção do método a ser usado para traduzir os circuitos para as portas de dispositivos disponíveis. Por exemplo,transpile(circ, backend, translation_method='translator'). As opções válidas são:'unroller': para usar oUnrollerpasse'translator': para usar oBasisTranslatorpassar.'synthesis': para usar oUnitarySynthesispassar.
O valor padrão é
'translator'. -
Uma nova classe para lidar com dados de resultados de contagens,
qiskit.result.Countsfoi adicionada. Essa classe é uma subclasse dedicte pode ser interagida como qualquer outro dicionário. No entanto, ele inclui métodos e atributos auxiliares para lidar com resultados de contagens de experimentos e também lida com o pós-processamento e a formatação de strings binárias na inicialização do objeto. ACountspode ser criado passando um dicionário de contagens com as chaves sendo números inteiros, cadeias hexadecimais do formato'0x4a', cadeias binárias do formato'0b1101', uma cadeia de bits formatada em slots de registro e memória (ou seja,'00 10') ou uma cadeia dit. Por exemplo:from qiskit.result import Counts counts = Counts({"0x0': 1, '0x1', 3, '0x2': 1020}) -
Um novo método para a construção de objetos
qiskit.dagcircuit.DAGCircuitfoi adicionado,from_networkx(). Esse método recebe um objeto networkxMultiDiGraph(no formato retornado porto_networkx()) e retorna um novo objetoDAGCircuitobjeto. A intenção por trás dessa função é permitir que os autores de passagens de transpiladores aproveitem a biblioteca de algoritmos de gráficos da networkx se uma função estiver faltando na API da retworkx. No entanto, espera-se que, nesses casos, um problema seja aberto no rastreador de problemas do retworkx (ou, melhor ainda, que seja enviada uma solicitação pull). -
Um novo kwarg para
init_qubitsfoi adicionado aassemble()eexecute(). Para backends compatíveis com esse recurso,init_qubitspode ser usado para controlar se o backend que executa os circuitos insere sequências de inicialização no início de cada disparo. Por padrão, isso é definido comoTrue, o que significa que todos os qubits podem ser considerados no estado fundamental no início de cada disparo. No entanto, quandoinit_qubitsestiver definido comoFalse, os qubits não serão inicializados no início de cada experimento e entre os disparos. Observe que o backend que executa os circuitos precisa oferecer suporte a esse recurso para que esse sinalizador tenha algum efeito. -
Um novo kwarg
rep_delayfoi adicionado aqiskit.compiler.assemble()qiskit.execute.execute(), e ao construtor dePulseQobjtConfig.qiskit Esse novo kwarg é usado para indicar o tempo entre as execuções do programa. Ele deve ser escolhido na lista de valores válidos definidos comorep_delaysem um objetoPulseBackendConfigurationque pode ser acessado comobackend.configuration().rep_delays).O kwarg
rep_delaysó funcionará em backends que permitem o tempo de repetição dinâmico. Isso também será indicado no objetoPulseBackendConfigurationpara um backend como o atributodynamic_reprate_enabled. Sedynamic_reprate_enabledforFalse, o valorrep_timeespecificado paraqiskit.compiler.assemble()qiskit.execute.execute(), ou o construtor paraPulseQobjtConfigserá usado em vez derep_delay.rep_timepermite apenas que os usuários especifiquem a duração de um programa, e não o atraso entre os programas. -
O arquivo
qobj_schema.jsonJSON Schema emqiskit.schemasfoi atualizado para incluir orep_delaycomo uma propriedade de configuração opcional para qobjs de pulso. -
O arquivo
backend_configuration_schema.jsonJSON Schema em mod:qiskit.schemas foi atualizado para incluirrep_delay_rangeedefault_rep_delaycomo propriedades opcionais para uma configuração de backend de pulso. -
Um novo atributo,
global_phaseque é usado para rastrear a fase global, foi adicionado à classeqiskit.circuit.QuantumCircuitclasse. Por exemplo:import math from qiskit import QuantumCircuit circ = QuantumCircuit(1, global_phase=math.pi) circ.u1(0)A fase global também pode ser alterada ou consultada com
circ.global_phaseno exemplo acima. Em ambos os casos, a configuração é em radianos. Se o circuito for convertido em uma instrução ou porta, a fase global será representada por duas rotações de um único qubit no primeiro qubit.Isso permite que outros métodos e funções que consomem um objeto
QuantumCircuitlevem em conta a fase global. Por exemplo, com o atributoglobal_phaseatributo o métodoto_matrix()para uma porta agora pode corresponder exatamente às suas decomposições em vez de apenas até uma fase global.O mesmo atributo também foi adicionado à classe
DAGCircuitpara que a fase global possa ser rastreada durante a conversão entreQuantumCircuiteDAGCircuit. -
Duas novas classes,
AncillaRegistereAncillaQubitforam adicionadas ao móduloqiskit.circuitmódulo. Essas são subclasses deQuantumRegistereQubitrespectivamente, e permitem marcar os qubits como ancilares. Isso permitirá que esses qubits sejam reutilizados em circuitos e algoritmos maiores. -
Um novo método,
control()foi adicionado ao métodoQuantumCircuit. Esse método retornará uma versão controlada do objetoQuantumCircuitcom controles abertos e fechados. Anteriormente, essa funcionalidade só era acessível por meio da classeGateclasse. -
Um novo método
repeat()foi adicionado à classeQuantumCircuitclasse. Ele retorna um novo objeto de circuito contendo um número especificado de repetições do circuito original. Por exemplo:from qiskit.circuit import QuantumCircuit qc = QuantumCircuit(2) qc.h(0) qc.cx(0, 1) repeated_qc = qc.repeat(3) repeated_qc.decompose().draw(output='mpl')Os parâmetros são copiados por referência, o que significa que, se você atualizar os parâmetros em uma instância do circuito, todas as repetições serão atualizadas.
-
Um novo método
reverse_bits()foi adicionado à classeQuantumCircuitclasse. Esse método inverterá a ordem dos bits em um circuito (bits quânticos e clássicos). Isso pode ser usado para alternar um circuito de little-endian para big-endian e vice-versa. -
Um novo método,
combine_into_edge_map()foi adicionado à classeqiskit.transpiler.Layoutclasse. Esse método permite a conversão de dois objetosLayoutobjetos em um mapa de qubit para compor dois circuitos. -
Uma nova classe,
ConfigurableFakeBackend, foi adicionada ao móduloqiskit.test.mock.utils. Essa nova classe permite a criação de back-ends simulados configuráveis para uso em testes. Por exemplo:from qiskit.test.mock.utils import ConfigurableFakeBackend backend = ConfigurableFakeBackend("Tashkent", n_qubits=100, version="0.0.1", basis_gates=['u1'], qubit_t1=99., qubit_t2=146., qubit_frequency=5., qubit_readout_error=0.01, single_qubit_gates=['u1'])criará um objeto backend com 100 qubits e todos os outros parâmetros especificados no construtor.
-
Um novo método
draw()foi adicionado à classeqiskit.circuit.EquivalenceLibraryclasse. Esse método pode ser usado para desenhar o conteúdo de uma biblioteca de equivalência, o que pode ser útil para a depuração. Por exemplo:from numpy import pi from qiskit.circuit import EquivalenceLibrary from qiskit.circuit import QuantumCircuit from qiskit.circuit import QuantumRegister from qiskit.circuit import Parameter from qiskit.circuit.library import HGate from qiskit.circuit.library import U2Gate from qiskit.circuit.library import U3Gate my_equiv_library = EquivalenceLibrary() q = QuantumRegister(1, 'q') def_h = QuantumCircuit(q) def_h.append(U2Gate(0, pi), [q[0]], []) my_equiv_library.add_equivalence(HGate(), def_h) theta = Parameter('theta') phi = Parameter('phi') lam = Parameter('lam') def_u2 = QuantumCircuit(q) def_u2.append(U3Gate(pi / 2, phi, lam), [q[0]], []) my_equiv_library.add_equivalence(U2Gate(phi, lam), def_u2) my_equiv_library.draw() -
Uma nova instrução de fase,
SetPhase, foi adicionada aoqiskit.pulse. Essa instrução define a fase dos pulsos subsequentes como a fase especificada (em radianos). Por exemplo:import numpy as np from qiskit.pulse import DriveChannel from qiskit.pulse import Schedule from qiskit.pulse import SetPhase sched = Schedule() sched += SetPhase(np.pi, DriveChannel(0))Nesse exemplo, a fase dos pulsos aplicados a
DriveChannel(0)após a instruçãoSetPhaseserá definida como radianos. -
Uma nova instrução de pulso
ShiftFrequencyfoi adicionada aoqiskit.pulse.instructions. Essa instrução permite mudar a frequência de um canal a partir de sua frequência definida. Por exemplo:from qiskit.pulse import DriveChannel from qiskit.pulse import Schedule from qiskit.pulse import ShiftFrequency sched = Schedule() sched += ShiftFrequency(-340e6, DriveChannel(0))Nesse exemplo, todos os pulsos aplicados a
DriveChannel(0)após o comandoShiftFrequencyterão a frequência do envelope diminuída por 340MHz. -
Um novo método
conjugate()foi adicionado à classeParameterExpressionclasse. Isso permite chamarnumpy.conj()sem gerar um erro. Como umParameterExpressioné real, ele retornará a si mesmo. Esse comportamento é análogo ao de Python floats/ints. -
Uma nova classe
PhaseEstimationfoi adicionada aoqiskit.circuit.library. Essa classe da biblioteca de circuitos é o circuito usado na formulação original do algoritmo de estimativa de fase em arXiv:quant-ph/9511026. A estimativa de fase é a tarefa de estimar a fase de um valor próprio de um operador unitário , com o estado próprio correspondente . Ou seja
Essa estimativa (e, portanto, esse circuito) é uma rotina central de vários algoritmos conhecidos, como o algoritmo de Shor ou a estimativa de amplitude quântica.
-
A função
qiskit.visualizationfunçãoplot_state_qsphere()tem um novo kwargshow_state_labelsque é usado para controlar se cada bolha na visualização do qsphere é rotulada. Por padrão, esse kwarg é definido comoTruee mostra os estados básicos ao lado de cada bolha por padrão. Esse recurso pode ser desativado, voltando ao comportamento anterior, definindo o kwargshow_state_labelscomoFalse. -
A função
qiskit.visualizationfunçãoplot_state_qsphere()tem um novo kwargshow_state_phasesque é definido comoFalsepor padrão. Quando definido comoTrue, exibe a fase de cada estado da base. -
A função
qiskit.visualizationfunçãoplot_state_qsphere()tem um novo kwarguse_degreesque é definido comoFalsepor padrão. Quando definido comoTrue, ele exibe a fase de cada estado da base em graus, juntamente com o círculo de fase no canto inferior direito. -
Uma nova classe,
QuadraticFormpara o móduloqiskit.circuit.librarypara implementar uma forma quadrática em variáveis binárias. O elemento da biblioteca de circuitos implementa a operação
para a forma quadrática e qubits de saída. O resultado está no qubits de saída codificados em complemento de dois. Se não for especificado, o circuito escolherá o número mínimo de qubits necessários para representar o resultado sem aplicar uma operação de módulo. A forma quadrática é especificada usando uma matriz para os termos quadráticos, um vetor para os termos lineares e um deslocamento constante. Se todos os termos forem inteiros, o circuito implementará a forma quadrática exatamente; caso contrário, será apenas uma aproximação.
Por exemplo:
import numpy as np
from qiskit.circuit.library import QuadraticForm
A = np.array([[1, 2], [-1, 0]])
b = np.array([3, -3])
c = -2
m = 4
quad_form_circuit = QuadraticForm(m, A, b, c)-
Adicionar
qiskit.quantum_info.Statevector.expectation_value()eqiskit.quantum_info.DensityMatrix.expectation_value()métodos para calcular o valor de expectativa de umqiskit.quantum_info.Operator. -
Para o
seedkwarg no construtor de objetosqiskit.circuit.library.QuantumVolumeos objetos do gerador aleatório numpy agora podem ser usados. Anteriormente, apenas números inteiros eram uma entrada válida. Isso é útil ao integrar oQuantumVolumecomo parte de uma função maior com sua própria geração de números aleatórios, por exemplo, gerar uma sequência deQuantumVolumecircuitos. -
O método
QuantumCircuitmétodocompose()tem um novo kwargfrontque pode ser usado para anexar o outro circuito antes do circuito de origem em vez de anexar. Por exemplo:from qiskit.circuit import QuantumCircuit circ1 = QuantumCircuit(2) circ2 = QuantumCircuit(2) circ2.h(0) circ1.cx(0, 1) circ1.compose(circ2, front=True).draw(output='mpl') -
Dois novos passes,
SabreLayouteSabreSwappara layout e roteamento foram adicionados aoqiskit.transpiler.passes. Essas novas passagens são baseadas no algoritmo apresentado em Li et al, "Enfrentando o problema de mapeamento de Qubit para dispositivos quânticos da era NISQ", ASPLOS 2019. Eles também podem ser selecionados ao usar a funçãotranspile()definindo o kwarglayout_methodcomo'sabre'e/ou orouting_methodcomo'sabre'para usarSabreLayouteSabreSwaprespectivamente. -
Adicionado o método
replace()à classeqiskit.pulse.Scheduleque permite que uma instrução de pulso seja substituída por outra. Por exemplo:.. code-block:: pythonfrom qiskit import pulse
d0 = pulse.DriveChannel(0)
sched = pulse.Schedule ()
antigo = pulse.Play ( pulse.Constant (100, 1.0 ), d0 ) novo = pulse.Play ( pulse.Constant (100, 0.1 ), d0 )
programação += antigo
sched = sched.replace (antigo, novo)
assert sched == pulse.Schedule (new)
-
Adicionadas novas classes de porta para
qiskit.circuit.librarypara as portas , seu adjunto e controlado comoSXGate,SXdgGate, eCSXGate. Eles também podem ser adicionados a um objetoQuantumCircuitusando as teclassx(),sxdg(), ecsx()respectivamente. -
Adicionar suporte a
Resetinstruções paraqiskit.quantum_info.Statevector.from_instruction(). Observe que isso envolve a amostragem RNG na escolha da projeção para o estado zero no caso em que o qubit está em um estado de superposição. A semente para amostragem pode ser definida usando o métodoseed()método. -
Os métodos
qiskit.circuit.ParameterExpression.subs()eqiskit.circuit.QuantumCircuit.assign_parameters()agora aceitamParameterExpressioncomo o valor de destino a ser substituído.Por exemplo,
from qiskit.circuit import QuantumCircuit, Parameter p = Parameter('p') source = QuantumCircuit(1) source.rz(p, 0) x = Parameter('x') source.assign_parameters({p: x*x})┌──────────┐ q_0: ┤ Rz(x**2) ├ └──────────┘ -
O método
QuantumCircuit()métodoto_gate()tem um novo kwarglabelque pode ser usado para definir um rótulo para o objeto de saídaGateobjeto. Por exemplo:from qiskit.circuit import QuantumCircuit circuit_gate = QuantumCircuit(2) circuit_gate.h(0) circuit_gate.cx(0, 1) custom_gate = circuit_gate.to_gate(label='My Special Bell') new_circ = QuantumCircuit(2) new_circ.append(custom_gate, [0, 1], []) new_circ.draw(output='mpl') -
Adicionado o
UGate,CUGate,PhaseGate, eCPhaseGatecom os métodosQuantumCircuitmétodosu(),cu(),p(), ecp(). A portaUGateé a porta de rotação genérica de um único qubit com 3 ângulos de Euler e aCUGatesua versão controlada.CUGatetem 4 parâmetros para levar em conta uma possível fase global da porta U. OPhaseGateeCPhaseGatesão a porta de fase geral em um ângulo arbitrário e sua versão controlada. -
Um novo kwarg,
cregbundle, foi adicionado à funçãoqiskit.visualization.circuit_drawer()e ao métodoQuantumCircuitmétododraw(). Quando definido comoTrue, os cregs serão agrupados em uma única linha nas visualizações de circuito das gavetastextempl. O valor padrão éTrue. Resolve o problema nº 4290.Por exemplo:
from qiskit import QuantumCircuit circuit = QuantumCircuit(2) circuit.measure_all() circuit.draw(output='mpl', cregbundle=True) -
Um novo kwarg,
initial_state, foi adicionado à funçãoqiskit.visualization.circuit_drawer()e ao métodoQuantumCircuitmétododraw(). Quando definido comoTrue, o estado inicial agora será incluído nas visualizações de circuito de todos os gavetas. Resolve o problema nº 4293.Por exemplo:
from qiskit import QuantumCircuit circuit = QuantumCircuit(2) circuit.measure_all() circuit.draw(output='mpl', initial_state=True) -
Os rótulos agora serão exibidos ao usar a gaveta 'mpl'. Há dois tipos de etiquetas: etiquetas de portão e etiquetas de controle. As etiquetas do portão substituirão o nome do portão na tela. Os rótulos de controle serão exibidos acima ou abaixo dos controles de um portão. Corrige os problemas #3766, #4580 Resolve os problemas #3766 e #4580.
Por exemplo:
from qiskit import QuantumCircuit from qiskit.circuit.library.standard_gates import YGate circuit = QuantumCircuit(2) circuit.append(YGate(label='A Y Gate').control(label='Y Control'), [0, 1]) circuit.draw(output='mpl')
Notas da Atualização
-
As implementações do X Gate multicontrolado (
MCXGrayCode,MCXRecursive, eMCXVChain) tiveram suas propriedadesnamealteradas para descrever com mais precisão sua implementação:mcx_gray,mcx_recursive, emcx_vchainrespectivamente. Anteriormente, essas portas compartilhavam o nomemcxcomMCXGateo que fazia com que essas portas fossem transpiladas e simuladas incorretamente. -
Por padrão, os gerenciadores de passagens predefinidos em
qiskit.transpiler.preset_passmanagersestão usandoUnrollCustomDefinitionseBasisTranslatorpara lidar com a mudança de base em vez do padrão anteriorUnroller. Isso foi feito porque as novas passagens são mais flexíveis e permitem o direcionamento para qualquer conjunto de bases, mas o resultado pode ser diferente. Para usar o padrão anterior, você pode definir o códigotranslation_methodemtranspile()para'unroller'. -
As funções de conversão
qiskit.converters.circuit_to_gate()e :func` qiskit.converters.circuit_to_instruction\incluíam automaticamente a porta ou a instrução gerada no site ativoSessionEquivalenceLibrary. Esses conversores agora aceitam um argumento opcional de palavra-chaveequivalence_library` para especificar se e onde as instâncias convertidas devem ser registradas. O comportamento padrão foi alterado para não registrar a instância convertida. -
O valor padrão do
cregbundlekwarg para o métodoqiskit.circuit.QuantumCircuit.draw()método e funçãoqiskit.visualization.circuit_drawer()foi alterado paraTrue. Isso significa que, por padrão, os bits clássicos no diagrama de circuito agora serão agrupados por padrão, por exemplo:from qiskit.circuit import QuantumCircuit circ = QuantumCircuit(4) circ.x(0) circ.h(1) circ.measure_all() circ.draw(output='mpl')Se você quiser que o desenho do circuito mantenha o comportamento anterior e mostre cada bit clássico no diagrama, defina o kwarg
cregbundlecomoFalse. Por exemplo:from qiskit.circuit import QuantumCircuit circ = QuantumCircuit(4) circ.x(0) circ.h(1) circ.measure_all() circ.draw(output='mpl', cregbundle=False) -
Scheduleplotagem comqiskit.pulse.Schedule.draw()eqiskit.visualization.pulse_drawer()não exibirá mais a tabela de eventos por padrão. Isso pode ser reativado definindo o kwargtablecomoTrue. -
O passe
RemoveResetInZeroStatefoi incluído anteriormente no gerenciador de passes predefinidoslevel_0_pass_manager()que era usado com as funçõesoptimization_level=0fortranspile()eexecute(). No entanto,RemoveResetInZeroStateé um passe de otimização e não deveria ter sido incluído no nível de otimização 0 e foi removido. Se você precisar executar otranspile()comRemoveResetInZeroStateuse um gerenciador de passes personalizado ou o siteoptimization_level1, 2 ou 3. -
O kwarg obsoleto
line_lengthpara a funçãoqiskit.visualization.circuit_drawer()function andqiskit.circuit.QuantumCircuit.draw()foi removido. Ele foi descontinuado desde a versão 0.10.0. Em vez disso, você pode usar ofoldkwarg para ajustar a largura do diagrama de circuito. -
O modo de saída
'mpl'para o métodoqiskit.circuit.QuantumCircuit.draw()ecircuit_drawer()agora exige que a biblioteca pylatexenc esteja instalada. Essa já era uma dependência opcional para visualização, mas antes só era necessária para o modo de saída'latex'. Agora, ele também é necessário para a gaveta do matplotlib, pois é necessário para lidar com o dimensionamento correto de portões com rótulos de texto matemático do matplotlib para portões. -
Os métodos obsoletos
get_tokenspara os sitesqiskit.qasm.Qasmeqiskit.qasm.QasmParserforam removidos. Esses métodos foram descontinuados desde a versão 0.9.0. Em vez disso, devem ser usados os métodosqiskit.qasm.Qasm.generate_tokens()eqiskit.qasm.QasmParser.generate_tokens(). -
O kwarg obsoleto
channels_to_plotparaqiskit.pulse.Schedule.draw(),qiskit.pulse.Instruction.draw(),qiskit.visualization.pulse.matplotlib.ScheduleDrawer.drawepulse_drawer()foi removido. O kwarg está obsoleto desde a versão 0.11.0 e foi substituído pelo kwargchannels, que funciona de forma idêntica e deve ser usado em seu lugar. -
O atributo
circuit_instruction_mapobsoleto da classeqiskit.providers.models.PulseDefaultsfoi removido. Esse atributo está obsoleto desde a versão 0.12.0 e foi substituído pelo atributoinstruction_schedule_map, que pode ser usado em seu lugar. -
O método
uniondeScheduleeInstructionforam descontinuados desde a versão 0.12.0 e agora foram removidos. Use os métodosqiskit.pulse.Schedule.insert()eqiskit.pulse.Instruction.meth()em vez disso, use os métodos kwarg``time=0``. -
O argumento obsoleto
scalingpara o métododrawdeScheduleeInstructionfoi substituído porscaledesde a versão 0.12.0 e agora foi removido. Em vez disso, use oscalekwarg. -
O argumento obsoleto
periodpara as funçõesqiskit.pulse.libraryforam substituídos porfreqdesde a versão 0.13.0 e agora foram removidos. Use o kwargfreqem vez deperiod. -
O módulo
qiskit.pulse.commandsque contém as classesCommandsfoi preterido na versão 0.13.0 e agora foi removido. Você terá que atualizar o código do Pulse se ainda estiver usando comandos. Por exemplo:AntigoNovoCommand(args)(channel)Instruction(args, channel)\Python Acquire(duration)( AcquireChannel(0 )) ``` \Python Acquire(duration, AcquireChannel(0 )) | ```python Delay(duration)(channel) ``` | ```python Delay(duration, channel) ``` | | ```python FrameChange(angle)(DriveChannel(0)) ``` | ```python # FrameChange was also renamed ShiftPhase(angle, DriveChannel(0)) ``` | | ```python Gaussian(...)(DriveChannel(0)) ``` | ```python # Pulses need to be `Play`d Play(Gaussian(...), DriveChannel(0)) ``` | -
Todas as classes e funções do módulo
qiskit.tool.qiforam descontinuadas na versão 0.12.0 e agora foram removidas. Em vez disso, use o móduloqiskit.quantum_infoe os novos métodos e classes que ele possui para trabalhar com estados e operadores quânticos. -
As funções
qiskit.quantum_info.basis_stateeqiskit.quantum_info.projectorestão obsoletas desde o Qiskit Terra 0.12.0 e agora foram removidas. Use o endereçoqiskit.quantum_info.QuantumStatee seus derivadosqiskit.quantum_info.Statevectoreqiskit.quantum_info.DensityMatrixpara trabalhar com estados. -
As funções de plotagem interativa de
qiskit.visualization,iplot_bloch_multivector,iplot_state_city,iplot_state_qsphere,iplot_state_hinton,iplot_histogram,iplot_state_paulivecagora são apenas aliases obsoletos para os equivalentes baseados em matplotlib e não são mais interativos. O código JS estático hospedado no qual essas funções se baseavam foi removido e elas não podem mais funcionar. Uma depreciação normal não foi possível porque o site do qual eles dependiam não existe mais. -
Os componentes de validação que usam o marshmallow de
qiskit.validationforam removidos do terra. Como eles não são mais usados para construir objetos em terra. -
As classes de esquema do marshmallow em
qiskit.resultforam removidas, pois não são mais usadas pela classeqiskit.result.Resultclasse. -
A saída do método
to_dict()para a classeqiskit.result.Resultnão está mais em um formato para serialização direta de JSON. Dependendo do conteúdo contido nas instâncias dessas classes, pode haver tipos que o codificador JSON padrão não sabe como manipular, por exemplo, números complexos ou matrizes numéricas. Se você estiver serializando diretamente a saída do métodoto_dict()em JSON, deverá garantir que o codificador JSON possa lidar com esses tipos. -
A opção de adquirir vários qubits de uma vez foi preterida na versão 0.12.0 e agora foi removida. Especificamente, os args de inicialização
mem_slotsereg_slotsforam removidos deqiskit.pulse.instructions.Acquireechannel,mem_slotereg_slotgerarão um erro se uma lista for fornecida como entrada. -
O suporte ao uso da variável de ambiente
USE_RETWORKX, que foi introduzida na versão 0.13.0 para fornecer um fallback opcional para a implementação baseada em networkxqiskit.dagcircuit.DAGCircuitfoi removido. Esse sinalizador foi criado apenas para fornecer uma válvula de escape para qualquer usuário que tenha encontrado um problema com a nova implementação de uma versão durante a transição para o retworkx. -
O módulo dentro de
qiskit.pulseresponsável pelas transformações schedule->schedule foi renomeado dereschedule.pyparatransforms.py. O caminho de importação anterior foi descontinuado. Para atualizar seu código:from qiskit.pulse.rescheduler import <X>deve ser substituído por:
from qiskit.pulse.transforms import <X> -
Nas versões anteriores, um
PassManagernão permitia que as classesTransformationPassmodificassem oPropertySet. Essa restrição foi suspensa, de modo que a classeTransformationPassagora tem acesso de leitura e gravação aos sitesPropertySeteDAGCircuitduranterun(). Essa alteração foi feita para facilitar de forma mais eficiente as classes doTransformationPassque têm um estado interno que pode ser necessário para passagens posteriores noPassManager. Sem essa alteração, um segundoAnalysisPassredundante teria sido necessário para recriar o estado interno, o que poderia acrescentar uma sobrecarga significativa.
Notas de descontinuação
-
O nome do primeiro parâmetro posicional para as
qiskit.visualizationfunçõesplot_state_hinton(),plot_bloch_multivector(),plot_state_city(),plot_state_paulivec(), eplot_state_qsphere()foi renomeada derhoparastate. A transmissão do valor por nome pararhoestá obsoleta e será removida em uma versão futura. Em vez disso, você deve passar o argumento de forma posicional ou usar o novo nome de parâmetrostate. -
O módulo
qiskit.pulse.pulse_libfoi descontinuado e será removido em uma versão futura. Ele foi renomeado paraqiskit.pulse.libraryque deve ser usado em seu lugar. -
O método
qiskit.circuit.QuantumCircuitmirror()foi preterido e será removido em uma versão futura. O métodoqiskit.circuit.QuantumCircuit.reverse_ops()deve ser usado em seu lugar, 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. -
Os métodos
qubits()eclbits()deqiskit.dagcircuit.DAGCircuitforam descontinuados e serão removidos em uma versão futura. Elas foram substituídas por propriedades com o mesmo nome,qiskit.dagcircuit.DAGCircuit.qubitseqiskit.dagcircuit.DAGCircuit.clbits, e são armazenadas em cache para que o acesso a elas seja muito mais rápido. -
O método
get_sample_pulsepara classes derivadas deqiskit.pulse.library.ParametricPulse(por exemploGaussianSquare) foi preterido e será removido em uma versão futura. Ele foi substituído pelo métodoget_waveform(por exemplo,get_waveform()), que deve se comportar de forma idêntica. -
O uso do argumento opcional
conditionemqiskit.dagcircuit.DAGNode,qiskit.dagcircuit.DAGCircuit.apply_operation_back(), eqiskit.dagcircuit.DAGCircuit.apply_operation_front()foi preterido e será removido em uma versão futura. Em vez disso, ocontroldefine emqiskit.circuit.Instructionsendo adicionadas a uma instância deDAGCircuitdeve ser usado. -
Os métodos das classes
set_atoleset_rtoldas classesqiskit.quantum_info.BaseOperatoreqiskit.quantum_info.QuantumState(e suas subclasses, comoOperatoreqiskit.quantum_info.DensityMatrix) estão obsoletos e serão removidos em uma versão futura. Em vez disso, o valor dos atributos.atole.rtoldeve ser definido na classe. Por exemplo:from qiskit.quantum_info import ScalarOp ScalarOp.atol = 3e-5 op = ScalarOp(2) -
As funções de plotagem interativa de
qiskit.visualization,iplot_bloch_multivector,iplot_state_city,iplot_state_qsphere,iplot_state_hinton,iplot_histogram,iplot_state_paulivecforam descontinuadas e serão removidas em uma versão futura. As funções equivalentes baseadas no matplotlib deqiskit.visualization,plot_bloch_multivector(),plot_state_city(),plot_state_qsphere(),plot_state_hinton(),plot_state_histogram(), eplot_state_paulivec()devem ser usados em seu lugar. -
As propriedades
acquires,mem_slotsereg_slotsda instruçãoqiskit.pulse.instructions.Acquireforam preteridas e serão removidas em uma versão futura. Eles são apenas duplicatas dechannel,mem_slot, ereg_slotrespectivamente, agora que o suporte anteriormente obsoleto para o uso de vários qubits em uma única instruçãoAcquirefoi removido. -
A classe
SamplePulsedeqiskit.pulsefoi renomeada paraWaveform.SamplePulseestá obsoleto e será removido em uma versão futura. -
A chave do dicionário de estilos
cregbundlefoi preterida e será removida em uma versão futura. Isso foi substituído pelo kwargcregbundleadicionado à funçãoqiskit.visualization.circuit_drawer()e ao métodoQuantumCircuitmétododraw().
Correções de bugs
-
O método
qiskit.circuit.QuantumCircuitmétodonum_nonlocal_gatesincluía anteriormente objetos multiqubitqiskit.circuit.Instruction(por exemplo,Barrier) em sua contagem de portas não locais. Isso foi corrigido para que apenas os objetos não locaisGatesejam contados. Correções #4500 -
ControlledGateinstâncias com um conjuntoctrl_statenão estavam, em alguns casos, sendo avaliadas como iguais, mesmo que as portas comparadas fossem equivalentes. Isso foi resolvido de modo que as correções #4573 -
Ao acessar um bit de um
qiskit.circuit.QuantumRegisterouqiskit.circuit.ClassicalRegisterpor índice ao usar tipos inteiros numpy <https://numpy.org/doc/stable/user/basics.types.html> `___ anteriormente gerava uma exceçãoCircuitError. Isso foi resolvido para que os tipos numpy possam ser usados além do tipo Python 's built-inint. Correções #3929. -
Foi corrigido um erro que fazia com que apenas o primeiro
qiskit.pulse.configuration.Kernelouqiskit.pulse.configuration.Discriminatorde umqiskit.pulse.Acquirefosse usado quando havia várias aquisições ao mesmo tempo em umqiskit.pulse.Schedule. -
A unidade SI usada para a construção de objetos
qiskit.pulse.SetFrequencyé em Hz, mas quando um objetoPulseQobjInstructioné criado a partir de uma instância deSetFrequency, ele precisa ser convertido para GHz. Essa conversão não estava presente nas versões anteriores e foi corrigida. -
Anteriormente, era possível definir o número de qubits de controle como zero e, nesse caso, a operação original, potencialmente não controlada, seria retornada. Isso poderia causar um
AttributeErrorse o chamador tentasse acessar um atributo que somente os objetosControlledGateobjeto possui. Isso foi corrigido com a adição de um getter e setter paranum_ctrl_qubitspara validar que um valor válido está sendo usado. Correções #4576 -
Os controles abertos foram implementados modificando um objeto
Gateobjetosdefinition. No entanto, quando a porta já existe no conjunto de base, essa definição não foi usada, o que resultou no envio de circuitos incorretos para um backend após a transpilação. Isso foi corrigido com a modificação da passagemUnrollerpara usar a definição se encontrar um portão controlado com controles abertos. Correções #4437 -
O argumento da palavra-chave
insert_barriersna classeZZFeatureMapnão inseriu de fato barreiras entre as camadas Hadamard e as camadas de evolução. Isso foi corrigido para que as barreiras sejam inseridas corretamente. -
Corrigido o problema em que algumas portas com três ou mais qubits não eram compiladas em determinados casos. Consulte #4577 <https://github.com/Qiskit/qiskit/issues/4577 para obter mais detalhes.
-
O backend de saída do matplotlib (
'mpl') para oqiskit.circuit.QuantumCircuitmétododraw()e a funçãoqiskit.visualization.circuit_drawer()não estavam sendo dimensionados corretamente quando o kwargscalefoi definido. As fontes e as larguras de linha não foram dimensionadas com o restante da imagem. Isso foi corrigido e todos os elementos do diagrama de circuito agora são dimensionados corretamente. Por exemplo:from qiskit import QuantumCircuit circuit = QuantumCircuit(2) circuit.h(0) circuit.cx(0, 1) circuit.draw(output='mpl', scale=0.5)Correções #4179.
-
Corrige o problema em que a inicialização ou a evolução de
qiskit.quantum_info.Statevectoreqiskit.quantum_info.DensityMatrixpor circuitos por circuito contendo instruçõesBarriergerava uma exceção. Correções #4461 -
Anteriormente, quando um
QuantumCircuitcontinha umGatecom uma condição clássica, o transpilador às vezes falhava ao usaroptimization_level=3emtranspile()ouexecute()levantando umUnboundLocalError. Isso foi corrigido com a atualização da passagemConsolidateBlockspara levar em conta a condição clássica. Correções #4672. -
Em algumas situações, nomes longos de portas e registros transbordavam ou deixavam um espaço vazio excessivo ao redor deles ao usar o backend de saída
'mpl'para o métodoqiskit.circuit.QuantumCircuit.draw()método eqiskit.visualization.circuit_drawer()função. Isso foi corrigido com o uso das larguras de texto corretas para uma fonte proporcional. Correções #4611, #4605, #4545, #4497, #4449 e #3641. -
Ao usar o backend de saída
style` kwarg on the :meth:`qiskit.circuit.QuantumCircuit.draw` or :func:`qiskit.visualization.circuit_drawer` with the ``'mpl'com a chave de dicionário'showindex'definida comoTrue, os números de índice na parte superior da coluna não se alinharam corretamente. Isso foi corrigido. -
Ao usar o site
cregbunde=Truecom o backend de saída'mpl'para o métodoqiskit.circuit.QuantumCircuit.draw()método eqiskit.visualization.circuit_drawer()e medindo em uma segunda dobra, a seta de medida sobrescreveria a contagem de creg. A contagem foi movida para a esquerda para evitar isso. Correções #4148. -
Ao usar o backend de saída
'mpl'para o métodoqiskit.circuit.QuantumCircuit.draw()método eqiskit.visualization.circuit_drawer()funçãoCSwapGatee uma portaRZZGateas portas agora são exibidas com seus símbolos apropriados em vez de em uma caixa. -
Ao usar o backend de saída
'mpl'para o métodoqiskit.circuit.QuantumCircuit.draw()método eqiskit.visualization.circuit_drawer()as portas controladas por função criadas usando o métodoto_gate()não eram espaçadas corretamente e podiam se sobrepor a outras portas no diagrama de circuito. Esse problema foi corrigido. -
Ao usar o backend de saída
'mpl'para o métodoqiskit.circuit.QuantumCircuit.draw()método eqiskit.visualization.circuit_drawer()as portas de função com matrizes como parâmetros, comoHamiltonianGate, não são mais exibidas com espaço excessivo ao redor delas. Correções #4352. -
Ao usar o backend de saída
'mpl'para o métodoqiskit.circuit.QuantumCircuit.draw()método eqiskit.visualization.circuit_drawer()as portas genéricas de função criadas pela instanciação direta do métodoqiskit.circuit.Gateagora exibem a cor de fundo adequada para o portão. Correções #4496. -
Ao usar o backend de saída
'mpl'para o métodoqiskit.circuit.QuantumCircuit.draw()método e funçãoqiskit.visualization.circuit_drawer()umAttributeErrorque ocorria ao usarIsometryouInitializefoi corrigido. Correções #4439. -
Ao usar o backend de saída
'mpl'para o métodoqiskit.circuit.QuantumCircuit.draw()method andqiskit.visualization.circuit_drawer()alguns portões controlados por abertura não exibiam corretamente os controles de abertura. Isso foi corrigido para que os controles abertos sejam exibidos corretamente como círculos abertos. Correções #4248. -
Ao usar o backend de saída
'mpl'para o métodoqiskit.circuit.QuantumCircuit.draw()método e funçãoqiskit.visualization.circuit_drawer()a configuração do kwargfoldpara -1 agora exibirá corretamente o circuito sem dobrar. Correções #4506. -
Os pulsos paramétricos do site
qiskit.pulse.library.discreteagora têm extremidades zero de pulsos paramétricos por padrão. Os pontos finais são definidos de forma que, para uma função , . Correções #4317
Outras observações
- A classe
qiskit.result.Resultque foi construída anteriormente usando a biblioteca do marshmallow foi refatorada para não depender mais do marshmallow. Essa nova implementação deve ser uma transição perfeita, mas alguns comportamentos específicos que foram herdados anteriormente do marshmallow podem não funcionar. Registre problemas para quaisquer incompatibilidades encontradas.
Aer 0.6.1
Prelúdio
Esta versão do 0.6.0 inclui várias melhorias de desempenho para todos os simuladores no provedor Aer e alterações significativas no sistema de compilação ao compilar a partir da fonte. As principais alterações são o suporte à vetorização SIMD, a aproximação no método de estado do produto da matriz por meio do truncamento da dimensão da ligação, o cálculo mais eficiente do valor de expectativa de Pauli e uma eficiência muito maior na conversão Python de objetos de resultados C++. O sistema de compilação foi atualizado para usar o Conan para gerenciar dependências comuns de C++ ao compilar a partir da fonte.
Novos Recurso
-
Adicione suporte a instantâneos de matriz de densidade aos métodos "statevector" e "statevector_gpu" do site QasmSimulator.
-
Permitir snapshots da matriz de densidade em qubits específicos, não apenas em todos os qubits. Isso calcula o rastro parcial do estado sobre os qubits restantes.
-
Adiciona suporte ao instantâneo do valor da expectativa de Pauli ao método de simulação "density_matrix" do site
qiskit.providers.aer.QasmSimulator. Adicione instantâneos aos circuitos usando a extensãoqiskit.providers.aer.extensions.SnapshotExpectationValue. -
Melhora consideravelmente o desempenho do algoritmo de instantâneo do valor de expectativa de Pauli para os métodos de simulação "statevector", "statevector_gpu", "density_matrix" e "density_matrix_gpu" do site
qiskit.providers.aer.QasmSimulator. -
Habilite a otimização do circuito de fusão de portas do site
qiskit.providers.aer.QasmSimulatornos backendsqiskit.providers.aer.StatevectorSimulatoreqiskit.providers.aer.UnitarySimulator. -
Melhorar o desempenho dos dados médios de instantâneos nos resultados do simulador. Isso afeta a probabilidade, o valor da expectativa de Pauli e os instantâneos da matriz de densidade usando as seguintes extensões:
qiskit.providers.aer.extensions.SnapshotExpectationValueqiskit.providers.aer.extensions.SnapshotProbabilitiesqiskit.providers.aer.extensions.SnapshotDensityMatrix
-
Adicionar construtor de movimentação e melhorar o uso da memória da classe de matriz C++ para minimizar as cópias de matrizes ao mover a saída dos simuladores para os resultados.
-
Melhorar o desempenho do simulador unitário.
-
Adicione uma aproximação ao método de simulação "matrix_product_state" do site
QasmSimulatorpara limitar a dimensão da ligação do MPS.Há dois modos de aproximação. Ambos descartam os menores coeficientes de Schmidt seguindo o algoritmo SVD. Há dois parâmetros que controlam o grau de aproximação:
"matrix_product_state_max_bond_dimension"(int): Define um limite para o número de coeficientes de Schmidt retidos no final do algoritmo svd. Os coeficientes além desse limite serão descartados. (Padrão: Nenhum, ou seja, nenhum limite na dimensão do vínculo)."matrix_product_state_truncation_threshold"(duplo): Descarta os menores coeficientes para os quais a soma de seus quadrados é menor que esse limite. (Padrão: 1e-16 ). -
Melhorar o desempenho da amostragem de medidas ao usar o método de simulação "matrix_product_state"
QasmSimulator. -
Adicione suporte para as instruções de pulso
Delay,PhaseeSetPhaseaoqiskit.providers.aer.PulseSimulator. -
Melhore o desempenho do site
qiskit.providers.aer.PulseSimulatorarmazenando em cache as chamadas para a função RHS -
Introduzir métodos alternativos de solução de DE, especificáveis por meio do site
backend_optionsno siteqiskit.providers.aer.PulseSimulator. -
Melhore o desempenho das classes de resultados do simulador usando a semântica de movimentação e removendo cópias desnecessárias que estavam ocorrendo ao combinar resultados de experimentos separados no objeto de resultado final.
-
Melhorar muito o desempenho da conversão pybind11 dos resultados do simulador usando a semântica de movimentação sempre que possível e movendo os resultados de vetores e matrizes para matrizes Numpy sem cópias.
-
Altere o mecanismo RNG dos simuladores de Mersenne twister de 32 bits para Mersenne twister de 64 bits.
-
Melhora o desempenho do método de simulação "statevector" do
qiskit.providers.aer.QasmSimulatore doqiskit.providers.aer.StatevectorSimulatorusando intrínsecos SIMD em sistemas que suportam o conjunto de instruções AVX2. AVX2 é detectado e ativado automaticamente em tempo de execução.
Notas da Atualização
-
Altera o sistema de compilação para usar o gerenciador de pacotes Conan. Essa ferramenta tratará da maioria das dependências necessárias para o código-fonte C++. Pode ser necessária uma conexão com a Internet para a primeira compilação ou quando as dependências forem adicionadas ou atualizadas, a fim de baixar os pacotes necessários se eles não estiverem no repositório local do Conan.
Ao criar a versão autônoma do qiskit-aer, você deve instalar o conan primeiro com:
pip install conan -
Altera a forma como as passagens de transpilação são tratadas nas classes de controlador C++, de modo que cada passagem deve ser chamada explicitamente. Isso permite maior personalização sobre quando cada passagem deve ser chamada e com quais parâmetros. Em particular, isso permite definir parâmetros diferentes para a passagem de otimização da fusão de portas, dependendo do método de simulação QasmController.
-
Adicione
gate_length_unitskwarg aqiskit.providers.aer.noise.NoiseModel.from_device()para especificargate_lengthspersonalizado na função de modelo de ruído do dispositivo para lidar com conversões de unidades para código interno. -
Adicione a porta Controlled-Y ("cy") ao conjunto de portas compatíveis com os métodos do simulador do estabilizador.
-
Para o backend do Aer, a validação do jsonschema dos objetos qobj de entrada do terra agora é opcional, em vez de ser ativada por padrão. Se você quiser ativar a validação de jsonschema do qobj, defina o kwarg
validateno métodoqiskit.providers.aer.QasmSimualtor.run()para o objeto de backend comoTrue. -
Adiciona um objeto OpSet à classe State do simulador básico para facilitar a validação de instruções, portas e instantâneos suportados pelos simuladores.
-
Refatoração da classe OpSet. Movemos OpSet para um arquivo de cabeçalho separado e adicionamos os métodos
containsedifferencecom base emstd::set::containsestd::algorithm::set_difference. Elas substituem as instruções invalid e validate removidas de OpSet,, mas com a ordem invertida. Ele retorna uma lista de outras operações que não estão no opset atual em vez de instruções do opset que não estão no outro. -
Melhora a forma como a otimização da amostragem de medição é verificada. A parte cara dessa operação agora é feita uma vez durante a construção do circuito, em vez de várias vezes durante a simulação para verificar os requisitos de memória, o método de simulação e a execução final.
Correções de bugs
-
Remova o "extended_stabilizer" dos métodos de simulação selecionados automaticamente. Isso é necessário porque o método do estabilizador estendido não é exato e pode fornecer resultados incorretos para determinados circuitos, a menos que o usuário saiba como otimizar seus parâmetros de configuração.
O método automático agora seleciona apenas os métodos "stabilizer", "density_matrix" e "statevector". Se um circuito não-Clifford que seja muito grande para o método statevector for executado, uma exceção será levantada, sugerindo que você tente usar explicitamente os métodos "extended_stabilizer" ou "matrix_product_state".
-
Desativa a fusão de portas para o método de simulação do estado do produto da matriz, pois isso estava causando problemas com o retorno de resultados incorretos em alguns casos.
-
Corrige um erro que causa a avaliação incorreta do canal no site
qiskit.providers.aer.PulseSimulator. -
Corrige vários pequenos bugs para casos extremos de análise Hamiltoniana na classe
qiskit.providers.aer.pulse.system_models.hamiltonian_model.HamiltonianModel.
Ignis 0.4.0
Prelúdio
A principal alteração feita nesta versão é uma refatoração do código do Randomized Benchmarking para integrar a classe Clifford atualizada do Terra e melhorar a classe CNOT-Dihedral qiskit.quantum_info.Clifford atualizada do Terra e para aprimorar a classe CNOT-Dihedral.
Novos Recurso
- A função
qiskit.ignis.verification.randomized_benchmarking.randomized_benchmarking_seq()foi refatorada para usar a classe Clifford atualizadaCliffordpara permitir o Randomized Benchmarking (RB) eficiente em sequências de Clifford com mais de 2 qubits. Além disso, o código da classe CNOT-Dihedralqiskit.ignis.verification.randomized_benchmarking.CNOTDihedralfoi refatorado para torná-lo mais eficiente, usando arrays numpy, além de não usar arquivos pickle pré-gerados que armazenam todos os elementos do grupo de 2 qubit. A funçãoqiskit.ignis.verification.randomized_benchmarking.randomized_benchmarking_seq()tem um novo kwargrand_seedque pode ser usado para especificar uma semente para o gerador de números aleatórios usado para gerar os circuitos RB. Isso pode ser útil para ter um circuito reproduzível. - A função
qiskit.ignis.verification.qv_circuits()tem um novo kwargseedque pode ser usado para especificar uma semente para o gerador de números aleatórios usado para gerar os circuitos do Quantum Volume. Isso pode ser útil para ter um circuito reproduzível.
Notas da Atualização
- A função
qiskit.ignis.verification.randomized_benchmarking.randomized_benchmarking_seq()agora está usando a classe Clifford atualizadaClifforde a classe CNOT-Dihedral atualizadaqiskit.ignis.verification.randomized_benchmarking.CNOTDihedralpara construir sua saída, em vez de usar tabelas de grupos pré-geradas para os elementos dos grupos Clifford e CNOT-Dihedral, que foram armazenados em arquivos pickle. Isso pode resultar em diferenças sutis em relação ao resultado da versão anterior. - Um novo requisito scikit-learn foi adicionado à lista de requisitos. Essa dependência foi adicionada na versão 0.3.0, mas não foi exposta adequadamente como uma dependência nessa versão. Isso levaria a um
ImportErrorse o móduloqiskit.ignis.measurement.discriminator.iq_discriminatorsfosse importado. Agora, ele está listado corretamente como uma dependência, de modo que oscikit-learnserá instalado com o qiskit-ignis. - A função
qiskit.ignis.verification.qv_circuits()agora está usando a classe da biblioteca de circuitosQuantumVolumepara construir sua saída em vez de construir o circuito do zero. Isso pode resultar em diferenças sutis em relação ao resultado da versão anterior. - Os instaladores de tomografia agora também podem obter uma lista de objetos de resultado em vez de um único resultado, conforme solicitado na edição nº 320.
Notas de descontinuação
-
O kwarg
interleaved_gatespara a funçãoqiskit.ignis.verification.randomized_benchmarking.randomized_benchmarking_seq()foi preterido e será removido em uma versão futura. Ele foi substituído pelo siteinterleaved_elem. As funções auxiliaresqiskit.ignis.verification.randomized_benchmarking.BasicUtils,qiskit.ignis.verification.randomized_benchmarking.CliffordUtilseqiskit.ignis.verification.randomized_benchmarking.DihedralUtilsforam descontinuadas. Essas classes foram substituídas pelo siteqiskit.ignis.verification.randomized_benchmarking.RBgroup, que lida com as operações de grupo necessárias para o RB. A classeqiskit.ignis.verification.randomized_benchmarking.Cliffordé substituída porClifford. -
Os kwargs
qrecrpara a funçãoqiskit.ignis.verification.qv_circuits()foram preteridos e serão removidos em uma versão futura. Esses kwargs foram documentados como sendo usados para especificar umqiskit.circuit.QuantumRegistereqiskit.circuit.ClassicalRegistera serem usados nos circuitos Quantum Volume gerados, em vez de criar novos circuitos. No entanto, os parâmetros nunca foram realmente respeitados e um novo registro sempre seria criado, independentemente de eles estarem definidos ou não. Esse comportamento não foi alterado e esses kwargs ainda não têm nenhum efeito, mas estão sendo preteridos antes da remoção para evitar uma alteração significativa para os usuários que possam ter definido qualquer um deles. -
O suporte para a transmissão de subconjuntos de qubits como uma lista no parâmetro
qubit_listspara a funçãoqiskit.ignis.verification.qv_circuits()foi preterido e será removido em uma versão futura. No passado, isso era usado para especificar um layout para executar o circuito em um dispositivo. Em outras palavras, se você tivesse um dispositivo de 5 qubits e quisesse executar um circuito QV de 2 qubits nos qubits 1, 3 e 4 desse dispositivo. Você passaria o endereço[1, 3, 4]como uma das listas emqubit_lists, o que geraria um circuito virtual de 5 qubits e teria qv aplicado aos qubits 1, 3 e 4 nesse circuito virtual. No entanto, essa funcionalidade não é necessária e se sobrepõe ao conceito deinitial_layoutno transpilador e ao fato de um circuito ter sido incorporado a um conjunto de layouts. Em vez disso, você deve executartranspile()ouexecute()com o layout inicial definido para fazer isso. Por exemplo, a execução do exemplo acima se tornaria:from qiskit import execute from qiskit.ignis.verification import qv_circuits initial_layout = [1, 3, 4] qv_circs, _ = qv_circuits([list(range3)]) execute(qv_circuits, initial_layout=initial_layout)
Correções de bugs
- Correção de um erro na posição dos pulsos de medição inseridos pelo site py:func:qiskit.ignis.characterization.calibrations.pulse_schedules.drag_schedules. Correções #465
Aqua 0.7.5
Novos Recurso
- Removida a dependência flexível do CPLEX no ADMMOptimizer. Agora, os otimizadores padrão usados pelo ADMMOptimizer são MinimumEigenOptimizer para problemas QUBO e SlsqpOptimizer como um otimizador contínuo. Você ainda pode usar o CplexOptimizer como um otimizador para o ADMMOptimizer, mas ele deve ser definido explicitamente.
- Novo Yahoo! provedor financeiro criado.
- Introduziu o
QuadraticProgramConverter, que é uma classe abstrata para conversores. Foram adicionados os métodosconvert/interpretpara conversores em vez deencode/decode. Adicionadosto_isingefrom_isingà classeQuadraticProgram. Movemos todos os parâmetros deconvertpara o construtor, excetoname. Criado setter/getter para parâmetros do conversor. Adicionadosauto_define_penaltyeinterpretfor``LinearEqualityToPenalty``. Agora as mensagens de erro dos conversores são mais informativas. - Adicionado um otimizador SLSQP
qiskit.optimization.algorithms.SlsqpOptimizercomo um invólucro do método de otimização SciPy correspondente. Esse é um otimizador clássico, não depende de algoritmos quânticos e pode ser usado como um substituto paraCobylaOptimizer. - O otimizador Cobyla foi modificado para acomodar um recurso de início múltiplo introduzido no otimizador SLSQP. Por padrão, o otimizador não é executado no modo de inicialização múltipla.
- O
SummedOpfaz uma verificação matematicamente mais correta da igualdade, em que expressões comoX + X == 2*XeX + Z == Z + Xsão avaliadas comoTrue.
Notas de descontinuação
- A classe do otimizador GSLS descontinuou o parâmetro
__init__max_iterem favor demaxiter. A classe do otimizador SPSA descontinuou o parâmetro__init__max_trialsem favor demaxiter. a função optimize_svm descontinuou o parâmetromax_itersem favor demaxiter. A classe ADMMParameters descontinuou o parâmetro__init__max_iterem favor demaxiter. - As classes de conversão de ising
qiskit.optimization.converters.QuadraticProgramToIsingeqiskit.optimization.converters.IsingToQuadraticProgramforam preteridas e serão removidas em uma versão futura. Em vez disso, os métodosqiskit.optimization.QuadraticProgramto_ising()efrom_ising()devem ser usados. - O método
pprint_as_stringparaqiskit.optimization.QuadraticProgramfoi preterido e será removido em uma versão futura. Em vez disso, você deve apenas executar.pprint_as_string()na saída deto_docplex() - O método
prettyprintparaqiskit.optimization.QuadraticProgramfoi preterido e será removido em uma versão futura. Em vez disso, você deve apenas executar.prettyprint()na saída deto_docplex()
Correções de bugs
- Alterado na versão do python 3.8: Em macOS,, o método de início de spawn agora é o padrão. O método fork start deve ser considerado inseguro, pois pode levar a falhas nos subprocessos. No entanto, o P_BFGS não é compatível com o spawn, portanto, voltamos ao processo único. Consulte a página #1109 <https://github.com/qiskit-community/qiskit-aqua/issues/1109> para obter mais detalhes.
- Os parâmetros de vinculação no site
CircuitStateFnnão copiavam o valor deis_measuremente sempre definiamis_measurement=False. Isso foi corrigido. - Anteriormente, SummedOp.to_matrix_op criava uma lista MatrixOp’s (com matrizes numpy) e depois as somava, retornando uma única MatrixOp. Alguns algoritmos (por exemplo, vqe) exigem a soma de milhares de matrizes, o que esgota a memória ao criar a lista de matrizes. Com essa alteração, nenhuma lista é construída. Em vez disso, cada operando na soma é convertido em uma matriz, adicionado a um acumulador e descartado.
- A alteração de backends no VQE de statevector para qasm_simulator ou dispositivo real estava causando um erro devido à CircuitSampler reutilização incompatível. O VQE foi alterado para sempre criar um novo CircuitSampler e criar uma nova expectativa caso não seja inserido pelo usuário. Consulte #1153 <https://github.com/qiskit-community/qiskit-aqua/issues/1153> para obter mais detalhes.
- Os provedores financeiros do Exchange e da Wikipedia foram corrigidos para lidar corretamente com os dados do Quandl. Consulte #775 <https://github.com/qiskit-community/qiskit-aqua/issues/775> para obter mais detalhes. Corrige um erro de divisão por 0 nos cálculos do vetor médio e da matriz de covariância dos provedores financeiros. Consulte o site <https://github.com/qiskit-community/qiskit-aqua/issues/781> nº 781 para obter mais detalhes.
- A propriedade
ListOp.combo_fnfoi perdida em várias transformações, como a conversão para outro tipo de operador, a passagem, a redução ou a multiplicação. Agora, esse atributo é propagado para o operador resultante. - A avaliação de algumas expressões de operadores, como
SummedOp``s and evaluations with the ``CircuitSampler, não tratava os coeficientes corretamente ou os ignorava completamente. E.g. a avaliação de~StateFn(0 * (I + Z)) @ Plusnão resultou em 0 ou a normalização de~StateFn(I) @ ((Plus + Minus) / sqrt(2))deixou passar um fator desqrt(2). Isso foi corrigido. OptimizationResultincluiu alguns setters públicos e as variáveis de classe foramOptional. Essa correção torna todas as variáveis de classe somente leitura para que o mypy e o pylint possam verificar os tipos com mais eficiência.MinimumEigenOptimizer.solvebitstrings gerados em um resultado comostr. Essa correção alterou o resultado paraList[float], como fazem os outros algoritmos. Algumas classes públicas relacionadas a algoritmos de otimização estavam faltando na documentação do siteqiskit.optimization.algorithms. Essa correção adicionou todas essas classes à documentação. #1131 <https://github.com/qiskit-community/qiskit-aqua/issues/1131> para obter mais detalhes.OptimizationResult.__init__não verificou se os tamanhos dexevariablessão iguais ou não (eles deveriam ser iguais). Essa correção adicionou a verificação para gerar um erro se eles não corresponderem e corrige os erros detectados pela verificação. Essa correção também adiciona testes de unidade ausentes relacionados aOptimizationResult.variable_nameseOptimizationResult.variables_dictemtest_converters. #1167 <https://github.com/qiskit-community/qiskit-aqua/issues/1167> para obter mais detalhes.- Corrigir a vinculação de parâmetros no site
OperatorStateFn, que não vinculava parâmetros da primitiva subjacente, mas apenas os coeficientes. op.eval(other)ondeopé do tipoOperatorBase, às vezes retorna silenciosamente um valor sem sentido quando o número de qubits emopeothernão é igual. Essa correção resulta no comportamento correto, que é lançar um erro em vez de retornar um valor, porque a entrada nesse caso é inválida.- O método
construct_circuitdeVQEretornou anteriormente o valor de expectativa a ser avaliado como tipoOperatorBase. Essa funcionalidade foi transferida paraconstruct_expectationeconstruct_circuitretorna uma lista dos circuitos que são avaliados para calcular o valor esperado.
IBM 0.8.0
Novos Recurso
IBMQBackendagora tem um novo métodoreservations()que retorna informações de reserva para o backend, com filtragem opcional. Além disso, agora você pode usar o siteprovider.backends.my_reservations()para consultar suas próprias reservas.qiskit.providers.ibmq.job.IBMQJob.result()gera uma exceçãoIBMQJobFailureErrorse o trabalho falhar. A mensagem de exceção agora contém o motivo da falha do trabalho, se o trabalho inteiro falhou por um único motivo.- Um novo atributo
client_versionfoi adicionado aIBMQJobe oqiskit.result.Resultobjeto recuperado viaqiskit.providers.ibmq.job.IBMQJob.result().client_versioné um dicionário em que a chave é o nome e o valor é a versão do cliente usada para enviar o trabalho, como o Qiskit. - A função
least_busy()agora recebe um novo parâmetro opcionalreservation_lookahead. Se especificado ou definido como padrão, um backend será considerado indisponível se tiver reservas nos próximosnminutos, em quené o valor dereservation_lookahead. Por exemplo, se o valor padrão de 60 for usado, todos os back-ends que tiverem reservas nos próximos 60 minutos serão considerados indisponíveis. ManagedResultsagora tem um novo métodocombine_results()que combina os resultados de todos os trabalhos gerenciados e retorna um únicoResultobjeto. Esse objetoResultpode ser usado, por exemplo, em métodos de ajusteqiskit-ignis.
Notas da Atualização
-
Os carimbos de data e hora nos campos a seguir agora estão na hora local em vez de UTC:
- Propriedades de back-end retornadas por
qiskit.providers.ibmq.IBMQBackend.properties(). - Propriedades de back-end retornadas por
qiskit.providers.ibmq.job.IBMQJob.properties(). estimated_start_timeeestimated_complete_timeemQueueInfo, retornado porqiskit.providers.ibmq.job.IBMQJob.queue_info().dateinResult, retornado porqiskit.providers.ibmq.job.IBMQJob.result().
Além disso, espera-se que o parâmetro
datetimeparaqiskit.providers.ibmq.IBMQBackend.properties()também esteja no horário local, a menos que tenha informações de fuso horário UTC. - Propriedades de back-end retornadas por
-
websockets8.0 ou superior agora é necessário se o site Python 3.7 ou superior for usado.websockets7.0 continuará a ser usado para Python 3.6 ou abaixo. -
No Windows, a política de loop de eventos é definida como
WindowsSelectorEventLoopPolicyem vez de usar o padrãoWindowsProactorEventLoopPolicy. Isso corrige o problema em que o métodoqiskit.providers.ibmq.job.IBMQJob.result()podia travar no Windows. Correções #691
Notas de descontinuação
- O uso do
Qconfig.pypara salvar as credenciais do IBM Quantum Experience está obsoleto e será removido na próxima versão. Em vez disso, você deve usarqiskitrc(o padrão).
Correções de bugs
- Corrige um problema em que uma chamada para
qiskit.providers.ibmq.IBMQBackend.jobs()pode travar se o número de trabalhos retornados for grande. Correções #674 - Corrige um problema que gerava um
ValueErrorao criar mapas de erros no Jupyter para backends off-line. Correções #706 qiskit.providers.ibmq.IBMQBackend.jobs()agora retornará a lista correta de objetosIBMQJobquando o kwargstatusfor definido como'RUNNING'.- Os metadados do pacote foram atualizados para refletir corretamente a dependência de
qiskit-terra>= 0.14.0. Essa dependência foi adicionada implicitamente como parte da versão 0.7.0, mas não foi refletida nos requisitos do pacote, portanto, era possível instalar oqiskit-ibmq-providercom uma versão doqiskit-terraque era muito antiga. Correções #677