The HiGHS library is defined in the src/Highs.h header file. It contains the definition of the methods and members of the class.

Define model

Models in HiGHS are defined as an instance of the HighsModel class. This consists of one instance of the HighsLp class, and one instance of the HighsHessian class. Communication of models to and from HiGHS is possible via instances of the HighsLp or HighsModel class. In the C and other interfaces, communication of models is via scalar values and addresses of arrays.

In C++, the neatest way of passing a model to HiGHS is to create an instance of the HighsModel class, populate its data, and call

Highs::passModel(const HighsModel& model)

or create and populate an instance of the HighsLp class, and call

Highs::passModel(const HighsLp& lp)

For reading models from a file, use

Highs::readModel(const std::string& filename)

Below is an example of building a HighsModel

  // Create and populate a HighsModel instance for the LP
  
  // Min    f  =  x_0 +  x_1 + 3
  // s.t.                x_1 <= 7
  //        5 <=  x_0 + 2x_1 <= 15
  //        6 <= 3x_0 + 2x_1
  // 0 <= x_0 <= 4; 1 <= x_1
  
  // Although the first constraint could be expressed as an upper
  // bound on x_1, it serves to illustrate a non-trivial packed
  // column-wise matrix.
  
  HighsModel model;
  model.lp_.num_col_ = 2;
  model.lp_.num_row_ = 3;
  model.lp_.sense_ = ObjSense::kMinimize;
  model.lp_.offset_ = 3;
  model.lp_.col_cost_ = {1.0, 1.0};
  model.lp_.col_lower_ = {0.0, 1.0};
  model.lp_.col_upper_ = {4.0, 1.0e30};
  model.lp_.row_lower_ = {-1.0e30, 5.0, 6.0};
  model.lp_.row_upper_ = {7.0, 15.0, 1.0e30};
  
  // Here the orientation of the matrix is column-wise
  model.lp_.a_matrix_.format_ = MatrixFormat::kColwise;
  // a_start_ has num_col_+1 entries, and the last entry is the number
  // of nonzeros in A, allowing the number of nonzeros in the last
  // column to be defined
  model.lp_.a_matrix_.start_ = {0, 2, 5};
  model.lp_.a_matrix_.index_ = {1, 2, 0, 1, 2};
  model.lp_.a_matrix_.value_ = {1.0, 3.0, 1.0, 2.0, 2.0};

Solve model

  // Create a Highs instance
  Highs highs;
  HighsStatus return_status;
  
  // Pass the model to HiGHS
  return_status = highs.passModel(model);
  assert(return_status==HighsStatus::kOk);
  
  // Get a const reference to the LP data in HiGHS
  const HighsLp& lp = highs.getLp();
  
  // Solve the model
  return_status = highs.run();
  assert(return_status==HighsStatus::kOk);
  
  // Get the model status
  const HighsModelStatus& model_status = highs.getModelStatus();
  assert(model_status==HighsModelStatus::kOptimal);

Solution information:

  const HighsInfo& info = highs.getInfo();
  cout << "Simplex iteration count: " << info.simplex_iteration_count << endl;
  cout << "Objective function value: " << info.objective_function_value << endl;
  cout << "Primal  solution status: " << highs.solutionStatusToString(info.primal_solution_status) << endl;
  cout << "Dual    solution status: " << highs.solutionStatusToString(info.dual_solution_status) << endl;
  cout << "Basis: " << highs.basisValidityToString(info.basis_validity) << endl;

Integrality variables

To indicate that variables must take integer values use the HighsLp::integrality vector.

  model.lp_.integrality_.resize(lp.num_col_);
  for (int col=0; col < lp.num_col_; col++)
    model.lp_.integrality_[col] = HighsVarType::kInteger;

  highs.passModel(model);