Skip to main content
IBM Quantum Platform

QPY

QPY es el formato binario portátil y multiplataforma de Qiskit para almacenar circuitos cuánticos. La API C de QPY puede serializar varios QkCircuit objetos en un archivo o en un búfer en memoria y cargar todos los circuitos a partir de cualquiera de estas dos representaciones. Los datos QPY generados por esta interfaz son compatibles con la qiskit.qpy interfaz de Python.

qk_qpy_read_min_version() Devuelve la versión más antigua del formato QPY que la biblioteca cargada puede leer. Esto equivale a qiskit.qpy.QPY_COMPATIBILITY_VERSION. en Python. qk_qpy_write_min_version() devuelve la versión más antigua que la API de C puede escribir. Los dos límites difieren porque la API de C utiliza la implementación de QPY en Rust, mientras que Python puede utilizar su implementación heredada para escribir formatos más antiguos.

Los circuitos cargados se han asignado recientemente y deben liberarse con qk_qpy_free_circuits().

Las funciones estándar de volcado aceptan QkCircuit objetos nativos y no interactúan con Python. Si utilizas la API de C en una extensión de Python, debes emplear las funciones de Python : qpy.dump() y, ya qpy.load() que las funciones de la API de C devolverán un error si Python tiene que crear o cargar una carga útil QPY desde el circuito.

En el siguiente ejemplo se guardan dos circuitos en un archivo y se vuelven a cargar:

#include <qiskit.h>
#include <stddef.h>

int main(void) {
    QkCircuit *bell = qk_circuit_new(2, 0);
    qk_circuit_gate(bell, QkGate_H, (uint32_t[]){0}, NULL);
    qk_circuit_gate(bell, QkGate_CX, (uint32_t[]){0, 1}, NULL);

    QkCircuit *plus = qk_circuit_new(1, 0);
    qk_circuit_gate(plus, QkGate_H, (uint32_t[]){0}, NULL);

    const QkCircuit *circuits[] = {bell, plus};

    if (qk_qpy_dump_file(circuits, 2, "circuits.qpy", NULL) != QkExitCode_Success) {
        qk_circuit_free(plus);
        qk_circuit_free(bell);
        return 1;
    }

    QkQpyLoadedCircuits loaded = {NULL, 0};
    if (qk_qpy_load_file(&loaded, "circuits.qpy", NULL) != QkExitCode_Success) {
        qk_circuit_free(plus);
        qk_circuit_free(bell);
        return 1;
    }

    int result = loaded.len == 2 ? 0 : 1;
    qk_qpy_loaded_circuits_clear(&loaded);
    qk_circuit_free(plus);
    qk_circuit_free(bell);
    return result;
}

Las variantes del búfer asignan los datos serializados. Pasa el puntero devuelto y su tamaño exacto a qk_qpy_free_buffer() cuando ya no lo necesites. Las variantes *_with_version seleccionan una versión específica del formato de salida QPY; consulta qk_qpy_write_min_version() cuál es la versión mínima de salida compatible. Todas las funciones que pueden dar lugar a un error devuelven QkExitCode, incluidos los errores QkExitCode_QpyError de serialización, deserialización, ruta y E/S de archivos. Es posible que su error argumento final sea nulo si se ignoran los detalles de diagnóstico. De lo contrario, en caso de error de QPY, se rellena con una descripción asignada y terminada en «nul» que debe liberarse con qk_str_free(). El puntero de salida no se modifica en caso de éxito ni en caso de errores sin un diagnóstico adicional.


Funciones

qk_qpy_read_min_version

uint8_t qk_qpy_read_min_version(void)

Obtén la versión más antigua del formato QPY que pueda leer la biblioteca cargada.

Devuelve

La versión más antigua del formato QPY compatible con la lectura.

qk_qpy_write_min_version

uint8_t qk_qpy_write_min_version(void)

Obtén la versión más antigua del formato QPY en la que la biblioteca cargada permita escribir.

Utiliza este valor como límite inferior para las funciones de volcado *_with_version .

Esto equivale a la instrucción de Python QPY_COMPATIBILITY_VERSION

Devuelve

La versión más antigua del formato QPY compatible con la escritura.

qk_qpy_dump_file

QkExitCode qk_qpy_dump_file(const QkCircuit *const *circuits, size_t num_circuits, const char *filename, char **error)

Escribir circuitos en un archivo QPY.

Esta función devolverá un error si algún aspecto del circuito requiere que el intérprete de Python genere la carga útil de QPY. Si utilizas esta función en un módulo de extensión de Python, deberías utilizar la función de Python qpy.dump() en su lugar para evitar esta limitación.

Seguridad

Cada elemento de circuits debe apuntar a un válido QkCircuit. Si alguna entrada no es un puntero válido, alineado y no nulo, el comportamiento es indefinido. filename Debe apuntar a una cadena válida terminada en nulo durante toda la duración de esta llamada. error Debe ser nulo o un puntero válido y en el que se pueda escribir que apunte a un puntero de tipo char.

