QkClassicalRegister
typedef struct QkClassicalRegister QkClassicalRegisterLa création d'un registre est un moyen courant d'instancier plusieurs bits à la fois. Un registre est une collection nommée de bits. La création d'un registre permet de donner à une collection de bits un nom qui peut être utilisé comme métadonnées autour de bits spécifiques dans un circuit. Ce nom sera également conservé lors de l'exportation du circuit vers d'autres langues.
Vous pouvez créer un registre en appelant qk_classical_register_new(), par exemple :
#include <qiskit.h>
QkClassicalRegister *creg = qk_classical_register_new(5, "my_creg");Ce qui crée un nouveau registre de 5 bits classiques nommé "my_creg".
Ensuite, pour ajouter le registre à un circuit, vous utilisez la fonction 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); // 5Alors que les circuits suivent les registres, les registres eux-mêmes ne transmettent pratiquement aucune différence de comportement aux circuits.
Fonctions
qk_classical_register_new
QkClassicalRegister *qk_classical_register_new(uint32_t num_clbits, const char *name)
Construire un nouveau registre classique propriétaire avec un nombre de clbits et un nom donnés
Exemple
QkClassicalRegister *cr = qk_classical_register_new(5, "five_qubits");Sécurité
Le paramètre name doit être un pointeur vers une mémoire contenant un terminateur nul valide à la fin de la chaîne. Il doit également être valide pour les lectures d'octets jusqu'au terminateur nul inclus.
Paramètres
- num_clbits - Nombre de clbits pour lesquels le registre doit être créé
- name - Chaîne de nom du registre créé. Le nom doit être composé de caractères valides UTF-8.
Retours
Un pointeur sur le registre créé
qk_classical_register_free
void qk_classical_register_free(QkClassicalRegister *reg)
Libérez un registre classique.
Exemple
QkClassicalRegister *cr = qk_classical_register_new(1024, "creg");
qk_classical_register_free(cr);Sécurité
Le comportement est indéfini si reg n'est ni null ni un pointeur valide vers QkClassicalRegister.
Paramètres
- reg - Un pointeur sur le registre à libérer.
qk_classical_register_name
char *qk_classical_register_name(const QkClassicalRegister *creg)
Récupérer le nom d'un registre classique.
Renvoie une chaîne C nouvellement allouée contenant le nom du registre classique.
Exemple
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);Sécurité
Le comportement est indéfini si creg n'est pas un pointeur valide et non nul vers un QkClassicalRegister.
Paramètres
- creg – Un pointeur vers le registre classique.
Retours
Un pointeur vers une chaîne de caractères nouvellement allouée, terminée par un caractère nul, contenant le nom du registre. L'appelant doit libérer cette chaîne à l'aide de qk_str_free.
qk_classical_register_num_bits
size_t qk_classical_register_num_bits(const QkClassicalRegister *creg)
Récupérer le nombre de bits classiques dans un registre classique.
Renvoie la taille (nombre de bits classiques) du registre classique.
Exemple
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);Sécurité
Le comportement est indéfini si creg n'est pas un pointeur valide et non nul vers un QkClassicalRegister.
Paramètres
- creg – Un pointeur vers le registre classique.
Retours
Le nombre de bits classiques dans le registre.
qk_classical_register_circuit_bits
void qk_classical_register_circuit_bits(const QkClassicalRegister *creg, const QkCircuit *circuit, uint32_t *out_bits)
Récupérer les indices de bits de circuit pour tous les clbits d'un registre classique.
Génère une correspondance entre chaque clbit du registre classique et l'index correspondant dans la liste des clbits du circuit. Si un bit du registre n'est pas présent dans le circuit, son index dans la table de correspondance sera UINT32_MAX.
Exemple
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);Sécurité
Le comportement est indéfini si :
cregn'est pas un pointeur valide et non nul vers unQkClassicalRegister.circuitn'est pas un pointeur valide et non nul vers unQkCircuit.cregcomporte un ou plusieurs bits etout_bitsn'est pas un pointeur aligné et non nul vers un tableau comportant au moinsqk_classical_register_num_bits(creg)éléments.
Paramètres
- creg – Un pointeur vers le registre classique à mapper.
- circuit – Un pointeur vers le circuit contenant les clbits.
- out_bits – Un pointeur vers un tableau dans lequel les indices mappés seront écrits. Le tableau doit être préalloué avec au moins
qk_classical_register_num_bitséléments pourcreg. Chaque élément contiendra soit l'index du bit du circuit, soitUINT32_MAXsi le clbit ne figure pas dans le circuit.