7.4 Setting solver parameters

MOSEK comes with a large number of parameters that allows the user to tune the behavior of the optimizer. The typical settings which can be changed with solver parameters include:

  • choice of the optimizer for linear problems,
  • choice of primal/dual solver,
  • turning presolve on/off,
  • turning heuristics in the mixed-integer optimizer on/off,
  • level of multi-threading,
  • feasibility tolerances,
  • solver termination criteria,
  • behaviour of the license manager,

and more. All parameters have default settings which will be suitable for most typical users.

The API reference contains:

Setting parameters

Each parameter is identified by a unique name. There are three types of parameters depending on the values they take:

  • Integer parameters. They take either either simple integer values or values from an enumeration provided for readability and compatibility of the code. Set with MSK_putintparam.
  • Double (floating point) parameters. Set with MSK_putdouparam.
  • String parameters. Set with MSK_putstrparam.

There are also parameter setting functions which operate fully on symbolic strings containing command-line style names of parameters and their values. See the example below. The optimizer will try to convert the given argument to the exact expected type, and will error if that fails.

If an incorrect value is provided then the parameter is left unchanged.

For example, the following piece of code sets up parameters which choose and tune the interior point optimizer before solving a problem.

Listing 7.2 Parameter setting example. Click here to download.
      // Set log level (integer parameter)
      res = MSK_putintparam(task, MSK_IPAR_LOG, 1);
      // Select interior-point optimizer... (integer parameter)
      res = MSK_putintparam(task, MSK_IPAR_OPTIMIZER, MSK_OPTIMIZER_INTPNT);
      // ... without basis identification (integer parameter)
      res = MSK_putintparam(task, MSK_IPAR_INTPNT_BASIS, MSK_BI_NEVER);
      // Set relative gap tolerance (double parameter)
      res = MSK_putdouparam(task, MSK_DPAR_INTPNT_CO_TOL_REL_GAP, 1.0e-7);

      // The same using explicit string names 
      res = MSK_putparam     (task, "MSK_DPAR_INTPNT_CO_TOL_REL_GAP", "1.0e-7");      
      res = MSK_putnadouparam(task, "MSK_DPAR_INTPNT_CO_TOL_REL_GAP",  1.0e-7 );      

      // Incorrect value
      res = MSK_putdouparam(task, MSK_DPAR_INTPNT_CO_TOL_REL_GAP,  -1.0 );            
      if (res != MSK_RES_OK)
        printf("Wrong parameter value\n");

Reading parameter values

The functions MSK_getintparam, MSK_getdouparam, MSK_getstrparam can be used to inspect the current value of a parameter, for example:

      res = MSK_getdouparam(task, MSK_DPAR_INTPNT_CO_TOL_REL_GAP, &param);
      printf("Current value for parameter MSK_DPAR_INTPNT_CO_TOL_REL_GAP = %e\n", param);