Parámetros

  • circuitos : un puntero válido y no nulo a una matriz de punteros a circuitos num_circuits .
  • num_circuits – El número de punteros a circuitos en circuits.
  • nombre_archivo : una ruta válida, no nula y terminada en «nul» en formato UTF-8.
  • error – Ubicación opcional de salida para una descripción del error. Separa una cadena devuelta con «. qk_str_free».

Devuelve

QkExitCode_Success en caso de éxito, si se trata QkExitCode_NullPointerError de un puntero nulo, o si se trata QkExitCode_QpyError de una ruta no válida, datos QPY no compatibles o un error de E/S.

qk_qpy_dump_file_with_version

QkExitCode qk_qpy_dump_file_with_version(const QkCircuit *const *circuits, size_t num_circuits, const char *filename, uint8_t version, char **error)

Escribir circuitos en un archivo QPY utilizando una versión específica del formato.

Esta función devolverá un error si algún aspecto del circuito requiere que el intérprete de Python genere la carga útil de QPY. Si utilizas esta función en un módulo de extensión de Python, deberías utilizar la función de Python qpy.dump() en su lugar para evitar esta limitación.

Seguridad

Cada elemento de circuits debe apuntar a un válido QkCircuit. Si alguna entrada no es un puntero válido, alineado y no nulo, el comportamiento es indefinido. filename Debe apuntar a una cadena válida terminada en nulo durante toda la duración de esta llamada. error Debe ser nulo o un puntero válido y en el que se pueda escribir que apunte a un puntero de tipo char.

Parámetros

  • circuitos : un puntero válido y no nulo a una matriz de punteros a circuitos num_circuits .
  • num_circuits – El número de punteros a circuitos en circuits.
  • nombre_archivo : una ruta válida, no nula y terminada en «nul» en formato UTF-8.
  • versión : la versión del formato QPY. Debe ser, como mínimo, el valor devuelto por qk_qpy_write_min_version.
  • error – Ubicación opcional de salida para una descripción del error. Separa una cadena devuelta con «. qk_str_free».

Devuelve

Los mismos códigos de salida que qk_qpy_dump_file.

qk_qpy_load_file

QkExitCode qk_qpy_load_file(QkQpyLoadedCircuits *circuits, const char *filename, char **error)

Cargar todos los circuitos desde un archivo QPY.

Esta función devolverá un error si algún aspecto de los circuitos de la carga útil de QPY requiere que el intérprete de Python cree el objeto QkCircuit . Si utilizas esta función en un módulo de extensión de Python, deberías utilizar la función de Python qpy.dump() en su lugar para evitar esta limitación.

Seguridad

filename Debe apuntar a una cadena válida terminada en nulo; circuits debe ser un puntero válido, no nulo y alineado a un [...], QpyLoadedCircuits o de lo contrario el comportamiento es indefinido. error debe ser nulo o un puntero válido a un puntero char .

Parámetros

  • nombre_archivo : una ruta válida, no nula y terminada en «nul» en formato UTF-8.
  • circuitos : ubicación de salida para los circuitos con carga.
  • error – Ubicación opcional de salida para una descripción del error. Separa una cadena devuelta con «. qk_str_free».

Devuelve

QkExitCode_Success en caso de éxito, QkExitCode_NullPointerError si se produce un error de puntero nulo o QkExitCode_QpyError si no se puede leer el archivo o este no es compatible con QPY. La matriz devuelta y todos sus circuitos deben liberarse con qk_qpy_loaded_circuits_clear.

qk_qpy_dump_buffer

QkExitCode qk_qpy_dump_buffer(const QkCircuit *const *circuits, size_t num_circuits, uint8_t **buffer, size_t *size, char **error)

Serializa los circuitos en un búfer QPY recién asignado.

Esta función devolverá un error si algún aspecto del circuito requiere que el intérprete de Python genere la carga útil de QPY. Si utilizas esta función en un módulo de extensión de Python, deberías utilizar la función de Python qpy.dump() en su lugar para evitar esta limitación.

Seguridad

Cada elemento de circuits debe apuntar a un válido QkCircuit. buffer y cada uno de ellos size debe ser válido para una escritura del tamaño de un puntero durante toda la duración de esta llamada. error Debe ser nulo o válido para una escritura de puntero.

Parámetros

  • circuitos : un puntero válido y no nulo a una matriz de punteros a circuitos num_circuits .
  • num_circuits – El número de punteros a circuitos en circuits.
  • buffer : ubicación de salida del búfer recién asignado. No cambia en caso de fallo.
  • tamaño : ubicación de salida para el tamaño del búfer en bytes. No cambia en caso de fallo.
  • error – Ubicación opcional de salida para una descripción del error. Separa una cadena devuelta con «. qk_str_free».

