変数および式クラス
qbpp::Var、qbpp::Term、および qbpp::Expr クラス
QUBO++ は以下の基本クラスを提供します:
qbpp::Var: 変数を記号的に表現し、表示用に使用される文字列に関連付けられます。 内部的には、32ビットの符号なし整数が識別子として使用されます。qbpp::Term: 整数係数と一つ以上のqbpp::Varオブジェクトで構成される積項を表します。 整数係数のデータ型はCOEFF_TYPEマクロによって定義され、デフォルト値はint32_t.qbpp::Expr: 整数定数項とゼロ個以上のqbpp::Termオブジェクトで構成される展開式を表す。 整数定数項のデータ型はENERGY_TYPEマクロによって定義され、そのデフォルト値はint64_t.
以下のプログラムでは、xとy は qbpp::Var オブジェクト、t は qbpp::Term オブジェクトであり、 fは qbpp::Expr オブジェクトです:
#include "qbpp.hpp"
int main() {
auto x = qbpp::var("x");
auto y = qbpp::var("y");
auto t = 2 * x * y;
auto f = t - x + 1;
std::cout << "x = " << x << std::endl;
std::cout << "y = " << y << std::endl;
std::cout << "t = " << t << std::endl;
std::cout << "f = " << f << std::endl;
}
このプログラムは次の出力を生成します:
x = x
y = y
t = 2*x*y
f = 1 -x +2*x*y
データ型を明示的に指定する場合、プログラムは以下のように書き換えられます:
#include "qbpp.hpp"
int main() {
qbpp::Var x = qbpp::var("x");
qbpp::Var y = qbpp::var("y");
qbpp::Term t = 2 * x * y;
qbpp::Expr f = t - x + 1;
std::cout << "x = " << x << std::endl;
std::cout << "y = " << y << std::endl;
std::cout << "t = " << t << std::endl;
std::cout << "f = " << f << std::endl;
}
qbpp::Var オブジェクトは不変であり、作成後に更新することはできません。
対照的に、 qbpp::Term と qbpp::Expr オブジェクトは可変であり、代入によって更新できます。
例えば、以下のプログラムに示すように、複合代入演算子を使用して qbpp::Term および qbpp::Expr オブジェクトを更新できます:
#include "qbpp.hpp"
int main() {
qbpp::Var x = qbpp::var("x");
qbpp::Var y = qbpp::var("y");
qbpp::Term t = 2 * x * y;
qbpp::Expr f = t - x + 1;
std::cout << "t = " << t << std::endl;
std::cout << "f = " << f << std::endl;
t *= 3 * x;
f += 2 * y;
std::cout << "t = " << t << std::endl;
std::cout << "f = " << f << std::endl;
}
このプログラムは次の出力を表示します:
t = 2*x*y
f = 1 -x +2*x*y
t = 6*x*y*x
f = 1 -x +2*x*y +2*y
ほとんどの場合、明示的に qbpp::Term オブジェクトを明示的に使用する必要はありません。
これらは、最大限のパフォーマンス最適化が必要な場合にのみ使用すべきです。
ただし、自動型推論によって qbpp::Term オブジェクトを生成する可能性があることに注意してください。このオブジェクトは一般的な式を格納できません。
例えば、次のプログラムは式がオブジェクトに代入されるためコンパイルエラーになります: qbpp::Term オブジェクトに式が代入されるためコンパイルエラーとなります:
#include "qbpp.hpp"
int main() {
auto x = qbpp::var("x");
auto y = qbpp::var("y");
auto t = 2 * x * y;
t = x + 1;
}
オブジェクトが意図されている場合、以下に示すように明示的に構築するために qbpp::Expr オブジェクトを意図する場合は、以下に示すように明示的に構築qbpp::toExpr()するために を使用できます:
#include "qbpp.hpp"
int main() {
auto x = qbpp::var("x");
auto y = qbpp::var("y");
auto t = qbpp::toExpr(2 * x * y);
auto f = qbpp::toExpr(1);
t += x + 1;
f += t;
std::cout << "t = " << t << std::endl;
std::cout << "f = " << f << std::endl;
}
このプログラムでは、とのft両方が qbpp::Expr オブジェクトであり、一般的な式を格納できます。
特に、 f は定数項のみを含む qbpp::Expr 定数項のみを含むオブジェクトとして作成され、その値は 1 を値とする定数項のみを含み、積項を持たない
COEFF_TYPE および ENERGY_TYPE
マクロCOEFF_TYPE および は、式における係数とENERGY_TYPEエネルギー値に使用されるデータ型を定義します。
また ENERGY_TYPE マクロは、整数定数項を持つ qbpp::Expr オブジェクトの整数定数項のデータ型としても使用される。
デフォルトでは、 COEFF_TYPE および ENERGY_TYPE はint64_tそれぞれ および int32_tとして定義されます。
これらはコンパイラオプションまたはソースコード内の #define ディレクティブを使用して変更できます。
以下のデータ型がサポートされています:
-
標準整数型:
int8_t,int16_t,int32_t, およびint64_t -
Boost.Multiprecision 整数型:
qbpp::int128_t,qbpp::int256_t,qbpp::int512_t,qbpp::int1024_t, およびqbpp::cpp_int
型qbpp::cpp_intは任意桁数の整数を表します。
この型の定数値は文字列リテラルで指定できます。
例えば、以下のプログラムは qbpp::Expr 非常に大きな係数と定数項を持つオブジェクトを作成します:
#define COEFF_TYPE qbpp::cpp_int
#define ENERGY_TYPE qbpp::cpp_int
#include "qbpp.hpp"
int main() {
auto x = qbpp::var("x");
auto f = qbpp::cpp_int("123456789012345678901234567890") * x +
qbpp::cpp_int("987654321098765432109876543210");
std::cout << "f = " << f << std::endl;
}
このプログラムは次の出力を生成します:
f = 987654321098765432109876543210 +123456789012345678901234567890*x