# GAMS.jl

GAMS.jl provides a MathOptInterface Optimizer to solve JuMP models using GAMS.

GAMS comes with dozens of supported solvers. Among them are: ALPHAECP, ANTIGONE, BARON, BDMLP, BONMIN, CBC, CONOPT, COUENNE, CPLEX, DICOPT, GLOMIQO, GUROBI, IPOPT, KNITRO, LGO, LINDO, LINDOGLOBAL, LOCALSOLVER, MINOS, MOSEK, MSNLP, NLPEC, PATH, QUADMINOS, SBB, SHOT, SCIP, SNOPT, SOPLEX, XA, XPRESS. Find a complete list here.

GAMS.jl supports the following JuMP features:

- linear, quadratic and nonlinear (convex and non-convex) objective and constraints
- continuous, binary, integer, semi-continuous and semi-integer variables
- SOS1 and SOS2 sets
- complementarity constraints

## Installation

- Download GAMS and obtain a GAMS license. Please note that GAMS also offers a free community license.
- (optional) Add the GAMS system directory to the
`PATH`

variable in order to find GAMS automatically. - Install GAMS.jl using the Julia package manager:

```
using Pkg
Pkg.add("GAMS")
```

## Usage

Using GAMS as optimizer for your JuMP model:

```
using GAMS, JuMP
model = Model(GAMS.Optimizer)
```

### GAMS System

If the GAMS system directory has been added to the `PATH`

variable (you can
check this with `print(ENV["PATH"])`

), GAMS.jl will find it automatically.
Otherwise, or if you like to switch between systems, the system directory can be
specified by (one of the following):

```
set_optimizer_attribute(model, "SysDir", "<gams_system_dir>")
set_optimizer_attribute(model, GAMS.SysDir(), "<gams_system_dir>")
```

Analogously, you can specify a working directory with `"WorkDir"`

or
`GAMS.WorkDir()`

. If no working directory has been set, GAMS.jl will create a
temporary one.

If you want to use the same GAMS workspace (same system and working directory)
for multiple models, you can create a `GAMSWorkspace`

first with either of the
following

```
ws = GAMS.GAMSWorkspace()
ws = GAMS.GAMSWorkspace("<gams_system_dir>")
ws = GAMS.GAMSWorkspace("<gams_system_dir>", "<gams_working_dir>")
```

and then pass it to your models:

`model = Model(() -> GAMS.Optimizer(ws))`

### GAMS Options

GAMS command line options can be specified by

```
set_optimizer_attribute(model, "<option>", "<solver_name>")
set_optimizer_attribute(model, GAMS.<option>(), "<solver_name>")
```

where `<option>`

is either
HoldFixed,
IterLim,
LogOption,
NodLim,
OptCA,
OptCR,
ResLim,
Solver,
Threads,
Trace,
TraceOpt as well as
LP,
MIP,
RMIP,
NLP,
DNLP,
CNS,
MINLP,
RMINLP,
QCP,
MIQCP,
RMIQCP,
MCP or
MPEC.
Note that `GAMS.ResLim()`

is equivalent to `MOI.TimeLimitSec()`

and
`GAMS.Threads()`

to `MOI.NumberOfThreads()`

.

#### Model Type

GAMS.jl will automatically choose a GAMS model type for you. Choosing a different model type:

`set_optimizer_attribute(model, GAMS.ModelType(), "<model_type>")`

### GAMS Solver Options

Specifying GAMS solver options:

`set_optimizer_attribute(model, "<solver_option_name>", <option_value>)`

Note that passing a solver option is only valid when exlicitly choosing a GAMS solver and not using the default.

### Checking Solver Support

In order to check, if a GAMS solver is licensed (and supports a given GAMS model type), do

```
GAMS.check_solver(GAMS.GAMSWorkspace(), "<solver_name>")
GAMS.check_solver(GAMS.GAMSWorkspace(), "<solver_name>", "<model_type>")
```