Sari la conținutul principal

Instalează Qiskit C API

Acest ghid descrie cum să instalezi și să folosești Qiskit C API. Pentru a vedea cum să extinzi fluxul de lucru Qiskit Python cu C, citește Extinde Python cu Qiskit C API.

Următorul exemplu construiește un observabil cu 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

Această secțiune oferă instrucțiuni de compilare pentru sisteme de tip UNIX.

Cerințe

Compilarea necesită următoarele instrumente:

  • Un compilator Rust: vezi de exemplu ghidul de instalare a Qiskit din sursă
  • Un compilator C: de exemplu, GCC pe Linux și Clang pe MacOS. C API din Qiskit este compatibil cu un compilator conform standardului C11.
  • cbindgen: un instrument pentru a crea header-ul C, pe care îl poți instala cu cargo install cbindgen Reține că rularea instrumentului din linia de comandă trebuie să fie activată, ceea ce poate necesita exportarea variabilei PATH pentru a include /path/to/.cargo/bin
  • Bibliotecă Python instalată (Python 3.9+): Biblioteca Python este necesară în timpul legării dinamice. Reține că Python nu este utilizat la rulare și interpretorul nu este niciodată inițializat; doar unele simboluri din libpython trebuie definite. Vezi această problemă pentru mai multe detalii
  • (GNU) Make: acesta este opțional, dar este recomandat pentru a folosi procese de instalare automatizate.

Acest cod verifică dacă totul a fost instalat:

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

Compilare

Pentru a compila header-ul C și biblioteca, poți rula următoarea comandă Make1 în rădăcina Qiskit,

make c

care va furniza biblioteca partajată compilată în dist/c/lib și header-ul qiskit.h cu toate declarațiile de funcții în dist/c/include. Reține că numele exact al bibliotecii depinde de platformă; de exemplu, libqiskit.so pe UNIX și libqiskit.dylib pe MacOS. (Reține că în prezent acest pas emite multe avertismente, ceea ce este de așteptat și nu este un motiv de îngrijorare. Versiunile viitoare vor elimina avertismentele.)

Poți apoi compila un program C folosind header-ul și biblioteca Qiskit C:

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

Pentru a te asigura că biblioteca Qiskit este găsită în timpul legării, setează calea bibliotecii de rulare să includă /path/to/dist/c/lib. Dacă biblioteca Python nu este disponibilă implicit în timpul legării dinamice, aceasta trebuie adăugată și ea. Aceste comenzi depind de platformă. Pe 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

Pe MacOS:

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

Alternativ, poți seta calea bibliotecii de rulare în timpul compilării adăugând

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

la opțiunile compilatorului. În plus, biblioteca Python trebuie să fie disponibilă în timpul legării dinamice. În mediile Linux acesta este de obicei comportamentul implicit.

Acum poți executa binarul:

./example.o

care, dacă se folosește fragmentul de exemplu prezentat anterior, ar trebui să afișeze

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

Această secțiune oferă instrucțiuni de compilare pentru sisteme Windows.

Cerințe

Compilarea necesită următoarele instrumente:

  • Un compilator Rust: vezi de exemplu ghidul de instalare a Qiskit din sursă
  • Un compilator C: de exemplu, MSVC și promptul de comandă nativ care oferă comanda cl
  • O instalare Python, cu acces atât la python3.lib, cât și la python3.dll
  • cbindgen: un instrument pentru a crea header-ul C, pe care îl poți instala cu cargo install cbindgen Reține că rularea instrumentului din linia de comandă trebuie să fie activată, ceea ce poate necesita actualizarea variabilei PATH pentru a include calea cargo.

Compilare

Mai întâi, compilează biblioteca dinamică qiskit_cext, rulând următoarele în rădăcina Qiskit

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

Aceasta va genera biblioteca dinamică .dll și fișierul asociat .dll.lib în target/release. Apoi, generează header-ul cu

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

Aceasta va scrie header-ul compatibil MSVC în dist\c\include.

Acum poți folosi cl pentru a compila programul C. Pentru a te asigura că compilatorul găsește biblioteca qiskit, includem target\release în variabila PATH.

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

Înainte de rulare, trebuie să incluzi calea către python3.dll.

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

ar trebui apoi să afișeze

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. Dacă nu ai instalat Make, verifică fișierul Makefile din rădăcina Qiskit pentru comenzile necesare - sau pur și simplu instalează Make; nu e prea târziu.)