Summary of Study |
Summary of Branches |
All Subject Groups |
All Subjects |
List of Roles |
Explanatory Notes
Instructions
Web page:
https://juliateachingctu.github.io/Scientific-Programming-in-Julia/dev/
Anotation:
V rámci předmětu budou představeny unikátní vlastnosti jazyka Julia, např. jeho typový systém, návrhový vzor multiple dispatch, metaprogramování, generování a manipulace kódu. Tyto vlastnosti umožňují velmi rychlý a snadný návrh algoritmů, jejich výpočetní efektivita je srovnatelná s implementací v nízko úrovňovém jazyce (např. C nebo Fortran). Tyto koncepty a jejich efektivita budou představeny na běžných vědeckých úlohách jako je implementace obecného algoritmu gradientního sestupu a výpočet diferenciálních rovnic. Bude ukázáno, že obecně navržené základní algoritmy umožňují bez modifikace i pokročilé funkce jako je výpočet propagace neurčitosti v rámci řešení diferenciální rovnice nebo optimalizaci řešení diferenciální rovnice metodou gradientního sestupu. V rámci cvičení budou studenti tvořit vlastní implementace těchto algoritmů.
Content:
Návrh vědeckých výpočtů je specifickou oblastí programování, ve které je kladen důraz na: i) rychlé a snadné navržení nového algoritmu, ii) pokud možno co nejrychlejší spuštění výsledného kódu, iii) obecnost kódu umožňující snadné použití algoritmu např. s jiným typem vstupu. Splnění všech těchto požadavků je velmi náročné a proto jsou stávající prostředí pro tvorbu vědeckých programů založena na kombinaci dvou různých jazyků. V jazyce nízké úrovně (Fortran, C, C++) je napsána knihovna, jejíž funkce volá skriptovací jazyk (Matlab, Python, R). Pokud je potřeba implementovat nový algoritmus nebo modifikovat stávající, je třeba přepsat knihovnu nebo se smířit s neefektivním výpočtem kódu skriptovacího jazyka. Ačkoliv existují pokusy překlenout mezeru mezi těmito dvěma jazyky (např. projekt Cython), nejsou pro svou složitost příliš rozšířené. Jazyk Julia byl od počátku navržen jako jazyk pro vědecké výpočty s důrazem na řešení zmíněných problémů, které nejsou uspokojivě řešeny stávajícími nástroji. Obsahuje nové návrhové vzory, např. multiple-dispatch, pro snadnou rozšiřitelnost (jako zobecnění objektově orientovaného a funkcionálního programování), unikátní nástroje pro manipulaci s kódem, díky nimž je rychlost výsledného kódu srovnatelná s C a C++.
Na fakultě se v současné době vyučují Matlab, Python i R jako současné standardy v daných oborech. Domníváme se, že jazyk Julia má významnou šanci pozici těchto nástrojů v budoucnu doplnit a postupně pro některé typy výpočtů nahradit. Inovace představené v jazyce Julia mohou také pronikat do ostatních jazyků a vytvořit novou třídu jazyků. V rámci předmětu seznámíme studenty se základními koncepty používanými v jazyce, z nichž některé nejsou ještě vyučovány v žádném existujícím kurzu (např. metaprogramování, automatické generování kódu, pokročilá makra, multiple dispatch). Tento předmět rozšiřuje studentům znalosti programování z předmětů zabývajících se programovacími jazyky: PRP (procedurální programování), PJV (Java), CPP (C++), PDV (paralelní programování), FUP (funkcionálních programování), ESW (efektivní software). Současně nabízí alternativní prostředí pro implementaci vědeckých projektů, které se vyučují v předmětech MTB (Matlab) a SAN (statistická analýza dat). Bakalářská forma jazyka Julia je předkládána současně s tímto předmětem. Absolvování bakalářského předmětu usnadní studentovi první tři lekce, všechny ostatní jsou nadstavba, předmět tak lze absolvovat samostatně.
Vyučované koncepty programovacího jazyka budou představeny na příkladech běžných vědeckých úloh jako je implementace optimalizačních úloh (metoda gradientního sestupu) a výpočet diferenciálních rovnic. Hlavní výhody nového jazyka budou demonstrovány na tom, jak snadné je dosáhnout pokročilých algoritmů, například automatického derivování funkcí (nejen neuronových sítí), propagace neurčitosti diferenciální rovnicí a optimalizace modelu diferenciální rovnice podle měřených dat.
Prvních 7 lekcí se zabývá hlavními rys y jazyka a představuje je na jednoduchých příkladech jako je implementace aritmetických operací s intervaly a optimalizační metodě gradientního sestupu. Po absolvování těchto lekcí student(ka) získá ucelenou představu o nástrojích jazyka, jeho logice a způsobu použití. Bude seznámen(a) s vhodnými návyky práce, které se odlišují od zvyků z jazyků Matlab nebo Python.
Posledních šest lekcí demonstruje vlastnosti a výhody jazyka na běžných vědeckých úlohách. Implementace postupů z automatického derivování je provedena dvěma způsoby: použitím typu duální číslo pro dopředné vyhodnocení a manipulací kódu pro zpětné vyhodnocení. Bude ukázáno jak lze využít balíček intervalové aritmetiky vyvinutý v první části kurzu pro řešení úlohy propagace neurčitosti řešičem diferenciálních rovnic. Vyvinutý algoritmus gradient descent a automatická derivace budou použity na optimalizaci parametrů diferenciální rovnice z naměřených dat.
Course outlines:
1. | | Úvod do Julie, syntax, funkce, základní konstrukty |
2. | | Typový systém a koncept multiple dispatch |
3. | | Balíčkovací systém, prostředí, testy, integrace |
4. | | Návrhové vzory, scope, closure, interface |
5. | | Ladění výpočetní efektivity, benchmarks, profilování |
6. | | Introspekce jazyka, abstract syntax tree, základní modifikace kódu |
7. | | Makra, rozdíl oproti funkcím, implementace doménových jazyků |
8. | | Úvod do automatického derivování |
9. | | Manipulace s reprezentací kódu, automatické generování kódu |
10. | | Různé úrovně paralelního programování |
11. | | Programování na grafické kartě |
12. | | Propagace neurčitosti diferenciální rovnicí |
13. | | Optimalizace ODE z měřených dat |
Exercises outline:
1. | | Seznámení s prostředím, základní úlohy |
2. | | Typový systém čísel, návrh typu pro intervalovou aritmetiku včetně operací |
3. | | Vytvoření balíčku pro intervalovou aritmetiku |
4. | | Návrhové vzory v implementaci gradientního sestupu (minibatching, ukládání mezivýsledků, atd.) |
5. | | Odladění neefektivně napsaných příkladů |
6. | | Výpis abstract syntax tree funkce jako stromové struktury |
7. | | Tvorba makra pro zápis řetězení funkcí |
8. | | Implementace metody forwarddiff s duálními čísly |
9. | | Implementace reverse diff manipulací kódu |
10. | | Paralelizace výpočtů lineární algebry |
11. | | Implementace intervalové aritmetiky na GPU |
12. | | Propagace neurčitosti modelem Lotka-Volterra |
13. | | Učení parametrů Lotka-Voltera modelu z dat |
Literature:
Povinná literatura:
1. | | Tom Kwong , Hands-On Design Patterns and Best Practices with Julia, 2019 |
Doporučená literatura:
Requirements:
Předmět předpokládá pouze základy programování, základy optimalizace a diferenciálních rovnic. Výhodou je absolvování předmětu Funkcionální programování, případně bakalářského kurzu jazyka Julia.
Subject is included into these academic programs:
Program |
Branch |
Role |
Recommended semester |
Page updated 4.12.2024 17:51:26, semester: Z,L/2024-5, Z/2025-6, Send comments about the content to the Administrators of the Academic Programs |
Proposal and Realization: I. Halaška (K336), J. Novák (K336) |