Skip to main content
IBM Quantum Platform

geradores de problemas

qiskit_addon_utils.problem_generators

Métodos utilitários para geração de problemas.

generate_xyz_hamiltonian

generate_xyz_hamiltonian(coupling, *, coupling_constants=(1.0, 1.0, 1.0), ext_magnetic_field=(0.0, 0.0, 0.0), pauli_order_strategy=PauliOrderStrategy.ColorThenInteraction, coloring=None)

GitHub

Gerar um operador de qubit com reconhecimento de conectividade que represente um modelo quântico do tipo XYZ.

Essa função implementa o seguinte Hamiltoniano:

H^=(j,k)E(Jxσjxσkx+Jyσjyσky+Jzσjzσkz)+jV(hxσjx+hyσjy+hzσjz)\hat{H} = \sum_{(j,k)\in E} (J_{x} \sigma_j^{x} \sigma_{k}^{x} + J_{y} \sigma_j^{y} \sigma_{k}^{y} + J_{z} \sigma_j^{z} \sigma_{k}^{z}) + \sum_{j\in V} (h_{x} \sigma_j^{x} + h_{y} \sigma_j^{y} + h_{z} \sigma_j^{z})

Onde G(V,E) é o gráfico do mapa coupling fornecido.

Nota

Muitas vezes, há um fator 12-\frac{1}{2} incluído fora da soma dessa equação. Esse fator não é aplicado internamente, portanto, deve ser contabilizado nas entradas coupling_constants e ext_magnetic_field .

>>> from qiskit.transpiler import CouplingMap
>>> from qiskit_addon_utils.problem_generators import generate_xyz_hamiltonian

>>> coupling_map = CouplingMap.from_line(10)
>>> hamiltonian = generate_xyz_hamiltonian(
...     coupling_map,
...     coupling_constants=(0.4, 0.4, 0.0),
...     ext_magnetic_field=(0.0, 0.0, 0.6),
... )
>>> print(hamiltonian)
SparsePauliOp(['IIIIIIIXXI', 'IIIIIIIYYI', 'IIIIIXXIII', 'IIIIIYYIII',
               'IIIXXIIIII', 'IIIYYIIIII', 'IXXIIIIIII', 'IYYIIIIIII',
               'IIIIIIIIXX', 'IIIIIIIIYY', 'IIIIIIXXII', 'IIIIIIYYII',
               'IIIIXXIIII', 'IIIIYYIIII', 'IIXXIIIIII', 'IIYYIIIIII',
               'XXIIIIIIII', 'YYIIIIIIII', 'IIIIIIIIIZ', 'IIIIIIIIZI',
               'IIIIIIIZII', 'IIIIIIZIII', 'IIIIIZIIII', 'IIIIZIIIII',
               'IIIZIIIIII', 'IIZIIIIIII', 'IZIIIIIIII', 'ZIIIIIIIII'],
            coeffs=[0.4+0.j, 0.4+0.j, 0.4+0.j, 0.4+0.j, 0.4+0.j, 0.4+0.j, 0.4+0.j, 0.4+0.j,
                    0.4+0.j, 0.4+0.j, 0.4+0.j, 0.4+0.j, 0.4+0.j, 0.4+0.j, 0.4+0.j, 0.4+0.j,
                    0.4+0.j, 0.4+0.j, 0.6+0.j, 0.6+0.j, 0.6+0.j, 0.6+0.j, 0.6+0.j, 0.6+0.j,
                    0.6+0.j, 0.6+0.j, 0.6+0.j, 0.6+0.j])

