Äudan je osjeÄaj približiti se realizaciji neÄega o Äemu sanjaÅ” veÄ 25 godina.
Iz sjeÄanja mi je pobjegao trenutak kad sam kupio “Numerical Recipes in C” knjigu u zagrebaÄkom Algoritmu u Gajevoj, u podrumu Hotela Dubrovnik negdje 1997. godine, ali se dobro sjeÄam prekucavanja potrebnih algoritama za realizaciju mog diplomskog rada na FERu. Vjerojatno nije pretjerano reÄi da sam za taj diplomski 1998-e iz knjige ruÄno prekucao 50% kĆ“da koji danas Äini MML š®š. SjediÅ” pred kompjuterom, knjiga pored tebe i prekucavaÅ” … solveri za linearne sisteme, eigen solveri, solveri za sustave diferencijalnih jednadžbi, Newton-Raphson minimization i jakobijani …
I ne samo to!
Moj diplomski je bio (o neba ti, moram poÄi pogledati toÄan naziv š¤£) “Programsko okružje za analizu nelinearnih dinamiÄkih sustava” u kojem si mogao u GUI okruženju ruÄno unijeti (diferencijalne) jednadžbe sustava, koje bi zatim program rijeÅ”io i vizualizirao, a Å”to je nivo iznad danaÅ”njeg MML-a jer je to znaÄilo izgraditi kompletni RPN parser i evaluator s obzirom da jednadžbe ne dobijeÅ” u finom C++ kĆ“du kojeg možeÅ” dati kompajleru da prevede, veÄ ih dobijeÅ” u stringu kojeg tek treba pretvoriti u neÅ”to Å”to možeÅ” evaluirati.
Za zainteresirane (ljubitelje loÅ”eg kĆ“da š¤£), evo link na repozitorij – https://github.com/zvanjak/NonLinearSystemSolver – kad sam ga kreirao prije 8 godina, uspjeÅ”no se prevodio u tadaÅ”njem Visual Studiu, a nekako mi je u sjeÄanju da sam ga i prije godinu dvije uspjeÅ”no pokrenuo (Microsoft backward compatibility na Windowsima je inženjersko Äudo bez premca!), a moguÄnost evaluiranja matematiÄkih izraza (i ne samo izraza) danih C++ programu kroz stringove me dovoljno zaintrigirala da sam projekt ExpressionEvaluator https://github.com/zvanjak/ExpressionEvaluator doveo Äak u koliko toliko prezentabilno stanje.
Iz tog silnog prekucavanja C kĆ“da se sjeÄam zajebancije s Äinjenicom da u su tom prvom izdanju Numerical Recipesa autori u implementacijama algoritama koristili indekse po matematiÄkoj notaciji, ergo for(i=1; i<=n; i++), totalno neprirodno za C (i vodilo je tome da su kod predavanja standardnog C polja u takvu funkciju morali predavati poÄetnu adresu umanjenu za 1), pa sam ja pripametan sve te petlje iÅ”ao reindeksirati u normalni C kĆ“d … i napatio se poÅ”teno dok sam sve pogodio kako treba.
Diplomski je odraÄen, a NonLinSolver i pripadni Mathlib su poÄeli skupljati praÅ”inu na disku dok sam se ja u magisteriju i doktoratu posvetio istraživanju tehnika (heuristiÄke) optimizacije, nakon Äega je nadoÅ”ao i život, “ozbiljno” programiranje, obitelj … klasika.
I onda sam zadnjih pola godine zaorao šŖ. Zaozbiljno.
Ima dobrih godinu i po dana da me je ponovno uhvatila ozbiljna fascinacija fizikom, poglavito opÄom teorijom relativnosti, i u bottom-up pristupu mojim istraživanjima sam odluÄio revitalizirati stari Mathlib, i kreirati moj novi matematiÄki library, s osnovnim ciljem da s njime mogu izraÄunati, na jednostavan naÄin, sve Å”to mi treba u mojim istraživanjima razliÄitih fizikalnih pojava.
Ovo je trenutni rezultat:

