MML – Minimal Math Library, release 0.5 😎

MML – Minimal Math Library, release 0.5 😎

Č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 misli o “MML – Minimal Math Library, release 0.5 😎

Komentiraj