Devuelve

QkExitCode_Success en caso de éxito, QkExitCode_NullPointerError si se produce un puntero nulo o QkExitCode_QpyError si falla la serialización. El búfer devuelto debe liberarse con qk_qpy_free_buffer.

qk_qpy_dump_buffer_with_version

QkExitCode qk_qpy_dump_buffer_with_version(const QkCircuit *const *circuits, size_t num_circuits, uint8_t **buffer, size_t *size, uint8_t version, char **error)

Serializa los circuitos en un búfer QPY recién asignado utilizando una versión de formato específica.

Esta función devolverá un error si algún aspecto del circuito requiere que el intérprete de Python genere la carga útil de QPY. Si utilizas esta función en un módulo de extensión de Python, deberías utilizar la función de Python qpy.dump() en su lugar para evitar esta limitación.

Seguridad

Los requisitos relativos a los punteros son los mismos que para qk_qpy_dump_buffer.

Parámetros

  • circuitos : un puntero válido y no nulo a una matriz de punteros a circuitos num_circuits .
  • num_circuits – El número de punteros a circuitos en circuits.
  • buffer : ubicación de salida del búfer recién asignado. No cambia en caso de fallo.
  • tamaño : ubicación de salida para el tamaño del búfer en bytes. No cambia en caso de fallo.
  • versión : la versión del formato QPY. Debe ser, como mínimo, el valor devuelto por qk_qpy_write_min_version.
  • error – Ubicación opcional de salida para una descripción del error. Separa una cadena devuelta con «. qk_str_free».

Devuelve

Los mismos códigos de salida que qk_qpy_dump_buffer.

qk_qpy_load_buffer

QkExitCode qk_qpy_load_buffer(QkQpyLoadedCircuits *circuits, const uint8_t *buffer, size_t size, char **error)

Cargar todos los circuitos desde un búfer QPY.

Esta función devolverá un error si algún aspecto de los circuitos de la carga útil de QPY requiere que el intérprete de Python cree el objeto QkCircuit . Si utilizas esta función en un módulo de extensión de Python, deberías utilizar la función de Python qpy.dump() en su lugar para evitar esta limitación.

Seguridad

buffer Debe ser válido para lecturas de size bytes; circuits debe ser un puntero válido, no nulo y alineado a un; de QpyLoadedCircuits lo contrario, el comportamiento es indefinido. error debe ser nulo o un puntero válido a un puntero char .

Parámetros

  • circuitos : ubicación de salida para los circuitos con carga.
  • buffer : un búfer válido que contiene size bytes de datos QPY.
  • tamaño : el tamaño de en buffer bytes.
  • error – Ubicación opcional de salida para una descripción del error. Separa una cadena devuelta con «. qk_str_free».

Devuelve

QkExitCode_Success en caso de éxito, QkExitCode_NullPointerError si se trata de un puntero nulo o QkExitCode_QpyError si el búfer no es compatible con QPY. La matriz devuelta y todos sus circuitos deben liberarse con qk_qpy_loaded_circuits_clear.

qk_qpy_loaded_circuits_clear

void qk_qpy_loaded_circuits_clear(QkQpyLoadedCircuits *circuits)

Circuitos gratuitos devueltos por o qk_qpy_load_file qk_qpy_load_buffer.

Seguridad

circuits debe ser nulo o un puntero alineado válido a un objeto QkQpyLoadedCircuits cuyo campo .data esté rellenado con una matriz de punteros QkCircuit , tal y como lo rellenan o qk_qpy_load_file qk_qpy_load_buffer. De lo contrario, el comportamiento de esta función es indefinido.

Parámetros

  • circuitos : el puntero al objeto de circuitos cargado, rellenado por una función de carga de QPY, o nulo.

qk_qpy_free_buffer

void qk_qpy_free_buffer(uint8_t *buffer, size_t size)

Liberar un búfer devuelto por qk_qpy_dump_buffer.

Seguridad

La función buffer debe haber devuelto un valor distinto de nulo qk_qpy_dump_buffer con exactamente este y size no debe haberse liberado previamente.

Parámetros

  • buffer : un búfer devuelto por qk_qpy_dump_buffer, o nulo.
  • tamaño : el tamaño del búfer devuelto por qk_qpy_dump_buffer.

QkQpyLoadedCircuits

struct QkQpyLoadedCircuits

Los datos de salida de qk_qpy_load_file o qk_qpy_load_buffer

Contiene una matriz de punteros a y QkCircuit una longitud.

Los arrays que se rellenan mediante las funciones de carga de QPY son propiedad de Qiskit y deben liberarse llamando a qk_qpy_loaded_circuits_clear.

QkCircuit **datos

La matriz de punteros QkCircuit que se cargaron desde la carga útil de QPY.

size_t len

El número de circuitos en data.

¿Le ha resultado útil esta página?
Informe de un error, de una errata o solicite contenido en GitHub.