クイックリファレンス: 式のための演算子と関数
以下の表は、 qbpp::Expr オブジェクトで使用可能な演算子と関数をまとめます。
| 演算子/関数 | 演算子記号/関数名 | 関数の種類 | 戻り値の型 | 引数型 |
|---|---|---|---|---|
| 型変換 | toExpr() |
グローバル | qbpp::Expr |
ExprType |
| 型変換 | toInt() |
グローバル | Int |
qbpp::Expr |
| 代入 | = |
メンバ | qbpp::Expr |
ExprType |
| 二項演算子 | +, -, * |
グローバル | qbpp::Expr |
ExprType-ExprType |
| 複合代入演算子 | +=, -=, *= |
メンバ | qbpp::Expr |
ExprType |
| 除算 | / |
グローバル | qbpp::Expr |
ExprType-Int |
| 複合除算 | /= |
メンバ | qbpp::Expr |
Int |
| 一項演算子 | +, - |
グローバル | qbpp::Expr |
ExprType |
| 比較(等価) | == |
グローバル | qbpp::ExprExpr |
ExprType-Int |
| 比較(範囲比較) | <= <= |
グローバル | qbpp::ExprExpr |
IntInf-ExprType-IntInf |
| 平方 | sqr() |
グローバル | qbpp::Expr |
ExprType |
| スクエア | sqr() |
メンバー | qbpp::Expr |
- |
| GCD | gcd() |
グローバル | Int |
ExprType |
| 簡略化 | simplify(), simplify_as_binary(), simplify_as_spin() |
グローバル | qbpp::Expr |
ExprType |
| Simplify | simplify(), simplify_as_binary(), simplify_as_spin() |
メンバー | qbpp::Expr |
- |
| 評価 | operator() |
メンバー | Int |
ExprType-qbpp::MapList |
| 置換 | replace() |
グローバル | qbpp::Expr |
ExprType-qbpp::MapList |
| 置換 | replace() |
メンバー | qbpp::Expr |
qbpp::MapList |
| 縮小 | reduce() |
グローバル | qbpp::Expr |
ExprType |
| 減らす | reduce() |
メンバー | qbpp::Expr |
qbpp::MapList |
| バイナリ/スピン変換 | binary_to_spin(), spin_to_binary() |
グローバル | qbpp::Expr |
ExprType |
| バイナリ/スピン変換 | binary_to_spin(), spin_to_binary() |
メンバー | qbpp::Expr |
- |
型変換:qbpp::toExpr() および qbpp::toInt()
グローバル関数qbpp::toExpr() は引数を qbpp::Expr インスタンスに変換し、それを返します。
引数は以下のいずれかです:
- 整数
- 変数(
qbpp::Var) - 積項(
qbpp::Term) - 式(
qbpp::Expr) — この場合、型変換は行われない
これらの引数型を総称して ExprType.
グローバル関数 は、オブジェクトqbpp::toInt()の整数定数項を抽出して返します qbpp::Expr オブジェクトの整数定数項を抽出して返します。
式に積項(qbpp::Term オブジェクト)が含まれている場合、エラーが発生します。
式関連の型: ExprType
この用語ExprTypeは、 qbpp::Expr オブジェクトに変換可能な型のカテゴリを表します。
整数関連型:Int および IntInf
Int: 通常の整数IntInf: 整数、-qbpp::inf、または+qbpp::infのいずれかであり、無限の境界を表す。
グローバル関数とメンバ関数
演算子および関数 qbpp::Expr は2つの形式で提供される:
- グローバル関数:
これらは少なくとも1つのExprType引数を取り、通常は入力オブジェクトを変更せずに新しい
qbpp::Exprオブジェクトを返します。 - メンバ関数:
これらは
qbpp::Exprクラスのメンバ関数です。 多くの場合、呼び出し元オブジェクトを更新し、結果も返します。qbpp::Expr.
例: sqr()
例: sqr() 関数は式の平方を計算し、以下の両方の形式で利用可能です:
sqr(f)(グローバル): f を変更せずに f の平方を返すf.sqr()(メンバ): f をその二乗に更新し、更新後の式を返す
代入演算子: =
左辺はオブジェクトでなければなりません qbpp::Expr オブジェクトである必要があります。
右辺は ExprTypeでなければならず、最初に qbpp::Exprに変換される。
変換された式が左辺に代入される。
二項演算子: +, -, *
これらの演算子はグローバル関数として定義されます。
2つの ExprType オペランドを受け取り、結果を計算して返します。
少なくとも一方のオペランドが qbpp::Exprの場合、結果は常に qbpp::Exprとなる。
いずれのオペランドも qbpp::Exprの場合、結果は qbpp::Term.
例
変数 x の型の場合 qbpp::Var:
2 + x:qbpp::Expr2 * x:qbpp::Term
複合代入演算子: +=, -=, *=
これらの演算子はメンバ関数として定義されます。
左辺は qbpp::Exprでなければなりません。
指定された演算は右辺のオペランドを用いて適用されます。
左辺の式はその場で更新されます。
除算 / および複合除算 /=
除算演算子 / はグローバル関数として定義されます。
非整数 ExprType を被除数として、整数オペランドを除数として取り、商を qbpp::Expr.
被除数は除数で割り切れる必要がある。すなわち、 式中の整数定数項および全ての整数係数が除数で割り切れる必要がある。
複合除算演算子 /= はメンバ関数として定義されます。
- 左辺は
qbpp::Expr. - 右辺は整数でなければならない。
同じ除算条件が適用され、除算はその場で実行され、左辺式が更新される。
比較(等価性): ==
等価比較演算子 == は以下を取る:
- 非整数
ExprTypeを左辺に、 - 右辺に整数
等価制約が満たされた場合、最小値が 0 となる式を返します。
より具体的には、非整数の場合 ExprType オブジェクト f と整数 nに対して、この演算子は以下を返します: qbpp::sqr(f-n).
返されるオブジェクト g:
gは制約式qbpp::sqr(f - n)を表し、*gは基礎となる式を返すf.
qbpp::ExprExpr class
ここで、 g は オブジェクトqbpp::ExprExprであり、これは qbpp::Exprの派生クラスである。
間接参照 g を使用する * 演算子を使用すると、関連付けられた基盤となる qbpp::Expr オブジェクトが返されます。
比較(範囲比較): <= <=
範囲比較演算子は次の形式で記述されます:
l <= f <= u
ここで:
fは非整数型 ExprType、lおよびuは整数です。
この演算子は、範囲制約が満たされた場合に最小値が 0 となる式を返します。
具体的には、単位間隔を持つ補助整数変数 a が暗黙的に導入され、演算子は以下を返す: [l,u−1]の範囲で値を取る補助整数変数が暗黙的に導入され、演算子は以下を返す:
(f - a)(f - (a + 1))
返される qbpp::ExprExpr オブジェクト g:
gは制約式(f - a)(f - (a + 1))を表し、*gは基礎となる式f.
平方関数: sqr()
qbpp::Expr オブジェクトに対して f:
qbpp::sqr(f)(グローバル関数): 式を返すf * fを返します。 引数fは非整数ExprTypeオブジェクトである場合がある。f.sqr()(メンバ関数): 指定されたfをその場で更新し、f * f更新し、更新後の式を返します。
最大公約数関数 gcd()
グローバル関数 gcd()は qbpp::Expr オブジェクトを引数として受け取り、すべての整数係数と整数の定数項の最大公約数(GCD)を返します。
与えられた qbpp::Expr オブジェクトは結果の最大公約数で割り切れるため、式や最適解の構造を変更することなく、すべての整数係数と整数の定数項を最大公約数で割ることで簡略化できます。
関数の簡略化: simplify(), simplify_as_binary(), simplify_as_spin()
与えられた qbpp::Expr オブジェクト fに対して、メンバ関数 は以下の操作f.simplify()をその場で実行する:
- 各項内の変数を一意の変数IDに基づいてソートする
- 重複項をマージする
- 項を以下の条件でソートする:
- 低次項を先に表示し、
- 同じ次数の項は辞書順で並べ替える
グローバル関数 はqbpp::simplify(f)、 f.
二項式とスピン簡約化
簡略化関数の2つの特殊な変種が提供される:
simplify_as_binary(): すべての変数が二進値 $\lbrace 0,1\rbrace$ を取るという仮定のもとで簡約化が実行される。 恒等式 $x^2=x$ はすべての変数 $x$ に適用される。simplify_as_spin()すべての変数がスピン値 $\lbrace -1,+1\rbrace$ を取るという仮定のもとで簡略化が行われる。 恒等式 $x^2=1$ がすべての変数 $x$ に適用される。
両方のバリエーションはメンバ関数およびグローバル関数として利用可能です:
- メンバ関数: 簡略化をその場で実行し、
f.f.simplify_as_binary()f.simplify_as_spin()
- グローバル関数: 簡略化された式を返す(f を変更しない)。
qbpp::simplify_as_binary(f)qbpp::simplify_as_spin(f)
評価関数
A qbpp::MapListオブジェクトは、 qbpp::Var オブジェクトと整数のペアのリストを保持します。
各ペアは変数から整数値へのマッピングを定義します。
オブジェクト qbpp::Expr オブジェクト f と qbpp::MapList オブジェクト mlに対して、評価関数
f(ml)
は、変数割り当てによって指定された条件下で f を評価し ml によって指定された変数割り当てのもとで
f に対応するマッピングが ml.
置換関数: replace()
オブジェクトqbpp::MapListは、 qbpp::Var オブジェクトと ExprType オブジェクトからなるペアを含む場合がある。
このようなペアは変数から式へのマッピングを定義する。
特定の qbpp::Expr オブジェクト f と qbpp::MapList オブジェクト ml:
qbpp::replace(f, ml): 変数を置換して得られる新しいqbpp::Exprオブジェクトを返します。fオブジェクトを返します。mlの変数を置換して得られる新しいオブジェクトを返します。元のオブジェクトは変更されません。f.f.replace(ml): オブジェクト内の変数をf内の変数をmlをその場で置換し、結果のqbpp::Exprオブジェクトを返します。
Reduce関数: reduce()
関reduce()数は、高次項を含むオブジェクトを qbpp::Expr 高次項を含むオブジェクトを、線形項と二次項のみで構成される同等の qbpp::Expr オブジェクトに変換し、線形項と二次項のみで構成される結果を生成します。これによりQUBO式が得られます。
関数 qbpp::Expr オブジェクト f:
qbpp::reduce(f): 線形項と二次項のみからなる新しいqbpp::Expr線形項と二次項のみからなるオブジェクトを返す。これはf.f.reduce(): 置換fを置換し、更新された式を返す。qbpp::reduce(f)の結果でを置き換え、更新された式を返します。
二進変換関数: spin_to_binary(), binary_to_spin()
binary_y/spin変換関数:binary_y: x を二進変数、s をスピン変数とする。
以下の条件を仮定する: x = 1 が成立するときのみ s = 1。
この仮定のもとで、以下の関係が成立する:
$f(s)$ をスピン変数 $s$ の関数とする。 すると、関数 $g(x)=f(2x−1)$ は二値変数 $x$ の関数であり、上記の関係のもとで同じ値を返す。
このspin_to_binary()関数は、この関係を用いて qbpp::Expr 二進変数の関数を表すオブジェクトを、同等の qbpp::Expr 二進変数の関数を表すオブジェクトに変換する。
具体的には、すべてのスピン変数 s を f を 2 * s - 1.
qbpp::spin_to_binary(f): 新しいqbpp::Exprオブジェクトを生成し、返す。sをfを2 * s - 1.f.spin_to_binary(): 更新fをqbpp::spin_to_binary(f)を使用して更新し、更新された式を返します。
同様に、関数 binary_to_spin()はすべての二進変数を置換します x を f を (x + 1) / 2に置換します。
結果の式には非整数係数が含まれる可能性があります。
そのため、式全体を
$2^d$($d$ は全項の最高次数)で乗算し、全ての係数を整数にします。
グローバル関数およびメンバ関数の両方のバリエーションと同様に spin_to_binary()と同様に、グローバル関数とメンバ関数の両方のバリエーションが binary_to_spin() が提供されています。