Bibliothèque de circuits
La bibliothèque de circuits Qiskit contient des fonctions et des modules de haut niveau permettant de créer des circuits quantiques couramment utilisés.
Types de données
QkPauliProductRotation
struct QkPauliProductRotation
Une représentation des données de rotation du produit de Pauli.
Une rotation par produit de Pauli réalise une rotation d'un angle autour d'un axe défini par un produit de Pauli sur len qubits. Le vecteur Pauli est ici représenté au format ZX, avec deux tableaux booléens correspondant respectivement aux composantes Z et X.
bool *z
Pointeur vers un tableau len de longueur n contenant des composantes de type Z.
bool *x
Pointeur vers un tableau len de longueur x éléments.
size_t len
Le nombre de termes de Pauli.
QkParam *angle
L'angle de rotation.
QkPauliProductMeasurement
struct QkPauliProductMeasurement
Une représentation des données de mesure du produit de Pauli.
Une mesure de produit de Pauli consiste à effectuer une projection sur l'espace propre du produit de Pauli défini sur len qubits. Le vecteur Pauli est ici représenté au format ZX, avec deux tableaux booléens correspondant aux composantes Z et X; il peut comporter un signe moins, indiqué par flip_outcome.
bool *z
Pointeur vers un tableau len de longueur n contenant des composantes de type Z.
bool *x
Pointeur vers un tableau len de longueur x éléments.
size_t len
Le nombre de termes de Pauli.
bool résultat_du_tirage
Si le résultat de la mesure comporte un signe moins.
Fonctions
qk_circuit_library_iqp
QkCircuit *qk_circuit_library_iqp(uint32_t num_qubits, const int64_t *interactions, bool check_input)
Générer un circuit à polynôme quantique instantané (IQP) à partir d'une matrice d'interaction entière.
La interactions matrice est interprétée comme un tableau n × n orienté par les lignes contenant des entiers de 64 bits, où n = num_qubits. Les éléments diagonaux définissent des puissances de phase de type T, tandis que le triangle supérieur code les interactions CPhase à deux qubits.
Sécurité
Si num_qubits > 0, interactions doit être un pointeur valide et non nul pointant vers au moins num_qubits * num_qubits valeurs int64_t contiguës classées selon l'ordre des lignes. La mémoire pointée par interactions doit être correctement alignée, accessible en lecture pendant toute la durée de cet appel et ne pas faire l'objet d'un alias mutable. Le fait de passer un pointeur non valide ou un tampon trop petit entraîne un comportement indéfini.
Paramètres
- num_qubits – Nombre de qubits logiques (
n). Doit correspondre à la dimension de lainteractionsmatrice. - interactions – Pointeur vers une matrice à
n × nrangs majeurs de typeint64_t. Ne peut être NULL que sinum_qubits == 0. - check_input – Lorsque cette fonction
trueest appelée, elle vérifie si la matrice est symétrique et renvoie une valeurNULLsi ce n'est pas le cas. Dans ce casfalse, aucune validation supplémentaire n'est effectuée.
Retours
Une matrice nouvellement allouée QkCircuit* en cas de réussite (l'appelant doit la libérer avec qk_circuit_free), ou NULL si num_qubits > 0 et interactions est NULL, ou si check_input est true et que la matrice n'est pas symétrique.
qk_circuit_library_random_iqp
QkCircuit *qk_circuit_library_random_iqp(uint32_t num_qubits, int64_t seed)
Générer un circuit polynomial quantique instantané (IQP) aléatoire.
Cela génère en interne une matrice d'interaction symétrique aléatoire d'entiers et l'utilise pour construire un circuit IQP, à l'instar du constructeur qiskit.circuit.library.IQPPython.
Paramètres
- num_qubits – Nombre de qubits.
- graine – graine du générateur aléatoire. Si la valeur est négative, l'entropie est extraite du système d'exploitation; dans le cas contraire, la valeur fournie est utilisée comme graine déterministe.
Retours
Une mémoire nouvellement allouée QkCircuit* (l'appelant doit la libérer avec qk_circuit_free).
qk_pauli_product_rotation_clear
void qk_pauli_product_rotation_clear(QkPauliProductRotation *inst)
Effacer les données internes des objets alloués par Rust QkPauliProductRotation.
Cela libère la mémoire des tableaux z x et et libère le angle. Cette fonction ne doit être appelée que pour QkPauliProductRotation les objets dont les données ont été renseignées par Rust.
Exemple
// let `circuit` be a QkCircuit* and `index` a size_t at the position of a QkPauliProductRotation
QkPauliProductRotation inst;
// query the QkPauliProductRotation data
assert(qk_circuit_operation_kind(circuit, index) == QkOperationKind_PauliProductRotation);
qk_circuit_inst_pauli_product_rotation(circuit, index, &inst);
// do something with `inst`, and then clear the Rust-allocated data
qk_pauli_product_rotation_clear(&inst);En revanche, cette fonction ne doit pas être appelée si le langage C se charge déjà d'effacer les données.
bool z[4] = {false, false, true, true};
bool x[4] = {false, true, true, false};
QkParam *angle = qk_param_from_double(1.0);
QkPauliProductRotation rotation = {z, x, 4, angle};
// since this data is allocated by C, we do not call `qk_pauli_product_rotation_clear(&rotation)`!
qk_param_free(angle);Sécurité
Le comportement est indéfini si inst n'est pas un pointeur valide et non nul vers un QkPauliProductRotation, ou si les données internes de QkPauliProductRotation sont incohérentes.
Paramètres
- inst – Un pointeur vers l'élément
QkPauliProductRotationà effacer.
qk_pauli_product_measurement_clear
void qk_pauli_product_measurement_clear(QkPauliProductMeasurement *inst)
Effacer les données internes des objets alloués par Rust QkPauliProductMeasurement.
Cela libère la mémoire des tableaux z x et. Cette fonction ne doit être appelée que pour QkPauliProductMeasurement les objets dont les données ont été renseignées par Rust.
Exemple
// let `circuit` be a QkCircuit* and `index` a size_t at the position
// of a QkPauliProductMeasurement
QkPauliProductMeasurement inst;
// query the QkPauliProductMeasurement data
assert(qk_circuit_operation_kind(circuit, index) == QkOperationKind_PauliProductMeasurement);
qk_circuit_inst_pauli_product_measurement(circuit, index, &inst);
// do something with `inst`, and then clear the Rust-allocated data
qk_pauli_product_measurement_clear(&inst);En revanche, cette fonction ne doit pas être appelée si le langage C se charge déjà d'effacer les données.
bool z[4] = {false, false, true, true};
bool x[4] = {false, true, true, false};
QkPauliProductMeasurement inst = {z, x, 4, true};
// since this data is allocated by C, we do not call `qk_pauli_product_measurement_clear(&inst)`Sécurité
Le comportement est indéfini si inst n'est pas un pointeur valide et non nul vers un QkPauliProductMeasurement, ou si les données internes de QkPauliProductMeasurement sont incohérentes.
Paramètres
- inst – Un pointeur vers l'élément
QkPauliProductMeasurementà effacer.
qk_circuit_library_quantum_volume
QkCircuit *qk_circuit_library_quantum_volume(uint32_t num_qubits, size_t depth, int64_t seed)
Générer un circuit modèle Quantum Volume
Les circuits modèles sont des exemples aléatoires de circuits utilisés pour mesurer la métrique Quantum Volume, telle que présentée au point [1]. Les circuits modèles sont constitués de couches d'éléments aléatoires de Haar de SU(4) appliqués entre des paires correspondantes de qubits dans une bipartition aléatoire.
Cette fonction est multithread et lancera par défaut un pool de threads dont le nombre sera égal au nombre de processeurs. Vous pouvez régler le nombre de threads à l'aide de la variable d'environnement RAYON_NUM_THREADS. Par exemple, définir RAYON_NUM_THREADS=4 limiterait le pool de threads à 4 threads.
[1] A. Cross et al. Validation des ordinateurs quantiques à l'aide de circuits modèles aléatoires, Phys. Rév. A 100, 032328 (2019). arXiv:1811.12926
Exemple
QkCircuit *qc = qk_circuit_library_quantum_volume(10, 10, -1)Paramètres
- num_qubits – Nombre de qubits à utiliser pour le circuit généré.
- profondeur – Nombre de couches pour le circuit généré.
- seed – Une graine RNG utilisée pour générer les matrices SU(4) aléatoires utilisées dans le circuit de sortie. Si le nombre fourni est négatif, la graine utilisée sera tirée de l'entropie du système.
Retours
Un pointeur vers le circuit de volume quantique.
qk_circuit_library_suzuki_trotter
QkCircuit *qk_circuit_library_suzuki_trotter(const QkObs *op, uint32_t order, uint32_t reps, double time, bool preserve_order, bool insert_barriers)
Générer un circuit à partir d'une observable en utilisant la formule du produit de Suzuki-Trotter d'ordre supérieur.
Les formules de Suzuki-Trotter corrigent l'erreur de l'approximation de Lie-Trotter. Dans cette mise en œuvre, les opérateurs sont représentés sous forme de termes de somme d'un opérateur de Pauli. Les décompositions d'ordre supérieur reposent sur des récursions, voir la référence. [1] pour plus de détails.
Exemple
QkObs *obs = qk_obs_zero(1);
QkBitTerm op1_bits[1] = {QkBitTerm_X};
QkObsTerm term1 = {(QkComplex64){1.0, 0.0}, 1, op1_bits, (uint32_t[1]){0}, 1};
qk_obs_add_term(obs, &term1);
QkBitTerm op2_bits[1] = {QkBitTerm_Y};
QkObsTerm term2 = {(QkComplex64){1.0, 0.0}, 1, op2_bits, (uint32_t[1]){0}, 1};
qk_obs_add_term(obs, &term2);
QkCircuit *qc = qk_circuit_library_suzuki_trotter(obs, 2, 1, 0.1, true, false);
qk_obs_free(obs);
qk_circuit_free(qc);Sécurité
Le comportement est indéfini : ce op n'est pas un pointeur valide et non nul vers un QkObs.
Références
[1] : D. Berry, G., Ahokas, R., Cleve et B. Sanders, « Algorithmes quantiques efficaces pour la simulation d'hamiltoniens clairsemés » (2006). arXiv:quant-ph/0508139
[2] : N. Hatano et M. Suzuki, « Détermination des formules de produits exponentiels d'ordre supérieur » (2005). arXiv:math-ph/0506007
Paramètres
- op – L'opérateur
QkObscontenant la somme des termes de Pauli. - ordre – L'ordre des termes de la formule du produit.
- reps – Le nombre d'itérations.
- temps – Le temps d'évolution.
- preserve_order – Si cette
falseoption est activée, elle permet de réorganiser les termes de l'opérateur afin d'obtenir éventuellement un circuit d'évolution moins profond. Cela n'a pas d'importance lorsqu'on synthétise une observable à un seul terme. - insert_barriers – Indique s'il faut insérer des séparateurs entre les termes.
Retours
Un pointeur vers le circuit généré.