matlab_and_gams:interfacing_optimization_and_visualization_software_via_the_gdxmrw_utilities

This shows you the differences between two versions of the page.

Both sides previous revision Previous revision Next revision | Previous revision | ||

matlab_and_gams:interfacing_optimization_and_visualization_software_via_the_gdxmrw_utilities [2021/06/30 21:05] Atharv Bhosekar [Error message: Attempt to execute SCRIPT gams as a function] |
matlab_and_gams:interfacing_optimization_and_visualization_software_via_the_gdxmrw_utilities [2021/06/30 21:06] (current) Atharv Bhosekar [Is there anything to extract the parameter matrix (LP) from GAMS to Matlab?] |
||
---|---|---|---|

Line 65: | Line 65: | ||

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. | 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: | ||

- | <code> | ||

- | >> wgdx('?') | ||

- | GDXMRW::wgdx : rev32781 2012-04-26 18:00:27Z sdirkse | ||

- | </code> | ||

- | 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 [[matlab_and_gams:interfacing_optimization_and_visualization_software_via_the_gdxmrw_utilities#how_can_i_construct_an_interface_between_gams_and_matlab|above]]. For example: | ||

- | <code> | ||

- | 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 | ||

- | </code> | ||

- | * 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. | ||

- | <code> | ||

- | >> 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 | ||

- | >> | ||

- | </code> | ||

- | |||

- | 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 | ||

- | <code>jacobian jac.gdx </code> | ||

- | |||

- | 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 | ||

- | <code>matlab xxx</code> | ||

- | |||

- | and run | ||

- | <code> | ||

- | gamslib trnsport | ||

- | gams trnsport lp mpecdump optfile 1 | ||

- | </code> | ||

- | |||

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

IMPRESSUM / LEGAL NOTICE
PRIVACY 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