diff -r d59bea55db9b -r c445c931472f doc/glpk06.tex --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/doc/glpk06.tex Mon Dec 06 13:09:21 2010 +0100 @@ -0,0 +1,896 @@ +%* glpk06.tex *% + +\chapter{Miscellaneous API Routines} + +\section{GLPK environment routines} + +\subsection{glp\_long---64-bit integer data type} + +Some GLPK API routines use 64-bit integer data type, which is declared +in the header \verb|glpk.h| as follows: + +\begin{verbatim} +typedef struct { int lo, hi; } glp_long; +\end{verbatim} + +\noindent +where \verb|lo| contains low 32 bits, and \verb|hi| contains high 32 +bits of 64-bit integer value.\footnote{GLPK conforms to ILP32, LLP64, +and LP64 programming models, where the built-in type {\tt int} +corresponds to 32-bit integers.} + +\subsection{glp\_init\_env---initialize GLPK environment} + +\subsubsection*{Synopsis} + +\begin{verbatim} +int glp_init_env(void); +\end{verbatim} + +\subsubsection*{Description} + +The routine \verb|glp_init_env| initializes the GLPK environment. +Normally the application program does not need to call this routine, +because it is called automatically on the first call to any API routine. + +\newpage + +\subsubsection*{Returns} + +The routine \verb|glp_init_env| returns one of the following codes: + +\noindent +0 --- initialization successful; + +\noindent +1 --- environment is already initialized; + +\noindent +2 --- initialization failed (insufficient memory); + +\noindent +3 --- initialization failed (unsupported programming model). + +\subsection{glp\_version---determine library version} + +\subsubsection*{Synopsis} + +\begin{verbatim} +const char *glp_version(void); +\end{verbatim} + +\subsubsection*{Returns} + +The routine \verb|glp_version| returns a pointer to a null-terminated +character string, which specifies the version of the GLPK library in +the form \verb|"X.Y"|, where `\verb|X|' is the major version number, and +`\verb|Y|' is the minor version number, for example, \verb|"4.16"|. + +\subsubsection*{Example} + +\begin{footnotesize} +\begin{verbatim} +printf("GLPK version is %s\n", glp_version()); +\end{verbatim} +\end{footnotesize} + +\subsection{glp\_free\_env---free GLPK environment} + +\subsubsection*{Synopsis} + +\begin{verbatim} +int glp_free_env(void); +\end{verbatim} + +\subsubsection*{Description} + +The routine \verb|glp_free_env| frees all resources used by GLPK +routines (memory blocks, etc.) which are currently still in use. + +Normally the application program does not need to call this routine, +because GLPK routines always free all unused resources. However, if +the application program even has deleted all problem objects, there +will be several memory blocks still allocated for the internal library +needs. For some reasons the application program may want GLPK to free +this memory, in which case it should call \verb|glp_free_env|. + +Note that a call to \verb|glp_free_env| invalidates all problem objects +which still exist. + +\subsubsection*{Returns} + +The routine \verb|glp_free_env| returns one of the following codes: + +\noindent +0 --- termination successful; + +\noindent +1 --- environment is inactive (was not initialized). + +\subsection{glp\_printf---write formatted output to terminal} + +\subsubsection*{Synopsis} + +\begin{verbatim} +void glp_printf(const char *fmt, ...); +\end{verbatim} + +\subsubsection*{Description} + +The routine \verb|glp_printf| uses the format control string +\verb|fmt| to format its parameters and writes the formatted output to +the terminal. + +This routine is a replacement of the standard C function +\verb|printf| and used by all GLPK routines to perform terminal +output. The application program may use \verb|glp_printf| for the same +purpose that allows controlling its terminal output with the routines +\verb|glp_term_out| and \verb|glp_term_hook|. + +\subsection{glp\_vprintf---write formatted output to terminal} + +\subsubsection*{Synopsis} + +\begin{verbatim} +void glp_vprintf(const char *fmt, va_list arg); +\end{verbatim} + +\subsubsection*{Description} + +The routine \verb|glp_vprintf| uses the format control string +\verb|fmt| to format its parameters specified by the list \verb|arg| +and writes the formatted output to the terminal. + +This routine is a replacement of the standard C function +\verb|vprintf| and used by all GLPK routines to perform terminal +output. The application program may use \verb|glp_vprintf| for the same +purpose that allows controlling its terminal output with the routines +\verb|glp_term_out| and \verb|glp_term_hook|. + +\newpage + +\subsection{glp\_term\_out---enable/disable terminal output} + +\subsubsection*{Synopsis} + +\begin{verbatim} +int glp_term_out(int flag); +\end{verbatim} + +\subsubsection*{Description} + +Depending on the parameter flag the routine \verb|glp_term_out| enables +or disables terminal output performed by glpk routines: + +\verb|GLP_ON | --- enable terminal output; + +\verb|GLP_OFF| --- disable terminal output. + +\subsubsection*{Returns} + +The routine \verb|glp_term_out| returns the previous value of the +terminal output flag (\verb|GLP_ON| or \verb|GLP_OFF|). + +\subsection{glp\_term\_hook---intercept terminal output} + +\subsubsection*{Synopsis} + +\begin{verbatim} +void glp_term_hook(int (*func)(void *info, const char *s), + void *info); +\end{verbatim} + +\subsubsection*{Description} + +The routine \verb|glp_term_hook| installs the user-defined hook routine +to intercept all terminal output performed by GLPK routines. + +%This feature can be used to redirect the terminal output to other +%destination, for example, to a file or a text window. + +The parameter {\it func} specifies the user-defined hook routine. It is +called from an internal printing routine, which passes to it two +parameters: {\it info} and {\it s}. The parameter {\it info} is a +transit pointer specified in corresponding call to the routine +\verb|glp_term_hook|; it may be used to pass some additional information +to the hook routine. The parameter {\it s} is a pointer to the null +terminated character string, which is intended to be written to the +terminal. If the hook routine returns zero, the printing routine writes +the string {\it s} to the terminal in a usual way; otherwise, if the +hook routine returns non-zero, no terminal output is performed. + +To uninstall the hook routine both parameters {\it func} and {\it info} +should be specified as \verb|NULL|. + +\newpage + +\subsubsection*{Example} + +\begin{footnotesize} +\begin{verbatim} +static int hook(void *info, const char *s) +{ FILE *foo = info; + fputs(s, foo); + return 1; +} + +int main(void) +{ FILE *foo; + . . . + /* redirect terminal output */ + glp_term_hook(hook, foo); + . . . + /* resume terminal output */ + glp_term_hook(NULL, NULL); + . . . +} +\end{verbatim} +\end{footnotesize} + +\subsection{glp\_open\_tee---start copying terminal output} + +\subsubsection*{Synopsis} + +\begin{verbatim} +int glp_open_tee(const char *fname); +\end{verbatim} + +\subsubsection*{Description} + +The routine \verb|glp_open_tee| starts copying all the terminal output +to an output text file, whose name is specified by the character string +\verb|fname|. + +\subsubsection*{Returns} + +The routine \verb|glp_open_tee| returns one of the following codes: + +\noindent +0 --- operation successful; + +\noindent +1 --- copying terminal output is already active; + +\noindent +2 --- unable to create output file. + +\newpage + +\subsection{glp\_close\_tee---stop copying terminal output} + +\subsubsection*{Synopsis} + +\begin{verbatim} +int glp_close_tee(void); +\end{verbatim} + +\subsubsection*{Description} + +The routine \verb|glp_close_tee| stops copying the terminal output to +the output text file previously open by the routine \verb|glp_open_tee| +closing that file. + +\subsubsection*{Returns} + +The routine \verb|glp_close_tee| returns one of the following codes: + +\noindent +0 --- operation successful; + +\noindent +1 --- copying terminal output was not started. + +\subsection{glp\_error---display error message and terminate execution} + +\subsubsection*{Synopsis} + +\begin{verbatim} +void glp_error(const char *fmt, ...); +\end{verbatim} + +\subsubsection*{Description} + +The routine \verb|glp_error| (implemented as a macro) formats its +parameters using the format control string \verb|fmt|, writes the +formatted message to the terminal, and then abnormally terminates the +program. + +\subsection{glp\_assert---check logical condition} + +\subsubsection*{Synopsis} + +\begin{verbatim} +void glp_assert(int expr); +\end{verbatim} + +\subsubsection*{Description} + +The routine \verb|glp_assert| (implemented as a macro) checks +a logical condition specified by the expression \verb|expr|. If the +condition is true (non-zero), the routine does nothing; otherwise, if +the condition is false (zero), the routine prints an error message and +abnormally terminates the program. + +This routine is a replacement of the standard C function \verb|assert| +and used by all GLPK routines to check program logic. The application +program may use \verb|glp_assert| for the same purpose. + +\subsection{glp\_error\_hook---install hook to intercept abnormal +termination} + +\subsubsection*{Synopsis} + +\begin{verbatim} +void glp_error_hook(void (*func)(void *info), void *info); +\end{verbatim} + +\subsubsection*{Description} + +The routine \verb|glp_error_hook| installs a user-defined hook routine +to intercept abnormal termination. + +The parameter \verb|func| specifies the user-defined hook routine. It +is called from the routine \verb|glp_error| before the latter calls the +abort function to abnormally terminate the application program because +of fatal error. The parameter \verb|info| is a transit pointer, +specified in the corresponding call to the routine +\verb|glp_error_hook|; it may be used to pass some information to the +hook routine. + +To uninstall the hook routine the parameters \verb|func| and \verb|info| +should be specified as \verb|NULL|. + +\subsubsection*{Usage note} + +If the hook routine returns, the application program is abnormally +terminated. To prevent abnormal termnation the hook routine may perform +a global jump using the standard function \verb|longjmp|, in which case +the application program {\it must} call the routine \verb|glp_free_env|. + +\subsection{glp\_malloc---allocate memory block} + +\subsubsection*{Synopsis} + +\begin{verbatim} +void *glp_malloc(int size); +\end{verbatim} + +\subsubsection*{Description} + +The routine \verb|glp_malloc| dynamically allocates a memory block of +\verb|size| bytes long. Should note that: + +1) the parameter \verb|size| must be positive; + +2) being allocated the memory block contains arbitrary data, that is, +it is {\it not} initialized by binary zeros; + +3) if the block cannot be allocated due to insufficient memory, the +routine prints an error message and abnormally terminates the program. + +This routine is a replacement of the standard C function \verb|malloc| +and used by all GLPK routines for dynamic memory allocation. The +application program may use \verb|glp_malloc| for the same purpose. + +\subsubsection*{Returns} + +The routine \verb|glp_malloc| returns a pointer to the memory block +allocated. To free this block the routine \verb|glp_free| (not the +standard C function \verb|free|!) must be used. + +\subsection{glp\_calloc---allocate memory block} + +\subsubsection*{Synopsis} + +\begin{verbatim} +void *glp_calloc(int n, int size); +\end{verbatim} + +\subsubsection*{Description} + +The routine \verb|glp_calloc| dynamically allocates a memory block of +\verb|n|$\times$\verb|size| bytes long. Should note that: + +1) both parameters \verb|n| and \verb|size| must be positive; + +2) being allocated the memory block contains arbitrary data, that is, +it is {\it not} initialized by binary zeros; + +3) if the block cannot be allocated due to insufficient memory, the +routine prints an error message and abnormally terminates the program. + +This routine is a replacement of the standard C function \verb|calloc| +(with exception that the block is not cleaned) and used by all GLPK +routines for dynamic memory allocation. The application program may use +\verb|glp_calloc| for the same purpose. + +\subsubsection*{Returns} + +The routine \verb|glp_calloc| returns a pointer to the memory block +allocated. To free this block the routine \verb|glp_free| (not the +standard C function \verb|free|!) must be used. + +\subsection{glp\_free---free memory block} + +\subsubsection*{Synopsis} + +\begin{verbatim} +void glp_free(void *ptr); +\end{verbatim} + +\subsubsection*{Description} + +The routine \verb|glp_free| frees (deallocates) a memory block pointed +to by \verb|ptr|, which was previously allocated by the routine +\verb|glp_malloc| or \verb|glp_calloc|. Note that the pointer \verb|ptr| +must valid and must not be \verb|NULL|. + +This routine is a replacement of the standard C function \verb|free| +and used by all GLPK routines for dynamic memory allocation. The +application program may use \verb|glp_free| for the same purpose. + +\subsection{glp\_mem\_usage---get memory usage information} + +\subsubsection*{Synopsis} + +\begin{verbatim} +void glp_mem_usage(int *count, int *cpeak, glp_long *total, + glp_long *tpeak); +\end{verbatim} + +\subsubsection*{Description} + +The routine \verb|glp_mem_usage| reports some information about +utilization of the memory by the routines \verb|glp_malloc|, +\verb|glp_calloc|, and \verb|glp_free|. Information is stored to +locations specified by corresponding parameters (see below). Any +parameter can be specified as \verb|NULL|, in which case corresponding +information is not stored. + +\verb|*count| is the number of currently allocated memory blocks. + +\verb|*cpeak| is the peak value of \verb|*count| reached since the +initialization of the GLPK library environment. + +\verb|*total| is the total amount, in bytes, of currently allocated +memory blocks. + +\verb|*tpeak| is the peak value of \verb|*total| reached since the +initialization of the GLPK library envirionment. + +\subsubsection*{Example} + +\begin{footnotesize} +\begin{verbatim} +glp_mem_usage(&count, NULL, NULL, NULL); +printf("%d memory block(s) are still allocated\n", count); +\end{verbatim} +\end{footnotesize} + +\subsection{glp\_mem\_limit---set memory usage limit} + +\subsubsection*{Synopsis} + +\begin{verbatim} +void glp_mem_limit(int limit); +\end{verbatim} + +\subsubsection*{Description} + +The routine \verb|glp_mem_limit| limits the amount of memory available +for dynamic allocation (with the routines \verb|glp_malloc| and +\verb|glp_calloc|) to \verb|limit| megabytes. + +\subsection{glp\_time---determine current universal time} + +\subsubsection*{Synopsis} + +\begin{verbatim} +glp_long glp_time(void); +\end{verbatim} + +\subsection*{Returns} + +The routine \verb|glp_time| returns the current universal time (UTC), +in milliseconds, elapsed since 00:00:00 GMT January 1, 1970. + +\subsection{glp\_difftime---compute difference between two time values} + +\subsubsection*{Synopsis} + +\begin{verbatim} +double glp_difftime(glp_long t1, glp_long t0); +\end{verbatim} + +\subsection*{Returns} + +The routine \verb|glp_difftime| returns the difference between two time +values \verb|t1| and \verb|t0|, expressed in seconds. + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +\newpage + +\section{Plain data file reading routines} + +\subsection{Introduction} + +On developing simple applications to solve optimization problems it is +often needed to read data from plain text files. To do this the standard +C function \verb|fscanf| may be used, however, it is not convenient; for +example, if it scans an integer number according to the format +specification `\verb|%d|', and that number is coded incorrectly, +no diagnostics is provided. + +This section describes a set of GLPK API routines, which may be used in +application programs to simplify reading data from plain text files. + +\subsubsection*{Example 1} + +The following main program reads ten integer numbers from plain text +file \verb|data.txt| and prints their sum. + +\begin{footnotesize} +\begin{verbatim} +/* sdfsamp1.c */ + +#include +#include +#include + +int main(void) +{ glp_data *data; + int j, num, sum; + /* open plain data file */ + data = glp_sdf_open_file("data.txt"); + if (data == NULL) exit(EXIT_FAILURE); + sum = 0; + for (j = 1; j <= 10; j++) + { /* read next integer number */ + num = glp_sdf_read_int(data); + sum += num; + } + printf("sum = %d\n", sum); + /* close plain data file */ + glp_sdf_close_file(data); + return 0; +} + +/* eof */ +\end{verbatim} +\end{footnotesize} + +The input data are coded in free format. For example, the file +\verb|data.txt| may look like this: + +\begin{footnotesize} +\begin{verbatim} +123 65 432 890 -12 743 895 -7 111 326 +\end{verbatim} +\end{footnotesize} + +\noindent +or like this: + +\begin{footnotesize} +\begin{verbatim} +123 65 432 890 -12 +743 895 -7 111 326 +\end{verbatim} +\end{footnotesize} + +\noindent +If the input data file contains incorrect data, the routine +\verb|glp_sdf_read_int| prints an error message and, if no error +handling is provided by the application program, abnormally terminates +program execution. For example, the file \verb|data.txt| could contain +the following data: + +\begin{footnotesize} +\begin{verbatim} +123 65 432 890 -12 +743 895 =7 111 326 +\end{verbatim} +\end{footnotesize} + +\noindent +in which case the error message would be the following: + +\begin{footnotesize} +\begin{verbatim} +data.txt:2: cannot convert `=7' to integer +\end{verbatim} +\end{footnotesize} + +\subsubsection*{Example 2} + +As it was said above, by default any attempt to read incorrect data +leads to abnormal termination. However, sometimes it is desirable to +catch such errors. This feature is illustrated by the following main +program, which does the same job as in the previous example. + +\begin{footnotesize} +\begin{verbatim} +/* sdfsamp2.c */ + +#include +#include +#include +#include + +int main(void) +{ glp_data *data; + jmp_buf jump; + int j, num, sum, ret; + /* open plain data file */ + data = glp_sdf_open_file("data.txt"); + if (data == NULL) + { ret = EXIT_FAILURE; + goto done; + } + /* set up error handling */ + if (setjmp(jump)) + { ret = EXIT_FAILURE; + goto done; + } + glp_sdf_set_jump(data, jump); + /* read and process data */ + sum = 0; + for (j = 1; j <= 10; j++) + { /* read next integer number */ + num = glp_sdf_read_int(data); + if (abs(num) > 1000) + glp_sdf_error(data, "integer %d too big\n", num); + if (num < 0) + glp_sdf_warning(data, "integer %d is negative\n", num); + sum += num; + } + printf("sum = %d\n", sum); + ret = EXIT_SUCCESS; +done: /* close plain data file */ + if (data != NULL) glp_sdf_close_file(data); + return ret; +} + +/* eof */ +\end{verbatim} +\end{footnotesize} + +\subsection{glp\_sdf\_open\_file---open plain data file} + +\subsubsection*{Synopsis} + +\begin{verbatim} +glp_data *glp_sdf_open_file(const char *fname); +\end{verbatim} + +\subsubsection*{Description} + +The routine \verb|glp_sdf_open_file| opens a plain data file, whose +name is specified by the character string \verb|fname|. + +\subsubsection*{Returns} + +If the operation was successful, the routine \verb|glp_sdf_open_file| +returns a pointer to the opaque program object of the type +\verb|glp_data|\footnote{This data structure is declared in the header +file {\tt glpk.h}.} associated with the plain data file. Otherwise, if +the operation failed, the routine prints an error message and returns +\verb|NULL|. + +\subsubsection*{Note} + +The application program should use the pointer returned by the routine +\verb|glp_sdf_open_file| to perform all subsequent operations on the +data file. + +\newpage + +\subsection{glp\_sdf\_set\_jump---set up error handling} + +\subsubsection*{Synopsis} + +\begin{verbatim} +void glp_sdf_set_jump(glp_data *data, jmp_buf jump); +\end{verbatim} + +\subsubsection*{Description} + +The routine \verb|glp_sdf_set_jump| sets up error handling for the +plain data file specified by the parameter \verb|data|. + +The parameter \verb|jump| specifies the environment buffer, which must +be initialized with the standard C function \verb|setjmp| prior to call +to the routine \verb|glp_sdf_set_jump|. Detecting any incorrect data in +the corresponding plain data file will cause non-local ``go to'' by +a call to the standard C function \verb|longjmp|. + +The parameter \verb|jump| can be specified as \verb|NULL|, in which +case the routine \verb|glp_sdf_set_jump| restores the default behavior, +in which case detecting incorrect data leads to abnormal termination. + +\subsection{glp\_sdf\_error---print error message} + +\subsubsection*{Synopsis} + +\begin{verbatim} +void glp_sdf_error(glp_data *data, const char *fmt, ...); +\end{verbatim} + +\subsubsection*{Description} + +The routine \verb|glp_sdf_error| prints an error message related to the +plain data file specified by the parameter \verb|data|. If error handing +was not previously provided, the routine then abnormally terminates +execution of the application program. Otherwise, it signals about the +error by a call to the standard C function \verb|longjmp|. + +The character string \verb|fmt| and optional parameters following it +have the same meaning as for the standard C function \verb|printf|. + +The message produced by the routine \verb|glp_sdf_error| looks like +follows: + +\medskip + +{\it file}{\tt :}{\it line}{\tt :} {\it message text} + +\medskip + +\noindent +where {\it file} is the filename passed to the routine +\verb|glp_sdf_open| and {\it line} is the current line number. + +\newpage + +\subsection{glp\_sdf\_warning---print warning message} + +\subsubsection*{Synopsis} + +\begin{verbatim} +void glp_sdf_warning(glp_data *data, const char *fmt, ...); +\end{verbatim} + +\subsubsection*{Description} + +The routine \verb|glp_sdf_warning| prints a warning message related to +the plain data file specified by the parameter \verb|data|. + +The character string \verb|fmt| and optional parameters following it +have the same meaning as for the standard C function \verb|printf|. + +The message produced by the routine \verb|glp_sdf_warning| looks like +follows: + +\medskip + +{\it file}{\tt :}{\it line}\verb|: warning:| {\it message text} + +\medskip + +\noindent +where {\it file} is the filename passed to the routine +\verb|glp_sdf_open| and {\it line} is the current line number. + +\subsection{glp\_sdf\_read\_int---read integer number} + +\subsubsection*{Synopsis} + +\begin{verbatim} +int glp_sdf_read_int(glp_data *data); +\end{verbatim} + +\subsubsection*{Description} + +The routine \verb|glp_sdf_read_int| skips optional white-space +characters and then reads an integer number from the plain data file +specified by the parameter \verb|data|. If the operation failed, the +routine \verb|glp_sdf_read_int| calls the routine \verb|glp_sdf_error| +(see above). + +\subsubsection*{Returns} + +The routine \verb|glp_sdf_read_int| returns the integer number read. + +\newpage + +\subsection{glp\_sdf\_read\_num---read floating-point number} + +\subsubsection*{Synopsis} + +\begin{verbatim} +double glp_sdf_read_num(glp_data *data); +\end{verbatim} + +\subsubsection*{Description} + +The routine \verb|glp_sdf_read_num| skips optional white-space +characters and then reads a floating-point number from the plain data +file specified by the parameter \verb|data|. If the operation failed, +the routine \verb|glp_sdf_num| calls the routine \verb|glp_sdf_error| +(see above). + +\subsubsection*{Returns} + +The routine \verb|glp_sdf_read_num| returns the floating-point number +read. + +\subsection{glp\_sdf\_read\_item---read data item} + +\subsubsection*{Synopsis} + +\begin{verbatim} +const char *glp_sdf_read_item(glp_data *data); +\end{verbatim} + +\subsubsection*{Description} + +The routine \verb|glp_sdf_read_item| skips optional white-space +characters and then reads a data item from the plain data file specified +by the parameter \verb|data|. If the operation failed, the routine +\verb|glp_sdf_read_item| calls the routine \verb|glp_sdf_error| (see +above). + +{\it Data item} is a sequence of 1 to 255 arbitrary graphic characters +delimited by white-space characters. Data items may be used to represent +symbolic names, identifiers, etc. + +\subsubsection*{Returns} + +The routine \verb|glp_sdf_read_item| returns a pointer to the internal +buffer, which contains the data item read in the form of a +null-terminated character string. + +\newpage + +\subsection{glp\_sdf\_read\_text---read text until end of line} + +\subsubsection*{Synopsis} + +\begin{verbatim} +const char *glp_sdf_read_text(glp_data *data); +\end{verbatim} + +\subsubsection*{Description} + +The routine \verb|glp_sdf_read_text| reads a text from the plain data +file specified by the parameter \verb|data|. + +Reading starts from the current position and extends until end of the +current line. Initial and trailing white-space characters as well as +the newline character are not included in the text. + +\subsubsection*{Returns} + +The routine \verb|glp_sdf_read_text| returns a pointer to the internal +buffer, which contains the text read in the form of a null-terminated +character string. + +\subsection{glp\_sdf\_line---determine current line number} + +\subsubsection*{Synopsis} + +\begin{verbatim} +int glp_sdf_line(glp_data *data); +\end{verbatim} + +\subsubsection*{Returns} + +The routine \verb|glp_sdf_line| returns the current line number for the +plain data file specified by the parameter \verb|data|. + +\subsection{glp\_sdf\_close\_file---close plain data file} + +\subsubsection*{Synopsis} + +\begin{verbatim} +void glp_sdf_close_file(glp_data *data); +\end{verbatim} + +\subsubsection*{Description} + +The routine \verb|glp_sdf_close_file| closes the plain data file +specified by the parameter \verb|data| and frees all the resources +allocated to this program object. + +%* eof *%