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 thoughts on “MML – Minimal Math Library, release 0.5 šŸ˜Ž

Odgovori