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 comcargo install cbindgenObserve que a execução da ferramenta pela linha de comando deve estar habilitada, o que pode exigir a exportação da variávelPATHpara 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
libpythonprecisam 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.libquanto apython3.dll cbindgen: uma ferramenta para criar o cabeçalho C, que você pode instalar comcargo install cbindgenObserve que a execução da ferramenta pela linha de comando deve estar habilitada, o que pode exigir a atualização da variávelPATHpara 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] }