C++ Reference

C++ Reference: Linear solver

linear_expr.h File Reference

Detailed Description

This file allows you to write natural code (like a mathematical equation) to model optimization problems with MPSolver. It is syntatic sugar on top of the MPSolver API, it provides no additional functionality. Use of these APIs makes it much easier to write code that is both simple and big-O optimal for creating your model, at the cost of some additional constant factor overhead. If model creation is a bottleneck in your problem, consider using the MPSolver API directly instead.

This file contains two classes:

  1. LinearExpr: models offset + sum_{i in S} a_i*x_i for decision var x_i,
  2. LinearRange: models lb <= sum_{i in S} a_i*x_i <= ub, and it provides various operator overloads to build up "LinearExpr"s and then convert them to "LinearRange"s.

Recommended use (avoids dangerous code):

MPSolver solver = ...;
const LinearExpr x = solver.MakeVar(...); * Note: implicit conversion
const LinearExpr y = solver.MakeVar(...);
const LinearExpr z = solver.MakeVar(...);
const LinearExpr e1 = x + y;
const LinearExpr e2 = (e1 + 7.0 + z)/3.0;
const LinearRange r = e1 <= e2;
solver.MakeRowConstraint(r);

WARNING, AVOID THIS TRAP:

MPSolver solver = ...;
MPVariable* x = solver.MakeVar(...);
LinearExpr y = x + 5;

In evaluating "x+5" above, x is NOT converted to a LinearExpr before the addition, but rather is treated as a pointer, so x+5 gives a new pointer to garbage memory.

For this reason, when using LinearExpr, it is best practice to:

  1. use double literals instead of ints (e.g. "x + 5.0", not "x + 5"),
  2. Immediately convert all MPVariable* to LinearExpr on creation, and only hold references to the "LinearExpr"s.

Likewise, the following code is NOT recommended:

MPSolver solver = ...;
MPVariable* x = solver.MakeVar(...);
MPVariable* y = solver.MakeVar(...);
LinearExpr e1 = LinearExpr(x) + y + 5;

While it is correct, it violates the natural assumption that the + operator is associative. Thus you are setting a trap for future modifications of the code, as any of the following changes would lead to the above failure mode:

  • LinearExpr e1 = LinearExpr(x) + (y + 5);
  • LinearExpr e1 = y + 5 + LinearExpr(x);

Definition in file linear_expr.h.

Go to the source code of this file.

Classes

class  LinearExpr
 LinearExpr models a quantity that is linear in the decision variables (MPVariable) of an optimization problem, i.e. More...
 
class  LinearRange
 An expression of the form: More...
 

Namespaces

 operations_research
 

Functions

std::ostream & operator<< (std::ostream &stream, const LinearExpr &linear_expr)
 
LinearExpr operator+ (LinearExpr lhs, const LinearExpr &rhs)
 
LinearExpr operator- (LinearExpr lhs, const LinearExpr &rhs)
 
LinearExpr operator* (LinearExpr lhs, double rhs)
 
LinearExpr operator/ (LinearExpr lhs, double rhs)
 
LinearExpr operator* (double lhs, LinearExpr rhs)
 
LinearRange operator<= (const LinearExpr &lhs, const LinearExpr &rhs)
 
LinearRange operator== (const LinearExpr &lhs, const LinearExpr &rhs)
 
LinearRange operator>= (const LinearExpr &lhs, const LinearExpr &rhs)