Subject description - B0M36SPJ

Summary of Study | Summary of Branches | All Subject Groups | All Subjects | List of Roles | Explanatory Notes               Instructions
B0M36SPJ Scientific Programing in Julia
Roles:  Extent of teaching:2P+2C
Department:13136 Language of teaching:CS
Guarantors:Pevný T., Šmídl V. Completion:KZ
Lecturers:Pevný T., Šmídl V. Credits:4
Tutors:Franců J., Heim N., Pevný T., Šmídl V., Zorek M. Semester:Z

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:
2. Bezanson, Jeff, et al. Julia: A fresh approach to numerical computing. SIAM review 59.1 (2017): 65-98.
3. Lauwens, Ben, and Allen B. Downey. Think Julia: how to think like a computer scientist. O'Reilly Media, 2019.
4. Julia Documentation. https://docs.julialang.org/en/v1/manual/documentation/index.html

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)