diff --git a/404.html b/404.html index b97a542..bb28670 100644 --- a/404.html +++ b/404.html @@ -1 +1 @@ - 404

404


The requested page was not found



Click here to go back to the homepage.
\ No newline at end of file + 404

404


The requested page was not found



Click here to go back to the homepage.
\ No newline at end of file diff --git a/day1/index.html b/day1/index.html index 02b7c06..59fe7cc 100644 --- a/day1/index.html +++ b/day1/index.html @@ -1,4 +1,4 @@ - Day 1

Day 1

Problem: Guessing Game

The goal of this game is to have the user guess a random number. Your program should select a number between 1 and 100 (inclusive). Then, it should accept a series of guesses from the user. Each time the guess entered is wrong, your program provides a hint: whether the guess entered was too high or too low. When the correct number is entered, you can print a message and exit.

You will need some pieces from the Julia standard library:

The top-level Julia scope behaves differently than you might expect. You will want to wrap your code in a function, like so:

# in your_filename.jl
+        Day 1 

Day 1

Problem: Guessing Game

The goal of this game is to have the user guess a random number. Your program should select a number between 1 and 100 (inclusive). Then, it should accept a series of guesses from the user. Each time the guess entered is wrong, your program provides a hint: whether the guess entered was too high or too low. When the correct number is entered, you can print a message and exit.

You will need some pieces from the Julia standard library:

  • rand(a:b) (docs): select a random integer in [a,b][a, b]

  • readline() (docs): read a single line from the terminal and return it as a string

  • parse(Int, s) (docs): parse the String s as an Int

The top-level Julia scope behaves differently than you might expect. You will want to wrap your code in a function, like so:

# in your_filename.jl
 function main()
     # your code here
 end
diff --git a/day2/index.html b/day2/index.html
index 9c68401..1693053 100644
--- a/day2/index.html
+++ b/day2/index.html
@@ -1,4 +1,4 @@
-        Day 2 

Day 2

Problem 1: Prime Number Iterator

Make an iterator over the prime numbers less than or equal to nn using a Sieve of Eratosthenes

  • The sieve should be created when building the Primes struct

  • You should provide a constructor which does so (Primes(n::Int))

  • The iterator interface is described here

  • You may wish to define additional functions

Sieve of Eratosthenes:

  • Allocate a Boolean vector of size nn, where each element represents whether that number is prime.

    • They should all start as true. You can use the function ones(Bool, n) to make the vector.

      • (there's also a trues function, which returns a BitVector. This'll also work.)

  • Mark 1 as false

    • 1 isn't prime

  • Let p=1p = 1

  • While there are numbers marked as prime greater than pp:

    • Set pp to the smallest number marked prime larger than the previous pp

    • Mark all multiples of pp (2p2p, 3p3p, ...) as not prime

  • Now, all numbers are marked correctly

Hint: 1:2:10 gives you a range over (1, 3, 5, 7, 9)

Problem 2: Outer Product Matrix

