Release Notes

# 32.1.0

• Dropped support for Python 2.
• Automatically finding a GAMS installation from the Windows registry has been changed from using [HKEY_CURRENT_USER|HKEY_CLASSES_ROOT]\gams.location to [HKEY_CURRENT_USER|HKEY_LOCAL_MACHINE]\Software\Classes\gams.location

# 31.1.0

• The object-oriented GAMS Python API comes now in source code using the MIT open source license.
• For accessing the GAMS API the Python interpreter needs to find files in <GAMS Systemdirectory>/apifiles/Python/api_XY and <GAMS Systemdirectory>/apifiles/Python/gams where XY corresponds to the Python version X.Y, e.g. 3.7. The GMSPython installation is already set up to find all required files. The documentation section Let Python find the GAMS Python files gives details on how to connect an external Python system with GAMS.
• There is a different directory structure in <GAMS Systemdirectory>/apifiles/Python. The content of the api directory has been moved to different places:
• api_27 for the binary Python 2.7 API files
• src for the files required to build the expert-level API files from source
• gams for source files of the GAMS Python API plus a few extra Python source files for working with indexed EMP syntax, e.g. emppython1.gms : Three Simple EMP Models with Indexed EMP Syntax and Python Parser
• thirdparty for the Python package ply for processing of indexed EMP syntax
• Option pySetup has been removed from the class GamsOptions.
• Removed GAMS return code 116 ("Could not find GMSPython").
• Fixed a memory leak with GamsModelInstance.solve.

# 30.1.0

• Dropped support for Python 3.4.
• Added support for Python 3.8.

# 29.1.0

• Added support for Python 3.7.

# 28.1.0

• Dropped support for Python 2.6.

# 25.0.1

• Added implementation of __eq__() and __ne__() to classes _GamsSymbol and _GamsSymbolRecord and its derived classes. As a result the behavior of the operators == and != has changed. == returns now True, if the internal data reference is the same. The behavior of is remains unchanged.
• New example transport_gdx.py that shows how to import and export GDX files.
• Added description of example transport_gdx.py to the tutorial.

# 24.9.2

• Fixed a bug in the setup script that prevented files from being installed in the correct location in certain cases.

# 24.9.1

• New functions GamsWorkspace.add_job_from_apilib, GamsWorkspace.add_job_from_noalib to create GamsJob from models from the GAMS API Library and the Nonlinear Optimization Applications Library
• Added a version check for the setup.py scripts to avoid unintentional installation of wrong versions

# 24.8.4

• Added support for Python 3.6
• Fixed a bug in GamsJob.run() that prevented the underlying GAMS model from terminating, if executables spawned by GAMS generate log output that is not captured.

# 24.8.1

• The option GamsOptions._errorlog was renamed as GamsOptions.errorlog in order to indicate it as public. The option sets the maximum error message lines written to the log for each error

# 24.7.4

• Added support for Python 3.4 on Mac OS X
• Skip creation of a GDX file in GamsModelInstance.instantiate that was unreachable from within the API.
• Fixed a problems with Exceptions in GamsWorkspace.

# 24.7.2

• Fixed a minor bug regarding the names of GamsJob listing files.

# 24.7.1

• Fixed a bug with the property GamsOptions.defines: When too many entries were added, all of them were ignored
• Fixed a memory leak in GamsDatabase

# 24.6.1

• New Python example transport8a.py

# 24.5.2

• Fixed a bug that lead to a crash on Linux when the GAMS system directory is a symbolic link. The property GamsWorkspace.system_directory now always returns the canonical path with all symbolic links resolved.

# 24.5.1

• Added support for Python 3.4 (Windows and Linux only)
• The examples have been changed to be compatible with all supported Python versions
• New Python example special_values.py.
• New functions GamsWorkspace.noalib and GamsWorkspace.apilib that can be used to retrieve models from the NOALIB and the APILIB

# 24.4.2

• Fixed a bug in the constructor of all subclasses of _GamsSymbol that occurred when the explanatory text was omitted.
• Disable unwanted debug output from Couenne when running with GamsModelInstance
• New property _GamsSymbol.domains_as_strings: Domains of Symbol, each element is a string. Note: If the domain is an alias in GAMS, this call will return the name of the alias, not the name of the aliased set
• Fixed potential problem with GamsModelInstance used with BARON.

