7.4 Input/Output¶
The logging and I/O features are provided mainly by the MOSEK task and to some extent by the MOSEK environment objects.
7.4.1 Stream logging¶
By default the solver runs silently and does not produce any output to the console or otherwise. However, the log output can be redirected to a user-defined output stream or stream callback function. The log output is analogous to the one produced by the command-line version of MOSEK.
The log messages are partitioned in three streams:
messages,
MSK_STREAM_MSG
warnings,
MSK_STREAM_WRN
errors,
MSK_STREAM_ERR
These streams are aggregated in the MSK_STREAM_LOG
stream. A stream handler can be defined for each stream separately.
A stream handler is simply a user-defined function of type MSKstreamfunc
that accepts a string, for example:
static void MSKAPI printstr(void *handle,
const char *str)
{
printf("%s", str);
fflush(stdout);
}
It is attached to a stream as follows:
MSK_linkfunctotaskstream(task, MSK_STREAM_LOG, NULL, printstr);
The stream can be detached by calling
MSK_linkfunctotaskstream(task, MSK_STREAM_LOG, NULL, NULL);
A log stream can also be redirected to a file:
MSK_linkfiletotaskstream(task, MSK_STREAM_LOG, "mosek.log", 0);
After optimization is completed an additional short summary of the solution and optimization process can be printed to any stream using the method MSK_solutionsummary
.
7.4.2 Log verbosity¶
The logging verbosity can be controlled by setting the relevant parameters, as for instance
MSK_IPAR_LOG_SIM
, and
Each parameter controls the output level of a specific functionality or algorithm. The main switch is MSK_IPAR_LOG
which affect the whole output. The actual log level for a specific functionality is determined as the minimum between MSK_IPAR_LOG
and the relevant parameter. For instance, the log level for the output produce by the interior-point algorithm is tuned by the MSK_IPAR_LOG_INTPNT
; the actual log level is defined by the minimum between MSK_IPAR_LOG
and MSK_IPAR_LOG_INTPNT
.
Tuning the solver verbosity may require adjusting several parameters. It must be noticed that verbose logging is supposed to be of interest during debugging and tuning. When output is no more of interest, the user can easily disable it globally with MSK_IPAR_LOG
. Larger values of MSK_IPAR_LOG
do not necessarily result in increased output.
By default MOSEK will reduce the amount of log information after the first optimization on a given problem. To get full log output on subsequent re-optimizations set MSK_IPAR_LOG_CUT_SECOND_OPT
to zero.
7.4.3 Saving a problem to a file¶
An optimization problem can be dumped to a file using the method MSK_writedata
. The file format will be determined from the extension of the filename. Supported formats are listed in Sec. 16 (Supported File Formats) together with a table of problem types supported by each.
For instance the problem can be written to a human-readable PTF file (see Sec. 16.5 (The PTF Format)) with
MSK_writedata(task,"data.ptf");
All formats can be compressed with gzip
by appending the .gz
extension, and with ZStandard
by appending the .zst
extension, for example
MSK_writedata(task,"data.task.gz");
Some remarks:
Unnamed variables are given generic names. It is therefore recommended to use meaningful variable names if the problem file is meant to be human-readable.
The
task
format is MOSEK’s native file format which contains all the problem data as well as solver settings.
7.4.4 Reading a problem from a file¶
A problem saved in any of the supported file formats can be read directly into a task using MSK_readdata
. The task must be created in advance. Afterwards the problem can be optimized, modified, etc. If the file contained solutions, then are also imported, but the status of any solution will be set to MSK_SOL_STA_UNKNOWN
(solutions can also be read separately using MSK_readsolution
). If the file contains parameters, they will be set accordingly.
res = MSK_maketask(env, 0,0, &task);
if (res == MSK_RES_OK)
res = MSK_readdata(task, "file.task.gz");
if (res == MSK_RES_OK)
res = MSK_optimize(task);