Notas de versão do Qiskit 0.18
0.18.3
Terra 0.13.0
Nenhuma mudança
Aer 0.5.1
Notas da Atualização
- 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 a configuração de diferentes parâmetros 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.
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".
-
Corrige as classes do Controller para que a passagem de transpilação do ReduceBarrier seja aplicada primeiro. Isso evita que as instruções de barreira impeçam o truncamento de qubits não utilizados se a única instrução definida neles for uma barreira.
-
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.
-
Correção de erro na conversão de unidade de tempo de porta para modelo de ruído de dispositivo com erros de relaxamento térmico e erros de porta. A probabilidade de erro, o erro de despolarização estava sendo calculado com o tempo de porta em microssegundos, enquanto que para o relaxamento térmico estava sendo calculado em nanossegundos. Isso fez com que nenhum erro de despolarização fosse aplicado, pois as unidades incorretas fariam com que o dispositivo parecesse ter coerência limitada.
-
Correção de bug na composição incorreta do site QuantumErrors quando os qubits das instruções compostas são diferentes.
-
Corrigir o problema em que a porta "diagonal" é verificada como unitária com uma tolerância muito alta. Isso estava fazendo com que as diagonais geradas a partir de funções Numpy frequentemente não passassem no teste.
-
Corrigir a passagem de otimização do circuito de remoção de barreira a ser aplicada antes da trucação do qubit. Isso corrige um problema em que as barreiras inseridas pelo transpilador do Terra em qubits inativos impediam que eles fossem truncados.
Ignis 0.3.0
Nenhuma mudança
Aqua 0.6.6
Nenhuma mudança
IBM 0.6.1
Nenhuma mudança
0.18.0
Terra 0.13.0
Prelúdio
A versão 0.13.0 inclui muitas mudanças importantes. Alguns destaques desse lançamento são:
Para o transpilador, trocamos a biblioteca de gráficos usada para criar a classe qiskit.dagcircuit.DAGCircuit que é a estrutura de dados subjacente a todas as operações, para se basear no retworkx, a fim de melhorar muito o desempenho. A velocidade de transpilação de circuitos na versão 0.13.0 deve ser significativamente mais rápida do que nas versões anteriores.
Houve uma simplificação significativa no estilo em que as instruções do Pulse são criadas. Agora, o Command s está obsoleto e um conjunto unificado de Instruction s é suportado.
O módulo qiskit.quantum_info inclui várias novas funções para gerar operadores aleatórios (como Cliffords e canais quânticos) e para calcular a norma de diamante de canais quânticos; atualizações para os módulos Statevector e DensityMatrix para dar suporte ao cálculo de probabilidades de medição e medições de amostragem; e várias novas classes são baseadas na representação simpática das matrizes de Pauli. Essas novas classes incluem operadores de Clifford (Clifford), matrizes de N-qubit que são esparsas na base de Pauli (SparsePauliOp), listas de Pauli (PauliTable) e listas de estabilizadores (StabilizerTable).
Esta versão também tem uma documentação amplamente aprimorada em todo o Qiskit, incluindo documentação aprimorada para o qiskit.circuit, qiskit.pulse e qiskit.quantum_info módulos.
Além disso, a nomenclatura dos objetos e métodos QuantumCircuit foi atualizada para ser mais consistente. Isso fez com que várias classes e métodos fossem descontinuados à medida que as coisas mudavam para um esquema de nomenclatura mais consistente.
Para obter detalhes completos sobre todas as alterações feitas nesta versão, consulte as notas de versão detalhadas abaixo.
Novos Recurso
-
Adição de um novo módulo de biblioteca de circuitos
qiskit.circuit.library. Este será um local para construtores de circuitos comumente usados que podem ser usados como blocos de construção para circuitos ou aplicativos maiores. -
A classe
qiskit.providers.BaseJobtem quatro novos métodos:done()running()cancelled()in_final_state()
Esses métodos são usados para verificar se um trabalho está em um determinado status de trabalho.
-
Adicione a capacidade de especificar o controle condicionado ao fato de um qubit estar no estado fundamental. O estado dos qubits de controle é representado por um número inteiro. Por exemplo:
from qiskit import QuantumCircuit from qiskit.extensions.standard import XGate qc = QuantumCircuit(4) cgate = XGate().control(3, ctrl_state=6) qc.append(cgate, [0, 1, 2, 3])Cria uma porta de quatro qubits em que o quarto qubit é invertido se o primeiro qubit estiver no estado fundamental e o segundo e o terceiro qubits estiverem no estado excitado. Se
ctrl_stateforNone, o padrão, o controle estará condicionado à excitação de todos os qubits de controle. -
Um novo widget do jupyter,
%circuit_library_info, foi adicionado aoqiskit.tools.jupyter. Esse widget é usado para visualizar detalhes sobre circuitos criados a partir da biblioteca de circuitos. Por exemplo:from qiskit.circuit.library import XOR import qiskit.tools.jupyter circuit = XOR(5, seed=42) %circuit_library_info circuit -
Uma nova opção de kwarg,
formatted, foi adicionada aoqiskit.circuit.QuantumCircuit.qasm(). Quando definido comoTrue, o método imprimirá uma versão destacada da sintaxe (usando pygments) no stdout e retornaráNone(o que difere do comportamento normal de retornar o código QASM como uma cadeia de caracteres). -
Uma nova opção de kwarg,
filename, foi adicionada aoqiskit.circuit.QuantumCircuit.qasm(). Quando definido como um caminho, o método gravará o código QASM nesse arquivo. Em seguida, ele continuará a produzir normalmente. -
Uma nova instrução
SetFrequencyque permite aos usuários alterar a frequência doPulseChannel. Isso é feito da seguinte maneira:from qiskit.pulse import Schedule from qiskit.pulse import SetFrequency sched = pulse.Schedule() sched += SetFrequency(5.5e9, DriveChannel(0))Nesse exemplo, a frequência de todos os pulsos antes do comando
SetFrequencyserá a frequência padrão e todos os pulsos aplicados ao canal de acionamento zero após o comandoSetFrequencyestarão em 5.5 GHz. Os usuários do siteSetFrequencydevem ter em mente as limitações de hardware. -
Um novo método,
assign_parameters()foi adicionado à classeqiskit.circuit.QuantumCircuitclasse. Esse método aceita um dicionário de parâmetros com objetos floats e Parameters em um único dicionário. Em outras palavras, esse novo método permite vincular floats, parâmetros ou ambos em um único dicionário.Além disso, ao usar o
inplacekwarg, é possível especificar que você pode modificar opcionalmente o circuito original no lugar. Por padrão, isso é definido comoFalsee uma cópia do circuito original será retornada pelo método. -
Um novo método
num_nonlocal_gates()foi adicionado à classeqiskit.circuit.QuantumCircuitclasse. Esse método retornará o número de portas em um circuito que envolve 2 ou mais qubits. Esses portões são mais caros em termos de tempo e erro de implementação. -
O método
qiskit.circuit.QuantumCircuitmétodoiso()para adicionar uma portaIsometryao circuito tem um novo alias. Agora você pode ligar paraqiskit.circuit.QuantumCircuit.isometry()além de ligar paraiso. -
Um atributo
descriptionfoi adicionado à classeCouplingMappara armazenar uma breve descrição de diferentes mapas de acoplamento (por exemplo, completo, grade, linha etc.). -
Um novo método
compose()foi adicionado à classeDAGCircuitpara compor dois circuitos por meio de seus DAGs.dag_left.compose(dag_right, edge_map={right_qubit0: self.left_qubit1, right_qubit1: self.left_qubit4, right_clbit0: self.left_clbit1, right_clbit1: self.left_clbit0})┌───┐ ┌─────┐┌─┐ lqr_1_0: ───┤ H ├─── rqr_0: ──■──┤ Tdg ├┤M├ ├───┤ ┌─┴─┐└─┬─┬─┘└╥┘ lqr_1_1: ───┤ X ├─── rqr_1: ┤ X ├──┤M├───╫─ ┌──┴───┴──┐ └───┘ └╥┘ ║ lqr_1_2: ┤ U1(0.1) ├ + rcr_0: ════════╬════╩═ = └─────────┘ ║ lqr_2_0: ─────■───── rcr_1: ════════╩══════ ┌─┴─┐ lqr_2_1: ───┤ X ├─── └───┘ lcr_0: ═══════════ lcr_1: ═══════════ ┌───┐ lqr_1_0: ───┤ H ├────────────────── ├───┤ ┌─────┐┌─┐ lqr_1_1: ───┤ X ├─────■──┤ Tdg ├┤M├ ┌──┴───┴──┐ │ └─────┘└╥┘ lqr_1_2: ┤ U1(0.1) ├──┼──────────╫─ └─────────┘ │ ║ lqr_2_0: ─────■───────┼──────────╫─ ┌─┴─┐ ┌─┴─┐ ┌─┐ ║ lqr_2_1: ───┤ X ├───┤ X ├──┤M├───╫─ └───┘ └───┘ └╥┘ ║ lcr_0: ═══════════════════╩════╬═ ║ lcr_1: ════════════════════════╩═ -
Os back-ends simulados em
qiskit.test.mockagora têm um métodorun()funcional que retornará resultados semelhantes aos dos dispositivos reais. Se o siteqiskit-aerestiver instalado, uma simulação será executada com um modelo de ruído criado a partir do instantâneo do dispositivo no backend falso. Caso contrário,qiskit.providers.basicaer.QasmSimulatorPyserá usado para executar uma simulação ideal. Além disso, se um experimento de pulso for passado pararune o qiskit-aer estiver instalado, oPulseSimulatorserá usado para simular as programações de pulso. -
O método
qiskit.result.Result()métodoget_counts()agora retornará uma lista de todas as contagens disponíveis quando houver vários circuitos em um trabalho. Isso funciona quandoget_counts()é chamado sem argumentos.A principal consideração para esse recurso foi desenhar todos os resultados de vários circuitos no mesmo histograma. Por exemplo, agora é possível fazer algo como:
from qiskit import execute from qiskit import QuantumCircuit from qiskit.providers.basicaer import BasicAer from qiskit.visualization import plot_histogram sim = BasicAer.get_backend('qasm_simulator') qc = QuantumCircuit(2) qc.h(0) qc.cx(0, 1) qc.measure_all() result = execute([qc, qc, qc], sim).result() plot_histogram(result.get_counts()) -
Um novo kwarg,
initial_state, foi adicionado à funçãoqiskit.visualization.circuit_drawer()e ao métodoQuantumCircuitmétododraw(). Quando definido comoTrue, o estado inicial será incluído nas visualizações de circuito para todos os back-ends. Por exemplo:from qiskit import QuantumCircuit circuit = QuantumCircuit(2) circuit.measure_all() circuit.draw(output='mpl', initial_state=True) -
Agora é possível inserir um callable em um
qiskit.pulse.InstructionScheduleMapque retorna um novoqiskit.pulse.Schedulequando ele é chamado com parâmetros. Por exemplo:def test_func(x): sched = Schedule() sched += pulse_lib.constant(int(x), amp_test)(DriveChannel(0)) return sched inst_map = InstructionScheduleMap() inst_map.add('f', (0,), test_func) output_sched = inst_map.get('f', (0,), 10) assert output_sched.duration == 10 -
Duas novas classes de portas,
qiskit.extensions.iSwapGateeqiskit.extensions.DCXGate, juntamente com seusQuantumCircuitmétodosiswap()edcx()foram adicionados às extensões padrão. Essas portas, que são localmente equivalentes umas às outras, podem ser usadas para realizar interações XY específicas. Uma breve motivação para esses portões pode ser encontrada em: arxiv.org/abs/quant-ph/0209035 -
A classe
qiskit.providers.BaseJobagora tem um novo métodowait_for_final_state()que pesquisa o status do trabalho até que ele atinja um estado final (comoDONEouERROR). Esse método também recebe umcallbackkwarg opcional que recebe um Python callable que será chamado durante cada iteração do loop de sondagem. -
Os atributos
search_widthesearch_depthdo passeqiskit.transpiler.passes.LookaheadSwapagora podem ser definidos ao inicializar a passagem. Um espaço de pesquisa maior muitas vezes pode levar a circuitos mais otimizados, ao custo de um tempo de execução mais longo. -
O número de qubits em
BackendConfigurationpode agora ser acessado por meio da propriedadenum_qubits. Anteriormente, ele só podia ser acessado por meio do atributon_qubits. -
Dois novos métodos,
angles()eangles_and_phase()foram adicionados à classeqiskit.quantum_info.OneQubitEulerDecomposerclasse. Esses métodos retornarão os parâmetros relevantes sem validação, e chamar o objetoOneQubitEulerDecomposerexecutará a síntese completa com validação. -
Uma base de decomposição
RRfoi adicionada aoqiskit.quantum_info.OneQubitEulerDecomposerpara decompor um 2x2 unitário arbitrário em um circuito de doisRGate. -
Adiciona a capacidade de definir
qargspara objetos que são subclasses da classe abstrataBaseOperator. Isso é feito chamando o objetoop(qargs)(ondeopé uma classe de operador) e retornará uma cópia superficial do objeto original com uma propriedade qargs definida. Quando esse objeto é usado com ocompose()oudot()o valor interno de qargs será usado quando o métodoqargskwarg não for usado. Isso permite a composição do subsistema usando operadores binários, por exemplo:from qiskit.quantum_info import Operator init = Operator.from_label('III') x = Operator.from_label('X') h = Operator.from_label('H') init @ x([0]) @ h([1]) -
Adiciona a classe
qiskit.quantum_info.Cliffordclasse de operador ao módulo quantum_info. Esse operador é uma representação simpática eficiente de um operador unitário N-qubit do grupo Clifford. Essa classe inclui um métodoto_circuit()para compilação em umQuantumCircuitde portas Clifford com um número mínimo de portas CX para até 3 qubits. Ele também fornece compilação geral para N > 3 qubits, mas esse método não é ideal para o número de portas de dois qubits. -
Adiciona a
qiskit.quantum_info.SparsePauliOpclasse de operador. Essa é uma representação eficiente de uma matriz N-qubit que é esparsa na base Pauli e usa umqiskit.quantum_info.PauliTablee um vetor de coeficientes complexos para sua estrutura de dados.Essa classe suporta grande parte da mesma funcionalidade da classe
qiskit.quantum_info.Operatorclasse para que os objetosSparsePauliOpos objetos podem ser tensionados, compostos, multiplicados por escalar, adicionados e subtraídos.As matrizes Numpy ou os objetos
Operatorpodem ser convertidos em um objetoSparsePauliOpusando o método :class:`~qiskit.quantum_info.SparsePauliOp.from_operator.SparsePauliOppode ser convertido em uma matriz csr_matrix esparsa ou em uma matriz Numpy densa usando o métodoto_matrixou para um objetoOperatorobjeto usando o métodoto_operatormétodo.A
SparsePauliOppode ser iterado em termos de seus componentes e coeficientesPauliTable, seus coeficientes e rótulos de cadeia de Pauli usando o métodolabel_iter()e os componentes (densos ou esparsos) da matriz usando o métodomatrix_iter()método. -
Adicionar
qiskit.quantum_info.diamond_norm()função para computar a norma de diamante (norma de traço completamente limitada) de um canal quântico. Isso pode ser usado para calcular a distância entre dois canais quânticos usandodiamond_norm(chan1 - chan2). -
Uma nova classe
qiskit.quantum_info.PauliTablefoi adicionada. Essa é uma representação simpática eficiente de uma lista de operadores Pauli de N-qubit. Alguns recursos dessa classe são:PauliTableos objetos podem ser compostos e tensionados, o que retornará um objetoPauliTablecom a combinação da operação (compose(),dot(),expand(),tensor()) entre cada elemento da primeira tabela e cada elemento da segunda tabela.- A adição de duas tabelas funciona como uma concatenação de lista dos termos em cada tabela (
+). - As tabelas de Pauli podem ser classificadas por ordem lexicográfica (produto tensorial) ou por pesos de Pauli (
sort()). - Os elementos duplicados podem ser contados e excluídos (
unique()). - O site PauliTable pode ser iterado em sua representação nativa de matriz booleana simétrica, como rótulos de cadeia de Pauli (
label_iter()), ou como matriz Numpy densa ou matrizes CSR esparsas (matrix_iter()). - Verificação da comutação entre elementos da tabela Pauli e outra tabela Pauli (
commutes()) ou Pauli (commutes_with_all())
Consulte a documentação da API da classe
qiskit.quantum_info.PauliTablepara obter mais detalhes. -
Adiciona a classe
qiskit.quantum_info.StabilizerTable. Essa é uma subclasse da classeqiskit.quantum_info.PauliTableque inclui um vetor de fase booleano junto com a matriz da tabela Pauli. Isso representa uma lista de operadores estabilizadores que são operadores reais de Pauli com coeficiente +1 ou -1. Como as matrizes estabilizadoras são reais, a matriz de rótulo"Y"é definida como[[0, 1], [-1, 0]]. Consulte a documentação da API para obter informações adicionais. -
Adiciona a função
qiskit.quantum_info.pauli_basis()que retorna uma base Pauli de N-qubit como um objetoqiskit.quantum_info.PauliTable. A ordenação dessa base pode ser por ordem lexicográfica padrão (produto tensorial) ou pelo número de termos Pauli não idênticos (peso). -
Adiciona
qiskit.quantum_info.ScalarOpclasse de operador que representa um múltiplo escalar de um operador de identidade. Isso pode ser usado para inicializar uma identidade em subsistemas de dimensão arbitrária e será implicitamente convertido em outras subclasses doBaseOperator(como umqiskit.quantum_info.Operatorouqiskit.quantum_info.SuperOp) quando for composta com elas ou adicionada a elas.Exemplo: Operador de identidade
from qiskit.quantum_info import ScalarOp, Operator X = Operator.from_label('X') Z = Operator.from_label('Z') init = ScalarOp(2 ** 3) # 3-qubit identity op = init @ X([0]) @ Z([1]) @ X([2]) # Op XZX -
Um novo método,
reshape()foi adicionado à classeqiskit.quantum_innfo.Operatorque retorna uma cópia superficial de uma subclasse de operador com dimensões de entrada ou saída do subsistema remodeladas. As dimensões combinadas de todos os subsistemas devem ser as mesmas do operador original, caso contrário, será gerada uma exceção. -
Adiciona
qiskit.quantum_info.random_clifford()para gerar um operadorqiskit.quantum_info.Cliffordaleatório. -
Adicionar
qiskit.quantum_info.random_quantum_channel()para gerar um canal quântico aleatório com classificação fixaChoi-fixo na representaçãoStinespringrepresentação. -
Adicionar
qiskit.quantum_info.random_hermitian()para gerar um Hermitian aleatórioOperator. -
Adicionar
qiskit.quantum_info.random_statevector()para gerar um arquivoStatevector. -
Adiciona
qiskit.quantum_info.random_pauli_table()para gerar umqiskit.quantum_info.PauliTablealeatório. -
Adiciona
qiskit.quantum_info.random_stabilizer_table()para gerar umqiskit.quantum_info.StabilizerTablealeatório. -
Adicione um atributo
num_qubitsaqiskit.quantum_info.StateVectoreqiskit.quantum_info.DensityMatrixclasses. Isso retorna o número de qubits para estados N-qubit e retornaNonepara estados não-qubit. -
Adiciona
to_dict()eto_dict()para converterqiskit.quantum_info.Statevectoreqiskit.quantum_info.DensityMatrixem um dicionário de notação Bra-Ket.Exemplo
from qiskit.quantum_info import Statevector state = Statevector.from_label('+0') print(state.to_dict())from qiskit.quantum_info import DensityMatrix state = DensityMatrix.from_label('+0') print(state.to_dict()) -
Adiciona
probabilities()eprobabilities()aqiskit.quantum_info.Statevectoreqiskit.quantum_info.DensityMatrixque retornam uma matriz de probabilidades de resultados de medição na base computacional para os subsistemas especificados.Exemplo
from qiskit.quantum_info import Statevector state = Statevector.from_label('+0') print(state.probabilities())from qiskit.quantum_info import DensityMatrix state = DensityMatrix.from_label('+0') print(state.probabilities()) -
Adiciona
probabilities_dict()eprobabilities_dict()aqiskit.quantum_info.Statevectoreqiskit.quantum_info.DensityMatrixque retornam uma matriz de dicionário em estilo de contagem de probabilidades de resultados de medição na base computacional para os subsistemas especificados.from qiskit.quantum_info import Statevector state = Statevector.from_label('+0') print(state.probabilities_dict())from qiskit.quantum_info import DensityMatrix state = DensityMatrix.from_label('+0') print(state.probabilities_dict()) -
Adicionar
sample_counts()esample_memory()aos métodosStatevectoreDensityMatrixpara amostragem de resultados de medição em subsistemas.Exemplo:
Gerar um dicionário de contagens por amostragem de um vetor de estado
from qiskit.quantum_info import Statevector psi = Statevector.from_label('+0') shots = 1024 # Sample counts dictionary counts = psi.sample_counts(shots) print('Measure both:', counts) # Qubit-0 counts0 = psi.sample_counts(shots, [0]) print('Measure Qubit-0:', counts0) # Qubit-1 counts1 = psi.sample_counts(shots, [1]) print('Measure Qubit-1:', counts1)Retorna a matriz de resultados de medição para cada amostra
from qiskit.quantum_info import Statevector psi = Statevector.from_label('-1') shots = 10 # Sample memory mem = psi.sample_memory(shots) print('Measure both:', mem) # Qubit-0 mem0 = psi.sample_memory(shots, [0]) print('Measure Qubit-0:', mem0) # Qubit-1 mem1 = psi.sample_memory(shots, [1]) print('Measure Qubit-1:', mem1) -
Adiciona um método
measure()ao métodoqiskit.quantum_info.Statevectoreqiskit.quantum_info.DensityMatrixclasses de estado quântico. Isso permite a amostragem de um único resultado de medição dos subsistemas especificados e o colapso do vetor de estado para o estado da base computacional pós-medição. Por exemplo:from qiskit.quantum_info import Statevector psi = Statevector.from_label('+1') # Measure both qubits outcome, psi_meas = psi.measure() print("measure([0, 1]) outcome:", outcome, "Post-measurement state:") print(psi_meas) # Measure qubit-1 only outcome, psi_meas = psi.measure([1]) print("measure([1]) outcome:", outcome, "Post-measurement state:") print(psi_meas) -
Adiciona um método
reset()ao métodoqiskit.quantum_info.Statevectoreqiskit.quantum_info.DensityMatrixclasses de estado quântico. Isso permite redefinir alguns ou todos os subsistemas para o estado . Por exemplo:from qiskit.quantum_info import Statevector psi = Statevector.from_label('+1') # Reset both qubits psi_reset = psi.reset() print("Post reset state: ") print(psi_reset) # Reset qubit-1 only psi_reset = psi.reset([1]) print("Post reset([1]) state: ") print(psi_reset) -
Uma nova função de visualização
qiskit.visualization.visualize_transition()para visualizar transições de porta de um único qubit foi adicionada. Ele recebe um único circuito de qubit e retorna uma animação das transições de estado do qubit em uma esfera de Bloch. Para usar essa função, você deve ter instalado as dependências e configurado globalmente um gravador de animação matplotlib. Você pode consultar a documentação do matplotlib para obter mais detalhes sobre isso. No entanto, no caso padrão, basta garantir que o FFmpeg esteja instalado para usar essa função.Ele é compatível com circuitos com as seguintes portas:
HGateXGateYGateZGateRXGateRYGateRZGateSGateSdgGateTGateTdgGateU1Gate
Por exemplo:
from qiskit.visualization import visualize_transition from qiskit import * qc = QuantumCircuit(1) qc.h(0) qc.ry(70,0) qc.rx(90,0) qc.rz(120,0) visualize_transition(qc, fpg=20, spg=1, trace=True) -
execute()tem um novo kwargschedule_circuit. Ao definirschedule_circuit=True, isso permite o agendamento do circuito em umSchedule. Isso permite que os usuários que criam objetosqiskit.circuit.QuantumCircuitusem métodos de agendamento personalizados, como os métodosas_late_as_possibleeas_soon_as_possible. Por exemplo:job = execute(qc, backend, schedule_circuit=True, scheduling_method="as_late_as_possible") -
Uma nova variável de ambiente
QISKIT_SUPPRESS_PACKAGING_WARNINGSpode ser definida comoYouy, o que suprimirá os avisos sobre oqiskit-aere oqiskit-ibmq-providernão estarem instalados no momento da importação. Isso é útil para usuários que estão executando apenas o qiskit-terra (ou apenas não o qiskit-aer e/ou o qiskit-ibmq-provider) e os avisos não são uma indicação de um possível problema de empacotamento. É possível definir a variável de ambiente comoNounpara garantir que os avisos sejam sempre ativados, mesmo que o arquivo de configuração do usuário esteja definido para desativá-los. -
Uma nova opção de arquivo de configuração do usuário,
suppress_packaging_warnings, foi adicionada. Quando definido comotrueem seu arquivo de configuração do usuário, como:[default] suppress_packaging_warnings = trueele suprimirá os avisos sobre o fato de
qiskit-aereqiskit-ibmq-providernão estarem instalados no momento da importação. Isso é útil para usuários que estão executando apenas o qiskit-terra (ou apenas não o qiskit-aer e/ou o qiskit-ibmq-provider) e os avisos não são uma indicação de um possível problema de empacotamento. Se o arquivo de configuração do usuário estiver definido para desativar os avisos, isso poderá ser substituído pela configuração deQISKIT_SUPPRESS_PACKAGING_WARNINGSparaNoun -
qiskit.compiler.transpile()tem dois novos kwargs,layout_methoderouting_method. Eles permitem que você selecione um método específico para posicionamento e roteamento de circuitos em arquiteturas restritas. Por exemplo:transpile(circ, backend, layout_method='dense', routing_method='lookahead')executará
DenseLayoutlayout pass eLookaheadSwappassagem de roteamento. -
Houve uma simplificação significativa no estilo em que as instruções do Pulse são criadas.
No estilo anterior, os
Commands eram chamados com canais para fazer umInstruction. O uso de comandos e instruções foi um ponto de confusão. Esse era o estilo anterior:sched += Delay(5)(DriveChannel(0)) sched += ShiftPhase(np.pi)(DriveChannel(0)) sched += SamplePulse([1.0, ...])(DriveChannel(0)) sched += Acquire(100)(AcquireChannel(0), MemorySlot(0))ou, de forma equivalente (embora menos usada):
sched += DelayInstruction(Delay(5), DriveChannel(0)) sched += ShiftPhaseInstruction(ShiftPhase(np.pi), DriveChannel(0)) sched += PulseInstruction(SamplePulse([1.0, ...]), DriveChannel(0)) sched += AcquireInstruction(Acquire(100), AcquireChannel(0), MemorySlot(0))Agora, em vez de criar um comando e uma instrução, cada comando foi migrado para uma instrução:
sched += Delay(5, DriveChannel(0)) sched += ShiftPhase(np.pi, DriveChannel(0)) sched += Play(SamplePulse([1.0, ...]), DriveChannel(0)) sched += SetFrequency(5.5, DriveChannel(0)) # New instruction! sched += Acquire(100, AcquireChannel(0), MemorySlot(0)) -
Agora há uma instrução
Playque recebe uma descrição de um envelope de pulso e um canal. Há uma nova classePulseno sitepulse_libda qual a descrição do envelope de pulso deve ser uma subclasse.Por exemplo:
Play(SamplePulse([0.1]*10), DriveChannel(0)) Play(ConstantPulse(duration=10, amp=0.1), DriveChannel(0))
Notas da Atualização
-
O método
qiskit.dagcircuit.DAGNodepop, que foi descontinuado na versão 0.9.0, foi removido. Se você estiver usando esse método, poderá aproveitar a instruçãodelou a funçãodelattr()do site Python para executar a mesma tarefa. -
Um novo requisito opcional de visualização, pygments, foi adicionado. É usado para fornecer realce de sintaxe do código OpenQASM 2.0 nos widgets do Jupyter e, opcionalmente, para o método
qiskit.circuit.QuantumCircuit.qasm()método. Ele deve ser instalado (compip install pygmentsoupip install qiskit-terra[visualization]) antes de usar o widget%circuit_library_infoemqiskit.tools.jupyterou o kwargformattedno métodoqasm()método. -
A opção pulse
bufferencontrada emqiskit.pulse.Channeleqiskit.pulse.Schedulefoi descontinuada no Terra 0.11.0 e agora foi removida. Para adicionar um atraso em um canal ou em uma agenda, especifique-o explicitamente em sua Agenda com um Atraso:sched = Schedule() sched += Delay(5)(DriveChannel(0)) -
PulseChannelSpecque foi descontinuado no Terra 0.11.0, foi removido. Em vez disso, use BackendConfiguration :config = backend.configuration() drive_chan_0 = config.drives(0) acq_chan_0 = config.acquires(0)ou simplesmente referencie o canal diretamente, como
DriveChannel(index). -
Um caminho de importação foi preterido no Terra 0.10.0 e agora foi removido: para
PulseChannel,DriveChannel,MeasureChanneleControlChannel, usefrom qiskit.pulse.channels import Xno lugar defrom qiskit.pulse.channels.pulse_channels import X. -
O passe
qiskit.transpiler.passes.CSPLayout(que foi introduzido na versão 0.11.0 ) foi adicionado ao gerenciador de passes predefinidos para os níveis de otimização 2 e 3. Para o nível 2, há um limite de chamadas de 1.000 e um tempo limite de 10 segundos. Para o nível 3, o limite de chamadas é de 10.000 e o tempo limite é de 1 minuto.Agora que a passagem está incluída nos gerenciadores de passagem predefinidos, o pacote python-constraint não é mais uma dependência opcional e foi adicionado à lista de requisitos.
-
A classe
TranspileConfig, que era usada anteriormente para definir a configuração de tempo de execução de umqiskit.transpiler.PassManagerfoi removida e substituída por uma nova classeqiskit.transpile.PassManagerConfig. Essa nova classe foi estruturada para incluir apenas as informações necessárias para construir umPassManager. Os atributos dessa classe são:initial_layoutbasis_gatescoupling_mapbackend_propertiesseed_transpiler
-
A função
transpile_circuitemqiskit.transpilerfoi removida. Para transpilar um circuito com umPassManagerpersonalizado, agora você deve usar o métodorun()do objeto :class:~qiskit.transpiler.PassManager`. -
O método
QuantumCircuitmétododraw()e a funçãoqiskit.visualization.circuit_drawer()não incluirão mais o estado inicial incluído nas visualizações por padrão. Se você quiser manter o estado inicial na visualização de saída, precisará definir o kwarginitial_statecomoTrue. Por exemplo, executar:from qiskit import QuantumCircuit circuit = QuantumCircuit(2) circuit.measure_all() circuit.draw(output='text')Isso não inclui mais o estado inicial. Se você quiser mantê-lo, pode se candidatar:
from qiskit import QuantumCircuit circuit = QuantumCircuit(2) circuit.measure_all() circuit.draw(output='text', initial_state=True) -
qiskit.compiler.transpile()(eqiskit.execute.execute(), que usatranspileinternamente) agora gerará um erro quando o kwargpass_managerfor definido e um valor for definido para outros kwargs que já estejam definidos em um objeto instanciadoPassManagerinstanciado. Anteriormente, esses kwargs conflitantes eram simplesmente ignorados silenciosamente e os valores na instânciaPassManagereram usados. Por exemplo:from qiskit.circuit import QuantumCircuit from qiskit.transpiler.pass_manager_config import PassManagerConfig from qiskit.transpiler import preset_passmanagers from qiskit.compiler import transpile qc = QuantumCircuit(5) config = PassManagerConfig(basis_gates=['u3', 'cx']) pm = preset_passmanagers.level_0_pass_manager(config) transpile(qc, optimization_level=3, pass_manager=pm)agora gerará um erro, ao passo que, antes desta versão, o valor em
pmseria usado silenciosamente e o valor do kwargoptimization_levelseria ignorado. Os kwargs do sitetranspileaos quais isso se aplica são:optimization_levelbasis_gatescoupling_mapseed_transpilerbackend_propertiesinitial_layoutlayout_methodrouting_methodbackend
-
O
Operator,Clifford,SparsePauliOp,PauliTable,StabilizerTable, as classes de operador têm um métodocalladicionado que permite atribuir um qargs ao operador para uso com o métodocompose(),dot(),evolve(),``+`` e-operações. -
O método de adição da classe
qiskit.quantum_info.Operatoragora aceita umqargkwarg para permitir a adição de um operador menor a um maior, assumindo identidades nos outros subsistemas (o mesmo que paraqargsemcompose()edot()). Isso permite a adição de subsistemas usando o método de chamada como na composição. Esse suporte é adicionado a todas as subclasses de BaseOperator (ScalarOp,Operator,QuantumChannel).Por exemplo:
from qiskit.quantum_info import Operator, ScalarOp ZZ = Operator.from_label('ZZ') # Initialize empty Hamiltonian n_qubits = 10 ham = ScalarOp(2 ** n_qubits, coeff=0) # Add 2-body nearest neighbour terms for j in range(n_qubits - 1): ham = ham + ZZ([j, j+1]) -
A classe
BaseOperatorfoi atualizada para que a adição, a subtração e a multiplicação escalar não sejam mais métodos abstratos. Isso significa que não é mais necessário implementá-los em subclasses se não forem compatíveis. A classe base exibirá umNotImplementedErrorquando os métodos não estiverem definidos. -
A função
qiskit.quantum_info.random_density_matrix()agora retornará um objetoDensityMatrixaleatório. Nas versões anteriores, ele retornava uma matriz numpy. -
O
qiskit.quantum_info.Statevectoreqiskit.quantum_info.DensityMatrixnão copiam mais a matriz de entrada se ela já tiver o dtype correto. -
fastjsonschema é adicionado como uma dependência. Isso é usado para uma validação muito mais rápida dos dicionários qobj em relação ao esquema JSON quando o método
to_dict()é chamado em objetos qobj com o argumento da palavra-chavevalidatedefinido comoTrue. -
As classes de construção qobj em
qiskit.qobjnão serão mais validadas com base no esquema jsons do qobj por padrão. Isso inclui as seguintes classes:qiskit.qobj.QasmQobjInstructionqiskit.qobj.QobjExperimentHeaderqiskit.qobj.QasmQobjExperimentConfigqiskit.qobj.QasmQobjExperimentqiskit.qobj.QasmQobjConfigqiskit.qobj.QobjHeaderqiskit.qobj.PulseQobjInstructionqiskit.qobj.PulseQobjExperimentConfigqiskit.qobj.PulseQobjExperimentqiskit.qobj.PulseQobjConfigqiskit.qobj.QobjMeasurementOptionqiskit.qobj.PulseLibraryItemqiskit.qobj.QasmQobjInstructionqiskit.qobj.QasmQobjExperimentConfigqiskit.qobj.QasmQobjExperimentqiskit.qobj.QasmQobjConfigqiskit.qobj.QasmQobjqiskit.qobj.PulseQobj
Se você estava confiando nessa validação ou gostaria de validá-los em relação ao esquema qobj, isso pode ser feito definindo o kwarg
validatecomoTrueno métodoto_dict()de qualquer uma das classes Qobj de nível superiorQasmQobjouPulseQobj. Por exemplo:que validará o dicionário de saída em relação ao esquema jsons do Qobj.
-
O dicionário de saída de
qiskit.qobj.QasmQobj.to_dict()eqiskit.qobj.PulseQobj.to_dict()não está mais em um formato para serialização direta de json, conforme esperado pela API do IBMQ. Esses objetos Qobj são o formato atual que usamos para passar experimentos para provedores/backends e, embora ter um formato de dicionário que pudesse ser passado diretamente para a API do IBMQ fosse moderadamente útil para oqiskit-ibmq-provider, isso tornava as coisas mais difíceis para outros provedores. Especialmente para provedores que envolvem simuladores locais. No futuro, as definições do que é transmitido entre os provedores e o formato de solicitação da API do IBMQ serão ainda mais desacopladas (de forma compatível com as versões anteriores), o que deve aliviar a carga de escrever provedores e back-ends.Na prática, a única diferença funcional entre a saída desses métodos e as versões anteriores é que os números complexos são representados com o tipo
complexe as matrizes numpy não são mais convertidas silenciosamente em lista. Se você já estava chamandojson.dumps()diretamente na saída deto_dict(), após esta versão será necessário um codificador json personalizado para lidar com esses casos. Por exemplo:import json from qiskit.circuit import ParameterExpression from qiskit import qobj my_qasm = qobj.QasmQobj( qobj_id='12345', header=qobj.QobjHeader(), config=qobj.QasmQobjConfig(shots=1024, memory_slots=2, max_credits=10), experiments=[ qobj.QasmQobjExperiment(instructions=[ qobj.QasmQobjInstruction(name='u1', qubits=[1], params=[0.4]), qobj.QasmQobjInstruction(name='u2', qubits=[1], params=[0.4, 0.2]) ]) ] ) qasm_dict = my_qasm.to_dict() class QobjEncoder(json.JSONEncoder): """A json encoder for pulse qobj""" def default(self, obj): # Convert numpy arrays: if hasattr(obj, 'tolist'): return obj.tolist() # Use Qobj complex json format: if isinstance(obj, complex): return (obj.real, obj.imag) if isinstance(obj, ParameterExpression): return float(obj) return json.JSONEncoder.default(self, obj) json_str = json.dumps(qasm_dict, cls=QobjEncoder)gerará uma cadeia de caracteres json exatamente da mesma forma que
json.dumps(my_qasm.to_dict())fazia nas versões anteriores. -
CmdDefestá obsoleto desde o Terra 0.11.0 e foi removido. Continue a usarInstructionScheduleMapem vez disso. -
Os métodos
cmdsecmd_qubitsemInstructionScheduleMapforam descontinuados desde o Terra 0.11.0 e foram removidos. Em vez disso, useinstructionsequbits_with_instruction. -
PulseDefaults desde o lançamento do Terra, 0.11.0, os relatórios
qubit_freq_estemeas_freq_estsão apresentados em Hz em vez de GHz. Um aviso que notificava sobre essa alteração foi removido. -
O suporte anteriormente obsoleto (na versão 0.11.0 ) para a passagem de parâmetros
qiskit.circuit.Instructiondos tipossympy.Basic,sympy.Expr,qiskit.qasm.node.node.Node(nó QASM AST) esympy.Matrixfoi removido. Os tipos suportados para parâmetros de instrução são:intfloatcomplexstrlistnp.ndarrayqiskit.circuit.ParameterExpression
-
As seguintes propriedades de
BackendConfiguration:dtdtmrep_time
todos têm unidades de segundos. Antes da versão 0.11.0,
dtedtmtinham unidades de nanossegundos. Antes da versão 0.12.0,rep_timetinha unidades de microssegundos. Os avisos que alertavam os usuários sobre essas alterações foram removidos do siteBackendConfiguration. -
Um novo requisito foi adicionado à lista de requisitos, retworkx. É uma biblioteca de gráficos licenciada Apache 2.0 que tem uma API semelhante à do networkx e está sendo usada para acelerar significativamente as
qiskit.dagcircuit.DAGCircuitoperações como parte do transpilador. Há binários publicados em PyPI para todas as plataformas suportadas pelo Qiskit Terra, mas se você estiver usando uma plataforma em que não há binários pré-compilados publicados, consulte a documentação do retworkx para obter instruções sobre a instalação via pip a partir do sdist.Se você encontrar algum problema com o transpiler ou com a classe DAGCircuit como parte da transição, poderá voltar à implementação anterior do networkx definindo a variável de ambiente
USE_RETWORKXcomoN. Essa opção será removida na versão 0.14.0.
Notas de descontinuação
-
Passar os dados para o construtor de
qiskit.dagcircuit.DAGNodecomo um dicionário argdata_dictestá obsoleto e será removido em uma versão futura. Em vez disso, agora você deve passar os campos como kwargs para o construtor. Por exemplo, o comportamento anterior de:from qiskit.dagcircuit import DAGNode data_dict = { 'type': 'in', 'name': 'q_0', } node = DAGNode(data_dict)deve ser agora:
from qiskit.dagcircuit import DAGNode node = DAGNode(type='in', name='q_0') -
A nomenclatura dos objetos e métodos do portão foi atualizada para ser mais consistente. As mudanças a seguir foram feitas:
- Todas as portas de Pauli têm apenas uma letra maiúscula (
I,X,Y,Z) - As portas de Pauli parametrizadas (ou seja, rotações) precedem a letra maiúscula
R(RX,RY,RZ) - Uma versão controlada acrescenta a letra maiúscula
C(CX,CRX,CCX) - Os portões são nomeados de acordo com sua ação, não com seus nomes alternativos (
CCX, nãoToffoli)
Os nomes antigos foram descontinuados e serão removidos em uma versão futura. Esta é uma lista das alterações que mostra a classe antiga e a nova, o atributo de nome e os métodos. Se uma nova coluna estiver em branco, não haverá alteração para ela.
Classe antigaNova ClasseAtributo de nome antigoNovo atributo de nomeAntigaqiskit.circuit.QuantumCircuitmétodoNovoqiskit.circuit.QuantumCircuitmétodoToffoliGateCCXGateccxccx()etoffoli()CrxGateCRXGatecrxcrx()CryGateCRYGatecrycry()CrzGateCRZGatecrzcrz()FredkinGateCSwapGatecswapcswap()efredkin()Cu1GateCU1Gatecu1cu1()Cu3GateCU3Gatecu3cu3()CnotGateCXGatecxcx()ecnot()CyGateCYGatecycy()CzGateCZGateczcz()DiagGateDiagonalGatediagdiagonaldiag_gatediagonal()IdGateIGateidideni()eid()Isometryisoisometryiso()isometry()eiso()UCGUCGatemultiplexerucguc()UCRotUCPauliRotGateUCXUCRXGateucrotXucrxucxucrx()UCYUCRYGateucrotyucryucyucry()UCZUCRZGateucrotzucrzuczucrz() - Todas as portas de Pauli têm apenas uma letra maiúscula (
-
O kwarg
periodpara a funçãosquare(),sawtooth()etriangle()emqiskit.pulse.pulse_libestá obsoleto e será removido em uma versão futura. Em vez disso, agora você deve usar ofreqkwarg para definir a frequência. -
Os métodos
DAGCircuit.compose_back()eDAGCircuit.extend_back()estão obsoletos e serão removidos em uma versão futura. Em vez disso, você deve usar o métodoqiskit.dagcircuit.DAGCircuit.compose()que é um método mais geral e mais flexível que oferece a mesma funcionalidade. -
O kwarg
callbackdo construtor da classeqiskit.transpiler.PassManagerfoi preterido e será removido em uma versão futura. Em vez de defini-lo no nível do objeto durante a criação, ele agora deve ser definido como um parâmetro kwarg no métodoqiskit.transpiler.PassManager.run()método. -
As palavras-chave
n_qubitsenumberofqubitsestão obsoletas no Terra e foram substituídas pornum_qubits. Os nomes antigos serão removidos em uma versão futura. Os objetos afetados por essa alteração estão listados abaixo:ClasseMétodo antigoNovo métodoQuantumCircuitn_qubitsnum_qubits()Paulinumberofqubitsnum_qubits()FunçãoArgumento antigoNovo argumentorandom_circuit()n_qubitsnum_qubitsMSGaten_qubitnum_qubits -
A função
qiskit.quantum_info.synthesis.euler_angles_1qestá obsoleta. Ela foi substituída pela classeqiskit.quantum_info.OneQubitEulerDecomposerque oferece a mesma funcionalidade por meio de:OneQubitEulerDecomposer().angles(mat) -
O kwarg
pass_managerpara oqiskit.compiler.transpile()foi descontinuado e será removido em uma versão futura. Daqui para frente, a maneira preferida de transpilar um circuito com um objeto personalizadoPassManagerpersonalizado é usar o métodorun()do objetoPassManager. -
A função
qiskit.quantum_info.random_state()foi preterida e será removida em uma versão futura. Em vez disso, você deve usar a funçãoqiskit.quantum_info.random_statevector()função. -
Os métodos
add,subtractemultiplydoqiskit.quantum_info.Statevectoreqiskit.quantum_info.DensityMatrixestão obsoletos e serão removidos em uma versão futura. Em vez disso, você deve usar os operadores binários+,-,*. -
Substitui
qiskit.quantum_info.Statevector.to_counts(),qiskit.quantum_info.DensityMatrix.to_counts()eqiskit.quantum_info.counts.state_to_counts(). Essas funções são substituídas pelos métodos de classeqiskit.quantum_info.Statevector.probabilities_dict()eqiskit.quantum_info.DensityMatrix.probabilities_dict(). -
SamplePulseeParametricPulses (por exemplo,Gaussian) agora são subclasses doPulsee foram movidos para oqiskit.pulse.pulse_lib. O caminho anterior viapulse.commandsestá obsoleto e será removido em uma versão futura. -
DelayInstructionfoi descontinuado e substituído porDelay. Essa nova instrução foi adotada em relação à anteriorCommandDelay. O padrão de migração é:Delay(<duration>)(<channel>) -> Delay(<duration>, <channel>) DelayInstruction(Delay(<duration>), <channel>) -> Delay(<duration>, <channel>)Até o fim do período de depreciação, a sintaxe anterior do
Delayde chamar um comando em um canal também será compatível:Delay(<phase>)(<channel>)A nova instrução
Delaynão é compatível com o atributocommand. -
FrameChangeeFrameChangeInstructionforam descontinuados e substituídos porShiftPhase. As alterações são:FrameChange(<phase>)(<channel>) -> ShiftPhase(<phase>, <channel>) FrameChangeInstruction(FrameChange(<phase>), <channel>) -> ShiftPhase(<phase>, <channel>)Até o fim do período de depreciação, a sintaxe anterior do FrameChange de chamar um comando em um canal será compatível:
ShiftPhase(<phase>)(<channel>) -
O método
calldeSamplePulseeParametricPulses foi descontinuado. A migração é a seguinte:Pulse(<*args>)(<channel>) -> Play(Pulse(*args), <channel>) -
AcquireInstructionfoi descontinuado e substituído porAcquire. As alterações são:Acquire(<duration>)(<**channels>) -> Acquire(<duration>, <**channels>) AcquireInstruction(Acquire(<duration>), <**channels>) -> Acquire(<duration>, <**channels>)Até que o período de depreciação termine, a sintaxe anterior do Acquire de chamar o comando em um canal será suportada:
Acquire(<duration>)(<**channels>)
Correções de bugs
-
A
BarrierBeforeFinalMeasurementsincluída nos níveis predefinidos do transpiler ao direcionar um dispositivo físico, inseriu anteriormente uma barreira apenas nos qubits medidos. Em alguns casos, isso permitiu que o transpilador inserisse uma troca após uma operação de medição, tornando o circuito inválido para os dispositivos atuais. A passagem foi atualizada para que a barreira inserida abranja todos os qubits do dispositivo. Correções #3937 -
Ao estender uma
QuantumCircuitinstância (extendedora) com outro circuito (extensão), o circuito é tomado como referência. Se um circuito for estendido com ele mesmo, isso levará a um loop infinito, pois o estendido e a extensão são os mesmos. Esse bug foi resolvido copiando a extensão se ela for o mesmo objeto que o extendido. Correções #3811 -
Corrige um caso em
qiskit.result.Result.get_counts()em que os resultados de uma expiração não podiam ser referenciados se o experimento fosse inicializado como um Schedule sem um nome. Correções #2753 -
Anteriormente, a substituição de objetos
Parameterem um circuito por novos objetos Parameter antes de decompor um circuito fazia com que os valores substituídos não fossem substituídos corretamente nas portas decompostas. Isso foi resolvido de forma que a ligação e a decomposição podem ocorrer em qualquer ordem. -
O backend de saída do matplotlib para a função
qiskit.visualization.circuit_drawer()função eqiskit.circuit.QuantumCircuit.draw()foi corrigido para renderizar corretamente as portasCU1Gate. Correções #3684 -
Um bug em
qiskit.circuit.QuantumCircuit.from_qasm_str()eqiskit.circuit.QuantumCircuit.from_qasm_file()ao carregar o QASM com portas personalizadas definidas foi corrigido. Agora, carregando esse QASM:OPENQASM 2.0; include "qelib1.inc"; gate rinv q {sdg q; h q; sdg q; h q; } qreg q[1]; rinv q[0];é equivalente ao circuito a seguir:
rinv_q = QuantumRegister(1, name='q') rinv_gate = QuantumCircuit(rinv_q, name='rinv') rinv_gate.sdg(rinv_q) rinv_gate.h(rinv_q) rinv_gate.sdg(rinv_q) rinv_gate.h(rinv_q) rinv = rinv_gate.to_instruction() qr = QuantumRegister(1, name='q') expected = QuantumCircuit(qr, name='circuit') expected.append(rinv, [qr[0]])Correções #1566
-
Permitir que as instruções de circuito quântico tenham valores de parâmetros de lista. Isso é usado em Aer para parâmetros de snapshot de valor de expectativa, por exemplo,
params = [[1.0, 'I'], [1.0, 'X']]]para . -
Anteriormente, para circuitos que continham portas compostas (aquelas criadas por meio de
qiskit.circuit.QuantumCircuit.to_gate()ouqiskit.circuit.QuantumCircuit.to_instruction()ou seus conversores correspondentes), a tentativa de vincular o circuito mais de uma vez resultaria na aplicação apenas do primeiro valor de vinculação a todos os circuitos quando transpilados. Isso foi resolvido para que os valores fornecidos para vinculações subsequentes sejam respeitados corretamente.
Outras observações
-
As classes qasm e pulse qobj:
QasmQobjInstructionQobjExperimentHeaderQasmQobjExperimentConfigQasmQobjExperimentQasmQobjConfigQobjHeaderPulseQobjInstructionPulseQobjExperimentConfigPulseQobjExperimentPulseQobjConfigQobjMeasurementOptionPulseLibraryItemQasmQobjInstructionQasmQobjExperimentConfigQasmQobjExperimentQasmQobjConfigQasmQobjPulseQobj
de
qiskit.qobjforam todos reimplementados sem o uso da biblioteca marsmallow. Essas novas implementações foram projetadas para serem substituídas (exceto conforme indicado nas notas de versão da atualização), mas as especificidades herdadas do marshmallow podem não funcionar. Registre problemas para quaisquer incompatibilidades encontradas.
Aer 0.5.0
Incluído
- Adicionar suporte para porta diagonal de terra
- Adicionar suporte para qobj parametrizado
Fixo
- Adicionado postfix para linux no Raspberry Pi
- Manipular entradas de matriz numpy de qobj
Ignis 0.3.0
Incluído
- documentação da API
- Benchmarking aleatório CNOT-Dihedral
- Módulo de credenciamento para credenciamento de saída de dispositivos ruidosos
- Calibrações de pulso para qubits únicos
- Discriminador de pulso
- Circuitos de verificação de emaranhamento
- Tomografia de conjunto de portas para conjuntos de portas de um único qubit
- Adiciona funções utilitárias de avaliação comparativa aleatória
calculate_1q_epg,calculate_2q_epgfunções para calcular o erro de 1 e 2 qubit por porta a partir do erro por Clifford - Adiciona funções utilitárias de avaliação comparativa aleatória
calculate_1q_epc,calculate_2q_epcpara calcular o erro de 1 e 2 qubit por Clifford a partir do erro por porta
Alterado
- Suporte a rótulos inteiros para qubits em tomografia
- Suporte a rótulos inteiros para mitigação de erros de medição
Descontinuado
- Descontinua a função
twoQ_clifford_error. Em vez disso, usecalculate_2q_epc. - Python 3.5 no qiskit-ignis está obsoleto. O suporte será removido na data de fim de vida da comunidade python upstream para a versão, que é 13/09/2020.
Aqua 0.6.5
Nenhuma mudança
IBM 0.6.0
Nenhuma mudança