Problem 2: Write a matrix type which is the outer product of two vectors

  • You should only store the vectors

  • Both should have element type T, and it should be a subtype of AbstractMatrix{T}

  • You should implement the methods (docs):

    • size(::OuterProduct)

    • getindex(::OuterProduct, i::Int, j::Int)

    • adjoint(::OuterProduct) (hint: (uv')' = (vu'))

  • Try building an instance of OuterProduct in the REPL. Julia can already print it and has matrix-vector and matrix-matrix multiplication defined!

Problem 3: Peano Arithmetic

Peano arithmetic provides a compact axiomatic description of the natural numbers. An informal description is:

  • There exists 0.

  • There exists the successor function, S()S(). S(x)0xS(x) \neq 0 ∀ x

  • S(x)=S(y)S(x) = S(y) implies x=yx = y

From this we can recursively construct the naturals. Further, we can define addition recursively:

+(0, 0)    = 0
+        Day 2 

Day 2

Problem 1: Prime Number Iterator

Make an iterator over the prime numbers less than or equal to nn using a Sieve of Eratosthenes

  • The sieve should be created when building the Primes struct

  • You should provide a constructor which does so (Primes(n::Int))

  • The iterator interface is described here

  • You may wish to define additional functions

Sieve of Eratosthenes:

  • Allocate a Boolean vector of size nn, where each element represents whether that number is prime.

    • They should all start as true. You can use the function ones(Bool, n) to make the vector.

      • (there's also a trues function, which returns a BitVector. This'll also work.)

  • Mark 1 as false

    • 1 isn't prime

  • Let p=1p = 1

  • While there are numbers marked as prime greater than pp:

    • Set pp to the smallest number marked prime larger than the previous pp

    • Mark all multiples of pp (2p2p, 3p3p, ...) as not prime

  • Now, all numbers are marked correctly

Hint: 1:2:10 gives you a range over (1, 3, 5, 7, 9)

Problem 2: Outer Product Matrix

Problem 2: Write a matrix type which is the outer product of two vectors

  • You should only store the vectors

  • Both should have element type T, and it should be a subtype of AbstractMatrix{T}

  • You should implement the methods (docs):

    • size(::OuterProduct)

    • getindex(::OuterProduct, i::Int, j::Int)

    • adjoint(::OuterProduct) (hint: (uv')' = (vu'))

  • Try building an instance of OuterProduct in the REPL. Julia can already print it and has matrix-vector and matrix-matrix multiplication defined!

Problem 3: Peano Arithmetic

Peano arithmetic provides a compact axiomatic description of the natural numbers. An informal description is:

  • There exists 0.

  • There exists the successor function, S()S(). S(x)0xS(x) \neq 0 ∀ x

  • S(x)=S(y)S(x) = S(y) implies x=yx = y

From this we can recursively construct the naturals. Further, we can define addition recursively:

+(0, 0)    = 0
 +(x, 0)    = x
 +(0, x)    = x
 +(x, S(y)) = S(x + y)

As well as multiplication:

*(0, 0)    = 0
diff --git a/day3/index.html b/day3/index.html
index 39d6f0a..dfd14f0 100644
--- a/day3/index.html
+++ b/day3/index.html
@@ -1,4 +1,4 @@
-       Day 3 

Day 3

Problems

  1. Check whether your solutions for last week's problems were type stable. One of the methods there cannot be type stable. Which is it?

  2. For the Peano numbers problem, in the following code, how many compilations for + happen?

Zero() + Zero()
+       Day 3 

Day 3

Problems

  1. Check whether your solutions for last week's problems were type stable. One of the methods there cannot be type stable. Which is it?

  2. For the Peano numbers problem, in the following code, how many compilations for + happen?

Zero() + Zero()
 Zero() + convert(PeanoNumber, 1)
 convert(PeanoNumber, 1) + Zero()
 convert(PeanoNumber, 1) + convert(PeanoNumber, 5)
diff --git a/day4.ipynb b/day4.ipynb
index 7fe1a15..b44a131 100644
--- a/day4.ipynb
+++ b/day4.ipynb
@@ -3,7 +3,13 @@
   {
    "cell_type": "markdown",
    "id": "0ae03770-e9c7-4cc3-b400-909b20fa9d8a",
-   "metadata": {},
+   "metadata": {
+    "editable": true,
+    "slideshow": {
+     "slide_type": ""
+    },
+    "tags": []
+   },
    "source": [
     "# Julia Workshop, Day 4: Benchmarking, Debugging, Modules\n",
     "\n",
@@ -229,7 +235,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 6,
+   "execution_count": 5,
    "id": "23fcebe5",
    "metadata": {
     "editable": true,
@@ -274,7 +280,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 3,
+   "execution_count": 6,
    "id": "7c1b5259",
    "metadata": {
     "editable": true,
@@ -290,7 +296,7 @@
        "rand (generic function with 83 methods)"
       ]
      },
-     "execution_count": 3,
+     "execution_count": 6,
      "metadata": {},
      "output_type": "execute_result"
     }
@@ -312,7 +318,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 4,
+   "execution_count": 7,
    "id": "6613169d",
    "metadata": {
     "editable": true,
@@ -328,7 +334,7 @@
        "apply_all (generic function with 2 methods)"
       ]
      },
-     "execution_count": 4,
+     "execution_count": 7,
      "metadata": {},
      "output_type": "execute_result"
     }
@@ -370,7 +376,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 18,
+   "execution_count": 8,
    "id": "3e184a71",
    "metadata": {
     "editable": true,
@@ -383,19 +389,19 @@
     {
      "data": {
       "text/plain": [
-       "BenchmarkTools.Trial: 8570 samples with 1 evaluation.\n",
-       " Range \u001b[90m(\u001b[39m\u001b[36m\u001b[1mmin\u001b[22m\u001b[39m … \u001b[35mmax\u001b[39m\u001b[90m):  \u001b[39m\u001b[36m\u001b[1m2.546 ms\u001b[22m\u001b[39m … \u001b[35m 10.926 ms\u001b[39m  \u001b[90m┊\u001b[39m GC \u001b[90m(\u001b[39mmin … max\u001b[90m): \u001b[39m0.00% … 0.00%\n",
-       " Time  \u001b[90m(\u001b[39m\u001b[34m\u001b[1mmedian\u001b[22m\u001b[39m\u001b[90m):     \u001b[39m\u001b[34m\u001b[1m3.698 ms               \u001b[22m\u001b[39m\u001b[90m┊\u001b[39m GC \u001b[90m(\u001b[39mmedian\u001b[90m):    \u001b[39m0.00%\n",
-       " Time  \u001b[90m(\u001b[39m\u001b[32m\u001b[1mmean\u001b[22m\u001b[39m ± \u001b[32mσ\u001b[39m\u001b[90m):   \u001b[39m\u001b[32m\u001b[1m3.522 ms\u001b[22m\u001b[39m ± \u001b[32m844.749 μs\u001b[39m  \u001b[90m┊\u001b[39m GC \u001b[90m(\u001b[39mmean ± σ\u001b[90m):  \u001b[39m1.15% ± 4.16%\n",
+       "BenchmarkTools.Trial: 7906 samples with 1 evaluation.\n",
+       " Range \u001b[90m(\u001b[39m\u001b[36m\u001b[1mmin\u001b[22m\u001b[39m … \u001b[35mmax\u001b[39m\u001b[90m):  \u001b[39m\u001b[36m\u001b[1m2.554 ms\u001b[22m\u001b[39m … \u001b[35m10.702 ms\u001b[39m  \u001b[90m┊\u001b[39m GC \u001b[90m(\u001b[39mmin … max\u001b[90m): \u001b[39m0.00% … 0.00%\n",
+       " Time  \u001b[90m(\u001b[39m\u001b[34m\u001b[1mmedian\u001b[22m\u001b[39m\u001b[90m):     \u001b[39m\u001b[34m\u001b[1m4.271 ms              \u001b[22m\u001b[39m\u001b[90m┊\u001b[39m GC \u001b[90m(\u001b[39mmedian\u001b[90m):    \u001b[39m0.00%\n",
+       " Time  \u001b[90m(\u001b[39m\u001b[32m\u001b[1mmean\u001b[22m\u001b[39m ± \u001b[32mσ\u001b[39m\u001b[90m):   \u001b[39m\u001b[32m\u001b[1m4.140 ms\u001b[22m\u001b[39m ± \u001b[32m 1.445 ms\u001b[39m  \u001b[90m┊\u001b[39m GC \u001b[90m(\u001b[39mmean ± σ\u001b[90m):  \u001b[39m0.98% ± 3.87%\n",
        "\n",
-       "  \u001b[39m█\u001b[39m▄\u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m▃\u001b[39m▄\u001b[39m▁\u001b[39m▁\u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[32m \u001b[39m\u001b[39m \u001b[39m▁\u001b[39m▁\u001b[34m▁\u001b[39m\u001b[39m▂\u001b[39m▂\u001b[39m▂\u001b[39m▃\u001b[39m▃\u001b[39m▃\u001b[39m▃\u001b[39m▃\u001b[39m▃\u001b[39m▃\u001b[39m▃\u001b[39m▄\u001b[39m▄\u001b[39m▃\u001b[39m▃\u001b[39m▃\u001b[39m▃\u001b[39m▃\u001b[39m▂\u001b[39m▂\u001b[39m▁\u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m▁\n",
-       "  \u001b[39m█\u001b[39m█\u001b[39m█\u001b[39m▆\u001b[39m▆\u001b[39m▄\u001b[39m▆\u001b[39m▄\u001b[39m▄\u001b[39m▅\u001b[39m▅\u001b[39m▆\u001b[39m▆\u001b[39m█\u001b[39m█\u001b[39m█\u001b[39m█\u001b[39m█\u001b[39m▇\u001b[39m█\u001b[39m▇\u001b[39m▇\u001b[32m▇\u001b[39m\u001b[39m█\u001b[39m█\u001b[39m█\u001b[34m█\u001b[39m\u001b[39m█\u001b[39m█\u001b[39m█\u001b[39m█\u001b[39m█\u001b[39m█\u001b[39m█\u001b[39m█\u001b[39m█\u001b[39m█\u001b[39m█\u001b[39m█\u001b[39m█\u001b[39m█\u001b[39m█\u001b[39m█\u001b[39m█\u001b[39m█\u001b[39m█\u001b[39m█\u001b[39m█\u001b[39m█\u001b[39m█\u001b[39m█\u001b[39m█\u001b[39m▇\u001b[39m▇\u001b[39m▆\u001b[39m▅\u001b[39m▆\u001b[39m▅\u001b[39m▆\u001b[39m \u001b[39m█\n",
-       "  2.55 ms\u001b[90m      \u001b[39m\u001b[90mHistogram: \u001b[39m\u001b[90m\u001b[1mlog(\u001b[22m\u001b[39m\u001b[90mfrequency\u001b[39m\u001b[90m\u001b[1m)\u001b[22m\u001b[39m\u001b[90m by time\u001b[39m      5.13 ms \u001b[0m\u001b[1m<\u001b[22m\n",
+       "  \u001b[39m█\u001b[39m▁\u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m▄\u001b[39m▁\u001b[39m▄\u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[32m \u001b[39m\u001b[39m \u001b[34m \u001b[39m\u001b[39m \u001b[39m \u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▂\u001b[39m▁\u001b[39m▁\u001b[39m▂\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▂\u001b[39m▃\u001b[39m▃\u001b[39m▃\u001b[39m▄\u001b[39m▄\u001b[39m▄\u001b[39m▃\u001b[39m▃\u001b[39m▃\u001b[39m▃\u001b[39m▂\u001b[39m▂\u001b[39m▁\u001b[39m▁\u001b[39m \u001b[39m \u001b[39m \u001b[39m▁\n",
+       "  \u001b[39m█\u001b[39m█\u001b[39m▅\u001b[39m▅\u001b[39m▆\u001b[39m▅\u001b[39m█\u001b[39m█\u001b[39m█\u001b[39m█\u001b[39m▇\u001b[39m▇\u001b[39m▆\u001b[39m▇\u001b[39m▆\u001b[39m▆\u001b[39m▇\u001b[39m▇\u001b[39m▆\u001b[39m▆\u001b[39m▇\u001b[39m▆\u001b[39m▆\u001b[39m▇\u001b[32m▆\u001b[39m\u001b[39m▆\u001b[34m▇\u001b[39m\u001b[39m▇\u001b[39m▇\u001b[39m█\u001b[39m█\u001b[39m█\u001b[39m█\u001b[39m█\u001b[39m█\u001b[39m█\u001b[39m█\u001b[39m█\u001b[39m█\u001b[39m█\u001b[39m█\u001b[39m█\u001b[39m█\u001b[39m█\u001b[39m█\u001b[39m█\u001b[39m█\u001b[39m█\u001b[39m█\u001b[39m█\u001b[39m█\u001b[39m█\u001b[39m█\u001b[39m█\u001b[39m█\u001b[39m█\u001b[39m█\u001b[39m█\u001b[39m \u001b[39m█\n",
+       "  2.55 ms\u001b[90m      \u001b[39m\u001b[90mHistogram: \u001b[39m\u001b[90m\u001b[1mlog(\u001b[22m\u001b[39m\u001b[90mfrequency\u001b[39m\u001b[90m\u001b[1m)\u001b[22m\u001b[39m\u001b[90m by time\u001b[39m     6.38 ms \u001b[0m\u001b[1m<\u001b[22m\n",
        "\n",
        " Memory estimate\u001b[90m: \u001b[39m\u001b[33m2.25 MiB\u001b[39m, allocs estimate\u001b[90m: \u001b[39m\u001b[33m4100\u001b[39m."
       ]
      },
-     "execution_count": 18,
+     "execution_count": 8,
      "metadata": {},
      "output_type": "execute_result"
     }
@@ -438,7 +444,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 8,
+   "execution_count": 9,
    "id": "8dad581f",
    "metadata": {
     "editable": true,
@@ -455,7 +461,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 17,
+   "execution_count": 10,
    "id": "7e79255e",
    "metadata": {
     "editable": true,
@@ -470,302 +476,316 @@
       "image/svg+xml": [
        "\n",
        "\n",
-       "\n",
+       "\n",
        "\n",
-       "    \n",
-       "        \n",
+       "    \n",
+       "        \n",
        "    \n",
        "\n",
        "\n",
-       "\n",
-       "\n",
-       "Profile results\n",
-       "\n",
-       "\n",
-       " in :-1\n",
-       "\n",
-       "apply_all in In[4]:12\n",
-       "\n",
-       "apply_all in In[4]:3\n",
-       "\n",
-       "apply in In[6]:23\n",
-       "\n",
-       "apply in In[6]:25\n",
-       "\n",
-       "apply_translation in In[6]:30\n",
-       "\n",
-       "apply_translation in In[6]:30\n",
-       "\n",
-       "materialize in broadcast.jl:903\n",
-       "\n",
-       "copy in broadcast.jl:928\n",
-       "\n",
-       "#15 in eventloop.jl:38\n",
-       "\n",
-       "eventloop in eventloop.jl:8\n",
-       "\n",
-       "invokelatest in essentials.jl:889\n",
-       "\n",
-       "#invokelatest#2 in essentials.jl:892\n",
-       "\n",
-       "execute_request in execute_request.jl:67\n",
-       "\n",
-       "softscope_include_string in SoftGlobalScope.jl:65\n",
-       "\n",
-       "include_string in loading.jl:2076\n",
-       "\n",
-       "eval in boot.jl:385\n",
-       "\n",
-       "test_apply in In[17]:6\n",
-       "\n",
-       "macro expansion in Profile.jl:44\n",
-       "\n",
-       "apply_all in In[4]:12\n",
-       "\n",
-       "apply_all in In[4]:3\n",
-       "\n",
-       "apply in In[6]:23\n",
-       "\n",
-       "apply in In[6]:24\n",
-       "\n",
-       "apply_rotation in In[6]:29\n",
-       "\n",
-       "getproperty in Base.jl:37\n",
-       "\n",
-       "* in matmul.jl:53\n",
-       "\n",
-       "similar in abstractarray.jl:833\n",
-       "\n",
-       "similar in array.jl:420\n",
-       "\n",
-       "Array in boot.jl:486\n",
-       "\n",
-       "Array in boot.jl:477\n",
-       "\n",
-       "size in array.jl:190\n",
-       "\n",
-       "mul! in matmul.jl:237\n",
-       "\n",
-       "mul! in matmul.jl:66\n",
-       "\n",
-       "generic_matvecmul! in matmul.jl:71\n",
-       "\n",
-       "gemv! in matmul.jl:0\n",
-       "\n",
-       "gemv! in matmul.jl:401\n",
-       "\n",
-       "gemv! in matmul.jl:404\n",
-       "\n",
-       "length in essentials.jl:10\n",
-       "\n",
-       "gemv! in matmul.jl:406\n",
-       "\n",
-       "length in essentials.jl:10\n",
-       "\n",
-       "gemv! in matmul.jl:408\n",
-       "\n",
-       "gemv! in matmul.jl:410\n",
-       "\n",
-       "promote in promotion.jl:399\n",
-       "\n",
-       "_promote in promotion.jl:377\n",
-       "\n",
-       "convert in number.jl:7\n",
-       "\n",
-       "Float32 in float.jl:165\n",
-       "\n",
-       "gemv! in matmul.jl:411\n",
-       "\n",
-       "in in operators.jl:0\n",
-       "\n",
-       "gemv! in matmul.jl:415\n",
-       "\n",
-       "gemv! in blas.jl:0\n",
-       "\n",
-       "gemv! in blas.jl:643\n",
-       "\n",
-       "gemv! in blas.jl:647\n",
-       "\n",
-       "size in array.jl:190\n",
-       "\n",
-       "gemv! in blas.jl:648\n",
-       "\n",
-       "length in essentials.jl:10\n",
-       "\n",
-       "gemv! in blas.jl:657\n",
-       "\n",
-       "vec_pointer_stride in blas.jl:177\n",
-       "\n",
-       "pointer in abstractarray.jl:1237\n",
-       "\n",
-       "unsafe_convert in pointer.jl:65\n",
-       "\n",
-       "gemv! in blas.jl:658\n",
-       "\n",
-       "vec_pointer_stride in blas.jl:177\n",
-       "\n",
-       "pointer in abstractarray.jl:1237\n",
-       "\n",
-       "unsafe_convert in pointer.jl:65\n",
-       "\n",
-       "gemv! in blas.jl:659\n",
-       "\n",
-       "pointer in abstractarray.jl:1237\n",
-       "\n",
-       "unsafe_convert in pointer.jl:65\n",
-       "\n",
-       "gemv! in blas.jl:667\n",
-       "\n",
-       "cconvert in essentials.jl:543\n",
-       "\n",
-       "convert in refpointer.jl:105\n",
-       "\n",
-       "RefValue in refvalue.jl:8\n",
-       "\n",
-       "apply in In[6]:25\n",
-       "\n",
-       "apply_translation in In[6]:30\n",
-       "\n",
-       "getproperty in Base.jl:37\n",
-       "\n",
-       "materialize in broadcast.jl:903\n",
-       "\n",
-       "copy in broadcast.jl:928\n",
-       "\n",
-       "Array in boot.jl:0\n",
-       "\n",
-       "copyto! in broadcast.jl:956\n",
-       "\n",
-       "copyto! in broadcast.jl:992\n",
-       "\n",
-       "axes in abstractarray.jl:98\n",
-       "\n",
-       "size in array.jl:191\n",
-       "\n",
-       "copyto! in broadcast.jl:1000\n",
-       "\n",
-       "preprocess in broadcast.jl:983\n",
-       "\n",
-       "preprocess_args in broadcast.jl:986\n",
-       "\n",
-       "preprocess in broadcast.jl:984\n",
-       "\n",
-       "extrude in broadcast.jl:676\n",
-       "\n",
-       "newindexer in broadcast.jl:625\n",
-       "\n",
-       "axes in abstractarray.jl:98\n",
-       "\n",
-       "size in array.jl:191\n",
-       "\n",
-       "copyto! in broadcast.jl:1003\n",
-       "\n",
-       "macro expansion in simdloop.jl:0\n",
-       "\n",
-       "macro expansion in simdloop.jl:72\n",
-       "\n",
-       "macro expansion in simdloop.jl:75\n",
-       "\n",
-       "macro expansion in simdloop.jl:77\n",
-       "\n",
-       "macro expansion in broadcast.jl:1004\n",
-       "\n",
-       "setindex! in array.jl:1021\n",
-       "\n",
-       "getindex in broadcast.jl:636\n",
-       "\n",
-       "_broadcast_getindex in broadcast.jl:681\n",
-       "\n",
-       "_getindex in broadcast.jl:705\n",
-       "\n",
-       "_broadcast_getindex in broadcast.jl:675\n",
-       "\n",
-       "getindex in essentials.jl:13\n",
-       "\n",
-       "_getindex in broadcast.jl:706\n",
-       "\n",
-       "_broadcast_getindex in broadcast.jl:675\n",
-       "\n",
-       "getindex in essentials.jl:13\n",
-       "\n",
-       "macro expansion in simdloop.jl:78\n",
-       "\n",
-       "+ in int.jl:87\n",
-       "\n",
-       "similar in broadcast.jl:223\n",
-       "\n",
-       "similar in broadcast.jl:224\n",
-       "\n",
-       "similar in abstractarray.jl:876\n",
-       "\n",
-       "similar in abstractarray.jl:877\n",
-       "\n",
-       "Array in boot.jl:494\n",
-       "\n",
-       "Array in boot.jl:486\n",
-       "\n",
-       "Array in boot.jl:477\n",
-       "\n",
-       "instantiate in broadcast.jl:306\n",
-       "\n",
-       "combine_axes in broadcast.jl:524\n",
-       "\n",
-       "axes in abstractarray.jl:98\n",
-       "\n",
-       "size in array.jl:191\n",
-       "\n",
-       "apply_all in In[4]:4\n",
-       "\n",
-       "iterate in array.jl:0\n",
-       "\n",
-       "iterate in array.jl:945\n",
-       "\n",
-       "getindex in essentials.jl:13\n",
-       "\n",
-       "push! in array.jl:1119\n",
-       "\n",
-       "_growend! in array.jl:1072\n",
-       "\n",
-       "apply_all in array.jl:0\n",
-       "\n",
-       "gemv! in blas.jl:667\n",
+       "\n",
+       "\n",
+       "Profile results\n",
+       "\n",
+       "\n",
+       " in :-1\n",
+       "\n",
+       "#15 in eventloop.jl:38\n",
+       "\n",
+       "eventloop in eventloop.jl:8\n",
+       "\n",
+       "invokelatest in essentials.jl:889\n",
+       "\n",
+       "#invokelatest#2 in essentials.jl:892\n",
+       "\n",
+       "execute_request in execute_request.jl:67\n",
+       "\n",
+       "softscope_include_string in SoftGlobalScope.jl:65\n",
+       "\n",
+       "include_string in loading.jl:2076\n",
+       "\n",
+       "eval in boot.jl:385\n",
+       "\n",
+       "test_apply in In[10]:6\n",
+       "\n",
+       "macro expansion in Profile.jl:44\n",
+       "\n",
+       "apply_all in In[7]:12\n",
+       "\n",
+       "apply_all in In[7]:3\n",
+       "\n",
+       "apply in In[5]:23\n",
+       "\n",
+       "apply in In[5]:24\n",
+       "\n",
+       "apply_rotation in In[5]:29\n",
+       "\n",
+       "* in matmul.jl:53\n",
+       "\n",
+       "similar in abstractarray.jl:833\n",
+       "\n",
+       "similar in array.jl:420\n",
+       "\n",
+       "Array in boot.jl:486\n",
+       "\n",
+       "Array in boot.jl:477\n",
+       "\n",
+       "mul! in matmul.jl:237\n",
+       "\n",
+       "mul! in matmul.jl:66\n",
+       "\n",
+       "generic_matvecmul! in matmul.jl:71\n",
+       "\n",
+       "gemv! in matmul.jl:0\n",
+       "\n",
+       "gemv! in matmul.jl:401\n",
+       "\n",
+       "gemv! in matmul.jl:403\n",
+       "\n",
+       "lapack_size in matmul.jl:656\n",
+       "\n",
+       "size in array.jl:190\n",
+       "\n",
+       "gemv! in matmul.jl:404\n",
+       "\n",
+       "length in essentials.jl:10\n",
+       "\n",
+       "gemv! in matmul.jl:406\n",
+       "\n",
+       "length in essentials.jl:10\n",
+       "\n",
+       "gemv! in matmul.jl:408\n",
+       "\n",
+       "gemv! in matmul.jl:410\n",
+       "\n",
+       "promote in promotion.jl:399\n",
+       "\n",
+       "_promote in promotion.jl:377\n",
+       "\n",
+       "convert in number.jl:7\n",
+       "\n",
+       "Float32 in float.jl:165\n",
+       "\n",
+       "gemv! in matmul.jl:411\n",
+       "\n",
+       "in in operators.jl:0\n",
+       "\n",
+       "gemv! in matmul.jl:415\n",
+       "\n",
+       "gemv! in blas.jl:0\n",
+       "\n",
+       "gemv! in blas.jl:643\n",
+       "\n",
+       "gemv! in blas.jl:647\n",
+       "\n",
+       "size in array.jl:190\n",
+       "\n",
+       "gemv! in blas.jl:648\n",
+       "\n",
+       "length in essentials.jl:10\n",
+       "\n",
+       "gemv! in blas.jl:658\n",
+       "\n",
+       "vec_pointer_stride in blas.jl:177\n",
+       "\n",
+       "pointer in abstractarray.jl:1237\n",
+       "\n",
+       "unsafe_convert in pointer.jl:65\n",
+       "\n",
+       "gemv! in blas.jl:659\n",
+       "\n",
+       "pointer in abstractarray.jl:1237\n",
+       "\n",
+       "unsafe_convert in pointer.jl:65\n",
+       "\n",
+       "gemv! in blas.jl:667\n",
+       "\n",
+       "cconvert in essentials.jl:543\n",
+       "\n",
+       "convert in refpointer.jl:105\n",
+       "\n",
+       "RefValue in refvalue.jl:8\n",
+       "\n",
+       "apply in In[5]:25\n",
+       "\n",
+       "apply_translation in In[5]:30\n",
+       "\n",
+       "materialize in broadcast.jl:903\n",
+       "\n",
+       "copy in broadcast.jl:928\n",
+       "\n",
+       "Array in boot.jl:0\n",
+       "\n",
+       "copyto! in broadcast.jl:956\n",
+       "\n",
+       "copyto! in broadcast.jl:992\n",
+       "\n",
+       "axes in abstractarray.jl:98\n",
+       "\n",
+       "size in array.jl:191\n",
+       "\n",
+       "copyto! in broadcast.jl:1000\n",
+       "\n",
+       "preprocess in broadcast.jl:983\n",
+       "\n",
+       "preprocess_args in broadcast.jl:986\n",
+       "\n",
+       "preprocess in broadcast.jl:984\n",
+       "\n",
+       "broadcast_unalias in broadcast.jl:977\n",
+       "\n",
+       "unalias in abstractarray.jl:1481\n",
+       "\n",
+       "mightalias in abstractarray.jl:1516\n",
+       "\n",
+       "dataids in abstractarray.jl:1540\n",
+       "\n",
+       "pointer in abstractarray.jl:1237\n",
+       "\n",
+       "unsafe_convert in pointer.jl:65\n",
+       "\n",
+       "extrude in broadcast.jl:676\n",
+       "\n",
+       "newindexer in broadcast.jl:625\n",
+       "\n",
+       "axes in abstractarray.jl:98\n",
+       "\n",
+       "size in array.jl:191\n",
+       "\n",
+       "preprocess_args in broadcast.jl:987\n",
+       "\n",
+       "preprocess in broadcast.jl:984\n",
+       "\n",
+       "broadcast_unalias in broadcast.jl:977\n",
+       "\n",
+       "unalias in abstractarray.jl:1481\n",
+       "\n",
+       "mightalias in abstractarray.jl:1516\n",
+       "\n",
+       "dataids in abstractarray.jl:1540\n",
+       "\n",
+       "pointer in abstractarray.jl:1237\n",
+       "\n",
+       "unsafe_convert in pointer.jl:65\n",
+       "\n",
+       "copyto! in broadcast.jl:1003\n",
+       "\n",
+       "macro expansion in simdloop.jl:0\n",
+       "\n",
+       "macro expansion in simdloop.jl:72\n",
+       "\n",
+       "macro expansion in simdloop.jl:75\n",
+       "\n",
+       "macro expansion in simdloop.jl:77\n",
+       "\n",
+       "macro expansion in broadcast.jl:1004\n",
+       "\n",
+       "setindex! in array.jl:1021\n",
+       "\n",
+       "getindex in broadcast.jl:636\n",
+       "\n",
+       "_broadcast_getindex in broadcast.jl:681\n",
+       "\n",
+       "_getindex in broadcast.jl:705\n",
+       "\n",
+       "_broadcast_getindex in broadcast.jl:675\n",
+       "\n",
+       "getindex in essentials.jl:13\n",
+       "\n",
+       "_getindex in broadcast.jl:706\n",
+       "\n",
+       "_broadcast_getindex in broadcast.jl:675\n",
+       "\n",
+       "getindex in essentials.jl:13\n",
+       "\n",
+       "macro expansion in simdloop.jl:78\n",
+       "\n",
+       "+ in int.jl:87\n",
+       "\n",
+       "similar in broadcast.jl:223\n",
+       "\n",
+       "similar in broadcast.jl:224\n",
+       "\n",
+       "similar in abstractarray.jl:876\n",
+       "\n",
+       "similar in abstractarray.jl:877\n",
+       "\n",
+       "Array in boot.jl:494\n",
+       "\n",
+       "Array in boot.jl:486\n",
+       "\n",
+       "Array in boot.jl:477\n",
+       "\n",
+       "instantiate in broadcast.jl:306\n",
+       "\n",
+       "combine_axes in broadcast.jl:524\n",
+       "\n",
+       "axes in abstractarray.jl:98\n",
+       "\n",
+       "size in array.jl:191\n",
+       "\n",
+       "apply_all in In[7]:4\n",
+       "\n",
+       "iterate in array.jl:945\n",
+       "\n",
+       "getindex in essentials.jl:13\n",
+       "\n",
+       "length in essentials.jl:10\n",
+       "\n",
+       "push! in array.jl:1119\n",
+       "\n",
+       "_growend! in array.jl:1072\n",
+       "\n",
+       "push! in array.jl:1120\n",
+       "\n",
+       "__inbounds_setindex! in array.jl:1026\n",
+       "\n",
+       "apply_all in In[7]:13\n",
+       "\n",
+       "iterate in array.jl:945\n",
+       "\n",
+       "length in essentials.jl:10\n",
+       "\n",
+       "apply_all in array.jl:0\n",
+       "\n",
+       "gemv! in blas.jl:667\n",
        "\n",
        "\n",
        "\n"
@@ -1165,302 +1185,316 @@
        "\n",
        "\n",
        "\n",
-       "\n",
+       "\n",
        "\n",
-       "    \n",
-       "        \n",
+       "    \n",
+       "        \n",
        "    \n",
        "\n",
        "\n",
-       "\n",
-       "\n",
-       "Profile results\n",
-       "\n",
-       "\n",
-       " in :-1\n",
-       "\n",
-       "apply_all in In[4]:12\n",
-       "\n",
-       "apply_all in In[4]:3\n",
-       "\n",
-       "apply in In[6]:23\n",
-       "\n",
-       "apply in In[6]:25\n",
-       "\n",
-       "apply_translation in In[6]:30\n",
-       "\n",
-       "apply_translation in In[6]:30\n",
-       "\n",
-       "materialize in broadcast.jl:903\n",
-       "\n",
-       "copy in broadcast.jl:928\n",
-       "\n",
-       "#15 in eventloop.jl:38\n",
-       "\n",
-       "eventloop in eventloop.jl:8\n",
-       "\n",
-       "invokelatest in essentials.jl:889\n",
-       "\n",
-       "#invokelatest#2 in essentials.jl:892\n",
-       "\n",
-       "execute_request in execute_request.jl:67\n",
-       "\n",
-       "softscope_include_string in SoftGlobalScope.jl:65\n",
-       "\n",
-       "include_string in loading.jl:2076\n",
-       "\n",
-       "eval in boot.jl:385\n",
-       "\n",
-       "test_apply in In[17]:6\n",
-       "\n",
-       "macro expansion in Profile.jl:44\n",
-       "\n",
-       "apply_all in In[4]:12\n",
-       "\n",
-       "apply_all in In[4]:3\n",
-       "\n",
-       "apply in In[6]:23\n",
-       "\n",
-       "apply in In[6]:24\n",
-       "\n",
-       "apply_rotation in In[6]:29\n",
-       "\n",
-       "getproperty in Base.jl:37\n",
-       "\n",
-       "* in matmul.jl:53\n",
-       "\n",
-       "similar in abstractarray.jl:833\n",
-       "\n",
-       "similar in array.jl:420\n",
-       "\n",
-       "Array in boot.jl:486\n",
-       "\n",
-       "Array in boot.jl:477\n",
-       "\n",
-       "size in array.jl:190\n",
-       "\n",
-       "mul! in matmul.jl:237\n",
-       "\n",
-       "mul! in matmul.jl:66\n",
-       "\n",
-       "generic_matvecmul! in matmul.jl:71\n",
-       "\n",
-       "gemv! in matmul.jl:0\n",
-       "\n",
-       "gemv! in matmul.jl:401\n",
-       "\n",
-       "gemv! in matmul.jl:404\n",
-       "\n",
-       "length in essentials.jl:10\n",
-       "\n",
-       "gemv! in matmul.jl:406\n",
-       "\n",
-       "length in essentials.jl:10\n",
-       "\n",
-       "gemv! in matmul.jl:408\n",
-       "\n",
-       "gemv! in matmul.jl:410\n",
-       "\n",
-       "promote in promotion.jl:399\n",
-       "\n",
-       "_promote in promotion.jl:377\n",
-       "\n",
-       "convert in number.jl:7\n",
-       "\n",
-       "Float32 in float.jl:165\n",
-       "\n",
-       "gemv! in matmul.jl:411\n",
-       "\n",
-       "in in operators.jl:0\n",
-       "\n",
-       "gemv! in matmul.jl:415\n",
-       "\n",
-       "gemv! in blas.jl:0\n",
-       "\n",
-       "gemv! in blas.jl:643\n",
-       "\n",
-       "gemv! in blas.jl:647\n",
-       "\n",
-       "size in array.jl:190\n",
-       "\n",
-       "gemv! in blas.jl:648\n",
-       "\n",
-       "length in essentials.jl:10\n",
-       "\n",
-       "gemv! in blas.jl:657\n",
-       "\n",
-       "vec_pointer_stride in blas.jl:177\n",
-       "\n",
-       "pointer in abstractarray.jl:1237\n",
-       "\n",
-       "unsafe_convert in pointer.jl:65\n",
-       "\n",
-       "gemv! in blas.jl:658\n",
-       "\n",
-       "vec_pointer_stride in blas.jl:177\n",
-       "\n",
-       "pointer in abstractarray.jl:1237\n",
-       "\n",
-       "unsafe_convert in pointer.jl:65\n",
-       "\n",
-       "gemv! in blas.jl:659\n",
-       "\n",
-       "pointer in abstractarray.jl:1237\n",
-       "\n",
-       "unsafe_convert in pointer.jl:65\n",
-       "\n",
-       "gemv! in blas.jl:667\n",
-       "\n",
-       "cconvert in essentials.jl:543\n",
-       "\n",
-       "convert in refpointer.jl:105\n",
-       "\n",
-       "RefValue in refvalue.jl:8\n",
-       "\n",
-       "apply in In[6]:25\n",
-       "\n",
-       "apply_translation in In[6]:30\n",
-       "\n",
-       "getproperty in Base.jl:37\n",
-       "\n",
-       "materialize in broadcast.jl:903\n",
-       "\n",
-       "copy in broadcast.jl:928\n",
-       "\n",
-       "Array in boot.jl:0\n",
-       "\n",
-       "copyto! in broadcast.jl:956\n",
-       "\n",
-       "copyto! in broadcast.jl:992\n",
-       "\n",
-       "axes in abstractarray.jl:98\n",
-       "\n",
-       "size in array.jl:191\n",
-       "\n",
-       "copyto! in broadcast.jl:1000\n",
-       "\n",
-       "preprocess in broadcast.jl:983\n",
-       "\n",
-       "preprocess_args in broadcast.jl:986\n",
-       "\n",
-       "preprocess in broadcast.jl:984\n",
-       "\n",
-       "extrude in broadcast.jl:676\n",
-       "\n",
-       "newindexer in broadcast.jl:625\n",
-       "\n",
-       "axes in abstractarray.jl:98\n",
-       "\n",
-       "size in array.jl:191\n",
-       "\n",
-       "copyto! in broadcast.jl:1003\n",
-       "\n",
-       "macro expansion in simdloop.jl:0\n",
-       "\n",
-       "macro expansion in simdloop.jl:72\n",
-       "\n",
-       "macro expansion in simdloop.jl:75\n",
-       "\n",
-       "macro expansion in simdloop.jl:77\n",
-       "\n",
-       "macro expansion in broadcast.jl:1004\n",
-       "\n",
-       "setindex! in array.jl:1021\n",
-       "\n",
-       "getindex in broadcast.jl:636\n",
-       "\n",
-       "_broadcast_getindex in broadcast.jl:681\n",
-       "\n",
-       "_getindex in broadcast.jl:705\n",
-       "\n",
-       "_broadcast_getindex in broadcast.jl:675\n",
-       "\n",
-       "getindex in essentials.jl:13\n",
-       "\n",
-       "_getindex in broadcast.jl:706\n",
-       "\n",
-       "_broadcast_getindex in broadcast.jl:675\n",
-       "\n",
-       "getindex in essentials.jl:13\n",
-       "\n",
-       "macro expansion in simdloop.jl:78\n",
-       "\n",
-       "+ in int.jl:87\n",
-       "\n",
-       "similar in broadcast.jl:223\n",
-       "\n",
-       "similar in broadcast.jl:224\n",
-       "\n",
-       "similar in abstractarray.jl:876\n",
-       "\n",
-       "similar in abstractarray.jl:877\n",
-       "\n",
-       "Array in boot.jl:494\n",
-       "\n",
-       "Array in boot.jl:486\n",
-       "\n",
-       "Array in boot.jl:477\n",
-       "\n",
-       "instantiate in broadcast.jl:306\n",
-       "\n",
-       "combine_axes in broadcast.jl:524\n",
-       "\n",
-       "axes in abstractarray.jl:98\n",
-       "\n",
-       "size in array.jl:191\n",
-       "\n",
-       "apply_all in In[4]:4\n",
-       "\n",
-       "iterate in array.jl:0\n",
-       "\n",
-       "iterate in array.jl:945\n",
-       "\n",
-       "getindex in essentials.jl:13\n",
-       "\n",
-       "push! in array.jl:1119\n",
-       "\n",
-       "_growend! in array.jl:1072\n",
-       "\n",
-       "apply_all in array.jl:0\n",
-       "\n",
-       "gemv! in blas.jl:667\n",
+       "\n",
+       "\n",
+       "Profile results\n",
+       "\n",
+       "\n",
+       " in :-1\n",
+       "\n",
+       "#15 in eventloop.jl:38\n",
+       "\n",
+       "eventloop in eventloop.jl:8\n",
+       "\n",
+       "invokelatest in essentials.jl:889\n",
+       "\n",
+       "#invokelatest#2 in essentials.jl:892\n",
+       "\n",
+       "execute_request in execute_request.jl:67\n",
+       "\n",
+       "softscope_include_string in SoftGlobalScope.jl:65\n",
+       "\n",
+       "include_string in loading.jl:2076\n",
+       "\n",
+       "eval in boot.jl:385\n",
+       "\n",
+       "test_apply in In[10]:6\n",
+       "\n",
+       "macro expansion in Profile.jl:44\n",
+       "\n",
+       "apply_all in In[7]:12\n",
+       "\n",
+       "apply_all in In[7]:3\n",
+       "\n",
+       "apply in In[5]:23\n",
+       "\n",
+       "apply in In[5]:24\n",
+       "\n",
+       "apply_rotation in In[5]:29\n",
+       "\n",
+       "* in matmul.jl:53\n",
+       "\n",
+       "similar in abstractarray.jl:833\n",
+       "\n",
+       "similar in array.jl:420\n",
+       "\n",
+       "Array in boot.jl:486\n",
+       "\n",
+       "Array in boot.jl:477\n",
+       "\n",
+       "mul! in matmul.jl:237\n",
+       "\n",
+       "mul! in matmul.jl:66\n",
+       "\n",
+       "generic_matvecmul! in matmul.jl:71\n",
+       "\n",
+       "gemv! in matmul.jl:0\n",
+       "\n",
+       "gemv! in matmul.jl:401\n",
+       "\n",
+       "gemv! in matmul.jl:403\n",
+       "\n",
+       "lapack_size in matmul.jl:656\n",
+       "\n",
+       "size in array.jl:190\n",
+       "\n",
+       "gemv! in matmul.jl:404\n",
+       "\n",
+       "length in essentials.jl:10\n",
+       "\n",
+       "gemv! in matmul.jl:406\n",
+       "\n",
+       "length in essentials.jl:10\n",
+       "\n",
+       "gemv! in matmul.jl:408\n",
+       "\n",
+       "gemv! in matmul.jl:410\n",
+       "\n",
+       "promote in promotion.jl:399\n",
+       "\n",
+       "_promote in promotion.jl:377\n",
+       "\n",
+       "convert in number.jl:7\n",
+       "\n",
+       "Float32 in float.jl:165\n",
+       "\n",
+       "gemv! in matmul.jl:411\n",
+       "\n",
+       "in in operators.jl:0\n",
+       "\n",
+       "gemv! in matmul.jl:415\n",
+       "\n",
+       "gemv! in blas.jl:0\n",
+       "\n",
+       "gemv! in blas.jl:643\n",
+       "\n",
+       "gemv! in blas.jl:647\n",
+       "\n",
+       "size in array.jl:190\n",
+       "\n",
+       "gemv! in blas.jl:648\n",
+       "\n",
+       "length in essentials.jl:10\n",
+       "\n",
+       "gemv! in blas.jl:658\n",
+       "\n",
+       "vec_pointer_stride in blas.jl:177\n",
+       "\n",
+       "pointer in abstractarray.jl:1237\n",
+       "\n",
+       "unsafe_convert in pointer.jl:65\n",
+       "\n",
+       "gemv! in blas.jl:659\n",
+       "\n",
+       "pointer in abstractarray.jl:1237\n",
+       "\n",
+       "unsafe_convert in pointer.jl:65\n",
+       "\n",
+       "gemv! in blas.jl:667\n",
+       "\n",
+       "cconvert in essentials.jl:543\n",
+       "\n",
+       "convert in refpointer.jl:105\n",
+       "\n",
+       "RefValue in refvalue.jl:8\n",
+       "\n",
+       "apply in In[5]:25\n",
+       "\n",
+       "apply_translation in In[5]:30\n",
+       "\n",
+       "materialize in broadcast.jl:903\n",
+       "\n",
+       "copy in broadcast.jl:928\n",
+       "\n",
+       "Array in boot.jl:0\n",
+       "\n",
+       "copyto! in broadcast.jl:956\n",
+       "\n",
+       "copyto! in broadcast.jl:992\n",
+       "\n",
+       "axes in abstractarray.jl:98\n",
+       "\n",
+       "size in array.jl:191\n",
+       "\n",
+       "copyto! in broadcast.jl:1000\n",
+       "\n",
+       "preprocess in broadcast.jl:983\n",
+       "\n",
+       "preprocess_args in broadcast.jl:986\n",
+       "\n",
+       "preprocess in broadcast.jl:984\n",
+       "\n",
+       "broadcast_unalias in broadcast.jl:977\n",
+       "\n",
+       "unalias in abstractarray.jl:1481\n",
+       "\n",
+       "mightalias in abstractarray.jl:1516\n",
+       "\n",
+       "dataids in abstractarray.jl:1540\n",
+       "\n",
+       "pointer in abstractarray.jl:1237\n",
+       "\n",
+       "unsafe_convert in pointer.jl:65\n",
+       "\n",
+       "extrude in broadcast.jl:676\n",
+       "\n",
+       "newindexer in broadcast.jl:625\n",
+       "\n",
+       "axes in abstractarray.jl:98\n",
+       "\n",
+       "size in array.jl:191\n",
+       "\n",
+       "preprocess_args in broadcast.jl:987\n",
+       "\n",
+       "preprocess in broadcast.jl:984\n",
+       "\n",
+       "broadcast_unalias in broadcast.jl:977\n",
+       "\n",
+       "unalias in abstractarray.jl:1481\n",
+       "\n",
+       "mightalias in abstractarray.jl:1516\n",
+       "\n",
+       "dataids in abstractarray.jl:1540\n",
+       "\n",
+       "pointer in abstractarray.jl:1237\n",
+       "\n",
+       "unsafe_convert in pointer.jl:65\n",
+       "\n",
+       "copyto! in broadcast.jl:1003\n",
+       "\n",
+       "macro expansion in simdloop.jl:0\n",
+       "\n",
+       "macro expansion in simdloop.jl:72\n",
+       "\n",
+       "macro expansion in simdloop.jl:75\n",
+       "\n",
+       "macro expansion in simdloop.jl:77\n",
+       "\n",
+       "macro expansion in broadcast.jl:1004\n",
+       "\n",
+       "setindex! in array.jl:1021\n",
+       "\n",
+       "getindex in broadcast.jl:636\n",
+       "\n",
+       "_broadcast_getindex in broadcast.jl:681\n",
+       "\n",
+       "_getindex in broadcast.jl:705\n",
+       "\n",
+       "_broadcast_getindex in broadcast.jl:675\n",
+       "\n",
+       "getindex in essentials.jl:13\n",
+       "\n",
+       "_getindex in broadcast.jl:706\n",
+       "\n",
+       "_broadcast_getindex in broadcast.jl:675\n",
+       "\n",
+       "getindex in essentials.jl:13\n",
+       "\n",
+       "macro expansion in simdloop.jl:78\n",
+       "\n",
+       "+ in int.jl:87\n",
+       "\n",
+       "similar in broadcast.jl:223\n",
+       "\n",
+       "similar in broadcast.jl:224\n",
+       "\n",
+       "similar in abstractarray.jl:876\n",
+       "\n",
+       "similar in abstractarray.jl:877\n",
+       "\n",
+       "Array in boot.jl:494\n",
+       "\n",
+       "Array in boot.jl:486\n",
+       "\n",
+       "Array in boot.jl:477\n",
+       "\n",
+       "instantiate in broadcast.jl:306\n",
+       "\n",
+       "combine_axes in broadcast.jl:524\n",
+       "\n",
+       "axes in abstractarray.jl:98\n",
+       "\n",
+       "size in array.jl:191\n",
+       "\n",
+       "apply_all in In[7]:4\n",
+       "\n",
+       "iterate in array.jl:945\n",
+       "\n",
+       "getindex in essentials.jl:13\n",
+       "\n",
+       "length in essentials.jl:10\n",
+       "\n",
+       "push! in array.jl:1119\n",
+       "\n",
+       "_growend! in array.jl:1072\n",
+       "\n",
+       "push! in array.jl:1120\n",
+       "\n",
+       "__inbounds_setindex! in array.jl:1026\n",
+       "\n",
+       "apply_all in In[7]:13\n",
+       "\n",
+       "iterate in array.jl:945\n",
+       "\n",
+       "length in essentials.jl:10\n",
+       "\n",
+       "apply_all in array.jl:0\n",
+       "\n",
+       "gemv! in blas.jl:667\n",
        "\n",
        "\n",
        "\n",
@@ -1859,10 +1893,10 @@
        "\n"
       ],
       "text/plain": [
-       "ProfileSVG.FGConfig(Node(FlameGraphs.NodeData(ip:0x0, 0x03, 1:41645)), Dict{Symbol, Any}(), FlameGraphs.FlameColors(ColorTypes.RGB{FixedPointNumbers.N0f8}[RGB{N0f8}(0.882,0.698,1.0), RGB{N0f8}(0.435,0.863,0.569), RGB{N0f8}(0.0,0.71,0.545), RGB{N0f8}(0.173,0.639,1.0)], RGB{N0f8}(1.0,1.0,1.0), RGB{N0f8}(0.0,0.0,0.0), ColorTypes.RGB{FixedPointNumbers.N0f8}[RGB{N0f8}(0.953,0.0,0.302), RGB{N0f8}(0.894,0.0,0.255), RGB{N0f8}(0.831,0.129,0.216), RGB{N0f8}(0.773,0.192,0.184)], ColorTypes.RGB{FixedPointNumbers.N0f8}[RGB{N0f8}(1.0,0.627,0.0), RGB{N0f8}(1.0,0.643,0.0), RGB{N0f8}(0.965,0.651,0.039), RGB{N0f8}(0.894,0.655,0.11)]), :fcolor, :fcolor, 1.0, false, 50, 2000, 960.0, 0.0, 2.0, \"inherit\", 12.0, false, :none, 0.001, \"Profile results\")"
+       "ProfileSVG.FGConfig(Node(FlameGraphs.NodeData(ip:0x0, 0x03, 1:52790)), Dict{Symbol, Any}(), FlameGraphs.FlameColors(ColorTypes.RGB{FixedPointNumbers.N0f8}[RGB{N0f8}(0.882,0.698,1.0), RGB{N0f8}(0.435,0.863,0.569), RGB{N0f8}(0.0,0.71,0.545), RGB{N0f8}(0.173,0.639,1.0)], RGB{N0f8}(1.0,1.0,1.0), RGB{N0f8}(0.0,0.0,0.0), ColorTypes.RGB{FixedPointNumbers.N0f8}[RGB{N0f8}(0.953,0.0,0.302), RGB{N0f8}(0.894,0.0,0.255), RGB{N0f8}(0.831,0.129,0.216), RGB{N0f8}(0.773,0.192,0.184)], ColorTypes.RGB{FixedPointNumbers.N0f8}[RGB{N0f8}(1.0,0.627,0.0), RGB{N0f8}(1.0,0.643,0.0), RGB{N0f8}(0.965,0.651,0.039), RGB{N0f8}(0.894,0.655,0.11)]), :fcolor, :fcolor, 1.0, false, 50, 2000, 960.0, 0.0, 2.0, \"inherit\", 12.0, false, :none, 0.001, \"Profile results\")"
       ]
      },
-     "execution_count": 17,
+     "execution_count": 10,
      "metadata": {},
      "output_type": "execute_result"
     }
@@ -1905,7 +1939,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 12,
+   "execution_count": 11,
    "id": "78939289-094d-4d73-9f80-512faadbf908",
    "metadata": {
     "editable": true,
@@ -1921,7 +1955,7 @@
        "apply_all_inplace (generic function with 2 methods)"
       ]
      },
-     "execution_count": 12,
+     "execution_count": 11,
      "metadata": {},
      "output_type": "execute_result"
     }
@@ -1959,7 +1993,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 16,
+   "execution_count": 12,
    "id": "3c9203d5-7abc-461f-a6e4-3ab9757328be",
    "metadata": {
     "editable": true,
@@ -1972,19 +2006,19 @@
     {
      "data": {
       "text/plain": [
-       "BenchmarkTools.Trial: 4263 samples with 1 evaluation.\n",
-       " Range \u001b[90m(\u001b[39m\u001b[36m\u001b[1mmin\u001b[22m\u001b[39m … \u001b[35mmax\u001b[39m\u001b[90m):  \u001b[39m\u001b[36m\u001b[1m2.477 ms\u001b[22m\u001b[39m … \u001b[35m10.446 ms\u001b[39m  \u001b[90m┊\u001b[39m GC \u001b[90m(\u001b[39mmin … max\u001b[90m): \u001b[39m0.00% … 0.00%\n",
-       " Time  \u001b[90m(\u001b[39m\u001b[34m\u001b[1mmedian\u001b[22m\u001b[39m\u001b[90m):     \u001b[39m\u001b[34m\u001b[1m2.550 ms              \u001b[22m\u001b[39m\u001b[90m┊\u001b[39m GC \u001b[90m(\u001b[39mmedian\u001b[90m):    \u001b[39m0.00%\n",
-       " Time  \u001b[90m(\u001b[39m\u001b[32m\u001b[1mmean\u001b[22m\u001b[39m ± \u001b[32mσ\u001b[39m\u001b[90m):   \u001b[39m\u001b[32m\u001b[1m3.524 ms\u001b[22m\u001b[39m ± \u001b[32m 1.215 ms\u001b[39m  \u001b[90m┊\u001b[39m GC \u001b[90m(\u001b[39mmean ± σ\u001b[90m):  \u001b[39m0.03% ± 0.73%\n",
+       "BenchmarkTools.Trial: 3930 samples with 1 evaluation.\n",
+       " Range \u001b[90m(\u001b[39m\u001b[36m\u001b[1mmin\u001b[22m\u001b[39m … \u001b[35mmax\u001b[39m\u001b[90m):  \u001b[39m\u001b[36m\u001b[1m2.482 ms\u001b[22m\u001b[39m … \u001b[35m9.903 ms\u001b[39m  \u001b[90m┊\u001b[39m GC \u001b[90m(\u001b[39mmin … max\u001b[90m): \u001b[39m0.00% … 0.00%\n",
+       " Time  \u001b[90m(\u001b[39m\u001b[34m\u001b[1mmedian\u001b[22m\u001b[39m\u001b[90m):     \u001b[39m\u001b[34m\u001b[1m4.104 ms             \u001b[22m\u001b[39m\u001b[90m┊\u001b[39m GC \u001b[90m(\u001b[39mmedian\u001b[90m):    \u001b[39m0.00%\n",
+       " Time  \u001b[90m(\u001b[39m\u001b[32m\u001b[1mmean\u001b[22m\u001b[39m ± \u001b[32mσ\u001b[39m\u001b[90m):   \u001b[39m\u001b[32m\u001b[1m4.208 ms\u001b[22m\u001b[39m ± \u001b[32m1.351 ms\u001b[39m  \u001b[90m┊\u001b[39m GC \u001b[90m(\u001b[39mmean ± σ\u001b[90m):  \u001b[39m0.01% ± 0.44%\n",
        "\n",
-       "  \u001b[39m█\u001b[34m▁\u001b[39m\u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[32m \u001b[39m\u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m▁\u001b[39m▆\u001b[39m▆\u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m▂\u001b[39m▄\u001b[39m▂\u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m▁\n",
-       "  \u001b[39m█\u001b[34m█\u001b[39m\u001b[39m▇\u001b[39m▇\u001b[39m▆\u001b[39m▅\u001b[39m▆\u001b[39m▅\u001b[39m▅\u001b[39m▃\u001b[39m▅\u001b[39m▅\u001b[39m▃\u001b[39m▁\u001b[39m▄\u001b[32m▃\u001b[39m\u001b[39m▄\u001b[39m▃\u001b[39m▄\u001b[39m▃\u001b[39m▃\u001b[39m▃\u001b[39m█\u001b[39m█\u001b[39m█\u001b[39m█\u001b[39m█\u001b[39m▆\u001b[39m▆\u001b[39m▅\u001b[39m▅\u001b[39m▅\u001b[39m▆\u001b[39m▅\u001b[39m▁\u001b[39m▅\u001b[39m▄\u001b[39m▃\u001b[39m▄\u001b[39m▁\u001b[39m▁\u001b[39m▃\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m█\u001b[39m█\u001b[39m█\u001b[39m█\u001b[39m▆\u001b[39m▆\u001b[39m▆\u001b[39m▅\u001b[39m▆\u001b[39m▄\u001b[39m▃\u001b[39m▅\u001b[39m▅\u001b[39m \u001b[39m█\n",
-       "  2.48 ms\u001b[90m      \u001b[39m\u001b[90mHistogram: \u001b[39m\u001b[90m\u001b[1mlog(\u001b[22m\u001b[39m\u001b[90mfrequency\u001b[39m\u001b[90m\u001b[1m)\u001b[22m\u001b[39m\u001b[90m by time\u001b[39m     6.48 ms \u001b[0m\u001b[1m<\u001b[22m\n",
+       "  \u001b[39m█\u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m▁\u001b[34m▃\u001b[39m\u001b[32m \u001b[39m\u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m▂\u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \n",
+       "  \u001b[39m█\u001b[39m▂\u001b[39m▂\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▂\u001b[39m▂\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▂\u001b[39m█\u001b[34m█\u001b[39m\u001b[32m▃\u001b[39m\u001b[39m▂\u001b[39m▂\u001b[39m▁\u001b[39m▂\u001b[39m▁\u001b[39m▁\u001b[39m▂\u001b[39m▁\u001b[39m▂\u001b[39m▂\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▃\u001b[39m▆\u001b[39m█\u001b[39m▄\u001b[39m▂\u001b[39m▂\u001b[39m▁\u001b[39m▂\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▂\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▂\u001b[39m▁\u001b[39m▁\u001b[39m▂\u001b[39m▃\u001b[39m \u001b[39m▂\n",
+       "  2.48 ms\u001b[90m        Histogram: frequency by time\u001b[39m       7.29 ms \u001b[0m\u001b[1m<\u001b[22m\n",
        "\n",
        " Memory estimate\u001b[90m: \u001b[39m\u001b[33m37.91 KiB\u001b[39m, allocs estimate\u001b[90m: \u001b[39m\u001b[33m68\u001b[39m."
       ]
      },
-     "execution_count": 16,
+     "execution_count": 12,
      "metadata": {},
      "output_type": "execute_result"
     }
@@ -1995,7 +2029,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 15,
+   "execution_count": 13,
    "id": "e4172c95-5a01-42eb-b461-98dd1e6d21d9",
    "metadata": {
     "editable": true,
@@ -2011,287 +2045,293 @@
        "\n",
        "\n",
        "\n",
+       "     xmlns=\"http://www.w3.org/2000/svg\" id=\"fig-3691c1c50979485393cf260276e212b8\">\n",
        "\n",
-       "    \n",
+       "    \n",
        "        \n",
        "    \n",
        "\n",
        "\n",
-       "\n",
-       "\n",
-       "Profile results\n",
-       "\n",
-       "\n",
+       "\n",
+       "\n",
+       "Profile results\n",
+       "\n",
+       "\n",
        " in :-1\n",
-       "\n",
-       "#15 in eventloop.jl:38\n",
-       "\n",
-       "eventloop in eventloop.jl:8\n",
-       "\n",
-       "invokelatest in essentials.jl:889\n",
-       "\n",
-       "#invokelatest#2 in essentials.jl:892\n",
-       "\n",
-       "execute_request in execute_request.jl:67\n",
-       "\n",
-       "softscope_include_string in SoftGlobalScope.jl:65\n",
-       "\n",
-       "include_string in loading.jl:2076\n",
-       "\n",
-       "eval in boot.jl:385\n",
-       "\n",
-       "test_apply_inplace in In[15]:6\n",
-       "\n",
-       "macro expansion in Profile.jl:44\n",
-       "\n",
-       "apply_all_inplace in In[12]:24\n",
-       "\n",
-       "apply_all_inplace in In[12]:0\n",
-       "\n",
-       "apply_all_inplace in In[12]:12\n",
-       "\n",
-       "zero in abstractarray.jl:1206\n",
-       "\n",
-       "fill! in array.jl:0\n",
-       "\n",
-       "fill! in array.jl:394\n",
-       "\n",
-       "eachindex in abstractarray.jl:321\n",
-       "\n",
-       "axes1 in abstractarray.jl:137\n",
-       "\n",
-       "axes in abstractarray.jl:98\n",
-       "\n",
-       "size in array.jl:191\n",
-       "\n",
+       "\n",
+       "apply_all_inplace in In[11]:15\n",
+       "\n",
+       "copyto! in array.jl:388\n",
+       "\n",
+       "copyto! in array.jl:368\n",
+       "\n",
+       "_copyto_impl! in array.jl:371\n",
+       "\n",
+       "#15 in eventloop.jl:38\n",
+       "\n",
+       "eventloop in eventloop.jl:8\n",
+       "\n",
+       "invokelatest in essentials.jl:889\n",
+       "\n",
+       "#invokelatest#2 in essentials.jl:892\n",
+       "\n",
+       "execute_request in execute_request.jl:67\n",
+       "\n",
+       "softscope_include_string in SoftGlobalScope.jl:65\n",
+       "\n",
+       "include_string in loading.jl:2076\n",
+       "\n",
+       "eval in boot.jl:385\n",
+       "\n",
+       "test_apply_inplace in In[13]:6\n",
+       "\n",
+       "macro expansion in Profile.jl:44\n",
+       "\n",
+       "apply_all_inplace in In[11]:24\n",
+       "\n",
+       "apply_all_inplace in In[11]:0\n",
+       "\n",
+       "apply_all_inplace in In[11]:12\n",
+       "\n",
+       "zero in abstractarray.jl:1206\n",
+       "\n",
        "similar in array.jl:417\n",
-       "\n",
-       "size in array.jl:190\n",
-       "\n",
-       "Array in boot.jl:477\n",
-       "\n",
-       "apply_all_inplace in In[12]:13\n",
-       "\n",
-       "iterate in array.jl:945\n",
-       "\n",
-       "iterate in array.jl:945\n",
-       "\n",
-       "getindex in essentials.jl:13\n",
-       "\n",
-       "apply_all_inplace in In[12]:14\n",
-       "\n",
-       "apply! in In[12]:2\n",
-       "\n",
-       "apply! in In[12]:5\n",
-       "\n",
-       "mul! in matmul.jl:237\n",
-       "\n",
-       "mul! in matmul.jl:66\n",
-       "\n",
-       "generic_matvecmul! in matmul.jl:71\n",
-       "\n",
-       "gemv! in matmul.jl:0\n",
-       "\n",
-       "gemv! in matmul.jl:401\n",
-       "\n",
-       "gemv! in matmul.jl:404\n",
-       "\n",
-       "length in essentials.jl:10\n",
-       "\n",
-       "gemv! in matmul.jl:406\n",
-       "\n",
-       "length in essentials.jl:10\n",
-       "\n",
-       "gemv! in matmul.jl:408\n",
-       "\n",
-       "gemv! in matmul.jl:409\n",
-       "\n",
-       "gemv! in matmul.jl:415\n",
-       "\n",
-       "gemv! in blas.jl:0\n",
-       "\n",
-       "gemv! in blas.jl:643\n",
-       "\n",
-       "gemv! in blas.jl:647\n",
-       "\n",
-       "size in array.jl:190\n",
-       "\n",
-       "gemv! in blas.jl:659\n",
-       "\n",
-       "pointer in abstractarray.jl:1237\n",
-       "\n",
-       "unsafe_convert in pointer.jl:65\n",
-       "\n",
-       "gemv! in blas.jl:667\n",
-       "\n",
-       "cconvert in essentials.jl:543\n",
-       "\n",
-       "convert in refpointer.jl:105\n",
-       "\n",
-       "RefValue in refvalue.jl:8\n",
-       "\n",
-       "apply! in In[12]:7\n",
-       "\n",
-       "materialize! in broadcast.jl:911\n",
-       "\n",
-       "materialize! in broadcast.jl:914\n",
-       "\n",
-       "copyto! in broadcast.jl:956\n",
-       "\n",
-       "copyto! in broadcast.jl:1000\n",
-       "\n",
-       "preprocess in broadcast.jl:983\n",
-       "\n",
-       "preprocess_args in broadcast.jl:986\n",
-       "\n",
-       "preprocess_args in broadcast.jl:987\n",
-       "\n",
-       "preprocess in broadcast.jl:984\n",
-       "\n",
-       "broadcast_unalias in broadcast.jl:977\n",
-       "\n",
-       "copyto! in broadcast.jl:1003\n",
-       "\n",
-       "macro expansion in simdloop.jl:72\n",
-       "\n",
-       "macro expansion in simdloop.jl:75\n",
-       "\n",
-       "macro expansion in simdloop.jl:77\n",
-       "\n",
-       "macro expansion in broadcast.jl:1004\n",
-       "\n",
-       "setindex! in array.jl:1021\n",
-       "\n",
-       "getindex in broadcast.jl:636\n",
-       "\n",
-       "_broadcast_getindex in broadcast.jl:681\n",
-       "\n",
-       "_getindex in broadcast.jl:705\n",
-       "\n",
-       "_broadcast_getindex in broadcast.jl:675\n",
-       "\n",
-       "getindex in essentials.jl:13\n",
-       "\n",
-       "_getindex in broadcast.jl:706\n",
-       "\n",
-       "_broadcast_getindex in broadcast.jl:675\n",
-       "\n",
-       "getindex in essentials.jl:13\n",
-       "\n",
-       "macro expansion in simdloop.jl:78\n",
-       "\n",
-       "+ in int.jl:87\n",
-       "\n",
-       "apply_all_inplace in In[12]:15\n",
-       "\n",
-       "copyto! in array.jl:388\n",
-       "\n",
-       "copyto! in array.jl:368\n",
-       "\n",
-       "_copyto_impl! in array.jl:0\n",
-       "\n",
-       "_copyto_impl! in array.jl:371\n",
-       "\n",
-       "_copyto_impl! in array.jl:373\n",
-       "\n",
-       "_copyto_impl! in array.jl:374\n",
-       "\n",
-       "checkbounds in abstractarray.jl:702\n",
-       "\n",
-       "checkbounds in abstractarray.jl:687\n",
-       "\n",
-       "eachindex in abstractarray.jl:389\n",
-       "\n",
-       "axes1 in abstractarray.jl:137\n",
-       "\n",
-       "axes in abstractarray.jl:98\n",
-       "\n",
-       "size in array.jl:191\n",
-       "\n",
-       "_copyto_impl! in array.jl:375\n",
-       "\n",
-       "checkbounds in abstractarray.jl:702\n",
-       "\n",
-       "checkbounds in abstractarray.jl:687\n",
-       "\n",
-       "eachindex in abstractarray.jl:389\n",
-       "\n",
-       "axes1 in abstractarray.jl:137\n",
-       "\n",
-       "axes in abstractarray.jl:98\n",
-       "\n",
-       "size in array.jl:191\n",
-       "\n",
-       "_copyto_impl! in array.jl:376\n",
-       "\n",
-       "unsafe_copyto! in array.jl:337\n",
-       "\n",
-       "memmove in cmem.jl:26\n",
-       "\n",
-       "* in int.jl:88\n",
-       "\n",
-       "length in essentials.jl:10\n",
-       "\n",
-       "apply_all_inplace in In[12]:16\n",
-       "\n",
-       "iterate in array.jl:945\n",
-       "\n",
-       "getindex in essentials.jl:13\n",
-       "\n",
-       "push! in array.jl:1119\n",
-       "\n",
-       "_growend! in array.jl:1072\n",
-       "\n",
-       "push! in array.jl:1120\n",
-       "\n",
-       "__inbounds_setindex! in array.jl:1026\n",
-       "\n",
-       "apply_all_inplace in int.jl:0\n",
-       "\n",
-       "apply_all_inplace in In[12]:25\n",
-       "\n",
-       "iterate in array.jl:945\n",
-       "\n",
-       "length in essentials.jl:10\n",
-       "\n",
-       "gemv! in blas.jl:667\n",
+       "\n",
+       "Array in boot.jl:477\n",
+       "\n",
+       "apply_all_inplace in In[11]:13\n",
+       "\n",
+       "iterate in array.jl:945\n",
+       "\n",
+       "iterate in array.jl:945\n",
+       "\n",
+       "length in essentials.jl:10\n",
+       "\n",
+       "apply_all_inplace in In[11]:14\n",
+       "\n",
+       "apply! in In[11]:2\n",
+       "\n",
+       "apply! in In[11]:5\n",
+       "\n",
+       "getproperty in Base.jl:37\n",
+       "\n",
+       "mul! in matmul.jl:237\n",
+       "\n",
+       "mul! in matmul.jl:66\n",
+       "\n",
+       "generic_matvecmul! in matmul.jl:71\n",
+       "\n",
+       "gemv! in matmul.jl:0\n",
+       "\n",
+       "gemv! in matmul.jl:401\n",
+       "\n",
+       "gemv! in matmul.jl:404\n",
+       "\n",
+       "length in essentials.jl:10\n",
+       "\n",
+       "gemv! in matmul.jl:406\n",
+       "\n",
+       "length in essentials.jl:10\n",
+       "\n",
+       "gemv! in matmul.jl:409\n",
+       "\n",
+       "gemv! in matmul.jl:410\n",
+       "\n",
+       "promote in promotion.jl:399\n",
+       "\n",
+       "_promote in promotion.jl:377\n",
+       "\n",
+       "convert in number.jl:7\n",
+       "\n",
+       "Float32 in float.jl:165\n",
+       "\n",
+       "gemv! in matmul.jl:415\n",
+       "\n",
+       "gemv! in blas.jl:0\n",
+       "\n",
+       "gemv! in blas.jl:643\n",
+       "\n",
+       "gemv! in blas.jl:647\n",
+       "\n",
+       "size in array.jl:190\n",
+       "\n",
+       "gemv! in blas.jl:648\n",
+       "\n",
+       "gemv! in blas.jl:659\n",
+       "\n",
+       "pointer in abstractarray.jl:1237\n",
+       "\n",
+       "unsafe_convert in pointer.jl:65\n",
+       "\n",
+       "gemv! in blas.jl:667\n",
+       "\n",
+       "cconvert in essentials.jl:543\n",
+       "\n",
+       "convert in refpointer.jl:105\n",
+       "\n",
+       "RefValue in refvalue.jl:8\n",
+       "\n",
+       "apply! in In[11]:7\n",
+       "\n",
+       "getproperty in Base.jl:37\n",
+       "\n",
+       "materialize! in broadcast.jl:911\n",
+       "\n",
+       "materialize! in broadcast.jl:914\n",
+       "\n",
+       "copyto! in broadcast.jl:956\n",
+       "\n",
+       "copyto! in broadcast.jl:1000\n",
+       "\n",
+       "preprocess in broadcast.jl:983\n",
+       "\n",
+       "preprocess_args in broadcast.jl:986\n",
+       "\n",
+       "preprocess_args in broadcast.jl:987\n",
+       "\n",
+       "preprocess in broadcast.jl:984\n",
+       "\n",
+       "broadcast_unalias in broadcast.jl:977\n",
+       "\n",
+       "copyto! in broadcast.jl:1003\n",
+       "\n",
+       "macro expansion in simdloop.jl:0\n",
+       "\n",
+       "macro expansion in simdloop.jl:72\n",
+       "\n",
+       "macro expansion in simdloop.jl:75\n",
+       "\n",
+       "macro expansion in simdloop.jl:77\n",
+       "\n",
+       "macro expansion in broadcast.jl:1004\n",
+       "\n",
+       "setindex! in array.jl:1021\n",
+       "\n",
+       "getindex in broadcast.jl:636\n",
+       "\n",
+       "_broadcast_getindex in broadcast.jl:681\n",
+       "\n",
+       "_getindex in broadcast.jl:705\n",
+       "\n",
+       "_broadcast_getindex in broadcast.jl:675\n",
+       "\n",
+       "getindex in essentials.jl:13\n",
+       "\n",
+       "_getindex in broadcast.jl:706\n",
+       "\n",
+       "_broadcast_getindex in broadcast.jl:675\n",
+       "\n",
+       "getindex in essentials.jl:13\n",
+       "\n",
+       "macro expansion in simdloop.jl:78\n",
+       "\n",
+       "+ in int.jl:87\n",
+       "\n",
+       "apply_all_inplace in In[11]:15\n",
+       "\n",
+       "copyto! in array.jl:388\n",
+       "\n",
+       "copyto! in array.jl:368\n",
+       "\n",
+       "_copyto_impl! in array.jl:0\n",
+       "\n",
+       "_copyto_impl! in array.jl:371\n",
+       "\n",
+       "_copyto_impl! in array.jl:373\n",
+       "\n",
+       "_copyto_impl! in array.jl:374\n",
+       "\n",
+       "checkbounds in abstractarray.jl:702\n",
+       "\n",
+       "checkbounds in abstractarray.jl:687\n",
+       "\n",
+       "eachindex in abstractarray.jl:389\n",
+       "\n",
+       "axes1 in abstractarray.jl:137\n",
+       "\n",
+       "axes in abstractarray.jl:98\n",
+       "\n",
+       "size in array.jl:191\n",
+       "\n",
+       "_copyto_impl! in array.jl:375\n",
+       "\n",
+       "checkbounds in abstractarray.jl:702\n",
+       "\n",
+       "checkbounds in abstractarray.jl:687\n",
+       "\n",
+       "eachindex in abstractarray.jl:389\n",
+       "\n",
+       "axes1 in abstractarray.jl:137\n",
+       "\n",
+       "axes in abstractarray.jl:98\n",
+       "\n",
+       "size in array.jl:191\n",
+       "\n",
+       "_copyto_impl! in array.jl:376\n",
+       "\n",
+       "unsafe_copyto! in array.jl:337\n",
+       "\n",
+       "memmove in cmem.jl:26\n",
+       "\n",
+       "* in int.jl:88\n",
+       "\n",
+       "length in essentials.jl:10\n",
+       "\n",
+       "apply_all_inplace in In[11]:16\n",
+       "\n",
+       "iterate in array.jl:945\n",
+       "\n",
+       "getindex in essentials.jl:13\n",
+       "\n",
+       "push! in array.jl:1119\n",
+       "\n",
+       "_growend! in array.jl:1072\n",
+       "\n",
+       "apply_all_inplace in int.jl:0\n",
+       "\n",
+       "apply_all_inplace in In[11]:25\n",
+       "\n",
+       "iterate in array.jl:945\n",
+       "\n",
+       "getindex in essentials.jl:13\n",
+       "\n",
+       "gemv! in blas.jl:667\n",
        "\n",
        "\n",
        "\n"
@@ -2692,287 +2732,293 @@
        "\n",
        "\n",
        "\n",
+       "     xmlns=\"http://www.w3.org/2000/svg\" id=\"fig-1737eb8ea41b4cf393b06202ec8d2c5a\">\n",
        "\n",
-       "    \n",
+       "    \n",
        "        \n",
        "    \n",
        "\n",
        "\n",
-       "\n",
-       "\n",
-       "Profile results\n",
-       "\n",
-       "\n",
+       "\n",
+       "\n",
+       "Profile results\n",
+       "\n",
+       "\n",
        " in :-1\n",
-       "\n",
-       "#15 in eventloop.jl:38\n",
-       "\n",
-       "eventloop in eventloop.jl:8\n",
-       "\n",
-       "invokelatest in essentials.jl:889\n",
-       "\n",
-       "#invokelatest#2 in essentials.jl:892\n",
-       "\n",
-       "execute_request in execute_request.jl:67\n",
-       "\n",
-       "softscope_include_string in SoftGlobalScope.jl:65\n",
-       "\n",
-       "include_string in loading.jl:2076\n",
-       "\n",
-       "eval in boot.jl:385\n",
-       "\n",
-       "test_apply_inplace in In[15]:6\n",
-       "\n",
-       "macro expansion in Profile.jl:44\n",
-       "\n",
-       "apply_all_inplace in In[12]:24\n",
-       "\n",
-       "apply_all_inplace in In[12]:0\n",
-       "\n",
-       "apply_all_inplace in In[12]:12\n",
-       "\n",
-       "zero in abstractarray.jl:1206\n",
-       "\n",
-       "fill! in array.jl:0\n",
-       "\n",
-       "fill! in array.jl:394\n",
-       "\n",
-       "eachindex in abstractarray.jl:321\n",
-       "\n",
-       "axes1 in abstractarray.jl:137\n",
-       "\n",
-       "axes in abstractarray.jl:98\n",
-       "\n",
-       "size in array.jl:191\n",
-       "\n",
+       "\n",
+       "apply_all_inplace in In[11]:15\n",
+       "\n",
+       "copyto! in array.jl:388\n",
+       "\n",
+       "copyto! in array.jl:368\n",
+       "\n",
+       "_copyto_impl! in array.jl:371\n",
+       "\n",
+       "#15 in eventloop.jl:38\n",
+       "\n",
+       "eventloop in eventloop.jl:8\n",
+       "\n",
+       "invokelatest in essentials.jl:889\n",
+       "\n",
+       "#invokelatest#2 in essentials.jl:892\n",
+       "\n",
+       "execute_request in execute_request.jl:67\n",
+       "\n",
+       "softscope_include_string in SoftGlobalScope.jl:65\n",
+       "\n",
+       "include_string in loading.jl:2076\n",
+       "\n",
+       "eval in boot.jl:385\n",
+       "\n",
+       "test_apply_inplace in In[13]:6\n",
+       "\n",
+       "macro expansion in Profile.jl:44\n",
+       "\n",
+       "apply_all_inplace in In[11]:24\n",
+       "\n",
+       "apply_all_inplace in In[11]:0\n",
+       "\n",
+       "apply_all_inplace in In[11]:12\n",
+       "\n",
+       "zero in abstractarray.jl:1206\n",
+       "\n",
        "similar in array.jl:417\n",
-       "\n",
-       "size in array.jl:190\n",
-       "\n",
-       "Array in boot.jl:477\n",
-       "\n",
-       "apply_all_inplace in In[12]:13\n",
-       "\n",
-       "iterate in array.jl:945\n",
-       "\n",
-       "iterate in array.jl:945\n",
-       "\n",
-       "getindex in essentials.jl:13\n",
-       "\n",
-       "apply_all_inplace in In[12]:14\n",
-       "\n",
-       "apply! in In[12]:2\n",
-       "\n",
-       "apply! in In[12]:5\n",
-       "\n",
-       "mul! in matmul.jl:237\n",
-       "\n",
-       "mul! in matmul.jl:66\n",
-       "\n",
-       "generic_matvecmul! in matmul.jl:71\n",
-       "\n",
-       "gemv! in matmul.jl:0\n",
-       "\n",
-       "gemv! in matmul.jl:401\n",
-       "\n",
-       "gemv! in matmul.jl:404\n",
-       "\n",
-       "length in essentials.jl:10\n",
-       "\n",
-       "gemv! in matmul.jl:406\n",
-       "\n",
-       "length in essentials.jl:10\n",
-       "\n",
-       "gemv! in matmul.jl:408\n",
-       "\n",
-       "gemv! in matmul.jl:409\n",
-       "\n",
-       "gemv! in matmul.jl:415\n",
-       "\n",
-       "gemv! in blas.jl:0\n",
-       "\n",
-       "gemv! in blas.jl:643\n",
-       "\n",
-       "gemv! in blas.jl:647\n",
-       "\n",
-       "size in array.jl:190\n",
-       "\n",
-       "gemv! in blas.jl:659\n",
-       "\n",
-       "pointer in abstractarray.jl:1237\n",
-       "\n",
-       "unsafe_convert in pointer.jl:65\n",
-       "\n",
-       "gemv! in blas.jl:667\n",
-       "\n",
-       "cconvert in essentials.jl:543\n",
-       "\n",
-       "convert in refpointer.jl:105\n",
-       "\n",
-       "RefValue in refvalue.jl:8\n",
-       "\n",
-       "apply! in In[12]:7\n",
-       "\n",
-       "materialize! in broadcast.jl:911\n",
-       "\n",
-       "materialize! in broadcast.jl:914\n",
-       "\n",
-       "copyto! in broadcast.jl:956\n",
-       "\n",
-       "copyto! in broadcast.jl:1000\n",
-       "\n",
-       "preprocess in broadcast.jl:983\n",
-       "\n",
-       "preprocess_args in broadcast.jl:986\n",
-       "\n",
-       "preprocess_args in broadcast.jl:987\n",
-       "\n",
-       "preprocess in broadcast.jl:984\n",
-       "\n",
-       "broadcast_unalias in broadcast.jl:977\n",
-       "\n",
-       "copyto! in broadcast.jl:1003\n",
-       "\n",
-       "macro expansion in simdloop.jl:72\n",
-       "\n",
-       "macro expansion in simdloop.jl:75\n",
-       "\n",
-       "macro expansion in simdloop.jl:77\n",
-       "\n",
-       "macro expansion in broadcast.jl:1004\n",
-       "\n",
-       "setindex! in array.jl:1021\n",
-       "\n",
-       "getindex in broadcast.jl:636\n",
-       "\n",
-       "_broadcast_getindex in broadcast.jl:681\n",
-       "\n",
-       "_getindex in broadcast.jl:705\n",
-       "\n",
-       "_broadcast_getindex in broadcast.jl:675\n",
-       "\n",
-       "getindex in essentials.jl:13\n",
-       "\n",
-       "_getindex in broadcast.jl:706\n",
-       "\n",
-       "_broadcast_getindex in broadcast.jl:675\n",
-       "\n",
-       "getindex in essentials.jl:13\n",
-       "\n",
-       "macro expansion in simdloop.jl:78\n",
-       "\n",
-       "+ in int.jl:87\n",
-       "\n",
-       "apply_all_inplace in In[12]:15\n",
-       "\n",
-       "copyto! in array.jl:388\n",
-       "\n",
-       "copyto! in array.jl:368\n",
-       "\n",
-       "_copyto_impl! in array.jl:0\n",
-       "\n",
-       "_copyto_impl! in array.jl:371\n",
-       "\n",
-       "_copyto_impl! in array.jl:373\n",
-       "\n",
-       "_copyto_impl! in array.jl:374\n",
-       "\n",
-       "checkbounds in abstractarray.jl:702\n",
-       "\n",
-       "checkbounds in abstractarray.jl:687\n",
-       "\n",
-       "eachindex in abstractarray.jl:389\n",
-       "\n",
-       "axes1 in abstractarray.jl:137\n",
-       "\n",
-       "axes in abstractarray.jl:98\n",
-       "\n",
-       "size in array.jl:191\n",
-       "\n",
-       "_copyto_impl! in array.jl:375\n",
-       "\n",
-       "checkbounds in abstractarray.jl:702\n",
-       "\n",
-       "checkbounds in abstractarray.jl:687\n",
-       "\n",
-       "eachindex in abstractarray.jl:389\n",
-       "\n",
-       "axes1 in abstractarray.jl:137\n",
-       "\n",
-       "axes in abstractarray.jl:98\n",
-       "\n",
-       "size in array.jl:191\n",
-       "\n",
-       "_copyto_impl! in array.jl:376\n",
-       "\n",
-       "unsafe_copyto! in array.jl:337\n",
-       "\n",
-       "memmove in cmem.jl:26\n",
-       "\n",
-       "* in int.jl:88\n",
-       "\n",
-       "length in essentials.jl:10\n",
-       "\n",
-       "apply_all_inplace in In[12]:16\n",
-       "\n",
-       "iterate in array.jl:945\n",
-       "\n",
-       "getindex in essentials.jl:13\n",
-       "\n",
-       "push! in array.jl:1119\n",
-       "\n",
-       "_growend! in array.jl:1072\n",
-       "\n",
-       "push! in array.jl:1120\n",
-       "\n",
-       "__inbounds_setindex! in array.jl:1026\n",
-       "\n",
-       "apply_all_inplace in int.jl:0\n",
-       "\n",
-       "apply_all_inplace in In[12]:25\n",
-       "\n",
-       "iterate in array.jl:945\n",
-       "\n",
-       "length in essentials.jl:10\n",
-       "\n",
-       "gemv! in blas.jl:667\n",
+       "\n",
+       "Array in boot.jl:477\n",
+       "\n",
+       "apply_all_inplace in In[11]:13\n",
+       "\n",
+       "iterate in array.jl:945\n",
+       "\n",
+       "iterate in array.jl:945\n",
+       "\n",
+       "length in essentials.jl:10\n",
+       "\n",
+       "apply_all_inplace in In[11]:14\n",
+       "\n",
+       "apply! in In[11]:2\n",
+       "\n",
+       "apply! in In[11]:5\n",
+       "\n",
+       "getproperty in Base.jl:37\n",
+       "\n",
+       "mul! in matmul.jl:237\n",
+       "\n",
+       "mul! in matmul.jl:66\n",
+       "\n",
+       "generic_matvecmul! in matmul.jl:71\n",
+       "\n",
+       "gemv! in matmul.jl:0\n",
+       "\n",
+       "gemv! in matmul.jl:401\n",
+       "\n",
+       "gemv! in matmul.jl:404\n",
+       "\n",
+       "length in essentials.jl:10\n",
+       "\n",
+       "gemv! in matmul.jl:406\n",
+       "\n",
+       "length in essentials.jl:10\n",
+       "\n",
+       "gemv! in matmul.jl:409\n",
+       "\n",
+       "gemv! in matmul.jl:410\n",
+       "\n",
+       "promote in promotion.jl:399\n",
+       "\n",
+       "_promote in promotion.jl:377\n",
+       "\n",
+       "convert in number.jl:7\n",
+       "\n",
+       "Float32 in float.jl:165\n",
+       "\n",
+       "gemv! in matmul.jl:415\n",
+       "\n",
+       "gemv! in blas.jl:0\n",
+       "\n",
+       "gemv! in blas.jl:643\n",
+       "\n",
+       "gemv! in blas.jl:647\n",
+       "\n",
+       "size in array.jl:190\n",
+       "\n",
+       "gemv! in blas.jl:648\n",
+       "\n",
+       "gemv! in blas.jl:659\n",
+       "\n",
+       "pointer in abstractarray.jl:1237\n",
+       "\n",
+       "unsafe_convert in pointer.jl:65\n",
+       "\n",
+       "gemv! in blas.jl:667\n",
+       "\n",
+       "cconvert in essentials.jl:543\n",
+       "\n",
+       "convert in refpointer.jl:105\n",
+       "\n",
+       "RefValue in refvalue.jl:8\n",
+       "\n",
+       "apply! in In[11]:7\n",
+       "\n",
+       "getproperty in Base.jl:37\n",
+       "\n",
+       "materialize! in broadcast.jl:911\n",
+       "\n",
+       "materialize! in broadcast.jl:914\n",
+       "\n",
+       "copyto! in broadcast.jl:956\n",
+       "\n",
+       "copyto! in broadcast.jl:1000\n",
+       "\n",
+       "preprocess in broadcast.jl:983\n",
+       "\n",
+       "preprocess_args in broadcast.jl:986\n",
+       "\n",
+       "preprocess_args in broadcast.jl:987\n",
+       "\n",
+       "preprocess in broadcast.jl:984\n",
+       "\n",
+       "broadcast_unalias in broadcast.jl:977\n",
+       "\n",
+       "copyto! in broadcast.jl:1003\n",
+       "\n",
+       "macro expansion in simdloop.jl:0\n",
+       "\n",
+       "macro expansion in simdloop.jl:72\n",
+       "\n",
+       "macro expansion in simdloop.jl:75\n",
+       "\n",
+       "macro expansion in simdloop.jl:77\n",
+       "\n",
+       "macro expansion in broadcast.jl:1004\n",
+       "\n",
+       "setindex! in array.jl:1021\n",
+       "\n",
+       "getindex in broadcast.jl:636\n",
+       "\n",
+       "_broadcast_getindex in broadcast.jl:681\n",
+       "\n",
+       "_getindex in broadcast.jl:705\n",
+       "\n",
+       "_broadcast_getindex in broadcast.jl:675\n",
+       "\n",
+       "getindex in essentials.jl:13\n",
+       "\n",
+       "_getindex in broadcast.jl:706\n",
+       "\n",
+       "_broadcast_getindex in broadcast.jl:675\n",
+       "\n",
+       "getindex in essentials.jl:13\n",
+       "\n",
+       "macro expansion in simdloop.jl:78\n",
+       "\n",
+       "+ in int.jl:87\n",
+       "\n",
+       "apply_all_inplace in In[11]:15\n",
+       "\n",
+       "copyto! in array.jl:388\n",
+       "\n",
+       "copyto! in array.jl:368\n",
+       "\n",
+       "_copyto_impl! in array.jl:0\n",
+       "\n",
+       "_copyto_impl! in array.jl:371\n",
+       "\n",
+       "_copyto_impl! in array.jl:373\n",
+       "\n",
+       "_copyto_impl! in array.jl:374\n",
+       "\n",
+       "checkbounds in abstractarray.jl:702\n",
+       "\n",
+       "checkbounds in abstractarray.jl:687\n",
+       "\n",
+       "eachindex in abstractarray.jl:389\n",
+       "\n",
+       "axes1 in abstractarray.jl:137\n",
+       "\n",
+       "axes in abstractarray.jl:98\n",
+       "\n",
+       "size in array.jl:191\n",
+       "\n",
+       "_copyto_impl! in array.jl:375\n",
+       "\n",
+       "checkbounds in abstractarray.jl:702\n",
+       "\n",
+       "checkbounds in abstractarray.jl:687\n",
+       "\n",
+       "eachindex in abstractarray.jl:389\n",
+       "\n",
+       "axes1 in abstractarray.jl:137\n",
+       "\n",
+       "axes in abstractarray.jl:98\n",
+       "\n",
+       "size in array.jl:191\n",
+       "\n",
+       "_copyto_impl! in array.jl:376\n",
+       "\n",
+       "unsafe_copyto! in array.jl:337\n",
+       "\n",
+       "memmove in cmem.jl:26\n",
+       "\n",
+       "* in int.jl:88\n",
+       "\n",
+       "length in essentials.jl:10\n",
+       "\n",
+       "apply_all_inplace in In[11]:16\n",
+       "\n",
+       "iterate in array.jl:945\n",
+       "\n",
+       "getindex in essentials.jl:13\n",
+       "\n",
+       "push! in array.jl:1119\n",
+       "\n",
+       "_growend! in array.jl:1072\n",
+       "\n",
+       "apply_all_inplace in int.jl:0\n",
+       "\n",
+       "apply_all_inplace in In[11]:25\n",
+       "\n",
+       "iterate in array.jl:945\n",
+       "\n",
+       "getindex in essentials.jl:13\n",
+       "\n",
+       "gemv! in blas.jl:667\n",
        "\n",
        "\n",
        "\n",
@@ -3371,10 +3417,10 @@
        "\n"
       ],
       "text/plain": [
-       "ProfileSVG.FGConfig(Node(FlameGraphs.NodeData(ip:0x0, 0x01, 1:33308)), Dict{Symbol, Any}(), FlameGraphs.FlameColors(ColorTypes.RGB{FixedPointNumbers.N0f8}[RGB{N0f8}(0.882,0.698,1.0), RGB{N0f8}(0.435,0.863,0.569), RGB{N0f8}(0.0,0.71,0.545), RGB{N0f8}(0.173,0.639,1.0)], RGB{N0f8}(1.0,1.0,1.0), RGB{N0f8}(0.0,0.0,0.0), ColorTypes.RGB{FixedPointNumbers.N0f8}[RGB{N0f8}(0.953,0.0,0.302), RGB{N0f8}(0.894,0.0,0.255), RGB{N0f8}(0.831,0.129,0.216), RGB{N0f8}(0.773,0.192,0.184)], ColorTypes.RGB{FixedPointNumbers.N0f8}[RGB{N0f8}(1.0,0.627,0.0), RGB{N0f8}(1.0,0.643,0.0), RGB{N0f8}(0.965,0.651,0.039), RGB{N0f8}(0.894,0.655,0.11)]), :fcolor, :fcolor, 1.0, false, 50, 2000, 960.0, 0.0, 2.0, \"inherit\", 12.0, false, :none, 0.001, \"Profile results\")"
+       "ProfileSVG.FGConfig(Node(FlameGraphs.NodeData(ip:0x0, 0x01, 1:43254)), Dict{Symbol, Any}(), FlameGraphs.FlameColors(ColorTypes.RGB{FixedPointNumbers.N0f8}[RGB{N0f8}(0.882,0.698,1.0), RGB{N0f8}(0.435,0.863,0.569), RGB{N0f8}(0.0,0.71,0.545), RGB{N0f8}(0.173,0.639,1.0)], RGB{N0f8}(1.0,1.0,1.0), RGB{N0f8}(0.0,0.0,0.0), ColorTypes.RGB{FixedPointNumbers.N0f8}[RGB{N0f8}(0.953,0.0,0.302), RGB{N0f8}(0.894,0.0,0.255), RGB{N0f8}(0.831,0.129,0.216), RGB{N0f8}(0.773,0.192,0.184)], ColorTypes.RGB{FixedPointNumbers.N0f8}[RGB{N0f8}(1.0,0.627,0.0), RGB{N0f8}(1.0,0.643,0.0), RGB{N0f8}(0.965,0.651,0.039), RGB{N0f8}(0.894,0.655,0.11)]), :fcolor, :fcolor, 1.0, false, 50, 2000, 960.0, 0.0, 2.0, \"inherit\", 12.0, false, :none, 0.001, \"Profile results\")"
       ]
      },
-     "execution_count": 15,
+     "execution_count": 13,
      "metadata": {},
      "output_type": "execute_result"
     }
@@ -3416,7 +3462,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 1,
+   "execution_count": 14,
    "id": "7a27f89e",
    "metadata": {
     "editable": true,
@@ -3435,7 +3481,7 @@
        " NaN"
       ]
      },
-     "execution_count": 1,
+     "execution_count": 14,
      "metadata": {},
      "output_type": "execute_result"
     }
@@ -3459,7 +3505,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 2,
+   "execution_count": 15,
    "id": "e4a775ea",
    "metadata": {
     "editable": true,
@@ -3475,7 +3521,7 @@
        "outer (generic function with 1 method)"
       ]
      },
