From baf6109de482cfca5fdde73ed3eef91a7246635a Mon Sep 17 00:00:00 2001 From: Mirek Kratochvil <exa.exa@gmail.com> Date: Wed, 22 Mar 2023 18:44:01 +0100 Subject: [PATCH] julia 6 --- .../slides/6a-types.md | 137 ++++++++++++++++++ .../slides/img/favicon.ico | Bin 0 -> 118902 bytes .../slides/img/julia.svg | 1 + .../slides/index.md | 28 ++++ .../slides/list.json | 4 + 5 files changed, 170 insertions(+) create mode 100644 2023/2023-03-23_ProgrammingWithJulia-6/slides/6a-types.md create mode 100644 2023/2023-03-23_ProgrammingWithJulia-6/slides/img/favicon.ico create mode 100644 2023/2023-03-23_ProgrammingWithJulia-6/slides/img/julia.svg create mode 100644 2023/2023-03-23_ProgrammingWithJulia-6/slides/index.md create mode 100644 2023/2023-03-23_ProgrammingWithJulia-6/slides/list.json diff --git a/2023/2023-03-23_ProgrammingWithJulia-6/slides/6a-types.md b/2023/2023-03-23_ProgrammingWithJulia-6/slides/6a-types.md new file mode 100644 index 00000000..c7a6b7f9 --- /dev/null +++ b/2023/2023-03-23_ProgrammingWithJulia-6/slides/6a-types.md @@ -0,0 +1,137 @@ + +<div class=leader> +<i class="twa twa-locomotive"></i> +<i class="twa twa-helicopter"></i> +<i class="twa twa-police-car"></i> +<i class="twa twa-trolleybus"></i> +<br> +Data and their types +</div> + + + +# What are types? + +Types are a small domain-specific metalanguage that allows programs to *prove facts* about other programs + +- originally from set theory (after Russel's disaster, preceding the Gödel's disaster) +- the classes of provable facts vary: + - in λ-calculi, types are theorems that often uniquely determine code + - in <i class="twa twa-snake"></i>, types are more like comments that do not prove anything + - in many languages, types determine the format of data interfaces and data + + +Julia types: +- determine the format of data +- may carry additional information! +- may be materialized ("reified") and used at runtime + + + +# Types in Julia + +Primitive types: `Int32`, `UInt64`, `Float32`, `Char`, `Nothing`, `Function`, ... + +Compound types: +```julia +struct FloatComplex + re::Float64 + im::Float64 +end +``` + + + +# Types in Julia + +Parametrized types: `Tuple{...}`, `Array{...}`, `NTuple{N, ...}`, ... + +Type aliases: +```julia +const Vector{X} = Array{X, 1} +``` + +Abstract types (organized with `<:`): +```julia +abstract type Anything end +struct Something <: Anything + ... +end +``` + +`Union` and `UnionAll` types: +```julia +const Maybe{X} = Union{Nothing, X} +const VectorOfReals = (Vector{T} where {T<:Real}) +``` + + + +# How does dispatch work? + +Upon a function call, Julia selects the *least generic* method of the function +- the ordering is defined by `<:` on parameter types +- dispatch on multiple parameters is possible and (quite) efficient + - this is the main difference from many other languages! +- dispatch on multiple parameters may be ambiguous! + +```julia +julia> f(::Real, ::Int) = 1 +f (generic function with 1 method) + +julia> f(::Int, ::Real) = 2 +f (generic function with 2 methods) + +julia> f(1,2) +ERROR: MethodError: f(::Int64, ::Int64) is ambiguous. +``` + + + +# How does dispatch work? + +Upon a function call, Julia selects the *least generic* method of the function. +- the call is specialized +- size of primitive types MAY be known (their data may be placed directly into registers or arrays) +- size of abstract types may NOT be known (their data must be *boxed*) + +Compare: +- `sizeof(['a','b'])`, `sizeof([1.1f0, 2.2f0])`, `sizeof([1.1f0, 'b'])` +- function specialization possibilities: + - `function f(x::Any)` + - `function f(x::Int)` + - `function f(x)`, which is internally `function f(x::T) where {T}` + + + +# Exercise: let's make a ZOO + +Zoo has: +- <i class="twa twa-elephant"></i> (with a numeric weight) +- <i class="twa twa-penguin"></i> (each with a name) +- <i class="twa twa-lion"></i> (each of which may be hungry or not) + +These are hierarchically organized: +- there may be <i class="twa twa-soft-ice-cream"></i> stands +- some things are grouped at the same place +- there may be signposted <i class="twa twa-information"></i><i class="twa twa-up-right-arrow"></i> paths that lead to a farther thing +- some things are placed in <i class="twa twa-construction"></i>enclosures<i class="twa twa-construction"></i> + +"You arrive at the zoo. There's a satiated lion and a small elephant, and also a signpost saying `penguins this way`. If you go that way, there are 5 penguins in an enclosure and an ice cream stand." + + + +# Exercises: ZOO + +Make functions that: +- count all penguins +- compute the weight of everything in the zoo +- make all animals in the zoo do their typical sound (`nudge(myZoo)`) +- find the most hidden animals in the zoo (they are behind the most signs) +- find all paths to hungry lions that are not in an enclosure +- print out a text description of the zoo +- convert a Julia datatype to your custom zoo datatype + - `(:penguin, "El Jefe")`, `:hungry_lion`, `:satiated_lion`, `(:elephant, 50.0)`, `:ice_cream_stand` + - groups of things are in a vector + - signposted paths are made of Pairs (`"Penguins go here" => [(:penguin, ...), ....]`) + - `throw` a good error if some data cannot be processed diff --git a/2023/2023-03-23_ProgrammingWithJulia-6/slides/img/favicon.ico b/2023/2023-03-23_ProgrammingWithJulia-6/slides/img/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..5f340eacbd179e33bf4d529bec139e5fdc1b8b43 GIT binary patch literal 118902 zcmeGl2|Sd|`(1JrNtbkp<mhy?u5}lEl`j2Djv^gjx{Guwwp3Ii*Rnz-x^t$x=&mKC zbgGoEq6<+Z?EjfPv~9aA*5=yZZ+709civ~7WA1t884SZ=oiX&oVG5Xr0)~;`nMkCE zhlt~_TM%bz$_S6aurEV!n1%*Dd{i03WR~KvAw%flMg1`B%3gp3-ynELr7=w91P+sx zrH8#CtBi{{tXD63_?#$)&Af@jq#+$jzo-+2Nu}ekot9I^b?wrx3x;7`CyY1$A9{<N zIHbpByBuAJVe;h@%ty~y|LpUN4UWCPoi{FiU!8IHmg15RLeJbr+diCeX4%PpmMfF{ z9eWf%KH=rZ9svr;r%s(ozWn3-!==lY@9r__g}e2ziBU6CEnX<}5yk~zQT|q=FH;or zuF1G$q`OfS6w>ax1Q6aw;5V3fEFQlwlHl}?uzKMSsRKd(vltq~{<q6bNzU}<qpWe6 zlM@1_PFyj5kzTOprn2g8N-CSqo7~qw{rzzA&lvpiC-;Sl$tMnfn^LLRdGV^FCR-{K zMo-n)D5NKLU<T13S!3r$?BeJrQdu+gE(LehxwiJv;Z@mgy~nQk867h1{5T1PjF^z` z1-<ezu6KQ~NX18Juatsx%u`Kbx%ee-xuhY4w^;$ZJYH4Clr25*Y>I?}RM!Z1_m!&B zp^l+(jtc!vqbz&vBj!k6`d2d3cJ0r@+Sze?cKOJdhL2Y_ikqb<c1vS^5Al$z`-)!t zbPVeMeB;`uL2KkEcugBw`o<#K*Wdoxx=xyhh3<	T9OPc$sL*1mB^y4)Jqw;v?k7 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 literal 0 HcmV?d00001 diff --git a/2023/2023-03-23_ProgrammingWithJulia-6/slides/img/julia.svg b/2023/2023-03-23_ProgrammingWithJulia-6/slides/img/julia.svg new file mode 100644 index 00000000..73d8f42f --- /dev/null +++ b/2023/2023-03-23_ProgrammingWithJulia-6/slides/img/julia.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 153.14 98.64"><defs><style>.cls-1{fill:#1a1a1a}.cls-2{fill:#4d64ae}.cls-3{fill:#ca3c32}.cls-4{fill:#9259a3}.cls-5{fill:#399746}</style></defs><title>Asset 2</title><g id="Layer_2" data-name="Layer 2"><g id="Layer_1-2" data-name="Layer 1"><g id="layer1"><g id="g3855"><g id="g945"><g id="g984"><g id="g920"><path id="path3804" d="M93.14,80.94h-13V21.13l13-3.58Z" class="cls-1"/><g id="g898"><g id="g893"><path id="path19" d="M22.17,36.33a8.9,8.9,0,1,1,8.9-8.9A8.91,8.91,0,0,1,22.17,36.33Z" class="cls-2"/></g><path id="path3819" d="M29.14,80.83A26.48,26.48,0,0,1,27.83,90a12.12,12.12,0,0,1-3.62,5.4A12.33,12.33,0,0,1,18.57,98a36.64,36.64,0,0,1-7.32.67,22.47,22.47,0,0,1-4.81-.47A13,13,0,0,1,2.9,96.93,6,6,0,0,1,.76,95.07,3.62,3.62,0,0,1,0,92.88,4.26,4.26,0,0,1,1.59,89.5a6.47,6.47,0,0,1,4.33-1.35,5,5,0,0,1,1.87.32,6,6,0,0,1,1.43.79,12,12,0,0,1,1.16,1.07c.31.4.59.77.83,1.12A7.58,7.58,0,0,0,12.72,93a2.3,2.3,0,0,0,1.15.4,1.85,1.85,0,0,0,1-.28,2,2,0,0,0,.71-1,7.18,7.18,0,0,0,.4-1.91,23.12,23.12,0,0,0,.16-3.06V40.48l13-3.58Z" class="cls-1"/></g><path id="path3802" d="M48.14,37.94V68a6.14,6.14,0,0,0,.47,2.39A6.45,6.45,0,0,0,50,72.24a7,7,0,0,0,2,1.27,6.12,6.12,0,0,0,2.4.48,4.2,4.2,0,0,0,1.61-.4,8.42,8.42,0,0,0,1.8-1.12,13.27,13.27,0,0,0,1.81-1.66,12.92,12.92,0,0,0,1.61-2.11V37.94h13v43h-13v-4a22.47,22.47,0,0,1-5.43,3.53,13.62,13.62,0,0,1-5.59,1.28,16.52,16.52,0,0,1-5.9-1,15.59,15.59,0,0,1-4.76-2.89,13.56,13.56,0,0,1-3.17-4.28,12.41,12.41,0,0,1-1.15-5.29V37.94Z" class="cls-1"/><g id="g905"><g id="g890"><path id="path13" d="M105.79,36.33a8.9,8.9,0,1,1,8.91-8.9A8.91,8.91,0,0,1,105.79,36.33Z" class="cls-3"/><path id="path25" d="M127.18,36.33a8.9,8.9,0,1,1,8.91-8.9A8.91,8.91,0,0,1,127.18,36.33Z" class="cls-4"/><path id="path31" d="M116.49,17.8a8.9,8.9,0,1,1,8.9-8.9,8.89,8.89,0,0,1-8.9,8.9Z" class="cls-5"/></g><path id="path3823" d="M100.14,40.6l13-3.58V80.94h-13Z" class="cls-1"/></g><path id="path3808" d="M140.14,58.77a37.64,37.64,0,0,0-3.77,1.87,21.89,21.89,0,0,0-3.46,2.3,12.77,12.77,0,0,0-2.55,2.67,5.12,5.12,0,0,0-1,2.94,8.53,8.53,0,0,0,.32,2.34,7,7,0,0,0,.87,1.91,5.15,5.15,0,0,0,1.23,1.27,2.67,2.67,0,0,0,1.51.48,6.3,6.3,0,0,0,3.18-1,41.31,41.31,0,0,0,3.62-2.47Zm13,22.17h-13V77.52c-.71.61-1.42,1.17-2.11,1.67a14.2,14.2,0,0,1-2.3,1.35,13.56,13.56,0,0,1-2.82.88,19.75,19.75,0,0,1-3.78.31,16,16,0,0,1-5.33-.83,12.23,12.23,0,0,1-4-2.31,10.23,10.23,0,0,1-2.51-3.53,11,11,0,0,1-.87-4.37,10.27,10.27,0,0,1,.91-4.42,13.11,13.11,0,0,1,2.55-3.57,19.36,19.36,0,0,1,3.77-2.86,40.26,40.26,0,0,1,4.65-2.31c1.67-.69,3.4-1.32,5.17-1.91l5.25-1.71,1.43-.31V49.34a11.91,11.91,0,0,0-.44-3.45,5.82,5.82,0,0,0-1.15-2.31,4,4,0,0,0-1.79-1.31,6.6,6.6,0,0,0-2.34-.4,7.38,7.38,0,0,0-2.59.4,4.37,4.37,0,0,0-1.67,1.11,3.94,3.94,0,0,0-.91,1.59,6.52,6.52,0,0,0-.28,2,9.51,9.51,0,0,1-.28,2.35,4.85,4.85,0,0,1-.91,2A4.47,4.47,0,0,1,126,52.6a6.84,6.84,0,0,1-2.9.52,7.51,7.51,0,0,1-2.51-.4,6.16,6.16,0,0,1-1.91-1.15,6,6,0,0,1-1.27-1.75,5.59,5.59,0,0,1-.44-2.18,6.42,6.42,0,0,1,1.51-4.1,13.16,13.16,0,0,1,4.06-3.3,23.45,23.45,0,0,1,5.92-2.14,31.07,31.07,0,0,1,7.12-.8,32.21,32.21,0,0,1,7.87.84,16.37,16.37,0,0,1,5.49,2.34,9.55,9.55,0,0,1,3.18,3.66,10.91,10.91,0,0,1,1,4.81Z" class="cls-1"/></g></g></g></g></g></g></g></svg> \ No newline at end of file diff --git a/2023/2023-03-23_ProgrammingWithJulia-6/slides/index.md b/2023/2023-03-23_ProgrammingWithJulia-6/slides/index.md new file mode 100644 index 00000000..359477ee --- /dev/null +++ b/2023/2023-03-23_ProgrammingWithJulia-6/slides/index.md @@ -0,0 +1,28 @@ + +# Programming with Julia + +## March 2023 + +<div style="top: 6em; left: 0%; position: absolute;"> + <img src="theme/img/lcsb_bg.png"> +</div> + +<div style="top: 1em; left: 60%; position: absolute;"> + <img src="slides/img/julia.svg" height="200px"> + <h1 style="margin-top:3ex; margin-bottom:3ex;">6: Types and dispatch</h1> + <h4> + Miroslav KratochvÃl<br> + Laurent Heirendt<br> + LCSB, DSSE<br> + </h4> +</div> + +<link rel="stylesheet" href="https://lcsb-biocore.github.io/icons-mirror/twemoji-amazing.css"> +<style> + code {border: 2pt dotted #f80; padding: .4ex; border-radius: .7ex; color:#444; } + .reveal pre code {border: 0; font-size: 18pt; line-height:27pt;} + em {color: #e02;} + li {margin-bottom: 1ex;} + div.leader {font-size:400%; line-height:120%; font-weight:bold; margin: 1em;} + section {padding-bottom: 10em;} +</style> diff --git a/2023/2023-03-23_ProgrammingWithJulia-6/slides/list.json b/2023/2023-03-23_ProgrammingWithJulia-6/slides/list.json new file mode 100644 index 00000000..26c79406 --- /dev/null +++ b/2023/2023-03-23_ProgrammingWithJulia-6/slides/list.json @@ -0,0 +1,4 @@ +[ + { "filename": "index.md" }, + { "filename": "6a-types.md" } +] -- GitLab