User Tools

Site Tools


This is an old revision of the document!

Short URL

Matlab and GAMS: Interfacing Optimization and Visualization Software via the GDXMRW Utilities


How can I construct an interface between GAMS and Matlab?

A common question goes along the lines of “How can I construct an interface between GAMS and Matlab?” The answer to that depends on the situation, but one general guideline I offer is to break the process into smaller steps by using rgdx and wgdx to move the data around and only use the gams call to run the model, not to pass data to or from GAMS. This offers a number of advantages:

  • Creating, debugging, and maintaining the interface will be easier if things are broken into smaller steps. For example, you can check that the data you export from Matlab to GDX was transferred correctly by using the utilities for viewing GDX data, such as the GAMS IDE. Once the input data is computed, you can run the GAMS model outside of Matlab, since the GDX files it reads are independent of Matlab and the model contains no Matlab-specific syntax.
  • Data transfer is more flexible when using rgdx/wgdx than when using gams. Consider the case where the model needs to read sets at compile time but data at execution time. This will be difficult or impossible to do using gams, but simple to do using wgdx.
  • Efficiency can be a consideration. If a sequence of similar runs needs to be executed with a large amount of common data but with some varying parameters, the common data can be written once before the sequence of runs starts, while a second GDX file can be used to transfer the run-specific data.
  • If you need help, you'll get better help for an application that uses rgdx and wgdx to transfer data. Problems will be easier to reproduce and to locate, and the model will contain no Matlab-specific syntax.

An example application in two variations is available in the datalib as gdxmrw_tr1 and gdxmrw_tr2. The .gms files contain comments as well as GAMS source. The .m files should be run from Matlab.

Error "Matlab cannot save changes to the path" when setting the Matlab Path on Windows

This problem and its solution are discussed in a recent Matlab help forum article. I have this problem on my Windows 7 desktop machine, and I could solve it by saving the pathdef.m file to the Matlab start directory C:\Users\sdirkse\Documents\MATLAB. There are a couple of problems with this fix though: it is specific to how Matlab is started (desktop shortcuts can specify different start directories) and it doesn't maintain a separate pathdef.m file for different Matlab versions. In spite of these problems, you should ensure that your Matlab system starts with the GAMS system directory in the Matlab Path. The GDXMRW utilities will not function if the GAMS system directory is not in the Matlab Path, and setting this manually at the start of each session is annoying and easy to forget.

How can I adjust the startup Matlab Path on Linux or Mac?

I run Matlab on a machine where I have no root privileges so updating the system-wide pathdef.m is not possible. However, Matlab checks the MATLABPATH environment variable on startup and prepends that to its search path, so setting this in your .bashrc or similar startup file should have the desired affect. For example, I have something like this:

oxon$grep MAT .bashrc
export MATLABPATH=/usr/local/gams/23.7.2:/home/steve/comp-pak/src/interfaces/Matlab
oxon$echo $MATLABPATH

Error message: Undefined function or method 'gams' for input arguments of type 'char'

The full text of the error message is:

last error message: Undefined function or method 'gams' for input arguments of type 'char'.
last error identifier: MATLAB:UndefinedFunction
See testinst log file testinstlog.txt for details
??? Error using ==> testinst at 127
Error in testinst: terminating prematurely

and the file testinstlog.txt reads something like:

Date = 15-Jul-2011
Matlab version = (R2011a)
Error in testinst: terminating prematurely
   last error message: Undefined function or method 'gams' for input arguments of type 'char'.
last error identifier: MATLAB:UndefinedFunction

The error message indicates that you did not set the path to GAMS in Matlab or that you run an old GAMS version which does not include gams.m and the mex library files.

Error message: Invalid MEX-file 'wgdx.mexw64': The specified module could not be found.

Matlab fails to load binary MEX-files if it cannot find all .dll files referenced by the MEX-file. Thus the message above is somewhat misleading: it gives the impression that the specified Mex-file is invalid or not found, instead of pointing out the missing dependencies. More information on this error, including suggested fixes, can be found on the Matlab Web site here.

We have found that users getting this error message are sometimes missing the Microsoft Visual C++ Redistributable runtime libraries. These can be installed via Windows Update. Note that many versions of these libraries are available. The version of the Microsoft Visual C++ Redistributable that is required depends on what version of MSVC++ was used to build the MEX-file. Most likely, the 2012 or 2013 version is the one needed, and it is safe to install both of them.

If you must, you can peek into the MEX-files for the string MSVCR to learn more. A dependency on MSVCR110.dll is satisfied by the Microsoft Visual C++ 2012 Redistributable. A dependency on MSVCR120.dll is satisfied by the Microsoft Visual C++ 2013 Redistributable. At this time (Jan 2017) we don't use newer compilers, and nothing older can be actively supported.

Error running gams() function in a Matlab loop

Some users have reported errors when calling gams() from within a Matlab loop. The symptoms vary - some users report incorrect values being returned to Matlab, while others report that gams.exe has crashed.

There are three workarounds or solutions to the problem.

  • This problem has been fixed. If you have a GAMS Distribution 23.9.3 (Sep 2012) or later it should have the updated mex-files. If you don't have a version as recent as this, the solution is to update your GAMS system to use distribution 23.9.3 or later. To check the version info of your mex-files:
>> wgdx('?')
GDXMRW::wgdx : rev32781 2012-04-26 18:00:27Z sdirkse

This is the earliest revision with the fix. If you have a lower revision number than 32781 or a last-source-change date earlier than 26 April 2012, you should update to a newer GAMS distribution. Don't try to just slide some newer mex-files into an older GAMS distribution: components are designed and tested to work with the distribution they belong to.

  • Another approach is to use rgdx() and wgdx() to transfer data between Matlab and GAMS and to use Matlab's system() call to execute the GAMS job. This solution has some other benefits as well, as described above. For example:
for i=1:365
%  sometimes the mex-function gams fails when run in a loop
%  gams(model);
% but running gams in a subshell via the system() function is OK
  system (['gams model lo=2 --TRIP=', int2str(i)]);
  • The most painful and least recommended approach, but one that allows you to keep using the gams() mex-function, is to copy the mex-function and use the copy in your Matlab code. When making the copy, do not copy or modify the gams.m script - this only contains documentation for the mex-function. The mex-function extension varies by platform - use the Matlab routine mexext to get the extension.
>> mexext


>> which gams
>> cd \gams_64\23.7.2\
>> system ('copy gams.mexw64 rgams.mexw64')
        1 file(s) copied. 

ans =


>> which rgams

Once you have made the copy, you can use the new name as necessary to avoid problems with running gams() in a loop. If you are surprised that such a trivial change is enough to work around the problem, you are not alone.

Is there anything to extract the parameter matrix (LP) from GAMS to Matlab?

There are two ways to do that. One way is to use the GAMS/Convert tool to write out the LP data in GDX form: The option file convert.opt looks like

jacobian jac.gdx 

and then you can use the GDXMRW utilities to read the GDX data in Matlab. This will be quite efficient for large data and you should get the data with full double precision.

Another option is to use the MPECDUMP solver and the matlab option. This dumps the data to text files that can be written in Matlab, and also writes a .m file to do it for you. Try this by creating the option file mpecdump.opt with

matlab xxx

and run

gamslib trnsport
gams trnsport lp mpecdump optfile 1

and you'll get xxx.m that reads lots of data into Matlab.

IMPRESSUM / LEGAL NOTICEPRIVACY POLICY matlab_and_gams/interfacing_optimization_and_visualization_software_via_the_gdxmrw_utilities.1625079916.txt.gz · Last modified: 2021/06/30 21:05 by Atharv Bhosekar