 bondscell_results $bf497b24-72a7-4a2f-908e-c24922a5f3c8queued¤logsrunning¦outputbody9my_model_stable_specific (generic function with 1 method)mimetext/plainrootassigneelast_run_timestampAE(OVKpersist_js_state·has_pluto_hook_features§cell_id$bf497b24-72a7-4a2f-908e-c24922a5f3c8depends_on_disabled_cells§runtime published_object_keysdepends_on_skipped_cells§errored$bdf99bf8-bb88-40d7-a8ec-84a99ab65ff3queued¤logslinemsgqMethodInstance for Main.var"workspace#3".func_with_barriers(::Vector{Float64}, ::Int64)
  from func_with_barriers([90mobs[39m, [90mparam[39m)[90m @[39m [90mMain.var"workspace#3"[39m [90m~/work/Notes-Fall2025/Notes-Fall2025/week5/[39m[90m[4mweek5.jl#==#05d2780e-612c-4e86-93c4-f57734f49c74:1[24m[39m
Arguments
  #self#[36m::Core.Const(Main.var"workspace#3".func_with_barriers)[39m
  obs[36m::Vector{Float64}[39m
  param[36m::Int64[39m
Locals
  pred[33m[1m::Union{Vector{Float64}, Vector{Int64}}[22m[39m
Body[36m::Float64[39m
[90m1 ─[39m       Core.NewvarNode(:(pred))
[90m│  [39m %2  = (param < 1)[36m::Bool[39m
[90m└──[39m       goto #3 if not %2
[90m2 ─[39m %4  = Base.broadcasted(Main.var"workspace#3".:*, param, obs)[36m::Base.Broadcast.Broadcasted{Base.Broadcast.DefaultArrayStyle{1}, Nothing, typeof(*), Tuple{Int64, Vector{Float64}}}[39m
[90m│  [39m       (pred = Base.materialize(%4))
[90m└──[39m       goto #4
[90m3 ─[39m %7  = Main.var"workspace#3".floor[36m::Core.Const(floor)[39m
[90m│  [39m %8  = Main.var"workspace#3".Int64[36m::Core.Const(Int64)[39m
[90m│  [39m %9  = Base.broadcasted(Main.var"workspace#3".:*, param, obs)[36m::Base.Broadcast.Broadcasted{Base.Broadcast.DefaultArrayStyle{1}, Nothing, typeof(*), Tuple{Int64, Vector{Float64}}}[39m
[90m│  [39m %10 = Base.broadcasted(%7, %8, %9)[36m::Base.Broadcast.Broadcasted{Base.Broadcast.DefaultArrayStyle{1}, Nothing, typeof(floor), Tuple{Base.RefValue{Type{Int64}}, Base.Broadcast.Broadcasted{Base.Broadcast.DefaultArrayStyle{1}, Nothing, typeof(*), Tuple{Int64, Vector{Float64}}}}}[39m
[90m└──[39m       (pred = Base.materialize(%10))
[90m4 ┄[39m %12 = pred[33m[1m::Union{Vector{Float64}, Vector{Int64}}[22m[39m
[90m│  [39m %13 = Main.var"workspace#3".calc_χ²(obs, %12)[36m::Float64[39m
[90m└──[39m       return %13

text/plaincell_id$bdf99bf8-bb88-40d7-a8ec-84a99ab65ff3kwargsidPlutoRunner_d1acb81efileP/home/runner/.julia/packages/Pluto/CBqeh/src/runner/PlutoRunner/src/io/stdout.jlgroupstdoutlevelLogLevel(-555)running¦outputbodymimetext/plainrootassigneelast_run_timestampAE)persist_js_state·has_pluto_hook_features§cell_id$bdf99bf8-bb88-40d7-a8ec-84a99ab65ff3depends_on_disabled_cells§runtime	published_object_keysdepends_on_skipped_cells§errored$9d71d1b0-765d-48d7-a939-c951fc8caa67queued¤logsrunning¦outputbody<div class="markdown"><p><strong>Interpretted languages:</strong></p>
<ul>
<li><p>Loops are very slow</p>
</li>
<li><p>Usually worth creating extra arrays to avoid explicit loops</p>
</li>
<li><p>People often call operations on arrays &quot;vectorized&quot;, even if every operation is done in serial</p>
</li>
</ul>
<p><strong>Compiled languages:</strong>  </p>
<ul>
<li><p>Loops are fast.</p>
</li>
<li><p>Can choose whether to write a loop explicilty based on what&#39;s more intuitive for programmer and algorithm.</p>
</li>
<li><p>Using &quot;vectorized&quot; notation can unintentionally add unnecessary memory allocations...</p>
<ul>
<li><p>if you don&#39;t use broadcasting and fusing   </p>
</li>
</ul>
</li>
</ul>
</div>mimetext/htmlrootassigneelast_run_timestampAE(persist_js_state·has_pluto_hook_features§cell_id$9d71d1b0-765d-48d7-a939-c951fc8caa67depends_on_disabled_cells§runtime 3ߵpublished_object_keysdepends_on_skipped_cells§errored$8a97f0bf-3ada-4503-98a5-7bdeca15edc4queued¤logsrunning¦outputbodymimetext/plainrootassigneelast_run_timestampAE) persist_js_state·has_pluto_hook_features§cell_id$8a97f0bf-3ada-4503-98a5-7bdeca15edc4depends_on_disabled_cells§runtimeͪ[published_object_keysdepends_on_skipped_cells§errored$f9d3d93f-f1c4-4b3b-aa8a-097f2c8aaf68queued¤logsrunning¦outputbodyق<div class="markdown"><h2 id="Generic-functions-in-terms-of-abstract-type">Generic functions in terms of abstract type</h2>
</div>mimetext/htmlrootassigneelast_run_timestampAE(Ppersist_js_state·has_pluto_hook_features§cell_id$f9d3d93f-f1c4-4b3b-aa8a-097f2c8aaf68depends_on_disabled_cells§runtime lpublished_object_keysdepends_on_skipped_cells§errored$3738748d-7b3d-4015-bf71-0ffb9e28c43dqueued¤logsrunning¦outputbody<div class="markdown"><h3 id="Peer-Code-Review">Peer Code Review</h3>
<ul>
<li><p>Constructive suggestions for improving programming practices &#40;1 point&#41;</p>
</li>
<li><p>Specific, constructive suggestions for improving code readability/documentation &#40;1 point&#41;</p>
</li>
<li><p>Specific, constructive suggestions for improving tests and/or assertions &#40;1 point&#41;</p>
</li>
<li><p>Specific, constructive suggestions for improving code modularity/organization/maintainability &#40;1 point&#41;</p>
</li>
<li><p>Specific, constructive suggestions for improving code efficiency &#40;1 point&#41;</p>
</li>
<li><p>Finding any bugs &#40;if code author confirms&#41; &#40;bonus points?&#41;</p>
</li>
</ul>
</div>mimetext/htmlrootassigneelast_run_timestampAE(`xpersist_js_state·has_pluto_hook_features§cell_id$3738748d-7b3d-4015-bf71-0ffb9e28c43ddepends_on_disabled_cells§runtime 	T׵published_object_keysdepends_on_skipped_cells§errored$ac9b4f35-36fc-425b-a0a2-83fc32c62c7cqueued¤logsrunning¦outputbody<div class="markdown"><h3 id="Implementation-details-for-code-efficiency">Implementation details for code efficiency</h3>
<h4 id="&#40;assuming-JIT-languages&#41;">&#40;assuming JIT languages&#41;</h4>
<ul>
<li><p><strong>Avoid unnecessary memory allocations</strong></p>
<ul>
<li><p>Take advantage of <em>fusing</em> and <em>broadcasting</em></p>
</li>
<li><p>Use <code>view</code> &#40;e.g., <code>view&#40;array,1:5,:&#41;</code>&#41; instead of copying  &#40;<code>array&#91;1:5,:&#93;</code>&#41;</p>
</li>
<li><p>Avoid many small allocations on heap &#40;e.g., using <code>StaticArrays.jl</code>&#41;</p>
</li>
</ul>
</li>
<li><p><strong>Avoid type instability</strong></p>
<ul>
<li><p>Avoid untyped global variables</p>
</li>
<li><p>Avoid containers &#40;e.g., arrays&#41; of abstract types</p>
</li>
<li><p>Avoid abstract types for fields in <code>struct</code>s</p>
</li>
<li><p>Write type-stable functions</p>
</li>
</ul>
</li>
<li><p>Organize code into small functions &#40;see function barriers&#41;</p>
</li>
<li><p><strong>Avoid inefficient data structures</strong> &#40;e.g., <code>Dict</code> when better choice avaliable&#41;</p>
</li>
<li><p>Adding annotations that enable/allow compiler optimizations &#40;e.g., <code>@inbounds</code>, <code>@fastmath</code>, <code>@simd</code>, <code>@turbo</code>&#41;, but <em>only</em> when appropriate</p>
</li>
<li><p>Avoid unnecessary use of strings or string interpolation</p>
</li>
<li><p>Write code so that it can be parallelized in the future &#40;see later labs&#41;</p>
</li>
</ul>
<p>See <a href="https://docs.julialang.org/en/v1/manual/performance-tips/">Performance Tips</a> for more details.</p>
</div>mimetext/htmlrootassigneelast_run_timestampAE(7ְpersist_js_state·has_pluto_hook_features§cell_id$ac9b4f35-36fc-425b-a0a2-83fc32c62c7cdepends_on_disabled_cells§runtime hpublished_object_keysdepends_on_skipped_cells§errored$f13e442e-771f-4aab-b5f3-f08c4e72229cqueued¤logsrunning¦outputbodyd<div class="markdown"><h2 id="When-to-start-parallelizing?">When to start parallelizing?</h2>
<p><strong>Q:</strong>  How do you strike the balance between: </p>
<ul>
<li><p>optimizing the serial version of your code and </p>
</li>
<li><p>optimizing your parallelization?</p>
</li>
</ul>
<p><strong>A:</strong> The added cost of moving data between processors makes it important to avoid unnecessary data movement.  One part of that is avoiding unnecessary memory allocations and using efficient data structures.  If the algorithm is well suited to parallelization, then a memory efficient serial version is much more likely to get good performancfe when parallelized. </p>
<p><strong>Q:</strong> Is it hard to tell when you should shift your focus to optimizing the other part?</p>
<p><strong>A:</strong> Perhaps.  Although, it gets easier with experience.</p>
</div>mimetext/htmlrootassigneelast_run_timestampAE(왞persist_js_state·has_pluto_hook_features§cell_id$f13e442e-771f-4aab-b5f3-f08c4e72229cdepends_on_disabled_cells§runtime 
ʁpublished_object_keysdepends_on_skipped_cells§errored$7b66fbe6-5f42-4619-a265-8d284d3dac8cqueued¤logsrunning¦outputbody5.0mimetext/plainrootassigneelast_run_timestampAE(persist_js_state·has_pluto_hook_features§cell_id$7b66fbe6-5f42-4619-a265-8d284d3dac8cdepends_on_disabled_cells§runtime ?G-published_object_keysdepends_on_skipped_cells§errored$cf5262da-1043-11ec-12fc-9916cc70070cqueued¤logsrunning¦outputbodyٔ<div class="markdown"><blockquote>
<p>Astro 528: High-Performance Scientific Computing for Astrophysics &#40;Fall 2025&#41;</p>
</blockquote>
</div>mimetext/htmlrootassigneelast_run_timestampAE(˰persist_js_state·has_pluto_hook_features§cell_id$cf5262da-1043-11ec-12fc-9916cc70070cdepends_on_disabled_cells§runtime Ngpublished_object_keysdepends_on_skipped_cells§errored$2e32935f-c82f-434b-b0f5-01a4b15ddb80queued¤logsrunning¦outputbodyd<div class="markdown"><h2 id="Containers-of-Abstract-Types">Containers of Abstract Types</h2>
</div>mimetext/htmlrootassigneelast_run_timestampAE(hpersist_js_state·has_pluto_hook_features§cell_id$2e32935f-c82f-434b-b0f5-01a4b15ddb80depends_on_disabled_cells§runtime published_object_keysdepends_on_skipped_cells§errored$46d264b6-73da-4790-92e4-988728c7e1dfqueued¤logsrunning¦outputbody<div class="markdown"><p>If you pass a data structure that&#39;s stored in the heap, then only a pointer &#40;or something that acts like a pointer/reference&#41; to that data is placed on the stack.  </p>
</div>mimetext/htmlrootassigneelast_run_timestampAE("persist_js_state·has_pluto_hook_features§cell_id$46d264b6-73da-4790-92e4-988728c7e1dfdepends_on_disabled_cells§runtime +published_object_keysdepends_on_skipped_cells§errored$3d06ed43-23c2-4c57-a1a5-e699713b9506queued¤logsrunning¦outputbody*<div class="nice-blockquote nice-blockquote__bordered nice-blockquote--quoted">
<p class="nice-blockquote__text">
<div class="markdown"><p>According to the performance tips, it seems that using global variables leads to bad performance, and it is better to pass arguments to functions. When should one be using global variables then?</p>
</div>
<p>
<div class="nice-blockquote__text nice-blockquote__text--author">

</div> 
</div> 
<style> 
.nice-blockquote{
padding: 25px;
background: light grey;
border: 0.5px solid #ccc;
color: black;
box-sizing:border-box;
overflow-y:hidden;
}
.nice-blockquote__bordered{
border-left-width: 14px;
}
.nice-blockquote--quoted::before{
content:open-quote;
font-size:70px;
font-family: Arial;
font-weight:bold;
color:#ccc;
display:block;
margin-top:-20px;
margin-bottom:-40px;
font-family: Arial;
}
.nice-blockquote__text{
font-family: Arial;
font-style: italic;
fontsize: 1.5em;	
margin:0;
line height: 1.5;
text-align:left;
}
.nice-blockquote__text:not(:last_child){
margin-bottom:10px;
}
.nice-blockquote__text--author{
font-weight:bold;
font-style: normal;
text-align:right;
fontsize: 2em;
}
.nice-blockquote__text--author::before{
content:close-quote;
font-size:70px;
font-family: Arial;
font-weight:bold;
color:#ccc;
display:block;
margin-top:-28px;
margin-bottom:-40px;
}
</style>
mimetext/htmlrootassigneelast_run_timestampAE)persist_js_state·has_pluto_hook_features§cell_id$3d06ed43-23c2-4c57-a1a5-e699713b9506depends_on_disabled_cells§runtime published_object_keysdepends_on_skipped_cells§errored$248c85d4-bcac-40a4-9052-1f72a62422edqueued¤logsrunning¦outputbodymimetext/plainrootassigneelast_run_timestampAE( `persist_js_state·has_pluto_hook_features§cell_id$248c85d4-bcac-40a4-9052-1f72a62422eddepends_on_disabled_cells§runtime published_object_keysdepends_on_skipped_cells§errored$55af3d38-8956-4a22-8ca6-dbbb7de1b426queued¤logsrunning¦outputbody0.495mimetext/plainrootassigneelast_run_timestampAE)8persist_js_state·has_pluto_hook_features§cell_id$55af3d38-8956-4a22-8ca6-dbbb7de1b426depends_on_disabled_cells§runtime
published_object_keysdepends_on_skipped_cells§errored$c8a7838a-8f1a-4f33-a9de-48e60992d08bqueued¤logsrunning¦outputbodyBenchmarkTools.Trial: 10000 samples with 8 evaluations.
 Range [90m([39m[36m[1mmin[22m[39m … [35mmax[39m[90m):  [39m[36m[1m3.186 μs[22m[39m … [35m526.884 μs[39m  [90m┊[39m GC [90m([39mmin … max[90m): [39m 0.00% … 97.64%
 Time  [90m([39m[34m[1mmedian[22m[39m[90m):     [39m[34m[1m4.293 μs               [22m[39m[90m┊[39m GC [90m([39mmedian[90m):    [39m 0.00%
 Time  [90m([39m[32m[1mmean[22m[39m ± [32mσ[39m[90m):   [39m[32m[1m5.772 μs[22m[39m ± [32m 10.678 μs[39m  [90m┊[39m GC [90m([39mmean ± σ[90m):  [39m15.59% ±  9.93%

  [39m█[34m█[39m[32m▅[39m[39m▂[39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m▁[39m▁[39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m▂
  [39m█[34m█[39m[32m█[39m[39m█[39m▇[39m▅[39m▃[39m▁[39m▁[39m▁[39m▁[39m▁[39m▃[39m▁[39m▃[39m▁[39m▁[39m▁[39m▁[39m▁[39m█[39m█[39m▇[39m▆[39m▄[39m▃[39m▁[39m▃[39m▁[39m▁[39m▁[39m▁[39m▁[39m▁[39m▁[39m▁[39m▁[39m▁[39m▁[39m▁[39m▁[39m▁[39m▁[39m▁[39m▁[39m▁[39m▁[39m▁[39m▁[39m▁[39m▁[39m▁[39m▁[39m▃[39m▄[39m▅[39m▆[39m▅[39m▆[39m [39m█
  3.19 μs[90m      [39m[90mHistogram: [39m[90m[1mlog([22m[39m[90mfrequency[39m[90m[1m)[22m[39m[90m by time[39m      64.8 μs [0m[1m<[22m

 Memory estimate[90m: [39m[33m55.18 KiB[39m, allocs estimate[90m: [39m[33m21[39m.mimetext/plainrootassigneelast_run_timestampAE(!Bpersist_js_state·has_pluto_hook_features§cell_id$c8a7838a-8f1a-4f33-a9de-48e60992d08bdepends_on_disabled_cells§runtime   )@published_object_keysdepends_on_skipped_cells§errored$fa1f963d-d674-442f-aa32-fcee86a8c058queued¤logsrunning¦outputbodyh<div class="markdown"><h1 id="What-operations-are-expensive?">What operations are expensive?</h1>
</div>mimetext/htmlrootassigneelast_run_timestampAE(얇persist_js_state·has_pluto_hook_features§cell_id$fa1f963d-d674-442f-aa32-fcee86a8c058depends_on_disabled_cells§runtime ,published_object_keysdepends_on_skipped_cells§errored$6985f2d5-6c71-4289-b655-ec06754f85c4queued¤logsrunning¦outputbodymimetext/plainrootassigneelast_run_timestampAE(oXpersist_js_state·has_pluto_hook_features§cell_id$6985f2d5-6c71-4289-b655-ec06754f85c4depends_on_disabled_cells§runtime ^fpublished_object_keysdepends_on_skipped_cells§errored$c949701e-3399-44d8-9041-4dcb99c78cdaqueued¤logsrunning¦outputbodyA<div class="nice-blockquote nice-blockquote__bordered nice-blockquote--quoted">
<p class="nice-blockquote__text">
<div class="markdown"><p>I&#39;ve been told to eliminate for loops wherever possible when writing Python/R/IDL code.  In constrast, when writing Julia/C/C&#43;&#43;/Fortran/Java <code>for</code> loops are not detrimental. </p>
<p>Why is this?</p>
</div>
<p>
<div class="nice-blockquote__text nice-blockquote__text--author">

</div> 
</div> 
<style> 
.nice-blockquote{
padding: 25px;
background: light grey;
border: 0.5px solid #ccc;
color: black;
box-sizing:border-box;
overflow-y:hidden;
}
.nice-blockquote__bordered{
border-left-width: 14px;
}
.nice-blockquote--quoted::before{
content:open-quote;
font-size:70px;
font-family: Arial;
font-weight:bold;
color:#ccc;
display:block;
margin-top:-20px;
margin-bottom:-40px;
font-family: Arial;
}
.nice-blockquote__text{
font-family: Arial;
font-style: italic;
fontsize: 1.5em;	
margin:0;
line height: 1.5;
text-align:left;
}
.nice-blockquote__text:not(:last_child){
margin-bottom:10px;
}
.nice-blockquote__text--author{
font-weight:bold;
font-style: normal;
text-align:right;
fontsize: 2em;
}
.nice-blockquote__text--author::before{
content:close-quote;
font-size:70px;
font-family: Arial;
font-weight:bold;
color:#ccc;
display:block;
margin-top:-28px;
margin-bottom:-40px;
}
</style>
mimetext/htmlrootassigneelast_run_timestampAE)]persist_js_state·has_pluto_hook_features§cell_id$c949701e-3399-44d8-9041-4dcb99c78cdadepends_on_disabled_cells§runtime JTpublished_object_keysdepends_on_skipped_cells§errored$ae709a34-9244-44ee-a004-381fc9b6cd0cqueued¤logsrunning¦outputbodyم<div class="markdown"><p>ToC on side <bond def="toc_aside" unique_id="olrqtphhavyb"><input type="checkbox" checked></bond></p>
</div>mimetext/htmlrootassigneelast_run_timestampAE(d	persist_js_state·has_pluto_hook_features§cell_id$ae709a34-9244-44ee-a004-381fc9b6cd0cdepends_on_disabled_cells§runtime]published_object_keysdepends_on_skipped_cells§errored$ba8781e6-5c7e-4aaf-8ccd-da3fc6210ec5queued¤logslinemsgelementsprefixInt64elements1text/plain2text/plain3text/plaintypeArrayprefix_shortobjectidac57c7cdc5ac19d6!application/vnd.pluto.tree+objecttypeTupleobjectid2e0f8bb6f8e810b!application/vnd.pluto.tree+objectcell_id$ba8781e6-5c7e-4aaf-8ccd-da3fc6210ec5kwargsidMain_workspace#2_32d8f177filef/home/runner/work/Notes-Fall2025/Notes-Fall2025/week5/week5.jl#==#f5fe37e1-80b9-4853-84d6-82e56417a470groupweek5levelInforunning¦outputbodymimetext/plainrootassigneelast_run_timestampAE)Gpersist_js_state·has_pluto_hook_features§cell_id$ba8781e6-5c7e-4aaf-8ccd-da3fc6210ec5depends_on_disabled_cells§runtime	oQpublished_object_keysdepends_on_skipped_cells§errored$24a2ae54-a11d-42da-980c-1f4c78daf4b4queued¤logsrunning¦outputbody5.0mimetext/plainrootassigneelast_run_timestampAE(persist_js_state·has_pluto_hook_features§cell_id$24a2ae54-a11d-42da-980c-1f4c78daf4b4depends_on_disabled_cells§runtimedڵpublished_object_keysdepends_on_skipped_cells§errored$3ac9ad42-7bf1-4b36-9e0b-53f3f60796b1queued¤logsrunning¦outputbody<div class="markdown"><h2 id="Types-of-elements-in-collections">Types of elements in collections</h2>
<p><strong>Q:</strong> Does Julia automatically assume the whole array is of that type to optimize performance?</p>
</div>mimetext/htmlrootassigneelast_run_timestampAE(jpersist_js_state·has_pluto_hook_features§cell_id$3ac9ad42-7bf1-4b36-9e0b-53f3f60796b1depends_on_disabled_cells§runtime [published_object_keysdepends_on_skipped_cells§errored$c1628685-c357-436f-83dd-bf19bde24964queued¤logsrunning¦outputbodyN<div class="markdown"><h2 id="Function-barriers">Function barriers</h2>
</div>mimetext/htmlrootassigneelast_run_timestampAE(앚persist_js_state·has_pluto_hook_features§cell_id$c1628685-c357-436f-83dd-bf19bde24964depends_on_disabled_cells§runtime published_object_keysdepends_on_skipped_cells§errored$d35aa76c-b4e6-45f8-a4e3-ba37d674db82queued¤logsrunning¦outputbodyB<div class="markdown"><h1 id="Helper-Code">Helper Code</h1>
</div>mimetext/htmlrootassigneelast_run_timestampAE(vpersist_js_state·has_pluto_hook_features§cell_id$d35aa76c-b4e6-45f8-a4e3-ba37d674db82depends_on_disabled_cells§runtime published_object_keysdepends_on_skipped_cells§errored$fa116847-4bac-41e6-bd6e-e01c5c7234aequeued¤logsrunning¦outputbody {T<div class="markdown"><h3 id="Cost-of-common-operations">Cost of common operations</h3>
<img controls='' src='data:image/png;base64,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' type='image/png'></img>
<ul>
<li><p>Credit:  <a href="http://ithare.com/wp-content/uploads/part101_infographics_v08.png">ithare.com</a></p>
</li>
</ul>
</div>mimetext/htmlrootassigneelast_run_timestampAE)persist_js_state·has_pluto_hook_features§cell_id$fa116847-4bac-41e6-bd6e-e01c5c7234aedepends_on_disabled_cells§runtime:/published_object_keysdepends_on_skipped_cells§errored$96998f54-9f66-48fe-b808-559276667054queued¤logsrunning¦outputbodymimetext/plainrootassigneelast_run_timestampAE)
ؼfpersist_js_state·has_pluto_hook_features§cell_id$96998f54-9f66-48fe-b808-559276667054depends_on_disabled_cells§runtime 
,published_object_keysdepends_on_skipped_cells§errored$f79de8d4-537e-421f-a66d-41bc79f8f12fqueued¤logsrunning¦outputbody\<div class="markdown"><h2 id="No-Programming-Interface">No Programming Interface</h2>
</div>mimetext/htmlrootassigneelast_run_timestampAE(쓽persist_js_state·has_pluto_hook_features§cell_id$f79de8d4-537e-421f-a66d-41bc79f8f12fdepends_on_disabled_cells§runtime published_object_keysdepends_on_skipped_cells§errored$11c29d50-1975-48cc-b1c5-dd3814128e86queued¤logsrunning¦outputbodymimetext/plainrootassigneelast_run_timestampAE)ǒpersist_js_state·has_pluto_hook_features§cell_id$11c29d50-1975-48cc-b1c5-dd3814128e86depends_on_disabled_cells§runtime 	Opublished_object_keysdepends_on_skipped_cells§errored$05d2780e-612c-4e86-93c4-f57734f49c74queued¤logsrunning¦outputbody3func_with_barriers (generic function with 1 method)mimetext/plainrootassigneelast_run_timestampAE)persist_js_state·has_pluto_hook_features§cell_id$05d2780e-612c-4e86-93c4-f57734f49c74depends_on_disabled_cells§runtime 
Õpublished_object_keysdepends_on_skipped_cells§errored$9122bdf0-c0b9-4966-8933-00a40562393aqueued¤logsrunning¦outputbody<div class="markdown"><p>For mathematical functions, results will differ from one processor to another.  So I suggest you benchmark code yourself <strong>on the machine you plan to run on once you scale up</strong>.</p>
</div>mimetext/htmlrootassigneelast_run_timestampAE(얢persist_js_state·has_pluto_hook_features§cell_id$9122bdf0-c0b9-4966-8933-00a40562393adepends_on_disabled_cells§runtime published_object_keysdepends_on_skipped_cells§errored$1cf69f4d-04db-4c3a-897a-a1da9e46b88cqueued¤logsrunning¦outputbodyz<div class="nice-blockquote nice-blockquote__bordered nice-blockquote--quoted">
<p class="nice-blockquote__text">
<div class="markdown"><p>If you know your code is going to require <code>for</code> loops/nested <code>for</code> loops, is Julia just always going to be better than, for instance, Python? </p>
<p>Is there any case where the gains in optimization are marginal &#40;especially for long runtimes&#41;?</p>
</div>
<p>
<div class="nice-blockquote__text nice-blockquote__text--author">

</div> 
</div> 
<style> 
.nice-blockquote{
padding: 25px;
background: light grey;
border: 0.5px solid #ccc;
color: black;
box-sizing:border-box;
overflow-y:hidden;
}
.nice-blockquote__bordered{
border-left-width: 14px;
}
.nice-blockquote--quoted::before{
content:open-quote;
font-size:70px;
font-family: Arial;
font-weight:bold;
color:#ccc;
display:block;
margin-top:-20px;
margin-bottom:-40px;
font-family: Arial;
}
.nice-blockquote__text{
font-family: Arial;
font-style: italic;
fontsize: 1.5em;	
margin:0;
line height: 1.5;
text-align:left;
}
.nice-blockquote__text:not(:last_child){
margin-bottom:10px;
}
.nice-blockquote__text--author{
font-weight:bold;
font-style: normal;
text-align:right;
fontsize: 2em;
}
.nice-blockquote__text--author::before{
content:close-quote;
font-size:70px;
font-family: Arial;
font-weight:bold;
color:#ccc;
display:block;
margin-top:-28px;
margin-bottom:-40px;
}
</style>
mimetext/htmlrootassigneelast_run_timestampAE)Dpersist_js_state·has_pluto_hook_features§cell_id$1cf69f4d-04db-4c3a-897a-a1da9e46b88cdepends_on_disabled_cells§runtime published_object_keysdepends_on_skipped_cells§errored$db388c8a-ddb3-47a6-8ce0-586d9f9602b9queued¤logsrunning¦outputbodyBenchmarkTools.Trial: 3564 samples with 1 evaluation.
 Range [90m([39m[36m[1mmin[22m[39m … [35mmax[39m[90m):  [39m[36m[1m1.258 ms[22m[39m … [35m 18.012 ms[39m  [90m┊[39m GC [90m([39mmin … max[90m): [39m0.00% … 91.83%
 Time  [90m([39m[34m[1mmedian[22m[39m[90m):     [39m[34m[1m1.315 ms               [22m[39m[90m┊[39m GC [90m([39mmedian[90m):    [39m0.00%
 Time  [90m([39m[32m[1mmean[22m[39m ± [32mσ[39m[90m):   [39m[32m[1m1.401 ms[22m[39m ± [32m448.516 μs[39m  [90m┊[39m GC [90m([39mmean ± σ[90m):  [39m4.45% ±  9.89%

  [39m▃[39m▆[39m█[34m▇[39m[39m▃[39m [39m [32m [39m[39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m▂[39m▃[39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m▁
  [39m█[39m█[39m█[34m█[39m[39m█[39m█[39m▇[32m▅[39m[39m▃[39m▁[39m▃[39m▅[39m▄[39m▃[39m▃[39m▄[39m▃[39m▁[39m▃[39m▃[39m▁[39m▁[39m▃[39m▁[39m█[39m█[39m█[39m▄[39m▅[39m▅[39m▅[39m▃[39m▁[39m▁[39m▁[39m▃[39m▄[39m▅[39m▁[39m▄[39m▃[39m▃[39m▅[39m▅[39m▆[39m▆[39m▆[39m▅[39m▆[39m▇[39m▆[39m▆[39m▇[39m▆[39m▆[39m▇[39m▅[39m▇[39m▆[39m [39m█
  1.26 ms[90m      [39m[90mHistogram: [39m[90m[1mlog([22m[39m[90mfrequency[39m[90m[1m)[22m[39m[90m by time[39m      2.44 ms [0m[1m<[22m

 Memory estimate[90m: [39m[33m1.37 MiB[39m, allocs estimate[90m: [39m[33m73714[39m.mimetext/plainrootassigneelast_run_timestampAE([persist_js_state·has_pluto_hook_features§cell_id$db388c8a-ddb3-47a6-8ce0-586d9f9602b9depends_on_disabled_cells§runtime   published_object_keysdepends_on_skipped_cells§errored$624e8936-de28-4e09-9a4e-3ef2f6c7d9b0queued¤logsrunning¦outputbodymimetext/plainrootassigneelast_run_timestampAE(Ҫpersist_js_state·has_pluto_hook_features§cell_id$624e8936-de28-4e09-9a4e-3ef2f6c7d9b0depends_on_disabled_cells§runtime$nbpublished_object_keysdepends_on_skipped_cells§errored$dfe5dcd7-9b62-4690-ac21-0930b3e4145cqueued¤logsrunning¦outputbodyBenchmarkTools.Trial: 10000 samples with 4 evaluations.
 Range [90m([39m[36m[1mmin[22m[39m … [35mmax[39m[90m):  [39m[36m[1m 7.096 μs[22m[39m … [35m948.589 μs[39m  [90m┊[39m GC [90m([39mmin … max[90m): [39m 0.00% … 98.06%
 Time  [90m([39m[34m[1mmedian[22m[39m[90m):     [39m[34m[1m 9.945 μs               [22m[39m[90m┊[39m GC [90m([39mmedian[90m):    [39m 0.00%
 Time  [90m([39m[32m[1mmean[22m[39m ± [32mσ[39m[90m):   [39m[32m[1m13.059 μs[22m[39m ± [32m 20.403 μs[39m  [90m┊[39m GC [90m([39mmean ± σ[90m):  [39m14.35% ± 10.89%

  [39m█[39m▇[34m▇[39m[32m▆[39m[39m▂[39m▁[39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m▂[39m▁[39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m▂
  [39m█[39m█[34m█[39m[32m█[39m[39m█[39m█[39m▅[39m▃[39m▁[39m▃[39m▃[39m▁[39m▁[39m▁[39m▁[39m▁[39m▁[39m▁[39m▃[39m▁[39m▃[39m▁[39m▁[39m▁[39m▁[39m█[39m█[39m█[39m▆[39m▅[39m▃[39m▃[39m▃[39m▄[39m▁[39m▁[39m▄[39m▄[39m▁[39m▃[39m▅[39m▄[39m▃[39m▁[39m▁[39m▁[39m▁[39m▁[39m▁[39m▁[39m▁[39m▁[39m▁[39m▁[39m▄[39m▄[39m▆[39m▆[39m▆[39m▇[39m [39m█
  7.1 μs[90m        [39m[90mHistogram: [39m[90m[1mlog([22m[39m[90mfrequency[39m[90m[1m)[22m[39m[90m by time[39m       115 μs [0m[1m<[22m

 Memory estimate[90m: [39m[33m128.09 KiB[39m, allocs estimate[90m: [39m[33m4[39m.mimetext/plainrootassigneelast_run_timestampAE)Ypersist_js_state·has_pluto_hook_features§cell_id$dfe5dcd7-9b62-4690-ac21-0930b3e4145cdepends_on_disabled_cells§runtime   5published_object_keysdepends_on_skipped_cells§errored$208bf525-447d-4726-b67c-c3b968b415b8queued¤logsrunning¦outputbody<div class="markdown"><h3 id="Rubric-for-Serial-version-of-Code">Rubric for Serial version of Code</h3>
<ul>
<li><p>Code performs proposed tasks &#40;1 point&#41;</p>
</li>
<li><p>Comprehensive set of unit tests, at least one integration or regression test &#40;1 point&#41;</p>
</li>
<li><p>Code passes tests &#40;1 point&#41;</p>
</li>
<li><p>Student code uses a version control system effectively &#40;1 point&#41;</p>
</li>
<li><p>Repository includes many regular, small commits &#40;1 point&#41;</p>
</li>
<li><p>Documentation for functions’ purpose and design &#40;1 point&#41;</p>
</li>
<li><p>Comprehensive set of assertions &#40;1 point&#41;</p>
</li>
<li><p>Variable/function names consistent, distinctive &amp; meaningful &#40;1 point&#41;</p>
</li>
<li><p>Useful &amp; consistent code formatting &amp; style &#40;1 point&#41;</p>
</li>
<li><p>Code is modular, rather than having chunks of same code copied and pasted &#40;1 point&#41;</p>
</li>
</ul>
</div>mimetext/htmlrootassigneelast_run_timestampAE(쓌apersist_js_state·has_pluto_hook_features§cell_id$208bf525-447d-4726-b67c-c3b968b415b8depends_on_disabled_cells§runtime +published_object_keysdepends_on_skipped_cells§errored$c92d49d3-e8fc-4288-9ce2-3e617fc5c306queued¤logsrunning¦outputbody1.8369701987210297e-16mimetext/plainrootassigneelast_run_timestampAE(Rpersist_js_state·has_pluto_hook_features§cell_id$c92d49d3-e8fc-4288-9ce2-3e617fc5c306depends_on_disabled_cells§runtime.Lpublished_object_keysdepends_on_skipped_cells§errored$aa767f81-4bcb-41b6-b141-85796a81d8fbqueued¤logsrunning¦outputbodyW[33m[1mTest Broken[22m[39m
  Expression: my_model_stable_specific.(obs, param_true)mimetext/plainrootassigneelast_run_timestampAE)  ǂpersist_js_state·has_pluto_hook_features§cell_id$aa767f81-4bcb-41b6-b141-85796a81d8fbdepends_on_disabled_cells§runtimeЋpublished_object_keysdepends_on_skipped_cells§errored$b2ac3b2c-31c7-4e64-9009-47ac03e38afbqueued¤logsrunning¦outputbodyr<div class="markdown"><h1 id="Loops-and-&quot;Vectorization&quot;">Loops and &quot;Vectorization&quot;</h1>
</div>mimetext/htmlrootassigneelast_run_timestampAE(앲Ѱpersist_js_state·has_pluto_hook_features§cell_id$b2ac3b2c-31c7-4e64-9009-47ac03e38afbdepends_on_disabled_cells§runtime ɵpublished_object_keysdepends_on_skipped_cells§errored$495b281e-f4c9-4f55-bf5a-9a8d7f43044cqueued¤logsrunning¦outputbodyn<div class="markdown"><h3 id="Making-inner-function-type-stable">Making inner function type-stable</h3>
</div>mimetext/htmlrootassigneelast_run_timestampAE(ipersist_js_state·has_pluto_hook_features§cell_id$495b281e-f4c9-4f55-bf5a-9a8d7f43044cdepends_on_disabled_cells§runtime Mpublished_object_keysdepends_on_skipped_cells§errored$be38f44f-9ce4-433a-84ef-782e5d8a4822queued¤logsrunning¦outputbody0.0mimetext/plainrootassigneelast_run_timestampAE(R۰persist_js_state·has_pluto_hook_features§cell_id$be38f44f-9ce4-433a-84ef-782e5d8a4822depends_on_disabled_cells§runtime-published_object_keysdepends_on_skipped_cells§errored$11e60eb5-980d-4d3d-8f09-03390584aaadqueued¤logsrunning¦outputbodymimetext/plainrootassigneelast_run_timestampAE)
/persist_js_state·has_pluto_hook_features§cell_id$11e60eb5-980d-4d3d-8f09-03390584aaaddepends_on_disabled_cells§runtime L#published_object_keysdepends_on_skipped_cells§errored$957519f4-a669-472a-bc81-ecd0dcce9842queued¤logsrunning¦outputbodyBenchmarkTools.Trial: 10000 samples with 991 evaluations.
 Range [90m([39m[36m[1mmin[22m[39m … [35mmax[39m[90m):  [39m[36m[1m 40.985 ns[22m[39m … [35m 22.722 μs[39m  [90m┊[39m GC [90m([39mmin … max[90m): [39m 0.00% … 99.12%
 Time  [90m([39m[34m[1mmedian[22m[39m[90m):     [39m[34m[1m 68.246 ns               [22m[39m[90m┊[39m GC [90m([39mmedian[90m):    [39m 0.00%
 Time  [90m([39m[32m[1mmean[22m[39m ± [32mσ[39m[90m):   [39m[32m[1m109.118 ns[22m[39m ± [32m389.093 ns[39m  [90m┊[39m GC [90m([39mmean ± σ[90m):  [39m20.77% ± 14.25%

  [39m▅[39m▅[39m█[34m▇[39m[39m▅[39m▃[39m [32m [39m[39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m▂[39m▃[39m▂[39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m▂
  [39m█[39m█[39m█[34m█[39m[39m█[39m█[39m█[32m▅[39m[39m▃[39m▁[39m▃[39m▁[39m▁[39m▁[39m▁[39m▁[39m▁[39m▁[39m▃[39m▁[39m▃[39m▁[39m▁[39m▁[39m▁[39m▁[39m▁[39m▄[39m▁[39m▁[39m▁[39m▃[39m▃[39m▁[39m▄[39m█[39m█[39m█[39m▇[39m▅[39m▃[39m▅[39m▅[39m▆[39m▅[39m▅[39m▅[39m▅[39m▅[39m▅[39m▅[39m▄[39m▄[39m▄[39m▄[39m▃[39m▅[39m▆[39m█[39m█[39m█[39m [39m█
  41 ns[90m         [39m[90mHistogram: [39m[90m[1mlog([22m[39m[90mfrequency[39m[90m[1m)[22m[39m[90m by time[39m        638 ns [0m[1m<[22m

 Memory estimate[90m: [39m[33m928 bytes[39m, allocs estimate[90m: [39m[33m2[39m.mimetext/plainrootassigneelast_run_timestampAE)persist_js_state·has_pluto_hook_features§cell_id$957519f4-a669-472a-bc81-ecd0dcce9842depends_on_disabled_cells§runtimeΕKѵpublished_object_keysdepends_on_skipped_cells§errored$1b548d59-f18e-4cfc-9667-472c427d7cc2queued¤logsrunning¦outputbodymimetext/plainrootassigneelast_run_timestampAE(npersist_js_state·has_pluto_hook_features§cell_id$1b548d59-f18e-4cfc-9667-472c427d7cc2depends_on_disabled_cells§runtime $џpublished_object_keysdepends_on_skipped_cells§errored$cee02d24-1dcc-4c29-a322-0ddd12ab8180queued¤logsrunning¦outputbodymimetext/plainrootassigneelast_run_timestampAE) ^persist_js_state·has_pluto_hook_features§cell_id$cee02d24-1dcc-4c29-a322-0ddd12ab8180depends_on_disabled_cells§runtimempublished_object_keysdepends_on_skipped_cells§errored$e1ec523b-3c2f-447d-8b71-063dc5955f45queued¤logsrunning¦outputbodyh<div class="markdown"><h3 id="Why-would-you-want-to-do-that?">Why would you want to do that?</h3>
</div>mimetext/htmlrootassigneelast_run_timestampAE(bpersist_js_state·has_pluto_hook_features§cell_id$e1ec523b-3c2f-447d-8b71-063dc5955f45depends_on_disabled_cells§runtime published_object_keysdepends_on_skipped_cells§errored$279df4ae-a0e2-4838-8a9c-3ff82245935equeued¤logsrunning¦outputbody<div class="markdown"><p>For small programs called many times, consider making a <strong>sysimage</strong> using <a href="https://julialang.github.io/PackageCompiler.jl/stable/sysimages.html">PackageCompiler.jl</a> to avoid  compilation cost each time.</p>
</div>mimetext/htmlrootassigneelast_run_timestampAE(oTpersist_js_state·has_pluto_hook_features§cell_id$279df4ae-a0e2-4838-8a9c-3ff82245935edepends_on_disabled_cells§runtime Apublished_object_keysdepends_on_skipped_cells§errored$9ec9429d-c1f1-4845-a514-9c88b452071fqueued¤logsrunning¦outputbody6<!-- https://github.com/fonsp/Pluto.jl/issues/400#issuecomment-695040745 -->
<input
	type="checkbox"
	id="width-over-livedocs"
	name="width-over-livedocs"
    onclick="window.plutoOptIns.toggle_width(this)"
	>
<label for="width-over-livedocs">
	Full Width Mode
</label>
<style>
	body.width-over-docs #helpbox-wrapper {
    	display: none !important;
	}
	body.width-over-docs main {
               max-width: none !important;
               margin: 0 !important;
	       # max-width: calc(100% - 4rem);
               # margin-right: 2rem;
	}
</style>
<script>
	const toggle_width = function(t) {
		t.checked
		? document.body.classList.add("width-over-docs")
		: document.body.classList.remove("width-over-docs") }
	window.plutoOptIns = window.plutoOptIns || {}
	window.plutoOptIns.toggle_width = toggle_width
	
</script>
mimetext/htmlrootassigneelast_run_timestampAE()?persist_js_state·has_pluto_hook_features§cell_id$9ec9429d-c1f1-4845-a514-9c88b452071fdepends_on_disabled_cells§runtime Jlpublished_object_keysdepends_on_skipped_cells§errored$f3937141-49f4-49f2-8bcf-0f4e9c204d24queued¤logslinemsgMethodInstance for Main.var"workspace#3".func_with_type_instability(::Vector{Float64}, ::Int64)
  from func_with_type_instability([90mobs[39m, [90mparam[39m)[90m @[39m [90mMain.var"workspace#3"[39m [90m~/work/Notes-Fall2025/Notes-Fall2025/week5/[39m[90m[4mweek5.jl#==#fad14e46-21a4-41ea-8f3d-a747cdfe3a51:1[24m[39m
Arguments
  #self#[36m::Core.Const(Main.var"workspace#3".func_with_type_instability)[39m
  obs[36m::Vector{Float64}[39m
  param[36m::Int64[39m
Locals
  χ²[91m[1m::Any[22m[39m
  pred[33m[1m::Union{Vector{Float64}, Vector{Int64}, Vector{Real}}[22m[39m
Body[91m[1m::Any[22m[39m
[90m1 ─[39m %1 = Base.broadcasted(Main.var"workspace#3".my_model, obs, param)[36m::Base.Broadcast.Broadcasted{Base.Broadcast.DefaultArrayStyle{1}, Nothing, typeof(Main.var"workspace#3".my_model), Tuple{Vector{Float64}, Int64}}[39m
[90m│  [39m      (pred = Base.materialize(%1))
[90m│  [39m %3 = pred[33m[1m::Union{Vector{Float64}, Vector{Int64}, Vector{Real}}[22m[39m
[90m│  [39m %4 = Main.var"workspace#3".calc_χ²(obs, %3)[91m[1m::Any[22m[39m
[90m│  [39m      (χ² = %4)
[90m└──[39m      return %4

text/plaincell_id$f3937141-49f4-49f2-8bcf-0f4e9c204d24kwargsidPlutoRunner_d1acb81efileP/home/runner/.julia/packages/Pluto/CBqeh/src/runner/PlutoRunner/src/io/stdout.jlgroupstdoutlevelLogLevel(-555)running¦outputbodymimetext/plainrootassigneelast_run_timestampAE)2persist_js_state·has_pluto_hook_features§cell_id$f3937141-49f4-49f2-8bcf-0f4e9c204d24depends_on_disabled_cells§runtimeΦ6=published_object_keysdepends_on_skipped_cells§errored$047835eb-6bcc-4f32-b991-5ccccbf34cb9queued¤logsrunning¦outputbodyprefixRealelements1.0text/plain2text/plain3text/plaintypeArrayprefix_shortobjectiddfb86ee7283adea9mime!application/vnd.pluto.tree+objectrootassigneearray_of_realslast_run_timestampAE)`kpersist_js_state·has_pluto_hook_features§cell_id$047835eb-6bcc-4f32-b991-5ccccbf34cb9depends_on_disabled_cells§runtime 3published_object_keysdepends_on_skipped_cells§errored$e1996c2f-5298-48c9-a29c-852bd37b54c4queued¤logsrunning¦outputbodymimetext/plainrootassigneelast_run_timestampAE)bApersist_js_state·has_pluto_hook_features§cell_id$e1996c2f-5298-48c9-a29c-852bd37b54c4depends_on_disabled_cells§runtimelpublished_object_keysdepends_on_skipped_cells§errored$59fbb599-c947-4a2a-a678-8e38a666660cqueued¤logslinemsg,  0.000001 seconds (1 allocation: 16 bytes)
text/plaincell_id$59fbb599-c947-4a2a-a678-8e38a666660ckwargsidPlutoRunner_d1acb81efileP/home/runner/.julia/packages/Pluto/CBqeh/src/runner/PlutoRunner/src/io/stdout.jlgroupstdoutlevelLogLevel(-555)running¦outputbodyprefixview(::Matrix{Float64}, :, 1): elements 0.12307text/plain0.368559text/plain2.27357text/plain-0.253736text/plain-2.08108text/plain-1.04544text/plain-0.416231text/plain0.14153text/plain	1.21345text/plain
1.06368text/plain-0.466929text/plain0.125361text/plain1.00169text/plain0.0568795text/plain2.2829text/plain-0.678769text/plain-0.4524text/plain-0.284222text/plain-0.347168text/plain0.750999text/plainmore[0.750758text/plain\-0.182216text/plain]-0.392818text/plain^-0.623447text/plain_0.297572text/plain`1.06335text/plaina0.679394text/plainb-1.29336text/plainc2.68771text/plaind-0.440474text/plaintypeArrayprefix_shortview(::Matrix{Float64}, :, 1): objectid1c7acf235413e139mime!application/vnd.pluto.tree+objectrootassignee@time col_one_viewlast_run_timestampAE)Apersist_js_state·has_pluto_hook_features§cell_id$59fbb599-c947-4a2a-a678-8e38a666660cdepends_on_disabled_cells§runtime #published_object_keysdepends_on_skipped_cells§errored$e80e73cc-fb81-4222-8fcd-a9c4aaf6326equeued¤logsrunning¦outputbodyBenchmarkTools.Trial: 10000 samples with 1 evaluation.
 Range [90m([39m[36m[1mmin[22m[39m … [35mmax[39m[90m):  [39m[36m[1m12.874 μs[22m[39m … [35m 3.274 ms[39m  [90m┊[39m GC [90m([39mmin … max[90m): [39m0.00% … 99.05%
 Time  [90m([39m[34m[1mmedian[22m[39m[90m):     [39m[34m[1m13.495 μs              [22m[39m[90m┊[39m GC [90m([39mmedian[90m):    [39m0.00%
 Time  [90m([39m[32m[1mmean[22m[39m ± [32mσ[39m[90m):   [39m[32m[1m19.275 μs[22m[39m ± [32m55.909 μs[39m  [90m┊[39m GC [90m([39mmean ± σ[90m):  [39m8.06% ±  3.62%

  [39m█[34m▅[39m[39m▁[39m [39m [39m [39m [32m [39m[39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m▁[39m▁[39m▂[39m▁[39m▁[39m [39m [39m [39m▁
  [39m█[34m█[39m[39m█[39m█[39m▇[39m▇[39m▅[32m▇[39m[39m▇[39m▆[39m▆[39m█[39m█[39m▆[39m▆[39m▆[39m▄[39m▄[39m▁[39m▃[39m▄[39m▄[39m▃[39m▃[39m▄[39m▄[39m▁[39m▃[39m▄[39m▄[39m▄[39m▄[39m▅[39m▅[39m▃[39m▅[39m▁[39m▄[39m▁[39m▁[39m▁[39m▃[39m▁[39m▁[39m▁[39m▁[39m▁[39m▁[39m▁[39m▁[39m▁[39m▇[39m█[39m█[39m█[39m█[39m█[39m▇[39m▆[39m [39m█
  12.9 μs[90m      [39m[90mHistogram: [39m[90m[1mlog([22m[39m[90mfrequency[39m[90m[1m)[22m[39m[90m by time[39m        66 μs [0m[1m<[22m

 Memory estimate[90m: [39m[33m128.07 KiB[39m, allocs estimate[90m: [39m[33m3[39m.mimetext/plainrootassigneelast_run_timestampAE(persist_js_state·has_pluto_hook_features§cell_id$e80e73cc-fb81-4222-8fcd-a9c4aaf6326edepends_on_disabled_cells§runtime   }Epublished_object_keysdepends_on_skipped_cells§errored$8f4b3c77-e79f-457a-b9e9-9f30dd1f526aqueued¤logsrunning¦outputbodyo<div class="markdown"><p>It can store an array of abstract types, but that can be quite inefficient.</p>
</div>mimetext/htmlrootassigneelast_run_timestampAE(аpersist_js_state·has_pluto_hook_features§cell_id$8f4b3c77-e79f-457a-b9e9-9f30dd1f526adepends_on_disabled_cells§runtime Vpublished_object_keysdepends_on_skipped_cells§errored$79783bcb-fe34-4c9d-af08-7a82c851beecqueued¤logsrunning¦outputbody٪<div class="markdown"><h3 id="Writing-functions-that-can-take-an-unknown-number-of-arguements">Writing functions that can take an unknown number of arguements</h3>
</div>mimetext/htmlrootassigneelast_run_timestampAE(옿rpersist_js_state·has_pluto_hook_features§cell_id$79783bcb-fe34-4c9d-af08-7a82c851beecdepends_on_disabled_cells§runtime published_object_keysdepends_on_skipped_cells§errored$18813a15-531f-4d74-a0f7-45a0574d6c1bqueued¤logslinemsg.  0.000002 seconds (3 allocations: 944 bytes)
text/plaincell_id$18813a15-531f-4d74-a0f7-45a0574d6c1bkwargsidPlutoRunner_d1acb81efileP/home/runner/.julia/packages/Pluto/CBqeh/src/runner/PlutoRunner/src/io/stdout.jlgroupstdoutlevelLogLevel(-555)running¦outputbodyprefixFloat64elements 0.12307text/plain0.368559text/plain2.27357text/plain-0.253736text/plain-2.08108text/plain-1.04544text/plain-0.416231text/plain0.14153text/plain	1.21345text/plain
1.06368text/plain-0.466929text/plain0.125361text/plain1.00169text/plain0.0568795text/plain2.2829text/plain-0.678769text/plain-0.4524text/plain-0.284222text/plain-0.347168text/plain0.750999text/plainmore[0.750758text/plain\-0.182216text/plain]-0.392818text/plain^-0.623447text/plain_0.297572text/plain`1.06335text/plaina0.679394text/plainb-1.29336text/plainc2.68771text/plaind-0.440474text/plaintypeArrayprefix_shortobjectidcd29a9b95818c743mime!application/vnd.pluto.tree+objectrootassignee@time col_one_copiedlast_run_timestampAE)2ưpersist_js_state·has_pluto_hook_features§cell_id$18813a15-531f-4d74-a0f7-45a0574d6c1bdepends_on_disabled_cells§runtime #^published_object_keysdepends_on_skipped_cells§errored$d58ee47e-10df-4d8c-aad3-ae755a5024e4queued¤logsrunning¦outputbodymimetext/plainrootassigneelast_run_timestampAE(mpersist_js_state·has_pluto_hook_features§cell_id$d58ee47e-10df-4d8c-aad3-ae755a5024e4depends_on_disabled_cells§runtime$=published_object_keysdepends_on_skipped_cells§errored$b243656e-2eec-4650-adbe-5ca8a712d5d6queued¤logsrunning¦outputbody<div class="nice-blockquote nice-blockquote__bordered nice-blockquote--quoted">
<p class="nice-blockquote__text">
<div class="markdown"><p>How should we decide whether to inline a function or not?</p>
</div>
<p>
<div class="nice-blockquote__text nice-blockquote__text--author">

</div> 
</div> 
<style> 
.nice-blockquote{
padding: 25px;
background: light grey;
border: 0.5px solid #ccc;
color: black;
box-sizing:border-box;
overflow-y:hidden;
}
.nice-blockquote__bordered{
border-left-width: 14px;
}
.nice-blockquote--quoted::before{
content:open-quote;
font-size:70px;
font-family: Arial;
font-weight:bold;
color:#ccc;
display:block;
margin-top:-20px;
margin-bottom:-40px;
font-family: Arial;
}
.nice-blockquote__text{
font-family: Arial;
font-style: italic;
fontsize: 1.5em;	
margin:0;
line height: 1.5;
text-align:left;
}
.nice-blockquote__text:not(:last_child){
margin-bottom:10px;
}
.nice-blockquote__text--author{
font-weight:bold;
font-style: normal;
text-align:right;
fontsize: 2em;
}
.nice-blockquote__text--author::before{
content:close-quote;
font-size:70px;
font-family: Arial;
font-weight:bold;
color:#ccc;
display:block;
margin-top:-28px;
margin-bottom:-40px;
}
</style>
mimetext/htmlrootassigneelast_run_timestampAE)Ipersist_js_state·has_pluto_hook_features§cell_id$b243656e-2eec-4650-adbe-5ca8a712d5d6depends_on_disabled_cells§runtime apublished_object_keysdepends_on_skipped_cells§errored$bd011001-07cb-4f74-9c69-8f91945e2cbfqueued¤logsrunning¦outputbody<div class="nice-blockquote nice-blockquote__bordered nice-blockquote--quoted">
<p class="nice-blockquote__text">
<div class="markdown"><p>I thought &#91;using many smaller functions&#93; would take longer since the program needs to go somewhere else. </p>
</div>
<p>
<div class="nice-blockquote__text nice-blockquote__text--author">

</div> 
</div> 
<style> 
.nice-blockquote{
padding: 25px;
background: light grey;
border: 0.5px solid #ccc;
color: black;
box-sizing:border-box;
overflow-y:hidden;
}
.nice-blockquote__bordered{
border-left-width: 14px;
}
.nice-blockquote--quoted::before{
content:open-quote;
font-size:70px;
font-family: Arial;
font-weight:bold;
color:#ccc;
display:block;
margin-top:-20px;
margin-bottom:-40px;
font-family: Arial;
}
.nice-blockquote__text{
font-family: Arial;
font-style: italic;
fontsize: 1.5em;	
margin:0;
line height: 1.5;
text-align:left;
}
.nice-blockquote__text:not(:last_child){
margin-bottom:10px;
}
.nice-blockquote__text--author{
font-weight:bold;
font-style: normal;
text-align:right;
fontsize: 2em;
}
.nice-blockquote__text--author::before{
content:close-quote;
font-size:70px;
font-family: Arial;
font-weight:bold;
color:#ccc;
display:block;
margin-top:-28px;
margin-bottom:-40px;
}
</style>
mimetext/htmlrootassigneelast_run_timestampAE)persist_js_state·has_pluto_hook_features§cell_id$bd011001-07cb-4f74-9c69-8f91945e2cbfdepends_on_disabled_cells§runtime ~published_object_keysdepends_on_skipped_cells§errored$77e28f2e-d53a-4dd7-938e-5d95bac81db1queued¤logsrunning¦outputbodyprefixFloat64elements1.0text/plain2.0text/plain3.0text/plaintypeArrayprefix_shortobjectid9aa33d8e9d4e0885mime!application/vnd.pluto.tree+objectrootassigneearray_of_float64slast_run_timestampAE)T4persist_js_state·has_pluto_hook_features§cell_id$77e28f2e-d53a-4dd7-938e-5d95bac81db1depends_on_disabled_cells§runtime-published_object_keysdepends_on_skipped_cells§errored$64fc3013-09e3-4f95-a3f4-20138125e71bqueued¤logsrunning¦outputbodyY<div class="markdown"><ul>
<li><p>Small functions that will be called many times &#40;e.g., inside a loop&#41; → want to inline</p>
</li>
<li><p>Large functions or functions that will only be called a few times → little benefit to inlining </p>
</li>
<li><p>Modern languages/compilers will typically decide for you based on some simple heuristics to guess the typical cost of executing the function.</p>
</li>
<li><p>You can provide a <strong>hint</strong> encouraging or discouraging the compiler from inlining code. &#40;<code>@inline</code> or <code>@noinline</code>&#41;</p>
</li>
</ul>
</div>mimetext/htmlrootassigneelast_run_timestampAE(persist_js_state·has_pluto_hook_features§cell_id$64fc3013-09e3-4f95-a3f4-20138125e71bdepends_on_disabled_cells§runtime published_object_keysdepends_on_skipped_cells§errored$b7c23b8b-aaca-41b0-8397-ad2300eeda50queued¤logsrunning¦outputbodyB<div class="markdown"><h1 id="Old-Q&amp;A">Old Q&amp;A</h1>
</div>mimetext/htmlrootassigneelast_run_timestampAE(ypersist_js_state·has_pluto_hook_features§cell_id$b7c23b8b-aaca-41b0-8397-ad2300eeda50depends_on_disabled_cells§runtime >published_object_keysdepends_on_skipped_cells§errored$fd3c57f9-1f47-4e3e-91ee-b05911f992eequeued¤logsrunning¦outputbody<div class="nice-blockquote nice-blockquote__bordered nice-blockquote--quoted">
<p class="nice-blockquote__text">
<div class="markdown"><p>When optimizing code, what typically has the most impact on decreasing run time?</p>
</div>
<p>
<div class="nice-blockquote__text nice-blockquote__text--author">

</div> 
</div> 
<style> 
.nice-blockquote{
padding: 25px;
background: light grey;
border: 0.5px solid #ccc;
color: black;
box-sizing:border-box;
overflow-y:hidden;
}
.nice-blockquote__bordered{
border-left-width: 14px;
}
.nice-blockquote--quoted::before{
content:open-quote;
font-size:70px;
font-family: Arial;
font-weight:bold;
color:#ccc;
display:block;
margin-top:-20px;
margin-bottom:-40px;
font-family: Arial;
}
.nice-blockquote__text{
font-family: Arial;
font-style: italic;
fontsize: 1.5em;	
margin:0;
line height: 1.5;
text-align:left;
}
.nice-blockquote__text:not(:last_child){
margin-bottom:10px;
}
.nice-blockquote__text--author{
font-weight:bold;
font-style: normal;
text-align:right;
fontsize: 2em;
}
.nice-blockquote__text--author::before{
content:close-quote;
font-size:70px;
font-family: Arial;
font-weight:bold;
color:#ccc;
display:block;
margin-top:-28px;
margin-bottom:-40px;
}
</style>
mimetext/htmlrootassigneelast_run_timestampAE()Qpersist_js_state·has_pluto_hook_features§cell_id$fd3c57f9-1f47-4e3e-91ee-b05911f992eedepends_on_disabled_cells§runtime w/published_object_keysdepends_on_skipped_cells§errored$31debff2-3667-4631-bff5-e95cf107ae9aqueued¤logsrunning¦outputbodyprefixAnyelements1.0text/plain2text/plain"three"text/plaintypeArrayprefix_shortobjectide9b27ce0beb68c3cmime!application/vnd.pluto.tree+objectrootassigneearray_of_anyslast_run_timestampAE)mӰpersist_js_state·has_pluto_hook_features§cell_id$31debff2-3667-4631-bff5-e95cf107ae9adepends_on_disabled_cells§runtime9published_object_keysdepends_on_skipped_cells§errored$783e926f-91a2-4ded-a21b-ae27fa3bc4d8queued¤logsrunning¦outputbody*calc_χ² (generic function with 1 method)mimetext/plainrootassigneelast_run_timestampAE(9persist_js_state·has_pluto_hook_features§cell_id$783e926f-91a2-4ded-a21b-ae27fa3bc4d8depends_on_disabled_cells§runtimebµpublished_object_keysdepends_on_skipped_cells§errored$d6147ce2-b3ec-45f0-ba90-2c453a719548queued¤logsrunning¦outputbodyF<div class="markdown"><h2 id="Inlining-code">Inlining code</h2>
</div>mimetext/htmlrootassigneelast_run_timestampAE(۶persist_js_state·has_pluto_hook_features§cell_id$d6147ce2-b3ec-45f0-ba90-2c453a719548depends_on_disabled_cells§runtime ȵpublished_object_keysdepends_on_skipped_cells§errored$1969217c-24be-47e2-9853-b70cf4d5565dqueued¤logsrunning¦outputbodyr<div class="markdown"><h2 id="Overloading-Functions-for-each-Type">Overloading Functions for each Type</h2>
</div>mimetext/htmlrootassigneelast_run_timestampAE(7Ұpersist_js_state·has_pluto_hook_features§cell_id$1969217c-24be-47e2-9853-b70cf4d5565ddepends_on_disabled_cells§runtime published_object_keysdepends_on_skipped_cells§errored$20db6ae9-8c79-44d1-a3a7-0dadf1d0dc5aqueued¤logsrunning¦outputbodyAfunc_without_type_instability_v2 (generic function with 1 method)mimetext/plainrootassigneelast_run_timestampAE(U*persist_js_state·has_pluto_hook_features§cell_id$20db6ae9-8c79-44d1-a3a7-0dadf1d0dc5adepends_on_disabled_cells§runtime Cpublished_object_keysdepends_on_skipped_cells§errored$d0429b82-7e78-4a18-97bb-e34ba370e024queued¤logsrunning¦outputbodyBenchmarkTools.Trial: 10000 samples with 4 evaluations.
 Range [90m([39m[36m[1mmin[22m[39m … [35mmax[39m[90m):  [39m[36m[1m7.146 μs[22m[39m … [35m236.249 μs[39m  [90m┊[39m GC [90m([39mmin … max[90m): [39m0.00% … 83.64%
 Time  [90m([39m[34m[1mmedian[22m[39m[90m):     [39m[34m[1m7.797 μs               [22m[39m[90m┊[39m GC [90m([39mmedian[90m):    [39m0.00%
 Time  [90m([39m[32m[1mmean[22m[39m ± [32mσ[39m[90m):   [39m[32m[1m9.350 μs[22m[39m ± [32m 10.621 μs[39m  [90m┊[39m GC [90m([39mmean ± σ[90m):  [39m8.71% ±  7.77%

  [39m█[34m▇[39m[39m▇[39m▃[39m▂[32m▂[39m[39m▂[39m▂[39m▁[39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m▁[39m [39m [39m [39m [39m [39m [39m [39m [39m▂
  [39m█[34m█[39m[39m█[39m█[39m█[32m█[39m[39m█[39m█[39m█[39m█[39m▇[39m▇[39m▇[39m▆[39m▇[39m▇[39m▇[39m▅[39m▅[39m▄[39m▄[39m▅[39m▁[39m▁[39m▃[39m▃[39m▁[39m▁[39m▁[39m▁[39m▁[39m▃[39m▁[39m▃[39m▃[39m▁[39m▁[39m▁[39m▁[39m▁[39m▁[39m▁[39m▁[39m▁[39m▁[39m▁[39m▁[39m▁[39m▅[39m▇[39m█[39m█[39m█[39m▆[39m▆[39m▅[39m▅[39m▆[39m▅[39m [39m█
  7.15 μs[90m      [39m[90mHistogram: [39m[90m[1mlog([22m[39m[90mfrequency[39m[90m[1m)[22m[39m[90m by time[39m      32.9 μs [0m[1m<[22m

 Memory estimate[90m: [39m[33m55.18 KiB[39m, allocs estimate[90m: [39m[33m21[39m.mimetext/plainrootassigneelast_run_timestampAE(RTpersist_js_state·has_pluto_hook_features§cell_id$d0429b82-7e78-4a18-97bb-e34ba370e024depends_on_disabled_cells§runtime   ipublished_object_keysdepends_on_skipped_cells§errored$94223079-afab-4a6d-a126-068a4e94f52equeued¤logsrunning¦outputbodymimetext/plainrootassigneelast_run_timestampAE(|Epersist_js_state·has_pluto_hook_features§cell_id$94223079-afab-4a6d-a126-068a4e94f52edepends_on_disabled_cells§runtime cpublished_object_keysdepends_on_skipped_cells§errored$d3d085e6-67b5-4286-b66d-120720e1002dqueued¤logsrunning¦outputbody<div class="markdown"><h1 id="Preping-for-Code-Review">Preping for Code Review</h1>
<h2 id="Make-it-easy-for-your-reviewer">Make it easy for your reviewer</h2>
<ul>
<li><p>Provide overview of what your code is doing in README.md</p>
</li>
<li><p>Where should they start?</p>
</li>
<li><p>What files should they focus on?</p>
</li>
<li><p>What files should they ignore?</p>
</li>
<li><p>Include an example of how to run/use code</p>
</li>
</ul>
<h2 id="Make-it-easy-for-you">Make it easy for you</h2>
<p>As code starts getting larger, then</p>
<ul>
<li><p>Move code out of notebooks and into <code>.jl</code> files, as functions mature.</p>
</li>
<li><p>Organize similar functions into <code>.jl</code> files in <code>src</code> directory</p>
</li>
<li><p>Use diretories like <code>examples</code>, <code>test</code></p>
</li>
<li><p>If/when appropiate add more directories &#40;e.g., <code>data</code>, <code>deps</code>, <code>docs</code>&#41;</p>
</li>
</ul>
</div>mimetext/htmlrootassigneelast_run_timestampAE(\persist_js_state·has_pluto_hook_features§cell_id$d3d085e6-67b5-4286-b66d-120720e1002ddepends_on_disabled_cells§runtime published_object_keysdepends_on_skipped_cells§errored$e7227a20-3d2d-4907-b9a6-422c0d4ab57aqueued¤logsrunning¦outputbody*distance (generic function with 2 methods)mimetext/plainrootassigneelast_run_timestampAE(@dpersist_js_state·has_pluto_hook_features§cell_id$e7227a20-3d2d-4907-b9a6-422c0d4ab57adepends_on_disabled_cells§runtime published_object_keysdepends_on_skipped_cells§errored$348ee204-546f-46c5-bf5d-7d4a761002ecqueued¤logsrunning¦outputbodyX<div class="markdown"><h1 id="Optimizing-Serial-Code">Optimizing Serial Code</h1>
</div>mimetext/htmlrootassigneelast_run_timestampAE(씙persist_js_state·has_pluto_hook_features§cell_id$348ee204-546f-46c5-bf5d-7d4a761002ecdepends_on_disabled_cells§runtime dpublished_object_keysdepends_on_skipped_cells§errored$170f2bd0-bb5b-4e78-b92b-dfa8d47aded0queued¤logsrunning¦outputbodyBenchmarkTools.Trial: 10000 samples with 1 evaluation.
 Range [90m([39m[36m[1mmin[22m[39m … [35mmax[39m[90m):  [39m[36m[1m38.372 μs[22m[39m … [35m 4.052 ms[39m  [90m┊[39m GC [90m([39mmin … max[90m): [39m0.00% … 98.14%
 Time  [90m([39m[34m[1mmedian[22m[39m[90m):     [39m[34m[1m38.862 μs              [22m[39m[90m┊[39m GC [90m([39mmedian[90m):    [39m0.00%
 Time  [90m([39m[32m[1mmean[22m[39m ± [32mσ[39m[90m):   [39m[32m[1m47.688 μs[22m[39m ± [32m77.323 μs[39m  [90m┊[39m GC [90m([39mmean ± σ[90m):  [39m5.95% ±  4.54%

  [34m█[39m[39m▃[39m▁[39m▁[39m [39m [39m [39m [39m [32m▂[39m[39m▁[39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m▂[39m▂[39m▂[39m▂[39m [39m [39m [39m [39m [39m [39m [39m [39m [39m▁
  [34m█[39m[39m█[39m█[39m█[39m█[39m▆[39m▇[39m▇[39m▅[32m█[39m[39m█[39m▇[39m█[39m█[39m▇[39m▇[39m▆[39m▅[39m▄[39m▅[39m▃[39m▅[39m▄[39m▁[39m▄[39m▁[39m▁[39m▁[39m▃[39m▃[39m▁[39m▄[39m▁[39m▃[39m▁[39m▁[39m▁[39m▄[39m▃[39m▃[39m▁[39m▁[39m▁[39m▁[39m▃[39m▁[39m▇[39m█[39m█[39m█[39m█[39m█[39m▇[39m▅[39m▅[39m▅[39m▆[39m▇[39m▇[39m [39m█
  38.4 μs[90m      [39m[90mHistogram: [39m[90m[1mlog([22m[39m[90mfrequency[39m[90m[1m)[22m[39m[90m by time[39m      97.3 μs [0m[1m<[22m

 Memory estimate[90m: [39m[33m128.07 KiB[39m, allocs estimate[90m: [39m[33m3[39m.mimetext/plainrootassigneelast_run_timestampAE)persist_js_state·has_pluto_hook_features§cell_id$170f2bd0-bb5b-4e78-b92b-dfa8d47aded0depends_on_disabled_cells§runtime   published_object_keysdepends_on_skipped_cells§errored$a9cf77ec-434e-4477-a844-9f8b9199589fqueued¤logsrunning¦outputbodyprefixUnion{Missing, Float64}elements1.0text/plainmissingtext/plain3.0text/plaintypeArrayprefix_shortobjectid8cbe156036c2c105mime!application/vnd.pluto.tree+objectrootassigneearray_of_float_or_missinglast_run_timestampAE)~persist_js_state·has_pluto_hook_features§cell_id$a9cf77ec-434e-4477-a844-9f8b9199589fdepends_on_disabled_cells§runtime6ߵpublished_object_keysdepends_on_skipped_cells§errored$781ef824-a235-46ce-accd-362f2e963550queued¤logsrunning¦outputbodyBenchmarkTools.Trial: 471 samples with 1 evaluation.
 Range [90m([39m[36m[1mmin[22m[39m … [35mmax[39m[90m):  [39m[36m[1m 8.678 ms[22m[39m … [35m132.052 ms[39m  [90m┊[39m GC [90m([39mmin … max[90m): [39m 0.00% … 93.20%
 Time  [90m([39m[34m[1mmedian[22m[39m[90m):     [39m[34m[1m10.373 ms               [22m[39m[90m┊[39m GC [90m([39mmedian[90m):    [39m12.15%
 Time  [90m([39m[32m[1mmean[22m[39m ± [32mσ[39m[90m):   [39m[32m[1m10.595 ms[22m[39m ± [32m  5.722 ms[39m  [90m┊[39m GC [90m([39mmean ± σ[90m):  [39m14.30% ±  5.83%

  [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m▂[39m▂[39m▄[39m▃[39m▁[39m [39m [39m [39m [39m [39m [39m [39m [34m▁[39m[39m▁[39m▂[39m▄[39m█[32m▁[39m[39m [39m [39m▁[39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m 
  [39m▂[39m▁[39m▂[39m▂[39m▂[39m▃[39m▂[39m▂[39m▁[39m▃[39m▁[39m▁[39m▁[39m▂[39m▃[39m▂[39m▃[39m▂[39m▃[39m▄[39m▃[39m▄[39m█[39m█[39m█[39m█[39m█[39m█[39m█[39m▇[39m▅[39m▄[39m▅[39m▄[39m█[39m▇[34m█[39m[39m█[39m█[39m█[39m█[32m█[39m[39m▇[39m▇[39m█[39m▆[39m▄[39m▄[39m▇[39m▄[39m▃[39m▃[39m▃[39m▄[39m▃[39m▄[39m▂[39m▂[39m▁[39m▂[39m [39m▄
  8.68 ms[90m         Histogram: frequency by time[39m         11.5 ms [0m[1m<[22m

 Memory estimate[90m: [39m[33m61.04 MiB[39m, allocs estimate[90m: [39m[33m3[39m.mimetext/plainrootassigneelast_run_timestampAE)ǰpersist_js_state·has_pluto_hook_features§cell_id$781ef824-a235-46ce-accd-362f2e963550depends_on_disabled_cells§runtime   {Hpublished_object_keysdepends_on_skipped_cells§errored$46cd3a5f-3358-4f21-91c7-82c544bc4353queued¤logsrunning¦outputbodyB<div class="markdown"><ul>
<li><p>Typically... yes.</p>
</li>
<li><p>Always... no.  E.g., if runtime is dominated by time to read data from the internet/network/disk.  Then, the cost of accessing the data the first time may be so large that the benefits of computing more efficiently are negligible.</p>
</li>
</ul>
</div>mimetext/htmlrootassigneelast_run_timestampAE(v}persist_js_state·has_pluto_hook_features§cell_id$46cd3a5f-3358-4f21-91c7-82c544bc4353depends_on_disabled_cells§runtime $published_object_keysdepends_on_skipped_cells§errored$73b01b03-2016-4253-8f95-e0bdb3bca5f4queued¤logsrunning¦outputbody=<div class="markdown"><p><strong>Yes&#33;</strong></p>
</div>mimetext/htmlrootassigneelast_run_timestampAE(
persist_js_state·has_pluto_hook_features§cell_id$73b01b03-2016-4253-8f95-e0bdb3bca5f4depends_on_disabled_cells§runtime VKpublished_object_keysdepends_on_skipped_cells§errored$5c5f9760-695f-4fa2-b4a6-8a878ab97ea6queued¤logsrunning¦outputbodyk<div class="markdown"><p><strong>A:</strong> Easy answer... Never</p>
<p>Reality:</p>
<ul>
<li><p>You&#39;re writing disposable code</p>
</li>
<li><p>You&#39;re working with some preexisting code that wasn&#39;t designed to do what you want and you want to try something quickly before implementing it well.</p>
</li>
<li><p>Other examples?</p>
</li>
</ul>
</div>mimetext/htmlrootassigneelast_run_timestampAE(߰persist_js_state·has_pluto_hook_features§cell_id$5c5f9760-695f-4fa2-b4a6-8a878ab97ea6depends_on_disabled_cells§runtime r׵published_object_keysdepends_on_skipped_cells§errored$e04666f8-801b-4973-9b9e-807abc5199b7queued¤logsrunning¦outputbodymimetext/plainrootassigneelast_run_timestampAE(dpersist_js_state·has_pluto_hook_features§cell_id$e04666f8-801b-4973-9b9e-807abc5199b7depends_on_disabled_cells§runtime @published_object_keysdepends_on_skipped_cells§errored$08d25c7e-907b-403d-b08d-27ca4efcd958queued¤logsrunning¦outputbody6func_without_barriers (generic function with 1 method)mimetext/plainrootassigneelast_run_timestampAE(i2persist_js_state·has_pluto_hook_features§cell_id$08d25c7e-907b-403d-b08d-27ca4efcd958depends_on_disabled_cells§runtime #*!published_object_keysdepends_on_skipped_cells§errored$d2e1b3c3-3a81-44cd-a57b-fd9c29badce4queued¤logsrunning¦outputbody<div class="markdown"><pre><code class="language-shell">&gt; julia -h

  -O, --optimize&#61;&#123;0,1,2*,3&#125;     Set the optimization level
  --min-optlevel&#61;&#123;0*,1,2,3&#125;     Set a lower bound on the optimization level             
  -J, --sysimage &lt;file&gt;         Start up with the given system image file

  -t, --threads &#123;auto|N&#91;,auto|M&#93;&#125;    
  -p, --procs &#123;N|auto&#125;       

  -g, --debug-info&#61;&#91;&#123;0,1*,2&#125;&#93;   Set the level of debug info generation  
  --check-bounds&#61;&#123;yes|no|auto*&#125; auto respects @inbounds declarations
  --math-mode&#61;&#123;ieee|user*&#125;      user respects &#96;@fastmath&#96; declarations</code></pre>
</div>mimetext/htmlrootassigneelast_run_timestampAE(Qpersist_js_state·has_pluto_hook_features§cell_id$d2e1b3c3-3a81-44cd-a57b-fd9c29badce4depends_on_disabled_cells§runtime 1published_object_keysdepends_on_skipped_cells§errored$dc23159c-95ca-466d-9cbe-23bb0448d134queued¤logsrunning¦outputbody<div class="markdown"><h2 id="Peer-Review-Logistics">Peer Review Logistics</h2>
<ul>
<li><p>Access</p>
<ul>
<li><p>I&#39;ll send you GitHub ID of peer reviewer&#40;s&#41;</p>
</li>
<li><p>Make sure reviewer&#40;s&#41; can access your repo</p>
<ul>
<li><p>If your project repo is private: <code>Settings</code>, <code>Collaborators &amp; Teams</code>, <code>Add people</code>, <code>Read</code>, <code>Add Selection</code>.</p>
</li>
<li><p>Or make your project repo public:  <code>Settings</code>, <code>Change Visibility</code>, plus multiple multiple steps to confirm.</p>
</li>
</ul>
</li>
<li><p>Make sure you can access repo to review</p>
</li>
</ul>
</li>
<li><p>If using Jupyter notebooks, make sure to add Markdown version of code for getting feedback. </p>
</li>
</ul>
<pre><code class="language-julia">julia -e &#39;import Pkg; Pkg.add&#40;&quot;Weave&quot;&#41;; using Weave; convert_doc&#40;&quot;NOTEBOOK_NAME.ipynb&quot;,&quot;NOTEBOOK_NAME.jmd&quot;&#41;&#39;</code></pre>
<ul>
<li><p><a href="https://psuastro528.github.io/Fall2025/project/code_reviews/how_to/">Review instructions</a></p>
</li>
<li><p>Provide most feedback via <a href="https://guides.github.com/features/issues/">GitHub Issues</a></p>
</li>
</ul>
</div>mimetext/htmlrootassigneelast_run_timestampAE(/persist_js_state·has_pluto_hook_features§cell_id$dc23159c-95ca-466d-9cbe-23bb0448d134depends_on_disabled_cells§runtime 5published_object_keysdepends_on_skipped_cells§errored$404c0658-ae86-457a-adc3-4ef69bb43ac8queued¤logsrunning¦outputbody,integrate_f (generic function with 1 method)mimetext/plainrootassigneelast_run_timestampAE)'Qpersist_js_state·has_pluto_hook_features§cell_id$404c0658-ae86-457a-adc3-4ef69bb43ac8depends_on_disabled_cells§runtime ˵published_object_keysdepends_on_skipped_cells§errored$3bf761b6-132b-43fa-aa41-b2e73ddce94bqueued¤logsrunning¦outputbodyd<div class="markdown"><h1 id="Avoiding-copying-using-views">Avoiding copying using views</h1>
</div>mimetext/htmlrootassigneelast_run_timestampAE("ٰpersist_js_state·has_pluto_hook_features§cell_id$3bf761b6-132b-43fa-aa41-b2e73ddce94bdepends_on_disabled_cells§runtime published_object_keysdepends_on_skipped_cells§errored$b7fbdc93-4c8b-4222-98e3-62fa7e726e2fqueued¤logsrunning¦outputbodyL<div class="markdown"><h1 id="Type-Instability">Type Instability</h1>
</div>mimetext/htmlrootassigneelast_run_timestampAE(Ppersist_js_state·has_pluto_hook_features§cell_id$b7fbdc93-4c8b-4222-98e3-62fa7e726e2fdepends_on_disabled_cells§runtime published_object_keysdepends_on_skipped_cells§errored$febc6f64-0d39-4206-8475-e6324973284fqueued¤logsrunning¦outputbody`<div class="markdown"><h3 id="When-use-global-variables?">When use global variables?</h3>
</div>mimetext/htmlrootassigneelast_run_timestampAE(엒persist_js_state·has_pluto_hook_features§cell_id$febc6f64-0d39-4206-8475-e6324973284fdepends_on_disabled_cells§runtime ûpublished_object_keysdepends_on_skipped_cells§errored$b556927c-ab72-41c5-9a3e-83756e40550aqueued¤logsrunning¦outputbody!<div class="nice-blockquote nice-blockquote__bordered nice-blockquote--quoted">
<p class="nice-blockquote__text">
<div class="markdown"><p>What type of variables should always be passed to an inline function versus an external module &#40;maybe large arrays/tables?&#41; so they don&#39;t take up too much room on the stack?</p>
</div>
<p>
<div class="nice-blockquote__text nice-blockquote__text--author">

</div> 
</div> 
<style> 
.nice-blockquote{
padding: 25px;
background: light grey;
border: 0.5px solid #ccc;
color: black;
box-sizing:border-box;
overflow-y:hidden;
}
.nice-blockquote__bordered{
border-left-width: 14px;
}
.nice-blockquote--quoted::before{
content:open-quote;
font-size:70px;
font-family: Arial;
font-weight:bold;
color:#ccc;
display:block;
margin-top:-20px;
margin-bottom:-40px;
font-family: Arial;
}
.nice-blockquote__text{
font-family: Arial;
font-style: italic;
fontsize: 1.5em;	
margin:0;
line height: 1.5;
text-align:left;
}
.nice-blockquote__text:not(:last_child){
margin-bottom:10px;
}
.nice-blockquote__text--author{
font-weight:bold;
font-style: normal;
text-align:right;
fontsize: 2em;
}
.nice-blockquote__text--author::before{
content:close-quote;
font-size:70px;
font-family: Arial;
font-weight:bold;
color:#ccc;
display:block;
margin-top:-28px;
margin-bottom:-40px;
}
</style>
mimetext/htmlrootassigneelast_run_timestampAE)Eppersist_js_state·has_pluto_hook_features§cell_id$b556927c-ab72-41c5-9a3e-83756e40550adepends_on_disabled_cells§runtime ppublished_object_keysdepends_on_skipped_cells§errored$9e8cb539-5d69-4552-87e4-88fe61ab1fbequeued¤logsrunning¦outputbody&theta (generic function with 1 method)mimetext/plainrootassigneelast_run_timestampAE(qpersist_js_state·has_pluto_hook_features§cell_id$9e8cb539-5d69-4552-87e4-88fe61ab1fbedepends_on_disabled_cells§runtime @0published_object_keysdepends_on_skipped_cells§errored$fbd538a3-8ddc-4c3f-9748-35fa7b032809queued¤logslinemsgMethodInstance for Main.var"workspace#3".func_without_barriers(::Vector{Float64}, ::Int64)
  from func_without_barriers([90mobs[39m, [90mparam[39m)[90m @[39m [90mMain.var"workspace#3"[39m [90m~/work/Notes-Fall2025/Notes-Fall2025/week5/[39m[90m[4mweek5.jl#==#08d25c7e-907b-403d-b08d-27ca4efcd958:1[24m[39m
Arguments
  #self#[36m::Core.Const(Main.var"workspace#3".func_without_barriers)[39m
  obs[36m::Vector{Float64}[39m
  param[36m::Int64[39m
Locals
  χ²[36m::Float64[39m
  n[36m::Int64[39m
  pred[33m[1m::Union{Vector{Float64}, Vector{Int64}}[22m[39m
  @_7[33m[1m::Union{Nothing, Tuple{Int64, Int64}}[22m[39m
  r#238[36m::UnitRange{Int64}[39m
  i#239[36m::Int64[39m
  n#240[36m::Int64[39m
  i#241[36m::Int64[39m
  val[36m::Float64[39m
  i[36m::Int64[39m
Body[36m::Float64[39m
[90m1 ──[39m       Core.NewvarNode(:(χ²))
[90m│   [39m       Core.NewvarNode(:(n))
[90m│   [39m       Core.NewvarNode(:(pred))
[90m│   [39m %4  = Main.var"workspace#3".:<[36m::Core.Const(<)[39m
[90m│   [39m %5  = (%4)(param, 1)[36m::Bool[39m
[90m└───[39m       goto #3 if not %5
[90m2 ──[39m %7  = Base.broadcasted(Main.var"workspace#3".:*, param, obs)[36m::Base.Broadcast.Broadcasted{Base.Broadcast.DefaultArrayStyle{1}, Nothing, typeof(*), Tuple{Int64, Vector{Float64}}}[39m
[90m│   [39m       (pred = Base.materialize(%7))
[90m└───[39m       goto #4
[90m3 ──[39m %10 = Main.var"workspace#3".floor[36m::Core.Const(floor)[39m
[90m│   [39m %11 = Main.var"workspace#3".Int64[36m::Core.Const(Int64)[39m
[90m│   [39m %12 = Base.broadcasted(Main.var"workspace#3".:*, param, obs)[36m::Base.Broadcast.Broadcasted{Base.Broadcast.DefaultArrayStyle{1}, Nothing, typeof(*), Tuple{Int64, Vector{Float64}}}[39m
[90m│   [39m %13 = Base.broadcasted(%10, %11, %12)[36m::Base.Broadcast.Broadcasted{Base.Broadcast.DefaultArrayStyle{1}, Nothing, typeof(floor), Tuple{Base.RefValue{Type{Int64}}, Base.Broadcast.Broadcasted{Base.Broadcast.DefaultArrayStyle{1}, Nothing, typeof(*), Tuple{Int64, Vector{Float64}}}}}[39m
[90m└───[39m       (pred = Base.materialize(%13))
[90m4 ┄─[39m %15 = Main.var"workspace#3".length[36m::Core.Const(length)[39m
[90m│   [39m       (n = (%15)(obs))
[90m│   [39m %17 = Main.var"workspace#3".zero[36m::Core.Const(zero)[39m
[90m│   [39m %18 = Main.var"workspace#3".promote_type[36m::Core.Const(promote_type)[39m
[90m│   [39m %19 = Main.var"workspace#3".eltype[36m::Core.Const(eltype)[39m
[90m│   [39m %20 = (%19)(obs)[36m::Core.Const(Float64)[39m
[90m│   [39m %21 = Main.var"workspace#3".eltype[36m::Core.Const(eltype)[39m
[90m│   [39m %22 = pred[33m[1m::Union{Vector{Float64}, Vector{Int64}}[22m[39m
[90m│   [39m %23 = (%21)(%22)[33m[1m::Union{Type{Float64}, Type{Int64}}[22m[39m
[90m│   [39m %24 = (%18)(%20, %23)[36m::Core.Const(Float64)[39m
[90m│   [39m       (χ² = (%17)(%24))
[90m│   [39m %26 = n[36m::Int64[39m
[90m│   [39m %27 = (1:%26)[36m::Core.PartialStruct(UnitRange{Int64}, Any[Core.Const(1), Int64])[39m
[90m│   [39m       (r#238 = %27)
[90m│   [39m %29 = Base.simd_outer_range[36m::Core.Const(Base.SimdLoop.simd_outer_range)[39m
[90m│   [39m %30 = r#238[36m::Core.PartialStruct(UnitRange{Int64}, Any[Core.Const(1), Int64])[39m
[90m│   [39m %31 = (%29)(%30)[36m::Core.Const(0:0)[39m
[90m│   [39m       (@_7 = Base.iterate(%31))
[90m│   [39m %33 = @_7[36m::Core.Const((0, 0))[39m
[90m│   [39m %34 = (%33 === nothing)[36m::Core.Const(false)[39m
[90m│   [39m %35 = Base.not_int(%34)[36m::Core.Const(true)[39m
[90m└───[39m       goto #11 if not %35
[90m5 ──[39m %37 = @_7[36m::Core.Const((0, 0))[39m
[90m│   [39m       (i#239 = Core.getfield(%37, 1))
[90m│   [39m %39 = Core.getfield(%37, 2)[36m::Core.Const(0)[39m
[90m│   [39m %40 = Base.simd_inner_length[36m::Core.Const(Base.SimdLoop.simd_inner_length)[39m
[90m│   [39m %41 = r#238[36m::Core.PartialStruct(UnitRange{Int64}, Any[Core.Const(1), Int64])[39m
[90m│   [39m %42 = i#239[36m::Core.Const(0)[39m
[90m│   [39m %43 = (%40)(%41, %42)[36m::Int64[39m
[90m│   [39m       (n#240 = %43)
[90m│   [39m %45 = Main.var"workspace#3".:<[36m::Core.Const(<)[39m
[90m│   [39m %46 = Main.var"workspace#3".zero[36m::Core.Const(zero)[39m
[90m│   [39m %47 = n#240[36m::Int64[39m
[90m│   [39m %48 = (%46)(%47)[36m::Core.Const(0)[39m
[90m│   [39m %49 = n#240[36m::Int64[39m
[90m│   [39m %50 = (%45)(%48, %49)[36m::Bool[39m
[90m└───[39m       goto #9 if not %50
[90m6 ──[39m %52 = Main.var"workspace#3".zero[36m::Core.Const(zero)[39m
[90m│   [39m %53 = n#240[36m::Int64[39m
[90m│   [39m %54 = (%52)(%53)[36m::Core.Const(0)[39m
[90m└───[39m       (i#241 = %54)
[90m7 ┄─[39m %56 = Main.var"workspace#3".:<[36m::Core.Const(<)[39m
[90m│   [39m %57 = n#240[36m::Int64[39m
[90m│   [39m %58 = (%56)(i#241, %57)[36m::Bool[39m
[90m└───[39m       goto #9 if not %58
[90m8 ──[39m %60 = Base.simd_index[36m::Core.Const(Base.SimdLoop.simd_index)[39m
[90m│   [39m %61 = r#238[36m::Core.PartialStruct(UnitRange{Int64}, Any[Core.Const(1), Int64])[39m
[90m│   [39m %62 = i#239[36m::Core.Const(0)[39m
[90m│   [39m %63 = i#241[36m::Int64[39m
[90m│   [39m       (i = (%60)(%61, %62, %63))
[90m│   [39m       nothing
[90m│   [39m %66 = Main.var"workspace#3".:+[36m::Core.Const(+)[39m
[90m│   [39m %67 = χ²[36m::Float64[39m
[90m│   [39m %68 = Main.var"workspace#3".:^[36m::Core.Const(^)[39m
[90m│   [39m %69 = Main.var"workspace#3".:-[36m::Core.Const(-)[39m
[90m│   [39m %70 = i[36m::Int64[39m
[90m│   [39m %71 = Base.getindex(obs, %70)[36m::Float64[39m
[90m│   [39m %72 = pred[33m[1m::Union{Vector{Float64}, Vector{Int64}}[22m[39m
[90m│   [39m %73 = i[36m::Int64[39m
[90m│   [39m %74 = Base.getindex(%72, %73)[33m[1m::Union{Float64, Int64}[22m[39m
[90m│   [39m %75 = (%69)(%71, %74)[36m::Float64[39m
[90m│   [39m %76 = Core.apply_type(Base.Val, 2)[36m::Core.Const(Val{2})[39m
[90m│   [39m %77 = (%76)()[36m::Core.Const(Val{2}())[39m
[90m│   [39m %78 = Base.literal_pow(%68, %75, %77)[36m::Float64[39m
[90m│   [39m %79 = (%66)(%67, %78)[36m::Float64[39m
[90m│   [39m       (χ² = %79)
[90m│   [39m       (val = %79)
[90m│   [39m       nothing
[90m│   [39m       val
[90m│   [39m       (i#241 = i#241 + 1)
[90m│   [39m       $(Expr(:loopinfo, Symbol("julia.simdloop"), nothing))
[90m└───[39m       goto #7
[90m9 ┄─[39m       (@_7 = Base.iterate(%31, %39))
[90m│   [39m %88 = @_7[36m::Core.Const(nothing)[39m
[90m│   [39m %89 = (%88 === nothing)[36m::Core.Const(true)[39m
[90m│   [39m %90 = Base.not_int(%89)[36m::Core.Const(false)[39m
[90m└───[39m       goto #11 if not %90
[90m10 ─[39m       Core.Const(:(goto %37))
[90m11 ┄[39m       Main.var"workspace#3".nothing
[90m│   [39m %94 = χ²[36m::Float64[39m
[90m└───[39m       return %94

text/plaincell_id$fbd538a3-8ddc-4c3f-9748-35fa7b032809kwargsidPlutoRunner_d1acb81efileP/home/runner/.julia/packages/Pluto/CBqeh/src/runner/PlutoRunner/src/io/stdout.jlgroupstdoutlevelLogLevel(-555)running¦outputbodymimetext/plainrootassigneelast_run_timestampAE)c2persist_js_state·has_pluto_hook_features§cell_id$fbd538a3-8ddc-4c3f-9748-35fa7b032809depends_on_disabled_cells§runtime'Xpublished_object_keysdepends_on_skipped_cells§errored$0f679916-5f87-45a3-996f-be3146a537a2queued¤logsrunning¦outputbodyAfunc_without_type_instability_v3 (generic function with 1 method)mimetext/plainrootassigneelast_run_timestampAE(bpersist_js_state·has_pluto_hook_features§cell_id$0f679916-5f87-45a3-996f-be3146a537a2depends_on_disabled_cells§runtime published_object_keysdepends_on_skipped_cells§errored$252f394f-9d7d-41be-8cbf-ccb5558b83d1queued¤logsrunning¦outputbody<div class="markdown"><h2 id="How-do-we-know-where-do-we-spend-our-time?">How do we know where do we spend our time?</h2>
<p><strong>Q:</strong> How do we know where to focus our efforts based on the coding language we&#39;re using?</p>
<ul>
<li><p>Profiling</p>
</li>
<li><p>Experience with common programming patterns</p>
</li>
<li><p>Knowing &#40;enough about&#41; how your language works under the hood</p>
</li>
</ul>
</div>mimetext/htmlrootassigneelast_run_timestampAE(Lpersist_js_state·has_pluto_hook_features§cell_id$252f394f-9d7d-41be-8cbf-ccb5558b83d1depends_on_disabled_cells§runtime ϵpublished_object_keysdepends_on_skipped_cells§errored$7e466eb6-9b5f-4e9f-90e2-be11fb66d557queued¤logsrunning¦outputbody5.0mimetext/plainrootassigneelast_run_timestampAE(ҿpersist_js_state·has_pluto_hook_features§cell_id$7e466eb6-9b5f-4e9f-90e2-be11fb66d557depends_on_disabled_cells§runtime0published_object_keysdepends_on_skipped_cells§errored$288d3aaf-ee71-44f5-aefb-4b7b787c7caaqueued¤logsrunning¦outputbody<div class="nice-blockquote nice-blockquote__bordered nice-blockquote--quoted">
<p class="nice-blockquote__text">
<div class="markdown"><p>Is it best to make sure that all cells of your array have the same data type?</p>
</div>
<p>
<div class="nice-blockquote__text nice-blockquote__text--author">

</div> 
</div> 
<style> 
.nice-blockquote{
padding: 25px;
background: light grey;
border: 0.5px solid #ccc;
color: black;
box-sizing:border-box;
overflow-y:hidden;
}
.nice-blockquote__bordered{
border-left-width: 14px;
}
.nice-blockquote--quoted::before{
content:open-quote;
font-size:70px;
font-family: Arial;
font-weight:bold;
color:#ccc;
display:block;
margin-top:-20px;
margin-bottom:-40px;
font-family: Arial;
}
.nice-blockquote__text{
font-family: Arial;
font-style: italic;
fontsize: 1.5em;	
margin:0;
line height: 1.5;
text-align:left;
}
.nice-blockquote__text:not(:last_child){
margin-bottom:10px;
}
.nice-blockquote__text--author{
font-weight:bold;
font-style: normal;
text-align:right;
fontsize: 2em;
}
.nice-blockquote__text--author::before{
content:close-quote;
font-size:70px;
font-family: Arial;
font-weight:bold;
color:#ccc;
display:block;
margin-top:-28px;
margin-bottom:-40px;
}
</style>
mimetext/htmlrootassigneelast_run_timestampAE)EJpersist_js_state·has_pluto_hook_features§cell_id$288d3aaf-ee71-44f5-aefb-4b7b787c7caadepends_on_disabled_cells§runtime published_object_keysdepends_on_skipped_cells§errored$8446120e-5bac-4b8e-bc86-836f773f79a0queued¤logsrunning¦outputbody0.6539641978707416mimetext/plainrootassigneelast_run_timestampAE)$Ѱpersist_js_state·has_pluto_hook_features§cell_id$8446120e-5bac-4b8e-bc86-836f773f79a0depends_on_disabled_cells§runtime published_object_keysdepends_on_skipped_cells§errored$c16a95ce-2926-4d99-a907-71c95f32c042queued¤logsrunning¦outputbody5.0mimetext/plainrootassigneelast_run_timestampAE(Wpersist_js_state·has_pluto_hook_features§cell_id$c16a95ce-2926-4d99-a907-71c95f32c042depends_on_disabled_cells§runtimeVpublished_object_keysdepends_on_skipped_cells§errored$8e3ba95e-7c10-4e95-95cb-a906259282fcqueued¤logsrunning¦outputbodyي<div class="markdown"><h3 id="Making-inner-funciton-type-stable-&amp;-generic">Making inner funciton type-stable &amp; generic</h3>
</div>mimetext/htmlrootassigneelast_run_timestampAE(앁persist_js_state·has_pluto_hook_features§cell_id$8e3ba95e-7c10-4e95-95cb-a906259282fcdepends_on_disabled_cells§runtime Ǯpublished_object_keysdepends_on_skipped_cells§errored$93beb233-81cc-47f8-89be-8164cc15d020queued¤logsrunning¦outputbodyd<div class="markdown"><h2 id="Containers-of-Concrete-Types">Containers of Concrete Types</h2>
</div>mimetext/htmlrootassigneelast_run_timestampAE(씀persist_js_state·has_pluto_hook_features§cell_id$93beb233-81cc-47f8-89be-8164cc15d020depends_on_disabled_cells§runtime epublished_object_keysdepends_on_skipped_cells§errored$e6e22f60-4e6a-4160-ba06-42d469afb3f6queued¤logsrunning¦outputbodyV<div class="markdown"><h2 id="What&#39;s-expensive?">What&#39;s expensive?</h2>
</div>mimetext/htmlrootassigneelast_run_timestampAE(Vepersist_js_state·has_pluto_hook_features§cell_id$e6e22f60-4e6a-4160-ba06-42d469afb3f6depends_on_disabled_cells§runtime published_object_keysdepends_on_skipped_cells§errored$f5fe37e1-80b9-4853-84d6-82e56417a470queued¤logsrunning¦outputbody3func_takes_varargs (generic function with 1 method)mimetext/plainrootassigneelast_run_timestampAE)dpersist_js_state·has_pluto_hook_features§cell_id$f5fe37e1-80b9-4853-84d6-82e56417a470depends_on_disabled_cells§runtime A&published_object_keysdepends_on_skipped_cells§errored$8f846ea8-9c6e-499b-bfd8-18bdbbd110f7queued¤logsrunning¦outputbodyBenchmarkTools.Trial: 10000 samples with 10 evaluations.
 Range [90m([39m[36m[1mmin[22m[39m … [35mmax[39m[90m):  [39m[36m[1m1.321 μs[22m[39m … [35m  4.371 μs[39m  [90m┊[39m GC [90m([39mmin … max[90m): [39m0.00% … 0.00%
 Time  [90m([39m[34m[1mmedian[22m[39m[90m):     [39m[34m[1m1.633 μs               [22m[39m[90m┊[39m GC [90m([39mmedian[90m):    [39m0.00%
 Time  [90m([39m[32m[1mmean[22m[39m ± [32mσ[39m[90m):   [39m[32m[1m1.580 μs[22m[39m ± [32m233.944 ns[39m  [90m┊[39m GC [90m([39mmean ± σ[90m):  [39m0.00% ± 0.00%

  [39m█[39m▆[39m▂[39m [39m [39m [39m▂[39m [39m [39m [39m [39m [39m [32m [39m[39m▅[34m█[39m[39m▆[39m▄[39m▂[39m [39m [39m [39m▄[39m▅[39m▄[39m▂[39m [39m [39m [39m [39m▃[39m▂[39m [39m [39m [39m [39m [39m [39m▁[39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m▂
  [39m█[39m█[39m█[39m▇[39m▄[39m▄[39m█[39m█[39m▄[39m▁[39m▁[39m▁[39m▃[32m▅[39m[39m█[34m█[39m[39m█[39m█[39m█[39m▇[39m▆[39m▇[39m█[39m█[39m█[39m█[39m█[39m▅[39m▅[39m▇[39m█[39m█[39m█[39m▇[39m▅[39m▁[39m▃[39m█[39m█[39m█[39m▅[39m▅[39m▄[39m▇[39m▇[39m▆[39m▄[39m▁[39m▃[39m▃[39m▁[39m▁[39m▃[39m▁[39m▃[39m▄[39m▁[39m▄[39m▇[39m [39m█
  1.32 μs[90m      [39m[90mHistogram: [39m[90m[1mlog([22m[39m[90mfrequency[39m[90m[1m)[22m[39m[90m by time[39m      2.52 μs [0m[1m<[22m

 Memory estimate[90m: [39m[33m928 bytes[39m, allocs estimate[90m: [39m[33m2[39m.mimetext/plainrootassigneelast_run_timestampAE)ߤQpersist_js_state·has_pluto_hook_features§cell_id$8f846ea8-9c6e-499b-bfd8-18bdbbd110f7depends_on_disabled_cells§runtimeΌ$'published_object_keysdepends_on_skipped_cells§errored$21e3dc92-82c9-4486-8980-d5e6a012afecqueued¤logslinemsgelements1text/plaintypeTupleobjectid5bca7c69703f9065!application/vnd.pluto.tree+objectcell_id$21e3dc92-82c9-4486-8980-d5e6a012afeckwargsidMain_workspace#2_32d8f177filef/home/runner/work/Notes-Fall2025/Notes-Fall2025/week5/week5.jl#==#f5fe37e1-80b9-4853-84d6-82e56417a470groupweek5levelInforunning¦outputbodymimetext/plainrootassigneelast_run_timestampAE):persist_js_state·has_pluto_hook_features§cell_id$21e3dc92-82c9-4486-8980-d5e6a012afecdepends_on_disabled_cells§runtime
apublished_object_keysdepends_on_skipped_cells§errored$365c43af-37a3-4f0c-8e9e-d4003c47b6a3queued¤logsrunning¦outputbody`<div class="markdown"><h2 id="With-Programming-Interface">With Programming Interface</h2>
</div>mimetext/htmlrootassigneelast_run_timestampAE(֪persist_js_state·has_pluto_hook_features§cell_id$365c43af-37a3-4f0c-8e9e-d4003c47b6a3depends_on_disabled_cells§runtime published_object_keysdepends_on_skipped_cells§errored$9850f52c-7209-4ba0-9298-942d68947b9equeued¤logsrunning¦outputbody<div class="nice-blockquote nice-blockquote__bordered nice-blockquote--quoted">
<p class="nice-blockquote__text">
<div class="markdown"><p>Could you elaborate on the &quot;...&quot; operator that is used within functions and function arguments? How does this contribute to improved performance?</p>
</div>
<p>
<div class="nice-blockquote__text nice-blockquote__text--author">

</div> 
</div> 
<style> 
.nice-blockquote{
padding: 25px;
background: light grey;
border: 0.5px solid #ccc;
color: black;
box-sizing:border-box;
overflow-y:hidden;
}
.nice-blockquote__bordered{
border-left-width: 14px;
}
.nice-blockquote--quoted::before{
content:open-quote;
font-size:70px;
font-family: Arial;
font-weight:bold;
color:#ccc;
display:block;
margin-top:-20px;
margin-bottom:-40px;
font-family: Arial;
}
.nice-blockquote__text{
font-family: Arial;
font-style: italic;
fontsize: 1.5em;	
margin:0;
line height: 1.5;
text-align:left;
}
.nice-blockquote__text:not(:last_child){
margin-bottom:10px;
}
.nice-blockquote__text--author{
font-weight:bold;
font-style: normal;
text-align:right;
fontsize: 2em;
}
.nice-blockquote__text--author::before{
content:close-quote;
font-size:70px;
font-family: Arial;
font-weight:bold;
color:#ccc;
display:block;
margin-top:-28px;
margin-bottom:-40px;
}
</style>
mimetext/htmlrootassigneelast_run_timestampAE)g,persist_js_state·has_pluto_hook_features§cell_id$9850f52c-7209-4ba0-9298-942d68947b9edepends_on_disabled_cells§runtime Wpublished_object_keysdepends_on_skipped_cells§errored$1fd8655d-8065-4945-acef-7774ed882d51queued¤logsrunning¦outputbody'theta (generic function with 2 methods)mimetext/plainrootassigneelast_run_timestampAE(persist_js_state·has_pluto_hook_features§cell_id$1fd8655d-8065-4945-acef-7774ed882d51depends_on_disabled_cells§runtime )published_object_keysdepends_on_skipped_cells§errored$0913de40-9fa0-44db-9b2c-9bd93db31790queued¤logsrunning¦outputbodymimetext/plainrootassigneelast_run_timestampAE(Էpersist_js_state·has_pluto_hook_features§cell_id$0913de40-9fa0-44db-9b2c-9bd93db31790depends_on_disabled_cells§runtime )}published_object_keysdepends_on_skipped_cells§errored$28b53ea4-5bdc-4ac2-b83e-bcb8f0a6416cqueued¤logsrunning¦outputbody<div class="nice-blockquote nice-blockquote__bordered nice-blockquote--quoted">
<p class="nice-blockquote__text">
<div class="markdown"><p>How does Julia compile data into arrays efficiently if the array contains multiple different data types?</p>
</div>
<p>
<div class="nice-blockquote__text nice-blockquote__text--author">

</div> 
</div> 
<style> 
.nice-blockquote{
padding: 25px;
background: light grey;
border: 0.5px solid #ccc;
color: black;
box-sizing:border-box;
overflow-y:hidden;
}
.nice-blockquote__bordered{
border-left-width: 14px;
}
.nice-blockquote--quoted::before{
content:open-quote;
font-size:70px;
font-family: Arial;
font-weight:bold;
color:#ccc;
display:block;
margin-top:-20px;
margin-bottom:-40px;
font-family: Arial;
}
.nice-blockquote__text{
font-family: Arial;
font-style: italic;
fontsize: 1.5em;	
margin:0;
line height: 1.5;
text-align:left;
}
.nice-blockquote__text:not(:last_child){
margin-bottom:10px;
}
.nice-blockquote__text--author{
font-weight:bold;
font-style: normal;
text-align:right;
fontsize: 2em;
}
.nice-blockquote__text--author::before{
content:close-quote;
font-size:70px;
font-family: Arial;
font-weight:bold;
color:#ccc;
display:block;
margin-top:-28px;
margin-bottom:-40px;
}
</style>
mimetext/htmlrootassigneelast_run_timestampAE)E#persist_js_state·has_pluto_hook_features§cell_id$28b53ea4-5bdc-4ac2-b83e-bcb8f0a6416cdepends_on_disabled_cells§runtime published_object_keysdepends_on_skipped_cells§errored$9303806b-a460-4ec2-9f71-252f43b34328queued¤logsrunning¦outputbodymimetext/plainrootassigneelast_run_timestampAE(rpersist_js_state·has_pluto_hook_features§cell_id$9303806b-a460-4ec2-9f71-252f43b34328depends_on_disabled_cells§runtimeepublished_object_keysdepends_on_skipped_cells§errored$9e8035cd-c5ba-47c7-8567-1279e666c4fcqueued¤logslinemsgprefixPBase.Pairs{Symbol, Any, Tuple{Symbol, Symbol}, @NamedTuple{a::String, b::Int64}}elements:atext/plain"a"text/plain:btext/plain2text/plaintypeDictprefix_shortPairsobjectid8ccfb1680022cd8e!application/vnd.pluto.tree+objectcell_id$9e8035cd-c5ba-47c7-8567-1279e666c4fckwargsidMain_workspace#2_32d8f178filef/home/runner/work/Notes-Fall2025/Notes-Fall2025/week5/week5.jl#==#3e8c154a-3c22-49cc-accd-1076430268aegroupweek5levelInforunning¦outputbodymimetext/plainrootassigneelast_run_timestampAE),persist_js_state·has_pluto_hook_features§cell_id$9e8035cd-c5ba-47c7-8567-1279e666c4fcdepends_on_disabled_cells§runtime-ٵpublished_object_keysdepends_on_skipped_cells§errored$426ccd5e-398b-4df7-a27d-cf7a578c658fqueued¤logslinemsg  0.000001 seconds
text/plaincell_id$426ccd5e-398b-4df7-a27d-cf7a578c658fkwargsidPlutoRunner_d1acb81efileP/home/runner/.julia/packages/Pluto/CBqeh/src/runner/PlutoRunner/src/io/stdout.jlgroupstdoutlevelLogLevel(-555)running¦outputbodyprefixview(::Matrix{Float64}, 1, :): elements 0.12307text/plain1.01799text/plain-0.395052text/plain0.824969text/plain-1.0832text/plain0.139942text/plain-0.0393634text/plain0.848658text/plain	-0.178521text/plain
1.7617text/plain-1.15012text/plain3.27889text/plain1.39378text/plain-0.585879text/plain0.528007text/plain-1.61489text/plain-1.56609text/plain-0.807679text/plain1.06054text/plain-0.358974text/plainmore[-1.0875text/plain\-0.822131text/plain]-0.588678text/plain^-0.84641text/plain_0.67201text/plain`-0.625109text/plaina-1.20346text/plainb1.46734text/plainc0.516096text/plaind0.0442022text/plaintypeArrayprefix_shortview(::Matrix{Float64}, 1, :): objectidc17968da9fbfb124mime!application/vnd.pluto.tree+objectrootassignee@time row_one_viewlast_run_timestampAE)*Rpersist_js_state·has_pluto_hook_features§cell_id$426ccd5e-398b-4df7-a27d-cf7a578c658fdepends_on_disabled_cells§runtime Rpublished_object_keysdepends_on_skipped_cells§errored$82883c5d-db3d-4293-bf74-a6e36552a125queued¤logsrunning¦outputbody0my_model_stable (generic function with 1 method)mimetext/plainrootassigneelast_run_timestampAE(\Jpersist_js_state·has_pluto_hook_features§cell_id$82883c5d-db3d-4293-bf74-a6e36552a125depends_on_disabled_cells§runtime 	[published_object_keysdepends_on_skipped_cells§errored$c6460feb-67f0-4028-8b05-e195a8c2bd41queued¤logsrunning¦outputbody<div class="markdown"><h3 id="Big-picture-steps-to-efficiency:">Big picture steps to efficiency:</h3>
<ul>
<li><p>Use a compiled language</p>
</li>
<li><p>Use a strongly-typed language</p>
</li>
<li><p>Choose of algorithms wisely</p>
</li>
<li><p>Choose data types wisely</p>
</li>
<li><p>Avoid unnecessary memory allocations</p>
</li>
<li><p>Arrange memory accesses to reduce cache misses</p>
</li>
</ul>
</div>mimetext/htmlrootassigneelast_run_timestampAE(?persist_js_state·has_pluto_hook_features§cell_id$c6460feb-67f0-4028-8b05-e195a8c2bd41depends_on_disabled_cells§runtime gpublished_object_keysdepends_on_skipped_cells§errored$44c5243c-a044-4ed7-bf25-728b0291c14aqueued¤logsrunning¦outputbodyd<div class="markdown"><h2 id="Why-a-Programming-Interface?">Why a Programming Interface?</h2>
</div>mimetext/htmlrootassigneelast_run_timestampAE(̰persist_js_state·has_pluto_hook_features§cell_id$44c5243c-a044-4ed7-bf25-728b0291c14adepends_on_disabled_cells§runtime published_object_keysdepends_on_skipped_cells§errored$e7d4bc52-ee18-4d0b-8bab-591b688398fequeued¤logsrunning¦outputbodyL<script>
	
// Load the library for consistent smooth scrolling
const {default: scrollIntoView} = await import("data:text/javascript;base64,dmFyIFE9ZT0+Im9iamVjdCI9PXR5cGVvZiBlJiZudWxsIT1lJiYxPT09ZS5ub2RlVHlwZSxVPShlLHQpPT4oIXR8fCJoaWRkZW4iIT09ZSkmJiJ2aXNpYmxlIiE9PWUmJiJjbGlwIiE9PWUsQT0oZSx0KT0+e2lmKGUuY2xpZW50SGVpZ2h0PGUuc2Nyb2xsSGVpZ2h0fHxlLmNsaWVudFdpZHRoPGUuc2Nyb2xsV2lkdGgpe2xldCBsPWdldENvbXB1dGVkU3R5bGUoZSxudWxsKTtyZXR1cm4gVShsLm92ZXJmbG93WSx0KXx8VShsLm92ZXJmbG93WCx0KXx8KGU9PntsZXQgdD0oZT0+e2lmKCFlLm93bmVyRG9jdW1lbnR8fCFlLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcpcmV0dXJuIG51bGw7dHJ5e3JldHVybiBlLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcuZnJhbWVFbGVtZW50fWNhdGNoe3JldHVybiBudWxsfX0pKGUpO3JldHVybiEhdCYmKHQuY2xpZW50SGVpZ2h0PGUuc2Nyb2xsSGVpZ2h0fHx0LmNsaWVudFdpZHRoPGUuc2Nyb2xsV2lkdGgpfSkoZSl9cmV0dXJuITF9LFg9KGUsdCxsLG8sbixyLGkscyk9PnI8ZSYmaT50fHxyPmUmJmk8dD8wOnI8PWUmJnM8PWx8fGk+PXQmJnM+PWw/ci1lLW86aT50JiZzPGx8fHI8ZSYmcz5sP2ktdCtuOjAsJD1lPT5lLnBhcmVudEVsZW1lbnQ/PyhlLmdldFJvb3ROb2RlKCkuaG9zdHx8bnVsbCksdHQ9KGUsdCk9Pnt2YXIgbCxvLG4scjtpZih0eXBlb2YgZG9jdW1lbnQ+InUiKXJldHVybltdO2xldHtzY3JvbGxNb2RlOmksYmxvY2s6cyxpbmxpbmU6YSxib3VuZGFyeTpoLHNraXBPdmVyZmxvd0hpZGRlbkVsZW1lbnRzOnV9PXQsZz0iZnVuY3Rpb24iPT10eXBlb2YgaD9oOmU9PmUhPT1oO2lmKCFRKGUpKXRocm93IFR5cGVFcnJvcigiSW52YWxpZCB0YXJnZXQiKTtsZXQgdj1kb2N1bWVudC5zY3JvbGxpbmdFbGVtZW50fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsbT1bXSx3PWU7Zm9yKDtRKHcpJiZnKHcpOyl7aWYoKHc9JCh3KSk9PT12KXttLnB1c2godyk7YnJlYWt9bnVsbCE9dyYmdz09PWRvY3VtZW50LmJvZHkmJkEodykmJiFBKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCl8fG51bGwhPXcmJkEodyx1KSYmbS5wdXNoKHcpfWxldCBXPW51bGwhPShvPW51bGw9PShsPXdpbmRvdy52aXN1YWxWaWV3cG9ydCk/dm9pZCAwOmwud2lkdGgpP286aW5uZXJXaWR0aCxIPW51bGwhPShyPW51bGw9PShuPXdpbmRvdy52aXN1YWxWaWV3cG9ydCk/dm9pZCAwOm4uaGVpZ2h0KT9yOmlubmVySGVpZ2h0LHtzY3JvbGxYOl8sc2Nyb2xsWTp4fT13aW5kb3cse2hlaWdodDpFLHdpZHRoOlQsdG9wOk4scmlnaHQ6TCxib3R0b206WSxsZWZ0OkN9PWUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksUj0ic3RhcnQiPT09c3x8Im5lYXJlc3QiPT09cz9OOiJlbmQiPT09cz9ZOk4rRS8yLFY9ImNlbnRlciI9PT1hP0MrVC8yOiJlbmQiPT09YT9MOkMsQj1bXTtmb3IobGV0IEQ9MDtEPG0ubGVuZ3RoO0QrKyl7bGV0IE89bVtEXSx7aGVpZ2h0Omosd2lkdGg6SSx0b3A6UyxyaWdodDpxLGJvdHRvbTp6LGxlZnQ6Rn09Ty5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtpZigiaWYtbmVlZGVkIj09PWkmJk4+PTAmJkM+PTAmJlk8PUgmJkw8PVcmJk4+PVMmJlk8PXomJkM+PUYmJkw8PXEpYnJlYWs7bGV0IEc9Z2V0Q29tcHV0ZWRTdHlsZShPKSxKPXBhcnNlSW50KEcuYm9yZGVyTGVmdFdpZHRoLDEwKSxLPXBhcnNlSW50KEcuYm9yZGVyVG9wV2lkdGgsMTApLFA9cGFyc2VJbnQoRy5ib3JkZXJSaWdodFdpZHRoLDEwKSxaPXBhcnNlSW50KEcuYm9yZGVyQm90dG9tV2lkdGgsMTApLGVlPTAsZXQ9MCxlbD0ib2Zmc2V0V2lkdGgiaW4gTz9PLm9mZnNldFdpZHRoLU8uY2xpZW50V2lkdGgtSi1QOjAsZW89Im9mZnNldEhlaWdodCJpbiBPP08ub2Zmc2V0SGVpZ2h0LU8uY2xpZW50SGVpZ2h0LUstWjowLGVuPSJvZmZzZXRXaWR0aCJpbiBPPzA9PT1PLm9mZnNldFdpZHRoPzA6SS9PLm9mZnNldFdpZHRoOjAsZXI9Im9mZnNldEhlaWdodCJpbiBPPzA9PT1PLm9mZnNldEhlaWdodD8wOmovTy5vZmZzZXRIZWlnaHQ6MDtpZih2PT09TyllZT0ic3RhcnQiPT09cz9SOiJlbmQiPT09cz9SLUg6Im5lYXJlc3QiPT09cz9YKHgseCtILEgsSyxaLHgrUix4K1IrRSxFKTpSLUgvMixldD0ic3RhcnQiPT09YT9WOiJjZW50ZXIiPT09YT9WLVcvMjoiZW5kIj09PWE/Vi1XOlgoXyxfK1csVyxKLFAsXytWLF8rVitULFQpLGVlPU1hdGgubWF4KDAsZWUreCksZXQ9TWF0aC5tYXgoMCxldCtfKTtlbHNle2VlPSJzdGFydCI9PT1zP1ItUy1LOiJlbmQiPT09cz9SLXorWitlbzoibmVhcmVzdCI9PT1zP1goUyx6LGosSyxaK2VvLFIsUitFLEUpOlItKFMrai8yKStlby8yLGV0PSJzdGFydCI9PT1hP1YtRi1KOiJjZW50ZXIiPT09YT9WLShGK0kvMikrZWwvMjoiZW5kIj09PWE/Vi1xK1ArZWw6WChGLHEsSSxKLFArZWwsVixWK1QsVCk7bGV0e3Njcm9sbExlZnQ6ZWksc2Nyb2xsVG9wOmVkfT1PO2VlPU1hdGgubWF4KDAsTWF0aC5taW4oZWQrZWUvZXIsTy5zY3JvbGxIZWlnaHQtai9lcitlbykpLGV0PU1hdGgubWF4KDAsTWF0aC5taW4oZWkrZXQvZW4sTy5zY3JvbGxXaWR0aC1JL2VuK2VsKSksUis9ZWQtZWUsVis9ZWktZXR9Qi5wdXNoKHtlbDpPLHRvcDplZSxsZWZ0OmV0fSl9cmV0dXJuIEJ9LGY9ZT0+e3ZhciB0O3JldHVybiExPT09ZT97YmxvY2s6ImVuZCIsaW5saW5lOiJuZWFyZXN0In06KHQ9ZSk9PT1PYmplY3QodCkmJjAhPT1PYmplY3Qua2V5cyh0KS5sZW5ndGg/ZTp7YmxvY2s6InN0YXJ0IixpbmxpbmU6Im5lYXJlc3QifX07ZnVuY3Rpb24gYyhlLHQpe3ZhciBsO2lmKCFlLmlzQ29ubmVjdGVkfHwhKGU9PntsZXQgdD1lO2Zvcig7dCYmdC5wYXJlbnROb2RlOyl7aWYodC5wYXJlbnROb2RlPT09ZG9jdW1lbnQpcmV0dXJuITA7dD10LnBhcmVudE5vZGUgaW5zdGFuY2VvZiBTaGFkb3dSb290P3QucGFyZW50Tm9kZS5ob3N0OnQucGFyZW50Tm9kZX1yZXR1cm4hMX0pKGUpKXJldHVybjtpZigib2JqZWN0Ij09dHlwZW9mKGw9dCkmJiJmdW5jdGlvbiI9PXR5cGVvZiBsLmJlaGF2aW9yKXJldHVybiB0LmJlaGF2aW9yKHR0KGUsdCkpO2xldCBvPSJib29sZWFuIj09dHlwZW9mIHR8fG51bGw9PXQ/dm9pZCAwOnQuYmVoYXZpb3I7Zm9yKGxldHtlbDpuLHRvcDpyLGxlZnQ6aX1vZiB0dChlLGYodCkpKW4uc2Nyb2xsKHt0b3A6cixsZWZ0OmksYmVoYXZpb3I6b30pfXZhciBkLHA9KCk9PihkfHwoZD0icGVyZm9ybWFuY2UiaW4gd2luZG93P3BlcmZvcm1hbmNlLm5vdy5iaW5kKHBlcmZvcm1hbmNlKTpEYXRlLm5vdyksZCgpKTtmdW5jdGlvbiBiKGUpe2xldCB0PU1hdGgubWluKChwKCktZS5zdGFydFRpbWUpL2UuZHVyYXRpb24sMSksbD1lLmVhc2UodCksbz1lLnN0YXJ0WCsoZS54LWUuc3RhcnRYKSpsLG49ZS5zdGFydFkrKGUueS1lLnN0YXJ0WSkqbDtlLm1ldGhvZChvLG4sdCxsKSxvIT09ZS54fHxuIT09ZS55P3JlcXVlc3RBbmltYXRpb25GcmFtZSgoKT0+YihlKSk6ZS5jYigpfWZ1bmN0aW9uIHkoZSx0LGwpe2xldCBvPWFyZ3VtZW50cy5sZW5ndGg+MyYmdm9pZCAwIT09YXJndW1lbnRzWzNdP2FyZ3VtZW50c1szXTo2MDAsbj1hcmd1bWVudHMubGVuZ3RoPjQmJnZvaWQgMCE9PWFyZ3VtZW50c1s0XT9hcmd1bWVudHNbNF06ZT0+MSstLWUqZSplKmUqZSxyPWFyZ3VtZW50cy5sZW5ndGg+NT9hcmd1bWVudHNbNV06dm9pZCAwLGk9YXJndW1lbnRzLmxlbmd0aD42P2FyZ3VtZW50c1s2XTp2b2lkIDAscz1lLnNjcm9sbExlZnQsYT1lLnNjcm9sbFRvcDtiKHtzY3JvbGxhYmxlOmUsbWV0aG9kKHQsbCxvLG4pe2xldCByPU1hdGguY2VpbCh0KSxzPU1hdGguY2VpbChsKTtlLnNjcm9sbExlZnQ9cixlLnNjcm9sbFRvcD1zLGk/Lih7dGFyZ2V0OmUsZWxhcHNlZDpvLHZhbHVlOm4sbGVmdDpyLHRvcDpzfSl9LHN0YXJ0VGltZTpwKCksc3RhcnRYOnMsc3RhcnRZOmEseDp0LHk6bCxkdXJhdGlvbjpvLGVhc2U6bixjYjpyfSl9dmFyIE09ZT0+ZSYmIWUuYmVoYXZpb3J8fCJzbW9vdGgiPT09ZS5iZWhhdmlvcixrPWZ1bmN0aW9uKGUsdCl7bGV0IGw9dHx8e307cmV0dXJuIE0obCk/YyhlLHtibG9jazpsLmJsb2NrLGlubGluZTpsLmlubGluZSxzY3JvbGxNb2RlOmwuc2Nyb2xsTW9kZSxib3VuZGFyeTpsLmJvdW5kYXJ5LHNraXBPdmVyZmxvd0hpZGRlbkVsZW1lbnRzOmwuc2tpcE92ZXJmbG93SGlkZGVuRWxlbWVudHMsYmVoYXZpb3I6ZT0+UHJvbWlzZS5hbGwoZS5yZWR1Y2UoKGUsdCk9PntsZXR7ZWw6byxsZWZ0Om4sdG9wOnJ9PXQsaT1vLnNjcm9sbExlZnQscz1vLnNjcm9sbFRvcDtyZXR1cm4gaT09PW4mJnM9PT1yP2U6Wy4uLmUsbmV3IFByb21pc2UoZT0+eShvLG4scixsLmR1cmF0aW9uLGwuZWFzZSwoKT0+ZSh7ZWw6byxsZWZ0OltpLG5dLHRvcDpbcyxyXX0pLGwub25TY3JvbGxDaGFuZ2UpKV19LFtdKSl9KTpQcm9taXNlLnJlc29sdmUoYyhlLHQpKX07ZXhwb3J0e2sgYXMgZGVmYXVsdH07")

const indent = true
const aside = true
const title_text = "Table of Contents"
const include_definitions = false


const tocNode = html`<nav class="plutoui-toc">
	<header>
	 <span class="toc-toggle open-toc"></span>
	 <span class="toc-toggle closed-toc"></span>
	 ${title_text}
	</header>
	<section></section>
</nav>`

tocNode.classList.toggle("aside", aside)
tocNode.classList.toggle("indent", indent)


const getParentCell = el => el.closest("pluto-cell")

const getHeaders = () => {
	const depth = Math.max(1, Math.min(6, 3)) // should be in range 1:6
	const range = Array.from({length: depth}, (x, i) => i+1) // [1, ..., depth]
	
	const selector = [
		...(include_definitions ? [
			`pluto-notebook pluto-cell .pluto-docs-binding`, 
			`pluto-notebook pluto-cell assignee:not(:empty)`, 
		] : []),
		...range.map(i => `pluto-notebook pluto-cell h${i}`)
	].join(",")
	return Array.from(document.querySelectorAll(selector)).filter(el => 
		// exclude headers inside of a pluto-docs-binding block
		!(el.nodeName.startsWith("H") && el.closest(".pluto-docs-binding"))
	)
}


const document_click_handler = (event) => {
	const path = (event.path || event.composedPath())
	const toc = path.find(elem => elem?.classList?.contains?.("toc-toggle"))
	if (toc) {
		event.stopImmediatePropagation()
		toc.closest(".plutoui-toc").classList.toggle("hide")
	}
}

document.addEventListener("click", document_click_handler)


const header_to_index_entry_map = new Map()
const currently_highlighted_set = new Set()

const last_toc_element_click_time = { current: 0 }

const intersection_callback = (ixs) => {
	let on_top = ixs.filter(ix => ix.intersectionRatio > 0 && ix.intersectionRect.y < ix.rootBounds.height / 2)
	if(on_top.length > 0){
		currently_highlighted_set.forEach(a => a.classList.remove("in-view"))
		currently_highlighted_set.clear()
		on_top.slice(0,1).forEach(i => {
			let div = header_to_index_entry_map.get(i.target)
			div.classList.add("in-view")
			currently_highlighted_set.add(div)
			
			/// scroll into view
			/*
			const toc_height = tocNode.offsetHeight
			const div_pos = div.offsetTop
			const div_height = div.offsetHeight
			const current_scroll = tocNode.scrollTop
			const header_height = tocNode.querySelector("header").offsetHeight
			
			const scroll_to_top = div_pos - header_height
			const scroll_to_bottom = div_pos + div_height - toc_height
			
			// if we set a scrollTop, then the browser will stop any currently ongoing smoothscroll animation. So let's only do this if you are not currently in a smoothscroll.
			if(Date.now() - last_toc_element_click_time.current >= 2000)
				if(current_scroll < scroll_to_bottom){
					tocNode.scrollTop = scroll_to_bottom
				} else if(current_scroll > scroll_to_top){
					tocNode.scrollTop = scroll_to_top
				}
			*/
		})
	}
}
let intersection_observer_1 = new IntersectionObserver(intersection_callback, {
	root: null, // i.e. the viewport
  	threshold: 1,
	rootMargin: "-15px", // slightly smaller than the viewport
	// delay: 100,
})
let intersection_observer_2 = new IntersectionObserver(intersection_callback, {
	root: null, // i.e. the viewport
  	threshold: 1,
	rootMargin: "15px", // slightly larger than the viewport
	// delay: 100,
})

const render = (elements) => {
	header_to_index_entry_map.clear()
	currently_highlighted_set.clear()
	intersection_observer_1.disconnect()
	intersection_observer_2.disconnect()

		let last_level = `H1`
	return html`${elements.map(h => {
	const parent_cell = getParentCell(h)

		let [className, title_el] = h.matches(`.pluto-docs-binding`) ? ["pluto-docs-binding-el", h.firstElementChild] : [h.nodeName, h]

	const a = html`<a 
		class="${className}" 
		title="${title_el.innerText}"
		href="#${parent_cell.id}"
	>${title_el.innerHTML}</a>`
	/* a.onmouseover=()=>{
		parent_cell.firstElementChild.classList.add(
			'highlight-pluto-cell-shoulder'
		)
	}
	a.onmouseout=() => {
		parent_cell.firstElementChild.classList.remove(
			'highlight-pluto-cell-shoulder'
		)
	} */
		
		
	a.onclick=(e) => {
		e.preventDefault();
		last_toc_element_click_time.current = Date.now()
		scrollIntoView(h, {
			behavior: 'smooth', 
			block: 'start',
		}).then(() => 
			// sometimes it doesn't scroll to the right place
			// solution: try a second time!
			scrollIntoView(h, {
				behavior: 'smooth', 
				block: 'start',
			})
	   )
	}

	const row =  html`<div class="toc-row ${className} after-${last_level}">${a}</div>`
		intersection_observer_1.observe(title_el)
		intersection_observer_2.observe(title_el)
		header_to_index_entry_map.set(title_el, row)

	if(className.startsWith("H"))
		last_level = className
		
	return row
})}`
}

const invalidated = { current: false }

const updateCallback = () => {
	if (!invalidated.current) {
		tocNode.querySelector("section").replaceWith(
			html`<section>${render(getHeaders())}</section>`
		)
	}
}
updateCallback()
setTimeout(updateCallback, 100)
setTimeout(updateCallback, 1000)
setTimeout(updateCallback, 5000)

const notebook = document.querySelector("pluto-notebook")


// We have a mutationobserver for each cell:
const mut_observers = {
	current: [],
}

const createCellObservers = () => {
	mut_observers.current.forEach((o) => o.disconnect())
	mut_observers.current = Array.from(notebook.querySelectorAll("pluto-cell")).map(el => {
		const o = new MutationObserver(updateCallback)
		o.observe(el, {attributeFilter: ["class"]})
		return o
	})
}
createCellObservers()

// And one for the notebook's child list, which updates our cell observers:
const notebookObserver = new MutationObserver(() => {
	updateCallback()
	createCellObservers()
})
notebookObserver.observe(notebook, {childList: true})

// And finally, an observer for the document.body classList, to make sure that the toc also works when it is loaded during notebook initialization
const bodyClassObserver = new MutationObserver(updateCallback)
bodyClassObserver.observe(document.body, {attributeFilter: ["class"]})

// Hide/show the ToC when the screen gets small
let m = matchMedia("(max-width: 1000px)")
let match_listener = () => 
	tocNode.classList.toggle("hide", m.matches)
match_listener()
m.addListener(match_listener)

invalidation.then(() => {
	invalidated.current = true
	intersection_observer_1.disconnect()
	intersection_observer_2.disconnect()
	notebookObserver.disconnect()
	bodyClassObserver.disconnect()
	mut_observers.current.forEach((o) => o.disconnect())
	document.removeEventListener("click", document_click_handler)
	m.removeListener(match_listener)
})

return tocNode
</script>
<style>
@media not print {

.plutoui-toc {
	font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Cantarell, Helvetica, Arial, "Apple Color Emoji",
		"Segoe UI Emoji", "Segoe UI Symbol", system-ui, sans-serif;
	--main-bg-color: #fafafa;
	--pluto-output-color: hsl(0, 0%, 36%);
	--pluto-output-h-color: hsl(0, 0%, 21%);
	--sidebar-li-active-bg: rgb(235, 235, 235);
	--icon-filter: unset;
}

@media (prefers-color-scheme: dark) {
	.plutoui-toc {
		--main-bg-color: #303030;
		--pluto-output-color: hsl(0, 0%, 90%);
		--pluto-output-h-color: hsl(0, 0%, 97%);
		--sidebar-li-active-bg: rgb(82, 82, 82);
		--icon-filter: invert(1);
	}
}

.plutoui-toc.aside {
	color: var(--pluto-output-color);
	position: fixed;
	right: 1rem;
	top: 5rem;
	width: min(80vw, 300px);
	padding: 0.5rem;
	padding-top: 0em;
	/* border: 3px solid rgba(0, 0, 0, 0.15); */
	border-radius: 10px;
	/* box-shadow: 0 0 11px 0px #00000010; */
	max-height: calc(100vh - 5rem - 90px);
	overflow: auto;
	z-index: 40;
	background-color: var(--main-bg-color);
	transition: transform 300ms cubic-bezier(0.18, 0.89, 0.45, 1.12);
}

.plutoui-toc.aside.hide {
	transform: translateX(calc(100% - 28px));
}
.plutoui-toc.aside.hide section {
	display: none;
}
.plutoui-toc.aside.hide header {
	margin-bottom: 0em;
	padding-bottom: 0em;
	border-bottom: none;
}
}  /* End of Media print query */
.plutoui-toc.aside.hide .open-toc,
.plutoui-toc.aside:not(.hide) .closed-toc,
.plutoui-toc:not(.aside) .closed-toc {
	display: none;
}

@media (prefers-reduced-motion) {
  .plutoui-toc.aside {
	transition-duration: 0s;
  }
}

.toc-toggle {
	cursor: pointer;
    padding: 1em;
    margin: -1em;
    margin-right: -0.7em;
    line-height: 1em;
    display: flex;
}

.toc-toggle::before {
    content: "";
    display: inline-block;
    height: 1em;
    width: 1em;
    background-image: url("https://cdn.jsdelivr.net/gh/ionic-team/ionicons@5.5.1/src/svg/list-outline.svg");
	/* generated using https://dopiaza.org/tools/datauri/index.php */
    background-image: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI1MTIiIGhlaWdodD0iNTEyIiB2aWV3Qm94PSIwIDAgNTEyIDUxMiI+PHRpdGxlPmlvbmljb25zLXY1LW88L3RpdGxlPjxsaW5lIHgxPSIxNjAiIHkxPSIxNDQiIHgyPSI0NDgiIHkyPSIxNDQiIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOiMwMDA7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS13aWR0aDozMnB4Ii8+PGxpbmUgeDE9IjE2MCIgeTE9IjI1NiIgeDI9IjQ0OCIgeTI9IjI1NiIgc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6IzAwMDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLXdpZHRoOjMycHgiLz48bGluZSB4MT0iMTYwIiB5MT0iMzY4IiB4Mj0iNDQ4IiB5Mj0iMzY4IiBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTojMDAwO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2Utd2lkdGg6MzJweCIvPjxjaXJjbGUgY3g9IjgwIiBjeT0iMTQ0IiByPSIxNiIgc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6IzAwMDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLXdpZHRoOjMycHgiLz48Y2lyY2xlIGN4PSI4MCIgY3k9IjI1NiIgcj0iMTYiIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOiMwMDA7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS13aWR0aDozMnB4Ii8+PGNpcmNsZSBjeD0iODAiIGN5PSIzNjgiIHI9IjE2IiBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTojMDAwO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2Utd2lkdGg6MzJweCIvPjwvc3ZnPg==");
    background-size: 1em;
	filter: var(--icon-filter);
}

.aside .toc-toggle.open-toc:hover::before {
    background-image: url("https://cdn.jsdelivr.net/gh/ionic-team/ionicons@5.5.1/src/svg/arrow-forward-outline.svg");
	/* generated using https://dopiaza.org/tools/datauri/index.php */
    background-image: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI1MTIiIGhlaWdodD0iNTEyIiB2aWV3Qm94PSIwIDAgNTEyIDUxMiI+PHRpdGxlPmlvbmljb25zLXY1LWE8L3RpdGxlPjxwb2x5bGluZSBwb2ludHM9IjI2OCAxMTIgNDEyIDI1NiAyNjggNDAwIiBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTojMDAwO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2Utd2lkdGg6NDhweCIvPjxsaW5lIHgxPSIzOTIiIHkxPSIyNTYiIHgyPSIxMDAiIHkyPSIyNTYiIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOiMwMDA7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS13aWR0aDo0OHB4Ii8+PC9zdmc+");
}
.aside .toc-toggle.closed-toc:hover::before {
    background-image: url("https://cdn.jsdelivr.net/gh/ionic-team/ionicons@5.5.1/src/svg/arrow-back-outline.svg");
	/* generated using https://dopiaza.org/tools/datauri/index.php */
    background-image: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI1MTIiIGhlaWdodD0iNTEyIiB2aWV3Qm94PSIwIDAgNTEyIDUxMiI+PHRpdGxlPmlvbmljb25zLXY1LWE8L3RpdGxlPjxwb2x5bGluZSBwb2ludHM9IjI0NCA0MDAgMTAwIDI1NiAyNDQgMTEyIiBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTojMDAwO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2Utd2lkdGg6NDhweCIvPjxsaW5lIHgxPSIxMjAiIHkxPSIyNTYiIHgyPSI0MTIiIHkyPSIyNTYiIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOiMwMDA7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS13aWR0aDo0OHB4Ii8+PC9zdmc+");
}



.plutoui-toc header {
	display: flex;
	align-items: center;
	gap: .3em;
	font-size: 1.5em;
	/* margin-top: -0.1em; */
	margin-bottom: 0.4em;
	padding: 0.5rem;
	margin-left: 0;
	margin-right: 0;
	font-weight: bold;
	/* border-bottom: 2px solid rgba(0, 0, 0, 0.15); */
	position: sticky;
	top: 0px;
	background: var(--main-bg-color);
	z-index: 41;
}
.plutoui-toc.aside header {
	padding-left: 0;
	padding-right: 0;
}

.plutoui-toc section .toc-row {
	white-space: nowrap;
	overflow: hidden;
	text-overflow: ellipsis;
	padding: .1em;
	border-radius: .2em;
}

.plutoui-toc section .toc-row.H1 {
	margin-top: 1em;
}


.plutoui-toc.aside section .toc-row.in-view {
	background: var(--sidebar-li-active-bg);
}


	
.highlight-pluto-cell-shoulder {
	background: rgba(0, 0, 0, 0.05);
	background-clip: padding-box;
}

.plutoui-toc section a {
	text-decoration: none;
	font-weight: normal;
	color: var(--pluto-output-color);
}
.plutoui-toc section a:hover {
	color: var(--pluto-output-h-color);
}

.plutoui-toc.indent section a.H1 {
	font-weight: 700;
	line-height: 1em;
}

.plutoui-toc.indent section .after-H2 a { padding-left: 10px; }
.plutoui-toc.indent section .after-H3 a { padding-left: 20px; }
.plutoui-toc.indent section .after-H4 a { padding-left: 30px; }
.plutoui-toc.indent section .after-H5 a { padding-left: 40px; }
.plutoui-toc.indent section .after-H6 a { padding-left: 50px; }

.plutoui-toc.indent section a.H1 { padding-left: 0px; }
.plutoui-toc.indent section a.H2 { padding-left: 10px; }
.plutoui-toc.indent section a.H3 { padding-left: 20px; }
.plutoui-toc.indent section a.H4 { padding-left: 30px; }
.plutoui-toc.indent section a.H5 { padding-left: 40px; }
.plutoui-toc.indent section a.H6 { padding-left: 50px; }


.plutoui-toc.indent section a.pluto-docs-binding-el,
.plutoui-toc.indent section a.ASSIGNEE
	{
	font-family: JuliaMono, monospace;
	font-size: .8em;
	/* background: black; */
	font-weight: 700;
    font-style: italic;
	color: var(--cm-var-color); /* this is stealing a variable from Pluto, but it's fine if that doesnt work */
}
.plutoui-toc.indent section a.pluto-docs-binding-el::before,
.plutoui-toc.indent section a.ASSIGNEE::before
	{
	content: "> ";
	opacity: .3;
}
</style>
mimetext/htmlrootassigneelast_run_timestampAE(yopersist_js_state·has_pluto_hook_features§cell_id$e7d4bc52-ee18-4d0b-8bab-591b688398fedepends_on_disabled_cells§runtime5bpublished_object_keysdepends_on_skipped_cells§errored$b1557899-91c0-4f02-b486-e3c4f38d9218queued¤logsrunning¦outputbodyBenchmarkTools.Trial: 10000 samples with 294 evaluations.
 Range [90m([39m[36m[1mmin[22m[39m … [35mmax[39m[90m):  [39m[36m[1m276.197 ns[22m[39m … [35m84.827 μs[39m  [90m┊[39m GC [90m([39mmin … max[90m): [39m 0.00% … 99.06%
 Time  [90m([39m[34m[1mmedian[22m[39m[90m):     [39m[34m[1m278.633 ns              [22m[39m[90m┊[39m GC [90m([39mmedian[90m):    [39m 0.00%
 Time  [90m([39m[32m[1mmean[22m[39m ± [32mσ[39m[90m):   [39m[32m[1m410.699 ns[22m[39m ± [32m 1.459 μs[39m  [90m┊[39m GC [90m([39mmean ± σ[90m):  [39m11.87% ±  8.23%

  [34m█[39m[39m▃[39m [39m▂[39m▃[39m▁[39m [39m [39m▂[39m [39m [39m [39m [39m [39m [39m [39m [32m [39m[39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m▃[39m▄[39m▄[39m▃[39m▂[39m▂[39m▂[39m▁[39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m▁
  [34m█[39m[39m█[39m▇[39m█[39m█[39m█[39m▆[39m▇[39m█[39m▇[39m▅[39m▃[39m▃[39m▄[39m▃[39m▁[39m▁[32m▁[39m[39m▃[39m▁[39m▁[39m▁[39m▃[39m▁[39m▁[39m▁[39m▁[39m▁[39m▁[39m▁[39m▁[39m▁[39m▃[39m▃[39m▁[39m▁[39m▃[39m▄[39m▁[39m▃[39m▄[39m█[39m█[39m█[39m█[39m█[39m█[39m█[39m█[39m▇[39m▆[39m▅[39m▄[39m▄[39m▄[39m▁[39m▄[39m▃[39m▃[39m▃[39m [39m█
  276 ns[90m        [39m[90mHistogram: [39m[90m[1mlog([22m[39m[90mfrequency[39m[90m[1m)[22m[39m[90m by time[39m       758 ns [0m[1m<[22m

 Memory estimate[90m: [39m[33m928 bytes[39m, allocs estimate[90m: [39m[33m2[39m.mimetext/plainrootassigneelast_run_timestampAE)Hグpersist_js_state·has_pluto_hook_features§cell_id$b1557899-91c0-4f02-b486-e3c4f38d9218depends_on_disabled_cells§runtimeΣ\Dpublished_object_keysdepends_on_skipped_cells§errored$e7b56266-5d70-451b-a448-6b6cfd85cab7queued¤logslinemsgelements1text/plain2text/plain3text/plaintypeTupleobjectid6e3572bbea69a4af!application/vnd.pluto.tree+objectcell_id$e7b56266-5d70-451b-a448-6b6cfd85cab7kwargsidMain_workspace#2_32d8f177filef/home/runner/work/Notes-Fall2025/Notes-Fall2025/week5/week5.jl#==#f5fe37e1-80b9-4853-84d6-82e56417a470groupweek5levelInforunning¦outputbodymimetext/plainrootassigneelast_run_timestampAE)`kpersist_js_state·has_pluto_hook_features§cell_id$e7b56266-5d70-451b-a448-6b6cfd85cab7depends_on_disabled_cells§runtimeÈpublished_object_keysdepends_on_skipped_cells§errored$a1992b28-16ab-456b-995d-1e40e423d70cqueued¤logsrunning¦outputbodymimetext/plainrootassigneelast_run_timestampAE(7persist_js_state·has_pluto_hook_features§cell_id$a1992b28-16ab-456b-995d-1e40e423d70cdepends_on_disabled_cells§runtime published_object_keysdepends_on_skipped_cells§errored$4b7b8ef8-e7c4-415b-a103-e109256e0210queued¤logsrunning¦outputbody0.0mimetext/plainrootassigneelast_run_timestampAE(*persist_js_state·has_pluto_hook_features§cell_id$4b7b8ef8-e7c4-415b-a103-e109256e0210depends_on_disabled_cells§runtime/ɵpublished_object_keysdepends_on_skipped_cells§errored$f658c638-8c9d-4828-ac15-ecd7d4650b13queued¤logsrunning¦outputbodyn<div class="markdown"><h1 id="Command-line-Optimization-options">Command-line Optimization options</h1>
</div>mimetext/htmlrootassigneelast_run_timestampAE(; persist_js_state·has_pluto_hook_features§cell_id$f658c638-8c9d-4828-ac15-ecd7d4650b13depends_on_disabled_cells§runtime published_object_keysdepends_on_skipped_cells§errored$d5cb70a8-079b-4fd5-851f-8742680ff515queued¤logsrunning¦outputbody>func_without_type_instability (generic function with 1 method)mimetext/plainrootassigneelast_run_timestampAE(GEpersist_js_state·has_pluto_hook_features§cell_id$d5cb70a8-079b-4fd5-851f-8742680ff515depends_on_disabled_cells§runtime Npublished_object_keysdepends_on_skipped_cells§errored$fad14e46-21a4-41ea-8f3d-a747cdfe3a51queued¤logsrunning¦outputbody;func_with_type_instability (generic function with 1 method)mimetext/plainrootassigneelast_run_timestampAE(@װpersist_js_state·has_pluto_hook_features§cell_id$fad14e46-21a4-41ea-8f3d-a747cdfe3a51depends_on_disabled_cells§runtime !Epublished_object_keysdepends_on_skipped_cells§errored$d6a2b578-88a4-4a82-bb20-641ccc60aa8dqueued¤logsrunning¦outputbodyٴ<div class="markdown"><ul>
<li><p>There is a cost for calling a function.</p>
</li>
<li><p>But small functions are usually inlined, so as to avoid that cost.</p>
</li>
</ul>
</div>mimetext/htmlrootassigneelast_run_timestampAE(%persist_js_state·has_pluto_hook_features§cell_id$d6a2b578-88a4-4a82-bb20-641ccc60aa8ddepends_on_disabled_cells§runtime ȵpublished_object_keysdepends_on_skipped_cells§errored$3fa48928-5311-49ec-83d2-cf4c45c7c579queued¤logsrunning¦outputbodyٌ<div class="markdown"><h2 id="Splat-and-variable-number-of-function-arguements">Splat and variable number of function arguements</h2>
</div>mimetext/htmlrootassigneelast_run_timestampAE(옎persist_js_state·has_pluto_hook_features§cell_id$3fa48928-5311-49ec-83d2-cf4c45c7c579depends_on_disabled_cells§runtime opublished_object_keysdepends_on_skipped_cells§errored$04391eb3-daf0-4f20-b39e-33e626770e05queued¤logsrunning¦outputbodyBenchmarkTools.Trial: 10000 samples with 3 evaluations.
 Range [90m([39m[36m[1mmin[22m[39m … [35mmax[39m[90m):  [39m[36m[1m 5.964 μs[22m[39m … [35m 1.276 ms[39m  [90m┊[39m GC [90m([39mmin … max[90m): [39m 0.00% … 98.48%
 Time  [90m([39m[34m[1mmedian[22m[39m[90m):     [39m[34m[1m 9.454 μs              [22m[39m[90m┊[39m GC [90m([39mmedian[90m):    [39m 0.00%
 Time  [90m([39m[32m[1mmean[22m[39m ± [32mσ[39m[90m):   [39m[32m[1m12.820 μs[22m[39m ± [32m24.087 μs[39m  [90m┊[39m GC [90m([39mmean ± σ[90m):  [39m13.95% ±  9.46%

  [39m█[39m▇[34m▇[39m[32m▅[39m[39m▃[39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m▁[39m▃[39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m▂
  [39m█[39m█[34m█[39m[32m█[39m[39m█[39m▇[39m▅[39m▁[39m▁[39m▄[39m▃[39m▁[39m▁[39m▁[39m▁[39m▃[39m▁[39m▁[39m▁[39m▁[39m█[39m█[39m█[39m▇[39m▆[39m▄[39m▃[39m▁[39m▄[39m▁[39m▁[39m▁[39m▃[39m▃[39m▄[39m▁[39m▃[39m▁[39m▁[39m▁[39m▁[39m▁[39m▁[39m▁[39m▁[39m▁[39m▁[39m▁[39m▁[39m▁[39m▁[39m▁[39m▁[39m▁[39m▁[39m▁[39m▁[39m▄[39m▆[39m [39m█
  5.96 μs[90m      [39m[90mHistogram: [39m[90m[1mlog([22m[39m[90mfrequency[39m[90m[1m)[22m[39m[90m by time[39m       139 μs [0m[1m<[22m

 Memory estimate[90m: [39m[33m128.07 KiB[39m, allocs estimate[90m: [39m[33m3[39m.mimetext/plainrootassigneelast_run_timestampAE)epersist_js_state·has_pluto_hook_features§cell_id$04391eb3-daf0-4f20-b39e-33e626770e05depends_on_disabled_cells§runtime   <published_object_keysdepends_on_skipped_cells§errored$953d09b8-d8d0-4e49-ae55-648f956aa248queued¤logsrunning¦outputbody5.0mimetext/plainrootassigneelast_run_timestampAE(>ppersist_js_state·has_pluto_hook_features§cell_id$953d09b8-d8d0-4e49-ae55-648f956aa248depends_on_disabled_cells§runtime͡ɵpublished_object_keysdepends_on_skipped_cells§errored$3e8c154a-3c22-49cc-accd-1076430268aequeued¤logsrunning¦outputbody8func_takes_varnamedargs (generic function with 1 method)mimetext/plainrootassigneelast_run_timestampAE)8persist_js_state·has_pluto_hook_features§cell_id$3e8c154a-3c22-49cc-accd-1076430268aedepends_on_disabled_cells§runtime .:published_object_keysdepends_on_skipped_cells§errored$3ef73948-da0c-4afa-8a73-29c382b29bbdqueued¤logsrunning¦outputbodyBenchmarkTools.Trial: 10000 samples with 1 evaluation.
 Range [90m([39m[36m[1mmin[22m[39m … [35mmax[39m[90m):  [39m[36m[1m22.031 μs[22m[39m … [35m 4.123 ms[39m  [90m┊[39m GC [90m([39mmin … max[90m): [39m0.00% … 98.99%
 Time  [90m([39m[34m[1mmedian[22m[39m[90m):     [39m[34m[1m22.452 μs              [22m[39m[90m┊[39m GC [90m([39mmedian[90m):    [39m0.00%
 Time  [90m([39m[32m[1mmean[22m[39m ± [32mσ[39m[90m):   [39m[32m[1m29.973 μs[22m[39m ± [32m60.341 μs[39m  [90m┊[39m GC [90m([39mmean ± σ[90m):  [39m6.10% ±  4.14%

  [34m█[39m[39m▃[39m▁[39m [39m [39m [39m [39m [32m [39m[39m [39m▁[39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m▁[39m▂[39m▃[39m▂[39m▁[39m [39m [39m [39m [39m [39m [39m [39m▁
  [34m█[39m[39m█[39m█[39m█[39m▇[39m▇[39m▇[39m▇[32m▇[39m[39m█[39m█[39m▇[39m▆[39m▆[39m▆[39m▆[39m▄[39m▄[39m▅[39m▅[39m▄[39m▄[39m▁[39m▄[39m▁[39m▁[39m▁[39m▁[39m▁[39m▁[39m▁[39m▁[39m▁[39m▁[39m▁[39m▁[39m▁[39m▁[39m▁[39m▁[39m▁[39m▁[39m▁[39m▁[39m▁[39m▃[39m▁[39m▁[39m█[39m█[39m█[39m█[39m█[39m▇[39m▆[39m▆[39m▄[39m▄[39m▆[39m [39m█
  22 μs[90m        [39m[90mHistogram: [39m[90m[1mlog([22m[39m[90mfrequency[39m[90m[1m)[22m[39m[90m by time[39m      78.8 μs [0m[1m<[22m

 Memory estimate[90m: [39m[33m128.07 KiB[39m, allocs estimate[90m: [39m[33m3[39m.mimetext/plainrootassigneelast_run_timestampAE)dpersist_js_state·has_pluto_hook_features§cell_id$3ef73948-da0c-4afa-8a73-29c382b29bbddepends_on_disabled_cells§runtime   J+Hpublished_object_keysdepends_on_skipped_cells§errored$15efacae-95a5-4607-8a38-76ee5f345235queued¤logsrunning¦outputbody:<div class="markdown"><h2 id="Popouri">Popouri</h2>
</div>mimetext/htmlrootassigneelast_run_timestampAE(>Spersist_js_state·has_pluto_hook_features§cell_id$15efacae-95a5-4607-8a38-76ee5f345235depends_on_disabled_cells§runtime published_object_keysdepends_on_skipped_cells§errored$9007f240-c88e-46c4-993d-fd6b93d8b18dqueued¤logsrunning¦outputbodyF<div class="markdown"><h1 id="Announcements">Announcements</h1>
</div>mimetext/htmlrootassigneelast_run_timestampAE(persist_js_state·has_pluto_hook_features§cell_id$9007f240-c88e-46c4-993d-fd6b93d8b18ddepends_on_disabled_cells§runtime published_object_keysdepends_on_skipped_cells§errored$b24a684b-b2d1-4d6a-9408-590feef3ba08queued¤logsrunning¦outputbodyH<div class="markdown"><h2 id="Abstract-Types">Abstract Types</h2>
</div>mimetext/htmlrootassigneelast_run_timestampAE(qpersist_js_state·has_pluto_hook_features§cell_id$b24a684b-b2d1-4d6a-9408-590feef3ba08depends_on_disabled_cells§runtime published_object_keysdepends_on_skipped_cells§errored$282d2a07-5f63-4f3e-960e-b5ffcab6b9dequeued¤logsrunning¦outputbodyBenchmarkTools.Trial: 463 samples with 1 evaluation.
 Range [90m([39m[36m[1mmin[22m[39m … [35mmax[39m[90m):  [39m[36m[1m 8.975 ms[22m[39m … [35m141.024 ms[39m  [90m┊[39m GC [90m([39mmin … max[90m): [39m 0.00% … 92.57%
 Time  [90m([39m[34m[1mmedian[22m[39m[90m):     [39m[34m[1m10.501 ms               [22m[39m[90m┊[39m GC [90m([39mmedian[90m):    [39m11.64%
 Time  [90m([39m[32m[1mmean[22m[39m ± [32mσ[39m[90m):   [39m[32m[1m10.793 ms[22m[39m ± [32m  6.179 ms[39m  [90m┊[39m GC [90m([39mmean ± σ[90m):  [39m14.13% ±  5.88%

  [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m▁[39m▂[39m [39m [39m▁[39m▁[39m [39m▅[39m [39m▂[39m▃[34m▄[39m[39m▆[39m█[39m▅[39m [39m▅[39m▅[32m▃[39m[39m [39m▂[39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m 
  [39m▃[39m▄[39m▃[39m▄[39m▃[39m▃[39m▃[39m▃[39m▁[39m▁[39m▃[39m▃[39m▃[39m▁[39m▃[39m▅[39m▁[39m▇[39m█[39m█[39m▇[39m█[39m█[39m█[39m▆[39m▇[39m█[39m█[39m█[39m█[39m█[39m█[39m█[34m█[39m[39m█[39m█[39m█[39m█[39m█[39m█[32m█[39m[39m█[39m█[39m▆[39m▇[39m▆[39m▅[39m▄[39m▄[39m▃[39m▃[39m▃[39m▄[39m▃[39m▃[39m▁[39m▃[39m▁[39m▁[39m▄[39m [39m▄
  8.97 ms[90m         Histogram: frequency by time[39m         11.7 ms [0m[1m<[22m

 Memory estimate[90m: [39m[33m61.04 MiB[39m, allocs estimate[90m: [39m[33m3[39m.mimetext/plainrootassigneelast_run_timestampAE)>persist_js_state·has_pluto_hook_features§cell_id$282d2a07-5f63-4f3e-960e-b5ffcab6b9dedepends_on_disabled_cells§runtime   )published_object_keysdepends_on_skipped_cells§errored$9ab94eea-4d57-4ef2-a73a-64e7c8b89222queued¤logsrunning¦outputbody0.18237982380143794mimetext/plainrootassigneelast_run_timestampAE)Djpersist_js_state·has_pluto_hook_features§cell_id$9ab94eea-4d57-4ef2-a73a-64e7c8b89222depends_on_disabled_cells§runtime.}(published_object_keysdepends_on_skipped_cells§errored$5d599c10-f1d2-454e-ad85-0e092b6cae7equeued¤logslinemsgMethodInstance for Main.var"workspace#3".func_without_type_instability(::Vector{Float64}, ::Int64)
  from func_without_type_instability([90mobs[39m, [90mparam[39m)[90m @[39m [90mMain.var"workspace#3"[39m [90m~/work/Notes-Fall2025/Notes-Fall2025/week5/[39m[90m[4mweek5.jl#==#d5cb70a8-079b-4fd5-851f-8742680ff515:1[24m[39m
Arguments
  #self#[36m::Core.Const(Main.var"workspace#3".func_without_type_instability)[39m
  obs[36m::Vector{Float64}[39m
  param[36m::Int64[39m
Locals
  χ²[36m::Float64[39m
  pred[36m::Vector{Float64}[39m
Body[36m::Float64[39m
[90m1 ─[39m %1 = Main.var"workspace#3".convert[36m::Core.Const(convert)[39m
[90m│  [39m %2 = Main.var"workspace#3".Float64[36m::Core.Const(Float64)[39m
[90m│  [39m %3 = Base.broadcasted(Main.var"workspace#3".my_model, obs, param)[36m::Base.Broadcast.Broadcasted{Base.Broadcast.DefaultArrayStyle{1}, Nothing, typeof(Main.var"workspace#3".my_model), Tuple{Vector{Float64}, Int64}}[39m
[90m│  [39m %4 = Base.broadcasted(%1, %2, %3)[36m::Base.Broadcast.Broadcasted{Base.Broadcast.DefaultArrayStyle{1}, Nothing, typeof(convert), Tuple{Base.RefValue{Type{Float64}}, Base.Broadcast.Broadcasted{Base.Broadcast.DefaultArrayStyle{1}, Nothing, typeof(Main.var"workspace#3".my_model), Tuple{Vector{Float64}, Int64}}}}[39m
[90m│  [39m      (pred = Base.materialize(%4))
[90m│  [39m %6 = pred[36m::Vector{Float64}[39m
[90m│  [39m %7 = Main.var"workspace#3".calc_χ²(obs, %6)[36m::Float64[39m
[90m│  [39m      (χ² = %7)
[90m└──[39m      return %7

text/plaincell_id$5d599c10-f1d2-454e-ad85-0e092b6cae7ekwargsidPlutoRunner_d1acb81efileP/home/runner/.julia/packages/Pluto/CBqeh/src/runner/PlutoRunner/src/io/stdout.jlgroupstdoutlevelLogLevel(-555)running¦outputbodymimetext/plainrootassigneelast_run_timestampAE)4persist_js_state·has_pluto_hook_features§cell_id$5d599c10-f1d2-454e-ad85-0e092b6cae7edepends_on_disabled_cells§runtime}published_object_keysdepends_on_skipped_cells§errored$4c3332a8-a5d1-43fb-887b-ac66dfa02de5queued¤logsrunning¦outputbodyX<div class="markdown"><h1 id="Programming-Interfaces">Programming Interfaces</h1>
</div>mimetext/htmlrootassigneelast_run_timestampAE(쓥persist_js_state·has_pluto_hook_features§cell_id$4c3332a8-a5d1-43fb-887b-ac66dfa02de5depends_on_disabled_cells§runtime published_object_keysdepends_on_skipped_cells§errored$31476473-d619-404c-a1c1-b32c1b8c5930queued¤logsrunning¦outputbody5<div class="markdown"><h1 id="Class-project">Class project</h1>
<ul>
<li><p>Review feedback on project proposals </p>
</li>
<li><p>Review <a href="https://psuastro528.github.io/Fall2025/project/">project instructions and rubric</a> on website</p>
</li>
<li><p>Can continue using repository from project proposal</p>
</li>
<li><p>Next step is the serial implementation, focusing on good practices that we&#39;ve discussed/seen in labs</p>
</li>
<li><p>Serial code should be ready for peer code review by <strong>Oct 8</strong></p>
</li>
<li><p>After this week&#39;s labs, will have everything you need to benchmark, profile and optimize the serial version of your code.</p>
</li>
<li><p>Sign up for <a href="https://github.com/PsuAstro528/PresentationsSchedule2025">project presentation schedule</a></p>
</li>
</ul>
</div>mimetext/htmlrootassigneelast_run_timestampAE(Npersist_js_state·has_pluto_hook_features§cell_id$31476473-d619-404c-a1c1-b32c1b8c5930depends_on_disabled_cells§runtime ߵpublished_object_keysdepends_on_skipped_cells§errored$53863e96-0c11-484f-bfc9-23b52ca933dequeued¤logsrunning¦outputbody<div class="markdown"><h3 id="Passing-array-of-data-to-function-that-expects-distinct-function-arguments">Passing array of data to function that expects distinct function arguments</h3>
</div>mimetext/htmlrootassigneelast_run_timestampAE(옧persist_js_state·has_pluto_hook_features§cell_id$53863e96-0c11-484f-bfc9-23b52ca933dedepends_on_disabled_cells§runtime 1published_object_keysdepends_on_skipped_cells§errored$ccb63eb8-1da0-48ce-ae51-c18c48509445queued¤logsrunning¦outputbody;func_that_needs_parameters (generic function with 1 method)mimetext/plainrootassigneelast_run_timestampAE)?=persist_js_state·has_pluto_hook_features§cell_id$ccb63eb8-1da0-48ce-ae51-c18c48509445depends_on_disabled_cells§runtime published_object_keysdepends_on_skipped_cells§errored$0363149b-f34d-4120-81db-a655f18b908fqueued¤logsrunning¦outputbody<div class="markdown"><h2 id="Compiler-Optimizations">Compiler Optimizations</h2>
<p><strong>Q:</strong>  How does Julia go about auto-optimizing simple computation time sinks like loops, nested loop, functions called many times in a loop, etc.</p>
<p>Whole courses on optimizing compilers, but a few categories that come to mind:</p>
<ul>
<li><p>Compilation</p>
</li>
<li><p>Static type inference</p>
</li>
<li><p>Inlining small functions</p>
</li>
<li><p>Dead code elimination</p>
</li>
<li><p>Unrolling small loops</p>
</li>
<li><p>Grouping operations for SIMD</p>
</li>
<li><p>...</p>
</li>
</ul>
<p>Advanced optimizations that require additional help:</p>
<ul>
<li><p>Precompiliation of functiosn to be used</p>
</li>
<li><p>Empirical branch prediction </p>
</li>
</ul>
</div>mimetext/htmlrootassigneelast_run_timestampAE(ްpersist_js_state·has_pluto_hook_features§cell_id$0363149b-f34d-4120-81db-a655f18b908fdepends_on_disabled_cells§runtime zpublished_object_keysdepends_on_skipped_cells§errored$b8e117f5-b253-4208-a00e-7966978fb24bqueued¤logsrunning¦outputbody)my_model (generic function with 1 method)mimetext/plainrootassigneelast_run_timestampAE(02#persist_js_state·has_pluto_hook_features§cell_id$b8e117f5-b253-4208-a00e-7966978fb24bdepends_on_disabled_cells§runtime ~Ypublished_object_keysdepends_on_skipped_cells§errored$02002957-8644-40ca-99ef-86151769a5d9queued¤logslinemsg.  0.000002 seconds (2 allocations: 928 bytes)
text/plaincell_id$02002957-8644-40ca-99ef-86151769a5d9kwargsidPlutoRunner_d1acb81efileP/home/runner/.julia/packages/Pluto/CBqeh/src/runner/PlutoRunner/src/io/stdout.jlgroupstdoutlevelLogLevel(-555)running¦outputbodyprefixFloat64elements 0.12307text/plain1.01799text/plain-0.395052text/plain0.824969text/plain-1.0832text/plain0.139942text/plain-0.0393634text/plain0.848658text/plain	-0.178521text/plain
1.7617text/plain-1.15012text/plain3.27889text/plain1.39378text/plain-0.585879text/plain0.528007text/plain-1.61489text/plain-1.56609text/plain-0.807679text/plain1.06054text/plain-0.358974text/plainmore[-1.0875text/plain\-0.822131text/plain]-0.588678text/plain^-0.84641text/plain_0.67201text/plain`-0.625109text/plaina-1.20346text/plainb1.46734text/plainc0.516096text/plaind0.0442022text/plaintypeArrayprefix_shortobjectid5db5f700787a2e87mime!application/vnd.pluto.tree+objectrootassignee@time row_one_copiedlast_run_timestampAE)	persist_js_state·has_pluto_hook_features§cell_id$02002957-8644-40ca-99ef-86151769a5d9depends_on_disabled_cells§runtimew{published_object_keysdepends_on_skipped_cells§errored$12b8d696-0e7b-4814-9c73-22b7cf95fef4queued¤logsrunning¦outputbodyBenchmarkTools.Trial: 60 samples with 1 evaluation.
 Range [90m([39m[36m[1mmin[22m[39m … [35mmax[39m[90m):  [39m[36m[1m55.818 ms[22m[39m … [35m200.497 ms[39m  [90m┊[39m GC [90m([39mmin … max[90m): [39m 5.75% … 72.35%
 Time  [90m([39m[34m[1mmedian[22m[39m[90m):     [39m[34m[1m58.165 ms               [22m[39m[90m┊[39m GC [90m([39mmedian[90m):    [39m 6.37%
 Time  [90m([39m[32m[1mmean[22m[39m ± [32mσ[39m[90m):   [39m[32m[1m83.423 ms[22m[39m ± [32m 54.579 ms[39m  [90m┊[39m GC [90m([39mmean ± σ[90m):  [39m34.87% ± 25.82%

  [39m█[34m▃[39m[39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [32m [39m[39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m [39m 
  [39m█[34m█[39m[39m▁[39m▁[39m▁[39m▁[39m▁[39m▁[39m▁[39m▁[39m▁[39m▁[32m▁[39m[39m▁[39m▁[39m▁[39m▁[39m▁[39m▁[39m▁[39m▁[39m▁[39m▁[39m▁[39m▁[39m▁[39m▁[39m▁[39m▁[39m▁[39m▁[39m▁[39m▁[39m▁[39m▁[39m▁[39m▁[39m▁[39m▁[39m▁[39m▁[39m▁[39m▁[39m▁[39m▁[39m▁[39m▁[39m▁[39m▁[39m▁[39m▁[39m▁[39m▁[39m▁[39m▁[39m▁[39m▁[39m▁[39m▅[39m▄[39m [39m▁
  55.8 ms[90m         Histogram: frequency by time[39m          200 ms [0m[1m<[22m

 Memory estimate[90m: [39m[33m366.23 MiB[39m, allocs estimate[90m: [39m[33m18[39m.mimetext/plainrootassigneelast_run_timestampAE)
؊persist_js_state·has_pluto_hook_features§cell_id$12b8d696-0e7b-4814-9c73-22b7cf95fef4depends_on_disabled_cells§runtime   published_object_keysdepends_on_skipped_cells§errored$9bf47a21-af6d-4c76-84d1-0b78635bae9aqueued¤logsrunning¦outputbodyp<div class="markdown"><h2 id="New-Implementation,-same-interface">New Implementation, same interface</h2>
</div>mimetext/htmlrootassigneelast_run_timestampAE(persist_js_state·has_pluto_hook_features§cell_id$9bf47a21-af6d-4c76-84d1-0b78635bae9adepends_on_disabled_cells§runtime 꿵published_object_keysdepends_on_skipped_cells§errored$64d51527-1bd0-4010-b458-4dfa6f44610dqueued¤logsrunning¦outputbodyf<div class="markdown"><h3 id="Fusing-broadcasted-operations">Fusing broadcasted operations</h3>
</div>mimetext/htmlrootassigneelast_run_timestampAE(
Rpersist_js_state·has_pluto_hook_features§cell_id$64d51527-1bd0-4010-b458-4dfa6f44610ddepends_on_disabled_cells§runtime published_object_keysdepends_on_skipped_cells§errored±cell_dependencies $bf497b24-72a7-4a2f-908e-c24922a5f3c8precedence_heuristic	cell_id$bf497b24-72a7-4a2f-908e-c24922a5f3c8downstream_cells_mapmy_model_stable_specific$aa767f81-4bcb-41b6-b141-85796a81d8fb$cee02d24-1dcc-4c29-a322-0ddd12ab8180$20db6ae9-8c79-44d1-a3a7-0dadf1d0dc5aupstream_cells_map<>islessFloat64*$bdf99bf8-bb88-40d7-a8ec-84a99ab65ff3precedence_heuristic	cell_id$bdf99bf8-bb88-40d7-a8ec-84a99ab65ff3downstream_cells_mapupstream_cells_mapobs$9303806b-a460-4ec2-9f71-252f43b34328InteractiveUtilsInteractiveUtils.code_warntypefunc_with_barriers$05d2780e-612c-4e86-93c4-f57734f49c74@code_warntypeparam_true$9303806b-a460-4ec2-9f71-252f43b34328$9d71d1b0-765d-48d7-a939-c951fc8caa67precedence_heuristic	cell_id$9d71d1b0-765d-48d7-a939-c951fc8caa67downstream_cells_mapupstream_cells_map@md_strgetindex$8a97f0bf-3ada-4503-98a5-7bdeca15edc4precedence_heuristic	cell_id$8a97f0bf-3ada-4503-98a5-7bdeca15edc4downstream_cells_mapbig_matrix$02002957-8644-40ca-99ef-86151769a5d9$426ccd5e-398b-4df7-a27d-cf7a578c658f$18813a15-531f-4d74-a0f7-45a0574d6c1b$59fbb599-c947-4a2a-a678-8e38a666660cupstream_cells_maprandn$f9d3d93f-f1c4-4b3b-aa8a-097f2c8aaf68precedence_heuristic	cell_id$f9d3d93f-f1c4-4b3b-aa8a-097f2c8aaf68downstream_cells_mapupstream_cells_map@md_strgetindex$3738748d-7b3d-4015-bf71-0ffb9e28c43dprecedence_heuristic	cell_id$3738748d-7b3d-4015-bf71-0ffb9e28c43ddownstream_cells_mapupstream_cells_map@md_strgetindex$ac9b4f35-36fc-425b-a0a2-83fc32c62c7cprecedence_heuristic	cell_id$ac9b4f35-36fc-425b-a0a2-83fc32c62c7cdownstream_cells_mapupstream_cells_map@md_strgetindex$f13e442e-771f-4aab-b5f3-f08c4e72229cprecedence_heuristic	cell_id$f13e442e-771f-4aab-b5f3-f08c4e72229cdownstream_cells_mapupstream_cells_map@md_strgetindex$7b66fbe6-5f42-4619-a265-8d284d3dac8cprecedence_heuristic	cell_id$7b66fbe6-5f42-4619-a265-8d284d3dac8cdownstream_cells_mapupstream_cells_mapCoord$94223079-afab-4a6d-a126-068a4e94f52esqrt^+$cf5262da-1043-11ec-12fc-9916cc70070cprecedence_heuristic	cell_id$cf5262da-1043-11ec-12fc-9916cc70070cdownstream_cells_mapupstream_cells_map@md_strgetindex$2e32935f-c82f-434b-b0f5-01a4b15ddb80precedence_heuristic	cell_id$2e32935f-c82f-434b-b0f5-01a4b15ddb80downstream_cells_mapupstream_cells_map@md_strgetindex$46d264b6-73da-4790-92e4-988728c7e1dfprecedence_heuristic	cell_id$46d264b6-73da-4790-92e4-988728c7e1dfdownstream_cells_mapupstream_cells_map@md_strgetindex$3d06ed43-23c2-4c57-a1a5-e699713b9506precedence_heuristic	cell_id$3d06ed43-23c2-4c57-a1a5-e699713b9506downstream_cells_mapupstream_cells_map@md_strblockquotegetindex$248c85d4-bcac-40a4-9052-1f72a62422edprecedence_heuristic	cell_id$248c85d4-bcac-40a4-9052-1f72a62422eddownstream_cells_mapAbstractCoord$a1992b28-16ab-456b-995d-1e40e423d70c$6985f2d5-6c71-4289-b655-ec06754f85c4$0913de40-9fa0-44db-9b2c-9bd93db31790$e7227a20-3d2d-4907-b9a6-422c0d4ab57a$d0429b82-7e78-4a18-97bb-e34ba370e024$e04666f8-801b-4973-9b9e-807abc5199b7upstream_cells_map$55af3d38-8956-4a22-8ca6-dbbb7de1b426precedence_heuristic	cell_id$55af3d38-8956-4a22-8ca6-dbbb7de1b426downstream_cells_mapupstream_cells_map^/πintegrate_f$404c0658-ae86-457a-adc3-4ef69bb43ac8sin$c8a7838a-8f1a-4f33-a9de-48e60992d08bprecedence_heuristic	cell_id$c8a7838a-8f1a-4f33-a9de-48e60992d08bdownstream_cells_mapvec_c1vec_c2upstream_cells_mapc2$c16a95ce-2926-4d99-a907-71c95f32c042c1$c16a95ce-2926-4d99-a907-71c95f32c042BenchmarkTools.Parameters,BenchmarkTools.generate_benchmark_definitionBenchmarkTools$624e8936-de28-4e09-9a4e-3ef2f6c7d9b0#___this_pluto_module_name##vec_c2#267##vec_c1#266distance$0913de40-9fa0-44db-9b2c-9bd93db31790$e7227a20-3d2d-4907-b9a6-422c0d4ab57a$e04666f8-801b-4973-9b9e-807abc5199b7@benchmarkfilln$d0429b82-7e78-4a18-97bb-e34ba370e024$fa1f963d-d674-442f-aa32-fcee86a8c058precedence_heuristic	cell_id$fa1f963d-d674-442f-aa32-fcee86a8c058downstream_cells_mapupstream_cells_map@md_strgetindex$6985f2d5-6c71-4289-b655-ec06754f85c4precedence_heuristic	cell_id$6985f2d5-6c71-4289-b655-ec06754f85c4downstream_cells_mapPolarCoord$1b548d59-f18e-4cfc-9667-472c427d7cc2$953d09b8-d8d0-4e49-ae55-648f956aa248upstream_cells_mapAbstractCoord$248c85d4-bcac-40a4-9052-1f72a62422edFloat64$c949701e-3399-44d8-9041-4dcb99c78cdaprecedence_heuristic	cell_id$c949701e-3399-44d8-9041-4dcb99c78cdadownstream_cells_mapupstream_cells_map@md_strblockquotegetindex$ae709a34-9244-44ee-a004-381fc9b6cd0cprecedence_heuristic	cell_id$ae709a34-9244-44ee-a004-381fc9b6cd0cdownstream_cells_maptoc_aside$e7d4bc52-ee18-4d0b-8bab-591b688398feupstream_cells_mapCore@md_strBasePlutoRunner.create_bondPlutoRunnerCheckBoxCore.applicable@bindBase.getgetindex$ba8781e6-5c7e-4aaf-8ccd-da3fc6210ec5precedence_heuristic	cell_id$ba8781e6-5c7e-4aaf-8ccd-da3fc6210ec5downstream_cells_mapupstream_cells_map:func_takes_varargs$f5fe37e1-80b9-4853-84d6-82e56417a470$24a2ae54-a11d-42da-980c-1f4c78daf4b4precedence_heuristic	cell_id$24a2ae54-a11d-42da-980c-1f4c78daf4b4downstream_cells_mapupstream_cells_mapCoord$94223079-afab-4a6d-a126-068a4e94f52ex$9e8cb539-5d69-4552-87e4-88fe61ab1fbe$1fd8655d-8065-4945-acef-7774ed882d51$1b548d59-f18e-4cfc-9667-472c427d7cc2r$9e8cb539-5d69-4552-87e4-88fe61ab1fbe$1fd8655d-8065-4945-acef-7774ed882d51$1b548d59-f18e-4cfc-9667-472c427d7cc2y$9e8cb539-5d69-4552-87e4-88fe61ab1fbe$1fd8655d-8065-4945-acef-7774ed882d51$1b548d59-f18e-4cfc-9667-472c427d7cc2$3ac9ad42-7bf1-4b36-9e0b-53f3f60796b1precedence_heuristic	cell_id$3ac9ad42-7bf1-4b36-9e0b-53f3f60796b1downstream_cells_mapupstream_cells_map@md_strgetindex$c1628685-c357-436f-83dd-bf19bde24964precedence_heuristic	cell_id$c1628685-c357-436f-83dd-bf19bde24964downstream_cells_mapupstream_cells_map@md_strgetindex$d35aa76c-b4e6-45f8-a4e3-ba37d674db82precedence_heuristic	cell_id$d35aa76c-b4e6-45f8-a4e3-ba37d674db82downstream_cells_mapupstream_cells_map@md_strgetindex$fa116847-4bac-41e6-bd6e-e01c5c7234aeprecedence_heuristic	cell_id$fa116847-4bac-41e6-bd6e-e01c5c7234aedownstream_cells_mapupstream_cells_map@md_strRobustLocalResourcegetindex$96998f54-9f66-48fe-b808-559276667054precedence_heuristic	cell_id$96998f54-9f66-48fe-b808-559276667054downstream_cells_mapf_fused_explicitly$781ef824-a235-46ce-accd-362f2e963550upstream_cells_map^+*$f79de8d4-537e-421f-a66d-41bc79f8f12fprecedence_heuristic	cell_id$f79de8d4-537e-421f-a66d-41bc79f8f12fdownstream_cells_mapupstream_cells_map@md_strgetindex$11c29d50-1975-48cc-b1c5-dd3814128e86precedence_heuristic	cell_id$11c29d50-1975-48cc-b1c5-dd3814128e86downstream_cells_mapf$12b8d696-0e7b-4814-9c73-22b7cf95fef4upstream_cells_map^+*$05d2780e-612c-4e86-93c4-f57734f49c74precedence_heuristic	cell_id$05d2780e-612c-4e86-93c4-f57734f49c74downstream_cells_mapfunc_with_barriers$bdf99bf8-bb88-40d7-a8ec-84a99ab65ff3$3ef73948-da0c-4afa-8a73-29c382b29bbdupstream_cells_map<Int64floorisless*calc_χ²$783e926f-91a2-4ded-a21b-ae27fa3bc4d8$9122bdf0-c0b9-4966-8933-00a40562393aprecedence_heuristic	cell_id$9122bdf0-c0b9-4966-8933-00a40562393adownstream_cells_mapupstream_cells_map@md_strgetindex$1cf69f4d-04db-4c3a-897a-a1da9e46b88cprecedence_heuristic	cell_id$1cf69f4d-04db-4c3a-897a-a1da9e46b88cdownstream_cells_mapupstream_cells_map@md_strblockquotegetindex$db388c8a-ddb3-47a6-8ce0-586d9f9602b9precedence_heuristic	cell_id$db388c8a-ddb3-47a6-8ce0-586d9f9602b9downstream_cells_mapupstream_cells_mapobs$9303806b-a460-4ec2-9f71-252f43b34328BenchmarkTools.Parameters@benchmark,BenchmarkTools.generate_benchmark_definitionfunc_with_type_instability$fad14e46-21a4-41ea-8f3d-a747cdfe3a51BenchmarkTools$624e8936-de28-4e09-9a4e-3ef2f6c7d9b0#___this_pluto_module_name##param_true#278##obs#277param_true$9303806b-a460-4ec2-9f71-252f43b34328$624e8936-de28-4e09-9a4e-3ef2f6c7d9b0precedence_heuristiccell_id$624e8936-de28-4e09-9a4e-3ef2f6c7d9b0downstream_cells_mapStaticArraysForwardDiffPlutoUIPlutoTestBenchmarkTools$d0429b82-7e78-4a18-97bb-e34ba370e024$c8a7838a-8f1a-4f33-a9de-48e60992d08b$db388c8a-ddb3-47a6-8ce0-586d9f9602b9$e80e73cc-fb81-4222-8fcd-a9c4aaf6326e$dfe5dcd7-9b62-4690-ac21-0930b3e4145c$04391eb3-daf0-4f20-b39e-33e626770e05$170f2bd0-bb5b-4e78-b92b-dfa8d47aded0$3ef73948-da0c-4afa-8a73-29c382b29bbd$12b8d696-0e7b-4814-9c73-22b7cf95fef4$781ef824-a235-46ce-accd-362f2e963550$282d2a07-5f63-4f3e-960e-b5ffcab6b9de$957519f4-a669-472a-bc81-ecd0dcce9842$b1557899-91c0-4f02-b486-e3c4f38d9218$8f846ea8-9c6e-499b-bfd8-18bdbbd110f7PlutoTeachingToolsupstream_cells_map$dfe5dcd7-9b62-4690-ac21-0930b3e4145cprecedence_heuristic	cell_id$dfe5dcd7-9b62-4690-ac21-0930b3e4145cdownstream_cells_mapupstream_cells_mapobs$9303806b-a460-4ec2-9f71-252f43b34328BenchmarkTools.Parameters func_without_type_instability_v2$20db6ae9-8c79-44d1-a3a7-0dadf1d0dc5a@benchmark,BenchmarkTools.generate_benchmark_definition##obs#245BenchmarkTools$624e8936-de28-4e09-9a4e-3ef2f6c7d9b0#___this_pluto_module_nameparam_true$9303806b-a460-4ec2-9f71-252f43b34328$208bf525-447d-4726-b67c-c3b968b415b8precedence_heuristic	cell_id$208bf525-447d-4726-b67c-c3b968b415b8downstream_cells_mapupstream_cells_map@md_strgetindex$c92d49d3-e8fc-4288-9ce2-3e617fc5c306precedence_heuristic	cell_id$c92d49d3-e8fc-4288-9ce2-3e617fc5c306downstream_cells_mapupstream_cells_mapc1$c16a95ce-2926-4d99-a907-71c95f32c042distance$0913de40-9fa0-44db-9b2c-9bd93db31790$e7227a20-3d2d-4907-b9a6-422c0d4ab57a$e04666f8-801b-4973-9b9e-807abc5199b7p1$953d09b8-d8d0-4e49-ae55-648f956aa248$aa767f81-4bcb-41b6-b141-85796a81d8fbprecedence_heuristic	cell_id$aa767f81-4bcb-41b6-b141-85796a81d8fbdownstream_cells_mapupstream_cells_map@test_brokenTestTest.rethrowTest.Returnedparam_true$9303806b-a460-4ec2-9f71-252f43b34328my_model_stable_specific$bf497b24-72a7-4a2f-908e-c24922a5f3c8Test.Base.current_exceptionsTest.isaTest.do_broken_testobs$9303806b-a460-4ec2-9f71-252f43b34328Test.Threw$b2ac3b2c-31c7-4e64-9009-47ac03e38afbprecedence_heuristic	cell_id$b2ac3b2c-31c7-4e64-9009-47ac03e38afbdownstream_cells_mapupstream_cells_map@md_strgetindex$495b281e-f4c9-4f55-bf5a-9a8d7f43044cprecedence_heuristic	cell_id$495b281e-f4c9-4f55-bf5a-9a8d7f43044cdownstream_cells_mapupstream_cells_map@md_strgetindex$be38f44f-9ce4-433a-84ef-782e5d8a4822precedence_heuristic	cell_id$be38f44f-9ce4-433a-84ef-782e5d8a4822downstream_cells_mapupstream_cells_mapc1$c16a95ce-2926-4d99-a907-71c95f32c042distance$0913de40-9fa0-44db-9b2c-9bd93db31790$e7227a20-3d2d-4907-b9a6-422c0d4ab57a$e04666f8-801b-4973-9b9e-807abc5199b7$11e60eb5-980d-4d3d-8f09-03390584aaadprecedence_heuristic	cell_id$11e60eb5-980d-4d3d-8f09-03390584aaaddownstream_cells_mapf_fused_with_macro$282d2a07-5f63-4f3e-960e-b5ffcab6b9deupstream_cells_map^@__dot__+*$957519f4-a669-472a-bc81-ecd0dcce9842precedence_heuristic	cell_id$957519f4-a669-472a-bc81-ecd0dcce9842downstream_cells_mapupstream_cells_mapBenchmarkTools.Parameters@benchmark,BenchmarkTools.generate_benchmark_definition##y#270*BenchmarkTools$624e8936-de28-4e09-9a4e-3ef2f6c7d9b0##x#269#___this_pluto_module_namerand$1b548d59-f18e-4cfc-9667-472c427d7cc2precedence_heuristic	cell_id$1b548d59-f18e-4cfc-9667-472c427d7cc2downstream_cells_maptheta$953d09b8-d8d0-4e49-ae55-648f956aa248x$24a2ae54-a11d-42da-980c-1f4c78daf4b4$0913de40-9fa0-44db-9b2c-9bd93db31790$e7227a20-3d2d-4907-b9a6-422c0d4ab57a$e04666f8-801b-4973-9b9e-807abc5199b7r$24a2ae54-a11d-42da-980c-1f4c78daf4b4$953d09b8-d8d0-4e49-ae55-648f956aa248y$24a2ae54-a11d-42da-980c-1f4c78daf4b4$0913de40-9fa0-44db-9b2c-9bd93db31790$e7227a20-3d2d-4907-b9a6-422c0d4ab57a$e04666f8-801b-4973-9b9e-807abc5199b7upstream_cells_mapatansqrt^+*CartesianCoord$a1992b28-16ab-456b-995d-1e40e423d70ccossinPolarCoord$6985f2d5-6c71-4289-b655-ec06754f85c4$cee02d24-1dcc-4c29-a322-0ddd12ab8180precedence_heuristic	cell_id$cee02d24-1dcc-4c29-a322-0ddd12ab8180downstream_cells_mapupstream_cells_map Test.printTest.rethrowTestTest.tempnameconvertFloat64@test_nowarnTest.eval_testmy_model_stable_specific$bf497b24-72a7-4a2f-908e-c24922a5f3c8param_true$9303806b-a460-4ec2-9f71-252f43b34328Test.Base.current_exceptionsTest.isaobs$9303806b-a460-4ec2-9f71-252f43b34328Test.recordTest.rmTest.readTest.ThrewTest.ExprTest.get_testsetTest.openTest.BrokenTest.redirect_stderr$e1ec523b-3c2f-447d-8b71-063dc5955f45precedence_heuristic	cell_id$e1ec523b-3c2f-447d-8b71-063dc5955f45downstream_cells_mapupstream_cells_map@md_strgetindex$279df4ae-a0e2-4838-8a9c-3ff82245935eprecedence_heuristic	cell_id$279df4ae-a0e2-4838-8a9c-3ff82245935edownstream_cells_mapupstream_cells_map@md_strgetindex$9ec9429d-c1f1-4845-a514-9c88b452071fprecedence_heuristic	cell_id$9ec9429d-c1f1-4845-a514-9c88b452071fdownstream_cells_mapupstream_cells_mapWidthOverDocs$f3937141-49f4-49f2-8bcf-0f4e9c204d24precedence_heuristic	cell_id$f3937141-49f4-49f2-8bcf-0f4e9c204d24downstream_cells_mapupstream_cells_mapobs$9303806b-a460-4ec2-9f71-252f43b34328InteractiveUtilsfunc_with_type_instability$fad14e46-21a4-41ea-8f3d-a747cdfe3a51InteractiveUtils.code_warntype@code_warntypeparam_true$9303806b-a460-4ec2-9f71-252f43b34328$047835eb-6bcc-4f32-b991-5ccccbf34cb9precedence_heuristic	cell_id$047835eb-6bcc-4f32-b991-5ccccbf34cb9downstream_cells_maparray_of_realsupstream_cells_mapReal$e1996c2f-5298-48c9-a29c-852bd37b54c4precedence_heuristic	cell_id$e1996c2f-5298-48c9-a29c-852bd37b54c4downstream_cells_mapbigvector$12b8d696-0e7b-4814-9c73-22b7cf95fef4$781ef824-a235-46ce-accd-362f2e963550$282d2a07-5f63-4f3e-960e-b5ffcab6b9deupstream_cells_map^*rand$59fbb599-c947-4a2a-a678-8e38a666660cprecedence_heuristic	cell_id$59fbb599-c947-4a2a-a678-8e38a666660cdownstream_cells_mapcol_one_viewupstream_cells_map @timeBase.cumulative_compile_timing:Base.*Base.gc_alloc_countBase.-Base.gc_numviewBase.cumulative_compile_time_nsBase.GC_DiffBaseBase.time_printBase.time_nsBase.Threads.lock_profilingBase./big_matrix$8a97f0bf-3ada-4503-98a5-7bdeca15edc4$e80e73cc-fb81-4222-8fcd-a9c4aaf6326eprecedence_heuristic	cell_id$e80e73cc-fb81-4222-8fcd-a9c4aaf6326edownstream_cells_mapupstream_cells_map##param_true#255obs$9303806b-a460-4ec2-9f71-252f43b34328BenchmarkTools.Parameters@benchmark,BenchmarkTools.generate_benchmark_definitionBenchmarkTools$624e8936-de28-4e09-9a4e-3ef2f6c7d9b0#___this_pluto_module_name##obs#254param_true$9303806b-a460-4ec2-9f71-252f43b34328func_without_type_instability$d5cb70a8-079b-4fd5-851f-8742680ff515$8f4b3c77-e79f-457a-b9e9-9f30dd1f526aprecedence_heuristic	cell_id$8f4b3c77-e79f-457a-b9e9-9f30dd1f526adownstream_cells_mapupstream_cells_map@md_strgetindex$79783bcb-fe34-4c9d-af08-7a82c851beecprecedence_heuristic	cell_id$79783bcb-fe34-4c9d-af08-7a82c851beecdownstream_cells_mapupstream_cells_map@md_strgetindex$18813a15-531f-4d74-a0f7-45a0574d6c1bprecedence_heuristic	cell_id$18813a15-531f-4d74-a0f7-45a0574d6c1bdownstream_cells_mapcol_one_copiedupstream_cells_map@timeBase.cumulative_compile_timing:Base.*Base.gc_alloc_countBase.-Base.gc_numBase.cumulative_compile_time_nsBase.GC_DiffBaseBase.time_printBase.time_nsBase.Threads.lock_profilingBase./big_matrix$8a97f0bf-3ada-4503-98a5-7bdeca15edc4$d58ee47e-10df-4d8c-aad3-ae755a5024e4precedence_heuristic	cell_id$d58ee47e-10df-4d8c-aad3-ae755a5024e4downstream_cells_mapupstream_cells_map$b243656e-2eec-4650-adbe-5ca8a712d5d6precedence_heuristic	cell_id$b243656e-2eec-4650-adbe-5ca8a712d5d6downstream_cells_mapupstream_cells_map@md_strblockquotegetindex$bd011001-07cb-4f74-9c69-8f91945e2cbfprecedence_heuristic	cell_id$bd011001-07cb-4f74-9c69-8f91945e2cbfdownstream_cells_mapupstream_cells_map@md_strblockquotegetindex$77e28f2e-d53a-4dd7-938e-5d95bac81db1precedence_heuristic	cell_id$77e28f2e-d53a-4dd7-938e-5d95bac81db1downstream_cells_maparray_of_float64supstream_cells_map$64fc3013-09e3-4f95-a3f4-20138125e71bprecedence_heuristic	cell_id$64fc3013-09e3-4f95-a3f4-20138125e71bdownstream_cells_mapupstream_cells_map@md_strgetindex$b7c23b8b-aaca-41b0-8397-ad2300eeda50precedence_heuristic	cell_id$b7c23b8b-aaca-41b0-8397-ad2300eeda50downstream_cells_mapupstream_cells_map@md_strgetindex$fd3c57f9-1f47-4e3e-91ee-b05911f992eeprecedence_heuristic	cell_id$fd3c57f9-1f47-4e3e-91ee-b05911f992eedownstream_cells_mapupstream_cells_map@md_strblockquotegetindex$31debff2-3667-4631-bff5-e95cf107ae9aprecedence_heuristic	cell_id$31debff2-3667-4631-bff5-e95cf107ae9adownstream_cells_maparray_of_anysupstream_cells_map$783e926f-91a2-4ded-a21b-ae27fa3bc4d8precedence_heuristic	cell_id$783e926f-91a2-4ded-a21b-ae27fa3bc4d8downstream_cells_mapcalc_χ²$fad14e46-21a4-41ea-8f3d-a747cdfe3a51$d5cb70a8-079b-4fd5-851f-8742680ff515$20db6ae9-8c79-44d1-a3a7-0dadf1d0dc5a$0f679916-5f87-45a3-996f-be3146a537a2$05d2780e-612c-4e86-93c4-f57734f49c74upstream_cells_map zero@assertislesspromote_type@inboundsnothinglength<Base.simd_index@simd^eltype==Base.AssertionError:Base.throwAbstractVectorjulia.simdloopBaseBase.simd_outer_range-Base.simd_inner_length+$d6147ce2-b3ec-45f0-ba90-2c453a719548precedence_heuristic	cell_id$d6147ce2-b3ec-45f0-ba90-2c453a719548downstream_cells_mapupstream_cells_map@md_strgetindex$1969217c-24be-47e2-9853-b70cf4d5565dprecedence_heuristic	cell_id$1969217c-24be-47e2-9853-b70cf4d5565ddownstream_cells_mapupstream_cells_map@md_strgetindex$20db6ae9-8c79-44d1-a3a7-0dadf1d0dc5aprecedence_heuristic	cell_id$20db6ae9-8c79-44d1-a3a7-0dadf1d0dc5adownstream_cells_map func_without_type_instability_v2$dfe5dcd7-9b62-4690-ac21-0930b3e4145cupstream_cells_mapconvertFloat64my_model_stable_specific$bf497b24-72a7-4a2f-908e-c24922a5f3c8calc_χ²$783e926f-91a2-4ded-a21b-ae27fa3bc4d8$d0429b82-7e78-4a18-97bb-e34ba370e024precedence_heuristic	cell_id$d0429b82-7e78-4a18-97bb-e34ba370e024downstream_cells_mapvec_abs_c1vec_abs_c2n$c8a7838a-8f1a-4f33-a9de-48e60992d08bupstream_cells_mapc2$c16a95ce-2926-4d99-a907-71c95f32c042c1$c16a95ce-2926-4d99-a907-71c95f32c042:BenchmarkTools.Parameters,BenchmarkTools.generate_benchmark_definition##vec_abs_c2#250BenchmarkTools$624e8936-de28-4e09-9a4e-3ef2f6c7d9b0#___this_pluto_module_name##vec_abs_c1#249VectorAbstractCoord$248c85d4-bcac-40a4-9052-1f72a62422eddistance$0913de40-9fa0-44db-9b2c-9bd93db31790$e7227a20-3d2d-4907-b9a6-422c0d4ab57a$e04666f8-801b-4973-9b9e-807abc5199b7@benchmarkundef$94223079-afab-4a6d-a126-068a4e94f52eprecedence_heuristic	cell_id$94223079-afab-4a6d-a126-068a4e94f52edownstream_cells_mapCoord$7b66fbe6-5f42-4619-a265-8d284d3dac8c$9e8cb539-5d69-4552-87e4-88fe61ab1fbe$24a2ae54-a11d-42da-980c-1f4c78daf4b4upstream_cells_mapFloat64$d3d085e6-67b5-4286-b66d-120720e1002dprecedence_heuristic	cell_id$d3d085e6-67b5-4286-b66d-120720e1002ddownstream_cells_mapupstream_cells_map@md_strgetindex$e7227a20-3d2d-4907-b9a6-422c0d4ab57aprecedence_heuristic	cell_id$e7227a20-3d2d-4907-b9a6-422c0d4ab57adownstream_cells_mapdistance$c16a95ce-2926-4d99-a907-71c95f32c042$953d09b8-d8d0-4e49-ae55-648f956aa248$7e466eb6-9b5f-4e9f-90e2-be11fb66d557$be38f44f-9ce4-433a-84ef-782e5d8a4822$4b7b8ef8-e7c4-415b-a103-e109256e0210$c92d49d3-e8fc-4288-9ce2-3e617fc5c306$d0429b82-7e78-4a18-97bb-e34ba370e024$c8a7838a-8f1a-4f33-a9de-48e60992d08bupstream_cells_mapAbstractCoord$248c85d4-bcac-40a4-9052-1f72a62422ed-sqrt^x$9e8cb539-5d69-4552-87e4-88fe61ab1fbe$1fd8655d-8065-4945-acef-7774ed882d51$1b548d59-f18e-4cfc-9667-472c427d7cc2+Arrayy$9e8cb539-5d69-4552-87e4-88fe61ab1fbe$1fd8655d-8065-4945-acef-7774ed882d51$1b548d59-f18e-4cfc-9667-472c427d7cc2$348ee204-546f-46c5-bf5d-7d4a761002ecprecedence_heuristic	cell_id$348ee204-546f-46c5-bf5d-7d4a761002ecdownstream_cells_mapupstream_cells_map@md_strgetindex$170f2bd0-bb5b-4e78-b92b-dfa8d47aded0precedence_heuristic	cell_id$170f2bd0-bb5b-4e78-b92b-dfa8d47aded0downstream_cells_mapupstream_cells_mapobs$9303806b-a460-4ec2-9f71-252f43b34328BenchmarkTools.Parameters##param_true#275@benchmark,BenchmarkTools.generate_benchmark_definitionfunc_without_barriers$08d25c7e-907b-403d-b08d-27ca4efcd958BenchmarkTools$624e8936-de28-4e09-9a4e-3ef2f6c7d9b0##obs#274#___this_pluto_module_nameparam_true$9303806b-a460-4ec2-9f71-252f43b34328$a9cf77ec-434e-4477-a844-9f8b9199589fprecedence_heuristic	cell_id$a9cf77ec-434e-4477-a844-9f8b9199589fdownstream_cells_maparray_of_float_or_missingupstream_cells_mapmissing$781ef824-a235-46ce-accd-362f2e963550precedence_heuristic	cell_id$781ef824-a235-46ce-accd-362f2e963550downstream_cells_mapupstream_cells_mapBenchmarkTools.Parameters@benchmark,BenchmarkTools.generate_benchmark_definitionf_fused_explicitly$96998f54-9f66-48fe-b808-559276667054bigvector$e1996c2f-5298-48c9-a29c-852bd37b54c4#___this_pluto_module_nameBenchmarkTools$624e8936-de28-4e09-9a4e-3ef2f6c7d9b0##bigvector#247$46cd3a5f-3358-4f21-91c7-82c544bc4353precedence_heuristic	cell_id$46cd3a5f-3358-4f21-91c7-82c544bc4353downstream_cells_mapupstream_cells_map@md_strgetindex$73b01b03-2016-4253-8f95-e0bdb3bca5f4precedence_heuristic	cell_id$73b01b03-2016-4253-8f95-e0bdb3bca5f4downstream_cells_mapupstream_cells_map@md_strgetindex$5c5f9760-695f-4fa2-b4a6-8a878ab97ea6precedence_heuristic	cell_id$5c5f9760-695f-4fa2-b4a6-8a878ab97ea6downstream_cells_mapupstream_cells_map@md_strgetindex$e04666f8-801b-4973-9b9e-807abc5199b7precedence_heuristic	cell_id$e04666f8-801b-4973-9b9e-807abc5199b7downstream_cells_mapdistance$c16a95ce-2926-4d99-a907-71c95f32c042$953d09b8-d8d0-4e49-ae55-648f956aa248$7e466eb6-9b5f-4e9f-90e2-be11fb66d557$be38f44f-9ce4-433a-84ef-782e5d8a4822$4b7b8ef8-e7c4-415b-a103-e109256e0210$c92d49d3-e8fc-4288-9ce2-3e617fc5c306$d0429b82-7e78-4a18-97bb-e34ba370e024$c8a7838a-8f1a-4f33-a9de-48e60992d08bupstream_cells_mapAbstractCoord$248c85d4-bcac-40a4-9052-1f72a62422ed-sqrt^x$9e8cb539-5d69-4552-87e4-88fe61ab1fbe$1fd8655d-8065-4945-acef-7774ed882d51$1b548d59-f18e-4cfc-9667-472c427d7cc2+Arrayy$9e8cb539-5d69-4552-87e4-88fe61ab1fbe$1fd8655d-8065-4945-acef-7774ed882d51$1b548d59-f18e-4cfc-9667-472c427d7cc2$08d25c7e-907b-403d-b08d-27ca4efcd958precedence_heuristic	cell_id$08d25c7e-907b-403d-b08d-27ca4efcd958downstream_cells_mapfunc_without_barriers$9303806b-a460-4ec2-9f71-252f43b34328$fbd538a3-8ddc-4c3f-9748-35fa7b032809$170f2bd0-bb5b-4e78-b92b-dfa8d47aded0upstream_cells_map zero:islesspromote_typejulia.simdloop@inboundsnothinglength<Base.simd_outer_rangeInt64-Base.simd_inner_length@simd^Base+*eltypefloorBase.simd_index$d2e1b3c3-3a81-44cd-a57b-fd9c29badce4precedence_heuristic	cell_id$d2e1b3c3-3a81-44cd-a57b-fd9c29badce4downstream_cells_mapupstream_cells_map@md_strgetindex$dc23159c-95ca-466d-9cbe-23bb0448d134precedence_heuristic	cell_id$dc23159c-95ca-466d-9cbe-23bb0448d134downstream_cells_mapupstream_cells_map@md_strgetindex$404c0658-ae86-457a-adc3-4ef69bb43ac8precedence_heuristic	cell_id$404c0658-ae86-457a-adc3-4ef69bb43ac8downstream_cells_mapintegrate_f$55af3d38-8956-4a22-8ca6-dbbb7de1b426$9ab94eea-4d57-4ef2-a73a-64e7c8b89222upstream_cells_mapFunctionsum-range/*IntegerReal$3bf761b6-132b-43fa-aa41-b2e73ddce94bprecedence_heuristic	cell_id$3bf761b6-132b-43fa-aa41-b2e73ddce94bdownstream_cells_mapupstream_cells_map@md_strgetindex$b7fbdc93-4c8b-4222-98e3-62fa7e726e2fprecedence_heuristic	cell_id$b7fbdc93-4c8b-4222-98e3-62fa7e726e2fdownstream_cells_mapupstream_cells_map@md_strgetindex$febc6f64-0d39-4206-8475-e6324973284fprecedence_heuristic	cell_id$febc6f64-0d39-4206-8475-e6324973284fdownstream_cells_mapupstream_cells_map@md_strgetindex$b556927c-ab72-41c5-9a3e-83756e40550aprecedence_heuristic	cell_id$b556927c-ab72-41c5-9a3e-83756e40550adownstream_cells_mapupstream_cells_map@md_strblockquotegetindex$9e8cb539-5d69-4552-87e4-88fe61ab1fbeprecedence_heuristic	cell_id$9e8cb539-5d69-4552-87e4-88fe61ab1fbedownstream_cells_maptheta$953d09b8-d8d0-4e49-ae55-648f956aa248x$24a2ae54-a11d-42da-980c-1f4c78daf4b4$0913de40-9fa0-44db-9b2c-9bd93db31790$e7227a20-3d2d-4907-b9a6-422c0d4ab57a$e04666f8-801b-4973-9b9e-807abc5199b7r$24a2ae54-a11d-42da-980c-1f4c78daf4b4$953d09b8-d8d0-4e49-ae55-648f956aa248y$24a2ae54-a11d-42da-980c-1f4c78daf4b4$0913de40-9fa0-44db-9b2c-9bd93db31790$e7227a20-3d2d-4907-b9a6-422c0d4ab57a$e04666f8-801b-4973-9b9e-807abc5199b7upstream_cells_mapatanCoord$94223079-afab-4a6d-a126-068a4e94f52esqrt^+$fbd538a3-8ddc-4c3f-9748-35fa7b032809precedence_heuristic	cell_id$fbd538a3-8ddc-4c3f-9748-35fa7b032809downstream_cells_mapupstream_cells_mapobs$9303806b-a460-4ec2-9f71-252f43b34328InteractiveUtilsInteractiveUtils.code_warntypefunc_without_barriers$08d25c7e-907b-403d-b08d-27ca4efcd958@code_warntypeparam_true$9303806b-a460-4ec2-9f71-252f43b34328$0f679916-5f87-45a3-996f-be3146a537a2precedence_heuristic	cell_id$0f679916-5f87-45a3-996f-be3146a537a2downstream_cells_map func_without_type_instability_v3$04391eb3-daf0-4f20-b39e-33e626770e05upstream_cells_mapmy_model_stable$82883c5d-db3d-4293-bf74-a6e36552a125calc_χ²$783e926f-91a2-4ded-a21b-ae27fa3bc4d8$252f394f-9d7d-41be-8cbf-ccb5558b83d1precedence_heuristic	cell_id$252f394f-9d7d-41be-8cbf-ccb5558b83d1downstream_cells_mapupstream_cells_map@md_strgetindex$7e466eb6-9b5f-4e9f-90e2-be11fb66d557precedence_heuristic	cell_id$7e466eb6-9b5f-4e9f-90e2-be11fb66d557downstream_cells_mapupstream_cells_mapc1$c16a95ce-2926-4d99-a907-71c95f32c042distance$0913de40-9fa0-44db-9b2c-9bd93db31790$e7227a20-3d2d-4907-b9a6-422c0d4ab57a$e04666f8-801b-4973-9b9e-807abc5199b7p2$953d09b8-d8d0-4e49-ae55-648f956aa248$288d3aaf-ee71-44f5-aefb-4b7b787c7caaprecedence_heuristic	cell_id$288d3aaf-ee71-44f5-aefb-4b7b787c7caadownstream_cells_mapupstream_cells_map@md_strblockquotegetindex$8446120e-5bac-4b8e-bc86-836f773f79a0precedence_heuristic	cell_id$8446120e-5bac-4b8e-bc86-836f773f79a0downstream_cells_mapupstream_cells_mapatanrand$c16a95ce-2926-4d99-a907-71c95f32c042precedence_heuristic	cell_id$c16a95ce-2926-4d99-a907-71c95f32c042downstream_cells_mapc2$953d09b8-d8d0-4e49-ae55-648f956aa248$d0429b82-7e78-4a18-97bb-e34ba370e024$c8a7838a-8f1a-4f33-a9de-48e60992d08bc1$953d09b8-d8d0-4e49-ae55-648f956aa248$7e466eb6-9b5f-4e9f-90e2-be11fb66d557$be38f44f-9ce4-433a-84ef-782e5d8a4822$c92d49d3-e8fc-4288-9ce2-3e617fc5c306$d0429b82-7e78-4a18-97bb-e34ba370e024$c8a7838a-8f1a-4f33-a9de-48e60992d08bupstream_cells_mapdistance$0913de40-9fa0-44db-9b2c-9bd93db31790$e7227a20-3d2d-4907-b9a6-422c0d4ab57a$e04666f8-801b-4973-9b9e-807abc5199b7CartesianCoord$a1992b28-16ab-456b-995d-1e40e423d70c$8e3ba95e-7c10-4e95-95cb-a906259282fcprecedence_heuristic	cell_id$8e3ba95e-7c10-4e95-95cb-a906259282fcdownstream_cells_mapupstream_cells_map@md_strgetindex$93beb233-81cc-47f8-89be-8164cc15d020precedence_heuristic	cell_id$93beb233-81cc-47f8-89be-8164cc15d020downstream_cells_mapupstream_cells_map@md_strgetindex$e6e22f60-4e6a-4160-ba06-42d469afb3f6precedence_heuristic	cell_id$e6e22f60-4e6a-4160-ba06-42d469afb3f6downstream_cells_mapupstream_cells_map@md_strgetindex$f5fe37e1-80b9-4853-84d6-82e56417a470precedence_heuristic	cell_id$f5fe37e1-80b9-4853-84d6-82e56417a470downstream_cells_mapfunc_takes_varargs$21e3dc92-82c9-4486-8980-d5e6a012afec$e7b56266-5d70-451b-a448-6b6cfd85cab7$ba8781e6-5c7e-4aaf-8ccd-da3fc6210ec5upstream_cells_mapCoreBase.CoreLogging.invokelatestBase.CoreLogging.===Core.UndefVarError#___this_pluto_module_name'Base.CoreLogging.Base.fixup_stdlib_pathBase.CoreLogging.!BaseBase.CoreLogging.isa@infoBase.invokelatestBase.CoreLogging.>=$8f846ea8-9c6e-499b-bfd8-18bdbbd110f7precedence_heuristic	cell_id$8f846ea8-9c6e-499b-bfd8-18bdbbd110f7downstream_cells_mapupstream_cells_mapatanBenchmarkTools.Parameters@benchmark,BenchmarkTools.generate_benchmark_definition##y#261#___this_pluto_module_nameBenchmarkTools$624e8936-de28-4e09-9a4e-3ef2f6c7d9b0rand##x#260$21e3dc92-82c9-4486-8980-d5e6a012afecprecedence_heuristic	cell_id$21e3dc92-82c9-4486-8980-d5e6a012afecdownstream_cells_mapupstream_cells_mapfunc_takes_varargs$f5fe37e1-80b9-4853-84d6-82e56417a470$365c43af-37a3-4f0c-8e9e-d4003c47b6a3precedence_heuristic	cell_id$365c43af-37a3-4f0c-8e9e-d4003c47b6a3downstream_cells_mapupstream_cells_map@md_strgetindex$9850f52c-7209-4ba0-9298-942d68947b9eprecedence_heuristic	cell_id$9850f52c-7209-4ba0-9298-942d68947b9edownstream_cells_mapupstream_cells_map@md_strblockquotegetindex$1fd8655d-8065-4945-acef-7774ed882d51precedence_heuristic	cell_id$1fd8655d-8065-4945-acef-7774ed882d51downstream_cells_maptheta$953d09b8-d8d0-4e49-ae55-648f956aa248CoordAlt$1fd8655d-8065-4945-acef-7774ed882d51x$24a2ae54-a11d-42da-980c-1f4c78daf4b4$0913de40-9fa0-44db-9b2c-9bd93db31790$e7227a20-3d2d-4907-b9a6-422c0d4ab57a$e04666f8-801b-4973-9b9e-807abc5199b7r$24a2ae54-a11d-42da-980c-1f4c78daf4b4$953d09b8-d8d0-4e49-ae55-648f956aa248y$24a2ae54-a11d-42da-980c-1f4c78daf4b4$0913de40-9fa0-44db-9b2c-9bd93db31790$e7227a20-3d2d-4907-b9a6-422c0d4ab57a$e04666f8-801b-4973-9b9e-807abc5199b7upstream_cells_mapCoordAlt$1fd8655d-8065-4945-acef-7774ed882d51*Float64cossin$0913de40-9fa0-44db-9b2c-9bd93db31790precedence_heuristic	cell_id$0913de40-9fa0-44db-9b2c-9bd93db31790downstream_cells_mapdistance$c16a95ce-2926-4d99-a907-71c95f32c042$953d09b8-d8d0-4e49-ae55-648f956aa248$7e466eb6-9b5f-4e9f-90e2-be11fb66d557$be38f44f-9ce4-433a-84ef-782e5d8a4822$4b7b8ef8-e7c4-415b-a103-e109256e0210$c92d49d3-e8fc-4288-9ce2-3e617fc5c306$d0429b82-7e78-4a18-97bb-e34ba370e024$c8a7838a-8f1a-4f33-a9de-48e60992d08bupstream_cells_mapAbstractCoord$248c85d4-bcac-40a4-9052-1f72a62422ed-sqrt^x$9e8cb539-5d69-4552-87e4-88fe61ab1fbe$1fd8655d-8065-4945-acef-7774ed882d51$1b548d59-f18e-4cfc-9667-472c427d7cc2+y$9e8cb539-5d69-4552-87e4-88fe61ab1fbe$1fd8655d-8065-4945-acef-7774ed882d51$1b548d59-f18e-4cfc-9667-472c427d7cc2$28b53ea4-5bdc-4ac2-b83e-bcb8f0a6416cprecedence_heuristic	cell_id$28b53ea4-5bdc-4ac2-b83e-bcb8f0a6416cdownstream_cells_mapupstream_cells_map@md_strblockquotegetindex$9303806b-a460-4ec2-9f71-252f43b34328precedence_heuristic	cell_id$9303806b-a460-4ec2-9f71-252f43b34328downstream_cells_mapobs$f3937141-49f4-49f2-8bcf-0f4e9c204d24$db388c8a-ddb3-47a6-8ce0-586d9f9602b9$5d599c10-f1d2-454e-ad85-0e092b6cae7e$e80e73cc-fb81-4222-8fcd-a9c4aaf6326e$aa767f81-4bcb-41b6-b141-85796a81d8fb$cee02d24-1dcc-4c29-a322-0ddd12ab8180$dfe5dcd7-9b62-4690-ac21-0930b3e4145c$04391eb3-daf0-4f20-b39e-33e626770e05$fbd538a3-8ddc-4c3f-9748-35fa7b032809$170f2bd0-bb5b-4e78-b92b-dfa8d47aded0$bdf99bf8-bb88-40d7-a8ec-84a99ab65ff3$3ef73948-da0c-4afa-8a73-29c382b29bbdparam_true$f3937141-49f4-49f2-8bcf-0f4e9c204d24$db388c8a-ddb3-47a6-8ce0-586d9f9602b9$5d599c10-f1d2-454e-ad85-0e092b6cae7e$e80e73cc-fb81-4222-8fcd-a9c4aaf6326e$aa767f81-4bcb-41b6-b141-85796a81d8fb$cee02d24-1dcc-4c29-a322-0ddd12ab8180$dfe5dcd7-9b62-4690-ac21-0930b3e4145c$04391eb3-daf0-4f20-b39e-33e626770e05$fbd538a3-8ddc-4c3f-9748-35fa7b032809$170f2bd0-bb5b-4e78-b92b-dfa8d47aded0$bdf99bf8-bb88-40d7-a8ec-84a99ab65ff3$3ef73948-da0c-4afa-8a73-29c382b29bbdx_inupstream_cells_maplengthrandnmy_model$b8e117f5-b253-4208-a00e-7966978fb24bfunc_without_barriers$08d25c7e-907b-403d-b08d-27ca4efcd958+*rand$9e8035cd-c5ba-47c7-8567-1279e666c4fcprecedence_heuristic	cell_id$9e8035cd-c5ba-47c7-8567-1279e666c4fcdownstream_cells_mapupstream_cells_mapfunc_takes_varnamedargs$3e8c154a-3c22-49cc-accd-1076430268ae$426ccd5e-398b-4df7-a27d-cf7a578c658fprecedence_heuristic	cell_id$426ccd5e-398b-4df7-a27d-cf7a578c658fdownstream_cells_maprow_one_viewupstream_cells_map @timeBase.cumulative_compile_timing:Base.*Base.gc_alloc_countBase.-Base.gc_numviewBase.cumulative_compile_time_nsBase.GC_DiffBaseBase.time_printBase.time_nsBase.Threads.lock_profilingBase./big_matrix$8a97f0bf-3ada-4503-98a5-7bdeca15edc4$82883c5d-db3d-4293-bf74-a6e36552a125precedence_heuristic	cell_id$82883c5d-db3d-4293-bf74-a6e36552a125downstream_cells_mapmy_model_stable$0f679916-5f87-45a3-996f-be3146a537a2upstream_cells_map<>converttypeofpromote_type*oneisless$c6460feb-67f0-4028-8b05-e195a8c2bd41precedence_heuristic	cell_id$c6460feb-67f0-4028-8b05-e195a8c2bd41downstream_cells_mapupstream_cells_map@md_strgetindex$44c5243c-a044-4ed7-bf25-728b0291c14aprecedence_heuristic	cell_id$44c5243c-a044-4ed7-bf25-728b0291c14adownstream_cells_mapupstream_cells_map@md_strgetindex$e7d4bc52-ee18-4d0b-8bab-591b688398feprecedence_heuristic	cell_id$e7d4bc52-ee18-4d0b-8bab-591b688398fedownstream_cells_mapupstream_cells_mapTableOfContentstoc_aside$ae709a34-9244-44ee-a004-381fc9b6cd0c$b1557899-91c0-4f02-b486-e3c4f38d9218precedence_heuristic	cell_id$b1557899-91c0-4f02-b486-e3c4f38d9218downstream_cells_mapupstream_cells_mapBenchmarkTools.Parameters##x#252sqrt,BenchmarkTools.generate_benchmark_definition@benchmarkBenchmarkTools$624e8936-de28-4e09-9a4e-3ef2f6c7d9b0#___this_pluto_module_namerand$e7b56266-5d70-451b-a448-6b6cfd85cab7precedence_heuristic	cell_id$e7b56266-5d70-451b-a448-6b6cfd85cab7downstream_cells_mapupstream_cells_mapfunc_takes_varargs$f5fe37e1-80b9-4853-84d6-82e56417a470$a1992b28-16ab-456b-995d-1e40e423d70cprecedence_heuristic	cell_id$a1992b28-16ab-456b-995d-1e40e423d70cdownstream_cells_mapCartesianCoord$1b548d59-f18e-4cfc-9667-472c427d7cc2$c16a95ce-2926-4d99-a907-71c95f32c042upstream_cells_mapAbstractCoord$248c85d4-bcac-40a4-9052-1f72a62422edFloat64$4b7b8ef8-e7c4-415b-a103-e109256e0210precedence_heuristic	cell_id$4b7b8ef8-e7c4-415b-a103-e109256e0210downstream_cells_mapupstream_cells_mapdistance$0913de40-9fa0-44db-9b2c-9bd93db31790$e7227a20-3d2d-4907-b9a6-422c0d4ab57a$e04666f8-801b-4973-9b9e-807abc5199b7p1$953d09b8-d8d0-4e49-ae55-648f956aa248$f658c638-8c9d-4828-ac15-ecd7d4650b13precedence_heuristic	cell_id$f658c638-8c9d-4828-ac15-ecd7d4650b13downstream_cells_mapupstream_cells_map@md_strgetindex$d5cb70a8-079b-4fd5-851f-8742680ff515precedence_heuristic	cell_id$d5cb70a8-079b-4fd5-851f-8742680ff515downstream_cells_mapfunc_without_type_instability$5d599c10-f1d2-454e-ad85-0e092b6cae7e$e80e73cc-fb81-4222-8fcd-a9c4aaf6326eupstream_cells_mapmy_model$b8e117f5-b253-4208-a00e-7966978fb24bconvertFloat64calc_χ²$783e926f-91a2-4ded-a21b-ae27fa3bc4d8$fad14e46-21a4-41ea-8f3d-a747cdfe3a51precedence_heuristic	cell_id$fad14e46-21a4-41ea-8f3d-a747cdfe3a51downstream_cells_mapfunc_with_type_instability$f3937141-49f4-49f2-8bcf-0f4e9c204d24$db388c8a-ddb3-47a6-8ce0-586d9f9602b9upstream_cells_mapmy_model$b8e117f5-b253-4208-a00e-7966978fb24bcalc_χ²$783e926f-91a2-4ded-a21b-ae27fa3bc4d8$d6a2b578-88a4-4a82-bb20-641ccc60aa8dprecedence_heuristic	cell_id$d6a2b578-88a4-4a82-bb20-641ccc60aa8ddownstream_cells_mapupstream_cells_map@md_strgetindex$3fa48928-5311-49ec-83d2-cf4c45c7c579precedence_heuristic	cell_id$3fa48928-5311-49ec-83d2-cf4c45c7c579downstream_cells_mapupstream_cells_map@md_strgetindex$04391eb3-daf0-4f20-b39e-33e626770e05precedence_heuristic	cell_id$04391eb3-daf0-4f20-b39e-33e626770e05downstream_cells_mapupstream_cells_mapobs$9303806b-a460-4ec2-9f71-252f43b34328 func_without_type_instability_v3$0f679916-5f87-45a3-996f-be3146a537a2BenchmarkTools.Parameters@benchmark,BenchmarkTools.generate_benchmark_definition##obs#257#___this_pluto_module_nameBenchmarkTools$624e8936-de28-4e09-9a4e-3ef2f6c7d9b0##param_true#258param_true$9303806b-a460-4ec2-9f71-252f43b34328$953d09b8-d8d0-4e49-ae55-648f956aa248precedence_heuristic	cell_id$953d09b8-d8d0-4e49-ae55-648f956aa248downstream_cells_mapp2$7e466eb6-9b5f-4e9f-90e2-be11fb66d557p1$4b7b8ef8-e7c4-415b-a103-e109256e0210$c92d49d3-e8fc-4288-9ce2-3e617fc5c306upstream_cells_mapc2$c16a95ce-2926-4d99-a907-71c95f32c042theta$9e8cb539-5d69-4552-87e4-88fe61ab1fbe$1fd8655d-8065-4945-acef-7774ed882d51$1b548d59-f18e-4cfc-9667-472c427d7cc2distance$0913de40-9fa0-44db-9b2c-9bd93db31790$e7227a20-3d2d-4907-b9a6-422c0d4ab57a$e04666f8-801b-4973-9b9e-807abc5199b7c1$c16a95ce-2926-4d99-a907-71c95f32c042r$9e8cb539-5d69-4552-87e4-88fe61ab1fbe$1fd8655d-8065-4945-acef-7774ed882d51$1b548d59-f18e-4cfc-9667-472c427d7cc2PolarCoord$6985f2d5-6c71-4289-b655-ec06754f85c4$3e8c154a-3c22-49cc-accd-1076430268aeprecedence_heuristic	cell_id$3e8c154a-3c22-49cc-accd-1076430268aedownstream_cells_mapfunc_takes_varnamedargs$9e8035cd-c5ba-47c7-8567-1279e666c4fcupstream_cells_mapCoreBase.CoreLogging.invokelatestBase.CoreLogging.===Core.UndefVarError#___this_pluto_module_name'Base.CoreLogging.Base.fixup_stdlib_pathBase.CoreLogging.!BaseBase.CoreLogging.isa@infoBase.invokelatestBase.CoreLogging.>=$3ef73948-da0c-4afa-8a73-29c382b29bbdprecedence_heuristic	cell_id$3ef73948-da0c-4afa-8a73-29c382b29bbddownstream_cells_mapupstream_cells_mapobs$9303806b-a460-4ec2-9f71-252f43b34328BenchmarkTools.Parameters@benchmark,BenchmarkTools.generate_benchmark_definition##param_true#264func_with_barriers$05d2780e-612c-4e86-93c4-f57734f49c74#___this_pluto_module_nameBenchmarkTools$624e8936-de28-4e09-9a4e-3ef2f6c7d9b0##obs#263param_true$9303806b-a460-4ec2-9f71-252f43b34328$15efacae-95a5-4607-8a38-76ee5f345235precedence_heuristic	cell_id$15efacae-95a5-4607-8a38-76ee5f345235downstream_cells_mapupstream_cells_map@md_strgetindex$9007f240-c88e-46c4-993d-fd6b93d8b18dprecedence_heuristic	cell_id$9007f240-c88e-46c4-993d-fd6b93d8b18ddownstream_cells_mapupstream_cells_map@md_strgetindex$b24a684b-b2d1-4d6a-9408-590feef3ba08precedence_heuristic	cell_id$b24a684b-b2d1-4d6a-9408-590feef3ba08downstream_cells_mapupstream_cells_map@md_strgetindex$282d2a07-5f63-4f3e-960e-b5ffcab6b9deprecedence_heuristic	cell_id$282d2a07-5f63-4f3e-960e-b5ffcab6b9dedownstream_cells_mapupstream_cells_map##bigvector#280BenchmarkTools.Parametersf_fused_with_macro$11e60eb5-980d-4d3d-8f09-03390584aaad@benchmark,BenchmarkTools.generate_benchmark_definitionbigvector$e1996c2f-5298-48c9-a29c-852bd37b54c4#___this_pluto_module_nameBenchmarkTools$624e8936-de28-4e09-9a4e-3ef2f6c7d9b0$9ab94eea-4d57-4ef2-a73a-64e7c8b89222precedence_heuristic	cell_id$9ab94eea-4d57-4ef2-a73a-64e7c8b89222downstream_cells_mapupstream_cells_mapintegrate_f$404c0658-ae86-457a-adc3-4ef69bb43ac8πfunc_that_needs_parameters$ccb63eb8-1da0-48ce-ae51-c18c48509445$5d599c10-f1d2-454e-ad85-0e092b6cae7eprecedence_heuristic	cell_id$5d599c10-f1d2-454e-ad85-0e092b6cae7edownstream_cells_mapupstream_cells_mapobs$9303806b-a460-4ec2-9f71-252f43b34328InteractiveUtilsInteractiveUtils.code_warntype@code_warntypefunc_without_type_instability$d5cb70a8-079b-4fd5-851f-8742680ff515param_true$9303806b-a460-4ec2-9f71-252f43b34328$4c3332a8-a5d1-43fb-887b-ac66dfa02de5precedence_heuristic	cell_id$4c3332a8-a5d1-43fb-887b-ac66dfa02de5downstream_cells_mapupstream_cells_map@md_strgetindex$31476473-d619-404c-a1c1-b32c1b8c5930precedence_heuristic	cell_id$31476473-d619-404c-a1c1-b32c1b8c5930downstream_cells_mapupstream_cells_map@md_strgetindex$53863e96-0c11-484f-bfc9-23b52ca933deprecedence_heuristic	cell_id$53863e96-0c11-484f-bfc9-23b52ca933dedownstream_cells_mapupstream_cells_map@md_strgetindex$ccb63eb8-1da0-48ce-ae51-c18c48509445precedence_heuristic	cell_id$ccb63eb8-1da0-48ce-ae51-c18c48509445downstream_cells_mapfunc_that_needs_parameters$9ab94eea-4d57-4ef2-a73a-64e7c8b89222upstream_cells_map^/πsinReal$0363149b-f34d-4120-81db-a655f18b908fprecedence_heuristic	cell_id$0363149b-f34d-4120-81db-a655f18b908fdownstream_cells_mapupstream_cells_map@md_strgetindex$b8e117f5-b253-4208-a00e-7966978fb24bprecedence_heuristic	cell_id$b8e117f5-b253-4208-a00e-7966978fb24bdownstream_cells_mapmy_model$9303806b-a460-4ec2-9f71-252f43b34328$fad14e46-21a4-41ea-8f3d-a747cdfe3a51$d5cb70a8-079b-4fd5-851f-8742680ff515upstream_cells_map<>isless*$02002957-8644-40ca-99ef-86151769a5d9precedence_heuristic	cell_id$02002957-8644-40ca-99ef-86151769a5d9downstream_cells_maprow_one_copiedupstream_cells_map@timeBase.cumulative_compile_timing:Base.*Base.gc_alloc_countBase.-Base.gc_numBase.cumulative_compile_time_nsBase.GC_DiffBaseBase.time_printBase.time_nsBase.Threads.lock_profilingBase./big_matrix$8a97f0bf-3ada-4503-98a5-7bdeca15edc4$12b8d696-0e7b-4814-9c73-22b7cf95fef4precedence_heuristic	cell_id$12b8d696-0e7b-4814-9c73-22b7cf95fef4downstream_cells_mapupstream_cells_mapf$11c29d50-1975-48cc-b1c5-dd3814128e86BenchmarkTools.Parameters@benchmark,BenchmarkTools.generate_benchmark_definitionbigvector$e1996c2f-5298-48c9-a29c-852bd37b54c4#___this_pluto_module_nameBenchmarkTools$624e8936-de28-4e09-9a4e-3ef2f6c7d9b0##bigvector#272$9bf47a21-af6d-4c76-84d1-0b78635bae9aprecedence_heuristic	cell_id$9bf47a21-af6d-4c76-84d1-0b78635bae9adownstream_cells_mapupstream_cells_map@md_strgetindex$64d51527-1bd0-4010-b458-4dfa6f44610dprecedence_heuristic	cell_id$64d51527-1bd0-4010-b458-4dfa6f44610ddownstream_cells_mapupstream_cells_map@md_strgetindexcell_execution_order $624e8936-de28-4e09-9a4e-3ef2f6c7d9b0$cf5262da-1043-11ec-12fc-9916cc70070c$9ec9429d-c1f1-4845-a514-9c88b452071f$ae709a34-9244-44ee-a004-381fc9b6cd0c$e7d4bc52-ee18-4d0b-8bab-591b688398fe$9007f240-c88e-46c4-993d-fd6b93d8b18d$31476473-d619-404c-a1c1-b32c1b8c5930$208bf525-447d-4726-b67c-c3b968b415b8$4c3332a8-a5d1-43fb-887b-ac66dfa02de5$f79de8d4-537e-421f-a66d-41bc79f8f12f$94223079-afab-4a6d-a126-068a4e94f52e$7b66fbe6-5f42-4619-a265-8d284d3dac8c$365c43af-37a3-4f0c-8e9e-d4003c47b6a3$9e8cb539-5d69-4552-87e4-88fe61ab1fbe$44c5243c-a044-4ed7-bf25-728b0291c14a$9bf47a21-af6d-4c76-84d1-0b78635bae9a$1fd8655d-8065-4945-acef-7774ed882d51$b24a684b-b2d1-4d6a-9408-590feef3ba08$248c85d4-bcac-40a4-9052-1f72a62422ed$a1992b28-16ab-456b-995d-1e40e423d70c$6985f2d5-6c71-4289-b655-ec06754f85c4$1969217c-24be-47e2-9853-b70cf4d5565d$1b548d59-f18e-4cfc-9667-472c427d7cc2$24a2ae54-a11d-42da-980c-1f4c78daf4b4$f9d3d93f-f1c4-4b3b-aa8a-097f2c8aaf68$0913de40-9fa0-44db-9b2c-9bd93db31790$2e32935f-c82f-434b-b0f5-01a4b15ddb80$e7227a20-3d2d-4907-b9a6-422c0d4ab57a$93beb233-81cc-47f8-89be-8164cc15d020$e04666f8-801b-4973-9b9e-807abc5199b7$c16a95ce-2926-4d99-a907-71c95f32c042$953d09b8-d8d0-4e49-ae55-648f956aa248$7e466eb6-9b5f-4e9f-90e2-be11fb66d557$be38f44f-9ce4-433a-84ef-782e5d8a4822$4b7b8ef8-e7c4-415b-a103-e109256e0210$c92d49d3-e8fc-4288-9ce2-3e617fc5c306$d0429b82-7e78-4a18-97bb-e34ba370e024$c8a7838a-8f1a-4f33-a9de-48e60992d08b$348ee204-546f-46c5-bf5d-7d4a761002ec$fd3c57f9-1f47-4e3e-91ee-b05911f992ee$c6460feb-67f0-4028-8b05-e195a8c2bd41$ac9b4f35-36fc-425b-a0a2-83fc32c62c7c$b7fbdc93-4c8b-4222-98e3-62fa7e726e2f$b8e117f5-b253-4208-a00e-7966978fb24b$783e926f-91a2-4ded-a21b-ae27fa3bc4d8$fad14e46-21a4-41ea-8f3d-a747cdfe3a51$d5cb70a8-079b-4fd5-851f-8742680ff515$495b281e-f4c9-4f55-bf5a-9a8d7f43044c$bf497b24-72a7-4a2f-908e-c24922a5f3c8$20db6ae9-8c79-44d1-a3a7-0dadf1d0dc5a$8e3ba95e-7c10-4e95-95cb-a906259282fc$82883c5d-db3d-4293-bf74-a6e36552a125$0f679916-5f87-45a3-996f-be3146a537a2$c1628685-c357-436f-83dd-bf19bde24964$08d25c7e-907b-403d-b08d-27ca4efcd958$9303806b-a460-4ec2-9f71-252f43b34328$f3937141-49f4-49f2-8bcf-0f4e9c204d24$db388c8a-ddb3-47a6-8ce0-586d9f9602b9$5d599c10-f1d2-454e-ad85-0e092b6cae7e$e80e73cc-fb81-4222-8fcd-a9c4aaf6326e$aa767f81-4bcb-41b6-b141-85796a81d8fb$cee02d24-1dcc-4c29-a322-0ddd12ab8180$dfe5dcd7-9b62-4690-ac21-0930b3e4145c$04391eb3-daf0-4f20-b39e-33e626770e05$fbd538a3-8ddc-4c3f-9748-35fa7b032809$170f2bd0-bb5b-4e78-b92b-dfa8d47aded0$05d2780e-612c-4e86-93c4-f57734f49c74$bdf99bf8-bb88-40d7-a8ec-84a99ab65ff3$3ef73948-da0c-4afa-8a73-29c382b29bbd$b2ac3b2c-31c7-4e64-9009-47ac03e38afb$c949701e-3399-44d8-9041-4dcb99c78cda$9d71d1b0-765d-48d7-a939-c951fc8caa67$64d51527-1bd0-4010-b458-4dfa6f44610d$e1996c2f-5298-48c9-a29c-852bd37b54c4$11c29d50-1975-48cc-b1c5-dd3814128e86$12b8d696-0e7b-4814-9c73-22b7cf95fef4$96998f54-9f66-48fe-b808-559276667054$11e60eb5-980d-4d3d-8f09-03390584aaad$781ef824-a235-46ce-accd-362f2e963550$282d2a07-5f63-4f3e-960e-b5ffcab6b9de$3bf761b6-132b-43fa-aa41-b2e73ddce94b$8a97f0bf-3ada-4503-98a5-7bdeca15edc4$02002957-8644-40ca-99ef-86151769a5d9$426ccd5e-398b-4df7-a27d-cf7a578c658f$18813a15-531f-4d74-a0f7-45a0574d6c1b$59fbb599-c947-4a2a-a678-8e38a666660c$f658c638-8c9d-4828-ac15-ecd7d4650b13$d2e1b3c3-3a81-44cd-a57b-fd9c29badce4$279df4ae-a0e2-4838-8a9c-3ff82245935e$fa1f963d-d674-442f-aa32-fcee86a8c058$fa116847-4bac-41e6-bd6e-e01c5c7234ae$9122bdf0-c0b9-4966-8933-00a40562393a$957519f4-a669-472a-bc81-ecd0dcce9842$b1557899-91c0-4f02-b486-e3c4f38d9218$8f846ea8-9c6e-499b-bfd8-18bdbbd110f7$d3d085e6-67b5-4286-b66d-120720e1002d$dc23159c-95ca-466d-9cbe-23bb0448d134$3738748d-7b3d-4015-bf71-0ffb9e28c43d$b7c23b8b-aaca-41b0-8397-ad2300eeda50$febc6f64-0d39-4206-8475-e6324973284f$3d06ed43-23c2-4c57-a1a5-e699713b9506$5c5f9760-695f-4fa2-b4a6-8a878ab97ea6$d6147ce2-b3ec-45f0-ba90-2c453a719548$b243656e-2eec-4650-adbe-5ca8a712d5d6$64fc3013-09e3-4f95-a3f4-20138125e71b$bd011001-07cb-4f74-9c69-8f91945e2cbf$d6a2b578-88a4-4a82-bb20-641ccc60aa8d$15efacae-95a5-4607-8a38-76ee5f345235$e6e22f60-4e6a-4160-ba06-42d469afb3f6$1cf69f4d-04db-4c3a-897a-a1da9e46b88c$46cd3a5f-3358-4f21-91c7-82c544bc4353$3fa48928-5311-49ec-83d2-cf4c45c7c579$9850f52c-7209-4ba0-9298-942d68947b9e$53863e96-0c11-484f-bfc9-23b52ca933de$8446120e-5bac-4b8e-bc86-836f773f79a0$79783bcb-fe34-4c9d-af08-7a82c851beec$f5fe37e1-80b9-4853-84d6-82e56417a470$21e3dc92-82c9-4486-8980-d5e6a012afec$e7b56266-5d70-451b-a448-6b6cfd85cab7$3e8c154a-3c22-49cc-accd-1076430268ae$ba8781e6-5c7e-4aaf-8ccd-da3fc6210ec5$9e8035cd-c5ba-47c7-8567-1279e666c4fc$e1ec523b-3c2f-447d-8b71-063dc5955f45$404c0658-ae86-457a-adc3-4ef69bb43ac8$55af3d38-8956-4a22-8ca6-dbbb7de1b426$ccb63eb8-1da0-48ce-ae51-c18c48509445$9ab94eea-4d57-4ef2-a73a-64e7c8b89222$28b53ea4-5bdc-4ac2-b83e-bcb8f0a6416c$8f4b3c77-e79f-457a-b9e9-9f30dd1f526a$288d3aaf-ee71-44f5-aefb-4b7b787c7caa$73b01b03-2016-4253-8f95-e0bdb3bca5f4$b556927c-ab72-41c5-9a3e-83756e40550a$46d264b6-73da-4790-92e4-988728c7e1df$252f394f-9d7d-41be-8cbf-ccb5558b83d1$3ac9ad42-7bf1-4b36-9e0b-53f3f60796b1$77e28f2e-d53a-4dd7-938e-5d95bac81db1$047835eb-6bcc-4f32-b991-5ccccbf34cb9$31debff2-3667-4631-bff5-e95cf107ae9a$a9cf77ec-434e-4477-a844-9f8b9199589f$f13e442e-771f-4aab-b5f3-f08c4e72229c$0363149b-f34d-4120-81db-a655f18b908f$d35aa76c-b4e6-45f8-a4e3-ba37d674db82$d58ee47e-10df-4d8c-aad3-ae755a5024e4last_hot_reload_time        shortpathweek5.jlprocess_statusreadypath>/home/runner/work/Notes-Fall2025/Notes-Fall2025/week5/week5.jlpluto_versionv0.20.21last_save_timeAE(~cell_order $cf5262da-1043-11ec-12fc-9916cc70070c$e7d4bc52-ee18-4d0b-8bab-591b688398fe$9ec9429d-c1f1-4845-a514-9c88b452071f$ae709a34-9244-44ee-a004-381fc9b6cd0c$9007f240-c88e-46c4-993d-fd6b93d8b18d$31476473-d619-404c-a1c1-b32c1b8c5930$208bf525-447d-4726-b67c-c3b968b415b8$4c3332a8-a5d1-43fb-887b-ac66dfa02de5$f79de8d4-537e-421f-a66d-41bc79f8f12f$94223079-afab-4a6d-a126-068a4e94f52e$7b66fbe6-5f42-4619-a265-8d284d3dac8c$365c43af-37a3-4f0c-8e9e-d4003c47b6a3$9e8cb539-5d69-4552-87e4-88fe61ab1fbe$24a2ae54-a11d-42da-980c-1f4c78daf4b4$44c5243c-a044-4ed7-bf25-728b0291c14a$9bf47a21-af6d-4c76-84d1-0b78635bae9a$1fd8655d-8065-4945-acef-7774ed882d51$b24a684b-b2d1-4d6a-9408-590feef3ba08$248c85d4-bcac-40a4-9052-1f72a62422ed$a1992b28-16ab-456b-995d-1e40e423d70c$6985f2d5-6c71-4289-b655-ec06754f85c4$1969217c-24be-47e2-9853-b70cf4d5565d$1b548d59-f18e-4cfc-9667-472c427d7cc2$f9d3d93f-f1c4-4b3b-aa8a-097f2c8aaf68$0913de40-9fa0-44db-9b2c-9bd93db31790$c16a95ce-2926-4d99-a907-71c95f32c042$953d09b8-d8d0-4e49-ae55-648f956aa248$7e466eb6-9b5f-4e9f-90e2-be11fb66d557$be38f44f-9ce4-433a-84ef-782e5d8a4822$4b7b8ef8-e7c4-415b-a103-e109256e0210$c92d49d3-e8fc-4288-9ce2-3e617fc5c306$2e32935f-c82f-434b-b0f5-01a4b15ddb80$e7227a20-3d2d-4907-b9a6-422c0d4ab57a$d0429b82-7e78-4a18-97bb-e34ba370e024$93beb233-81cc-47f8-89be-8164cc15d020$e04666f8-801b-4973-9b9e-807abc5199b7$c8a7838a-8f1a-4f33-a9de-48e60992d08b$348ee204-546f-46c5-bf5d-7d4a761002ec$fd3c57f9-1f47-4e3e-91ee-b05911f992ee$c6460feb-67f0-4028-8b05-e195a8c2bd41$ac9b4f35-36fc-425b-a0a2-83fc32c62c7c$b7fbdc93-4c8b-4222-98e3-62fa7e726e2f$b8e117f5-b253-4208-a00e-7966978fb24b$9303806b-a460-4ec2-9f71-252f43b34328$783e926f-91a2-4ded-a21b-ae27fa3bc4d8$fad14e46-21a4-41ea-8f3d-a747cdfe3a51$f3937141-49f4-49f2-8bcf-0f4e9c204d24$db388c8a-ddb3-47a6-8ce0-586d9f9602b9$d5cb70a8-079b-4fd5-851f-8742680ff515$5d599c10-f1d2-454e-ad85-0e092b6cae7e$e80e73cc-fb81-4222-8fcd-a9c4aaf6326e$495b281e-f4c9-4f55-bf5a-9a8d7f43044c$bf497b24-72a7-4a2f-908e-c24922a5f3c8$aa767f81-4bcb-41b6-b141-85796a81d8fb$cee02d24-1dcc-4c29-a322-0ddd12ab8180$20db6ae9-8c79-44d1-a3a7-0dadf1d0dc5a$dfe5dcd7-9b62-4690-ac21-0930b3e4145c$8e3ba95e-7c10-4e95-95cb-a906259282fc$82883c5d-db3d-4293-bf74-a6e36552a125$0f679916-5f87-45a3-996f-be3146a537a2$04391eb3-daf0-4f20-b39e-33e626770e05$c1628685-c357-436f-83dd-bf19bde24964$08d25c7e-907b-403d-b08d-27ca4efcd958$fbd538a3-8ddc-4c3f-9748-35fa7b032809$170f2bd0-bb5b-4e78-b92b-dfa8d47aded0$05d2780e-612c-4e86-93c4-f57734f49c74$bdf99bf8-bb88-40d7-a8ec-84a99ab65ff3$3ef73948-da0c-4afa-8a73-29c382b29bbd$b2ac3b2c-31c7-4e64-9009-47ac03e38afb$c949701e-3399-44d8-9041-4dcb99c78cda$9d71d1b0-765d-48d7-a939-c951fc8caa67$64d51527-1bd0-4010-b458-4dfa6f44610d$e1996c2f-5298-48c9-a29c-852bd37b54c4$11c29d50-1975-48cc-b1c5-dd3814128e86$12b8d696-0e7b-4814-9c73-22b7cf95fef4$96998f54-9f66-48fe-b808-559276667054$11e60eb5-980d-4d3d-8f09-03390584aaad$781ef824-a235-46ce-accd-362f2e963550$282d2a07-5f63-4f3e-960e-b5ffcab6b9de$3bf761b6-132b-43fa-aa41-b2e73ddce94b$8a97f0bf-3ada-4503-98a5-7bdeca15edc4$02002957-8644-40ca-99ef-86151769a5d9$426ccd5e-398b-4df7-a27d-cf7a578c658f$18813a15-531f-4d74-a0f7-45a0574d6c1b$59fbb599-c947-4a2a-a678-8e38a666660c$f658c638-8c9d-4828-ac15-ecd7d4650b13$d2e1b3c3-3a81-44cd-a57b-fd9c29badce4$279df4ae-a0e2-4838-8a9c-3ff82245935e$fa1f963d-d674-442f-aa32-fcee86a8c058$fa116847-4bac-41e6-bd6e-e01c5c7234ae$9122bdf0-c0b9-4966-8933-00a40562393a$957519f4-a669-472a-bc81-ecd0dcce9842$b1557899-91c0-4f02-b486-e3c4f38d9218$8f846ea8-9c6e-499b-bfd8-18bdbbd110f7$d3d085e6-67b5-4286-b66d-120720e1002d$dc23159c-95ca-466d-9cbe-23bb0448d134$3738748d-7b3d-4015-bf71-0ffb9e28c43d$b7c23b8b-aaca-41b0-8397-ad2300eeda50$febc6f64-0d39-4206-8475-e6324973284f$3d06ed43-23c2-4c57-a1a5-e699713b9506$5c5f9760-695f-4fa2-b4a6-8a878ab97ea6$d6147ce2-b3ec-45f0-ba90-2c453a719548$b243656e-2eec-4650-adbe-5ca8a712d5d6$64fc3013-09e3-4f95-a3f4-20138125e71b$bd011001-07cb-4f74-9c69-8f91945e2cbf$d6a2b578-88a4-4a82-bb20-641ccc60aa8d$15efacae-95a5-4607-8a38-76ee5f345235$e6e22f60-4e6a-4160-ba06-42d469afb3f6$1cf69f4d-04db-4c3a-897a-a1da9e46b88c$46cd3a5f-3358-4f21-91c7-82c544bc4353$3fa48928-5311-49ec-83d2-cf4c45c7c579$9850f52c-7209-4ba0-9298-942d68947b9e$53863e96-0c11-484f-bfc9-23b52ca933de$8446120e-5bac-4b8e-bc86-836f773f79a0$79783bcb-fe34-4c9d-af08-7a82c851beec$f5fe37e1-80b9-4853-84d6-82e56417a470$21e3dc92-82c9-4486-8980-d5e6a012afec$e7b56266-5d70-451b-a448-6b6cfd85cab7$3e8c154a-3c22-49cc-accd-1076430268ae$ba8781e6-5c7e-4aaf-8ccd-da3fc6210ec5$9e8035cd-c5ba-47c7-8567-1279e666c4fc$e1ec523b-3c2f-447d-8b71-063dc5955f45$404c0658-ae86-457a-adc3-4ef69bb43ac8$55af3d38-8956-4a22-8ca6-dbbb7de1b426$ccb63eb8-1da0-48ce-ae51-c18c48509445$9ab94eea-4d57-4ef2-a73a-64e7c8b89222$28b53ea4-5bdc-4ac2-b83e-bcb8f0a6416c$8f4b3c77-e79f-457a-b9e9-9f30dd1f526a$288d3aaf-ee71-44f5-aefb-4b7b787c7caa$73b01b03-2016-4253-8f95-e0bdb3bca5f4$b556927c-ab72-41c5-9a3e-83756e40550a$46d264b6-73da-4790-92e4-988728c7e1df$252f394f-9d7d-41be-8cbf-ccb5558b83d1$3ac9ad42-7bf1-4b36-9e0b-53f3f60796b1$77e28f2e-d53a-4dd7-938e-5d95bac81db1$047835eb-6bcc-4f32-b991-5ccccbf34cb9$31debff2-3667-4631-bff5-e95cf107ae9a$a9cf77ec-434e-4477-a844-9f8b9199589f$f13e442e-771f-4aab-b5f3-f08c4e72229c$0363149b-f34d-4120-81db-a655f18b908f$d35aa76c-b4e6-45f8-a4e3-ba37d674db82$624e8936-de28-4e09-9a4e-3ef2f6c7d9b0$d58ee47e-10df-4d8c-aad3-ae755a5024e4published_objectsnbpkginstall_time_ns   WPAinstantiatedòinstalled_versionsStaticArrays1.6.3ForwardDiff0.10.36PlutoUI0.7.52PlutoTest0.2.2BenchmarkTools1.3.2PlutoTeachingTools0.2.13terminal_outputsStaticArrays
[0m[1mResolving...[22m
[90m===[39m
[32m[1m   Installed[22m[39m DiffRules ──────────── v1.15.1
[32m[1m   Installed[22m[39m DiffResults ────────── v1.1.0
[32m[1m   Installed[22m[39m CommonSubexpressions ─ v0.3.0
[32m[1m   Installed[22m[39m OpenSpecFun_jll ────── v0.5.5+0
[32m[1m   Installed[22m[39m ForwardDiff ────────── v0.10.36
[32m[1m   Installed[22m[39m SpecialFunctions ───── v2.3.1
[32m[1m   Installed[22m[39m Preferences ────────── v1.4.0
[32m[1m   Installed[22m[39m StaticArrays ───────── v1.6.3
[32m[1m   Installed[22m[39m Revise ─────────────── v3.5.3
[32m[1m  No Changes[22m[39m to `~/.julia/scratchspaces/c3e4b0f8-55cb-11ea-2926-15256bba5781/pkg_envs/env_sqxydbsfum/Project.toml`
[32m[1m    Updating[22m[39m `~/.julia/scratchspaces/c3e4b0f8-55cb-11ea-2926-15256bba5781/pkg_envs/env_sqxydbsfum/Manifest.toml`
  [90m[05823500] [39m[93m↑ OpenLibm_jll v0.8.1+2 ⇒ v0.8.5+0[39m

[0m[1mInstantiating...[22m
[90m===[39m

[0m[1mPrecompiling...[22m
[90m===[39m
Waiting for notebook process to start... Done. Starting precompilation...
[92m[1mPrecompiling[22m[39m project...
ForwardDiff
[0m[1mResolving...[22m
[90m===[39m
[32m[1m   Installed[22m[39m DiffRules ──────────── v1.15.1
[32m[1m   Installed[22m[39m DiffResults ────────── v1.1.0
[32m[1m   Installed[22m[39m CommonSubexpressions ─ v0.3.0
[32m[1m   Installed[22m[39m OpenSpecFun_jll ────── v0.5.5+0
[32m[1m   Installed[22m[39m ForwardDiff ────────── v0.10.36
[32m[1m   Installed[22m[39m SpecialFunctions ───── v2.3.1
[32m[1m   Installed[22m[39m Preferences ────────── v1.4.0
[32m[1m   Installed[22m[39m StaticArrays ───────── v1.6.3
[32m[1m   Installed[22m[39m Revise ─────────────── v3.5.3
[32m[1m  No Changes[22m[39m to `~/.julia/scratchspaces/c3e4b0f8-55cb-11ea-2926-15256bba5781/pkg_envs/env_sqxydbsfum/Project.toml`
[32m[1m    Updating[22m[39m `~/.julia/scratchspaces/c3e4b0f8-55cb-11ea-2926-15256bba5781/pkg_envs/env_sqxydbsfum/Manifest.toml`
  [90m[05823500] [39m[93m↑ OpenLibm_jll v0.8.1+2 ⇒ v0.8.5+0[39m

[0m[1mInstantiating...[22m
[90m===[39m

[0m[1mPrecompiling...[22m
[90m===[39m
Waiting for notebook process to start... Done. Starting precompilation...
[92m[1mPrecompiling[22m[39m project...
nbpkg_sync
[0m[1mResolving...[22m
[90m===[39m
[32m[1m   Installed[22m[39m DiffRules ──────────── v1.15.1
[32m[1m   Installed[22m[39m DiffResults ────────── v1.1.0
[32m[1m   Installed[22m[39m CommonSubexpressions ─ v0.3.0
[32m[1m   Installed[22m[39m OpenSpecFun_jll ────── v0.5.5+0
[32m[1m   Installed[22m[39m ForwardDiff ────────── v0.10.36
[32m[1m   Installed[22m[39m SpecialFunctions ───── v2.3.1
[32m[1m   Installed[22m[39m Preferences ────────── v1.4.0
[32m[1m   Installed[22m[39m StaticArrays ───────── v1.6.3
[32m[1m   Installed[22m[39m Revise ─────────────── v3.5.3
[32m[1m  No Changes[22m[39m to `~/.julia/scratchspaces/c3e4b0f8-55cb-11ea-2926-15256bba5781/pkg_envs/env_sqxydbsfum/Project.toml`
[32m[1m    Updating[22m[39m `~/.julia/scratchspaces/c3e4b0f8-55cb-11ea-2926-15256bba5781/pkg_envs/env_sqxydbsfum/Manifest.toml`
  [90m[05823500] [39m[93m↑ OpenLibm_jll v0.8.1+2 ⇒ v0.8.5+0[39m

[0m[1mInstantiating...[22m
[90m===[39m

[0m[1mPrecompiling...[22m
[90m===[39m
Waiting for notebook process to start... Done. Starting precompilation...
[92m[1mPrecompiling[22m[39m project...
PlutoUI
[0m[1mResolving...[22m
[90m===[39m
[32m[1m   Installed[22m[39m DiffRules ──────────── v1.15.1
[32m[1m   Installed[22m[39m DiffResults ────────── v1.1.0
[32m[1m   Installed[22m[39m CommonSubexpressions ─ v0.3.0
[32m[1m   Installed[22m[39m OpenSpecFun_jll ────── v0.5.5+0
[32m[1m   Installed[22m[39m ForwardDiff ────────── v0.10.36
[32m[1m   Installed[22m[39m SpecialFunctions ───── v2.3.1
[32m[1m   Installed[22m[39m Preferences ────────── v1.4.0
[32m[1m   Installed[22m[39m StaticArrays ───────── v1.6.3
[32m[1m   Installed[22m[39m Revise ─────────────── v3.5.3
[32m[1m  No Changes[22m[39m to `~/.julia/scratchspaces/c3e4b0f8-55cb-11ea-2926-15256bba5781/pkg_envs/env_sqxydbsfum/Project.toml`
[32m[1m    Updating[22m[39m `~/.julia/scratchspaces/c3e4b0f8-55cb-11ea-2926-15256bba5781/pkg_envs/env_sqxydbsfum/Manifest.toml`
  [90m[05823500] [39m[93m↑ OpenLibm_jll v0.8.1+2 ⇒ v0.8.5+0[39m

[0m[1mInstantiating...[22m
[90m===[39m

[0m[1mPrecompiling...[22m
[90m===[39m
Waiting for notebook process to start... Done. Starting precompilation...
[92m[1mPrecompiling[22m[39m project...
PlutoTest
[0m[1mResolving...[22m
[90m===[39m
[32m[1m   Installed[22m[39m DiffRules ──────────── v1.15.1
[32m[1m   Installed[22m[39m DiffResults ────────── v1.1.0
[32m[1m   Installed[22m[39m CommonSubexpressions ─ v0.3.0
[32m[1m   Installed[22m[39m OpenSpecFun_jll ────── v0.5.5+0
[32m[1m   Installed[22m[39m ForwardDiff ────────── v0.10.36
[32m[1m   Installed[22m[39m SpecialFunctions ───── v2.3.1
[32m[1m   Installed[22m[39m Preferences ────────── v1.4.0
[32m[1m   Installed[22m[39m StaticArrays ───────── v1.6.3
[32m[1m   Installed[22m[39m Revise ─────────────── v3.5.3
[32m[1m  No Changes[22m[39m to `~/.julia/scratchspaces/c3e4b0f8-55cb-11ea-2926-15256bba5781/pkg_envs/env_sqxydbsfum/Project.toml`
[32m[1m    Updating[22m[39m `~/.julia/scratchspaces/c3e4b0f8-55cb-11ea-2926-15256bba5781/pkg_envs/env_sqxydbsfum/Manifest.toml`
  [90m[05823500] [39m[93m↑ OpenLibm_jll v0.8.1+2 ⇒ v0.8.5+0[39m

[0m[1mInstantiating...[22m
[90m===[39m

[0m[1mPrecompiling...[22m
[90m===[39m
Waiting for notebook process to start... Done. Starting precompilation...
[92m[1mPrecompiling[22m[39m project...
BenchmarkTools
[0m[1mResolving...[22m
[90m===[39m
[32m[1m   Installed[22m[39m DiffRules ──────────── v1.15.1
[32m[1m   Installed[22m[39m DiffResults ────────── v1.1.0
[32m[1m   Installed[22m[39m CommonSubexpressions ─ v0.3.0
[32m[1m   Installed[22m[39m OpenSpecFun_jll ────── v0.5.5+0
[32m[1m   Installed[22m[39m ForwardDiff ────────── v0.10.36
[32m[1m   Installed[22m[39m SpecialFunctions ───── v2.3.1
[32m[1m   Installed[22m[39m Preferences ────────── v1.4.0
[32m[1m   Installed[22m[39m StaticArrays ───────── v1.6.3
[32m[1m   Installed[22m[39m Revise ─────────────── v3.5.3
[32m[1m  No Changes[22m[39m to `~/.julia/scratchspaces/c3e4b0f8-55cb-11ea-2926-15256bba5781/pkg_envs/env_sqxydbsfum/Project.toml`
[32m[1m    Updating[22m[39m `~/.julia/scratchspaces/c3e4b0f8-55cb-11ea-2926-15256bba5781/pkg_envs/env_sqxydbsfum/Manifest.toml`
  [90m[05823500] [39m[93m↑ OpenLibm_jll v0.8.1+2 ⇒ v0.8.5+0[39m

[0m[1mInstantiating...[22m
[90m===[39m

[0m[1mPrecompiling...[22m
[90m===[39m
Waiting for notebook process to start... Done. Starting precompilation...
[92m[1mPrecompiling[22m[39m project...
PlutoTeachingTools
[0m[1mResolving...[22m
[90m===[39m
[32m[1m   Installed[22m[39m DiffRules ──────────── v1.15.1
[32m[1m   Installed[22m[39m DiffResults ────────── v1.1.0
[32m[1m   Installed[22m[39m CommonSubexpressions ─ v0.3.0
[32m[1m   Installed[22m[39m OpenSpecFun_jll ────── v0.5.5+0
[32m[1m   Installed[22m[39m ForwardDiff ────────── v0.10.36
[32m[1m   Installed[22m[39m SpecialFunctions ───── v2.3.1
[32m[1m   Installed[22m[39m Preferences ────────── v1.4.0
[32m[1m   Installed[22m[39m StaticArrays ───────── v1.6.3
[32m[1m   Installed[22m[39m Revise ─────────────── v3.5.3
[32m[1m  No Changes[22m[39m to `~/.julia/scratchspaces/c3e4b0f8-55cb-11ea-2926-15256bba5781/pkg_envs/env_sqxydbsfum/Project.toml`
[32m[1m    Updating[22m[39m `~/.julia/scratchspaces/c3e4b0f8-55cb-11ea-2926-15256bba5781/pkg_envs/env_sqxydbsfum/Manifest.toml`
  [90m[05823500] [39m[93m↑ OpenLibm_jll v0.8.1+2 ⇒ v0.8.5+0[39m

[0m[1mInstantiating...[22m
[90m===[39m

[0m[1mPrecompiling...[22m
[90m===[39m
Waiting for notebook process to start... Done. Starting precompilation...
[92m[1mPrecompiling[22m[39m project...
enabled÷restart_recommended_msgrestart_required_msgbusy_packageswaiting_for_permission,waiting_for_permission_but_probably_disabled«cell_inputs $bf497b24-72a7-4a2f-908e-c24922a5f3c8cell_id$bf497b24-72a7-4a2f-908e-c24922a5f3c8codeufunction my_model_stable_specific(x::Float64,slope::Float64)
	if x>1.0
		return slope
	else
		return slope*x
	end
endmetadatashow_logsèdisabled®skip_as_script«code_folded$bdf99bf8-bb88-40d7-a8ec-84a99ab65ff3cell_id$bdf99bf8-bb88-40d7-a8ec-84a99ab65ff3code1@code_warntype func_with_barriers(obs,param_true)metadatashow_logsèdisabled®skip_as_script«code_folded$9d71d1b0-765d-48d7-a939-c951fc8caa67cell_id$9d71d1b0-765d-48d7-a939-c951fc8caa67code
md"""
**Interpretted languages:**
   + Loops are very slow
   + Usually worth creating extra arrays to avoid explicit loops
   + People often call operations on arrays "vectorized", even if every operation is done in serial

**Compiled languages:**  
   + Loops are fast.
   + Can choose whether to write a loop explicilty based on what's more intuitive for programmer and algorithm.
   + Using "vectorized" notation can unintentionally add unnecessary memory allocations...
       - if you don't use broadcasting and fusing   
"""metadatashow_logsèdisabled®skip_as_script«code_folded$8a97f0bf-3ada-4503-98a5-7bdeca15edc4cell_id$8a97f0bf-3ada-4503-98a5-7bdeca15edc4codebig_matrix = randn(100,100);metadatashow_logsèdisabled®skip_as_script«code_folded$f9d3d93f-f1c4-4b3b-aa8a-097f2c8aaf68cell_id$f9d3d93f-f1c4-4b3b-aa8a-097f2c8aaf68code2md"## Generic functions in terms of abstract type"metadatashow_logsèdisabled®skip_as_script«code_folded$3738748d-7b3d-4015-bf71-0ffb9e28c43dcell_id$3738748d-7b3d-4015-bf71-0ffb9e28c43dcodemd"""
### Peer Code Review
- Constructive suggestions for improving programming practices (1 point)
- Specific, constructive suggestions for improving code readability/documentation (1 point)
- Specific, constructive suggestions for improving tests and/or assertions (1 point)
- Specific, constructive suggestions for improving code modularity/organization/maintainability (1 point)
- Specific, constructive suggestions for improving code efficiency (1 point)
- Finding any bugs (if code author confirms) (bonus points?)
"""metadatashow_logsèdisabled®skip_as_script«code_folded$ac9b4f35-36fc-425b-a0a2-83fc32c62c7ccell_id$ac9b4f35-36fc-425b-a0a2-83fc32c62c7ccode"md"""
### Implementation details for code efficiency 
#### (assuming JIT languages)
- **Avoid unnecessary memory allocations**
  - Take advantage of *fusing* and *broadcasting*
  - Use `view` (e.g., `view(array,1:5,:)`) instead of copying  (`array[1:5,:]`)
  - Avoid many small allocations on heap (e.g., using `StaticArrays.jl`)
- **Avoid type instability**
  - Avoid untyped global variables
  - Avoid containers (e.g., arrays) of abstract types
  - Avoid abstract types for fields in `struct`s
  - Write type-stable functions
  
- Organize code into small functions (see function barriers)
- **Avoid inefficient data structures** (e.g., `Dict` when better choice avaliable)
- Adding annotations that enable/allow compiler optimizations (e.g., `@inbounds`, `@fastmath`, `@simd`, `@turbo`), but *only* when appropriate
- Avoid unnecessary use of strings or string interpolation
- Write code so that it can be parallelized in the future (see later labs)

See [Performance Tips](https://docs.julialang.org/en/v1/manual/performance-tips/) for more details.
"""metadatashow_logsèdisabled®skip_as_script«code_folded$f13e442e-771f-4aab-b5f3-f08c4e72229ccell_id$f13e442e-771f-4aab-b5f3-f08c4e72229ccodemd"""
## When to start parallelizing?
**Q:** 
How do you strike the balance between: 
- optimizing the serial version of your code and 
- optimizing your parallelization?

**A:** The added cost of moving data between processors makes it important to avoid unnecessary data movement.  One part of that is avoiding unnecessary memory allocations and using efficient data structures.  If the algorithm is well suited to parallelization, then a memory efficient serial version is much more likely to get good performancfe when parallelized. 

**Q:** Is it hard to tell when you should shift your focus to optimizing the other part?

**A:** Perhaps.  Although, it gets easier with experience.
"""
metadatashow_logsèdisabled®skip_as_script«code_folded$7b66fbe6-5f42-4619-a265-8d284d3dac8ccell_id$7b66fbe6-5f42-4619-a265-8d284d3dac8ccode>let
	pos = Coord(3,4)
	pos.x
	pos.y
	sqrt(pos.x^2+pos.y^2)
endmetadatashow_logsèdisabled®skip_as_script«code_folded$cf5262da-1043-11ec-12fc-9916cc70070ccell_id$cf5262da-1043-11ec-12fc-9916cc70070ccodeSmd"> Astro 528: High-Performance Scientific Computing for Astrophysics (Fall 2025)"metadatashow_logsèdisabled®skip_as_script«code_folded$2e32935f-c82f-434b-b0f5-01a4b15ddb80cell_id$2e32935f-c82f-434b-b0f5-01a4b15ddb80code#md"## Containers of Abstract Types"metadatashow_logsèdisabled®skip_as_script«code_folded$46d264b6-73da-4790-92e4-988728c7e1dfcell_id$46d264b6-73da-4790-92e4-988728c7e1dfcodeٮmd"""
If you pass a data structure that's stored in the heap, then only a pointer (or something that acts like a pointer/reference) to that data is placed on the stack.  
"""metadatashow_logsèdisabled®skip_as_script«code_folded$3d06ed43-23c2-4c57-a1a5-e699713b9506cell_id$3d06ed43-23c2-4c57-a1a5-e699713b9506codeblockquote(md"""
According to the performance tips, it seems that using global variables leads to bad performance, and it is better to pass arguments to functions. When should one be using global variables then?
""")metadatashow_logsèdisabled®skip_as_script«code_folded$248c85d4-bcac-40a4-9052-1f72a62422edcell_id$248c85d4-bcac-40a4-9052-1f72a62422edcodeabstract type AbstractCoord endmetadatashow_logsèdisabled®skip_as_script«code_folded$55af3d38-8956-4a22-8ca6-dbbb7de1b426cell_id$55af3d38-8956-4a22-8ca6-dbbb7de1b426code integrate_f(x->sin(x)^2/π,0,π)metadatashow_logsèdisabled®skip_as_script«code_folded$c8a7838a-8f1a-4f33-a9de-48e60992d08bcell_id$c8a7838a-8f1a-4f33-a9de-48e60992d08bcodeYbegin
	vec_c1 = fill(c1,n)
	vec_c2 = fill(c2,n)
	@benchmark distance($vec_c1,$vec_c2)
endmetadatashow_logsèdisabled®skip_as_script«code_folded$fa1f963d-d674-442f-aa32-fcee86a8c058cell_id$fa1f963d-d674-442f-aa32-fcee86a8c058code*md"""
# What operations are expensive?
"""metadatashow_logsèdisabled®skip_as_script«code_folded$6985f2d5-6c71-4289-b655-ec06754f85c4cell_id$6985f2d5-6c71-4289-b655-ec06754f85c4codeFstruct PolarCoord <: AbstractCoord
   r::Float64
   theta::Float64
endmetadatashow_logsèdisabled®skip_as_script«code_folded$c949701e-3399-44d8-9041-4dcb99c78cdacell_id$c949701e-3399-44d8-9041-4dcb99c78cdacodeblockquote(md"""I've been told to eliminate for loops wherever possible when writing Python/R/IDL code.  In constrast, when writing Julia/C/C++/Fortran/Java `for` loops are not detrimental. 

Why is this?""")metadatashow_logsèdisabled®skip_as_script«code_folded$ae709a34-9244-44ee-a004-381fc9b6cd0ccell_id$ae709a34-9244-44ee-a004-381fc9b6cd0ccode:md"ToC on side $(@bind toc_aside CheckBox(;default=true))"metadatashow_logsèdisabled®skip_as_script«code_folded$ba8781e6-5c7e-4aaf-8ccd-da3fc6210ec5cell_id$ba8781e6-5c7e-4aaf-8ccd-da3fc6210ec5code$func_takes_varargs([i for i in 1:3])metadatashow_logsèdisabled®skip_as_script«code_folded$24a2ae54-a11d-42da-980c-1f4c78daf4b4cell_id$24a2ae54-a11d-42da-980c-1f4c78daf4b4code1let
	pos = Coord(3,4)
	x(pos)
	y(pos)
	r(pos)
endmetadatashow_logsèdisabled®skip_as_script«code_folded$3ac9ad42-7bf1-4b36-9e0b-53f3f60796b1cell_id$3ac9ad42-7bf1-4b36-9e0b-53f3f60796b1codeٍmd"""
## Types of elements in collections
**Q:** Does Julia automatically assume the whole array is of that type to optimize performance?
"""metadatashow_logsèdisabled®skip_as_script«code_folded$c1628685-c357-436f-83dd-bf19bde24964cell_id$c1628685-c357-436f-83dd-bf19bde24964codemd"""
## Function barriers
"""metadatashow_logsèdisabled®skip_as_script«code_folded$d35aa76c-b4e6-45f8-a4e3-ba37d674db82cell_id$d35aa76c-b4e6-45f8-a4e3-ba37d674db82codemd"# Helper Code"metadatashow_logsèdisabled®skip_as_script«code_folded$fa116847-4bac-41e6-bd6e-e01c5c7234aecell_id$fa116847-4bac-41e6-bd6e-e01c5c7234aecodemd"""
### Cost of common operations
$(RobustLocalResource("http://ithare.com/wp-content/uploads/part101_infographics_v08.png", "part101_infographics_v08.png"))
- Credit:  [ithare.com](http://ithare.com/wp-content/uploads/part101_infographics_v08.png)
"""metadatashow_logsèdisabled®skip_as_script«code_folded$96998f54-9f66-48fe-b808-559276667054cell_id$96998f54-9f66-48fe-b808-559276667054code9f_fused_explicitly(x) = 3 .* x.^2 .+ 4 .* x .+ 7 .* x.^3;metadatashow_logsèdisabled®skip_as_script«code_folded$f79de8d4-537e-421f-a66d-41bc79f8f12fcell_id$f79de8d4-537e-421f-a66d-41bc79f8f12fcodemd"## No Programming Interface"metadatashow_logsèdisabled®skip_as_script«code_folded$11c29d50-1975-48cc-b1c5-dd3814128e86cell_id$11c29d50-1975-48cc-b1c5-dd3814128e86codef(x) = 3x.^2 + 4x + 7x.^3;metadatashow_logsèdisabled®skip_as_script«code_folded$05d2780e-612c-4e86-93c4-f57734f49c74cell_id$05d2780e-612c-4e86-93c4-f57734f49c74codeٔfunction func_with_barriers(obs, param)
	if param < 1
		pred = param .* obs
	else
		pred = floor.(Int64,param .* obs)
	end
	calc_χ²(obs, pred)
endmetadatashow_logsèdisabled®skip_as_script«code_folded$9122bdf0-c0b9-4966-8933-00a40562393acell_id$9122bdf0-c0b9-4966-8933-00a40562393acodeٻmd"""
For mathematical functions, results will differ from one processor to another.  So I suggest you benchmark code yourself **on the machine you plan to run on once you scale up**.
"""metadatashow_logsèdisabled®skip_as_script«code_folded$1cf69f4d-04db-4c3a-897a-a1da9e46b88ccell_id$1cf69f4d-04db-4c3a-897a-a1da9e46b88ccodeblockquote(md"""
If you know your code is going to require `for` loops/nested `for` loops, is Julia just always going to be better than, for instance, Python? 

Is there any case where the gains in optimization are marginal (especially for long runtimes)?
""")metadatashow_logsèdisabled®skip_as_script«code_folded$db388c8a-ddb3-47a6-8ce0-586d9f9602b9cell_id$db388c8a-ddb3-47a6-8ce0-586d9f9602b9code7@benchmark func_with_type_instability($obs,$param_true)metadatashow_logsèdisabled®skip_as_script«code_folded$624e8936-de28-4e09-9a4e-3ef2f6c7d9b0cell_id$624e8936-de28-4e09-9a4e-3ef2f6c7d9b0codeقbegin
	using PlutoUI, PlutoTest, PlutoTeachingTools
	using BenchmarkTools
	using ForwardDiff
	using StaticArrays
	#using Plots
endmetadatashow_logsèdisabled®skip_as_script«code_folded$dfe5dcd7-9b62-4690-ac21-0930b3e4145ccell_id$dfe5dcd7-9b62-4690-ac21-0930b3e4145ccode<@benchmark func_without_type_instability_v2($obs,param_true)metadatashow_logsèdisabled®skip_as_script«code_folded$208bf525-447d-4726-b67c-c3b968b415b8cell_id$208bf525-447d-4726-b67c-c3b968b415b8codemd"""
### Rubric for Serial version of Code
- Code performs proposed tasks (1 point)
- Comprehensive set of unit tests, at least one integration or regression test (1 point)
- Code passes tests (1 point)
- Student code uses a version control system effectively (1 point)
- Repository includes many regular, small commits (1 point)
- Documentation for functions’ purpose and design (1 point)
- Comprehensive set of assertions (1 point)
- Variable/function names consistent, distinctive & meaningful (1 point)
- Useful & consistent code formatting & style (1 point)
- Code is modular, rather than having chunks of same code copied and pasted (1 point)
"""metadatashow_logsèdisabled®skip_as_script«code_folded$c92d49d3-e8fc-4288-9ce2-3e617fc5c306cell_id$c92d49d3-e8fc-4288-9ce2-3e617fc5c306codedistance(c1,p1)metadatashow_logsèdisabled®skip_as_script«code_folded$aa767f81-4bcb-41b6-b141-85796a81d8fbcell_id$aa767f81-4bcb-41b6-b141-85796a81d8fbcode6@test_broken my_model_stable_specific.(obs,param_true)metadatashow_logsèdisabled®skip_as_script«code_folded$b2ac3b2c-31c7-4e64-9009-47ac03e38afbcell_id$b2ac3b2c-31c7-4e64-9009-47ac03e38afbcode%md"""
# Loops and "Vectorization"
"""metadatashow_logsèdisabled®skip_as_script«code_folded$495b281e-f4c9-4f55-bf5a-9a8d7f43044ccell_id$495b281e-f4c9-4f55-bf5a-9a8d7f43044ccode/md"""
### Making inner function type-stable
"""metadatashow_logsèdisabled®skip_as_script«code_folded$be38f44f-9ce4-433a-84ef-782e5d8a4822cell_id$be38f44f-9ce4-433a-84ef-782e5d8a4822codedistance(c1,c1)metadatashow_logsèdisabled®skip_as_script«code_folded$11e60eb5-980d-4d3d-8f09-03390584aaadcell_id$11e60eb5-980d-4d3d-8f09-03390584aaadcode,f_fused_with_macro(x) = @. 3x^2 + 4x + 7x^3;metadatashow_logsèdisabled®skip_as_script«code_folded$957519f4-a669-472a-bc81-ecd0dcce9842cell_id$957519f4-a669-472a-bc81-ecd0dcce9842codeAlet  n = 100;  x = rand(n); y = rand(n);	@benchmark ($x.*$y)  endmetadatashow_logsèdisabled®skip_as_script«code_folded$1b548d59-f18e-4cfc-9667-472c427d7cc2cell_id$1b548d59-f18e-4cfc-9667-472c427d7cc2codebegin
	x(p::CartesianCoord) = p.x
	y(p::CartesianCoord) = p.y
	r(p::CartesianCoord) = sqrt(x(p)^2+y(p)^2)
	theta(p::CartesianCoord) = atan(y(p),x(p))

	x(p::PolarCoord) = p.r*cos(p.theta)
	y(p::PolarCoord) = p.r*sin(p.theta)
	r(p::PolarCoord) = p.r
	theta(p::PolarCoord) = p.theta
end;metadatashow_logsèdisabled®skip_as_script«code_folded$cee02d24-1dcc-4c29-a322-0ddd12ab8180cell_id$cee02d24-1dcc-4c29-a322-0ddd12ab8180codeH@test_nowarn my_model_stable_specific.(obs,convert(Float64,param_true));metadatashow_logsèdisabled®skip_as_script«code_folded$e1ec523b-3c2f-447d-8b71-063dc5955f45cell_id$e1ec523b-3c2f-447d-8b71-063dc5955f45code,md"""
### Why would you want to do that?
"""metadatashow_logsèdisabled®skip_as_script«code_folded$279df4ae-a0e2-4838-8a9c-3ff82245935ecell_id$279df4ae-a0e2-4838-8a9c-3ff82245935ecodemd"""
For small programs called many times, consider making a **sysimage** using [PackageCompiler.jl](https://julialang.github.io/PackageCompiler.jl/stable/sysimages.html) to avoid  compilation cost each time.
"""metadatashow_logsèdisabled®skip_as_script«code_folded$9ec9429d-c1f1-4845-a514-9c88b452071fcell_id$9ec9429d-c1f1-4845-a514-9c88b452071fcodeWidthOverDocs()metadatashow_logsèdisabled®skip_as_script«code_folded$f3937141-49f4-49f2-8bcf-0f4e9c204d24cell_id$f3937141-49f4-49f2-8bcf-0f4e9c204d24code9@code_warntype func_with_type_instability(obs,param_true)metadatashow_logsèdisabled®skip_as_script«code_folded$047835eb-6bcc-4f32-b991-5ccccbf34cb9cell_id$047835eb-6bcc-4f32-b991-5ccccbf34cb9code array_of_reals = Real[1.0, 2, 3]metadatashow_logsèdisabled®skip_as_script«code_folded$e1996c2f-5298-48c9-a29c-852bd37b54c4cell_id$e1996c2f-5298-48c9-a29c-852bd37b54c4codebigvector = rand(8*10^6);metadatashow_logsèdisabled®skip_as_script«code_folded$59fbb599-c947-4a2a-a678-8e38a666660ccell_id$59fbb599-c947-4a2a-a678-8e38a666660ccode)@time col_one_view = view(big_matrix,:,1)metadatashow_logsèdisabled®skip_as_script«code_folded$e80e73cc-fb81-4222-8fcd-a9c4aaf6326ecell_id$e80e73cc-fb81-4222-8fcd-a9c4aaf6326ecode:@benchmark func_without_type_instability($obs,$param_true)metadatashow_logsèdisabled®skip_as_script«code_folded$8f4b3c77-e79f-457a-b9e9-9f30dd1f526acell_id$8f4b3c77-e79f-457a-b9e9-9f30dd1f526acodeOmd"It can store an array of abstract types, but that can be quite inefficient."metadatashow_logsèdisabled®skip_as_script«code_folded$79783bcb-fe34-4c9d-af08-7a82c851beeccell_id$79783bcb-fe34-4c9d-af08-7a82c851beeccodeMmd"""
### Writing functions that can take an unknown number of arguements
"""metadatashow_logsèdisabled®skip_as_script«code_folded$18813a15-531f-4d74-a0f7-45a0574d6c1bcell_id$18813a15-531f-4d74-a0f7-45a0574d6c1bcode'@time col_one_copied = big_matrix[:,:1]metadatashow_logsèdisabled®skip_as_script«code_folded$d58ee47e-10df-4d8c-aad3-ae755a5024e4cell_id$d58ee47e-10df-4d8c-aad3-ae755a5024e4code
metadatashow_logsèdisabled®skip_as_script«code_folded$b243656e-2eec-4650-adbe-5ca8a712d5d6cell_id$b243656e-2eec-4650-adbe-5ca8a712d5d6codeOblockquote(md"""
How should we decide whether to inline a function or not?
""")metadatashow_logsèdisabled®skip_as_script«code_folded$bd011001-07cb-4f74-9c69-8f91945e2cbfcell_id$bd011001-07cb-4f74-9c69-8f91945e2cbfcodeblockquote(md"""
I thought [using many smaller functions] would take longer since the program needs to go somewhere else. 
""")metadatashow_logsèdisabled®skip_as_script«code_folded$77e28f2e-d53a-4dd7-938e-5d95bac81db1cell_id$77e28f2e-d53a-4dd7-938e-5d95bac81db1codearray_of_float64s = [1.0, 2, 3]metadatashow_logsèdisabled®skip_as_script«code_folded$64fc3013-09e3-4f95-a3f4-20138125e71bcell_id$64fc3013-09e3-4f95-a3f4-20138125e71bcodemd"""
- Small functions that will be called many times (e.g., inside a loop) → want to inline
- Large functions or functions that will only be called a few times → little benefit to inlining 
- Modern languages/compilers will typically decide for you based on some simple heuristics to guess the typical cost of executing the function.
- You can provide a **hint** encouraging or discouraging the compiler from inlining code. (`@inline` or `@noinline`)
"""metadatashow_logsèdisabled®skip_as_script«code_folded$b7c23b8b-aaca-41b0-8397-ad2300eeda50cell_id$b7c23b8b-aaca-41b0-8397-ad2300eeda50codemd"""
# Old Q&A
"""metadatashow_logsèdisabled®skip_as_script«code_folded$fd3c57f9-1f47-4e3e-91ee-b05911f992eecell_id$fd3c57f9-1f47-4e3e-91ee-b05911f992eecodefblockquote(md"""
When optimizing code, what typically has the most impact on decreasing run time?
""")metadatashow_logsèdisabled®skip_as_script«code_folded$31debff2-3667-4631-bff5-e95cf107ae9acell_id$31debff2-3667-4631-bff5-e95cf107ae9acode!array_of_anys = [1.0, 2, "three"]metadatashow_logsèdisabled®skip_as_script«code_folded$783e926f-91a2-4ded-a21b-ae27fa3bc4d8cell_id$783e926f-91a2-4ded-a21b-ae27fa3bc4d8codefunction calc_χ²(obs::AbstractVector, pred::AbstractVector)
	@assert length(obs) == length(pred)
	n = length(obs)
	χ² = zero(promote_type(eltype(obs),eltype(pred)))
	@simd for i in 1:n
		@inbounds χ² += (obs[i]-pred[i])^2		
	end
	return χ²
endmetadatashow_logsèdisabled®skip_as_script«code_folded$d6147ce2-b3ec-45f0-ba90-2c453a719548cell_id$d6147ce2-b3ec-45f0-ba90-2c453a719548codemd"""
## Inlining code
"""metadatashow_logsèdisabled®skip_as_script«code_folded$1969217c-24be-47e2-9853-b70cf4d5565dcell_id$1969217c-24be-47e2-9853-b70cf4d5565dcode*md"## Overloading Functions for each Type"metadatashow_logsèdisabled®skip_as_script«code_folded$20db6ae9-8c79-44d1-a3a7-0dadf1d0dc5acell_id$20db6ae9-8c79-44d1-a3a7-0dadf1d0dc5acodeٔfunction func_without_type_instability_v2(obs, param)
	pred = my_model_stable_specific.(obs,convert(Float64,param))
	χ² = calc_χ²(obs, pred)
endmetadatashow_logsèdisabled®skip_as_script«code_folded$d0429b82-7e78-4a18-97bb-e34ba370e024cell_id$d0429b82-7e78-4a18-97bb-e34ba370e024codebegin
	n = 1000
	vec_abs_c1 = Vector{AbstractCoord}(undef,n)
	vec_abs_c2 = Vector{AbstractCoord}(undef,n)
	for i in 1:n
		vec_abs_c1[i] = c1
		vec_abs_c2[i] = c2
	end
	@benchmark distance($vec_abs_c1,$vec_abs_c2)
endmetadatashow_logsèdisabled®skip_as_script«code_folded$94223079-afab-4a6d-a126-068a4e94f52ecell_id$94223079-afab-4a6d-a126-068a4e94f52ecode+struct Coord
   	x::Float64
	y::Float64
endmetadatashow_logsèdisabled®skip_as_script«code_folded$d3d085e6-67b5-4286-b66d-120720e1002dcell_id$d3d085e6-67b5-4286-b66d-120720e1002dcodeCmd"""
# Preping for Code Review
## Make it easy for your reviewer
- Provide overview of what your code is doing in README.md
- Where should they start?
- What files should they focus on?
- What files should they ignore?
- Include an example of how to run/use code

## Make it easy for you
As code starts getting larger, then
- Move code out of notebooks and into `.jl` files, as functions mature.
- Organize similar functions into `.jl` files in `src` directory
- Use diretories like `examples`, `test`
- If/when appropiate add more directories (e.g., `data`, `deps`, `docs`)
"""metadatashow_logsèdisabled®skip_as_script«code_folded$e7227a20-3d2d-4907-b9a6-422c0d4ab57acell_id$e7227a20-3d2d-4907-b9a6-422c0d4ab57acodeوfunction distance(a::Array{AbstractCoord}, b::Array{AbstractCoord})
   dx = x.(a)-x.(b)
   dy = y.(a)-y.(b)
   sqrt.(dx.^2 .+ dy.^2)
endmetadatashow_logsèdisabled®skip_as_script«code_folded$348ee204-546f-46c5-bf5d-7d4a761002eccell_id$348ee204-546f-46c5-bf5d-7d4a761002eccode"md"""
# Optimizing Serial Code
"""metadatashow_logsèdisabled®skip_as_script«code_folded$170f2bd0-bb5b-4e78-b92b-dfa8d47aded0cell_id$170f2bd0-bb5b-4e78-b92b-dfa8d47aded0code2@benchmark func_without_barriers($obs,$param_true)metadatashow_logsèdisabled®skip_as_script«code_folded$a9cf77ec-434e-4477-a844-9f8b9199589fcell_id$a9cf77ec-434e-4477-a844-9f8b9199589fcode-array_of_float_or_missing = [1.0, missing, 3]metadatashow_logsèdisabled®skip_as_script«code_folded$781ef824-a235-46ce-accd-362f2e963550cell_id$781ef824-a235-46ce-accd-362f2e963550code)@benchmark f_fused_explicitly($bigvector)metadatashow_logsèdisabled®skip_as_script«code_folded$46cd3a5f-3358-4f21-91c7-82c544bc4353cell_id$46cd3a5f-3358-4f21-91c7-82c544bc4353codemd"""
- Typically... yes.
- Always... no.  E.g., if runtime is dominated by time to read data from the internet/network/disk.  Then, the cost of accessing the data the first time may be so large that the benefits of computing more efficiently are negligible.
"""metadatashow_logsèdisabled®skip_as_script«code_folded$73b01b03-2016-4253-8f95-e0bdb3bca5f4cell_id$73b01b03-2016-4253-8f95-e0bdb3bca5f4codemd"**Yes!**"metadatashow_logsèdisabled®skip_as_script«code_folded$5c5f9760-695f-4fa2-b4a6-8a878ab97ea6cell_id$5c5f9760-695f-4fa2-b4a6-8a878ab97ea6codemd"""
**A:** Easy answer... Never

Reality:
- You're writing disposable code
- You're working with some preexisting code that wasn't designed to do what you want and you want to try something quickly before implementing it well.
- Other examples?
"""metadatashow_logsèdisabled®skip_as_script«code_folded$e04666f8-801b-4973-9b9e-807abc5199b7cell_id$e04666f8-801b-4973-9b9e-807abc5199b7code٠function distance(a::Array{T1},b::Array{T2}) where { T1<:AbstractCoord, T2<:AbstractCoord}
   dx = x.(a)-x.(b)
   dy = y.(a)-y.(b)
   sqrt.(dx.^2 .+ dy.^2)
end;metadatashow_logsèdisabled®skip_as_script«code_folded$08d25c7e-907b-403d-b08d-27ca4efcd958cell_id$08d25c7e-907b-403d-b08d-27ca4efcd958codefunction func_without_barriers(obs, param)
	if param < 1
		pred = param .* obs
	else
		pred = floor.(Int64,param .* obs)
	end
	n = length(obs)				  
	χ² = zero(promote_type(eltype(obs),eltype(pred)))
	@simd for i in 1:n
		@inbounds χ² += (obs[i]-pred[i])^2		
	end
	return χ²
endmetadatashow_logsèdisabled®skip_as_script«code_folded$d2e1b3c3-3a81-44cd-a57b-fd9c29badce4cell_id$d2e1b3c3-3a81-44cd-a57b-fd9c29badce4codemd"""
```shell
> julia -h

  -O, --optimize={0,1,2*,3}     Set the optimization level
  --min-optlevel={0*,1,2,3}     Set a lower bound on the optimization level             
  -J, --sysimage <file>         Start up with the given system image file

  -t, --threads {auto|N[,auto|M]}    
  -p, --procs {N|auto}       

  -g, --debug-info=[{0,1*,2}]   Set the level of debug info generation  
  --check-bounds={yes|no|auto*} auto respects @inbounds declarations
  --math-mode={ieee|user*}      user respects `@fastmath` declarations
```


"""metadatashow_logsèdisabled®skip_as_script«code_folded$dc23159c-95ca-466d-9cbe-23bb0448d134cell_id$dc23159c-95ca-466d-9cbe-23bb0448d134code0md"""
## Peer Review Logistics
- Access
   - I'll send you GitHub ID of peer reviewer(s)
   - Make sure reviewer(s) can access your repo
     + If your project repo is private: `Settings`, `Collaborators & Teams`, `Add people`, `Read`, `Add Selection`.
     + Or make your project repo public:  `Settings`, `Change Visibility`, plus multiple multiple steps to confirm.
   - Make sure you can access repo to review

- If using Jupyter notebooks, make sure to add Markdown version of code for getting feedback. 
```julia
julia -e 'import Pkg; Pkg.add("Weave"); using Weave; convert_doc("NOTEBOOK_NAME.ipynb","NOTEBOOK_NAME.jmd")'
```
- [Review instructions](https://psuastro528.github.io/Fall2025/project/code_reviews/how_to/)
- Provide most feedback via [GitHub Issues](https://guides.github.com/features/issues/)
"""metadatashow_logsèdisabled®skip_as_script«code_folded$404c0658-ae86-457a-adc3-4ef69bb43ac8cell_id$404c0658-ae86-457a-adc3-4ef69bb43ac8codeٔfunction integrate_f(f::Function, a::Real, b::Real; n::Integer = 100, kwargs...)
	x = range(a,stop=b, length=n)
	sum(f.(x; kwargs...)) * (b-a)/n
endmetadatashow_logsèdisabled®skip_as_script«code_folded$3bf761b6-132b-43fa-aa41-b2e73ddce94bcell_id$3bf761b6-132b-43fa-aa41-b2e73ddce94bcode(md"""
# Avoiding copying using views
"""metadatashow_logsèdisabled®skip_as_script«code_folded$b7fbdc93-4c8b-4222-98e3-62fa7e726e2fcell_id$b7fbdc93-4c8b-4222-98e3-62fa7e726e2fcodemd"""
# Type Instability
"""metadatashow_logsèdisabled®skip_as_script«code_folded$febc6f64-0d39-4206-8475-e6324973284fcell_id$febc6f64-0d39-4206-8475-e6324973284fcode(md"""
### When use global variables?
"""metadatashow_logsèdisabled®skip_as_script«code_folded$b556927c-ab72-41c5-9a3e-83756e40550acell_id$b556927c-ab72-41c5-9a3e-83756e40550acodeٽblockquote(md"What type of variables should always be passed to an inline function versus an external module (maybe large arrays/tables?) so they don't take up too much room on the stack?")metadatashow_logsèdisabled®skip_as_script«code_folded$9e8cb539-5d69-4552-87e4-88fe61ab1fbecell_id$9e8cb539-5d69-4552-87e4-88fe61ab1fbecodeqbegin
	x(p::Coord) = p.x
	y(p::Coord) = p.y
	r(p::Coord) = sqrt(p.x^2+p.y^2)
	theta(p::Coord) = atan(p.y,p.x)
endmetadatashow_logsèdisabled®skip_as_script«code_folded$fbd538a3-8ddc-4c3f-9748-35fa7b032809cell_id$fbd538a3-8ddc-4c3f-9748-35fa7b032809code4@code_warntype func_without_barriers(obs,param_true)metadatashow_logsèdisabled®skip_as_script«code_folded$0f679916-5f87-45a3-996f-be3146a537a2cell_id$0f679916-5f87-45a3-996f-be3146a537a2codezfunction func_without_type_instability_v3(obs, param)
	pred = my_model_stable.(obs,param)
	χ² = calc_χ²(obs, pred)
endmetadatashow_logsèdisabled®skip_as_script«code_folded$252f394f-9d7d-41be-8cbf-ccb5558b83d1cell_id$252f394f-9d7d-41be-8cbf-ccb5558b83d1codemd"""
## How do we know where do we spend our time?

**Q:** How do we know where to focus our efforts based on the coding language we're using?

- Profiling
- Experience with common programming patterns
- Knowing (enough about) how your language works under the hood
"""metadatashow_logsèdisabled®skip_as_script«code_folded$7e466eb6-9b5f-4e9f-90e2-be11fb66d557cell_id$7e466eb6-9b5f-4e9f-90e2-be11fb66d557codedistance(c1,p2)metadatashow_logsèdisabled®skip_as_script«code_folded$288d3aaf-ee71-44f5-aefb-4b7b787c7caacell_id$288d3aaf-ee71-44f5-aefb-4b7b787c7caacodebblockquote(md"""Is it best to make sure that all cells of your array have the same data type?
""")metadatashow_logsèdisabled®skip_as_script«code_folded$8446120e-5bac-4b8e-bc86-836f773f79a0cell_id$8446120e-5bac-4b8e-bc86-836f773f79a0code6let
  pos_xy = [rand(), rand() ]
  atan(pos_xy...)
endmetadatashow_logsèdisabled®skip_as_script«code_folded$c16a95ce-2926-4d99-a907-71c95f32c042cell_id$c16a95ce-2926-4d99-a907-71c95f32c042codeNbegin
	c1 = CartesianCoord(0,3)
	c2 = CartesianCoord(4,0)
	distance(c1,c2)
endmetadatashow_logsèdisabled®skip_as_script«code_folded$8e3ba95e-7c10-4e95-95cb-a906259282fccell_id$8e3ba95e-7c10-4e95-95cb-a906259282fccode:md"""
### Making inner funciton type-stable & generic 
"""metadatashow_logsèdisabled®skip_as_script«code_folded$93beb233-81cc-47f8-89be-8164cc15d020cell_id$93beb233-81cc-47f8-89be-8164cc15d020code#md"## Containers of Concrete Types"metadatashow_logsèdisabled®skip_as_script«code_folded$e6e22f60-4e6a-4160-ba06-42d469afb3f6cell_id$e6e22f60-4e6a-4160-ba06-42d469afb3f6codemd"""
## What's expensive?
"""metadatashow_logsèdisabled®skip_as_script«code_folded$f5fe37e1-80b9-4853-84d6-82e56417a470cell_id$f5fe37e1-80b9-4853-84d6-82e56417a470code.function func_takes_varargs(x...)
	@info x
endmetadatashow_logsèdisabled®skip_as_script«code_folded$8f846ea8-9c6e-499b-bfd8-18bdbbd110f7cell_id$8f846ea8-9c6e-499b-bfd8-18bdbbd110f7codeFlet	n = 100;  x = rand(n);  y = rand(n);  @benchmark atan.($x,$y)  endmetadatashow_logsèdisabled®skip_as_script«code_folded$21e3dc92-82c9-4486-8980-d5e6a012afeccell_id$21e3dc92-82c9-4486-8980-d5e6a012afeccodefunc_takes_varargs(1)metadatashow_logsèdisabled®skip_as_script«code_folded$365c43af-37a3-4f0c-8e9e-d4003c47b6a3cell_id$365c43af-37a3-4f0c-8e9e-d4003c47b6a3code!md"## With Programming Interface"metadatashow_logsèdisabled®skip_as_script«code_folded$9850f52c-7209-4ba0-9298-942d68947b9ecell_id$9850f52c-7209-4ba0-9298-942d68947b9ecode٧blockquote(md"""
Could you elaborate on the "..." operator that is used within functions and function arguments? How does this contribute to improved performance?
""")metadatashow_logsèdisabled®skip_as_script«code_folded$1fd8655d-8065-4945-acef-7774ed882d51cell_id$1fd8655d-8065-4945-acef-7774ed882d51codeٽbegin
	struct CoordAlt
   		r::Float64
	   	theta::Float64
	end
	x(p::CoordAlt) = p.r*cos(p.theta)
	y(p::CoordAlt) = p.r*sin(p.theta)
	r(p::CoordAlt) = p.r
	theta(p::CoordAlt) = p.theta
endmetadatashow_logsèdisabled®skip_as_script«code_folded$0913de40-9fa0-44db-9b2c-9bd93db31790cell_id$0913de40-9fa0-44db-9b2c-9bd93db31790codeلfunction distance( a::AbstractCoord, b::AbstractCoord )
	   dx = x(a) - x(b)
   	   dy = y(a) - y(b)
   	   sqrt( dx^2 + dy^2 )
end;metadatashow_logsèdisabled®skip_as_script«code_folded$28b53ea4-5bdc-4ac2-b83e-bcb8f0a6416ccell_id$28b53ea4-5bdc-4ac2-b83e-bcb8f0a6416ccode}blockquote(md"""
How does Julia compile data into arrays efficiently if the array contains multiple different data types?""")metadatashow_logsèdisabled®skip_as_script«code_folded$9303806b-a460-4ec2-9f71-252f43b34328cell_id$9303806b-a460-4ec2-9f71-252f43b34328codeٚbegin
	x_in = rand(16*1024)
	param_true = 2
	obs = my_model.(x_in, param_true) .+ 0.01 .* randn(length(x_in))
	func_without_barriers(obs, param_true)
end;metadatashow_logsèdisabled®skip_as_script«code_folded$9e8035cd-c5ba-47c7-8567-1279e666c4fccell_id$9e8035cd-c5ba-47c7-8567-1279e666c4fccode$func_takes_varnamedargs(;a="a", b=2)metadatashow_logsèdisabled®skip_as_script«code_folded$426ccd5e-398b-4df7-a27d-cf7a578c658fcell_id$426ccd5e-398b-4df7-a27d-cf7a578c658fcode)@time row_one_view = view(big_matrix,1,:)metadatashow_logsèdisabled®skip_as_script«code_folded$82883c5d-db3d-4293-bf74-a6e36552a125cell_id$82883c5d-db3d-4293-bf74-a6e36552a125code٥function my_model_stable(x,slope)
	out_type = promote_type(typeof(x),typeof(slope))
	if x>one(slope)
		return convert(out_type,slope)
	else
		return slope*x
	end
endmetadatashow_logsèdisabled®skip_as_script«code_folded$c6460feb-67f0-4028-8b05-e195a8c2bd41cell_id$c6460feb-67f0-4028-8b05-e195a8c2bd41codemd"""
### Big picture steps to efficiency:
- Use a compiled language
- Use a strongly-typed language
- Choose of algorithms wisely
- Choose data types wisely
- Avoid unnecessary memory allocations
- Arrange memory accesses to reduce cache misses
"""metadatashow_logsèdisabled®skip_as_script«code_folded$44c5243c-a044-4ed7-bf25-728b0291c14acell_id$44c5243c-a044-4ed7-bf25-728b0291c14acode#md"## Why a Programming Interface?"metadatashow_logsèdisabled®skip_as_script«code_folded$e7d4bc52-ee18-4d0b-8bab-591b688398fecell_id$e7d4bc52-ee18-4d0b-8bab-591b688398fecode TableOfContents(aside=toc_aside)metadatashow_logsèdisabled®skip_as_script«code_folded$b1557899-91c0-4f02-b486-e3c4f38d9218cell_id$b1557899-91c0-4f02-b486-e3c4f38d9218code7let  n = 100;  x = rand(n);  @benchmark sqrt.($x);  endmetadatashow_logsèdisabled®skip_as_script«code_folded$e7b56266-5d70-451b-a448-6b6cfd85cab7cell_id$e7b56266-5d70-451b-a448-6b6cfd85cab7codefunc_takes_varargs(1,2,3)metadatashow_logsèdisabled®skip_as_script«code_folded$a1992b28-16ab-456b-995d-1e40e423d70ccell_id$a1992b28-16ab-456b-995d-1e40e423d70ccodeFstruct CartesianCoord <: AbstractCoord
   x::Float64
   y::Float64
endmetadatashow_logsèdisabled®skip_as_script«code_folded$4b7b8ef8-e7c4-415b-a103-e109256e0210cell_id$4b7b8ef8-e7c4-415b-a103-e109256e0210codedistance(p1,p1)metadatashow_logsèdisabled®skip_as_script«code_folded$f658c638-8c9d-4828-ac15-ecd7d4650b13cell_id$f658c638-8c9d-4828-ac15-ecd7d4650b13code-md"""
# Command-line Optimization options
"""metadatashow_logsèdisabled®skip_as_script«code_folded$d5cb70a8-079b-4fd5-851f-8742680ff515cell_id$d5cb70a8-079b-4fd5-851f-8742680ff515codeقfunction func_without_type_instability(obs, param)
	pred = convert.(Float64,my_model.(obs,param))
	χ² = calc_χ²(obs, pred)
endmetadatashow_logsèdisabled®skip_as_script«code_folded$fad14e46-21a4-41ea-8f3d-a747cdfe3a51cell_id$fad14e46-21a4-41ea-8f3d-a747cdfe3a51codemfunction func_with_type_instability(obs, param)
	pred = my_model.(obs,param)
	χ² = calc_χ²(obs, pred)
endmetadatashow_logsèdisabled®skip_as_script«code_folded$d6a2b578-88a4-4a82-bb20-641ccc60aa8dcell_id$d6a2b578-88a4-4a82-bb20-641ccc60aa8dcodexmd"""
- There is a cost for calling a function.
- But small functions are usually inlined, so as to avoid that cost.
"""metadatashow_logsèdisabled®skip_as_script«code_folded$3fa48928-5311-49ec-83d2-cf4c45c7c579cell_id$3fa48928-5311-49ec-83d2-cf4c45c7c579code=md"""
## Splat and variable number of function arguements
"""metadatashow_logsèdisabled®skip_as_script«code_folded$04391eb3-daf0-4f20-b39e-33e626770e05cell_id$04391eb3-daf0-4f20-b39e-33e626770e05code=@benchmark func_without_type_instability_v3($obs,$param_true)metadatashow_logsèdisabled®skip_as_script«code_folded$953d09b8-d8d0-4e49-ae55-648f956aa248cell_id$953d09b8-d8d0-4e49-ae55-648f956aa248codedbegin
	p1 = PolarCoord( r(c1), theta(c1) )
	p2 = PolarCoord( r(c2), theta(c2) )
	distance(p1,p2)
endmetadatashow_logsèdisabled®skip_as_script«code_folded$3e8c154a-3c22-49cc-accd-1076430268aecell_id$3e8c154a-3c22-49cc-accd-1076430268aecode4function func_takes_varnamedargs(;x...)
	@info x
endmetadatashow_logsèdisabled®skip_as_script«code_folded$3ef73948-da0c-4afa-8a73-29c382b29bbdcell_id$3ef73948-da0c-4afa-8a73-29c382b29bbdcode/@benchmark func_with_barriers($obs,$param_true)metadatashow_logsèdisabled®skip_as_script«code_folded$15efacae-95a5-4607-8a38-76ee5f345235cell_id$15efacae-95a5-4607-8a38-76ee5f345235codemd"""
## Popouri
"""metadatashow_logsèdisabled®skip_as_script«code_folded$9007f240-c88e-46c4-993d-fd6b93d8b18dcell_id$9007f240-c88e-46c4-993d-fd6b93d8b18dcodemd"""
# Announcements
"""metadatashow_logsèdisabled®skip_as_script«code_folded$b24a684b-b2d1-4d6a-9408-590feef3ba08cell_id$b24a684b-b2d1-4d6a-9408-590feef3ba08codemd"## Abstract Types"metadatashow_logsèdisabled®skip_as_script«code_folded$282d2a07-5f63-4f3e-960e-b5ffcab6b9decell_id$282d2a07-5f63-4f3e-960e-b5ffcab6b9decode)@benchmark f_fused_with_macro($bigvector)metadatashow_logsèdisabled®skip_as_script«code_folded$9ab94eea-4d57-4ef2-a73a-64e7c8b89222cell_id$9ab94eea-4d57-4ef2-a73a-64e7c8b89222code2integrate_f(func_that_needs_parameters,0,π; θ=4)metadatashow_logsèdisabled®skip_as_script«code_folded$5d599c10-f1d2-454e-ad85-0e092b6cae7ecell_id$5d599c10-f1d2-454e-ad85-0e092b6cae7ecode<@code_warntype func_without_type_instability(obs,param_true)metadatashow_logsèdisabled®skip_as_script«code_folded$4c3332a8-a5d1-43fb-887b-ac66dfa02de5cell_id$4c3332a8-a5d1-43fb-887b-ac66dfa02de5codemd"# Programming Interfaces"metadatashow_logsèdisabled®skip_as_script«code_folded$31476473-d619-404c-a1c1-b32c1b8c5930cell_id$31476473-d619-404c-a1c1-b32c1b8c5930codeimd"""
# Class project
- Review feedback on project proposals 
- Review [project instructions and rubric](https://psuastro528.github.io/Fall2025/project/) on website
- Can continue using repository from project proposal
- Next step is the serial implementation, focusing on good practices that we've discussed/seen in labs
- Serial code should be ready for peer code review by **Oct 8**
- After this week's labs, will have everything you need to benchmark, profile and optimize the serial version of your code.
- Sign up for [project presentation schedule](https://github.com/PsuAstro528/PresentationsSchedule2025)
"""metadatashow_logsèdisabled®skip_as_script«code_folded$53863e96-0c11-484f-bfc9-23b52ca933decell_id$53863e96-0c11-484f-bfc9-23b52ca933decodeXmd"""
### Passing array of data to function that expects distinct function arguments
"""metadatashow_logsèdisabled®skip_as_script«code_folded$ccb63eb8-1da0-48ce-ae51-c18c48509445cell_id$ccb63eb8-1da0-48ce-ae51-c18c48509445codeJfunction func_that_needs_parameters(x::Real; θ::Real)
	sin(x/θ)^2/π
endmetadatashow_logsèdisabled®skip_as_script«code_folded$0363149b-f34d-4120-81db-a655f18b908fcell_id$0363149b-f34d-4120-81db-a655f18b908fcodemd"""
## Compiler Optimizations
**Q:**  How does Julia go about auto-optimizing simple computation time sinks like loops, nested loop, functions called many times in a loop, etc.

Whole courses on optimizing compilers, but a few categories that come to mind:
- Compilation
- Static type inference
- Inlining small functions
- Dead code elimination
- Unrolling small loops
- Grouping operations for SIMD
- ...

Advanced optimizations that require additional help:
- Precompiliation of functiosn to be used
- Empirical branch prediction 
"""metadatashow_logsèdisabled®skip_as_script«code_folded$b8e117f5-b253-4208-a00e-7966978fb24bcell_id$b8e117f5-b253-4208-a00e-7966978fb24bcodeQfunction my_model(x,slope)
	if x>1
		return slope
	else
		return slope*x
	end
endmetadatashow_logsèdisabled®skip_as_script«code_folded$02002957-8644-40ca-99ef-86151769a5d9cell_id$02002957-8644-40ca-99ef-86151769a5d9code&@time row_one_copied = big_matrix[1,:]metadatashow_logsèdisabled®skip_as_script«code_folded$12b8d696-0e7b-4814-9c73-22b7cf95fef4cell_id$12b8d696-0e7b-4814-9c73-22b7cf95fef4code@benchmark f($bigvector)metadatashow_logsèdisabled®skip_as_script«code_folded$9bf47a21-af6d-4c76-84d1-0b78635bae9acell_id$9bf47a21-af6d-4c76-84d1-0b78635bae9acode)md"## New Implementation, same interface"metadatashow_logsèdisabled®skip_as_script«code_folded$64d51527-1bd0-4010-b458-4dfa6f44610dcell_id$64d51527-1bd0-4010-b458-4dfa6f44610dcode%md"### Fusing broadcasted operations"metadatashow_logsèdisabled®skip_as_script«code_foldedënotebook_id$e76e6978-bfd9-11f0-1d27-c1e0c10829f4in_temp_dir¨metadata