コスト関数
qiskit_addon_mpf.costs
MPF係数のコスト関数。
このモジュールは、最適化問題生成関数を多数提供し、それぞれが問題の目標目的である異なるコスト関数を実装しています。 このモジュールが提供する関数はすべて、最適化問題のパラメータをコード化した連立一次方程式(LSE)の連立方程式を最初の引数にとります。
LSE
class LSE(A, b)
ベース: NamedTuple
namedtuple 連立一次方程式を表す。
LSE(A,b)の新しいインスタンスを作成する
パラメーター
A
タイプ: ndarray
LSEの左側。
b
タイプ: ndarray
LSEの右側。
count
count(value, /)
値の出現回数を返す。
index
index(value, start=0, stop=9223372036854775807, /)
値の最初のインデックスを返す。
値が存在しない場合は ValueError を返す。
solve
solve()
このLSEの解を返す: .
戻り値
このLSEの解決策。
レイズ
- ValueError - この LSE が未割り当ての値でパラメータ化されている場合。
- ValueError - このLSEが、有効なMPF係数の要件である を確保する行を含んでいない場合。
戻りの型
x
タイプ: Variable
を返す Variable.
最適化問題生成器
setup_exact_problem
setup_exact_problem(lse)
を構築する。 cvxpy.Problem を構築する。
この最適化問題によって求められる係数は、以下の方法によって得られる解析的な係数と同じになる。 LSE.solve() メソッドから得られる解析的係数と同じになる。 この追加インターフェースは、このモジュールが提供する他のコスト関数との並列性を強調するために存在する。 また、MPF係数をターゲットとした最適化問題へのアプローチ方法の教育的目的もある。
この関数によって構成される最適化問題は次のように定義される:
以下に例を示します。
>>> 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)。
setup_sum_of_squares_problem
setup_sum_of_squares_problem(lse, *, max_l1_norm=10.0)
を構築する。 cvxpy.Problem を構築する。
この関数によって構成される最適化問題は次のように定義される:
- を最小化するコスト関数である。
sum_squares())を最小化する。LSE:
-
つの制約が設定される:
- 変数は合計が1でなければならない:
- 変数の 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]パラメーター
戻り値
最適化問題と係数変数。
戻りの型
参考文献
[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)
を構築する。 cvxpy.Problem を構築する。
この関数によって構成される最適化問題は次のように定義される:
- コスト関数は以下の2次式を最小化する:
[1] と [2] に示すように、この表現は、正確な時間発展状態と動的 MPF 間の誤差のフロベニウス ノルムから生じます。 そのため LSE によって構築された setup_dynamic_lse() を取り、この関数に突っ込むと、次式が得られる。 (20)の [1] (式と同じ。 (2)の( [2] )である
ここで、我々の LSE はそれぞれグラム行列( [1], [2] では ˶=M˵), 重なりベクトル( [1], [2] では ˶=L˵)に対応する。 また、MPFの変数(または係数)は、 [1], [2].で用いた "c "ではなく、"x(t) "を用います。
-
つの制約が設定される:
- 変数は合計が1でなければならない:
- 変数の 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]パラメーター
戻り値
最適化問題と係数変数。
戻りの型
参考文献
[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).