Skip to main content
IBM Quantum Platform

HI-VQE Chemistry - Uma função Qiskit da Qunova Computing

Consulte a referência da API

Note

As funções do Qiskit são um recurso experimental disponível apenas para usuários dos planos IBM Quantum® Premium Plan, Flex Plan e On-Prem (via IBM Quantum Platform API). Eles estão no status de versão prévia e estão sujeitos a alterações.

  • O código nesta página foi desenvolvido utilizando os seguintes requisitos. Recomendamos usar essas versões ou mais recentes.

    qiskit-ibm-runtime~=0.45.0
    

Visão geral

Na química quântica, o problema da estrutura eletrônica concentra-se em encontrar as soluções para a equação eletrônica de Schrödinger - as funções de onda quântica que descrevem o comportamento dos elétrons do sistema. Essas funções de onda são vetores de amplitudes complexas, com cada amplitude correspondendo à contribuição de uma possível configuração de elétrons.

O estado fundamental é a função de onda de energia mais baixa do sistema e tem uma importância especial no estudo de sistemas moleculares. A abordagem mais precisa para calcular o estado fundamental considera todas as configurações possíveis de elétrons, mas isso se torna intratável para sistemas maiores, pois o número de configurações cresce exponencialmente com o tamanho do sistema.

O Handover Iterative Variational Quantum Eigensolver (HI-VQE) é um método quântico-clássico híbrido inovador para estimar com precisão o estado fundamental de sistemas moleculares. Ele integra hardware quântico com computação clássica, usando processadores quânticos para explorar com eficiência as configurações de elétrons candidatos e calcular a função de onda resultante em computadores clássicos. Ao gerar funções de onda compactas, porém quimicamente precisas, o HI-VQE aprimora a pesquisa e a descoberta em química quântica e ciência dos materiais.

Imagem mostrando uma visão geral do algoritmo HI-VQE do Qunova

O HI-VQE reduz a complexidade computacional do problema de estrutura eletrônica ao estimar com eficiência o estado fundamental com alta precisão. Ele se concentra em um subconjunto cuidadosamente selecionado das configurações de elétrons mais relevantes, otimizando a precisão e a eficiência.

Combinando os pontos fortes dos computadores clássicos e quânticos, o HI-VQE refina e aprimora iterativamente a função de onda da estimativa atual. Suas técnicas exclusivas de construção de subespaços ajudam a tornar a seleção de configurações mais eficiente, de modo que os usuários tenham maior controle computacional e precisão aprimorada nas simulações de química quântica.

Se você quiser saber mais sobre o algoritmo, pode ler o artigo científico associado.


Descrição

O número de configurações de elétrons de um sistema molecular cresce exponencialmente com o tamanho do sistema. No entanto, para determinados estados eletrônicos, como o estado fundamental, é comum que apenas uma pequena fração das configurações contribua significativamente para a energia do estado. Os métodos de interação de configuração selecionada (SCI) exploram essa dispersão para reduzir os custos de computação, identificando e concentrando-se nas configurações mais relevantes. Esse subconjunto de configurações é chamado de subespaço.

O HI-VQE aproveita a eficiência inerente dos computadores quânticos para representar sistemas moleculares e auxiliar a pesquisa de subespaços. Ele integra subrotinas clássicas e quânticas para resolver o problema da estrutura eletrônica com alta precisão. Diferentemente dos métodos SCI quânticos existentes, o HI-VQE combina treinamento variacional, construção iterativa de subespaço e triagem de configuração de pré-diagonalização para aumentar a eficiência, reduzindo as medições quânticas, as iterações e os custos de diagonalização clássica. Portanto, o HI-VQE pode ser aplicado a sistemas moleculares maiores, que exigem mais qubits, e reduz o custo para resolver um problema de um determinado tamanho com o mesmo grau de precisão.

Imagem que mostra uma descrição detalhada de cada etapa do algoritmo HI-VQE da Qunova.

Para calcular o estado fundamental de um sistema, o HI-VQE usa primeiro o pacote de química clássica PySCF para gerar uma representação molecular a partir de entradas fornecidas pelo usuário, como a geometria molecular e outras informações moleculares. Em seguida, ele entra em um loop híbrido de otimização quântica-clássica, refinando iterativamente um subespaço para representar de forma ideal o estado fundamental e, ao mesmo tempo, minimizar o número de configurações incluídas. O loop continua até que os critérios de convergência, como o tamanho do subespaço ou a estabilidade da energia, sejam atendidos, após o que a função de onda e a energia do estado fundamental computadas são emitidas. Esses resultados podem ser usados para construir superfícies de energia potencial precisas e realizar análises adicionais do sistema.

