Pular para o conteúdo principal

Instalar a API C do Qiskit

Este guia descreve como instalar e usar a API C do Qiskit. Para saber como estender seu fluxo de trabalho Python do Qiskit com C, leia Estender Python com a API C do Qiskit.

O exemplo a seguir constrói um observable com C:

// file: example.c
#include <stdio.h>
#include <stdint.h>
#include <qiskit.h>

int main(int argc, char *argv[]) {
// build a 100-qubit empty observable
uint32_t num_qubits = 100;
QkObs *obs = qk_obs_zero(num_qubits);

// add the term 2 * (X0 Y1 Z2) to the observable
QkComplex64 coeff = {2, 0};
QkBitTerm bit_terms[3] = {QkBitTerm_X, QkBitTerm_Y, QkBitTerm_Z}; // bit terms: X Y Z
uint32_t indices[3] = {0, 1, 2}; // indices: 0 1 2
QkObsTerm term = {coeff, 3, bit_terms, indices, num_qubits};
qk_obs_add_term(obs, &term); // append the term

// print some properties and the observable itself
printf("num_qubits: %i\n", qk_obs_num_qubits(obs));
printf("num_terms: %lu\n", qk_obs_num_terms(obs));
printf("observable: %s\n", qk_obs_str(obs));

// free the memory allocated for the observable
qk_obs_free(obs);

return 0;
}

UNIX-like

Esta seção fornece instruções de compilação para sistemas do tipo UNIX.

Requisitos

A compilação requer as seguintes ferramentas:

  • Um compilador Rust: veja, por exemplo, o guia de instalação do Qiskit a partir do código-fonte
  • Um compilador C: por exemplo, GCC no Linux e Clang no MacOS. A API C do Qiskit é compatível com compiladores que seguem o padrão C11.
  • cbindgen: uma ferramenta para criar o cabeçalho C, que você pode instalar com cargo install cbindgen Observe que a execução da ferramenta pela linha de comando deve estar habilitada, o que pode exigir a exportação da variável PATH para incluir /path/to/.cargo/bin
  • Biblioteca Python instalada (Python 3.9+): a biblioteca Python é necessária durante a vinculação dinâmica. Note que o Python não é usado em tempo de execução e o interpretador nunca é inicializado; apenas alguns símbolos de libpython precisam estar definidos. Veja esta issue para mais detalhes
  • (GNU) Make: opcional, mas recomendado para usar processos de instalação automatizados.

Este código verifica que tudo foi instalado corretamente:

rustc --version
gcc --version
cbindgen --version
make --version # optional, but recommended

Compilação

Para compilar o cabeçalho C e a biblioteca, você pode executar o seguinte comando Make1 na raiz do Qiskit,

make c

o que fornecerá a biblioteca compartilhada compilada em dist/c/lib e o cabeçalho qiskit.h com todas as declarações de funções em dist/c/include. Note que o nome exato da biblioteca depende da plataforma; por exemplo, libqiskit.so no UNIX e libqiskit.dylib no MacOS. (Note que esta etapa atualmente emite muitos avisos, o que é esperado e não é motivo de preocupação. Versões futuras removerão os avisos.)

Você pode então compilar um programa C usando o cabeçalho e a biblioteca C do Qiskit:

gcc example.c -o example.o -I /path/to/dist/c/include -L /path/to/dist/c/lib -lqiskit

Para garantir que a biblioteca do Qiskit seja encontrada durante a vinculação, defina o caminho da biblioteca em tempo de execução para incluir /path/to/dist/c/lib. Se a biblioteca Python não estiver disponível por padrão durante a vinculação dinâmica, ela também precisará ser adicionada. Esses comandos dependem da plataforma. No Linux:

export LD_LIBRARY_PATH=/path/to/dist/c/lib:$LD_LIBRARY_PATH
# on Linux, the Python library is typically included in the dynamic library path per default
export LD_LIBRARY_PATH=/path/to/python/lib:$LD_LIBRARY_PATH

No MacOS:

export DYLD_LIBRARY_PATH=/path/to/dist/c/lib:$DYLD_LIBRARY_PATH
export DYLD_LIBRARY_PATH=/path/to/python/lib:$DYLD_LIBRARY_PATH

Como alternativa, você pode definir o caminho da biblioteca em tempo de execução durante a compilação adicionando

-Wl,-rpath,/path/to/dist/c/lib
# same for Python

aos flags do compilador. Além disso, a biblioteca Python precisa estar disponível durante a vinculação dinâmica. Em ambientes Linux, isso normalmente é o padrão.

Agora você pode executar o binário:

./example.o

que, se usar o trecho de exemplo mostrado anteriormente, deve imprimir

num_qubits: 100
num_terms: 1
observable: SparseObservable { num_qubits: 100, coeffs: [Complex { re: 2.0, im: 0.0 }], bit_terms: [X, Y, Z], indices: [0, 1, 2], boundaries: [0, 3] }

Windows

Esta seção fornece instruções de compilação para sistemas Windows.

Requisitos

A compilação requer as seguintes ferramentas:

  • Um compilador Rust: veja, por exemplo, o guia de instalação do Qiskit a partir do código-fonte
  • Um compilador C: por exemplo, MSVC e o prompt de comando nativo que oferece o comando cl
  • Uma instalação Python, com acesso tanto a python3.lib quanto a python3.dll
  • cbindgen: uma ferramenta para criar o cabeçalho C, que você pode instalar com cargo install cbindgen Observe que a execução da ferramenta pela linha de comando deve estar habilitada, o que pode exigir a atualização da variável PATH para incluir o caminho do cargo.

Compilação

Primeiro, compile a biblioteca dinâmica qiskit_cext, executando o seguinte na raiz do Qiskit

set PATH="\path\to\pythonlib";%PATH%
cargo rustc --release --crate-type cdylib -p qiskit-cext

Isso irá gerar a biblioteca dinâmica .dll e o arquivo .dll.lib associado em target/release. Em seguida, gere o cabeçalho com

cbindgen --crate qiskit-cext --output dist\c\include\qiskit.h

Isso irá escrever o cabeçalho compatível com MSVC em dist\c\include.

Agora você pode usar cl para compilar o programa C. Para garantir que o compilador encontre a biblioteca do Qiskit, incluímos target\release na variável PATH.

set PATH="\path\to\target\release";%PATH%
cl example.c qiskit_cext.dll.lib -I\path\to\dist\c\include

Antes de executar, você precisa incluir o caminho para o seu python3.dll.

set PATH="\path\to\python3-dll";%PATH%
.\example.exe

deve então imprimir

num_qubits: 100
num_terms: 1
observable: SparseObservable { num_qubits: 100, coeffs: [Complex { re: 2.0, im: 0.0 }], bit_terms: [X, Y, Z], indices: [0, 1, 2], boundaries: [0, 3] }

Footnotes

  1. Se você não instalou o Make, verifique o Makefile na raiz do Qiskit para os comandos necessários — ou simplesmente instale o Make; ainda dá tempo.)