41 Distribution

# 41.1.0 Major release (October 28, 2022)

## Acknowledgments

We would like to thank all of our users who have reported problems and made suggestions for improving this release. In particular, we thank Marcel Adenauer, Sebastian Braun, Wolfgang Britz, Arne Stolbjerg Drud, Michael Ferris, Mitch Phillipson, and Zhang Tao.

## Platforms

• We plan to drop support for macOS 10.15 with the next major release.
• We plan to drop support for Windows 8.1 with the next major release.

## GAMS System

### Connect

• Symbol names in Connect are now case insensitive. The global attribute caseSensitiveLookup has been removed.
• Added new Concatenate agent that allows concatenating multiple symbols into a single symbol.
• The PandasSQLReader now supports pyodbc connections. The connection type can be configured via the new option connectionType.
• Options readAll and writeAll available in some agents allow and default to value auto. So if the symbols section is missing, auto becomes True, otherwise False.
• Fixed bug where PandasExcelWriter and PandasSQLWriter would not properly close the file/database connection in case of an exception.
• Fixed bug where GAMSWriter and GDXWriter would fail when writing an empty symbol with relaxed domains.

### GAMS

• As announced we have removed language elements to access some commercial and licensing information:
• Predefined sets componentEDate, componentMDate, and componentLicenseOptions.
• Many of these elements were used in the GAMS Model Library model licememo, which we also dropped.
• Added new intrinsic functions lseMax, lseMaxSc, lseMin, and lseMinSc.
• Added new dollar control options $on/offSuffixAlgebraVars and related command line parameter SuffixAlgebraVars to disallow the use of variable suffixes (aka. attributes) in model algebra. This option allows to easily detect unintentional use of variables with suffixes in equation algebra. • Improved message when exceeding the limit of the GAMS Community License or Demo License. • Patched up the Windows memory reporting for showOSMemory and procTreeMemMonitor, and added clarifying documentation. ### GMSPython • Added the package psycopg2. • Removed the package pyyaml-include. ### Embedded Python Code Facility • On Windows, the directory with the Python DLL is automatically added to PATH, so some DLLs are properly found. ## Solvers ### ANTIGONE, CBC, Ipopt, SCIP, SHOT • Updated MKL to 2022.2.0 on Linux and macOS. ### BARON • New libraries 22.9.30. • Better treatment of convex and quadratic problems, including improved relaxations for binary quadratic programs. • Improved cutting, range reduction, and branching strategies. • Improved continuous and integer presolve algorithms. • Improved interfaces to CPLEX, CBC, and IPOPT. ### CONOPT • New libraries 3.17N. • New libraries 4.29. ### CONVERT • Added option AmplNL: Generates AMPL .nl file. • Added option AmplNLBin: Enables to write .nl file in binary format. ### COPT • New libraries 5.0.5. • Value 1 for option Presolve has been changed to mean "fast presolve". Additional values 2 and 3 have been added to specify normal and aggressive presolving levels. ### CPLEX • Changed iis from boolean to integer option and added option value 2: Conflict analysis without previous solve. • The time reported in model attribute resUsd now corresponds to the chosen clock type. That is, the CPU time spend by CPLEX is reported if clocktype is changed to 1. ### DICOPT • Added option dumpsubprob to activate writing of MIP and NLP subproblems as GAMS files. ### GUROBI • Added support for more nonlinear constraints: 1-norm, 2-norm, and inf-norm specified as nonlinear expressions. • Deprecated dot-option .GenConstrType: Please use nonlinear expressions instead. • Changed iis from boolean to integer option and added option value 2: Conflict analysis without previous solve. ### Ipopt • New libraries 3.14.10. • Small performance improvement for problems with i) linear objective function, ii) quadratic objective and linear constraints, iii) only linear equality constraints, or iv) only linear inequality constraints. ### Lindo/LindoGlobal • New libraries 14.0.162: • LP Solver Improvements: • Improved algorithms for searching alternative optima. • MIP Solver Improvements: • Improved selection of search parameters when solving difficult instances. • Linearization: • Recognition of more expressions than previous versions. • Advanced linearization of QP and conic models. • Nonlinear Solver Improvements: • Recognition of fractional linear programs and algorithmic improvements for this class. • Global Solver Improvements: • Introduce auxiliary variables to optimize in hyperspace for improved performance. • Improved warning messages for possible sub-optimal solutions. • Improved bound-tightening process. • Added support for new intrinsic function lseMax. ### MOSEK ### Octeract • New libraries 4.5.1. ### ODHCPLEX • The time reported in model attribute resUsd now corresponds to the chosen clock type. That is, the CPU time spend by ODHCPLEX is reported if clocktype is changed to 1. ### SCIP • New libraries 8.0.2. ### XA ### XPRESS • New libraries 40.01.03. ## Tools ### GAMS Studio • New version 1.12.1. • New feature: Navigator (Ctrl+k) • Please note: this feature is currently in beta and does not have mouse support yet! • Filter files by typing a search term, wildcards are also supported (e.g.: *.gms). • Press Enter to jump to a selected file. • Type ? to show help about all available prefixes. • The GoTo- and TabBrowser-dialogs are now obsolete and will be removed in the future. • GDX Viewer improvements: • New feature: Added first version of an export dialog, currently supporting Excel output only. • New feature: Added quick selection to GDX Viewer filters. • Improved auto-resizing behavior. • Improved symbol table colors especially when the theme has changed. • Search and Replace improvements: • Added highlighting to matches in Search Result View. • Added capture group support for regular expressions in Search Dialog. • Added filter to MIRO deploy dialog and EFI editor. • Added function to open directly in Pin-View from Project Explorer by Ctrl+double-click (for horizontal pin) or Ctrl+Shift+double-click (for vertical pin). • Added icons to the main tabs (except for macOS). • Added editor settings to skip syntax highlighting for long lines (this can improve performance significantly). • Stability improvements, bug fixes, and minor enhancements, e.g.: • Changed GAMS version mismatch error message to a warning message. • Fixed GDX Viewer crash when reloading a file with an alias selected. • Fixed crash when switching tabs on macOS. • Fixed project changes on search over multiple files where a file is linked to more than one project. • Fixed unexpected behavior when adding the main file to an EFI file. • Fixed wrong context menu for new entry in Project Explorer after using Save as.... • Fixed that models with names containing spaces failed to be executed on NEOS and Engine. ### GDXRRW • GDXRRW is now deprecated and will be removed in a future release. Please use GAMS Transfer R instead. If you encounter issues with the transition to GAMS Transfer R or if you have any feature requests for GAMS Transfer R or concerns about the transition, do not hesitate to contact GAMS support. ### GDXXRW • When the limit on number of supported of rows or columns is reached when reading from a file, a warning is now given that subsequent entries might have been skipped. ###$libInclude win32