Parâmetros

  • coupling (CouplingMap |PyGraph |PyDiGraph) – O subgráfico de qubit no qual mapear o Hamiltoniano. A direcionalidade das bordas do gráfico será ignorada, e as bordas paralelas serão tratadas como uma única borda durante a geração do operador.
  • coupling_constants (Sequence[float]) – As constantes de acoplamento com valor real, JiJ_i, em cada eixo cartesiano.
  • ext_magnetic_field (Sequence[float]) – Os coeficientes, hih_i, representam um campo magnético ao longo de cada eixo cartesiano.
  • pauli_order_strategy (PauliOrderStrategy) – Indica a estratégia de iteração na qual os termos de Pauli serão gerados. Veja PauliOrderStrategy para obter mais detalhes.
  • coloring (dict[tuple[int, int], int] | None) – Um dicionário opcional que codifica a coloração do gráfico que é usada para classificar os termos hamiltonianos. Esse dicionário mapeia rótulos de borda (na forma de pares de números inteiros) para valores de cor (números inteiros simples). Os termos de interação hamiltoniana serão adicionados ao aumentar o valor da cor. Dentro de cada cor, as bordas são classificadas, o que não altera nada fisicamente, mas resulta em resultados mais fáceis de ler.

Retorna

Um operador de qubit que descreve um modelo quântico do tipo XYZ. O i-ésimo qubit no operador corresponde ao nó no índice i no mapa de acoplamento.

Aumentos

  • ValueError - As constantes de acoplamento devem ser especificadas por uma sequência length-3 de valores de ponto flutuante.
  • ValueError - O campo magnético externo deve ser especificado por uma sequência length-3 de valores de ponto flutuante.

Tipo de retorno

SparsePauliOp

generate_time_evolution_circuit

generate_time_evolution_circuit(operator, *, synthesis=None, time=1.0)

GitHub

Modelar a evolução temporal de um operador.

>>> from qiskit.quantum_info import SparsePauliOp
>>> from qiskit.synthesis import SuzukiTrotter
>>> from qiskit.transpiler import CouplingMap
>>> from qiskit_addon_utils.problem_generators import (
...     PauliOrderStrategy,
...     generate_xyz_hamiltonian,
...     generate_time_evolution_circuit,
... )
>>> coupling_map = CouplingMap.from_line(6)
>>> hamiltonian = generate_xyz_hamiltonian(
...     coupling_map,
...     coupling_constants=(0.4, 0.4, 0.0),
...     ext_magnetic_field=(0.0, 0.0, 0.6),
...     pauli_order_strategy=PauliOrderStrategy.InteractionThenColorZigZag,
... )
>>> circ = generate_time_evolution_circuit(
...     hamiltonian, synthesis=SuzukiTrotter(order=2, reps=2), time=2.0
... )
>>> _ = circ.draw("mpl", fold=-1)
Saída do código anterior.

Parâmetros

  • operator (SparsePauliOp) – O operador para o qual será modelada a evolução do tempo.
  • synthesis (EvolutionSynthesis | None) – Uma estratégia de síntese. Se None, a síntese padrão é a fórmula do produto Lie-Trotter com uma única repetição.
  • time (float) – O tempo de evolução.

Retorna

A QuantumCircuit implementando um operador com evolução temporal.

Tipo de retorno

QuantumCircuit

PauliOrderStrategy

class PauliOrderStrategy(value)

GitHub

Bases: Enum

Enumeração de diferentes ordenações de Pauli.

Ao construir um Hamiltoniano em um conjunto colorido de bordas, os termos de Pauli gerados podem ser ordenados de diferentes maneiras. Essa ordem de termos no Hamiltoniano é preservada durante sua evolução temporal e, portanto, afeta diretamente o circuito quântico resultante.

ColorThenInteraction

Valor Padrão: 1

Essa estratégia primeiro itera todas as bordas (classificadas por seu valor de cor) e, em seguida, as interações (classificadas como X, Y, Z).

InteractionThenColor

Valor Padrão: 2

Essa estratégia é o inverso de ColorThenInteraction. Primeiro, ele itera as interações (classificadas como X, Y, Z) e, em seguida, todas as bordas (classificadas por seu valor de cor).

InteractionThenColorZigZag

Valor Padrão: 3

Essa estratégia é semelhante à de InteractionThenColor . No entanto, ele alterna entre iterar as bordas incrementando e decrementando os valores de cor à medida que salta de uma interação para outra. Por exemplo, se apenas as interações X e Y forem incluídas e três valores de cores forem usados ({1, 2, 3}), isso resultará na seguinte ordem: ["X on 1", "X on 2", "X on 3", "Y on 3", "Y on 2", "Y on 1"].

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