Skip to main content
IBM Quantum Platform

コスト関数

qiskit_addon_mpf.costs

MPF係数のコスト関数。

このモジュールは、最適化問題生成関数を多数提供し、それぞれが問題の目標目的である異なるコスト関数を実装しています。 このモジュールが提供する関数はすべて、最適化問題のパラメータをコード化した連立一次方程式(LSE)の連立方程式を最初の引数にとります。

LSE

class LSE(A, b)

GitHub

ベース: NamedTuple

namedtuple 連立一次方程式を表す。

Ax=bA x = b

LSE(A,b)の新しいインスタンスを作成する

パラメーター

A

タイプ: ndarray

LSEの左側。

b

タイプ: ndarray

LSEの右側。

count

count(value, /)

値の出現回数を返す。

index

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

値の最初のインデックスを返す。

値が存在しない場合は ValueError を返す。

solve

solve()

GitHub

このLSEの解を返す: x=A1bx=A^{-1}b.

戻り値

このLSEの解決策。

レイズ

  • ValueError - この LSE が未割り当ての値でパラメータ化されている場合。
  • ValueError - このLSEが、有効なMPF係数の要件である ixi==1\sum_i x_i == 1 を確保する行を含んでいない場合。

戻りの型

ndarray

x

タイプ: Variable

を返す Variable.


最適化問題生成器

setup_exact_problem

setup_exact_problem(lse)

GitHub

を構築する。 cvxpy.Problem を構築する。

この最適化問題によって求められる係数は、以下の方法によって得られる解析的な係数と同じになる。 LSE.solve() メソッドから得られる解析的係数と同じになる。 この追加インターフェースは、このモジュールが提供する他のコスト関数との並列性を強調するために存在する。 また、MPF係数をターゲットとした最適化問題へのアプローチ方法の教育的目的もある。

この関数によって構成される最適化問題は次のように定義される:

  • L1-norm を最小化する。norm1)を最小化する。LSE.x)

  • の各式に対応する。 LSE:

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

以下に例を示します。

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

そうすれば、次のように問題を解いて展開係数にアクセスすることができる:

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

パラメーター

lse (LSE) – モデルを構築するための一次方程式系。

戻り値

最適化問題と係数変数。

戻りの型

タプル [*問題*, 変数]

参考文献

[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

を構築する。 cvxpy.Problem を構築する。

この関数によって構成される最適化問題は次のように定義される:

  • を最小化するコスト関数である。sum_squares())を最小化する。 LSE:
i(jAijxjbi)2\sum_i \left( \sum_j A_{ij} x_j - b_i \right)^2
  • つの制約が設定される:

    1. 変数は合計が1でなければならない: ixi==1\sum_i x_i == 1
    2. 変数の L1-norm (norm1)で囲まれる。 max_l1_norm

以下に例を示します。

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

そうすれば、次のように問題を解いて展開係数にアクセスすることができる:

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

パラメーター

  • lse (LSE) – モデルを構築するための一次方程式系。
  • max_l1_norm (float) – 変数の L1-norm の制約に使用する上限。

戻り値

最適化問題と係数変数。

戻りの型

タプル [*問題*, 変数]

参考文献

[1] : S. Zhukら、 フィジーク。 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

を構築する。 cvxpy.Problem を構築する。

この関数によって構成される最適化問題は次のように定義される:

  • コスト関数は以下の2次式を最小化する:
1+xTAx2xTb1 + x^T A x - 2 x^T b

[1] と [2] に示すように、この表現は、正確な時間発展状態と動的 MPF 間の誤差のフロベニウス ノルムから生じます。 そのため LSE によって構築された setup_dynamic_lse() を取り、この関数に突っ込むと、次式が得られる。 (20)の [1] (式と同じ。 (2)の( [2] )である

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) \, ,

ここで、我々の LSE はそれぞれグラム行列( [1], [2] では ˶=M˵), 重なりベクトル( [1], [2] では ˶=L˵)に対応する。 また、MPFの変数(または係数)は、 [1], [2].で用いた "c "ではなく、"x(t) "を用います。

  • つの制約が設定される:

    1. 変数は合計が1でなければならない: ixi==1\sum_i x_i == 1
    2. 変数の L1-norm (norm1)で囲まれる。 max_l1_norm

以下は、 lse オブジェクトを使用した例である。 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

そうすれば、次のように問題を解いて展開係数にアクセスすることができる:

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

パラメーター

  • lse (LSE) – モデルを構築するための一次方程式系。
  • max_l1_norm (float) – 変数の L1-norm の制約に使用する上限。

戻り値

最適化問題と係数変数。

戻りの型

タプル [*問題*, 変数]

参考文献

[1] : S. Zhukら、 フィジーク。 Rev. Research 6, 033309 (2024).

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

[2] : N. ロバートソンら arXiv:2407.17405v2 (2024).

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

このページは役に立ちましたか?
バグや誤字の報告、またはコンテンツの要求はGitHubで行ってください。