Installer l'API C de Qiskit
Ce guide décrit comment installer et utiliser l'API C de Qiskit. Pour savoir comment étendre ton workflow Python Qiskit avec du C, consulte Étendre Python avec l'API C de Qiskit.
L'exemple suivant construit un observable avec 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 et systèmes similaires
Cette section fournit les instructions de compilation pour les systèmes de type UNIX.
Prérequis
La compilation nécessite les outils suivants :
- Un compilateur Rust : consulte par exemple le guide d'installation de Qiskit depuis les sources
- Un compilateur C : par exemple, GCC sur Linux et Clang sur MacOS. L'API C de Qiskit est compatible avec un compilateur conforme à la norme C11.
cbindgen: un outil pour créer l'en-tête C, que tu peux installer aveccargo install cbindgenNote que l'exécution de l'outil depuis la ligne de commande doit être activée, ce qui peut nécessiter d'exporter ta variablePATHpour inclure/path/to/.cargo/bin- Bibliothèque Python installée (Python 3.9+) : la bibliothèque Python est requise lors de l'édition de liens dynamique. Note que Python n'est pas utilisé à l'exécution et que l'interpréteur n'est jamais initialisé ; seuls certains symboles de
libpythondoivent être définis. Consulte ce ticket pour plus de détails - (GNU) Make : optionnel mais recommandé pour utiliser les processus d'installation automatisés.
Ce code vérifie que tout a bien été installé :
rustc --version
gcc --version
cbindgen --version
make --version # optional, but recommended
Compilation
Pour compiler l'en-tête C et la bibliothèque, tu peux exécuter la commande Make suivante1 à la racine de Qiskit,
make c
ce qui fournira la bibliothèque partagée compilée dans dist/c/lib et l'en-tête qiskit.h avec
toutes les déclarations de fonctions dans dist/c/include. Note que le nom précis de la bibliothèque dépend
de la plateforme ; par exemple, libqiskit.so sur UNIX et libqiskit.dylib sur MacOS.
(Note que cette étape émet actuellement beaucoup d'avertissements, ce qui est attendu et ne constitue pas un motif d'inquiétude. Les versions futures supprimeront ces avertissements.)
Tu peux ensuite compiler un programme C en utilisant l'en-tête et la biblioth èque C de Qiskit :
gcc example.c -o example.o -I /path/to/dist/c/include -L /path/to/dist/c/lib -lqiskit
Pour s'assurer que la bibliothèque Qiskit est trouvée lors de l'édition de liens, configure le chemin de la bibliothèque d'exécution pour
inclure /path/to/dist/c/lib. Si la bibliothèque Python n'est pas disponible par défaut lors de l'édition de liens dynamique,
elle doit également être ajoutée. Ces commandes dépendent de la plateforme. Sur 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
Sur MacOS :
export DYLD_LIBRARY_PATH=/path/to/dist/c/lib:$DYLD_LIBRARY_PATH
export DYLD_LIBRARY_PATH=/path/to/python/lib:$DYLD_LIBRARY_PATH
Alternativement, tu peux définir le chemin de la bibliothèque d'exécution lors de la compilation en ajoutant
-Wl,-rpath,/path/to/dist/c/lib
# same for Python
aux options du compilateur. De plus, la bibliothèque Python doit être disponible lors de l'édition de liens dynamique. Dans les environnements Linux, c'est généralement le cas par défaut.
Tu peux maintenant exécuter le binaire :
./example.o
ce qui, si tu utilises l'exemple de code présenté précédemment, devrait afficher
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
Cette section fournit les instructions de compilation pour les systèmes Windows.
Prérequis
La compilation nécessite les outils suivants :
- Un compilateur Rust : consulte par exemple le guide d'installation de Qiskit depuis les sources
- Un compilateur C : par exemple, MSVC et l'invite de commandes native proposant la commande
cl - Une installation Python, avec accès à la fois à
python3.libetpython3.dll cbindgen: un outil pour créer l'en-tête C, que tu peux installer aveccargo install cbindgenNote que l'exécution de l'outil depuis la ligne de commande doit être activée, ce qui peut nécessiter de mettre à jour ta variablePATHpour inclure le chemin cargo.
Compilation
D'abord, compile la bibliothèque dynamique qiskit_cext en exécutant ce qui suit à la racine de Qiskit
set PATH="\path\to\pythonlib";%PATH%
cargo rustc --release --crate-type cdylib -p qiskit-cext
Cela générera la bibliothèque dynamique .dll et le fichier .dll.lib associé dans target/release.
Ensuite, génère l'en-tête avec
cbindgen --crate qiskit-cext --output dist\c\include\qiskit.h
Cela écrira l'en-tête compatible MSVC dans dist\c\include.
Tu peux maintenant utiliser cl pour compiler le programme C. Pour s'assurer que le compilateur trouve la bibliothèque qiskit,
on inclut target\release dans la variable PATH.
set PATH="\path\to\target\release";%PATH%
cl example.c qiskit_cext.dll.lib -I\path\to\dist\c\include
Avant d'exécuter, tu dois inclure le chemin vers ta python3.dll.
set PATH="\path\to\python3-dll";%PATH%
.\example.exe
devrait alors afficher
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] }