Skip to main content
IBM Quantum Platform

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_units kwarg a qiskit.providers.aer.noise.NoiseModel.from_device() para especificar gate_lengths personalizado 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 validate no método qiskit.providers.aer.QasmSimualtor.run() para o objeto de backend como True.

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.BaseJob tem 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_state for None, 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 ao qiskit.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 ao qiskit.circuit.QuantumCircuit.qasm() . Quando definido como True , 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 ao qiskit.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 SetFrequency que permite aos usuários alterar a frequência do PulseChannel. 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 SetFrequency será a frequência padrão e todos os pulsos aplicados ao canal de acionamento zero após o comando SetFrequency estarão em 5.5 GHz. Os usuários do site SetFrequency devem ter em mente as limitações de hardware.

  • Um novo método, assign_parameters() foi adicionado à classe qiskit.circuit.QuantumCircuit classe. 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 inplace kwarg, é possível especificar que você pode modificar opcionalmente o circuito original no lugar. Por padrão, isso é definido como False e uma cópia do circuito original será retornada pelo método.

  • Um novo método num_nonlocal_gates() foi adicionado à classe qiskit.circuit.QuantumCircuit classe. 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.QuantumCircuit método iso() para adicionar uma porta Isometry ao circuito tem um novo alias. Agora você pode ligar para qiskit.circuit.QuantumCircuit.isometry() além de ligar para iso.

  • Um atributo description foi adicionado à classe CouplingMap para armazenar uma breve descrição de diferentes mapas de acoplamento (por exemplo, completo, grade, linha etc.).

  • Um novo método compose() foi adicionado à classe DAGCircuit para 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.mock agora têm um método run() funcional que retornará resultados semelhantes aos dos dispositivos reais. Se o site qiskit-aer estiver 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.QasmSimulatorPy será usado para executar uma simulação ideal. Além disso, se um experimento de pulso for passado para run e o qiskit-aer estiver instalado, o PulseSimulator será usado para simular as programações de pulso.

  • O método qiskit.result.Result() método get_counts() agora retornará uma lista de todas as contagens disponíveis quando houver vários circuitos em um trabalho. Isso funciona quando get_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ção qiskit.visualization.circuit_drawer() e ao método QuantumCircuit método draw(). Quando definido como True , 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.InstructionScheduleMap que retorna um novo qiskit.pulse.Schedule quando 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.iSwapGate e qiskit.extensions.DCXGate, juntamente com seus QuantumCircuit métodos iswap() e dcx() 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.BaseJob agora tem um novo método wait_for_final_state() que pesquisa o status do trabalho até que ele atinja um estado final (como DONE ou ERROR). Esse método também recebe um callback kwarg opcional que recebe um Python callable que será chamado durante cada iteração do loop de sondagem.

  • Os atributos search_width e search_depth do passe qiskit.transpiler.passes.LookaheadSwap agora 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 BackendConfiguration pode agora ser acessado por meio da propriedade num_qubits. Anteriormente, ele só podia ser acessado por meio do atributo n_qubits .

  • Dois novos métodos, angles() e angles_and_phase()foram adicionados à classe qiskit.quantum_info.OneQubitEulerDecomposer classe. Esses métodos retornarão os parâmetros relevantes sem validação, e chamar o objeto OneQubitEulerDecomposer executará a síntese completa com validação.

  • Uma base de decomposição RR foi adicionada ao qiskit.quantum_info.OneQubitEulerDecomposer para decompor um 2x2 unitário arbitrário em um circuito de dois RGate .

  • Adiciona a capacidade de definir qargs para objetos que são subclasses da classe abstrata BaseOperator . Isso é feito chamando o objeto op(qargs) (onde op é uma classe de operador) e retornará uma cópia superficial do objeto original com uma propriedade qargs definida. Quando esse objeto é usado com o compose() ou dot() o valor interno de qargs será usado quando o método qargs kwarg 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.Clifford classe 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étodo to_circuit() para compilação em um QuantumCircuit de 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.SparsePauliOp classe de operador. Essa é uma representação eficiente de uma matriz N-qubit que é esparsa na base Pauli e usa um qiskit.quantum_info.PauliTable e um vetor de coeficientes complexos para sua estrutura de dados.

    Essa classe suporta grande parte da mesma funcionalidade da classe qiskit.quantum_info.Operator classe para que os objetos SparsePauliOp os objetos podem ser tensionados, compostos, multiplicados por escalar, adicionados e subtraídos.

    As matrizes Numpy ou os objetos Operator podem ser convertidos em um objeto SparsePauliOp usando o método :class:`~qiskit.quantum_info.SparsePauliOp.from_operator. SparsePauliOp pode ser convertido em uma matriz csr_matrix esparsa ou em uma matriz Numpy densa usando o método to_matrix ou para um objeto Operator objeto usando o método to_operator método.

    A SparsePauliOp pode ser iterado em termos de seus componentes e coeficientes PauliTable , seus coeficientes e rótulos de cadeia de Pauli usando o método label_iter() e os componentes (densos ou esparsos) da matriz usando o método matrix_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 usando diamond_norm(chan1 - chan2).

  • Uma nova classe qiskit.quantum_info.PauliTable foi adicionada. Essa é uma representação simpática eficiente de uma lista de operadores Pauli de N-qubit. Alguns recursos dessa classe são:

    • PauliTable os objetos podem ser compostos e tensionados, o que retornará um objeto PauliTable com 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.PauliTable para obter mais detalhes.

  • Adiciona a classe qiskit.quantum_info.StabilizerTable . Essa é uma subclasse da classe qiskit.quantum_info.PauliTable que 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 objeto qiskit.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.ScalarOp classe 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 do BaseOperator (como um qiskit.quantum_info.Operator ou qiskit.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 à classe qiskit.quantum_innfo.Operator que 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 operador qiskit.quantum_info.Clifford aleatório.

  • Adicionar qiskit.quantum_info.random_quantum_channel() para gerar um canal quântico aleatório com classificação fixa Choi-fixo na representação Stinespring representação.

  • Adicionar qiskit.quantum_info.random_hermitian() para gerar um Hermitian aleatório Operator.

  • Adicionar qiskit.quantum_info.random_statevector() para gerar um arquivo Statevector.

  • Adiciona qiskit.quantum_info.random_pauli_table() para gerar um qiskit.quantum_info.PauliTable aleatório.

  • Adiciona qiskit.quantum_info.random_stabilizer_table() para gerar um qiskit.quantum_info.StabilizerTable aleatório.

  • Adicione um atributo num_qubits a qiskit.quantum_info.StateVector e qiskit.quantum_info.DensityMatrix classes. Isso retorna o número de qubits para estados N-qubit e retorna None para estados não-qubit.

  • Adiciona to_dict() e to_dict() para converter qiskit.quantum_info.Statevector e qiskit.quantum_info.DensityMatrix em 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() e probabilities() a qiskit.quantum_info.Statevector e qiskit.quantum_info.DensityMatrix que 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() e probabilities_dict() a qiskit.quantum_info.Statevector e qiskit.quantum_info.DensityMatrix que 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() e sample_memory() aos métodos Statevector e DensityMatrix para 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étodo qiskit.quantum_info.Statevector e qiskit.quantum_info.DensityMatrix classes 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étodo qiskit.quantum_info.Statevector e qiskit.quantum_info.DensityMatrix classes de estado quântico. Isso permite redefinir alguns ou todos os subsistemas para o estado 0|0\rangle. 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:

    • HGate
    • XGate
    • YGate
    • ZGate
    • RXGate
    • RYGate
    • RZGate
    • SGate
    • SdgGate
    • TGate
    • TdgGate
    • U1Gate

    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 kwarg schedule_circuit. Ao definir schedule_circuit=True , isso permite o agendamento do circuito em um Schedule. Isso permite que os usuários que criam objetos qiskit.circuit.QuantumCircuit usem métodos de agendamento personalizados, como os métodos as_late_as_possible e as_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_WARNINGS pode ser definida como Y ou y, o que suprimirá os avisos sobre o qiskit-aer e o qiskit-ibmq-provider nã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 como N ou n para 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 como true em seu arquivo de configuração do usuário, como:

    [default]
    suppress_packaging_warnings = true

    ele suprimirá os avisos sobre o fato de qiskit-aer e qiskit-ibmq-provider nã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 de QISKIT_SUPPRESS_PACKAGING_WARNINGS para N ou n

  • qiskit.compiler.transpile() tem dois novos kwargs, layout_method e routing_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á DenseLayout layout pass e LookaheadSwap passagem de roteamento.

  • Houve uma simplificação significativa no estilo em que as instruções do Pulse são criadas.

    No estilo anterior, os Command s eram chamados com canais para fazer um Instruction. 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 Play que recebe uma descrição de um envelope de pulso e um canal. Há uma nova classe Pulse no site pulse_lib da 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ção del ou a função delattr() 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 (com pip install pygments ou pip install qiskit-terra[visualization]) antes de usar o widget %circuit_library_info em qiskit.tools.jupyter ou o kwarg formatted no método qasm() método.

  • A opção pulse buffer encontrada em qiskit.pulse.Channel e qiskit.pulse.Schedule foi 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, MeasureChannel e ControlChannel, use from qiskit.pulse.channels import X no lugar de from 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 um qiskit.transpiler.PassManager foi removida e substituída por uma nova classe qiskit.transpile.PassManagerConfig. Essa nova classe foi estruturada para incluir apenas as informações necessárias para construir um PassManager. Os atributos dessa classe são:

    • initial_layout
    • basis_gates
    • coupling_map
    • backend_properties
    • seed_transpiler
  • A função transpile_circuit em qiskit.transpiler foi removida. Para transpilar um circuito com um PassManager personalizado, agora você deve usar o método run() do objeto :class:~qiskit.transpiler.PassManager`.

  • O método QuantumCircuit método draw() e a função qiskit.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 kwarg initial_state como True. 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() (e qiskit.execute.execute(), que usa transpile internamente) agora gerará um erro quando o kwarg pass_manager for definido e um valor for definido para outros kwargs que já estejam definidos em um objeto instanciado PassManager instanciado. Anteriormente, esses kwargs conflitantes eram simplesmente ignorados silenciosamente e os valores na instância PassManager eram 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 pm seria usado silenciosamente e o valor do kwarg optimization_level seria ignorado. Os kwargs do site transpile aos quais isso se aplica são:

    • optimization_level
    • basis_gates
    • coupling_map
    • seed_transpiler
    • backend_properties
    • initial_layout
    • layout_method
    • routing_method
    • backend
  • O Operator, Clifford, SparsePauliOp, PauliTable, StabilizerTable, as classes de operador têm um método call adicionado que permite atribuir um qargs ao operador para uso com o método compose(), dot(), evolve(),``+`` e - operações.

  • O método de adição da classe qiskit.quantum_info.Operatoragora aceita um qarg kwarg para permitir a adição de um operador menor a um maior, assumindo identidades nos outros subsistemas (o mesmo que para qargs em compose() e dot() ). 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 BaseOperator foi 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á um NotImplementedError quando os métodos não estiverem definidos.

  • A função qiskit.quantum_info.random_density_matrix() agora retornará um objeto DensityMatrix aleatório. Nas versões anteriores, ele retornava uma matriz numpy.

  • O qiskit.quantum_info.Statevector e qiskit.quantum_info.DensityMatrix nã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-chave validate definido como True.

  • As classes de construção qobj em qiskit.qobj não serão mais validadas com base no esquema jsons do qobj por padrão. Isso inclui as seguintes classes:

    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 validate como True no método to_dict() de qualquer uma das classes Qobj de nível superior QasmQobj ou PulseQobj. 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() e qiskit.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 o qiskit-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 complex e as matrizes numpy não são mais convertidas silenciosamente em lista. Se você já estava chamando json.dumps() diretamente na saída de to_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.

  • CmdDef está obsoleto desde o Terra 0.11.0 e foi removido. Continue a usar InstructionScheduleMap em vez disso.

  • Os métodos cmds e cmd_qubits em InstructionScheduleMap foram descontinuados desde o Terra 0.11.0 e foram removidos. Em vez disso, use instructions e qubits_with_instruction .

  • PulseDefaults desde o lançamento do Terra, 0.11.0, os relatórios qubit_freq_est e meas_freq_est sã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.Instruction dos tipos sympy.Basic, sympy.Expr, qiskit.qasm.node.node.Node (nó QASM AST) e sympy.Matrix foi removido. Os tipos suportados para parâmetros de instrução são:

  • As seguintes propriedades de BackendConfiguration:

    • dt
    • dtm
    • rep_time

    todos têm unidades de segundos. Antes da versão 0.11.0, dt e dtm tinham unidades de nanossegundos. Antes da versão 0.12.0, rep_time tinha unidades de microssegundos. Os avisos que alertavam os usuários sobre essas alterações foram removidos do site BackendConfiguration.

  • 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.DAGCircuit operaçõ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_RETWORKX como N. Essa opção será removida na versão 0.14.0.

