Saltar al contenido principal

Instalar la API C de Qiskit

Esta guía describe cómo instalar y usar la API C de Qiskit. Para ver cómo extender tu flujo de trabajo de Python en Qiskit con C, lee Extender Python con la API C de Qiskit.

El siguiente ejemplo construye un observable con 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;
}

Sistemas tipo UNIX

Esta sección proporciona instrucciones de compilación para sistemas tipo UNIX.

Requisitos

La compilación requiere las siguientes herramientas:

  • Un compilador de Rust: consulta, por ejemplo, la guía para instalar Qiskit desde el código fuente
  • Un compilador de C: por ejemplo, GCC en Linux y Clang en MacOS. La API C de Qiskit es compatible con compiladores que cumplan el estándar C11.
  • cbindgen: una herramienta para crear el encabezado C, que puedes instalar con cargo install cbindgen Ten en cuenta que la herramienta debe poder ejecutarse desde la línea de comandos, lo que puede requerir exportar tu variable PATH para incluir /path/to/.cargo/bin
  • Biblioteca de Python instalada (Python 3.9+): La biblioteca de Python es necesaria durante el enlazado dinámico. Ten en cuenta que Python no se usa en tiempo de ejecución y el intérprete nunca se inicializa; solo algunos símbolos de libpython necesitan estar definidos. Consulta este issue para más detalles
  • (GNU) Make: esto es opcional pero se recomienda para usar procesos de instalación automatizados.

Este código verifica que todo esté instalado correctamente:

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

Compilación

Para compilar el encabezado C y la biblioteca, puedes ejecutar el siguiente comando Make1 en la raíz de Qiskit,

make c

lo que proporcionará la biblioteca compartida compilada en dist/c/lib y el encabezado qiskit.h con todas las declaraciones de funciones en dist/c/include. Ten en cuenta que el nombre exacto de la biblioteca depende de la plataforma; por ejemplo, libqiskit.so en UNIX y libqiskit.dylib en MacOS. (Ten en cuenta que este paso actualmente emite muchas advertencias, lo cual es esperado y no es motivo de alarma. Las versiones futuras eliminarán estas advertencias.)

Luego puedes compilar un programa en C usando el encabezado y la biblioteca C de Qiskit:

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

Para asegurarte de que la biblioteca de Qiskit se encuentre durante el enlazado, establece la ruta de la biblioteca en tiempo de ejecución para incluir /path/to/dist/c/lib. Si la biblioteca de Python no está disponible por defecto durante el enlazado dinámico, también es necesario agregarla. Estos comandos dependen de la plataforma. En 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

En MacOS:

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

Alternativamente, puedes establecer la ruta de la biblioteca en tiempo de ejecución durante la compilación agregando

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

a los flags del compilador. Además, la biblioteca de Python debe estar disponible durante el enlazado dinámico. En entornos Linux esto suele ser el comportamiento por defecto.

Ahora puedes ejecutar el binario:

./example.o

que, si usas el fragmento de ejemplo mostrado anteriormente, debería 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 sección proporciona instrucciones de compilación para sistemas Windows.

Requisitos

La compilación requiere las siguientes herramientas:

  • Un compilador de Rust: consulta, por ejemplo, la guía para instalar Qiskit desde el código fuente
  • Un compilador de C: por ejemplo, MSVC y el símbolo del sistema nativo que ofrece el comando cl
  • Una instalación de Python, con acceso a python3.lib y python3.dll
  • cbindgen: una herramienta para crear el encabezado C, que puedes instalar con cargo install cbindgen Ten en cuenta que la herramienta debe poder ejecutarse desde la línea de comandos, lo que puede requerir actualizar tu variable PATH para incluir la ruta de cargo.

Compilación

Primero, compila la biblioteca dinámica qiskit_cext ejecutando lo siguiente en la raíz de Qiskit:

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

Esto generará la biblioteca dinámica .dll y el archivo .dll.lib asociado en target/release. A continuación, genera el encabezado con:

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

Esto escribirá el encabezado compatible con MSVC en dist\c\include.

Ahora puedes usar cl para compilar el programa en C. Para asegurarte de que el compilador encuentre la biblioteca de Qiskit, incluimos target\release en la variable PATH.

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

Antes de ejecutarlo, debes incluir la ruta a tu python3.dll.

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

debería entonces 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. Si no instalaste Make, revisa el Makefile en la raíz de Qiskit para ver los comandos necesarios — o simplemente instala Make; todavía estás a tiempo.)