Skip to main content
IBM Quantum Platform

Fonctions de coût

qiskit_addon_mpf.costs

Fonctions de coût pour les coefficients MPF.

Ce module fournit un certain nombre de fonctions génératrices de problèmes d'optimisation, chacune mettant en œuvre une fonction de coût différente en tant qu'objectif cible du problème. Toutes les fonctions fournies par ce module prennent comme premier argument un système linéaire d'équations (LSE) codant les paramètres du problème d'optimisation comme premier argument.

LSE

class LSE(A, b)

GitHub

Bases : NamedTuple

namedtuple représentant un système linéaire d'équations.

Ax=bA x = b

Créer une nouvelle instance de LSE(A, b)

Paramètres

A

Type: ndarray

La partie gauche de la LSE.

b

Type: ndarray

Le côté droit de la LSE.

count

count(value, /)

Renvoie le nombre d'occurrences de la valeur.

index

index(value, start=0, stop=9223372036854775807, /)

Renvoie le premier indice de la valeur.

Lance ValueError si la valeur n'est pas présente.

solve

solve()

GitHub

Renvoyez la solution à cette LSE : x=A1bx=A^{-1}b.

Retours

La solution à cette LSE.

Augmentations

  • ValueError - si ce LSE est paramétré avec des valeurs non assignées.
  • ValueError - si cet ESL ne comporte pas de ligne garantissant cette ixi==1\sum_i x_i == 1, ce qui est une condition pour que les coefficients MPF soient valables.

Type de retour

ndarray

x

Type: Variable

Retourne la valeur $x$ Variable.


Constructeurs de problèmes d'optimisation

setup_exact_problem

setup_exact_problem(lse)

GitHub

Construire un cvxpy.Problem pour trouver les coefficients MPF exacts.

Remarque

Les coefficients trouvés via ce problème d'optimisation seront identiques aux coefficients analytiques obtenus à partir de la méthode LSE.solve() méthode. Cette interface supplémentaire a pour but de mettre en évidence le parallèle avec les autres fonctions de coût fournies par ce module. Il permet également d'apprendre comment aborder les problèmes d'optimisation ciblant les coefficients MPF.

Le problème d'optimisation construit par cette fonction est défini comme suit :

  • la fonction de coût minimise les L1-norm (norm1) des variables (LSE.x)

  • les contraintes correspondent à chaque équation de la LSE:

jAijxj=bi\sum_j A_{ij} x_j = b_i

Par exemple :

>>> from qiskit_addon_mpf.costs import setup_exact_problem
>>> from qiskit_addon_mpf.static import setup_static_lse
>>> lse = setup_static_lse([1,2,3], order=2, symmetric=True)
>>> problem, coeffs = setup_exact_problem(lse)
>>> print(problem)
minimize norm1(x)
subject to Sum([1. 1. 1.] @ x, None, False) == 1.0
           Sum([1. 0.25   0.11111111] @ x, None, False) == 0.0
           Sum([1. 0.0625 0.01234568] @ x, None, False) == 0.0

Vous pouvez alors résoudre le problème et accéder aux coefficients de dilatation de la manière suivante :

>>> final_cost = problem.solve()
>>> print(coeffs.value)  
[ 0.04166667 -1.06666667  2.025     ]

Paramètres

lse (LSE) – le système d'équations linéaires à partir duquel le modèle est construit.

Retours

Le problème d'optimisation et les coefficients variables.

Type de retour

tuple [*Problème*, Variable ]

Références

[1] : A. Carrera Vazquez et al, Quantum 7, 1067 (2023).

https://quantum-journal.org/papers/q-2023-07-25-1067/

setup_sum_of_squares_problem

setup_sum_of_squares_problem(lse, *, max_l1_norm=10.0)

GitHub

Construire un cvxpy.Problem pour trouver des coefficients MPF approximatifs.

Le problème d'optimisation construit par cette fonction est défini comme suit :

  • la fonction de coût minimise la somme des carrés (sum_squares()) des distances à une solution exacte pour toutes les équations de la fonction de coût LSE:
i(jAijxjbi)2\sum_i \left( \sum_j A_{ij} x_j - b_i \right)^2
  • deux contraintes sont fixées :

    1. la somme des variables doit être égale à 1 : ixi==1\sum_i x_i == 1
    2. l'adresse L1-norm (norm1) des variables est limitée par max_l1_norm

Par exemple :