O ciclo de otimização se concentra no ajuste dos parâmetros de um circuito quântico para gerar um subespaço de alta qualidade. O HI-VQE oferece três opções de circuitos quânticos: excitation_preserving, efficient_su2 e LUCJ. A otimização é inicializada próxima ao estado de referência de Hartree-Fock devido à sua adequação geral. O circuito é então executado em um dispositivo quântico, e as configurações são amostradas a partir do estado quântico resultante antes de serem retornadas como sequências binárias. Devido ao ruído dos dispositivos quânticos, algumas configurações amostradas podem ser fisicamente inválidas, não conservando o número de elétrons ou o spin. O HI-VQE resolve essa questão por meio do processo de recuperação de configuração do pacote qiskit-addon-sqd, de modo que os usuários possam corrigir configurações inválidas ou descartá-las.

As configurações válidas são então submetidas a uma etapa de triagem opcional para remover as que se prevê que contribuam minimamente. Isso reduz a dimensão do subespaço, diminuindo assim o custo da etapa de diagonalização. Se a triagem for ativada, um Hamiltoniano de subespaço preliminar será construído a partir das configurações válidas e uma diagonalização será executada com critérios de terminação muito flexíveis. Embora a precisão das amplitudes resultantes para cada configuração seja baixa, ela é eficaz para prever quais configurações devem ser deixadas de fora do subespaço nessa iteração, além de ser rápida de calcular.

As configurações selecionadas são adicionadas ao subespaço, e o Hamiltoniano do sistema é projetado nesse subespaço. O subespaço é atualizado iterativamente, preservando as configurações mais relevantes entre as iterações. Essa abordagem contrasta com os métodos alternativos porque o circuito quântico não precisa se aproximar do estado fundamental completo em cada etapa.

Em seguida, o subespaço Hamiltoniano é classicamente diagonalizado para obter o menor valor próprio e seu vetor próprio correspondente, representando uma aproximação do estado fundamental e sua energia. À medida que a qualidade do subespaço melhora com as iterações, o estado fundamental calculado se aproxima melhor do estado fundamental verdadeiro. Uma etapa de triagem adicional pode ser realizada nesse ponto para remover quaisquer configurações do subespaço que não tenham uma contribuição substancial para o estado fundamental calculado. Essa etapa garante que o subespaço levado para a próxima iteração seja o mais compacto possível. Isso é avaliado com base nas amplitudes retornadas pela diagonalização, pois elas representam a contribuição importante de cada configuração para o estado fundamental calculado.

Em seguida, uma verificação de convergência determina se um treinamento adicional melhoraria os resultados. Em caso afirmativo, uma etapa opcional de expansão clássica é executada, os parâmetros do circuito quântico são atualizados para minimizar ainda mais a energia calculada e o processo se repete. A etapa de expansão clássica gera configurações adicionais para o subespaço, complementando as configurações amostradas do dispositivo quântico. Primeiro, ele identifica a configuração com a maior amplitude nos resultados da diagonalização, antes de gerar novas configurações com excitações simples e duplas a partir da configuração identificada. O número desejado dessas configurações é então adicionado ao subespaço.

Quando for determinado que as iterações convergiram, o HI-VQE retorna o estado fundamental calculado (na forma de estados no subespaço e suas amplitudes na função de onda do estado fundamental), sua energia e uma medida de variação de energia que indica se o estado calculado forma um estado próprio do Hamiltoniano do sistema.

Os usuários podem decidir o circuito quântico usado e o número de disparos realizados para cada circuito quântico, bem como controlar o tamanho do subespaço ou permitir a geração clássica de configurações adicionais para auxiliar as configurações quânticas geradas. Dessa forma, os usuários podem adaptar o comportamento do HI-VQE para atender às aplicações desejadas.


Introdução

Primeiro, solicite acesso à função. Em seguida, autentique-se usando sua chave de API IBM Quantum® e, supondo que você já tenha salvo sua conta em seu ambiente local, selecione a função Qiskit da seguinte forma:

