QkClassicalRegister
typedef struct QkClassicalRegister QkClassicalRegisterUna forma habitual de instanciar varios bits a la vez es crear un registro. Un registro es una colección de bits con nombre. La creación de un registro permite dar un nombre a una colección de bits que puede utilizarse como metadatos en torno a bits específicos de un circuito. Este nombre también se conservará al exportar el circuito a otros idiomas.
Puede crear un registro llamando a qk_classical_register_new(), por ejemplo:
#include <qiskit.h>
QkClassicalRegister *creg = qk_classical_register_new(5, "my_creg");Lo que crea un nuevo registro clásico de 5 bits llamado "my_creg".
A continuación, para añadir el registro a un circuito se utiliza la función qk_circuit_add_classical_register() :
QkCircuit *qc = qk_circuit_new(0, 0);
qk_circuit_add_classical_register(qc, creg);
uint32_t num_qubits = qk_circuit_num_qubits(qc); // 5Aunque los circuitos rastrean los registros, los propios registros no aportan apenas diferencias de comportamiento a los circuitos.
Funciones
qk_classical_register_new
QkClassicalRegister *qk_classical_register_new(uint32_t num_clbits, const char *name)
Construye un nuevo registro clásico propio con un número de clbits y un nombre dados
Ejemplo
QkClassicalRegister *cr = qk_classical_register_new(5, "five_qubits");Seguridad
El parámetro name debe ser un puntero a memoria que contenga un terminador nul válido al final de la cadena. También debe ser válido para lecturas de bytes hasta el terminador nul incluido.
Parámetros
- num_clbits - El número de clbits para crear el registro
- name - La cadena de nombre para el registro creado. El nombre debe estar compuesto por caracteres válidos de UTF-8.
Devuelve
Un puntero al registro creado
qk_classical_register_free
void qk_classical_register_free(QkClassicalRegister *reg)
Libere un registro clásico.
Ejemplo
QkClassicalRegister *cr = qk_classical_register_new(1024, "creg");
qk_classical_register_free(cr);Seguridad
El comportamiento es indefinido si reg no es null o un puntero válido a QkClassicalRegister.
Parámetros
- reg - Un puntero al registro a liberar.
qk_classical_register_name
char *qk_classical_register_name(const QkClassicalRegister *creg)
Obtener el nombre de un registro clásico.
Devuelve una cadena C recién asignada que contiene el nombre del registro clásico.
Ejemplo
QkClassicalRegister *cr = qk_classical_register_new(3, "my_creg");
char *name = qk_classical_register_name(cr);
printf("Register name: %s\n", name);
qk_str_free(name);
qk_classical_register_free(cr);Seguridad
El comportamiento no está definido si creg no es un puntero válido y no nulo a un QkClassicalRegister.
Parámetros
- creg – Un puntero al registro clásico.
Devuelve
Un puntero a una cadena recién asignada, terminada en «null», que contiene el nombre del registro. La función que la invoca debe liberar esta cadena utilizando qk_str_free.
qk_classical_register_num_bits
size_t qk_classical_register_num_bits(const QkClassicalRegister *creg)
Obtén el número de bits clásicos de un registro clásico.
Devuelve el tamaño (número de bits clásicos) del registro clásico.
Ejemplo
QkClassicalRegister *cr = qk_classical_register_new(3, "my_creg");
size_t num_clbits = qk_classical_register_num_bits(cr);
printf("Number of clbits: %zu\n", num_clbits); // Prints: 3
qk_classical_register_free(cr);Seguridad
El comportamiento no está definido si creg no es un puntero válido y no nulo a un QkClassicalRegister.
Parámetros
- creg – Un puntero al registro clásico.
Devuelve
El número de bits clásicos del registro.
qk_classical_register_circuit_bits
void qk_classical_register_circuit_bits(const QkClassicalRegister *creg, const QkCircuit *circuit, uint32_t *out_bits)
Obtiene los índices de bits de circuito de todos los clbits de un registro clásico.
Genera una correspondencia entre cada clbit del registro clásico y su índice correspondiente en la lista de clbits del circuito. Si un clbit del registro no está presente en el circuito, su índice en la asignación será UINT32_MAX.
Ejemplo
QkCircuit *qc = qk_circuit_new(0, 2);
QkClassicalRegister *cr = qk_classical_register_new(3, "my_creg");
qk_circuit_add_classical_register(qc, cr);
uint32_t bit_indices[3];
qk_classical_register_circuit_bits(cr, qc, bit_indices);
// bit_indices now contains [2, 3, 4] since all clbits are in the circuit
// and the circuit has 2 anonymous clbits
qk_classical_register_free(cr);
qk_circuit_free(qc);Seguridad
El comportamiento es indefinido si:
cregno es un puntero válido y no nulo a unQkClassicalRegister.circuitno es un puntero válido y no nulo a unQkCircuit.cregtiene uno o más bits yout_bitsno es un puntero alineado y no nulo a una matriz con al menosqk_classical_register_num_bits(creg)elementos.
Parámetros
- creg – Un puntero al registro clásico que se va a asignar.
- circuito : un puntero al circuito que contiene los clbits.
- out_bits : un puntero a una matriz en la que se escribirán los índices mapeados. El array debe estar preasignado con al menos
qk_classical_register_num_bitselementos paracreg. Cada elemento contendrá el índice del bit del circuito oUINT32_MAX, si el clbit no está en el circuito.