• Added XLSMerge functionality to <sysdir>\inclib\win32.gms to merge two Excel workbooks.

## APIs

### gams2numpy

• Non-UTF-8 characters do not result in an exception anymore. Instead, such characters are transferred to an alternative representation by using the Python error handler backslashreplace. This change affects gams2numpy and all its clients – GAMS Transfer, Connect, and gams_magic (Jupyter notebooks).
• The binaries are now build with numpy 1.21.6 for Python 3.7 and numpy 1.23.3 for Python 3.8, 3.9, and 3.10.

### GAMS Transfer Matlab

• Breaking: Symbol name uniqueness is now checked case insensitively. For example, it is not possible anymore to have three different symbols named symbol, Symbol, and SYMBOL.
• Breaking: Changed Symbol.addUELs signature from addUELs(dim, uels) to addUELs(uels, dim). dim is now allowed to accept a vector of dimensions.
• Breaking: Changed Symbol.setUELs signature from setUELs(dim, uels) to setUELs(uels, dim) and setUELS(_, "rename", true/false). Setting rename to true triggers the old Symbol.initUELs. dim is now allowed to accept a vector of dimensions.
• Breaking: Changed Symbol.removeUELs signature from removeUELs(dim, uels) to removeUELs(), removeUELs(uels), and removeUELs(uels, dim). dim is now allowed to accept a vector of dimensions.
• Breaking: Changed Symbol.renameUELs signature from renameUELs(dim, olduels, newuels) to renameUELs(uels) and renameUELs(uels, dim). uels can now be cellstr, struct, or containers.Map. dim is now allowed to accept a vector of dimensions.
• Added method Container.getSymbolNames to return the original symbol names for a list of symbol names of any case.
• Added method Container.hasSymbols to check if symbol name (case insensitive) exists.
• Added method Container.getUELs to get UELs from all symbols.
• Added method Container.removeUELs to remove UELs from all symbols.
• Added method Container.renameUELs to rename UELs in all symbols.
• Added method Symbol.reorderUELs to reorder UELs without changing the meaning of records.
• Added flags Container.modified and Symbol.modified to indicate if a container and/or symbol has been modified since last reset.
• Added possibility to filter UEL codes in Symbol.getUELs.
• Added possibility to pass a vector of dimensions to Symbol.getUELs.
• Added possibility to overwrite symbols with Container.add* if main symbol definition (e.g. type, domain) is equal.
• Changed Container.getSymbols, Container.removeSymbol, Container.renameSymbol, Container.describe*, and others that use Container.getSymbols to accept symbol names case insensitively.
• Changed behaviour of default records: Default records do not get written to GDX anymore if the records format is dense_matrix and either the container is in indexed mode or if the symbol has a regular domain.
• Changed behaviour of getDomainViolations: As in GDX, different character case does not lead to a domain violation.
• Categoricals for record domain labels are now created with Ordinal set to true, but ordinal categoricals are not enforced, i.e., users may pass categoricals with Ordinal set to false.
• Changed symbol read order when reading a subset of symbols: Symbol order is defined by source order (e.g., symbol order in GDX file) rather than user supplied order. To establish a custom order after the read, use reorderSymbols.
• Deprecated Symbol.getUELLabels. Use Symbol.getUELs instead.
• Deprecated Symbol.initUELs. Use Symbol.setUELs instead.
• Deprecated Container.getUniverseSet. Use Container.getUELs instead.
• Fixed failing symbol constructors when using domain_forwarding, but none of the optional arguments.
• Fixed Symbol.transformRecords (table-like to matrix-like formats) in case the domain set records and UELs differ.
• Fixed write of sets defined over sets.

