Skip to main content
IBM Quantum Platform

QkClassicalRegister

typedef struct QkClassicalRegister QkClassicalRegister

La 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); // 5

Alors 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 :

  • creg n'est pas un pointeur valide et non nul vers un QkClassicalRegister.
  • circuit n'est pas un pointeur valide et non nul vers un QkCircuit.
  • creg comporte un ou plusieurs bits et out_bits n'est pas un pointeur aligné et non nul vers un tableau comportant au moins qk_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 pour creg. Chaque élément contiendra soit l'index du bit du circuit, soit UINT32_MAX si le clbit ne figure pas dans le circuit.
Cette page a-t-elle été utile ?
Signaler un bogue, une coquille ou proposer du contenu sur GitHub.