>>> from qiskit_addon_mpf.costs import setup_sum_of_squares_problem
>>> from qiskit_addon_mpf.static import setup_static_lse
>>> lse = setup_static_lse([1,2,3], order=2, symmetric=True)
>>> problem, coeffs = setup_sum_of_squares_problem(lse, max_l1_norm=3.0)
>>> print(problem)  
minimize quad_over_lin(Vstack([1. 1.     1.]         @ x + -1.0,
                              [1. 0.25   0.11111111] @ x + -0.0,
                              [1. 0.0625 0.01234568] @ x + -0.0), 1.0)
subject to Sum(x, None, False) == 1.0
           norm1(x) <= 3.0

Vous pouvez alors résoudre le problème et accéder aux coefficients de dilatation de la manière suivante :

>>> final_cost = problem.solve()
>>> print(coeffs.value)  
[ 0.03513467 -1.          1.96486533]

Paramètres

  • lse (LSE) – le système d'équations linéaires à partir duquel le modèle est construit.
  • max_l1_norm (float) – la limite supérieure à utiliser pour la contrainte de L1-norm des variables.

Retours

Le problème d'optimisation et les coefficients variables.

Type de retour

tuple [*Problème*, Variable ]

Références

[1] : S. Zhuk et al, Physique. Rev. Research 6, 033309 (2024).

https://journals.aps.org/prresearch/abstract/10.1103/PhysRevResearch.6.033309

setup_frobenius_problem

setup_frobenius_problem(lse, *, max_l1_norm=10.0)

GitHub

Construire un cvxpy.Problem pour trouver des coefficients MPF approximatifs.

Le problème d'optimisation construit par cette fonction est défini comme suit :

  • la fonction de coût minimise l'expression quadratique suivante :
1+xTAx2xTb1 + x^T A x - 2 x^T b

Comme le montrent les points [1] et [2], cette expression découle de la norme de Frobenius de l'erreur entre un état d'évolution temporelle exact et un MPF dynamique. Ainsi, en prenant les LSE construit par setup_dynamic_lse() et en l'introduisant dans cette fonction, on obtient Eq. (20) de [1] (qui est identique à l'Eq. (2) de [2)], que nous reprenons ci-dessous

1+i,jAij(t)xi(t)xj(t)2ibi(t)xi(t),1 + \sum_{i,j} A_{ij}(t) x_i(t) x_j(t) - 2 \sum_i b_i(t) x_i(t) \, ,

où $A$ et $b$ de notre LSE correspondent respectivement à la matrice de Gram ($M$ en [1] et [2] ) et au vecteur de chevauchement ($L$ en [1] et [2] ). En outre, nous utilisons $x(t)$ pour désigner les variables MPF (ou coefficients) plutôt que $c$ en [1] et [2].

  • deux contraintes sont fixées :

    1. la somme des variables doit être égale à 1 : ixi==1\sum_i x_i == 1
    2. l'adresse L1-norm (norm1) des variables est limitée par max_l1_norm

Voici un exemple qui utilise l'objet lse construit dans l'exemple de setup_dynamic_lse().

>>> from qiskit_addon_mpf.costs import setup_frobenius_problem
>>> problem, coeffs = setup_frobenius_problem(lse, max_l1_norm=3.0)
>>> print(problem)  
minimize 1.0 + QuadForm(x, [[1.00 1.00]
                            [1.00 1.00]]) + -[2.00003171 1.99997911] @ x
subject to Sum(x, None, False) == 1.0
           norm1(x) <= 3.0

Vous pouvez alors résoudre le problème et accéder aux coefficients de dilatation de la manière suivante :

>>> final_cost = problem.solve()
>>> print(coeffs.value)  
[0.50596416 0.49403584]

Paramètres

  • lse (LSE) – le système d'équations linéaires à partir duquel le modèle est construit.
  • max_l1_norm (float) – la limite supérieure à utiliser pour la contrainte de L1-norm des variables.

Retours

Le problème d'optimisation et les coefficients variables.

Type de retour

tuple [*Problème*, Variable ]

Références

[1] : S. Zhuk et al, Physique. Rev. Research 6, 033309 (2024).

https://journals.aps.org/prresearch/abstract/10.1103/PhysRevResearch.6.033309

[2] : N. Robertson et al, arXiv:2407.17405v2 (2024).

https://arxiv.org/abs/2407.17405v2

Cette page a-t-elle été utile ?
Signaler un bogue, une coquille ou proposer du contenu sur GitHub.