Az egyes változókra - skalárok, paraméterek, stb. - tehetünk algebrai megkötéseket egyenlőségek, egyenlőtlenségek formájában. Megadási mód az eddigieknek megfelelően történik:
Itt is a setdependency megadja, hogy mely halmaz(ok)hoz kapcsoljuk az egyenlőséget, legfeljebb tízhez lehet, de nem kötelező. Az equation helyett használható az equations is.
A fentiekben deklarált egyenlőségek algebrai struktúráját adhatjuk meg a ".." specifikáció segítségével, az alábbi formában:
Ahol eqname egy korábban deklarált, a setdependency által meghatározott halmazhoz kapcsolódó egyenlőség, a $conditional egy opcionálisan megadható feltétel, lefthand az egyenlőség bal oldalán álló, righthand pedig a jobb oldalán álló kifejezés, eqtype pedig egy relációs jel. Lássunk is erre egy példát!
Az alábbi példában adott két halmaz, x és y, ezeken definiált két változó, costx és costy, ezek valamilyen költségeket jelentenek. Szeretnénk meghatározni az összköltséget úgy, hogy az x halmaz bármely elemének költsége kisebb legyen az y halmaz bármely elemének költségénél. (Természetesen kell még olyan utasítás is, amely a feltételeknek megfelelően bállítja costx és costy értékeit, de ezekkel itt most nem foglalkozunk.)
A feladat az alábbi formában oldaható meg:
Ahogy látható, nem a hagyományos formában kell a relációkat megadni. A megfeleltetések a következők:
A változókhoz hasonlóan az egyenlőségeknek is vannak attribútumaik:
A modellek olyan objektumok a GAMS-ban, amelyeket megold a rendszer. Egy modellben összegyűjtjük az egyenlőségek, változók (azok minden attribútumával együtt) egy részét, vagy akár az összeset. Három alapvető típusú modellt különböztetünk meg egymástól:
Az általános megadási forma:
Ahol a model kulcsszó helyett használható a models kulcsszó is, illetve egy utasítás alatt több modellt is definiálhatunk, továbbá a tartalom megadási módja az alábbiak közül bármelyik lehet:
Ezzel az utasítással lehet a fentebb definiált modelleket megoldani. Ha optimizációs problémát szeretnénk megoldani, megadhatjuk az optimalizálás irányát is, azaz maximalizálni, illetve minimalizálni szeretnénk, a másik két esetben (MCP, CNS) ez hiányzik. A megadási módok tehát a következők:
Amint látható, az optimalizás iránya és a használt modelltípus megadása felcserélhető. A fentiekben szereplő modelname egy korábban definiált modell, valtozo egy megszorítások nélküli változó, modeltype pedig az alábbi problématípusok valamelyike:
A vezérlési szerkezetek tekintetében - a case-t kivéve - minden megtalálható a GAMS-ban, mint a legtöbb programozási nyelvben, természetesen sajátos formában. Ebben a fejezetben ezekről lesz szó.
Még mielőtt részletezném az egyes vezérlési szerkezeteket, megjegyzem, hogy mindegyik esetében kétféle szintaxis lehetséges: az egyik az "alapértelmezett", a másik a $Onend ún. dollár-parancs (ezekről lásd bővebben az erről szóló következő fejezetet!) használata mellett engedélyezett (az alternatív szintaxis nagyon hasonló az Ada95 megfelelő szintaxisához). Erről is szó lesz az egyes pontokban.
Továbbá fontos azt is tudni, hogy az alábbiakban taglalt egyik vezérlési szerkezet belsejében sem lehetnek parameter, set, acronym, file, table, model, equation, variable vagy scalar utasítások, illetve ".." egyenlőség-deklarációk.
Az elágazás általános formája:
Ahol tetszőleges elseif ág lehet - akár nulla is -, továbbá nem kötelező módon lehet egy else ág is. A zárójelezéssel egyértelműen meghatározott, hogy az egyes else, illetve elseif ágak mely if-hez tartoznak, így nem kell külön szabály a csellengő ágak kezelésére.
Az alternatív szintaxis a $Onend dollár-parancs használata mellett pedig:
Ha egy, vagy több halmaz elemeit bejárva szeretnénk ugyanazokat az utasításokat végrehajtani, akkor használható a loop utasítás, melynek szintaxisa:
Ha csak egyetlen halmaz elemein szeretnénk csak a ciklusmagot végrehajtani, akkor a belső zárójelek elhagyhatók. A ciklus esetén is használható a $Onend által meghatározott alternatív szintaxis, amely a következőképpen néz ki:
Sem a ciklusváltozó, sem a halmaz, amelynek eleme a ciklusváltozó, nem változtatható meg.
A while ciklus utasítások többszöri végrehajtására használatos, a ciklusmag mindaddig végre fog hajtódni, amíg a ciklusfeltétel igaz marad. Szintaxis:
Illetve az alternatív szintaxis:
Ez a fajta ciklus a while ciklus párja, a ciklusmag mindaddig végrhatjódik, amíg a ciklusfeltétel igazzá nem válik. Egyetlen szintaxisa (nincs alternatív):
Az általános szintaxis a következő:
Ahol:
Az alternatív szintaxis pedig:
Dollár-parancsokat a sor elején lévő '$'-jel vezet be, ez után közvetlenül jön a parancs neve (Nem engedélyezett semmilyen elválasztó karakter a '$'-jel és a parancs neve között!), majd szóközzel elválaszta az argumentuma(i), ha van(nak). A dollár-parancsokat bárhol elhelyezhetjük a forráskódban, egy soron belül akár többet is, és itt sincs különbség kis- és nagybetűk között. A dollár-parancsokat fordítási időben értékeli ki a rendszer.
Nagyon sok dollár-parancs van, ezek közül néhányat tárgyalok, a többi csak megemlítésre kerül. Az alábbi kategóriákba oszthatjuk a dollár-parancsokat:
A következő pontokban ezekről lesz szó.
Ebben a pontban szereplő dollár-parancsok többsége már szerepelt a kommenteknél.
Ezzel a dollár-paranccsal változtatható meg az egysoros komment delimitere (amely alapértelmezésben a '*'), használata:
Átdefiniálja a sorvégi komment delimiterét (alapértelmezésben: '!!'). Használat:
Rejtett komment megadására szolgál, amely nem jelenik meg a listafájlban. Példa:
Az in-line komment delimiterének megváltoztatására szolgál, használata:
Beállítja a jobboldali, illetve a baloldali margót, használata:
Illetve használhatók összevonva is:
Aktiválja, ill. deaktiválja a sorvégi kommentet.
Aktiválja, ill. deaktiválja a margó kommentet.
Engedélyezi, ill. tiltja az in-line kommentek egymásba ágyazását. Pl.:
Többsoros kommenteket fognak közre, a közöttük lévő sorok a listafájlban sorszám nélkül szerepelnek. Pl.:
Itt a listafájllal és más kimeneti fájlokkal kapcsolatos dollár-parancsok kerülnek ismertetésre.
Egy szöveget küld egy külső fájlba, használat:
A kulso_file-nak tartalmaznia kell az elérési utat is, amennyiben ez szükséges. Mind a küldendő szöveg, mind a fájl lehet idézőjelek között, vagy nélkülük. A $Echo esetén egy sorvége jel is küldésre kerül, $EchoN esetén pedig nem, '>' a már létező fájlt felülírja, '>>' pedig a fájl végére ír. A megnyitott fájl csak akkor kerül bezárásra, amikor befejeződik a futás, vagy $Call, vagy $Include dollár-parancsok hívásával.
Engedélyezi, ill. tiltja a dollár-parancsok másolását az LST-fájlba, alapértelmezett a $OffDollar.
Ebben a pontban arról lesz szó, hogy a GAMS milyen lehetőségeket kínál külső fájlok használatára.
Külső fájl belinkelésére szolgál, itt van lehetőség argumentumok átadására is. Pl.:
Külső fájl argumentumok nélküli importálására használatos. Pl.:
A GAMS rendszerkönyvárban lévő inclib könyvtárból linkelhetünk be fájlokat, argumentumok átadása itt is lehetséges. Pl.:
További, fájlok belinkelésére szolgáló dollár-parancsok:
$OnGlobal, $OffGlobal, $OnInclude, $OffInclude, $Shift, $SysInclude
A számok tárolásának pontosságát kontrollálja. Az $OffDigit parancs hatására a GAMS a lehető legnagyobb pontosságot használja, a számok többi részét figyelmen kívül hagyja, az $OnDigit pedig megváltoztatja a számokat úgy, hogy azok az adott gépen ábrázolhatók legyenek (ez általában 16 bit). Alapértelmezésben ez utóbbi van érvényben.
Az $OnEps hatására a paraméterekben és táblázatokban lévő nullákat egy adott EPS-nek tekinti a rendszer. Alapértelmezett az $OffEps, amely a fenti opciót kikapcsolja.
Visszaállítja az argumentumában megadott (akárhány) halmaz, paraméter, egyenlőség, illetve változó értékét az alapértelmezettre, azaz a halmazokat kiüríti, a numerikus értékeket pedig kinullázza. (Veszélyes a használata.)
Az előbbi parancsnál erősebb, hatására nem csak a halmaz ürül ki, de minden más - paraméter, egyenlőség, illetve változó - adatszerkezethez tartozó adatok is törlődnek, csak a típus- és halmazdefiníciók maradnak érvényben. Fordítási időben hajtódik végre, nem pedig végrehajtási időben, ezért ez is nagyon veszélyes.
A $Call dollár-parancs segítségével indíthatunk külső programot is, amelynek parancssori argumentumokat is adhatunk át. Pl.:
A többi dollár-parancs nem kerül részletes ismertetésre, ezek a felhasználói kézikönyvben megtalálhatók. Az összes dollár-parancs listája (ábécé-sorrendben, összesen 96 db) alább olvasható:
abort, batinclude, call, clear, comment, dollar, double, echo, echon, eject, eolcom, error, escape, exit, expose, gdxin, gdxout, goto, hidden, hide, if, if not, ifi, ifi not, include, inlinecom, kill, label, libinclude, lines, load, log, maxcol, mincol, [on|off]delim, [on|off]digit, [on|off]dollar, [on|off]echo, [on|off]empty, [on|off]end, [on|off]eolcom, [on|off]eps, [on|off]global, [on|off]include, [on|off]inline, [on|off]listing, [on|off]margin, [on|off]multi, [on|off]nestcom, [on|off]symlist, [on|off]symxref, [on|off]ext, [on|off]uellist, [on|off]uelxref, [on|off]upper, [on|off]warning, phantom, protect, purge, set, setargs, setlocal, shift, show, single, stars, stop, stitle, sysinclude, title, unload, use205, use225, use999.