クイックリファレンス: 変数と式
qbpp::Exprで使用されるデータ型
coeff_t:qbpp::Termオブジェクトの係数に使用される整数データ型。 デフォルトの型はint32_tです。 この型を変更するには、コンパイル時にCOEFF_TYPEマクロを定義します。例:-DCOEFF_TYPE=int16_tenergy_t:qbpp::Exprオブジェクトのエネルギー値の計算、およびqbpp::Expr内の整数定数項に使用される整数データ型。 デフォルトの型はint64_tです。 この型を変更するには、コンパイル時にENERGY_TYPEマクロを定義します。例:-DENERGY_TYPE=int32_tenergy_tのビット幅はcoeff_tのビット幅以上であることが保証されています。vindex_t:uint32_tとして定義され、各qbpp::Varオブジェクトの一意な整数IDを格納するために使用されます。 ほとんどの場合、このデータ型を変更する必要はありません。
使用可能な整数データ型
-
標準整数型:
int16_t,int32_t,int64_t -
多倍長整数型(Boost.Multiprecisionライブラリを使用して実装):
qbpp::int128_t,qbpp::cpp_int -
qbpp::cpp_int: 精度無制限の整数型。
WARNING パフォーマンスを最大化するため、QUBO++は算術オーバーフローのチェックを行いません。 開発およびテスト中は、
coeff_tとenergy_tにはより広いビット幅を使用することを推奨します。 必要なビット幅が不明な場合は、qbpp::cpp_intを使用して正確性を確保し、 検証後に固定幅の整数型に切り替えてください。
クラスオブジェクトの出力
QUBO++のほとんどのクラスは、std::ostreamの<<演算子を使用して出力でき、 デバッグに便利です。 例えば、QUBO++のオブジェクトobjは次のようにstd::coutに出力できます:
std::cout << obj << std::endl;
これはobj.str()またはstr(obj)を呼び出し、objのテキスト表現を含むstd::stringを返します。 この設計により、デバッガに頼ることなく内部状態を簡単に確認できます。
変数クラス
qbpp::Var: 一意な32ビット整数IDを保持するクラス。 変数名はグローバルレジストリに格納され、x.str()で取得できます。
NOTE
qbpp::Varオブジェクトは変数をシンボリックに表現します。 特定のデータ型は関連付けられていません。 バイナリ、スピン、その他の型の変数を表現するために使用できます。
変数作成関数
変数を作成するために以下の関数が提供されています:
-
qbpp::var("name"): 指定された名前"name"を持つqbpp::Varオブジェクトを作成します。 -
qbpp::var("name", s1): ベース名"name"を持つqbpp::Varオブジェクトの1次元配列を作成します。 各要素はname[i]として表現されます。 結果の型はqbpp::Array<1, qbpp::Var>です。 -
qbpp::var("name", s1, s2): ベース名"name"を持つqbpp::Varオブジェクトの2次元配列(行列)を作成します。 各要素はname[i][j]として表現されます。 結果の型はqbpp::Array<2, qbpp::Var>です。 -
qbpp::var("name", s1, s2, ...): ベース名"name"を持つqbpp::Varオブジェクトの高次元配列を作成します。 各要素はname[i][j]...として表現されます。 結果の型はqbpp::Array<N, qbpp::Var>です(Nは次元数)。
NOTE
"name"が省略された場合、"{0}"、"{1}"、…のような番号付きの名前が作成順に自動的に割り当てられます。
qbpp::Varメンバ関数
qbpp::Varのインスタンスxに対して、以下のメンバ関数が利用できます:
-
std::string x.str():xの名前を返します。 -
vindex_t x.index():xの一意な整数IDを返します。
通常、QUBO++プログラムでこれらのメンバ関数を明示的に呼び出す必要はありません。
整数変数クラス
qbpp::VarInt:qbpp::Exprから派生したクラスで、指定された範囲を持つ整数変数を表現します。
整数変数作成関数
整数変数を作成するために以下の関数が提供されています:
-
qbpp::var_int("name"): 内部的に使用されるヘルパーオブジェクトを返し、単体ではqbpp::VarIntを作成しません。qbpp::VarIntを定義するには、以下に示すように<=演算子を使用して範囲を指定する必要があります。 -
l <= qbpp::var_int("name") <= u: ここでlとuは整数でなければなりません。 この式は名前"name"を持つqbpp::VarIntオブジェクトを作成し、 内部的には範囲[l, u]のすべての整数を表現するqbpp::Exprオブジェクトを含みます。 内部的には、基礎となる式で使用されるqbpp::Varオブジェクトも作成されます。 -
l <= qbpp::var_int("name", s1) <= u: ベース名"name"と同じ範囲[l, u]を持つqbpp::VarIntオブジェクトの1次元配列を作成します。 各要素はname[i]として表現されます。 結果の型はqbpp::Array<1, qbpp::VarInt>です。qbpp::VarIntオブジェクトの高次元配列はqbpp::Varオブジェクトと同じ方法で作成できます。
整数変数メンバ関数
qbpp::VarIntのインスタンスxに対して、以下のメンバ関数が利用できます:
-
std::string x.name():xの名前を返します。 -
std::string x.str(): 基礎となる式の文字列表現を返します。 -
energy_t x.min_val():xの最小値lを返します。 -
energy_t x.max_val():xの最大値uを返します。 -
x.vars(): 整数変数を表現するために使用されるqbpp::Varオブジェクト配列のconst参照を返します。 -
x.coeffs(): 整数係数配列を返します。
以下の式はxに格納されている式と等価です:
x.min_val() + qbpp::sum(x.coeffs() * x.vars())