Quick Reference: Variables and Expressions
Data types used in qbpp::Expr
coeff_t:
The integer data type used for coefficients inqbpp::Termobjects.
The default type isint32_t.
To change this type, define theCOEFF_TYPEmacro at compile time, for example:-DCOEFF_TYPE=int16_tenergy_t:
The integer data type used to compute energy values ofqbpp::Exprobjects,
as well as for integer constant terms inqbpp::Expr.
The default type isint64_t.
To change this type, define theENERGY_TYPEmacro at compile time, for example:-DENERGY_TYPE=int32_tThe bit width of
energy_tis guaranteed to be equal to or larger than that ofcoeff_t.vindex_t:
Defined asuint32_tand used to store a unique integer ID for eachqbpp::Varobject.
In most cases, it is not necessary to change this data type.
Available integer data types
-
Standard integer types:
int8_t,int16_t,int32_t,int64_t -
Multiprecision integer types (implemented using the Boost.Multiprecision library):
qbpp::int128_t,qbpp::int256_t,qbpp::int612_t,qbpp::int1024_t,qbpp::cpp_int -
qbpp::cpp_int:
An integer type with unlimited precision.
WARNING
To maximize performance, QUBO++ does not check for arithmetic overflow.
During development and testing, it is recommended to use wider bit widths forcoeff_tandenergy_t.
If the required bit widths are unclear, useqbpp::cpp_intto ensure correctness, and switch to fixed-width integer types after validation.
Printing class objects
Most classes in QUBO++ can be printed using the << operator with std::ostream,
which is useful for debugging.
For example, an object obj in QUBO++ can be printed to std::cout as follows:
std::cout << obj << std::endl;
This invokes either obj.str() or str(obj), which returns a std::string
containing a textual representation of obj.
This design allows easy inspection of internal states without relying on a debugger.
Variable classes
qbpp::Var: A class that holds a unique 32-bit integer ID and a string representing the variable name.
NOTE
Aqbpp::Varobject represents a variable symbolically.
No specific data type is associated with it.
It can be used to represent binary, spin, or other types of variables.
Variable creation functions
The following functions are provided to create variables:
-
qbpp::var("name"):
Creates aqbpp::Varobject with the given name"name". -
qbpp::var("name", s1):
Creates a one-dimensional array (vector) ofqbpp::Varobjects with the base name"name".
Each element is represented asname[i].
The resulting type isqbpp::Vector<qbpp::Var>. -
qbpp::var("name", s1, s2):
Creates a two-dimensional array (matrix) ofqbpp::Varobjects with the base name"name".
Each element is represented asname[i][j].
The resulting type isqbpp::Vector<qbpp::Vector<qbpp::Var>>. -
qbpp::var("name", s1, s2, ...):
Creates a higher-dimensional array ofqbpp::Varobjects with the base name"name".
Each element is represented asname[i][j]....
The resulting type is a nestedqbpp::Vector.
NOTE
If"name"is omitted, numbered names such as"{0}","{1}", … are automatically assigned in creation order.
qbpp::Var member functions
For a qbpp::Var instance x, the following member functions are available:
-
std::string x.str():
Returns the name ofx. -
vindex_t x.index():
Returns the unique integer ID ofx.
Usually, there is no need to call these member functions explicitly in QUBO++ programs.
Integer variable class
qbpp::VarInt:
A class derived fromqbpp::Exprthat represents an integer variable with a specified range.
Integer variable creation functions
The following functions are provided to create integer variables:
-
qbpp::var_int("name"):
Returns an internally used helper object and does not create aqbpp::VarIntby itself.
To define aqbpp::VarInt, the range must be specified using the<=operator, as shown below. -
l <= qbpp::var_int("name") <= u:
Here,landumust be integers.
This expression creates aqbpp::VarIntobject with the name"name",
which internally contains aqbpp::Exprobject representing all integers in the range[l, u].
Internally, this also createsqbpp::Varobjects used in the underlying expression. -
l <= qbpp::var_int("name", s1) <= u:
Creates a one-dimensional array (vector) ofqbpp::VarIntobjects with the base name"name"
and the same range[l, u].
Each element is represented asname[i].
The resulting type isqbpp::Vector<qbpp::VarInt>.
Higher-dimensional arrays ofqbpp::VarIntobjects can be created in the same way asqbpp::Varobjects.
Integer variable member functions
For a qbpp::VarInt instance x, the following member functions are available:
-
std::string x.name():
Returns the name ofx. -
std::string x.str():
Returns the string representation of the underlying expression. -
energy_t x.min_val():
Returns the minimum valuelofx. -
energy_t x.max_val():
Returns the maximum valueuofx. -
const qbpp::Vector<qbpp::Var>& x.vars():
Returns the const reference of theqbpp::Varobject vector used to represent the integer variable. -
const qbpp::Vector<energy_t>& x.coeffs():
Returns the const reference of the integer coefficient vector.
The following expression is equivalent to the expression stored in x:
x.min_val() + qbpp::sum(x.coeffs() * x.vars())