Przejdź do głównej treści

Instalacja Qiskit C API

Ten przewodnik opisuje, jak zainstalować i używać Qiskit C API. Aby dowiedzieć się, jak rozszerzyć swój przepływ pracy Qiskit w Pythonie za pomocą C, przeczytaj Rozszerzanie Pythona za pomocą Qiskit C API.

Poniższy przykład buduje obserwabla w 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

Ta sekcja zawiera instrukcje budowania dla systemów typu UNIX.

Wymagania

Kompilacja wymaga następujących narzędzi:

  • Kompilator Rust: zapoznaj się na przykład z przewodnikiem instalacji Qiskit ze źródeł
  • Kompilator C: na przykład GCC na Linuksie i Clang na MacOS. Qiskit C API jest zgodne z kompilatorem spełniającym standard C11.
  • cbindgen: narzędzie do tworzenia nagłówka C, które możesz zainstalować poleceniem cargo install cbindgen Pamiętaj, że uruchamianie narzędzia z wiersza poleceń musi być włączone, co może wymagać wyeksportowania zmiennej PATH tak, aby zawierała /path/to/.cargo/bin
  • Zainstalowana biblioteka Pythona (Python 3.9+): biblioteka Pythona jest wymagana podczas dynamicznego linkowania. Zauważ, że Python nie jest używany w trakcie działania programu, a interpreter nigdy nie jest inicjalizowany; zdefiniowane muszą być jedynie niektóre symbole z libpython. Więcej szczegółów znajdziesz w tym zgłoszeniu
  • (GNU) Make: jest opcjonalne, ale zalecane do korzystania z automatycznych procesów instalacji.

Ten kod weryfikuje, czy wszystko zostało zainstalowane:

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

Budowanie

Aby zbudować nagłówek C i bibliotekę, możesz uruchomić następujące polecenie Make1 w katalogu głównym Qiskit,

make c

co dostarczy skompilowaną bibliotekę współdzieloną w dist/c/lib oraz nagłówek qiskit.h ze wszystkimi deklaracjami funkcji w dist/c/include. Pamiętaj, że dokładna nazwa biblioteki zależy od platformy; na przykład libqiskit.so na UNIX i libqiskit.dylib na MacOS. (Zauważ, że ten krok aktualnie generuje wiele ostrzeżeń, co jest oczekiwane i nie stanowi powodu do niepokoju. Przyszłe wersje usuną te ostrzeżenia.)

Następnie możesz skompilować program w C używając nagłówka i biblioteki Qiskit C:

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

Aby upewnić się, że biblioteka Qiskit zostanie znaleziona podczas linkowania, ustaw ścieżkę biblioteki czasu wykonania tak, aby zawierała /path/to/dist/c/lib. Jeśli biblioteka Pythona nie jest domyślnie dostępna podczas dynamicznego linkowania, również należy ją dodać. Polecenia te zależą od platformy. Na Linuksie:

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

Na MacOS:

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

Alternatywnie możesz ustawić ścieżkę biblioteki czasu wykonania podczas kompilacji, dodając

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

do flag kompilatora. Dodatkowo, biblioteka Pythona musi być dostępna podczas dynamicznego linkowania. W środowiskach Linuksowych jest to zazwyczaj wartość domyślna.

Teraz możesz uruchomić plik binarny:

./example.o

co, jeśli używasz przykładowego fragmentu kodu pokazanego wcześniej, powinno wydrukować

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

Ta sekcja zawiera instrukcje budowania dla systemów Windows.

Wymagania

Kompilacja wymaga następujących narzędzi:

  • Kompilator Rust: zapoznaj się na przykład z przewodnikiem instalacji Qiskit ze źródeł
  • Kompilator C: na przykład MSVC i natywny wiersz poleceń oferujący polecenie cl
  • Instalacja Pythona z dostępem zarówno do python3.lib, jak i python3.dll
  • cbindgen: narzędzie do tworzenia nagłówka C, które możesz zainstalować poleceniem cargo install cbindgen Pamiętaj, że uruchamianie narzędzia z wiersza poleceń musi być włączone, co może wymagać zaktualizowania zmiennej PATH tak, aby zawierała ścieżkę cargo.

Budowanie

Najpierw skompiluj bibliotekę dynamiczną qiskit_cext, uruchamiając następujące polecenie w katalogu głównym Qiskit

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

Spowoduje to wygenerowanie biblioteki dynamicznej .dll i powiązanego pliku .dll.lib w target/release. Następnie wygeneruj nagłówek poleceniem

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

Spowoduje to zapisanie nagłówka zgodnego z MSVC w dist\c\include.

Teraz możesz użyć cl do skompilowania programu w C. Aby upewnić się, że kompilator znajdzie bibliotekę qiskit, dołączamy target\release do zmiennej PATH.

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

Przed uruchomieniem musisz dołączyć ścieżkę do python3.dll.

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

powinno następnie wydrukować

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. Jeśli nie zainstalowałeś Make, sprawdź Makefile w katalogu głównym Qiskit, aby poznać wymagane polecenia — lub po prostu zainstaluj Make; to nie jest jeszcze za późno.)