-     "execution_count": 2,
+     "execution_count": 15,
      "metadata": {},
      "output_type": "execute_result"
     }
@@ -3659,7 +3705,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 20,
+   "execution_count": 16,
    "id": "49fadbbc",
    "metadata": {
     "editable": true,
@@ -3669,20 +3715,13 @@
     "tags": []
    },
    "outputs": [
-    {
-     "name": "stderr",
-     "output_type": "stream",
-     "text": [
-      "WARNING: replacing module Foo.\n"
-     ]
-    },
     {
      "data": {
       "text/plain": [
        "Main.Foo"
       ]
      },
-     "execution_count": 20,
+     "execution_count": 16,
      "metadata": {},
      "output_type": "execute_result"
     }
@@ -3855,7 +3894,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 4,
+   "execution_count": 17,
    "id": "3b91368d",
    "metadata": {
     "editable": true,
@@ -3871,7 +3910,7 @@
        "Main.DemoPackage"
       ]
      },
-     "execution_count": 4,
+     "execution_count": 17,
      "metadata": {},
      "output_type": "execute_result"
     }
@@ -4079,6 +4118,1131 @@
     "  - Don't confirm things you know to be true, you are now your own adversary!\n",
     "  - Every time you fix a bug, consider adding a test to make sure it doesn't come back"
    ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "e993e5ed",
