6. Mathematica i "vanjski svijet"

6.1 Izvršavanje Mathematica programa u pozadini

Često je za dulje račune nezgodno čekati pred računalom do kraja i mozda tako nepotrebno zuzimati radno mjesto. Računala pod Unix operativnim sustavom (Linux, FreeBSD, ...) omogućuju kontrolu računalnih procesa koje tamo mozemo staviti u pozadinu (background) i osloboditi terminal.

Najjednostavniji način je naprosto upisati odgovarajuće Mathematica komande u datoteku, npr.  (standardno je ekstenzija takve datoteke .m) i onda u komandnoj ljusci (shell-u) izvršiti

math  < infile.m  > outfile &

To poziva Mathematica kernel, izvršava komande u datoteci infile.m  i prosljedjuje output u datoteku outfile. Znak "&" na kraju stavlja proces u pozadinu. Nakon toga se moze izlogirati s računala. (Ponekad računalo ne dopušta odlogiravanje uz upozorenje "There are jobs running!". Tad ponekad pomaze shell naredba disown. U slučaju takvih problema proučite dio dokumentacije shella koji se tiče upravljanja procesima - job control.)

Mali problem s ovim gore pristupom je da su rezultati u outfile datoteci relativno teško upotrebljivi za daljnje računalno procesiranje. Tu pomaze  tehnike  da se unutar samog Mathematica programa zatrazi redirekcija rezultata komandi koje nas zanimaju u datoteku pomoću komandi ">>" i ">>>" . Npr. datoteka infile.m moze izgledati ovako

f[x_]= Simplify[D[Expand[(Sin[x]+x)^15], {x,15}]]
Table[f[x], {x, 6., 8., 0.4}] >> tablica.m
Plot[f[x], {x, 6, 8}, DisplayFunction->(Display["funkcija.eps",#,"EPS"]&)]

Slijedeći problem je da datoteka infile.m mora biti čisti ASCII pa ne mozemo izravno upisivati grčka slove i druge specijalne simbole. Isto tako, često račun priredimo u notebooku pa je pozeljno nači način da prepišemo notebook čelije u infile.m. To se radi na slijedeći način: Označimo sve čelije koje sadrze zeljeni račun i označimo ih kao inicijalizacijske (Cell->Cell Properties->Initialization Cell, to inače sluzi da se te čelije automatski izvrše prije bilo čega drugog u notebooku). Nakon toga spremimo notebook kao File->Save As Special->Package Format. To će spremiti cijeli notebook u file istog imena, ali s ekstenzijom .m, i samo s označenim ćelijama odkomentiranim.

Zadatak:  isprobajte sve gore opisano na nekom računu koji traje umjereno dugo, npr. izračun Brunove konstante iz 4. poglavlja za prvih (10^5) ili (10^6) prim brojeva, ili na gore predlozenom primjeru datoteke infile.m.

6.2 Pokretanje kernela na drugom računalu

Ponekad nam na raspolaganju stoji udaljeno snažno računalo. Međutim, pokretanje Mathematice na njemu zbog sporosti mreže čini rad otežanim. Tada je zgodno pokrenuti Mathematica "Frontend" lokalno i samo se spojiti na kernel udaljenog računala.

Najprije provjerimo da li se na udaljeno računalo uopće možemo logirati  ssh aplikacijom i tamo pokrenuti kernel komandom 'math'.

ssh username@jaki.stroj.hr math

Ako to radi onda u lokalnom notebooku idemo u Kernel->Kernel Configuration Options i podesimo potrebne opcije (naziv udaljenog hosta itd.).

Na Unixu je potrebno realizirati mogućnost spajanja bez passworda korištenjem 'ssh-agent'-a. Na MS Windowsima postoji mogućnost specificiranja passworda. (U ovo dvoje nisam apsolutno siguran.)

Nakon toga u  Kernel->Notebook's kernel  samo specificiramo koji kernel želimo koristiti.

6.3 Povezivanje Mathematice s programima u C-u

Mathematica je u zadnje vrijeme dosta napredovala u pogledu brzine numeričke matematike, ali ponekad je neke zahtjevne račune zgodnije delegirati bržim kompajliranim jezicima poput C-a ili Fortrana. Isto tako, ponekad je poželjno iz drugih jezika pozvati neku Mathematica funkciju. To se izvodi MathLink sustavom.

Za pozvati C funkciju iz Mathematice MathLink,  pored same definicije funkcije u C-u traži još i tzv. template datoteku s ekstenzijom .tm u kojoj je opisana sama funkcija i njeni argumenti. Npr, funkcija zbroj koja zbraja dva cijela broja ima ovakvu template datoteku (nazovimo je zbroj.tm):

:Begin:
:Function:      zbroj
:Pattern:       zbroj[x_Integer, y_Integer]
:Arguments:     {x, y}
:ArgumentTypes: {Integer, Integer}
:ReturnType:    Integer
:End:

Odgovarjući C-program (u datoteci zbroj.c) može izgledati ovako. Prvo uključujemo MathLink header

#include "mathlink.h"

Zatim dolazi C kod koji definira funkciju zbroj

int zbroj(int x, int y) {
   return x+y;
}

I na kraju glavni program koji se vrti i čeka poziv od Mathematice

int main(int argc, char *argv[]) {
   return MLMain(argc, argv);
}

Kompajliranje se vrši (na Unixu!) programom mcc ovako:

mcc -o zbroj.exe zbroj.tm zbroj.c

Da bi se funkcija mogla koristiti treba je u Mathematica sesiji prvo instalirati

Install["files/zbroj.exe"]

i nakon toga nam je dostupna

zbroj[4, 3]

Moguće je i povezivanje s programima u Fortranu, no samo posredno putem wrapper programa u C-u. Za sve detalje oko korištenja MathLinka treba konzultirati "MathLink Tutorial" na adresi http://library.wolfram.com/infocenter/TechNotes/174/