Pri Äemu programi iskoriÅ”teni za kreiranje ovih slika (ja ih zovem “visualizators”) u stvari uopÄe nemaju veze s MML-om per se š¤£. Skup eksternih alata, napisanih u C#u koriÅ”tenjem WPF-a, koji kao ulaz dobijaju obiÄne tekstualne fajlove producirane iz MML-a i lijepo ih vizualiziraju.
Slika 1 – tri komponente rjeÅ”enja diferencijalnih jednadžbi Lorentzovog sistema (Äitaj zaÄeci teorije kaosa i porijeklo “butterfly effect”)
Slika 2 – isto to, ali vizualizirano u 3D, da se lijepo vidi Lorenzov atraktor
Slika 3 – trenutno mi nepotrebni surface vizualizator u 2D, ali .. bilo mi lako usput i lijepo izgleda
Slika 4 – gravitacijsko (vektorsko) polje 4 tijela
“OK Zvone, sve je to lijepo, lijepa povijest, lijepe slike, ali Å”to je taj … MML”?
Executive summary:
MML ( https://github.com/zvanjak/MML ), skraÄenica od Minimal Math Library je single-header biblioteka, odnosno skup funkcija i klasa pisanih u C++u, s primarnim fokusom na lakoÄu koriÅ”tenja i vjerno modeliranje razliÄitih matematiÄkih koncepata poput vektora, matrica, tenzora, polinoma, funkcija, koordinatnih transformacija, krivulja i povrÅ”inauz pripadni skup implementiranih algoritama za rjeÅ”avanje linearnih sistema jednažbi, sistema diferencijalnih jednadžbi, numeriÄku integraciju i derivaciju, interpolirane funkcije i joÅ” Å”toÅ”ta.
Äini ga oko 16.000 linija kĆ“da u jednom lako ukljuÄivom i C++17 cross-platforme header fajlu (ovisnom iskljuÄivo o Standard C++ Libraryu, no Boost, no nothing!), pri Äemu je nužno naglasiti da je prikladan iskljuÄivo za osobnu/istraživaÄku upotrebu jer su implementacije svih algoritama iz Numerical Recipesa, na koje kao vlasnik sva tri izdanja knjige Numerical Recipes in C/C++ imam pravo, ali, Äak i za Open Surce upotrebu je off-limits, zahvaljujuÄi ekstra restriktivnoj Numerical Recipes licenci š¢.
No, ako kao ja imate inklinaciju prema istraživanju razliÄitih fizikalnih pojava, a Å”to se u gotovo svakom realnom sluÄaju svodi na koriÅ”tenje razliÄitih numeriÄkih metoda (plain and simple, sve pametno Å”to se može zakljuÄiti iz ANALITIÄKIH rjeÅ”enja fizikalnih problema je veÄ dostupno kao znanje u knjigama/na internetu i nema potrebe za ikakvim numeriÄkim muÄenjem), onda bi vam MML mogao doÄi zgodno.
Bit Äe sigurno puno onih koji Äe reagirati s – “Sve to veÄ ima u raznoraznim C++ bibliotekama”!!!!
Ima! Eigen, Armadillo, Boost, … take your pick … od generalnih koje se trude postiÄi completeness (koji je i moj cilj), do specifiÄnih za svako moguÄe zamislivo podruÄje.
Jedan dio odgovora na pitanje “Äemu sve to” je ono klasiÄno – putovanje je važnije od cilja.
Proteklih Å”est mjeseci intezivnog druženja s C++om je bilo ā¤ļøā¤ļøā¤ļø, ali se isto tako mora reÄi da do sada nisam ni blizu u implementaciji MML-a iskoristio sve moguÄnosti modernog C++a i ima se puno joÅ” za uÄiti/popraviti. Primjerice, moja implementacija numeriÄkih derivatora je popriliÄno “poglupljivanje” Boost implementacije, s njenim finim templateiziranim implementacijama za razliÄite redove, no zato MML može (numeriÄki) derivirati sve – od realne funkcije, skalarne funkcije, vektorske funkcije, parametrizirane krivulje do tenzorskog polja.
Drugi dio odgovora na pitanje “Äemu sve to” je nestandardan, može ga se sažeti u jednu rijeÄ (i moju najÄeÅ”Äu ispriku kaÅ”njenja na veÄeru) … tenzori ā¤ļøā¤ļøā¤ļø.
Taj magiÄni matematiÄki objekt, koji me proganja joÅ” iz srednjeÅ”kolske zaljubljenosti fizikom kad se manifestirao u momentima inercije, pa onda pokuÅ”aji shvaÄanja definicije iz Kurepine “KonaÄno dimenzionalni vektorski prostori” (kako ono ide, “Tenzor T je multilinearna mapa nad …. š¤£š¤£š¤£). Gravitation od Whelera i Thorna je dosta pomogla, a danas, zahvaljujuÄi finoj gomili od 30ak knjiga posveÄenih toj temi, mogu reÄi da polako poÄinjem kužiti tenzore.
Ne da bi iÅ”ta znao s njima izraÄunati, saÄuvaj Bože š¤£. Za to nauÄiti bi trebalo potroÅ”iti silne i silne sate u old school rjeÅ”avanju stotina matematiÄkih zadataka š. Ali, znam kako iz dane konfiguracije naboja i struja mogu izraÄunati EM tenzor (preciznije, tenzor elektromagnetskog polja), provjeriti je li izraÄunato Å”tima preko Poyntingovog vektora, a onda i verificirati funkcije za transformaciju tenzora, koje doduÅ”e tek trebam implementirati (u ovoj reÄenici je manje viÅ”e moj plan i program za iduÄih mjesec dana š).
Well, nema librarya koji tako neÅ”to omoguÄuje na elegantan i jednostavan naÄin … i moj cilj je da MML to može šŖ.
Nakon Å”to verificiram sve algoritme na EM tenzoru, u ipak dosta jasnom kontekstu elektrodinamike, ide ultimativni izazov … proraÄuni metriÄkog tenzora u opÄoj relativnosti.
Ima doduÅ”e joÅ” posla oko popravljana i verifikacije (Äitaj unit-testovi) baze koja je veÄ implementirana (da ne priÄam o dokumentaciji š – ali, /src direktorij u repozitoriju ima gooomilu demo konzolnih aplikacija s primjerima koriÅ”tenja, pa nije baÅ” sve tako crno), tako da Äe možda i potrajati dok se ono full ozbiljno posvetim tenzorima opÄe teorije relativnost, ali raÄunam da Äu do 50-tog roÄendana to svakako obaviti š.
Deset mjeseci i neÅ”to sitno … trebalo bi biti dosta.
2 thoughts on “MML – Minimal Math Library, release 0.5 š”