+   "metadata": {
+    "editable": true,
+    "slideshow": {
+     "slide_type": "slide"
+    },
+    "tags": []
+   },
+   "source": [
+    "## Documentation\n",
+    "\n",
+    "- Docstrings are added like Python, but unlike Python support Markdown syntax\n",
+    "- A standard tool for documentation is `Documenter.jl`\n",
+    "- To use it, we'll add its own environment just like for testing (run in your project root folder)\n",
+    "\n",
+    "```\n",
+    "] activate docs\n",
+    "] add Documenter\n",
+    "```\n",
+    "\n",
+    "- Then, add a `make.jl` file in the docs folder:\n",
+    "\n",
+    "\n",
+    "```julia\n",
+    "push!(LOAD_PATH, \"../src/\")  # this makes sure your package can be loaded\n",
+    "using Documenter, DemoPackage\n",
+    "\n",
+    "makedocs(sitename=\"Dual Number Polynomial Differentiation\", remotes=nothing)\n",
+    "```\n",
+    "\n",
+    "- Finally, add an `index.md` file (should be at `DemoPackage/docs/src`):"
+   ]
+  },
+  {
+   "cell_type": "raw",
+   "id": "fab93884-710d-451c-83b9-d55510e0c8fd",
+   "metadata": {
+    "editable": true,
+    "raw_mimetype": "",
+    "slideshow": {
+     "slide_type": "fragment"
+    },
+    "tags": []
+   },
+   "source": [
+    "# Dual Number Polynomial Differentiation\n",
+    "\n",
+    "```@docs\n",
+    "DualNumber\n",
+    "```\n",
+    "\n",
+    "```@docs\n",
+    "Polynomial\n",
+    "```\n",
+    "\n",
+    "## Differentiation\n",
+    "\n",
+    "By using dual numbers with polynomials we can evaluate the derivative! Consider a polynomial ``P(x) = p_0 + p_1 x + \\cdots + p_n x^n``. Then,\n",
+    "\n",
+    "```math\n",
+    "\\begin{aligned}\n",
+    "P(a + bϵ) &= p_0 + p_1 (a + bϵ) + \\cdots + p_n (a + bϵ)^n \\\\\n",
+    "          &= p_0 + p_1 a + p_2 a^2 + \\dots \\\\\n",
+    "          &+ p_1bϵ + 2p_2 abϵ + 3p_3 a^2 b ϵ + \\cdots \\\\\n",
+    "          &= P(a) + bP^\\prime(a)ϵ\n",
+    "\\end{aligned}\n",
+    "```\n",
+    "\n",
+    "```@docs\n",
+    "derivative\n",
+    "```"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "8249f271",
+   "metadata": {
+    "editable": true,
+    "slideshow": {
+     "slide_type": "fragment"
+    },
+    "tags": []
+   },
+   "source": [
+    "- Now, in the `docs` directory, you can build the docs like `julia --project make.jl`\n",
+    "- A good way to run a test serve of them is `python3 -m http.server 8000 --directory build`, which you can then access at `http://localhost:8000`"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "d231701e",
+   "metadata": {
+    "slideshow": {
+     "slide_type": "slide"
+    }
+   },
+   "source": [
+    "## Using `git`\n",
+    "\n",
+    "- I don't want to spend time on using git, but it's a fanastic tool\n",
+    "- A good guide is available [here](https://git-scm.com/book/en/v2)\n",
+    "- _You should use it_\n",
+    "  - Don't ever comment out an old version of code, just branch and delete it!\n",
+    "- A starting `.gitignore` for Julia projects is:\n",
+    "\n",
+    "```\n",
+    ".DS_Store\n",
+    "/docs/build/\n",
+    "/docs/site/\n",
+    ".vscode\n",
+    "*.jl.cov\n",
+    "*.jl.*.cov\n",
+    "/Manifest.toml\n",
+    "/test/Manifest.toml\n",
+    "/docs/Manifest.toml\n",
+    "```"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "77ce0650",
+   "metadata": {
+    "slideshow": {
+     "slide_type": "slide"
+    }
+   },
+   "source": [
+    "## Organizing a Program\n",
+    "\n",
+    "- It's difficult to give concrete instructions\n",
+    "\n",
+    "Things to keep in mind:\n",
+    "\n",
+    "- Code is read more often than it is written\n",
+    "  - Give things meaningful names\n",
+    "  - Write a comment if you had to think about what to do\n",
+    "  - Follow the style guide\n",
+    "  - No \"magic numbers\"\n",
+    "- Humans have atrocious working memory\n",
+    "  - Pieces of your program (modules, types, functions) should have a clear, understandable meaning\n",
+    "  - You should be able to reason abstractly about them"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "5dad5c3d",
+   "metadata": {
+    "editable": true,
+    "slideshow": {
+     "slide_type": "subslide"
+    },
+    "tags": []
+   },
+   "source": [
+    "1. Start with your data.\n",
+    "  - Ask:\n",
+    "    - What does it look like? What's a good representation?\n",
+    "    - The best representation may not be the way you get data\n",
+    "    - Tabular/relational? Time series? Graphical? Tree? Geographical?\n",
+    "    - Which pieces of data always go together?\n",
+    "  - Write types to store your data\n",
+    "    - Types are cheap!\n",
+    "    - If you need strong guarantees, write inner constructors\n",
+    "    - Write some outer constructors for ways you'll be commonly constructing these types\n",
+    "    - Don't be afraid to write your own array type or implement an algebra"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "b95c8ba7",
+   "metadata": {
+    "slideshow": {
+     "slide_type": "fragment"
+    }
+   },
+   "source": [
+    "2. Write some helper functions to get at common information you'll need\n",
+    "  - Functions are cheap!\n",
+    "  - Examples:\n",
+    "    - If you're storing start and end times, write a `duration` function\n",
+    "    - If you're storing polar coordinates, write a function to get Cartesian coordinates\n",
+    "    - If you have a graph, write functions to make it easier to move around/get edge information\n",
+    "  - Make the names descriptive: this helps make your code readable\n",
+    "    - Consider `timer.t_end - timer.t_start` vs `duration(timer)`\n",
+    "    - Or `coord.r * cos(coord.θ)` vs `x(coord)`"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "5ec6f09e",
+   "metadata": {
+    "slideshow": {
+     "slide_type": "fragment"
+    }
+   },
+   "source": [
+    "3. Sketch the main bit of your program\n",
+    "  - The `main` function or your algorithm\n",
+    "  - Keep it very high level\n",
+    "  - Call functions you wish existed\n",
+    "  - Give things meaningful names, autocomplete exists for a reason!"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "6e1b64c8",
+   "metadata": {
+    "slideshow": {
+     "slide_type": "fragment"
+    }
+   },
+   "source": [
+    "4. Fill in functions you named in 3.\n",
+    "  - Also keep them high level, this step is recursive\n",
+    "  - Remember, functions should have a clear semantic meaning\n",
+    "  - If you use a similar bit of code in more than ~three places, consider separating it into a function\n",
+    "  \n",
+    "Clues you may need to write another function:\n",
+    "\n",
+    "- Lots of nested `if`s and `for`s\n",
+    "- Very long functions which do many things"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "f24311ba",
+   "metadata": {
+    "slideshow": {
+     "slide_type": "slide"
+    }
+   },
+   "source": [
+    "## Miscellanea\n",
+    "\n",
+    "- There is so much more to Julia"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "599811b1",
+   "metadata": {
+    "slideshow": {
+     "slide_type": "subslide"
+    }
+   },
+   "source": [
+    "### Some Useful Packages\n",
+    "\n",
+    "- For plotting:\n",
+    "  - `Plots.jl` is very flexible, and can output to many backends\n",
+    "    - It's somewhat slow, especially to get started\n",
+    "    - However, it can output to `pgfplots` so your plots can match your TeX documents\n",
+    "    - The documentation isn't very good\n",
+    "  - `Makie.jl` is a newer project with a focus on performance\n",
+    "    - Can render on GPUs, including ray tracing on AMD GPUs\n",
+    "    - Also can make interactive plots\n",
+    "- For dataframes (like `pandas`), consider `DataFrames.jl`\n",
+    "- `Zygote.jl` does automatic differentiation on whole programs\n",
+    "  - `RayTracer.jl` was a pure-Julia differentiable ray tracer for e.g. inverse graphics \n",
+    "- `Unitful.jl` does arithmetic and conversions on quantities with units with minimal runtime cost\n",
+    "- `Measurements.jl` does uncertainty propagation\n",
+    "- `FFTW.jl` for FFTs, `DifferentialEquations.jl`, `JuMP.jl` & `ModelingToolkit.jl`, `Yao.jl` for QC, &c\n",
+    "\n",
+    "Beyond this, [juliapackages.com](https://juliapackages.com/packages) has a categorized list of packages, and the number of stars on GitHub/GitLab"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 18,
+   "id": "c9221ae7",
+   "metadata": {
+    "editable": true,
+    "slideshow": {
+     "slide_type": "subslide"
+    },
+    "tags": []
+   },
+   "outputs": [
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING: using Plots.bar in module Main conflicts with an existing identifier.\n"
+     ]
+    },
+    {
+     "data": {
+      "image/png": "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",
+      "image/svg+xml": [
+       "\n",
+       "\n",
+       "\n",
+       "  \n",
+       "    \n",
+       "  \n",
+       "\n",
+       "\n",
+       "\n",
+       "  \n",
+       "    \n",
+       "  \n",
+       "\n",
+       "\n",
+       "\n",
+       "  \n",
+       "    \n",
+       "  \n",
+       "\n",
+       "\n",
+       "\n",
+       "\n",
+       "\n",
+       "\n",
+       "\n",
+       "\n",
+       "\n",
+       "\n",
+       "\n",
+       "\n",
+       "\n",
+       "\n",
+       "\n",
+       "\n",
+       "\n",
+       "\n",
+       "\n",
+       "\n",
+       "\n",
+       "\n",
+       "\n",
+       "\n",
+       "\n",
+       "\n",
+       "\n",
+       "\n",
+       "\n"
+      ],
+      "text/html": [
+       "\n",
+       "\n",
+       "\n",
+       "  \n",
+       "    \n",
+       "  \n",
+       "\n",
+       "\n",
+       "\n",
+       "  \n",
+       "    \n",
+       "  \n",
+       "\n",
+       "\n",
+       "\n",
+       "  \n",
+       "    \n",
+       "  \n",
+       "\n",
+       "\n",
+       "\n",
+       "\n",
+       "\n",
+       "\n",
+       "\n",
+       "\n",
+       "\n",
+       "\n",
+       "\n",
+       "\n",
+       "\n",
+       "\n",
+       "\n",
+       "\n",
+       "\n",
+       "\n",
+       "\n",
+       "\n",
+       "\n",
+       "\n",
+       "\n",
+       "\n",
+       "\n",
+       "\n",
+       "\n",
+       "\n",
+       "\n"
+      ]
+     },
+     "execution_count": 18,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "using Zygote, Plots\n",
+    "\n",
+    "c = 10 .* randn(8)\n",
+    "objective(x) = sum((@. 3x^2 + 2x + c))\n",
+    "# objective(x) = sum( (3 .* x .^ 2) .+ (2 .* x) .+ c )\n",
+    "\n",
+    "function gradient_descent(f, iterations::Integer, step_size, x0)\n",
+    "    iterate = copy(x0)\n",
+    "    history = zeros(iterations + one(iterations))\n",
+    "    \n",
+    "    for i in 1:iterations\n",
+    "        history[i] = f(iterate)\n",
+    "        \n",
+    "        gradient = f'(iterate)\n",
+    "        iterate .-= (step_size / i) .* gradient\n",
+    "    end\n",
+    "    \n",
+    "    history[end] = f(iterate)\n",
+    "    iterate, history\n",
+    "end\n",
+    "\n",
+    "_, history = gradient_descent(objective, 64, 0.1, 20 .* rand(8))\n",
+    "plot(history, ylabel=\"Objective\", xlabel=\"Iterations\", legend=nothing)"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "f2cc4657",
+   "metadata": {
+    "slideshow": {
+     "slide_type": "slide"
+    }
+   },
+   "source": [
+    "### Functional-style programming\n",
+    "\n",
+    "- Julia has first-class functions\n",
+    "  - `myfunc = sin; myfunc(1.0)`"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "423854d3",
+   "metadata": {
+    "slideshow": {
+     "slide_type": "fragment"
+    }
+   },
+   "source": [
+    "This allows \"higher-order\" functions:\n",
+    "\n",
+    "- `sort(collection; lt=... by=...)`\n",
+    "  - Allows specifying the comparison `<`\n",
+    "  - Also allows a map using `by`\n",
+    "  - `sort(::Vector{ComplexF32}, by=abs)`\n",
+    "  - `sort(::Vector{String}, by=(s -> s[1]))`"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 19,
+   "id": "79f69a89",
+   "metadata": {
+    "editable": true,
+    "slideshow": {
+     "slide_type": "fragment"
+    },
+    "tags": []
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "1.0"
+      ]
+     },
+     "execution_count": 19,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "apply(f, x...) = f(x...)\n",
+    "apply(sin, π/2)"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "ca0e9c5c",
+   "metadata": {
+    "slideshow": {
+     "slide_type": "fragment"
+    }
+   },
+   "source": [
+    "- `map(f, collection)` calls `f` on every element of `collection`\n",
+    "  - `foreach(f, collection)` does the same, but discards the result"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "97423cbf",
+   "metadata": {
+    "slideshow": {
+     "slide_type": "fragment"
+    }
+   },
+   "source": [
+    "- `reduce(op, collection)` applies `op` to the whole collection\n",
+    "  - For example, `reduce(+, collection)` is the sum\n",
+    "  - `reduce(*, collection)` is the product\n",
+    "  - `reduce(min, collection)` finds the smallest element\n",
+    "  - `foldl` and `foldr` guarantee direction"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "8e84b723",
+   "metadata": {
+    "slideshow": {
+     "slide_type": "fragment"
+    }
+   },
+   "source": [
+    "- `filter(pred, collection)` keeps only the elements of `collection` which satisfy `pred`\n",
+    "  - `filter((x -> x > zero(x)), collection)` keeps positive values\n",
+    "  - `filter(!isone, collection)` keeps all elements which are not the multiplicative identity"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "d4d21441",
+   "metadata": {
+    "slideshow": {
+     "slide_type": "fragment"
+    }
+   },
+   "source": [
+    "- Why should you care?\n",
+    "  - Some problems can be expressed much more naturally"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 20,
+   "id": "0c058fda",
+   "metadata": {
+    "editable": true,
+    "slideshow": {
+     "slide_type": "fragment"
+    },
+    "tags": []
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "isleaf (generic function with 1 method)"
+      ]
+     },
+     "execution_count": 20,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "import Base: map, reduce, filter\n",
+    "\n",
+    "struct Tree{T}\n",
+    "    val::T\n",
+    "    children::Vector{Tree{T}}\n",
+    "end\n",
+    "\n",
+    "Tree(val::T) where {T} = Tree(val, Tree{T}[])\n",
+    "\n",
+    "val(t::Tree)      = t.val\n",
+    "children(t::Tree) = t.children\n",
+    "\n",
+    "isleaf(t::Tree) = isempty(children(t))"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 21,
+   "id": "68770f83",
+   "metadata": {
+    "editable": true,
+    "slideshow": {
+     "slide_type": "fragment"
+    },
+    "tags": []
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "map (generic function with 77 methods)"
+      ]
+     },
+     "execution_count": 21,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "_map(f) = (st -> map(f, st))\n",
+    "# apply f to every node in the tree\n",
+    "map(f, t::Tree{T}) where {T} =\n",
+    "    if isleaf(t)\n",
+    "        Tree(f(val(t)))\n",
+    "    else\n",
+    "        mapped_children = map(_map(f), children(t))\n",
+    "        Tree(f(val(t)), mapped_children)\n",
+    "    end"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 22,
+   "id": "5a96d2e7",
+   "metadata": {
+    "editable": true,
+    "slideshow": {
+     "slide_type": "fragment"
+    },
+    "tags": []
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "reduce (generic function with 7 methods)"
+      ]
+     },
+     "execution_count": 22,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "_reduce(f, init) = (st -> reduce(f, st, init))\n",
+    "# accumulate f from the bottom of the tree to the top\n",
+    "reduce(f, t::Tree, init) =\n",
+    "    if isleaf(t)\n",
+    "        f(val(t), init)\n",
+    "    else\n",
+    "        inner = map(_reduce(f, init), children(t))\n",
+    "        f(val(t), reduce(f, inner, init=init))\n",
+    "    end"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 23,
+   "id": "a49e2ba2",
+   "metadata": {
+    "editable": true,
+    "slideshow": {
+     "slide_type": "fragment"
+    },
+    "tags": []
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "filter (generic function with 14 methods)"
+      ]
+     },
+     "execution_count": 23,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "# keep only subtrees whose root satisfies f, and return nothing otherwise\n",
+    "filter(f, t::Tree{T}) where {T} =\n",
+    "    if f(val(t))\n",
+    "        inner = Tree{T}[]\n",
+    "        keepnotnothing = st -> let filtered = filter(f, st)\n",
+    "            if !isnothing(filtered)\n",
+    "                push!(inner, filtered)\n",
+    "            end\n",
+    "        end\n",
+    "        foreach(keepnotnothing, children(t))\n",
+    "        Tree(val(t), inner)\n",
+    "    else\n",
+    "        nothing\n",
+    "    end"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 24,
+   "id": "ca2ebafe",
+   "metadata": {
+    "editable": true,
+    "slideshow": {
+     "slide_type": "fragment"
+    },
+    "tags": []
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "Tree{Int64}(1, Tree{Int64}[Tree{Int64}(2, Tree{Int64}[Tree{Int64}(3, Tree{Int64}[]), Tree{Int64}(4, Tree{Int64}[]), Tree{Int64}(5, Tree{Int64}[])]), Tree{Int64}(6, Tree{Int64}[])])"
+      ]
+     },
+     "execution_count": 24,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "t = Tree(1, [\n",
+    "        Tree(2, [\n",
+    "            Tree(3),\n",
+    "            Tree(4),\n",
+    "            Tree(5)\n",
+    "        ]),\n",
+    "        Tree(6)\n",
+    "    ])"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 25,
+   "id": "9de6998f",
+   "metadata": {
+    "editable": true,
+    "slideshow": {
+     "slide_type": "fragment"
+    },
+    "tags": []
+   },
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "1\n",
+      "    2\n",
+      "        3\n",
+      "        4\n",
+      "        5\n",
+      "    6\n"
+     ]
+    }
+   ],
+   "source": [
+    "prettyprint(depth::Int) = (t::Tree -> prettyprint(t, depth + 1))\n",
+    "\n",
+    "function prettyprint(t::Tree, depth::Int=0)\n",
+    "    println(\"  \"^depth, val(t))\n",
+    "    foreach(prettyprint(depth + 1), children(t))\n",
+    "end\n",
+    "    \n",
+    "prettyprint(t)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 26,
+   "id": "58c8f37c",
+   "metadata": {
+    "editable": true,
+    "slideshow": {
+     "slide_type": "fragment"
+    },
+    "tags": []
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "21"
+      ]
+     },
+     "execution_count": 26,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "reduce(+, t, 0)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 27,
+   "id": "ec0b4b85",
+   "metadata": {
+    "editable": true,
+    "slideshow": {
+     "slide_type": "fragment"
+    },
+    "tags": []
+   },
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "0.5\n",
+      "    1.0\n",
+      "        1.5\n",
+      "        2.0\n",
+      "        2.5\n",
+      "    3.0\n"
+     ]
+    }
+   ],
+   "source": [
+    "map(x -> x/2, t) |> prettyprint"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 28,
+   "id": "ebde6a6c",
+   "metadata": {
+    "editable": true,
+    "slideshow": {
+     "slide_type": "fragment"
+    },
+    "tags": []
+   },
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "1\n",
+      "    2\n",
+      "        3\n",
+      "        4\n"
+     ]
+    }
+   ],
+   "source": [
+    "filter(x -> x < 5, t) |> prettyprint"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "49204854",
+   "metadata": {
+    "slideshow": {
+     "slide_type": "slide"
+    }
+   },
+   "source": [
+    "### Metaprogramming\n",
+    "\n",
+    "- Code is just a kind of data!"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 29,
+   "id": "7c7958e0",
+   "metadata": {
+    "editable": true,
+    "slideshow": {
+     "slide_type": ""
+    },
+    "tags": []
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "quote\n",
+       "    \u001b[90m#= In[29]:2 =#\u001b[39m\n",
+       "    A = rand(5)\n",
+       "    \u001b[90m#= In[29]:3 =#\u001b[39m\n",
+       "    A .+= randn(5)\n",
+       "    \u001b[90m#= In[29]:4 =#\u001b[39m\n",
+       "    sum(A)\n",
+       "end"
+      ]
+     },
+     "execution_count": 29,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "code_chunk = quote\n",
+    "    A = rand(5)\n",
+    "    A .+= randn(5)\n",
+    "    sum(A)\n",
+    "end"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 30,
+   "id": "36959622",
+   "metadata": {
+    "editable": true,
+    "slideshow": {
+     "slide_type": ""
+    },
+    "tags": []
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "Expr"
+      ]
+     },
+     "execution_count": 30,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "typeof(code_chunk)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 31,
+   "id": "39ec8abf",
+   "metadata": {
+    "editable": true,
+    "slideshow": {
+     "slide_type": "fragment"
+    },
+    "tags": []
+   },
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "Expr\n",
+      "  head: Symbol block\n",
+      "  args: Array{Any}((6,))\n",
+      "    1: LineNumberNode\n",
+      "      line: Int64 2\n",
+      "      file: Symbol In[29]\n",
+      "    2: Expr\n",
+      "      head: Symbol =\n",
+      "      args: Array{Any}((2,))\n",
+      "        1: Symbol A\n",
+      "        2: Expr\n",
+      "          head: Symbol call\n",
+      "          args: Array{Any}((2,))\n",
+      "            1: Symbol rand\n",
+      "            2: Int64 5\n",
+      "    3: LineNumberNode\n",
+      "      line: Int64 3\n",
+      "      file: Symbol In[29]\n",
+      "    4: Expr\n",
+      "      head: Symbol .+=\n",
+      "      args: Array{Any}((2,))\n",
+      "        1: Symbol A\n",
+      "        2: Expr\n",
+      "          head: Symbol call\n",
+      "          args: Array{Any}((2,))\n",
+      "            1: Symbol randn\n",
+      "            2: Int64 5\n",
+      "    5: LineNumberNode\n",
+      "      line: Int64 4\n",
+      "      file: Symbol In[29]\n",
+      "    6: Expr\n",
+      "      head: Symbol call\n",
+      "      args: Array{Any}((2,))\n",
+      "        1: Symbol sum\n",
+      "        2: Symbol A\n"
+     ]
+    }
+   ],
+   "source": [
+    "dump(code_chunk)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 32,
+   "id": "697e7f1d",
+   "metadata": {
+    "editable": true,
+    "slideshow": {
+     "slide_type": "fragment"
+    },
+    "tags": []
+   },
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "(:block,\n",
+      "  :(\u001b[90m#= In[29]:2 =#\u001b[39m),\n",
+      "  (:(=), :A, (:call, :rand, 5)),\n",
+      "  :(\u001b[90m#= In[29]:3 =#\u001b[39m),\n",
+      "  (:.+=, :A, (:call, :randn, 5)),\n",
+      "  :(\u001b[90m#= In[29]:4 =#\u001b[39m),\n",
+      "  (:call, :sum, :A)\n",
+      ")"
+     ]
+    }
+   ],
+   "source": [
+    "Meta.show_sexpr(code_chunk)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 33,
+   "id": "902286ad",
+   "metadata": {
+    "editable": true,
+    "slideshow": {
+     "slide_type": "fragment"
+    },
+    "tags": []
+   },
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "(:call, :+, 1, 1)"
+     ]
+    }
+   ],
+   "source": [
+    "Meta.show_sexpr(Meta.parse(\"1 + 1\"))"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 34,
+   "id": "460cc541",
+   "metadata": {
+    "editable": true,
+    "slideshow": {
+     "slide_type": "fragment"
+    },
+    "tags": []
+   },
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "Here\n",
+      "Hello, world\n",
+      "Hello, world\n",
+      "After\n"
+     ]
+    }
+   ],
+   "source": [
+    "macro runtwice(call)\n",
+    "    quote\n",
+    "        $call\n",
+    "        $call\n",
+    "    end\n",
+    "end\n",
+    "\n",
+    "println(\"Here\")\n",
+    "@runtwice println(\"Hello, world\")\n",
+    "println(\"After\")"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 35,
+   "id": "cf18a09b",
+   "metadata": {
+    "editable": true,
+    "scrolled": true,
+    "slideshow": {
+     "slide_type": "fragment"
+    },
+    "tags": []
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "quote\n",
+       "    \u001b[90m#= In[35]:19 =#\u001b[39m\n",
+       "    begin\n",
+       "        \u001b[90m#= In[35]:7 =#\u001b[39m\n",
+       "        if Main.sqrt(2) == 1.4\n",
+       "            \u001b[90m#= In[35]:8 =#\u001b[39m\n",
+       "            Main.nothing\n",
+       "        else\n",
+       "            \u001b[90m#= In[35]:10 =#\u001b[39m\n",
+       "            Main.throw(Main.AssertionError(Main.str))\n",
+       "        end\n",
+       "    end\n",
+       "end"
+      ]
+     },
+     "execution_count": 35,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "const DEBUG = true\n",
+    "\n",
+    "macro myassert(expression::Expr)\n",
+    "    str = string(expression)\n",
+    "    if DEBUG\n",
+    "        quote\n",
+    "            if $expression\n",
+    "                nothing\n",
+    "            else\n",
+    "                throw(AssertionError(str))\n",
+    "            end\n",
+    "        end\n",
+    "    else\n",
+    "        quote end\n",
+    "    end\n",
+    "end\n",
+    "\n",
+    "@myassert 1 == 1\n",
+    "macroexpand(Main, quote @myassert sqrt(2) == 1.4 end)"
+   ]
   }
  ],
  "metadata": {
diff --git a/day4/index.html b/day4/index.html
index 3c92c1a..c3dcd27 100644
--- a/day4/index.html
+++ b/day4/index.html
@@ -1 +1 @@
-      Day 4 
\ No newline at end of file + Day 4
\ No newline at end of file diff --git a/debug2.jl b/debug2.jl index c94f489..3a81280 100644 --- a/debug2.jl +++ b/debug2.jl @@ -12,4 +12,4 @@ function outer(k) i += inner(k-j) end i -end \ No newline at end of file +end diff --git a/index.html b/index.html index 4cc5831..997a2ce 100644 --- a/index.html +++ b/index.html @@ -1 +1 @@ - IAM Julia Workshop

IAM Julia Workshop

Welcome to the IAM Julia Workshop! You can find the notes and problems for individual days along the top of the page.

The slides for the workshop are all Jupyter notebooks. To see them as a slideshow, install the RISE extension for Jupyter.

\ No newline at end of file + IAM Julia Workshop

IAM Julia Workshop

Welcome to the IAM Julia Workshop! You can find the notes and problems for individual days along the top of the page.

The slides for the workshop are all Jupyter notebooks. To see them as a slideshow, install the RISE extension for Jupyter.

\ No newline at end of file diff --git a/sitemap.xml b/sitemap.xml index 67140ca..f250e26 100644 --- a/sitemap.xml +++ b/sitemap.xml @@ -3,31 +3,31 @@ https://tlienart.github.io/FranklinTemplates.jl/day4/index.html - 2024-09-22 + 2024-09-25 monthly 0.5 https://tlienart.github.io/FranklinTemplates.jl/index.html - 2024-09-22 + 2024-09-25 monthly 0.5 https://tlienart.github.io/FranklinTemplates.jl/day2/index.html - 2024-09-22 + 2024-09-25 monthly 0.5 https://tlienart.github.io/FranklinTemplates.jl/day3/index.html - 2024-09-22 + 2024-09-25 monthly 0.5 https://tlienart.github.io/FranklinTemplates.jl/day1/index.html - 2024-09-22 + 2024-09-25 monthly 0.5