import reprlib
from qiskit_ibm_catalog import QiskitFunctionsCatalog

catalog = QiskitFunctionsCatalog(channel="ibm_quantum_platform")

# Verify that you have access to the function
catalog.list()

Output:

[QiskitFunction(qunova/hivqe-chemistry),
 QiskitFunction(global-data-quantum/quantum-portfolio-optimizer),
 QiskitFunction(algorithmiq/tem),
 QiskitFunction(qedma/qesem),
 QiskitFunction(multiverse/singularity),
 QiskitFunction(ibm/circuit-function),
 QiskitFunction(q-ctrl/optimization-solver),
 QiskitFunction(colibritd/quick-pde),
 QiskitFunction(q-ctrl/performance-management),
 QiskitFunction(kipu-quantum/iskay-quantum-optimizer)]
# Load the function
function = catalog.load("qunova/hivqe-chemistry")

Exemplo

O primeiro exemplo mostra como calcular a energia do estado fundamental de uma molécula NH3 usando o algoritmo HI-VQE.

Defina a geometria molecular e as opções

A geometria molecular do site NH3 é fornecida com coordenadas cartesianas separadas por ";" para cada átomo.

# Define the molecule geometry
geometry = """
N         -0.85188       -0.02741        0.03141;
H          0.16545        0.00593       -0.01648;
H         -1.16348       -0.39357       -0.86702;
H         -1.16348        0.94228        0.06281;
"""

Opções adicionais podem ser definidas e fornecidas para o sistema molecular no seguinte formato de dicionário.

# Configure some options for the job.
molecule_options = {"basis": "sto3g"}
hivqe_options = {"shots": 100, "max_iter": 20}

Execute a função com entradas de geometria e opções.

# Run HI-VQE
job = function.run(
    geometry=geometry,
    # `backend_name` is the name of a backend with at least 16 qubits,
    # for example, "ibm_marrakesh".
    backend_name=backend_name,
    max_states=2000,
    max_expansion_states=10,
    molecule_options=molecule_options,
    hivqe_options=hivqe_options,
)

É uma boa ideia imprimir o ID do trabalho da função para que ele possa ser fornecido nas solicitações de suporte se algo der errado.

print("Job ID:", job.job_id)

Output:

Job ID: e5ced6f2-fd1d-4244-a6aa-bd27cfb0cdee

Esse exemplo utiliza 16 qubits com 8 orbitais da base sto3g para uma molécula NH3.

Verifique o status da sua carga de trabalho do Qiskit Function ou obtenha os resultados da seguinte maneira:

print(job.status())

Output:

QUEUED

Após a conclusão do trabalho, os resultados podem ser obtidos com a instância result() .

result = job.result()

# Output can be long, so we display a shortened representation
shortened_result = reprlib.repr(result)
print(shortened_result)

Output:

{'eigenvector': [0.9824448589364075, 0.009527106392132133, 6.854074372058527e-08, 3.591500190038039e-07, 0.0012975231577544268, 2.310159709002111e-05, ...], 'energy': -55.52108557170985, 'energy_history': [-55.51901898989887, -55.52056881448526, -55.52065046778772, -55.520690696813716, -55.520691108428, -55.520708448092634, ...], 'energy_variance': 3.066239097617371e-10, ...}

Para acessar a energia do estado fundamental, use a tecla "energy" (energia). A chave "eigenvector" fornece os coeficientes de CI com a notação de cadeia de bits correspondente da configuração de elétrons armazenada com "estados" dos resultados.

fci_energy = -55.521148034704126  # the exact energy using FCI method
hivqe_energy = result["energy"]
print(
    f"|Exact Energy - HI-VQE Energy|: "
    f"{abs(fci_energy - hivqe_energy) * 1000} mHa"
)
print(f"Sampled Number of States: {len(result['states'])}")

Output:

|Exact Energy - HI-VQE Energy|: 0.06246299427914437 mHa
Sampled Number of States: 1936

Licenciamento

Observe que o uso desta função do Qiskit está limitado a problemas que exijam, no máximo, 20 qubits, a menos que seja obtida uma licença que conceda um limite maior.

Envie um e-mail para qiskit.support @ qunovacomputing.com com dúvidas sobre licenças.

Exemplo de uso de função licenciada