Notas de descontinuação

  • Passar os dados para o construtor de qiskit.dagcircuit.DAGNode como um dicionário arg data_dict está 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ão Toffoli)

    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 antiga
    Nova Classe
    Atributo de nome antigo
    Novo atributo de nome
    ToffoliGateCCXGateccxccx() e toffoli()
    CrxGateCRXGatecrxcrx()
    CryGateCRYGatecrycry()
    CrzGateCRZGatecrzcrz()
    FredkinGateCSwapGatecswapcswap() e fredkin()
    Cu1GateCU1Gatecu1cu1()
    Cu3GateCU3Gatecu3cu3()
    CnotGateCXGatecxcx() e cnot()
    CyGateCYGatecycy()
    CzGateCZGateczcz()
    DiagGateDiagonalGatediagdiagonaldiag_gatediagonal()
    IdGateIGateidideni() e id()
    Isometryisoisometryiso()isometry() e iso()
    UCGUCGatemultiplexerucguc()
    UCRotUCPauliRotGate
    UCXUCRXGateucrotXucrxucxucrx()
    UCYUCRYGateucrotyucryucyucry()
    UCZUCRZGateucrotzucrzuczucrz()
  • O kwarg period para a função square(), sawtooth() e triangle() em qiskit.pulse.pulse_lib está obsoleto e será removido em uma versão futura. Em vez disso, agora você deve usar o freq kwarg para definir a frequência.

  • Os métodos DAGCircuit.compose_back() e DAGCircuit.extend_back() estão obsoletos e serão removidos em uma versão futura. Em vez disso, você deve usar o método qiskit.dagcircuit.DAGCircuit.compose() que é um método mais geral e mais flexível que oferece a mesma funcionalidade.

  • O kwarg callback do construtor da classe qiskit.transpiler.PassManager foi 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étodo qiskit.transpiler.PassManager.run() método.

  • As palavras-chave n_qubits e numberofqubits estão obsoletas no Terra e foram substituídas por num_qubits. Os nomes antigos serão removidos em uma versão futura. Os objetos afetados por essa alteração estão listados abaixo:

    Classe
    Método antigo
    Novo método
    QuantumCircuitn_qubitsnum_qubits()
    Paulinumberofqubitsnum_qubits()
    Função
    Argumento antigo
    Novo argumento
    random_circuit()n_qubitsnum_qubits
    MSGaten_qubitnum_qubits
  • A função qiskit.quantum_info.synthesis.euler_angles_1q está obsoleta. Ela foi substituída pela classe qiskit.quantum_info.OneQubitEulerDecomposer que oferece a mesma funcionalidade por meio de:

    OneQubitEulerDecomposer().angles(mat)
  • O kwarg pass_manager para o qiskit.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 personalizado PassManager personalizado é usar o método run() do objeto PassManager .

  • 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ção qiskit.quantum_info.random_statevector() função.

  • Os métodos add, subtract e multiply do qiskit.quantum_info.Statevector e qiskit.quantum_info.DensityMatrix estã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() e qiskit.quantum_info.counts.state_to_counts(). Essas funções são substituídas pelos métodos de classe qiskit.quantum_info.Statevector.probabilities_dict() e qiskit.quantum_info.DensityMatrix.probabilities_dict().

  • SamplePulse e ParametricPulse s (por exemplo, Gaussian) agora são subclasses do Pulse e foram movidos para o qiskit.pulse.pulse_lib. O caminho anterior via pulse.commands está obsoleto e será removido em uma versão futura.

  • DelayInstruction foi descontinuado e substituído por Delay. Essa nova instrução foi adotada em relação à anterior Command Delay. 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 Delay de chamar um comando em um canal também será compatível:

    Delay(<phase>)(<channel>)

    A nova instrução Delay não é compatível com o atributo command .

  • FrameChange e FrameChangeInstruction foram descontinuados e substituídos por ShiftPhase. 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 call de SamplePulse e ParametricPulse s foi descontinuado. A migração é a seguinte:

    Pulse(<*args>)(<channel>) -> Play(Pulse(*args), <channel>)
  • AcquireInstruction foi descontinuado e substituído por Acquire. 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 BarrierBeforeFinalMeasurements incluí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 QuantumCircuit instâ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 Parameter em 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 e qiskit.circuit.QuantumCircuit.draw() foi corrigido para renderizar corretamente as portas CU1Gate . Correções #3684

  • Um bug em qiskit.circuit.QuantumCircuit.from_qasm_str() e qiskit.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 I+X\langle I + X\rangle.

  • Anteriormente, para circuitos que continham portas compostas (aquelas criadas por meio de qiskit.circuit.QuantumCircuit.to_gate() ou qiskit.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

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_epg funçõ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_epc para 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, use calculate_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

Esta página foi útil?
Relate um bug, erro de digitação ou solicite conteúdo no GitHub.