### GAMS Transfer Python

• The API has been redesigned to more closely mimic GAMS behavior (i.e., GAMS is case preserving, not case sensitive).
• The .data dict has been replaced with a custom dict that preserves the case of symbol names. This mimics the convention in GAMS. Symbol lookup from this custom dict is case insensitive.
• Added new methods to customize dimension, symbol, and container UELs: getUELs, setUELs, renameUELs, removeUELs, addUELs, and reorderUELs
• New Symbol method equals can be used to compare symbol objects.
• Deprecated the container method getUniverseSet. This method will be removed in a future major release. Use <Container>.getUELs() instead.
• Container methods addSet, addAlias, addParameter, addVariable, and addEquation now allow for symbol overwriting. Previously, an error was raised and the symbol had to be removed before recreation.
• New class UniverseAlias and new Container method addUniverseAlias to allows creation of a symbol which is an alias to the universe (fixes bug).
• Container no longer link symbol categoricals together when setting records with setRecords; data that results in domain violations is not immediately lost and the user has greater flexibility to modify inplace to the Container.
• Updated behavior of removeSymbols: the domain of dependent symbols is relaxed to "*" if a set/alias is removed. If a parent set of an alias is removed, the alias symbol will also be removed automatically.
• Implemented a new class called DomainViolation to organize where domain violations occur in data.
• New method getDomainViolations to return a list of DomainViolation objects, should they exist.
• Methods *DomainViolations locate domain violations by referencing all appropriate domain sets. findDomainViolations now returns a view of the records DataFrame that contains all domain violations (previously returned only an Index where domain violations occurred).
• Methods *DuplicateRecords locate duplicate records on a case insensitive basis (consistent with GAMS behavior).
• Removed tests for duplicate records and domain violations from the <Symbol>.isValid() method. <Symbol>.isValid() validates the structural aspects of the data, not the quality of the data. This improves performance by not looping over all records.
• Created a Symbol modified flag that tracks if any changes have been made to a symbol. These flags can be set/reset by setting <Container>.modified=True/False.
• Enabled the use of the Python in operator to test if a symbol is in a container with the syntax <symbol_object> in <container_object> or <symbol_string_name> in <container_object>, where <symbol_string_name> is case insensitive.
• The Container is now subscriptable, i.e., m[<symbol_name>] returns the symbol object. Symbol objects are still accessible through the underlying dictionary, i.e., m.data[<symbol_name>].
• setRecords now maintains user specified categoricals when passing a DataFrame.
• setRecords, getUELs, setUELs, renameUELs, and addUELs methods now strip any trailing whitespace from UELs.
• Improved Container behavior if reading from ConstContainer/Container: lists passed to the symbols argument read(<source>, symbols) are no longer considered to be ordered – previously, if an alias was listed before its parent set, an exception would occur.
• Fixed bug when attempting to read in a symbol named all, but the Container read in all symbols.
• Exposed (previously hidden) ConstContainer methods getCardinality() and getSparsity().
• An exception is now raised if attempting to read a symbol that does not exist in the data source. Previously, such symbol names were silently ignored.
• Improved clarity of some exception messages and other error handling.
• Fixed bug that prevented dict_keys and dict_items (returns from dict methods .keys() and .items(), respectively) objects from being passed directly into setRecords.
• Fixed bug that resulted in a NameError when calling .whereMin() or .whereMax() on variables or equations.
• New tests within <Container>.isValid() method to detect broken container references in symbols and inconsistent symbol naming between the <Container>.data dict and the symbol objects. These issues can occur when creating new symbols in a container with a copy/deepcopy operation.
• Restructured ConstContainer symbol classes to improve read-only behavior.

