Hi-QUBO

変数および式クラス

qbpp::Var、qbpp::Term、および qbpp::Expr クラス

QUBO++ は以下の基本クラスを提供します:

以下のプログラムでは、xyqbpp::Var オブジェクト、tqbpp::Term オブジェクトであり、 fqbpp::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::Termqbpp::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_TYPEint64_tそれぞれ および int32_tとして定義されます。 これらはコンパイラオプションまたはソースコード内の #define ディレクティブを使用して変更できます。

以下のデータ型がサポートされています:

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

最終更新日: 2025.12.26