From d9f18fc5399fc2ca02b3c260aba190de977b2420 Mon Sep 17 00:00:00 2001 From: Anson Date: Tue, 24 Aug 2021 00:59:25 -0700 Subject: [PATCH] brought back the scope a ton and finished --- AeroTech_F10.csv | 28 ---- AeroTech_G8ST.csv | 22 --- Estes_F15.csv | 28 ---- copernicus.grib | Bin 248760 -> 0 bytes index.html | 4 +- index.jl | 347 +++++++++++----------------------------------- 6 files changed, 82 insertions(+), 347 deletions(-) delete mode 100644 AeroTech_F10.csv delete mode 100644 AeroTech_G8ST.csv delete mode 100644 Estes_F15.csv delete mode 100644 copernicus.grib diff --git a/AeroTech_F10.csv b/AeroTech_F10.csv deleted file mode 100644 index 2caa463..0000000 --- a/AeroTech_F10.csv +++ /dev/null @@ -1,28 +0,0 @@ -Time,Thrust -0.01,16.81 -0.03,22.34 -0.11,22.23 -0.26,21.49 -0.37,20 -0.47,20.21 -0.67,18.09 -0.99,15.74 -1.31,13.4 -1.81,10.85 -2.49,10.21 -3.13,8.94 -3.6,8.83 -4.11,8.62 -4.95,8.62 -5.45,8.62 -5.58,8.51 -5.88,8.72 -6.22,8.51 -6.46,8.51 -6.6,7.77 -6.71,7.02 -6.79,5.64 -6.91,3.83 -6.95,2.23 -7,0.96 -7.05,0 diff --git a/AeroTech_G8ST.csv b/AeroTech_G8ST.csv deleted file mode 100644 index 17db4eb..0000000 --- a/AeroTech_G8ST.csv +++ /dev/null @@ -1,22 +0,0 @@ -Time,Thrust -0.024,0.3704 -0.066,0.8746 -0.138,4.5044 -0.246,6.6207 -0.426,6.7351 -1.218,7.3232 -2.082,7.423 -3.306,7.183 -5.322,6.8385 -6.978,6.7193 -8.632,6.5512 -10.144,6.4792 -12.088,6.4254 -15.472,6.3333 -17.632,6.1305 -19.108,6.0385 -19.511,5.9607 -19.804,4.4295 -19.867,1.6687 -19.937,0.3341 -19.964,0 diff --git a/Estes_F15.csv b/Estes_F15.csv deleted file mode 100644 index f385247..0000000 --- a/Estes_F15.csv +++ /dev/null @@ -1,28 +0,0 @@ -Time,Thrust -0,0 -0.148,7.638 -0.228,12.253 -0.294,16.391 -0.353,20.21 -0.382,22.756 -0.419,25.26 -0.477,23.074 -0.52,20.845 -0.593,19.093 -0.688,17.5 -0.855,16.225 -1.037,15.427 -1.205,14.948 -1.423,14.627 -1.452,15.741 -1.503,14.785 -1.736,14.623 -1.955,14.303 -2.21,14.141 -2.494,13.819 -2.763,13.338 -3.12,13.334 -3.382,13.013 -3.404,9.352 -3.418,4.895 -3.45,0 diff --git a/copernicus.grib b/copernicus.grib deleted file mode 100644 index 055f0b8db12bed0c7329e0d4c015c6457b9dc2af..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 248760 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 H diff --git a/index.jl b/index.jl index 092d060..4e43f9f 100644 --- a/index.jl +++ b/index.jl @@ -16,21 +16,17 @@ using LinearAlgebra # ╔═╡ 52819547-9593-446a-91e7-a08e08723e66 using Plots +# ╔═╡ c231f030-5861-4b30-a182-efc06b5c08fe +using BenchmarkTools + # ╔═╡ 3228a21e-cab8-4738-bdc5-a6827c764c06 using Unitful -# ╔═╡ 3f7ae2df-9d4d-46d3-b12e-22107a560b66 -begin - using CSV - using DataFrames - using FileIO -end - # ╔═╡ bb461e00-c0aa-11eb-2c7d-1bd1591779c6 md""" # Julia for People That Were Unfortunate Enough to Learn MATLAB -Julia is an incredily performant _(2 order of magnitude faster than Matlab)_, Dynamic _(Data types dont need to be declared unlike C)_, Composable _(The compiler is smart enough to allow functions you write to work for multiple different types of data)_, and most importantly for our use case Julia has very simple syntax that focuses on engineering / science applications. +Julia is an incredily [performant](https://julialang.org/benchmarks/) _(2 order of magnitude faster than Matlab)_, Dynamic _(Data types dont need to be declared unlike C)_, Composable _(The compiler is smart enough to allow functions you write to work for multiple different types of data)_, and most importantly for our use case Julia has very simple syntax that focuses on engineering / science applications. !!! info "Pluto Notebooks" The code in this notebook is running in something called Pluto.jl. Pluto notebooks are similar to Matlab Livescript but have a stricter focus on cells and are immutable meaning that a variable can only be declared once and cannot be changed in other cells. This feels very restricting at first but guarantees that the code you are currently looking at is correct, and allows reactive updating of dependant code. It's important to note that these are Pluto.jl features and not Julia features. @@ -42,8 +38,6 @@ md""" To get started, I want to focus on things that Matlab does that are outlandish and make little sense and compare them to things Julia does. Julia is obviously not perfect, but being that it's one of the newest and fastest-growing languages, it's easy to argue that Julia's syntax and language design are the most modern and sane currently available in programming, primarily if you are focusing on engineering or science workloads. -In future chapters, I will focus more on how Julia shines rather than why Matlab doesn't. - ### Enviroments A significant pain point for large Matlab projects is managing installed Toolboxes and Packages. In Matlab, once something is installed it is available globally and doesn't have to be imported to a script to be used. There are quite a few downsides to this, the largest in my opinion: it is very easy to crowd your namespace. To make it even worse, Matlab usually doesn't even warn you about the issue so if two packages offer a function of the same name, it is just going to choose one and hope it works out. Another big issue this can cause is version conflicts. This is why there are so many issues trying to run code between Matlab versions. @@ -56,6 +50,11 @@ The best way to install packages is to open the Julia REPL (basically Matlab's c Pluto will automatically install any of the packages in this notebook that you are missing, but this can take a long time since Julia is still very slow to compile new packages. """ +# ╔═╡ 072e459a-1423-45df-b269-8402b1683ea6 +md""" +Since you have to import packages in order to use them there is never any ambiguity as to what package you need to run a script. In Matlab you simply get a warning saying it doesn't know what the function you are trying to use is but with Julia the compiler will even tell you the commands needed to install that package. +""" + # ╔═╡ 16a7201a-4ce0-4102-9874-96733514ef08 md""" !!! warning @@ -69,7 +68,7 @@ md""" In Matlab its very common to grow an array in a for loop using `array(end+1)` _(You really should never do this since it creates a new array every loop which gets very inefficent, but I'm not here to teach you Matlab)_. In Julia, you use `push!` for adding a single number to the end of a `Vector` and `append!` to add collections _(also known as arrays or lists)_ to the end of a `Vector`. You'll notice that `!` at the end of the push and append functions. In Julia the exclamation point at the end of a function name means that the function modifies the function inputs in place compared to returning a new copy of the object. !!! note "Indexing Syntax" - Array index syntax uses square brackets `[]` in Julia instead of parenthesis in Matlab `()`. + Julia uses square brackets `[]` to index compared to parenthesis in Matlab `()`. """ # ╔═╡ 0a4dc275-04b3-43e3-8a0d-cb921d769a0a @@ -84,11 +83,14 @@ sort!(a); a # a is now sorted since sort!(a) sorts in place. # ╔═╡ 58c883b6-3682-424d-a1e9-8ac561bb0dbf a[end+1] = 5 # Can't grow array by indexing like in Matlab +# ╔═╡ a0748b65-171a-49e3-a018-8cb7b8c0bc31 +push!(a, 5) # Correct way to grow the array. + # ╔═╡ a74e7cad-8dae-41cd-b77a-65ba082956a3 md""" ### Functions -Matlab functions have a ton of weird behaviors. The weirdest being that optional function returns are done based on the amount of return values so: +Matlab functions have a ton of weird behaviors. The weirdest being that optional function returns are done based on the amount of return values like the follwing: ```julia % Matlab Example @@ -97,7 +99,7 @@ P = polyfit(X,Y,N) [P,S,MU] = polyfit(X,Y,N) ``` -all return different things. In this case, it's simple to tell what is going on, but if you had no idea what the `polyfit` function did in the first place it is totally unintuitive what the extra returned values are. If a function has optional returns in other languages, it is usually idiomatic to return those values with an optional keyword argument or just have a completely different function to get the different data. In the case of `polyfit`, calculating S and MU are unrelated to calculating P, so it is not like the data was already calculated and can be quickly returned like you would generally expect to be the case with optional returns. To make things even worse, `S` is designed to be an input to a different function, `POLYVAL`, so why wouldn't you just make polyval take `X`, `Y`, and `N` as inputs? Matlab is dumb `/endrant`. +All of those function calls to `polyfit` return different things. In this case, it's simple to tell what is going on, but if you had no idea what the `polyfit` function did in the first place it is totally unintuitive what the extra returned values are. If a function has optional returns in other languages, it is usually idiomatic to return those values with an optional keyword argument or just have a completely different function to get the different data. In the case of `polyfit`, calculating S and MU are unrelated to calculating P, so it is not like the data was already calculated and can be quickly returned like you would generally expect to be the case with optional returns. To make things even worse, `S` is designed to be an input to a different function, `POLYVAL`, so why wouldn't you just make polyval take `X`, `Y`, and `N` as inputs? Matlab is dumb `/endrant`. Another weird thing is where functions can be placed in Matlab. In livescripts they can only be placed at the end of the file, and there's also the ability to make files that are only a function. In Julia, functions can be anywhere, and files can contain as many functions as you want and can be imported by any other file. The function syntax in Julia is also very sane. """ @@ -129,7 +131,7 @@ end # ╔═╡ 3c921f2d-3972-4b88-990d-36ced0764bc5 # Julia will always use the closest matching function. function g(x::Int, y::Int) # x and y need to be integers - z = x+y # last line is returned, so really could just be x+y without the z + x + y # last line in a function gets returned end # ╔═╡ b7ae33bc-5edd-4741-a578-d210521b1698 @@ -139,7 +141,7 @@ g(14) # Since there are 4 different methods for g Julia will find and use the cl g(5.0, 6.0) # Normal g function used since inputs are floats # ╔═╡ 8688fe79-00ad-497f-a466-dc86af9e03b0 -g() # Uses normal g function since there is no match for g that has a Int and a Float specified as inputs. +g(4, 2.1) # Uses most generic g function since there is no match for g that has a Int and a Float specified as inputs. # ╔═╡ 9440e0bc-7920-4b81-b88a-0b1046d24b4c g(5, 6) # Integer method used since inputs are both integers. @@ -161,7 +163,7 @@ Matlab generally does broadcasting for you which can be dangerous since sometime b = 1:5 # Ranges are similar to Matlab, but will discussed later in the text # ╔═╡ 6124f6b4-6315-4d74-9067-4553ce1d54bc -sin(b) # gotta broadcast! +sin(b) # Error, gotta broadcast! # ╔═╡ 95e30983-f305-41aa-a1e2-f38fa0d0c1c3 sin.(b) # Nice! @@ -188,11 +190,11 @@ Matlab evaluates arrays when they are made which is very common in programming l # ╔═╡ e3c28497-29e9-447e-aba0-650aaaa52d88 typeof(1:10) -# ╔═╡ 4fd4f72d-45e0-4760-bc0b-5ebb78636e2c -enumerate(1:.25:2) # returns an enumerate object +# ╔═╡ cc419cd3-75fc-4ae6-b41f-17bf5b537771 +collect(1:10) -# ╔═╡ cf125fe2-c754-4218-92c9-3f491f3109c1 -collect(enumerate(1:.25:2)) # Returns an an array of tuples as expected +# ╔═╡ 4fd4f72d-45e0-4760-bc0b-5ebb78636e2c +enumerate([5 4 3 2 1]) # enumeration is also lazy # ╔═╡ 4802d903-e87c-4ef0-a184-e4ae7af69a28 md""" @@ -207,10 +209,10 @@ Plots use very similar syntax to Matlab with the exception that there is no `hol """ # ╔═╡ a4665e30-4c64-46d1-8349-a49f40763a0b -plot(sin) +plot(sin) # We can plot functions # ╔═╡ 09303ffe-6cf8-4273-b697-9fbd7cb82cc1 -plot(cos) # Makes a new plot! +plot(cos) # Makes a new plot since we didnt use plot! # ╔═╡ e3b51038-2e57-4a5a-9b5d-7bf7148d700b begin @@ -222,6 +224,23 @@ end # ╔═╡ 55e0d022-faca-40f8-a4a9-3a501eb5d19e plot!(atan, label="atan") # Returns a new plot with all the elements of the old plot. +# ╔═╡ 4cd38b1c-e85c-49c7-9871-b893bc53c686 +let + x = -10:10 + y = x.^2 + plot(x, y, title="We can also plot x-y data", label="") +end + +# ╔═╡ 2f3b1426-5e16-4d24-9ade-e5c88d8cb9b7 +let + t = 0:.001:2π + x = sin.(t) + y = cos.(t) + z = sin.(4t) + + plot(x,y,z, title="We can even do 3d plots!", label="3 Dimensions!") +end + # ╔═╡ dc89d08d-29bf-4e04-8470-c79c88ab4689 md""" !!! note @@ -262,20 +281,20 @@ md""" There are a few ways that Julia really shines that make it perfect for engineering and science. Below are a few examples. -## Symbols +### Symbols -Julia supports a wide variety of unicode symbols in the language that can be accessed with the syntax `\pi{tab}` to get π. This is a great way to make code closer to LaTex or handwritten examples which makes it easier to read or understand. +Julia supports a wide variety of unicode symbols in the language that can be accessed with the syntax `\pi{tab}` to get π. This is a great way to make code closer to $\LaTeX$ or handwritten examples which makes it easier to read or understand. * `\theta{tab}` θ * `q\bar{tab}` q̄ * `x\ddot{tab}` ẍ -## List Comprehension +### List Comprehension List comprehensions can be thought of single line for loops and can be very handy in a variety of scenarios. The syntax is: ```julia -# Add 1 to each number in a list of numbers +# Add 1 to each number in the list called numbers [number + 1 for number in numbers] ``` @@ -288,6 +307,9 @@ List comprehensions are especially useful instead of one line for loops, or when # ╔═╡ 2172de3a-7dba-4cbc-9c04-444db595c328 [x for x in 1:12 if x % 3 == 0] +# ╔═╡ b519ad43-dd1f-41f2-8b6c-f6196ae1df76 +@benchmark 1+1; # This just makes sure benchmark is precompiled to ensure the tests below are accurate + # ╔═╡ fd0f5cf6-c90b-4492-9c72-9e707803e736 md""" Since `append!` is usually very slow you can see below that using a list comprehension to create a vector is almost 10x faster. @@ -295,15 +317,22 @@ Since `append!` is usually very slow you can see below that using a list compreh # ╔═╡ a2c7e472-2460-428e-bfec-acf925fad89d begin + function f() t = [] for i in 1:1e6 append!(t,i) end - t + end + @benchmark f() end # ╔═╡ bce2eecc-dc01-4bf6-9eaa-880fd8a69768 -[i for i in 1:1e6] +@benchmark [i for i in 1:1e6] + +# ╔═╡ 881367d3-a247-4bdc-92d4-f3e205982837 +md""" +Note that not only is it much faster, but the memory usage and allocations are much lower aswell. +""" # ╔═╡ a2df1c35-c0b2-45bb-86b7-57e208287392 md""" @@ -350,183 +379,32 @@ weight |> u"N" # ╔═╡ 8d4de01a-197f-40cb-942f-bfec335e3844 md""" -Units can also be stripped to give a normal number again. +Units can also be stripped to give a normal number again. This is important since most other packages don't have support for units. Yet. """ # ╔═╡ 86da848f-1e84-47c8-8a79-373f241b6025 ustrip(u"N", weight) -# ╔═╡ dc898d32-b30b-4baa-a595-b83ccd1dc86d +# ╔═╡ ee5aad93-0437-429d-969e-fee239e6a577 md""" -# Everything below isn't close to being finished -""" +## Conclusion -# ╔═╡ 9ea4584c-8177-4f69-9739-b2faa93281a8 -md""" ---- +This is only scratching the surface of the differences between the two languages, but I hope this can serve as a starting point. In the future, I would like to dig more into the differences since I do think that Julia will eclipse Matlab in use in engineering before too long. -### Matrix Math -""" - -# ╔═╡ f43812d2-9f87-489a-9317-e7aa19ffd3bc -md""" ---- - -### Custom Data Types -""" - -# ╔═╡ f6d87354-ac46-4202-92f8-b39a0db13327 -μ = 3.986004418e14u"m^3/s^2" # Standard Gravitational Parameter for Earth - -# ╔═╡ f8039870-2570-47d0-8d46-30922415ec9d -earth_radius = 6378u"km" - -# ╔═╡ 863cd607-a459-49ae-9049-983f3374f523 -abstract type Orbit end - -# ╔═╡ 44daff45-f608-47e3-ad6e-fca43532f322 -struct Circular_Orbit <: Orbit - """Simple 2d circular orbit""" - r::typeof(.1u"km") # altitude -end - - -# ╔═╡ efb58b79-24e4-45c6-ad45-aeaa339d82fd -ISS = Circular_Orbit(420u"km") - -# ╔═╡ ad3a2b19-5639-4d11-8d89-bc54772d639b -struct Elliptic_Orbit <: Orbit - """Simple 2d elliptic orbit""" - r::typeof(.1u"km") # altitude - a::typeof(.1u"km") # semimajor axis - e::Float64 # eccentricity - - function Elliptic_Orbit(r, a, e) - @assert e < 1 "Eccentricity must be less than 1!" - @assert 0 < e "Eccentricity must be greater than 0!" - new(r, a, e) - end - - - function Elliptic_Orbit(perigee, apogee) - a = (perigee + apogee) / 2 - e = 1 - (perigee/a) - r = a*((1-e^2)/(1+e)) # Assume θ is 0 since we aren't keeping track of it - Elliptic_Orbit(r,a,e) - end -end - -# ╔═╡ b4e08868-d48a-4f66-9d20-f45ea4d83f00 -sat = Elliptic_Orbit(earth_radius+537.0u"km", earth_radius+9040.9u"km") - -# ╔═╡ 3efd8a29-6a56-4f5c-9cab-0f08875b2064 -function get_velocity(o::Circular_Orbit) - v = sqrt(μ/o.r) - return v |> u"km/s" -end - -# ╔═╡ 59207a25-fa6d-4369-979d-cd9cc2f094cf -function get_velocity(o::Elliptic_Orbit) - v = sqrt(μ*(2/o.r - 1/o.a)) - return v |> u"km/s" -end - -# ╔═╡ 11fb3a28-edf3-46ff-8c4a-5286793b6e43 -get_velocity(ISS) - -# ╔═╡ 79a9ab94-06a8-4613-8f60-358e08f0f32e -get_velocity(sat) - -# ╔═╡ c3d943b4-809d-4a96-a99d-be7653ba2c8b -begin -function Plots.plot(orbit::Elliptic_Orbit) - a = orbit.a |> u"km" |> ustrip - b = orbit.a*sqrt(1-orbit.e^2) |> u"km" |> ustrip - t = 0:.01:2π - - x_orbit(t) = a*cos(t) - y_orbit(t) = b*sin(t) - - plot(x_orbit, y_orbit, t) - - x_earth(t) = ustrip(earth_radius)*cos(t) + a*orbit.e - y_earth(t) = ustrip(earth_radius)*sin(t) - plot!(x_earth,y_earth, t, c=:gray,fill=(0,:blue), legend=false,aspect_ratio=:equal) - - title!("Satellite Orbiting Earth") -end -plot(sat) -end - -# ╔═╡ 01ba1742-d26e-4271-ab62-0bd9ce5e291d -function get_ΔV(start::Orbit, final::Orbit) - get_velocity(start) - get_velocity(final) -end - -# ╔═╡ ad4d24a8-f601-4522-a3eb-c01f6fd68aec -get_ΔV(ISS,sat) - -# ╔═╡ 2d0de5db-5558-41e0-96d5-a3317d151aff - - -# ╔═╡ 8924673f-e99c-44b3-be6d-2abf0b2f5e23 -md""" ---- - -### Tabular Data -""" - -# ╔═╡ c460478a-db52-4a15-a723-9ff64eed9aec -# download_csv(url) = DataFrame(CSV.File(download(url))) -download_csv(url) = url |> download |> CSV.File |> DataFrame - -# ╔═╡ 9ccbea0d-6463-4533-88a6-0267879eb263 -F10 = download_csv("julia.ansonbiggs.com/AeroTech_F10.csv") - -# ╔═╡ 4ffebbb2-7021-4c08-82ac-95366dab3d48 -G8 = download_csv("julia.ansonbiggs.com/AeroTech_G8ST.csv") - -# ╔═╡ 2e83292e-8e8c-43e4-82ee-951a2f6a98c1 -F15 = download_csv("julia.ansonbiggs.com/Estes_F15.csv") - -# ╔═╡ c7e2a7f8-626f-45d8-b771-6f9e74a86bd8 -let - plot(title = "Rocket Motor Comparison", xlabel="Time (s)", ylabel="Thrust (N)") - plot!(F10.Time, F10.Thrust,label="F10") - plot!(G8.Time, G8.Thrust,label="G8") - plot!(F15.Time, F15.Thrust,label="F15") -end - -# ╔═╡ 8ec4af16-1a19-468e-b097-59985bf28f5c -describe(F10) - -# ╔═╡ 9f886419-7259-442e-b068-d0e4c886a886 -maximum.([F10.Thrust, G8.Thrust, F15.Thrust]) - -# ╔═╡ fbc06121-d53a-4a64-9497-63d7f3583fbb -md""" -## Things Julia Does Poorly - -- Time to First Plot -- Libraries -- Still young and breaking things +I am currently rewriting large amounts of code from Matlab to Julia, so hopefully, through that experience, I can provide a more detailed explanation and, ideally, some information that will be useful to other people making the same transition. """ # ╔═╡ 00000000-0000-0000-0000-000000000001 PLUTO_PROJECT_TOML_CONTENTS = """ [deps] -CSV = "336ed68f-0bac-5ca0-87d4-7b16caf5d00b" -DataFrames = "a93c6f00-e57d-5684-b7b6-d8193f3e46c0" -FileIO = "5789e2e9-d7fb-5bc7-8068-2c6fae9b9549" +BenchmarkTools = "6e4b80f9-dd63-53aa-95a3-0cdb28fa8baf" LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" Plots = "91a5bcdd-55d7-5caf-9e0b-520d859cae80" PlutoUI = "7f904dfe-b85e-4ff6-b463-dae2292396a8" Unitful = "1986cc42-f94f-5a68-af5c-568840ba703d" [compat] -CSV = "~0.8.5" -DataFrames = "~1.2.0" -FileIO = "~1.11.0" +BenchmarkTools = "~1.1.3" Plots = "~1.19.0" PlutoUI = "~0.7.9" Unitful = "~1.8.0" @@ -551,18 +429,18 @@ uuid = "56f22d72-fd6d-98f1-02f0-08ddc0907c33" [[Base64]] uuid = "2a0f44e3-6c83-55bd-87e4-b1978d98bd5f" +[[BenchmarkTools]] +deps = ["JSON", "Logging", "Printf", "Statistics", "UUIDs"] +git-tree-sha1 = "aa3aba5ed8f882ed01b71e09ca2ba0f77f44a99e" +uuid = "6e4b80f9-dd63-53aa-95a3-0cdb28fa8baf" +version = "1.1.3" + [[Bzip2_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] git-tree-sha1 = "c3598e525718abcc440f69cc6d5f60dda0a1b61e" uuid = "6e34b625-4abd-537c-b88f-471c36dfa7a0" version = "1.0.6+5" -[[CSV]] -deps = ["Dates", "Mmap", "Parsers", "PooledArrays", "SentinelArrays", "Tables", "Unicode"] -git-tree-sha1 = "b83aa3f513be680454437a0eee21001607e5d983" -uuid = "336ed68f-0bac-5ca0-87d4-7b16caf5d00b" -version = "0.8.5" - [[Cairo_jll]] deps = ["Artifacts", "Bzip2_jll", "Fontconfig_jll", "FreeType2_jll", "Glib_jll", "JLLWrappers", "LZO_jll", "Libdl", "Pixman_jll", "Pkg", "Xorg_libXext_jll", "Xorg_libXrender_jll", "Zlib_jll", "libpng_jll"] git-tree-sha1 = "e2f47f6d8337369411569fd45ae5753ca10394c6" @@ -609,22 +487,11 @@ git-tree-sha1 = "9f02045d934dc030edad45944ea80dbd1f0ebea7" uuid = "d38c429a-6771-53c6-b99e-75d170b6e991" version = "0.5.7" -[[Crayons]] -git-tree-sha1 = "3f71217b538d7aaee0b69ab47d9b7724ca8afa0d" -uuid = "a8cc5b0e-0ffa-5ad4-8c14-923d3ee1735f" -version = "4.0.4" - [[DataAPI]] git-tree-sha1 = "ee400abb2298bd13bfc3df1c412ed228061a2385" uuid = "9a962f9c-6df0-11e9-0e5d-c546b8b5ee8a" version = "1.7.0" -[[DataFrames]] -deps = ["Compat", "DataAPI", "Future", "InvertedIndices", "IteratorInterfaceExtensions", "LinearAlgebra", "Markdown", "Missings", "PooledArrays", "PrettyTables", "Printf", "REPL", "Reexport", "SortingAlgorithms", "Statistics", "TableTraits", "Tables", "Unicode"] -git-tree-sha1 = "1dadfca11c0e08e03ab15b63aaeda55266754bad" -uuid = "a93c6f00-e57d-5684-b7b6-d8193f3e46c0" -version = "1.2.0" - [[DataStructures]] deps = ["Compat", "InteractiveUtils", "OrderedCollections"] git-tree-sha1 = "4437b64df1e0adccc3e5d1adbc3ac741095e4677" @@ -676,12 +543,6 @@ git-tree-sha1 = "3cc57ad0a213808473eafef4845a74766242e05f" uuid = "b22a6f82-2f65-5046-a5b2-351ab43fb4e5" version = "4.3.1+4" -[[FileIO]] -deps = ["Pkg", "Requires", "UUIDs"] -git-tree-sha1 = "937c29268e405b6808d958a9ac41bfe1a31b08e7" -uuid = "5789e2e9-d7fb-5bc7-8068-2c6fae9b9549" -version = "1.11.0" - [[FixedPointNumbers]] deps = ["Statistics"] git-tree-sha1 = "335bfdceacc84c5cdf16aadc768aa5ddfc5383cc" @@ -712,10 +573,6 @@ git-tree-sha1 = "aa31987c2ba8704e23c6c8ba8a4f769d5d7e4f91" uuid = "559328eb-81f9-559d-9380-de523a88c83c" version = "1.0.10+0" -[[Future]] -deps = ["Random"] -uuid = "9fa8497b-333b-5362-9e8d-4d0656e87820" - [[GLFW_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl", "Libglvnd_jll", "Pkg", "Xorg_libXcursor_jll", "Xorg_libXi_jll", "Xorg_libXinerama_jll", "Xorg_libXrandr_jll"] git-tree-sha1 = "dba1e8614e98949abfa60480b13653813d8f0157" @@ -773,12 +630,6 @@ version = "0.5.0" deps = ["Markdown"] uuid = "b77e0a4c-d291-57a0-90e8-8db25a27a240" -[[InvertedIndices]] -deps = ["Test"] -git-tree-sha1 = "15732c475062348b0165684ffe28e85ea8396afc" -uuid = "41ab1584-1d38-5bbf-9106-f11c6c58b48f" -version = "1.0.0" - [[IterTools]] git-tree-sha1 = "05110a2ab1fc5f932622ffea2a003221f4782c18" uuid = "c8e1da08-722c-5040-9ed9-7db0dc04731e" @@ -1024,24 +875,12 @@ git-tree-sha1 = "44e225d5837e2a2345e69a1d1e01ac2443ff9fcb" uuid = "7f904dfe-b85e-4ff6-b463-dae2292396a8" version = "0.7.9" -[[PooledArrays]] -deps = ["DataAPI", "Future"] -git-tree-sha1 = "cde4ce9d6f33219465b55162811d8de8139c0414" -uuid = "2dfb63ee-cc39-5dd5-95bd-886bf059d720" -version = "1.2.1" - [[Preferences]] deps = ["TOML"] git-tree-sha1 = "00cfd92944ca9c760982747e9a1d0d5d86ab1e5a" uuid = "21216c6a-2e73-6563-6e65-726566657250" version = "1.2.2" -[[PrettyTables]] -deps = ["Crayons", "Formatting", "Markdown", "Reexport", "Tables"] -git-tree-sha1 = "0d1245a357cc61c8cd61934c07447aa569ff22e6" -uuid = "08abe8d2-0d0c-5749-adfa-8a2ac140af0d" -version = "1.1.0" - [[Printf]] deps = ["Unicode"] uuid = "de0858da-6303-5e67-8744-51eddeeeb8d7" @@ -1091,12 +930,6 @@ git-tree-sha1 = "0b4b7f1393cff97c33891da2a0bf69c6ed241fda" uuid = "6c6a2e73-6563-6170-7368-637461726353" version = "1.1.0" -[[SentinelArrays]] -deps = ["Dates", "Random"] -git-tree-sha1 = "ffae887d0f0222a19c406a11c3831776d1383e3d" -uuid = "91c51154-3ec4-41a3-a24f-3f23e20d615c" -version = "1.3.3" - [[Serialization]] uuid = "9e88b42a-f829-5b0c-bbe9-9e923198166b" @@ -1413,12 +1246,14 @@ version = "0.9.1+5" # ╟─307cbf7a-1ac5-47a5-8031-3458f9dd1887 # ╟─11ed58ac-1289-4b64-88a8-17cb7f0b6cd2 # ╠═7d7820ff-c0f5-41ee-be29-5006e7f4361d +# ╟─072e459a-1423-45df-b269-8402b1683ea6 # ╟─16a7201a-4ce0-4102-9874-96733514ef08 # ╟─3cad3f5f-f6a5-405b-aeb0-495ebd8cca45 # ╠═0a4dc275-04b3-43e3-8a0d-cb921d769a0a # ╠═193c6a29-4f53-4c96-acc7-b5359043b471 # ╠═6fa90db6-9d2b-47bc-9f41-925b447912e8 # ╠═58c883b6-3682-424d-a1e9-8ac561bb0dbf +# ╠═a0748b65-171a-49e3-a018-8cb7b8c0bc31 # ╟─a74e7cad-8dae-41cd-b77a-65ba082956a3 # ╠═f4d655a2-8539-43f7-9356-56a3e3f9de91 # ╠═289727e4-fb29-4ba8-97c5-cce62da725bc @@ -1440,22 +1275,27 @@ version = "0.9.1+5" # ╟─3ef67004-2f85-4aa1-a1b5-5cbf62b292f7 # ╠═1025e3a8-59c9-4725-bc1a-a0b94e6bd6af # ╠═e3c28497-29e9-447e-aba0-650aaaa52d88 +# ╠═cc419cd3-75fc-4ae6-b41f-17bf5b537771 # ╠═4fd4f72d-45e0-4760-bc0b-5ebb78636e2c -# ╠═cf125fe2-c754-4218-92c9-3f491f3109c1 # ╟─4802d903-e87c-4ef0-a184-e4ae7af69a28 # ╠═52819547-9593-446a-91e7-a08e08723e66 # ╠═a4665e30-4c64-46d1-8349-a49f40763a0b # ╠═09303ffe-6cf8-4273-b697-9fbd7cb82cc1 # ╠═e3b51038-2e57-4a5a-9b5d-7bf7148d700b # ╠═55e0d022-faca-40f8-a4a9-3a501eb5d19e +# ╠═4cd38b1c-e85c-49c7-9871-b893bc53c686 +# ╠═2f3b1426-5e16-4d24-9ade-e5c88d8cb9b7 # ╟─dc89d08d-29bf-4e04-8470-c79c88ab4689 # ╟─b30e6f73-fe46-45e7-898e-dd1205dffe68 # ╟─916f5f09-1aa3-47a7-9c66-c42513eaccea # ╠═2172de3a-7dba-4cbc-9c04-444db595c328 +# ╠═c231f030-5861-4b30-a182-efc06b5c08fe +# ╟─b519ad43-dd1f-41f2-8b6c-f6196ae1df76 # ╟─fd0f5cf6-c90b-4492-9c72-9e707803e736 # ╠═a2c7e472-2460-428e-bfec-acf925fad89d # ╠═bce2eecc-dc01-4bf6-9eaa-880fd8a69768 -# ╟─a2df1c35-c0b2-45bb-86b7-57e208287392 +# ╠═881367d3-a247-4bdc-92d4-f3e205982837 +# ╠═a2df1c35-c0b2-45bb-86b7-57e208287392 # ╠═3228a21e-cab8-4738-bdc5-a6827c764c06 # ╟─7b9b11f2-c6d3-4dab-ab30-6e47a3a4bfb3 # ╠═09bc71cd-7bc0-4d5a-bcf8-984abe273375 @@ -1466,33 +1306,6 @@ version = "0.9.1+5" # ╠═ade2979d-155e-4f20-82db-6da141bb8eaa # ╟─8d4de01a-197f-40cb-942f-bfec335e3844 # ╠═86da848f-1e84-47c8-8a79-373f241b6025 -# ╟─dc898d32-b30b-4baa-a595-b83ccd1dc86d -# ╠═9ea4584c-8177-4f69-9739-b2faa93281a8 -# ╠═f43812d2-9f87-489a-9317-e7aa19ffd3bc -# ╠═f6d87354-ac46-4202-92f8-b39a0db13327 -# ╠═f8039870-2570-47d0-8d46-30922415ec9d -# ╠═863cd607-a459-49ae-9049-983f3374f523 -# ╠═44daff45-f608-47e3-ad6e-fca43532f322 -# ╠═efb58b79-24e4-45c6-ad45-aeaa339d82fd -# ╠═ad3a2b19-5639-4d11-8d89-bc54772d639b -# ╠═b4e08868-d48a-4f66-9d20-f45ea4d83f00 -# ╠═3efd8a29-6a56-4f5c-9cab-0f08875b2064 -# ╠═59207a25-fa6d-4369-979d-cd9cc2f094cf -# ╠═11fb3a28-edf3-46ff-8c4a-5286793b6e43 -# ╠═79a9ab94-06a8-4613-8f60-358e08f0f32e -# ╠═c3d943b4-809d-4a96-a99d-be7653ba2c8b -# ╠═01ba1742-d26e-4271-ab62-0bd9ce5e291d -# ╠═ad4d24a8-f601-4522-a3eb-c01f6fd68aec -# ╠═2d0de5db-5558-41e0-96d5-a3317d151aff -# ╠═8924673f-e99c-44b3-be6d-2abf0b2f5e23 -# ╠═3f7ae2df-9d4d-46d3-b12e-22107a560b66 -# ╠═c460478a-db52-4a15-a723-9ff64eed9aec -# ╠═9ccbea0d-6463-4533-88a6-0267879eb263 -# ╠═4ffebbb2-7021-4c08-82ac-95366dab3d48 -# ╠═2e83292e-8e8c-43e4-82ee-951a2f6a98c1 -# ╠═c7e2a7f8-626f-45d8-b771-6f9e74a86bd8 -# ╠═8ec4af16-1a19-468e-b097-59985bf28f5c -# ╠═9f886419-7259-442e-b068-d0e4c886a886 -# ╠═fbc06121-d53a-4a64-9497-63d7f3583fbb +# ╟─ee5aad93-0437-429d-969e-fee239e6a577 # ╟─00000000-0000-0000-0000-000000000001 # ╟─00000000-0000-0000-0000-000000000002