QkClassicalRegister
typedef struct QkClassicalRegister QkClassicalRegisterUma maneira comum de instanciar vários bits de uma vez é criar um registro. Um registro é um conjunto nomeado de bits. A criação de um registro permite dar a uma coleção de bits um nome que pode ser usado como metadados em torno de bits específicos em um circuito. Normalmente, esse nome também será preservado ao exportar o circuito para idiomas de intercâmbio.
É possível criar um registro chamando qk_classical_register_new(), por exemplo:
#include <qiskit.h>
QkClassicalRegister *creg = qk_classical_register_new(5, "my_creg");Isso cria um novo registro clássico de 5 bits chamado "my_creg".
Em seguida, para adicionar o registro a um circuito, use a função 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); // 5Embora os circuitos rastreiem os registros, os próprios registros quase não transmitem diferenças de comportamento aos circuitos.
Funções
qk_classical_register_new
QkClassicalRegister *qk_classical_register_new(uint32_t num_clbits, const char *name)
Construa um novo registro clássico proprietário com um determinado número de clbits e nome
Exemplo
QkClassicalRegister *cr = qk_classical_register_new(5, "five_qubits");Segurança
O parâmetro name deve ser um ponteiro para a memória que contenha um terminador nul válido no final da cadeia de caracteres. Ele também deve ser válido para leituras de bytes até o terminador nul, inclusive.
Parâmetros
- num_clbits - O número de clbits para criar o registro
- name - A cadeia de caracteres do nome do registro criado. O nome deve ser composto de caracteres válidos em UTF-8.
Retorna
Um ponteiro para o registro criado
qk_classical_register_free
void qk_classical_register_free(QkClassicalRegister *reg)
Registro clássico gratuito.
Exemplo
QkClassicalRegister *cr = qk_classical_register_new(1024, "creg");
qk_classical_register_free(cr);Segurança
O comportamento é indefinido se reg não for nulo ou um ponteiro válido para QkClassicalRegister.
Parâmetros
- reg - Um ponteiro para o registro a ser liberado.
qk_classical_register_name
char *qk_classical_register_name(const QkClassicalRegister *creg)
Obter o nome de um registro clássico.
Retorna uma string C recém-alocada contendo o nome do registro clássico.
Exemplo
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);Segurança
O comportamento é indefinido se creg não for um ponteiro válido e não nulo para um QkClassicalRegister.
Parâmetros
- creg – Um ponteiro para o registro clássico.
Retorna
Um ponteiro para uma string recém-alocada, terminada em null, que contém o nome do registro. O chamador deve liberar essa string usando qk_str_free.
qk_classical_register_num_bits
size_t qk_classical_register_num_bits(const QkClassicalRegister *creg)
Obter o número de bits clássicos em um registro clássico.
Retorna o tamanho (número de bits clássicos) do registro clássico.
Exemplo
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);Segurança
O comportamento é indefinido se creg não for um ponteiro válido e não nulo para um QkClassicalRegister.
Parâmetros
- creg – Um ponteiro para o registro clássico.
Retorna
O número de bits clássicos no registro.
qk_classical_register_circuit_bits
void qk_classical_register_circuit_bits(const QkClassicalRegister *creg, const QkCircuit *circuit, uint32_t *out_bits)
Obter os índices de bits de circuito para todos os clbits em um registro clássico.
Gera um mapeamento de cada clbit no registro clássico para o índice correspondente na lista de clbits do circuito. Se um clbit do registro não estiver presente no circuito, seu índice no mapeamento será UINT32_MAX.
Exemplo
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);Segurança
O comportamento é indefinido se:
cregnão é um ponteiro válido e diferente de nulo para umQkClassicalRegister.circuitnão é um ponteiro válido e diferente de nulo para umQkCircuit.cregpossui um ou mais bits eout_bitsnão é um ponteiro alinhado e diferente de nulo para uma matriz com pelo menosqk_classical_register_num_bits(creg)elementos.
Parâmetros
- creg – Um ponteiro para o registro clássico a ser mapeado.
- circuito – Um ponteiro para o circuito que contém os clbits.
- out_bits – Um ponteiro para uma matriz na qual os índices mapeados serão gravados. A matriz deve ser pré-alocada com pelo menos
qk_classical_register_num_bitselementos paracreg. Cada elemento conterá o índice do bit do circuito ou,UINT32_MAXcaso o clbit não esteja no circuito.