変数と式の定義
ヘッダーファイルと名前空間
QUBO++ を使用するには、ヘッダーファイル をqbpp.hppインクルードし、 名前qbpp空間を使用する必要があります。
変数と式の定義
変数は auto 型qbpp::var("name")推論を使用して で定義できます。
指定された name は変数が出力される際に使用されます std::cout.
式は、+ -, , などの標準算術演算子*を用いて構築されます。
以下のサンプルプログラムは3つの変数を定義します a, b, および cを定義し、式 fを定義し、 std::cout:
#include "qbpp.hpp"
int main() {
auto a = qbpp::var("a");
auto b = qbpp::var("b");
auto c = qbpp::var("c");
auto f = (a + b - 1) * (b + c - 1);
std::cout << "f = " << f << std::endl;
}
式 (a + b - 1) * (b + c - 1) は自動的に展開され、 f.
このQUBO++プログラムでは、変数 a, b、および c はクラス qbpp::Varのオブジェクトであり、式 f はクラス qbpp::Expr.
ヘッダーとライブラリのパスが適切に設定されていると仮定すると、このプログラム(として保存test.cpp)は以下のようにコンパイルできます。 g++ 以下のようにコンパイルできます:
$ g++ test.cpp -o test -std=c++17 -lqbpp -ltbb
実行ファイルを実行すると、展開された式が印刷されます:
$ ./test
f = 1 +a*b +b*b +a*c +b*c -a -b -b -c
注記 変数名
qbpp::var()は省略可能です。 省略した場合、デフォルト名(例:{0},{1},… が自動的に割り当てられます。
警告 QUBO++クラスのインスタンス(例:
qbpp::Exprは、std::coutでテキストとして出力できます。 ただし、このテキスト出力は安定性が保証されておらず、今後のリリースで形式が変更される可能性があるため、後続の計算の入力として使用すべきではありません。 さらに、QUBO++のドキュメントに示されている出力は、古いバージョンのQUBO++で生成されたものである可能性があるため、最新版で生成される出力は異なる場合があります。
式を簡略化
オブジェクトに格納された式は、 qbpp::Expr オブジェクトに格納されている式は、メンバー関数simplify() を呼び出すことで簡略化できます:
std::cout << "f = " << f.simplify() << std::endl;
この変更により、プログラムの出力は次のようになります:
f.simplify() = 1 -a -2*b -c +a*b +a*c +b*b +b*c
メンバー関数呼び出しは式をf.simplify()簡略化し f を簡略化し、結果の値を返します。
この値は std::cout.
すべての変数が二進値(0または1)を取ると仮定すると、恒等式
$b^2=b$ を使用して式をさらに簡略化できます。
この目的のために、代わりに simplify_as_binary() を代わりに用いる:
std::cout << "f = " << f.simplify_as_binary() << std::endl;
すると出力は次のようになります:
f = 1 -a -b -c +a*b +a*c +b*c
簡略化関数は各項内の変数と式内の項を再配置し、低次項を先に表示し、同次項は変数の辞書順で並べ替える。 変数自体は定義順に並べ替えられる。
スピン変数を用いた式の簡略化
変数がスピン値 $-1$/$+1$ を取るものと仮定する場合、恒等式 $b^2 = 1$ を使用して式をさらに簡略化できる。
この場合、メンバーsimplify_as_spin()関数を使用して式を簡略化できる:
std::cout << "f = " << f.simplify_as_spin() << std::endl;
すると出力は次のようになります:
f = 2 -a -2*b -c +a*b +a*c +b*c
簡略化のためのグローバル関数
メンバ関数はに格納された式を更新する fに格納された式を更新する。
を修正したくない場合 fを変更したくない場合は、代わりにグローバル関数
qbpp::simplify(f),qbpp::simplify_as_binary(f) , を使用できます。qbpp::simplify_as_spin(f)これらは元のオブジェクトを変更せずに簡略化された式を返します。 f.
注: QUBO++では、ほとんどのメンバ関数は可能な場合オブジェクトをその場で更新しますが、グローバル関数は元のオブジェクトを変更せずに新しい値を返します。