QkClassicalRegister
typedef struct QkClassicalRegister QkClassicalRegisterUn modo comune per istanziare più bit in una volta sola è quello di creare un registro. Un registro è un insieme denominato di bit. La creazione di un registro consente di assegnare a un insieme di bit un nome che può essere utilizzato come metadata per specifici bit in un circuito. Questo nome viene di solito mantenuto anche quando si esporta il circuito in altre lingue.
È possibile creare un registro chiamando, ad esempio, qk_classical_register_new():
#include <qiskit.h>
QkClassicalRegister *creg = qk_classical_register_new(5, "my_creg");Il che crea un nuovo registro a 5 bit classici chiamato "my_creg".
Per aggiungere il registro a un circuito si utilizza la funzione 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); // 5Mentre i circuiti tengono traccia dei registri, i registri stessi non apportano quasi nessuna differenza di comportamento ai circuiti.
Funzioni
qk_classical_register_new
QkClassicalRegister *qk_classical_register_new(uint32_t num_clbits, const char *name)
Costruire un nuovo registro classico proprietario con un numero di clbit e un nome determinati
Esempio
QkClassicalRegister *cr = qk_classical_register_new(5, "five_qubits");Sicurezza
Il parametro name deve essere un puntatore alla memoria che contiene un terminatore nul valido alla fine della stringa. Deve inoltre essere valido per la lettura di byte fino al terminatore nul incluso.
Parametri
- num_clbits - Il numero di clbits per il quale creare il registro
- name - La stringa del nome del registro creato. Il nome deve essere composto da caratteri validi UTF-8.
Risultati
Un puntatore al registro creato
qk_classical_register_free
void qk_classical_register_free(QkClassicalRegister *reg)
Liberare un registro classico.
Esempio
QkClassicalRegister *cr = qk_classical_register_new(1024, "creg");
qk_classical_register_free(cr);Sicurezza
Il comportamento è indefinito se reg non è nullo o un puntatore valido a un QkClassicalRegister.
Parametri
- reg - Un puntatore al registro da liberare.
qk_classical_register_name
char *qk_classical_register_name(const QkClassicalRegister *creg)
Ottieni il nome di un registro classico.
Restituisce una stringa C appena allocata contenente il nome del registro classico.
Esempio
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);Sicurezza
Il comportamento è indefinito se creg non è un puntatore valido e non nullo a un QkClassicalRegister.
Parametri
- creg – Un puntatore al registro classico.
Risultati
Un puntatore a una stringa terminata da 'NULL' appena allocata contenente il nome del registro. Chi effettua la chiamata deve liberare questa stringa utilizzando qk_str_free.
qk_classical_register_num_bits
size_t qk_classical_register_num_bits(const QkClassicalRegister *creg)
Ottieni il numero di bit classici presenti in un registro classico.
Restituisce la dimensione (numero di bit classici) del registro classico.
Esempio
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);Sicurezza
Il comportamento è indefinito se creg non è un puntatore valido e non nullo a un QkClassicalRegister.
Parametri
- creg – Un puntatore al registro classico.
Risultati
Il numero di bit classici nel registro.
qk_classical_register_circuit_bits
void qk_classical_register_circuit_bits(const QkClassicalRegister *creg, const QkCircuit *circuit, uint32_t *out_bits)
Recupera gli indici dei bit di circuito per tutti i clbit presenti in un registro classico.
Restituisce una mappatura da ciascun clbit nel registro classico al relativo indice nell'elenco dei clbit del circuito. Se un clbit del registro non è presente nel circuito, il suo indice nella mappatura sarà UINT32_MAX.
Esempio
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);Sicurezza
Il comportamento è indefinito se:
cregnon è un puntatore valido e non nullo a unQkClassicalRegister.circuitnon è un puntatore valido e non nullo a unQkCircuit.cregcontiene uno o più bit eout_bitsnon è un puntatore allineato e non nullo a un array con almenoqk_classical_register_num_bits(creg)elementi.
Parametri
- creg – Un puntatore al registro classico da mappare.
- circuito – Un puntatore al circuito contenente i clbit.
- out_bits – Un puntatore a un array in cui verranno scritti gli indici mappati. L'array deve essere preallocato con almeno
qk_classical_register_num_bitselementi percreg. Ogni elemento conterrà l'indice del bit del circuito oppure,UINT32_MAXse il clbit non è presente nel circuito.