Os usuários licenciados recebem um token de licença e, em seguida, devem usar uma biblioteca wrapper para enviar seu token de licença à função. A biblioteca wrapper pode ser instalada a partir de PyPI com pip install hivqe-qiskit-function-utils. O exemplo abaixo mostra como essa biblioteca deve ser usada para enviar seu token de licença ao chamar a função.

import math
from qiskit_ibm_catalog import QiskitFunctionsCatalog
from hivqe_qiskit_function_utils import FunctionWrapper

catalog = QiskitFunctionsCatalog(
    token="your_qiskit_functions_catalog_token",
    channel="ibm_quantum_platform",
    instance="your_ibm_instance",
)

molecule_geometry = f"""
O 0 0 0;
H {-0.957*math.sin(math.radians(104.5)/2.0)} {0.957*math.cos(math.radians(104.5)/2.0)} 0;
H {0.957*math.sin(math.radians(104.5)/2.0)} {0.957*math.cos(math.radians(104.5)/2.0)} 0
"""

hivqe = FunctionWrapper(
    token="your_hivqe_license_token",
    function=catalog.load("qunova/hivqe-chemistry"),
)
job = hivqe.run(
    geometry=molecule_geometry,
    backend_name="ibm_torino",
    max_states=10000,
    max_expansion_states=1000,
    hivqe_options={"ansatz": "epa", "max_iter": 10},
)
result = job.result()

Desempenho

Esta seção mostra os cálculos de referência demonstrados do HI-VQE com um caso de 24 qubits para Li2S, um caso de 40 qubits para uma molécula N2 e um caso de 44 qubits para um sistema FeP-NO.

Curva da superfície de energia potencial de dissociação para uma molécula de e Li2S a com 24 qubits

A curva PES é mostrada com a referência FCI e a estimativa inicial da RHF, juntamente com o erro de energia da referência FCI.

Imagem mostrando que o HI-VQE produz soluções com precisão química de uma curva PES de referência clássica para o sistema Li2S.

Os cálculos foram realizados com as seguintes geometrias e opções.

# Define Li2S geometries
Li2S_geoms = {
    "Li2S_1.51": "S        -1.239044    0.671232   -0.030374;Li       -1.506327    0.432403   -1.498949;Li       -0.899996    0.973348    1.826768;",
    "Li2S_2.40": "S        -1.741432    0.680397    0.346702;Li       -0.529307    0.488006   -1.729343;Li       -1.284307    0.989409    2.177209;",
    "Li2S_3.80": "S        -2.707255    0.674298    0.909161;Li        0.079218    0.552012   -1.671656;Li       -0.927010    0.931502    1.557063;",
}

# Configure some options for the job.
molecule_options = {
    "basis": "sto3g",
}
hivqe_options = {
    "shots": 100,
    "max_iter": 20,
}

results = []
for geom in ["Li2S_1.51", "Li2S_2.40", "Li2S_3.80"]:
    # Run HI-VQE
    job = function.run(
        geometry=Li2S_geoms[geom],
        backend_name=backend_name,  # can use any device with at least 38 qubits
        max_states=2000,
        max_expansion_states=10,
        molecule_options=molecule_options,
        hivqe_options=hivqe_options,
    )
    results.append(job.result())

Os pontos vermelhos representam os resultados do cálculo do HI-VQE para seis geometrias diferentes, e três geometrias correspondentes a 1.51, 2.40 e 3.80 Angstrom são fornecidas como entrada na célula acima.

Curva PES de dissociação para uma molécula de N2 com 40 qubits

A molécula de nitrogênio foi identificada como um sistema de multireferência com grandes contribuições de energia de correlação além do estado Hartree-Fock. Realizamos um cálculo de referência para a molécula N2 com base cc-pvdz, ( 20o,14e ) usando a seleção de orbital ativo homo-lumo. O número do espaço ativo completo (CAS) para representar esse problema é 6.009.350.400. Não é possível obter a solução do problema do valor próprio (para energia e estrutura eletrônica) com esse número de estados usando um computador de mesa potente ( 16cpu/64GB ). Com o HI-VQE, os usuários podem pesquisar com eficiência o subespaço dos estados do CAS para encontrar resultados quimicamente precisos e, ao mesmo tempo, economizar significativamente os recursos de computação. Os gráficos a seguir mostram a curva PES do cálculo HI-VQE de 40 qubits da dissociação da molécula N2.