# 24.4.1

• Fixed a bug in GamsDatabase.merge_record that prevented the function from creating a record if none was found.
• We changed the handling of GAMS Aliases in the object oriented APIs:
• If we ask for the number of GamsSymbols in a GamsDatabase, the Aliases will be excluded.
• If we iterate over all GamsSymbols in a GamsDatabase, Aliases will be skipped.
• If we ask explicitly for an Alias in a GamsDatabase (GamsDatabase.get_set("a") with a being an Alias) we will get a reference to the GamsSet referenced by the Alias, not the Alias itself.
• Note: Aliases can appear in a GamsDatabase only, if it was initialized by a GDX file containing an Alias.
• The new Python example alias.py demonstrates this new behavior.

# 24.3.2

• Make more GAMS options available through the GamsOptions class (Removed leading underscores of property identifiers):
• GamsOptions.appendexpand: Expand file append option
• GamsOptions.appendout: Output file append option
• GamsOptions.dumpopt: Writes preprocessed input to the file input.dmp
• GamsOptions.dumpparms: GAMS parameter logging
• GamsOptions.errmsg: Placing of compilation error messages
• GamsOptions.expand: Expanded (include) input file name
• GamsOptions.ferr: Alternative error message file
• GamsOptions.jobtrace: Job trace string to be written to the trace file at the end of a Gams job
• GamsOptions.limcol: Maximum number of columns listed in one variable block
• GamsOptions.limrow: Maximum number of rows listed in one equation block
• GamsOptions.logline: Amount of line tracing to the log file
• GamsOptions.on115: Generate errors for unknown unique element in an equation
• GamsOptions.output: Output file
• GamsOptions.pagecontr: Output file page control option
• GamsOptions.pagesize: Output file page size (=0 no paging)
• GamsOptions.pagewidth: Output file page width
• GamsOptions.reference: Symbol reference file
• GamsOptions.scriptexit: Program or script to be executed at the end of a GAMS run
• GamsOptions.suppress: Compiler listing option
• GamsOptions.symbol: Symbol table file
• GamsOptions.tracelevel: Solvestat threshold used in conjunction with a=GT

# 24.3.1

• On Linux and OS X: LD_LIBRARY_PATH and DYLD_LIBRARY_PATH do not need to contain a GAMS system directory anymore. Anyway, if no system directory is specified in the GamsWorkspace constructor, PATH and LD_LIBRARY_PATH/DYLD_LIBRARY_PATH is used to find a GAMS system directory. The order is as follows:
• Linux: If no system directory is specified in the GamsWorkspace constructor, check PATH first. If no system directory was found, check LD_LIBRARY_PATH
• OS X: If no system directory is specified in the GamsWorkspace constructor, check PATH first. If no system directory was found, check DYLD_LIBRARY_PATH
• Windows: If no system directory is specified in the GamsWorkspace constructor, check registry.
• GamsJob.run creates out_db now even if it throws a GamsExceptionExecution
• New example transport14
• New function _GamsSymbolRecord.key(int index): Retrieve key of GamsSymbolRecord on position index
• GamsModelInstance.solve now also works for solvers which require a subsolver, e.g. Dicopt

# 24.2.3

• Fix memory leak in GamsDatabase

# 24.2.2

• Fixed a bug regarding the subtype of equations and their default records, when the equation was added to a GamsDatabase from the API.
• Fixed a bug in GamsSymbol.delete_record.
• Fixed GamsExitCode.
• Make sure that GamsModelInstance.instantiate() does not solve the model, but only prepares everything required for the following solve()

# 24.2.1