### GAMS Transfer R

• Breaking: Symbol name uniqueness is now checked case insensitively. For example, it is not possible anymore to have three different symbols named symbol, Symbol, and SYMBOL.
• Breaking: Symbol records and symbol names are treated in a case insensitive manner. Symbols domain is not checked automatically.
• Added a new class ConstContainer for efficient data transfer.
• Allow read from Container/ConstContainer into another Container.
• Added a method Container$getSymbolNames to return the original symbol names for a list of symbol names of any case. • Added a method Container$hasSymbols to check if symbol name (case insensitive) exists.
• Changed Container$getSymbols, Container$removeSymbols, Container$renameSymbol, Container$describe*, and others that use Container$getSymbols to accept symbol names case insensitively. • New Symbol methods hasDuplicateRecords, countDuplicateRecords, findDuplicateRecords, and dropDuplicateRecords to help debug and resolve errors with duplicate records. • New Container methods hasDuplicateRecords, countDuplicateRecords, and dropDuplicateRecords to help find symbols that contain duplicate records that cause the Symbol to be invalid. • New tests within Container$isValid() method to detect broken container references in symbols and inconsistent symbol naming between the <Container>$data field and the symbol objects. • Method isValid does not check for symbol record domain columns being factors, for duplicates, and for domain violations. • New Symbol methods hasDomainViolations, countDomainViolations, findDomainViolations, dropDomainViolations, and getDomainViolations. • New Container methods hasDomainViolations, countDomainViolations, and dropDomainViolations. • Allowed symbol overwriting with addSet/addParameter/addVariable/addEquation/addAlias methods when everything other than records and description is unchanged. • Added methods SpecialValues$isNA, SpecialValues$isEps, SpecialValues$isUndef, SpecialValues$isPosInf, SpcialValues$isNegInf to test for special values.
• The argument for where* methods changed from columns to column.
• Trailing whitespaces is now removed automatically from UELs in setRecords and *UEL methods.