Imagem mostrando que o HI-VQE produz soluções dentro da precisão química de uma curva PES de referência clássica para o sistema N2

Curva PES de dissociação para ferro(II)-porfirina com cinco coordenações com um sistema NO com 44 qubits

Outro sistema químico interessante é um complexo de ferro(II)-porfirina ( FeP ) com um ligante de óxido nítrico (NO) coordenado, que representa um sistema de metaloporfirina biologicamente relevante que desempenha funções cruciais em vários processos fisiológicos. Nesse exemplo, o HI-VQE foi utilizado para estimar a curva precisa da superfície de energia potencial da interação intermolecular entre FeP e NO (energia do estado fundamental para geometrias separadas de forma diferente). O sistema combinado tem 450 orbitais e 202 elétrons ( 450o,202e ) com base 6-31g(d ) no total. A seleção do orbital ativo homo-lumo foi utilizada para calcular o caso menor a partir do caso real com ( 22o,22e ). A partir dos resultados de referência a seguir, conseguimos atingir a precisão química (> 1.6 mHa ) com um cálculo de química computacional clássica de última geração da referência CASCI(DMRG) ( 22o,22e ).

Imagem mostrando que o HI-VQE produz soluções dentro da precisão química de uma curva PES de referência clássica para o sistema FeP-NO

Referências

  • O tamanho da matriz exata é o número de determinantes para a solução exata, como FCI e CASCI.
  • O cálculo do HI-VQE faz a amostragem e calcula o subespaço dele (ou seja, o tamanho da matriz do HI-VQE).
  • O tempo total inclui o tempo de execução da QPU e a execução da função Qiskit com a CPU.
  • A precisão é estimada a partir da diferença de energia da solução exata.
Sistema químico
Número de qubits
Tamanho exato da matriz
Tamanho da matriz HI-VQE
E(diff) from exact ( mHa )
Número de iterações
Tempo total
Uso do tempo de execução da QPU
NH3NH_3 (8o,10e)16313619360.08637 s34 s
Li2SLi_2S (10o,10e)206350439690.605250 s50 s
NH3NH_3 (15o,10e)309018009497290.905354 s54 s
N2N_2 (16o,14e)3213087360017982811.1096531 s121 s
3H2O3H_2O (18o,24e)363446220963994240.90245174 s130 s
N2N_2 (20o,14e)40600935040090120041.202146547 s258 s

Buscar mensagens de erro

Se sua carga de trabalho falhar, o status será ERROR e chamar job.result() gerará uma exceção:

job = function.run(
    geometry="invalid-geometry",  # This will cause an error
    backend_name=backend_name,
    max_states=2000,
    max_expansion_states=15,
    molecule_options=molecule_options,
    hivqe_options=hivqe_options,
)

job.result()

Output:

---------------------------------------------------------------------------
QiskitServerlessException                 Traceback (most recent call last)
Cell In[12], line 10
      1 job = function.run(
      2     geometry="invalid-geometry",  # This will cause an error
      3     backend_name=backend_name,
   (...)
      7     hivqe_options=hivqe_options,
      8 )
---> 10 job.result()

File ~/work/documentation/documentation/.tox/py311/lib/python3.11/site-packages/qiskit_serverless/core/job.py:253, in Job.result(self, wait, cadence, verbose, maxwait)
    251 if self.status() == "ERROR":
    252     if results:
--> 253         raise QiskitServerlessException(results)
    255     raise QiskitServerlessException(self.filtered_logs(include=r"(?i)error|exception"))
    257 if isinstance(results, str):

QiskitServerlessException: ["runner.UnknownRuntimeError: 'An unexpected error occurred during job execution. Please make sure that your inputs are valid. If you are still experiencing problems, you can contact the Qunova Computing support service at [email protected] and provide the Function job ID of this job for more assistance. -- https://docs.quantum.ibm.com/errors#1500'\n"]
job.status()

Output:

'ERROR'

Obtenha suporte

Você pode enviar um e-mail para qiskit.support @ qunovacomputing.com para obter ajuda com esta função.

Se você quiser ajuda para solucionar um erro específico, forneça a ID do trabalho de função do trabalho que encontrou o erro.


Próximas etapas

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