Note: The gdxmrw utilities have been developed by Steven P. Dirkse (GAMS Development) and Michael C. Ferris (University of Wisconsin Madiscon
All the GAMS/Matlab utilities (rgdx, wgdx, and gams) previously documented and made available here are fully integrated into the GAMS distribution, so no separate downloads are necessary. We recommend that you use the supported version of these utilities integrated into and documented in the GAMS distributions available for download.
The previous versions, along with their documentation, can be found here, but be aware that these older versions are unsupported and differ in syntax and functionality from the supported versions.
We have collected some of the examples and tests for GDXMRW and made them available here. If you cannot run these with the most recent GAMS distribution and its integrated GDXMRW utilities please contact GAMS support.
gdxmrw is available for Windows 32-bit, Windows 64-bit, Linux 64-bit, and Mac OS X 64-bit. Both Linux 32-bit and Mac OS X 32-bit are currently (GAMS distribution 23.7) not supported. Since the MathWorks have announced plans to drop support for 32-bit Linux and Mac it is not likely we will be adding support for these platforms.
Please also note that a 32-bit version of Matlab requires a 32-bit version of GAMS, and the 64-bit version of Matlab will only work with the 64-bit version of GAMS.
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:
An example application in two variations is available here. The .gms files contain comments as well as GAMS source. The .m files should be run from Matlab.
Extended installation debugging and support instructions are available here.
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.
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 /usr/local/gams/23.7.2:/home/steve/comp-pak/src/interfaces/Matlab
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 = 7.12.0.635 (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.
The full text of the error message is:
last error message: Attempt to execute SCRIPT gams as a function: C:\Program Files (x86)\GAMS23.7\gams.m last error identifier: MATLAB:scriptNotAFunction 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 = 7.12.0.635 (R2011a) Error in testinst: terminating prematurely last error message: Attempt to execute SCRIPT gams as a function: C:\Program Files (x86)\GAMS23.7\gams.m last error identifier: MATLAB:scriptNotAFunction
The problem here is that the version of GAMS and the version of Matlab are built for different architectures, so the wrapper-script gams.m was not able to find a gams Mex-file built for the same architecture as the running Matlab. Most likely you are trying to run a 32-bit version of GAMS with a 64-bit version of Matlab (or vice versa). Your GAMS license will work equally well with the 32-bit and 64-bit versions of GAMS so you should install a GAMS system built for the same platform/architecture as the Matlab system you have installed. To check the Matlab architecture, use Matlab's computer function. The mexext function gives a clue about what Mex-files need to be in the GAMS sysdir as well.
>> computer
ans =
PCWIN64
>> computer('arch')
ans =
win64
>> mexext
mexw64
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.
>> 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.
for i=1:365 wgdx(input,...); % 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)]); rgdx(results); end
mexext to get the extension.>> mexext
mexw64
>> which gams
C:\gams_64\23.7.2\gams.mexw64
>> cd \gams_64\23.7.2\
>> system ('copy gams.mexw64 rgams.mexw64')
1 file(s) copied.
ans =
0
>> which rgams
C:\gams_64\23.7.2\rgams.mexw64
>>
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.
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.