• Add tutorial (GAMS_python_Tutorial.pdf) to <Path/To/GAMS>/docs/API. From the GAMSIDE this document can be accessed at Help -> Docs -> API
• New parameter opt_file in function GamsWorkspace.add_options allows to create an instance of GamsOptions that is initialized by an existing option file
• New function GamsOptions.export: Write GamsOptions into a parameter file
• New properties: GamsWorkspace.api_version, GamsWorkspace.api_major_rel_number, GamsWorkspace.api_minor_rel_number and GamsWorkspace.api_gold_rel_number
• New property GamsWorkspace.my_eps: Reset value to be stored in and read from GamsDatabase for Epsilon.
• New class NoNewVarEqu providing static fields to set option nonewvarequ
• Renaming of GamsOptions.PoolFree4 to GamsOptions.IntVarUp and property poolfree4 to intvarup
• Renaming of ModelStat.NonOptimalIntermed to ModelStat.Feasible
• Fixed a bug in _GamsSymbol.add_record() that occurred when using empty strings as keys
• Fixed a bug in GamsModelInstance.solve() that affected the logging behavior
• The following functions throw an exception, when a wrong data type is passed for the keys/slice parameter: delete_record, find_record, add_record, merge_record, first_record, last_record. Valid data types are str, list, tuple and their subclasses

# 24.1.1

• New examples: markowitz.py, tsp.py, transport13.py, simple_cutstock.py, domain_checking.py
• New facility for GamsSymbols with domain information:
• GamsDatabase:
• New function check_domains: Check for all symbols if all records are within the specified domain of the symbol
• New function get_database_dvs: Return all GamsDatabaseDomainViolations
• New property suppress_auto_domain_checking: Controls whether domain checking is called in GamsDatabase export
• _GamsSymbol and its derived classes:
• New function check_domains: Check if all records are within the specified domain of the symbol
• New function get_symbol_dvs: Return all GamsDatabaseDomainViolations
• New property domains: Domains of Symbol, each element is either a GamsSet (real domain) or a string (relaxed domain)
• New classes GamsDatabaseDomainViolation and GamsSymbolDomainViolation that are returned by GamsDatabase.get_database_dvs and _GamsSymbol.get_symbol_dvs
• New functions in GamsModelInstance:
• copy_modelinstance: Copies a GamsModelInstance to a new GamsModelInstance which gets constructed at this call
• interrupt: Sends interrupt signal to running GamsModelInstance
• New function in _GamsSymbol and its derived classes: merge_record finds a record if it exists and adds it if not
• New properties in GamsWorkspace: version, major_rel_number, minor_rel_number, gold_rel_number
• New optional parameter in_model_name for functions add_database_from_gdx/add_database in GamsWorkspace: GAMS string constant that is used to access this database
• Changed the debug argument passed to the GamsWorkspace constructor. Use members of class DebugLevel: Off, KeepFiles, ShowLog and Verbose instead of True and False
• New sub class of GamsException: GamsExceptionExecution, which provides additional info about the reason of the failed execution
• Allow to define SymbolUpdateType for each GamsModifier seperately
• Significant performance improvement for function GamsWorkspace.add_database when creating from an already existing database
• Changed the unicode settings on Linux from UCS2 to UCS4
• The Debug parameter of GamsWorkspace can be overwritten by the system environment variable "GAMSOOAPIDEBUG" if set to one of the following: Off, KeepFiles, ShowLog, Verbose
• The compact method of GamsDatabase is obsolete and has no effect anymore. It will be removed in the future.
• Fixed a bug in GamsModelInstance.solve()
• Fixed a bug in GamsDatabase, where the special value for undefined was set to 0 instead of 1.0E300 (SV_UNDEF)
• Fixed a bug when iterating through the records of a GamsSymbol

# 24.0.2

• Added new function _GamsSymbol.copy_symbol which copys all records from one to another GamsSymbol
• Label and symbol lookup is now case insensitve
• Fixed handling of infinite bounds for GamsModifiers

# 24.0.1

This release contains a beta version of the object-oriented Python API that can be used to control GAMS from within Python 2.7. It allows the seamless integration of GAMS into Python by providing appropriate classes for the interaction with GAMS. The GamsDatabase class for in-memory representation of data can be used for convenient exchange of input data and model results. Models written in GAMS can be run with the GamsJob class and by using the GamsModelInstance class a sequence of closely related model instances can be solved in an efficient way. To use this API see the Getting started section.