### GMO

• Added a concurrent mode for QP extraction. In this mode, independent extraction methods are run in parallel threads. Extraction terminates when the first method completes. This is done row-wise: the concurrent threads work on each row in turn, using the result of the first thread to finish for that row and moving on together to the next row. Setting the gmoQExtractAlg property to 3 selects this method.
• Added new function gmoGetQMakerStats to get statistics about QP extraction.
• Added new function gmoFillMatches to complete the row/column matching for MCP models.
• Added new function gmoLoadDataLegacyEx to API: this function differs from the existing gmoLoadDataLegacy function in that the new function includes a flag fillMatches to toggle the completion of matching information for MCP models during the load.
• Changed the behavior of gmoLoadDataLegacy vis-a-vis matching information for MCP. Previously, gmoLoadDataLegacy behaved like gmoLoadDataLegacyEx(fillMatches=true). With this release, it behaves like gmoLoadDataLegacyEx(fillMatches=false). Users of this function that require the old behavior must switch to calling gmoLoadDataLegacyEx(fillMatches=true) or call gmoFillMatches explicitly.

### Jupyter Notebooks

• The data synchronization between Python and GAMS relies now entirely on GAMS Transfer.
• Environments allow working with different GAMS instances.
• Instead of gams_push and gams_pull with various Python data formats, GAMS lines and cells automatically synchronize symbols between GAMS and Python.
• GAMS Symbols can now be declared in the Transfer container in Python rather than in the GAMS cells. Please inspect the GAMS Jupyter API description for details.
• The older version of GAMS magic commands is still available under apifiles/Python/gams/gams_magic_legacy. This will be removed with one of the next major versions.

### Python

• Added example transport_gt.py that demonstrates how to combine the GAMS Python high level API with a GAMS Transfer Container, essentially replacing the GAMSDatabase class.
• Added method run_engine to GAMSJob class to run jobs on GAMS Engine, rather than locally.

## Model Libraries

### GAMS Model Library

• Dropped licememo.

# 41.2.0 Minor release (November 14, 2022)

## Acknowledgments

We would like to thank all of our users who have reported problems and made suggestions for improving this release. In particular, we thank Wolfgang Britz.

## GAMS System

### GAMS

• Improved the dollar control options $abort[.noError],$error, and \$log, so that the text given as an optional argument is not limited to 255 characters anymore.
• Fixed the creation of a potentially wrong dump file with dumpOptGDX.

## APIs

### GAMS Transfer Python

• Enabled writing of partial Containers to GDX with write_symbols argument.
• Changed Container.write() argument write_symbols to symbols to better harmonize with Matlab and R versions of GAMS Transfer.
• Fixed bug with equals symbol method when comparing UniverseAliases.

### Jupyter Notebooks

• Fixed a bug in %gams line magic that prevented code containing dashes preceded by a space from being executed properly.

# 41.3.0 Minor release (November 28, 2022)

## Acknowledgments

We would like to thank all of our users who have reported problems and made suggestions for improving this release. In particular, we thank Mart Saluri.

## GAMS System

### GAMS

• Improved performance when using the command line parameter GDX for programs with many labels.
• Fixed a potential problem using a platform specific license with the pLicense parameter.

## Solvers

### COPT

• Fixed that option AbsGap was not available.

### Lindo/LindoGlobal

• New libraries 14.0.191.

## Tools

### GAMS Studio

• New version 1.12.2 with some bug fixes and minor enhancements, for example:
• Added support for trailing :NUMBER when choosing files in Navigator.
• Fixed crash when moving line in text file.
• Fixed crash when reloading an invalid GDX file.

## APIs

### GMO

• Fixed function gmoNameInput: in case old control files are read, the result string was uninitialized.
GAMS Development Corp.
GAMS Software GmbH

General Information and Sales
U.S. (+1) 202 342-0180
Europe: (+49) 221 949-9170