 bondscell_results P$138806a6-08f9-4b82-9e8c-128baab3da31queued¤logsrunning¦outputbody"Success"mimetext/plainrootassigneelast_run_timestampAE)4Npersist_js_state·has_pluto_hook_features§cell_id$138806a6-08f9-4b82-9e8c-128baab3da31depends_on_disabled_cells§runtime,kpublished_object_keysdepends_on_skipped_cells§errored$ba5059bf-bdbb-4c35-b9e7-b7e90641dc94queued¤logsrunning¦outputbodyj<div class="markdown"><p>For numerical calculations, allocating storage space on the heap can be a significant cost.  Often, we do the same thing over and over, resulting in many allocations for outputs &#40;or temporay intermediate values&#41;.  Thus, there&#39;s an opportunity to allocate storage space once and reuse it in subsequent calculations.</p>
</div>mimetext/htmlrootassigneelast_run_timestampAE)[հpersist_js_state·has_pluto_hook_features§cell_id$ba5059bf-bdbb-4c35-b9e7-b7e90641dc94depends_on_disabled_cells§runtime published_object_keysdepends_on_skipped_cells§errored$6d982d26-1917-4f46-babf-e0ea19886976queued¤logsrunning¦outputbody"Success"mimetext/plainrootassigneelast_run_timestampAE)4z#persist_js_state·has_pluto_hook_features§cell_id$6d982d26-1917-4f46-babf-e0ea19886976depends_on_disabled_cells§runtime-published_object_keysdepends_on_skipped_cells§errored$22c6cf9f-2266-4908-8bb5-ad30d7388c06queued¤logsrunning¦outputbody<?xml version="1.0" encoding="utf-8"?>
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="600" height="400" viewBox="0 0 2400 1600">
<defs>
  <clipPath id="clip590">
    <rect x="0" y="0" width="2400" height="1600"/>
  </clipPath>
</defs>
<path clip-path="url(#clip590)" d="M0 1600 L2400 1600 L2400 0 L0 0  Z" fill="#ffffff" fill-rule="evenodd" fill-opacity="1"/>
<defs>
  <clipPath id="clip591">
    <rect x="480" y="0" width="1681" height="1600"/>
  </clipPath>
</defs>
<path clip-path="url(#clip590)" d="M249.542 1423.18 L2112.76 1423.18 L2112.76 47.2441 L249.542 47.2441  Z" fill="#ffffff" fill-rule="evenodd" fill-opacity="1"/>
<defs>
  <clipPath id="clip592">
    <rect x="249" y="47" width="1864" height="1377"/>
  </clipPath>
</defs>
<polyline clip-path="url(#clip592)" style="stroke:#000000; stroke-linecap:round; stroke-linejoin:round; stroke-width:2; stroke-opacity:0.1; fill:none" points="272.832,1423.18 272.832,47.2441 "/>
<polyline clip-path="url(#clip592)" style="stroke:#000000; stroke-linecap:round; stroke-linejoin:round; stroke-width:2; stroke-opacity:0.1; fill:none" points="726.991,1423.18 726.991,47.2441 "/>
<polyline clip-path="url(#clip592)" style="stroke:#000000; stroke-linecap:round; stroke-linejoin:round; stroke-width:2; stroke-opacity:0.1; fill:none" points="1181.15,1423.18 1181.15,47.2441 "/>
<polyline clip-path="url(#clip592)" style="stroke:#000000; stroke-linecap:round; stroke-linejoin:round; stroke-width:2; stroke-opacity:0.1; fill:none" points="1635.31,1423.18 1635.31,47.2441 "/>
<polyline clip-path="url(#clip592)" style="stroke:#000000; stroke-linecap:round; stroke-linejoin:round; stroke-width:2; stroke-opacity:0.1; fill:none" points="2089.47,1423.18 2089.47,47.2441 "/>
<polyline clip-path="url(#clip592)" style="stroke:#000000; stroke-linecap:round; stroke-linejoin:round; stroke-width:2; stroke-opacity:0.1; fill:none" points="249.542,1405.98 2112.76,1405.98 "/>
<polyline clip-path="url(#clip592)" style="stroke:#000000; stroke-linecap:round; stroke-linejoin:round; stroke-width:2; stroke-opacity:0.1; fill:none" points="249.542,1070.6 2112.76,1070.6 "/>
<polyline clip-path="url(#clip592)" style="stroke:#000000; stroke-linecap:round; stroke-linejoin:round; stroke-width:2; stroke-opacity:0.1; fill:none" points="249.542,735.212 2112.76,735.212 "/>
<polyline clip-path="url(#clip592)" style="stroke:#000000; stroke-linecap:round; stroke-linejoin:round; stroke-width:2; stroke-opacity:0.1; fill:none" points="249.542,399.828 2112.76,399.828 "/>
<polyline clip-path="url(#clip592)" style="stroke:#000000; stroke-linecap:round; stroke-linejoin:round; stroke-width:2; stroke-opacity:0.1; fill:none" points="249.542,64.4433 2112.76,64.4433 "/>
<polyline clip-path="url(#clip590)" style="stroke:#000000; stroke-linecap:round; stroke-linejoin:round; stroke-width:4; stroke-opacity:1; fill:none" points="249.542,1423.18 2112.76,1423.18 "/>
<polyline clip-path="url(#clip590)" style="stroke:#000000; stroke-linecap:round; stroke-linejoin:round; stroke-width:4; stroke-opacity:1; fill:none" points="272.832,1423.18 272.832,1404.28 "/>
<polyline clip-path="url(#clip590)" style="stroke:#000000; stroke-linecap:round; stroke-linejoin:round; stroke-width:4; stroke-opacity:1; fill:none" points="726.991,1423.18 726.991,1404.28 "/>
<polyline clip-path="url(#clip590)" style="stroke:#000000; stroke-linecap:round; stroke-linejoin:round; stroke-width:4; stroke-opacity:1; fill:none" points="1181.15,1423.18 1181.15,1404.28 "/>
<polyline clip-path="url(#clip590)" style="stroke:#000000; stroke-linecap:round; stroke-linejoin:round; stroke-width:4; stroke-opacity:1; fill:none" points="1635.31,1423.18 1635.31,1404.28 "/>
<polyline clip-path="url(#clip590)" style="stroke:#000000; stroke-linecap:round; stroke-linejoin:round; stroke-width:4; stroke-opacity:1; fill:none" points="2089.47,1423.18 2089.47,1404.28 "/>
<path clip-path="url(#clip590)" d="M235.136 1454.1 Q231.525 1454.1 229.696 1457.66 Q227.89 1461.2 227.89 1468.33 Q227.89 1475.44 229.696 1479.01 Q231.525 1482.55 235.136 1482.55 Q238.77 1482.55 240.575 1479.01 Q242.404 1475.44 242.404 1468.33 Q242.404 1461.2 240.575 1457.66 Q238.77 1454.1 235.136 1454.1 M235.136 1450.39 Q240.946 1450.39 244.001 1455 Q247.08 1459.58 247.08 1468.33 Q247.08 1477.06 244.001 1481.67 Q240.946 1486.25 235.136 1486.25 Q229.325 1486.25 226.247 1481.67 Q223.191 1477.06 223.191 1468.33 Q223.191 1459.58 226.247 1455 Q229.325 1450.39 235.136 1450.39 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1" /><path clip-path="url(#clip590)" d="M255.298 1479.7 L260.182 1479.7 L260.182 1485.58 L255.298 1485.58 L255.298 1479.7 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1" /><path clip-path="url(#clip590)" d="M280.367 1454.1 Q276.756 1454.1 274.927 1457.66 Q273.122 1461.2 273.122 1468.33 Q273.122 1475.44 274.927 1479.01 Q276.756 1482.55 280.367 1482.55 Q284.001 1482.55 285.807 1479.01 Q287.635 1475.44 287.635 1468.33 Q287.635 1461.2 285.807 1457.66 Q284.001 1454.1 280.367 1454.1 M280.367 1450.39 Q286.177 1450.39 289.233 1455 Q292.311 1459.58 292.311 1468.33 Q292.311 1477.06 289.233 1481.67 Q286.177 1486.25 280.367 1486.25 Q274.557 1486.25 271.478 1481.67 Q268.423 1477.06 268.423 1468.33 Q268.423 1459.58 271.478 1455 Q274.557 1450.39 280.367 1450.39 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1" /><path clip-path="url(#clip590)" d="M310.529 1454.1 Q306.918 1454.1 305.089 1457.66 Q303.283 1461.2 303.283 1468.33 Q303.283 1475.44 305.089 1479.01 Q306.918 1482.55 310.529 1482.55 Q314.163 1482.55 315.969 1479.01 Q317.797 1475.44 317.797 1468.33 Q317.797 1461.2 315.969 1457.66 Q314.163 1454.1 310.529 1454.1 M310.529 1450.39 Q316.339 1450.39 319.394 1455 Q322.473 1459.58 322.473 1468.33 Q322.473 1477.06 319.394 1481.67 Q316.339 1486.25 310.529 1486.25 Q304.719 1486.25 301.64 1481.67 Q298.584 1477.06 298.584 1468.33 Q298.584 1459.58 301.64 1455 Q304.719 1450.39 310.529 1450.39 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1" /><path clip-path="url(#clip590)" d="M689.792 1454.1 Q686.181 1454.1 684.352 1457.66 Q682.546 1461.2 682.546 1468.33 Q682.546 1475.44 684.352 1479.01 Q686.181 1482.55 689.792 1482.55 Q693.426 1482.55 695.231 1479.01 Q697.06 1475.44 697.06 1468.33 Q697.06 1461.2 695.231 1457.66 Q693.426 1454.1 689.792 1454.1 M689.792 1450.39 Q695.602 1450.39 698.657 1455 Q701.736 1459.58 701.736 1468.33 Q701.736 1477.06 698.657 1481.67 Q695.602 1486.25 689.792 1486.25 Q683.982 1486.25 680.903 1481.67 Q677.847 1477.06 677.847 1468.33 Q677.847 1459.58 680.903 1455 Q683.982 1450.39 689.792 1450.39 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1" /><path clip-path="url(#clip590)" d="M709.954 1479.7 L714.838 1479.7 L714.838 1485.58 L709.954 1485.58 L709.954 1479.7 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1" /><path clip-path="url(#clip590)" d="M729.051 1481.64 L745.37 1481.64 L745.37 1485.58 L723.426 1485.58 L723.426 1481.64 Q726.088 1478.89 730.671 1474.26 Q735.278 1469.61 736.458 1468.27 Q738.703 1465.74 739.583 1464.01 Q740.486 1462.25 740.486 1460.56 Q740.486 1457.8 738.541 1456.07 Q736.62 1454.33 733.518 1454.33 Q731.319 1454.33 728.866 1455.09 Q726.435 1455.86 723.657 1457.41 L723.657 1452.69 Q726.481 1451.55 728.935 1450.97 Q731.389 1450.39 733.426 1450.39 Q738.796 1450.39 741.991 1453.08 Q745.185 1455.77 745.185 1460.26 Q745.185 1462.39 744.375 1464.31 Q743.588 1466.2 741.481 1468.8 Q740.903 1469.47 737.801 1472.69 Q734.699 1475.88 729.051 1481.64 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1" /><path clip-path="url(#clip590)" d="M755.231 1451.02 L773.588 1451.02 L773.588 1454.96 L759.514 1454.96 L759.514 1463.43 Q760.532 1463.08 761.551 1462.92 Q762.569 1462.73 763.588 1462.73 Q769.375 1462.73 772.754 1465.9 Q776.134 1469.08 776.134 1474.49 Q776.134 1480.07 772.662 1483.17 Q769.189 1486.25 762.87 1486.25 Q760.694 1486.25 758.426 1485.88 Q756.18 1485.51 753.773 1484.77 L753.773 1480.07 Q755.856 1481.2 758.078 1481.76 Q760.301 1482.32 762.777 1482.32 Q766.782 1482.32 769.12 1480.21 Q771.458 1478.1 771.458 1474.49 Q771.458 1470.88 769.12 1468.77 Q766.782 1466.67 762.777 1466.67 Q760.902 1466.67 759.027 1467.08 Q757.176 1467.5 755.231 1468.38 L755.231 1451.02 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1" /><path clip-path="url(#clip590)" d="M1143.45 1454.1 Q1139.84 1454.1 1138.01 1457.66 Q1136.21 1461.2 1136.21 1468.33 Q1136.21 1475.44 1138.01 1479.01 Q1139.84 1482.55 1143.45 1482.55 Q1147.09 1482.55 1148.89 1479.01 Q1150.72 1475.44 1150.72 1468.33 Q1150.72 1461.2 1148.89 1457.66 Q1147.09 1454.1 1143.45 1454.1 M1143.45 1450.39 Q1149.26 1450.39 1152.32 1455 Q1155.4 1459.58 1155.4 1468.33 Q1155.4 1477.06 1152.32 1481.67 Q1149.26 1486.25 1143.45 1486.25 Q1137.64 1486.25 1134.56 1481.67 Q1131.51 1477.06 1131.51 1468.33 Q1131.51 1459.58 1134.56 1455 Q1137.64 1450.39 1143.45 1450.39 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1" /><path clip-path="url(#clip590)" d="M1163.61 1479.7 L1168.5 1479.7 L1168.5 1485.58 L1163.61 1485.58 L1163.61 1479.7 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1" /><path clip-path="url(#clip590)" d="M1178.73 1451.02 L1197.09 1451.02 L1197.09 1454.96 L1183.01 1454.96 L1183.01 1463.43 Q1184.03 1463.08 1185.05 1462.92 Q1186.07 1462.73 1187.09 1462.73 Q1192.87 1462.73 1196.25 1465.9 Q1199.63 1469.08 1199.63 1474.49 Q1199.63 1480.07 1196.16 1483.17 Q1192.69 1486.25 1186.37 1486.25 Q1184.19 1486.25 1181.92 1485.88 Q1179.68 1485.51 1177.27 1484.77 L1177.27 1480.07 Q1179.35 1481.2 1181.58 1481.76 Q1183.8 1482.32 1186.28 1482.32 Q1190.28 1482.32 1192.62 1480.21 Q1194.96 1478.1 1194.96 1474.49 Q1194.96 1470.88 1192.62 1468.77 Q1190.28 1466.67 1186.28 1466.67 Q1184.4 1466.67 1182.53 1467.08 Q1180.67 1467.5 1178.73 1468.38 L1178.73 1451.02 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1" /><path clip-path="url(#clip590)" d="M1218.85 1454.1 Q1215.23 1454.1 1213.41 1457.66 Q1211.6 1461.2 1211.6 1468.33 Q1211.6 1475.44 1213.41 1479.01 Q1215.23 1482.55 1218.85 1482.55 Q1222.48 1482.55 1224.29 1479.01 Q1226.11 1475.44 1226.11 1468.33 Q1226.11 1461.2 1224.29 1457.66 Q1222.48 1454.1 1218.85 1454.1 M1218.85 1450.39 Q1224.66 1450.39 1227.71 1455 Q1230.79 1459.58 1230.79 1468.33 Q1230.79 1477.06 1227.71 1481.67 Q1224.66 1486.25 1218.85 1486.25 Q1213.04 1486.25 1209.96 1481.67 Q1206.9 1477.06 1206.9 1468.33 Q1206.9 1459.58 1209.96 1455 Q1213.04 1450.39 1218.85 1450.39 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1" /><path clip-path="url(#clip590)" d="M1598.11 1454.1 Q1594.5 1454.1 1592.67 1457.66 Q1590.86 1461.2 1590.86 1468.33 Q1590.86 1475.44 1592.67 1479.01 Q1594.5 1482.55 1598.11 1482.55 Q1601.74 1482.55 1603.55 1479.01 Q1605.38 1475.44 1605.38 1468.33 Q1605.38 1461.2 1603.55 1457.66 Q1601.74 1454.1 1598.11 1454.1 M1598.11 1450.39 Q1603.92 1450.39 1606.97 1455 Q1610.05 1459.58 1610.05 1468.33 Q1610.05 1477.06 1606.97 1481.67 Q1603.92 1486.25 1598.11 1486.25 Q1592.3 1486.25 1589.22 1481.67 Q1586.16 1477.06 1586.16 1468.33 Q1586.16 1459.58 1589.22 1455 Q1592.3 1450.39 1598.11 1450.39 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1" /><path clip-path="url(#clip590)" d="M1618.27 1479.7 L1623.15 1479.7 L1623.15 1485.58 L1618.27 1485.58 L1618.27 1479.7 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1" /><path clip-path="url(#clip590)" d="M1632.16 1451.02 L1654.38 1451.02 L1654.38 1453.01 L1641.84 1485.58 L1636.95 1485.58 L1648.76 1454.96 L1632.16 1454.96 L1632.16 1451.02 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1" /><path clip-path="url(#clip590)" d="M1663.55 1451.02 L1681.9 1451.02 L1681.9 1454.96 L1667.83 1454.96 L1667.83 1463.43 Q1668.85 1463.08 1669.87 1462.92 Q1670.89 1462.73 1671.9 1462.73 Q1677.69 1462.73 1681.07 1465.9 Q1684.45 1469.08 1684.45 1474.49 Q1684.45 1480.07 1680.98 1483.17 Q1677.51 1486.25 1671.19 1486.25 Q1669.01 1486.25 1666.74 1485.88 Q1664.5 1485.51 1662.09 1484.77 L1662.09 1480.07 Q1664.17 1481.2 1666.4 1481.76 Q1668.62 1482.32 1671.09 1482.32 Q1675.1 1482.32 1677.44 1480.21 Q1679.77 1478.1 1679.77 1474.49 Q1679.77 1470.88 1677.44 1468.77 Q1675.1 1466.67 1671.09 1466.67 Q1669.22 1466.67 1667.34 1467.08 Q1665.49 1467.5 1663.55 1468.38 L1663.55 1451.02 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1" /><path clip-path="url(#clip590)" d="M2041.54 1481.64 L2049.18 1481.64 L2049.18 1455.28 L2040.87 1456.95 L2040.87 1452.69 L2049.13 1451.02 L2053.81 1451.02 L2053.81 1481.64 L2061.45 1481.64 L2061.45 1485.58 L2041.54 1485.58 L2041.54 1481.64 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1" /><path clip-path="url(#clip590)" d="M2070.89 1479.7 L2075.77 1479.7 L2075.77 1485.58 L2070.89 1485.58 L2070.89 1479.7 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1" /><path clip-path="url(#clip590)" d="M2095.96 1454.1 Q2092.35 1454.1 2090.52 1457.66 Q2088.71 1461.2 2088.71 1468.33 Q2088.71 1475.44 2090.52 1479.01 Q2092.35 1482.55 2095.96 1482.55 Q2099.59 1482.55 2101.4 1479.01 Q2103.23 1475.44 2103.23 1468.33 Q2103.23 1461.2 2101.4 1457.66 Q2099.59 1454.1 2095.96 1454.1 M2095.96 1450.39 Q2101.77 1450.39 2104.82 1455 Q2107.9 1459.58 2107.9 1468.33 Q2107.9 1477.06 2104.82 1481.67 Q2101.77 1486.25 2095.96 1486.25 Q2090.15 1486.25 2087.07 1481.67 Q2084.01 1477.06 2084.01 1468.33 Q2084.01 1459.58 2087.07 1455 Q2090.15 1450.39 2095.96 1450.39 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1" /><path clip-path="url(#clip590)" d="M2126.12 1454.1 Q2122.51 1454.1 2120.68 1457.66 Q2118.88 1461.2 2118.88 1468.33 Q2118.88 1475.44 2120.68 1479.01 Q2122.51 1482.55 2126.12 1482.55 Q2129.75 1482.55 2131.56 1479.01 Q2133.39 1475.44 2133.39 1468.33 Q2133.39 1461.2 2131.56 1457.66 Q2129.75 1454.1 2126.12 1454.1 M2126.12 1450.39 Q2131.93 1450.39 2134.99 1455 Q2138.07 1459.58 2138.07 1468.33 Q2138.07 1477.06 2134.99 1481.67 Q2131.93 1486.25 2126.12 1486.25 Q2120.31 1486.25 2117.23 1481.67 Q2114.18 1477.06 2114.18 1468.33 Q2114.18 1459.58 2117.23 1455 Q2120.31 1450.39 2126.12 1450.39 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1" /><path clip-path="url(#clip590)" d="M1197.76 1532.4 L1184.87 1549.74 L1198.43 1568.04 L1191.53 1568.04 L1181.15 1554.04 L1170.77 1568.04 L1163.87 1568.04 L1177.71 1549.39 L1165.04 1532.4 L1171.95 1532.4 L1181.4 1545.1 L1190.86 1532.4 L1197.76 1532.4 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1" /><polyline clip-path="url(#clip590)" style="stroke:#000000; stroke-linecap:round; stroke-linejoin:round; stroke-width:4; stroke-opacity:1; fill:none" points="249.542,1423.18 249.542,47.2441 "/>
<polyline clip-path="url(#clip590)" style="stroke:#000000; stroke-linecap:round; stroke-linejoin:round; stroke-width:4; stroke-opacity:1; fill:none" points="249.542,1405.98 266.283,1405.98 "/>
<polyline clip-path="url(#clip590)" style="stroke:#000000; stroke-linecap:round; stroke-linejoin:round; stroke-width:4; stroke-opacity:1; fill:none" points="249.542,1070.6 266.283,1070.6 "/>
<polyline clip-path="url(#clip590)" style="stroke:#000000; stroke-linecap:round; stroke-linejoin:round; stroke-width:4; stroke-opacity:1; fill:none" points="249.542,735.212 266.283,735.212 "/>
<polyline clip-path="url(#clip590)" style="stroke:#000000; stroke-linecap:round; stroke-linejoin:round; stroke-width:4; stroke-opacity:1; fill:none" points="249.542,399.828 266.283,399.828 "/>
<polyline clip-path="url(#clip590)" style="stroke:#000000; stroke-linecap:round; stroke-linejoin:round; stroke-width:4; stroke-opacity:1; fill:none" points="249.542,64.4433 266.283,64.4433 "/>
<path clip-path="url(#clip590)" d="M126.205 1391.78 Q122.593 1391.78 120.765 1395.34 Q118.959 1398.89 118.959 1406.02 Q118.959 1413.12 120.765 1416.69 Q122.593 1420.23 126.205 1420.23 Q129.839 1420.23 131.644 1416.69 Q133.473 1413.12 133.473 1406.02 Q133.473 1398.89 131.644 1395.34 Q129.839 1391.78 126.205 1391.78 M126.205 1388.08 Q132.015 1388.08 135.07 1392.68 Q138.149 1397.27 138.149 1406.02 Q138.149 1414.74 135.07 1419.35 Q132.015 1423.93 126.205 1423.93 Q120.394 1423.93 117.316 1419.35 Q114.26 1414.74 114.26 1406.02 Q114.26 1397.27 117.316 1392.68 Q120.394 1388.08 126.205 1388.08 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1" /><path clip-path="url(#clip590)" d="M146.366 1417.38 L151.251 1417.38 L151.251 1423.26 L146.366 1423.26 L146.366 1417.38 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1" /><path clip-path="url(#clip590)" d="M171.436 1391.78 Q167.825 1391.78 165.996 1395.34 Q164.19 1398.89 164.19 1406.02 Q164.19 1413.12 165.996 1416.69 Q167.825 1420.23 171.436 1420.23 Q175.07 1420.23 176.876 1416.69 Q178.704 1413.12 178.704 1406.02 Q178.704 1398.89 176.876 1395.34 Q175.07 1391.78 171.436 1391.78 M171.436 1388.08 Q177.246 1388.08 180.301 1392.68 Q183.38 1397.27 183.38 1406.02 Q183.38 1414.74 180.301 1419.35 Q177.246 1423.93 171.436 1423.93 Q165.626 1423.93 162.547 1419.35 Q159.491 1414.74 159.491 1406.02 Q159.491 1397.27 162.547 1392.68 Q165.626 1388.08 171.436 1388.08 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1" /><path clip-path="url(#clip590)" d="M201.598 1391.78 Q197.987 1391.78 196.158 1395.34 Q194.352 1398.89 194.352 1406.02 Q194.352 1413.12 196.158 1416.69 Q197.987 1420.23 201.598 1420.23 Q205.232 1420.23 207.037 1416.69 Q208.866 1413.12 208.866 1406.02 Q208.866 1398.89 207.037 1395.34 Q205.232 1391.78 201.598 1391.78 M201.598 1388.08 Q207.408 1388.08 210.463 1392.68 Q213.542 1397.27 213.542 1406.02 Q213.542 1414.74 210.463 1419.35 Q207.408 1423.93 201.598 1423.93 Q195.787 1423.93 192.709 1419.35 Q189.653 1414.74 189.653 1406.02 Q189.653 1397.27 192.709 1392.68 Q195.787 1388.08 201.598 1388.08 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1" /><path clip-path="url(#clip590)" d="M127.2 1056.39 Q123.589 1056.39 121.76 1059.96 Q119.955 1063.5 119.955 1070.63 Q119.955 1077.74 121.76 1081.3 Q123.589 1084.84 127.2 1084.84 Q130.834 1084.84 132.64 1081.3 Q134.468 1077.74 134.468 1070.63 Q134.468 1063.5 132.64 1059.96 Q130.834 1056.39 127.2 1056.39 M127.2 1052.69 Q133.01 1052.69 136.066 1057.3 Q139.144 1061.88 139.144 1070.63 Q139.144 1079.36 136.066 1083.96 Q133.01 1088.55 127.2 1088.55 Q121.39 1088.55 118.311 1083.96 Q115.256 1079.36 115.256 1070.63 Q115.256 1061.88 118.311 1057.3 Q121.39 1052.69 127.2 1052.69 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1" /><path clip-path="url(#clip590)" d="M147.362 1082 L152.246 1082 L152.246 1087.88 L147.362 1087.88 L147.362 1082 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1" /><path clip-path="url(#clip590)" d="M166.459 1083.94 L182.778 1083.94 L182.778 1087.88 L160.834 1087.88 L160.834 1083.94 Q163.496 1081.19 168.079 1076.56 Q172.686 1071.9 173.866 1070.56 Q176.112 1068.04 176.991 1066.3 Q177.894 1064.54 177.894 1062.85 Q177.894 1060.1 175.95 1058.36 Q174.028 1056.63 170.927 1056.63 Q168.727 1056.63 166.274 1057.39 Q163.843 1058.15 161.065 1059.71 L161.065 1054.98 Q163.89 1053.85 166.343 1053.27 Q168.797 1052.69 170.834 1052.69 Q176.204 1052.69 179.399 1055.38 Q182.593 1058.06 182.593 1062.55 Q182.593 1064.68 181.783 1066.6 Q180.996 1068.5 178.889 1071.09 Q178.311 1071.77 175.209 1074.98 Q172.107 1078.18 166.459 1083.94 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1" /><path clip-path="url(#clip590)" d="M192.639 1053.32 L210.996 1053.32 L210.996 1057.25 L196.922 1057.25 L196.922 1065.72 Q197.94 1065.38 198.959 1065.21 Q199.977 1065.03 200.996 1065.03 Q206.783 1065.03 210.162 1068.2 Q213.542 1071.37 213.542 1076.79 Q213.542 1082.37 210.07 1085.47 Q206.598 1088.55 200.278 1088.55 Q198.102 1088.55 195.834 1088.18 Q193.588 1087.81 191.181 1087.07 L191.181 1082.37 Q193.264 1083.5 195.487 1084.06 Q197.709 1084.61 200.186 1084.61 Q204.19 1084.61 206.528 1082.51 Q208.866 1080.4 208.866 1076.79 Q208.866 1073.18 206.528 1071.07 Q204.19 1068.96 200.186 1068.96 Q198.311 1068.96 196.436 1069.38 Q194.584 1069.8 192.639 1070.68 L192.639 1053.32 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1" /><path clip-path="url(#clip590)" d="M126.205 721.011 Q122.593 721.011 120.765 724.575 Q118.959 728.117 118.959 735.247 Q118.959 742.353 120.765 745.918 Q122.593 749.46 126.205 749.46 Q129.839 749.46 131.644 745.918 Q133.473 742.353 133.473 735.247 Q133.473 728.117 131.644 724.575 Q129.839 721.011 126.205 721.011 M126.205 717.307 Q132.015 717.307 135.07 721.913 Q138.149 726.497 138.149 735.247 Q138.149 743.973 135.07 748.58 Q132.015 753.163 126.205 753.163 Q120.394 753.163 117.316 748.58 Q114.26 743.973 114.26 735.247 Q114.26 726.497 117.316 721.913 Q120.394 717.307 126.205 717.307 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1" /><path clip-path="url(#clip590)" d="M146.366 746.612 L151.251 746.612 L151.251 752.492 L146.366 752.492 L146.366 746.612 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1" /><path clip-path="url(#clip590)" d="M161.482 717.932 L179.839 717.932 L179.839 721.867 L165.765 721.867 L165.765 730.339 Q166.783 729.992 167.802 729.83 Q168.82 729.645 169.839 729.645 Q175.626 729.645 179.005 732.816 Q182.385 735.987 182.385 741.404 Q182.385 746.983 178.913 750.085 Q175.44 753.163 169.121 753.163 Q166.945 753.163 164.677 752.793 Q162.431 752.423 160.024 751.682 L160.024 746.983 Q162.107 748.117 164.329 748.673 Q166.552 749.228 169.028 749.228 Q173.033 749.228 175.371 747.122 Q177.709 745.015 177.709 741.404 Q177.709 737.793 175.371 735.687 Q173.033 733.58 169.028 733.58 Q167.153 733.58 165.278 733.997 Q163.427 734.413 161.482 735.293 L161.482 717.932 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1" /><path clip-path="url(#clip590)" d="M201.598 721.011 Q197.987 721.011 196.158 724.575 Q194.352 728.117 194.352 735.247 Q194.352 742.353 196.158 745.918 Q197.987 749.46 201.598 749.46 Q205.232 749.46 207.037 745.918 Q208.866 742.353 208.866 735.247 Q208.866 728.117 207.037 724.575 Q205.232 721.011 201.598 721.011 M201.598 717.307 Q207.408 717.307 210.463 721.913 Q213.542 726.497 213.542 735.247 Q213.542 743.973 210.463 748.58 Q207.408 753.163 201.598 753.163 Q195.787 753.163 192.709 748.58 Q189.653 743.973 189.653 735.247 Q189.653 726.497 192.709 721.913 Q195.787 717.307 201.598 717.307 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1" /><path clip-path="url(#clip590)" d="M127.2 385.626 Q123.589 385.626 121.76 389.191 Q119.955 392.733 119.955 399.862 Q119.955 406.969 121.76 410.534 Q123.589 414.075 127.2 414.075 Q130.834 414.075 132.64 410.534 Q134.468 406.969 134.468 399.862 Q134.468 392.733 132.64 389.191 Q130.834 385.626 127.2 385.626 M127.2 381.923 Q133.01 381.923 136.066 386.529 Q139.144 391.112 139.144 399.862 Q139.144 408.589 136.066 413.196 Q133.01 417.779 127.2 417.779 Q121.39 417.779 118.311 413.196 Q115.256 408.589 115.256 399.862 Q115.256 391.112 118.311 386.529 Q121.39 381.923 127.2 381.923 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1" /><path clip-path="url(#clip590)" d="M147.362 411.228 L152.246 411.228 L152.246 417.108 L147.362 417.108 L147.362 411.228 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1" /><path clip-path="url(#clip590)" d="M161.251 382.548 L183.473 382.548 L183.473 384.538 L170.927 417.108 L166.042 417.108 L177.848 386.483 L161.251 386.483 L161.251 382.548 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1" /><path clip-path="url(#clip590)" d="M192.639 382.548 L210.996 382.548 L210.996 386.483 L196.922 386.483 L196.922 394.955 Q197.94 394.608 198.959 394.446 Q199.977 394.261 200.996 394.261 Q206.783 394.261 210.162 397.432 Q213.542 400.603 213.542 406.02 Q213.542 411.598 210.07 414.7 Q206.598 417.779 200.278 417.779 Q198.102 417.779 195.834 417.409 Q193.588 417.038 191.181 416.297 L191.181 411.598 Q193.264 412.733 195.487 413.288 Q197.709 413.844 200.186 413.844 Q204.19 413.844 206.528 411.737 Q208.866 409.631 208.866 406.02 Q208.866 402.409 206.528 400.302 Q204.19 398.196 200.186 398.196 Q198.311 398.196 196.436 398.612 Q194.584 399.029 192.639 399.909 L192.639 382.548 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1" /><path clip-path="url(#clip590)" d="M117.015 77.7881 L124.654 77.7881 L124.654 51.4225 L116.343 53.0892 L116.343 48.8299 L124.607 47.1633 L129.283 47.1633 L129.283 77.7881 L136.922 77.7881 L136.922 81.7233 L117.015 81.7233 L117.015 77.7881 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1" /><path clip-path="url(#clip590)" d="M146.366 75.8437 L151.251 75.8437 L151.251 81.7233 L146.366 81.7233 L146.366 75.8437 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1" /><path clip-path="url(#clip590)" d="M171.436 50.242 Q167.825 50.242 165.996 53.8068 Q164.19 57.3484 164.19 64.478 Q164.19 71.5845 165.996 75.1493 Q167.825 78.6909 171.436 78.6909 Q175.07 78.6909 176.876 75.1493 Q178.704 71.5845 178.704 64.478 Q178.704 57.3484 176.876 53.8068 Q175.07 50.242 171.436 50.242 M171.436 46.5383 Q177.246 46.5383 180.301 51.1448 Q183.38 55.7281 183.38 64.478 Q183.38 73.2048 180.301 77.8113 Q177.246 82.3946 171.436 82.3946 Q165.626 82.3946 162.547 77.8113 Q159.491 73.2048 159.491 64.478 Q159.491 55.7281 162.547 51.1448 Q165.626 46.5383 171.436 46.5383 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1" /><path clip-path="url(#clip590)" d="M201.598 50.242 Q197.987 50.242 196.158 53.8068 Q194.352 57.3484 194.352 64.478 Q194.352 71.5845 196.158 75.1493 Q197.987 78.6909 201.598 78.6909 Q205.232 78.6909 207.037 75.1493 Q208.866 71.5845 208.866 64.478 Q208.866 57.3484 207.037 53.8068 Q205.232 50.242 201.598 50.242 M201.598 46.5383 Q207.408 46.5383 210.463 51.1448 Q213.542 55.7281 213.542 64.478 Q213.542 73.2048 210.463 77.8113 Q207.408 82.3946 201.598 82.3946 Q195.787 82.3946 192.709 77.8113 Q189.653 73.2048 189.653 64.478 Q189.653 55.7281 192.709 51.1448 Q195.787 46.5383 201.598 46.5383 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1" /><path clip-path="url(#clip590)" d="M67.3143 733.525 Q73.68 736.008 75.6216 738.363 Q77.5631 740.718 77.5631 744.665 L77.5631 749.344 L72.6615 749.344 L72.6615 745.906 Q72.6615 743.487 71.5157 742.151 Q70.3699 740.814 66.1048 739.191 L63.4312 738.14 L28.3562 752.559 L28.3562 746.352 L56.238 735.212 L28.3562 724.072 L28.3562 717.865 L67.3143 733.525 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1" /><g clip-path="url(#clip592)">
<image width="1863" height="1376" xlink:href="data:image/png;base64,
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
" transform="translate(250, 47)"/>
</g>
<defs>
  <clipPath id="clip593">
    <rect x="2160" y="47" width="73" height="1377"/>
  </clipPath>
</defs>
<g clip-path="url(#clip593)">
<image width="72" height="1376" xlink:href="data:image/png;base64,
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
QaAgUBAo/AdhU+3PqlcPeQAAAABJRU5ErkJggg==
" transform="translate(2161, 47)"/>
</g>
<path clip-path="url(#clip590)" d="M2280.7 1405.35 Q2277.09 1405.35 2275.26 1408.91 Q2273.45 1412.46 2273.45 1419.59 Q2273.45 1426.69 2275.26 1430.26 Q2277.09 1433.8 2280.7 1433.8 Q2284.33 1433.8 2286.14 1430.26 Q2287.97 1426.69 2287.97 1419.59 Q2287.97 1412.46 2286.14 1408.91 Q2284.33 1405.35 2280.7 1405.35 M2280.7 1401.65 Q2286.51 1401.65 2289.57 1406.25 Q2292.64 1410.84 2292.64 1419.59 Q2292.64 1428.31 2289.57 1432.92 Q2286.51 1437.5 2280.7 1437.5 Q2274.89 1437.5 2271.81 1432.92 Q2268.76 1428.31 2268.76 1419.59 Q2268.76 1410.84 2271.81 1406.25 Q2274.89 1401.65 2280.7 1401.65 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1" /><polyline clip-path="url(#clip590)" style="stroke:#000000; stroke-linecap:round; stroke-linejoin:round; stroke-width:4; stroke-opacity:1; fill:none" points="2232.76,1423.18 2256.76,1423.18 "/>
<path clip-path="url(#clip590)" d="M2280.7 1167.03 Q2277.09 1167.03 2275.26 1170.6 Q2273.45 1174.14 2273.45 1181.27 Q2273.45 1188.37 2275.26 1191.94 Q2277.09 1195.48 2280.7 1195.48 Q2284.33 1195.48 2286.14 1191.94 Q2287.97 1188.37 2287.97 1181.27 Q2287.97 1174.14 2286.14 1170.6 Q2284.33 1167.03 2280.7 1167.03 M2280.7 1163.33 Q2286.51 1163.33 2289.57 1167.93 Q2292.64 1172.52 2292.64 1181.27 Q2292.64 1189.99 2289.57 1194.6 Q2286.51 1199.18 2280.7 1199.18 Q2274.89 1199.18 2271.81 1194.6 Q2268.76 1189.99 2268.76 1181.27 Q2268.76 1172.52 2271.81 1167.93 Q2274.89 1163.33 2280.7 1163.33 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1" /><path clip-path="url(#clip590)" d="M2300.86 1192.63 L2305.75 1192.63 L2305.75 1198.51 L2300.86 1198.51 L2300.86 1192.63 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1" /><path clip-path="url(#clip590)" d="M2316.74 1194.58 L2324.38 1194.58 L2324.38 1168.21 L2316.07 1169.88 L2316.07 1165.62 L2324.33 1163.95 L2329.01 1163.95 L2329.01 1194.58 L2336.65 1194.58 L2336.65 1198.51 L2316.74 1198.51 L2316.74 1194.58 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1" /><polyline clip-path="url(#clip590)" style="stroke:#000000; stroke-linecap:round; stroke-linejoin:round; stroke-width:4; stroke-opacity:1; fill:none" points="2232.76,1184.86 2256.76,1184.86 "/>
<path clip-path="url(#clip590)" d="M2280.7 928.712 Q2277.09 928.712 2275.26 932.276 Q2273.45 935.818 2273.45 942.948 Q2273.45 950.054 2275.26 953.619 Q2277.09 957.161 2280.7 957.161 Q2284.33 957.161 2286.14 953.619 Q2287.97 950.054 2287.97 942.948 Q2287.97 935.818 2286.14 932.276 Q2284.33 928.712 2280.7 928.712 M2280.7 925.008 Q2286.51 925.008 2289.57 929.614 Q2292.64 934.198 2292.64 942.948 Q2292.64 951.674 2289.57 956.281 Q2286.51 960.864 2280.7 960.864 Q2274.89 960.864 2271.81 956.281 Q2268.76 951.674 2268.76 942.948 Q2268.76 934.198 2271.81 929.614 Q2274.89 925.008 2280.7 925.008 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1" /><path clip-path="url(#clip590)" d="M2300.86 954.313 L2305.75 954.313 L2305.75 960.193 L2300.86 960.193 L2300.86 954.313 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1" /><path clip-path="url(#clip590)" d="M2319.96 956.258 L2336.28 956.258 L2336.28 960.193 L2314.33 960.193 L2314.33 956.258 Q2317 953.503 2321.58 948.874 Q2326.19 944.221 2327.37 942.878 Q2329.61 940.355 2330.49 938.619 Q2331.39 936.86 2331.39 935.17 Q2331.39 932.415 2329.45 930.679 Q2327.53 928.943 2324.43 928.943 Q2322.23 928.943 2319.77 929.707 Q2317.34 930.471 2314.57 932.022 L2314.57 927.3 Q2317.39 926.165 2319.84 925.587 Q2322.3 925.008 2324.33 925.008 Q2329.7 925.008 2332.9 927.693 Q2336.09 930.378 2336.09 934.869 Q2336.09 936.999 2335.28 938.92 Q2334.5 940.818 2332.39 943.411 Q2331.81 944.082 2328.71 947.299 Q2325.61 950.494 2319.96 956.258 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1" /><polyline clip-path="url(#clip590)" style="stroke:#000000; stroke-linecap:round; stroke-linejoin:round; stroke-width:4; stroke-opacity:1; fill:none" points="2232.76,946.542 2256.76,946.542 "/>
<path clip-path="url(#clip590)" d="M2280.7 690.393 Q2277.09 690.393 2275.26 693.957 Q2273.45 697.499 2273.45 704.629 Q2273.45 711.735 2275.26 715.3 Q2277.09 718.841 2280.7 718.841 Q2284.33 718.841 2286.14 715.3 Q2287.97 711.735 2287.97 704.629 Q2287.97 697.499 2286.14 693.957 Q2284.33 690.393 2280.7 690.393 M2280.7 686.689 Q2286.51 686.689 2289.57 691.295 Q2292.64 695.879 2292.64 704.629 Q2292.64 713.355 2289.57 717.962 Q2286.51 722.545 2280.7 722.545 Q2274.89 722.545 2271.81 717.962 Q2268.76 713.355 2268.76 704.629 Q2268.76 695.879 2271.81 691.295 Q2274.89 686.689 2280.7 686.689 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1" /><path clip-path="url(#clip590)" d="M2300.86 715.994 L2305.75 715.994 L2305.75 721.874 L2300.86 721.874 L2300.86 715.994 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1" /><path clip-path="url(#clip590)" d="M2330.1 703.24 Q2333.45 703.957 2335.33 706.226 Q2337.23 708.494 2337.23 711.828 Q2337.23 716.943 2333.71 719.744 Q2330.19 722.545 2323.71 722.545 Q2321.53 722.545 2319.22 722.105 Q2316.93 721.689 2314.47 720.832 L2314.47 716.318 Q2316.42 717.453 2318.73 718.031 Q2321.05 718.61 2323.57 718.61 Q2327.97 718.61 2330.26 716.874 Q2332.58 715.138 2332.58 711.828 Q2332.58 708.772 2330.42 707.059 Q2328.29 705.323 2324.47 705.323 L2320.45 705.323 L2320.45 701.48 L2324.66 701.48 Q2328.11 701.48 2329.94 700.115 Q2331.76 698.726 2331.76 696.133 Q2331.76 693.471 2329.87 692.059 Q2327.99 690.624 2324.47 690.624 Q2322.55 690.624 2320.35 691.041 Q2318.15 691.457 2315.51 692.337 L2315.51 688.17 Q2318.18 687.43 2320.49 687.059 Q2322.83 686.689 2324.89 686.689 Q2330.21 686.689 2333.32 689.119 Q2336.42 691.527 2336.42 695.647 Q2336.42 698.517 2334.77 700.508 Q2333.13 702.476 2330.1 703.24 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1" /><polyline clip-path="url(#clip590)" style="stroke:#000000; stroke-linecap:round; stroke-linejoin:round; stroke-width:4; stroke-opacity:1; fill:none" points="2232.76,708.223 2256.76,708.223 "/>
<path clip-path="url(#clip590)" d="M2280.7 452.073 Q2277.09 452.073 2275.26 455.638 Q2273.45 459.18 2273.45 466.31 Q2273.45 473.416 2275.26 476.981 Q2277.09 480.522 2280.7 480.522 Q2284.33 480.522 2286.14 476.981 Q2287.97 473.416 2287.97 466.31 Q2287.97 459.18 2286.14 455.638 Q2284.33 452.073 2280.7 452.073 M2280.7 448.37 Q2286.51 448.37 2289.57 452.976 Q2292.64 457.56 2292.64 466.31 Q2292.64 475.036 2289.57 479.643 Q2286.51 484.226 2280.7 484.226 Q2274.89 484.226 2271.81 479.643 Q2268.76 475.036 2268.76 466.31 Q2268.76 457.56 2271.81 452.976 Q2274.89 448.37 2280.7 448.37 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1" /><path clip-path="url(#clip590)" d="M2300.86 477.675 L2305.75 477.675 L2305.75 483.555 L2300.86 483.555 L2300.86 477.675 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1" /><path clip-path="url(#clip590)" d="M2328.78 453.069 L2316.97 471.518 L2328.78 471.518 L2328.78 453.069 M2327.55 448.995 L2333.43 448.995 L2333.43 471.518 L2338.36 471.518 L2338.36 475.407 L2333.43 475.407 L2333.43 483.555 L2328.78 483.555 L2328.78 475.407 L2313.18 475.407 L2313.18 470.893 L2327.55 448.995 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1" /><polyline clip-path="url(#clip590)" style="stroke:#000000; stroke-linecap:round; stroke-linejoin:round; stroke-width:4; stroke-opacity:1; fill:none" points="2232.76,469.904 2256.76,469.904 "/>
<path clip-path="url(#clip590)" d="M2280.7 213.754 Q2277.09 213.754 2275.26 217.319 Q2273.45 220.861 2273.45 227.99 Q2273.45 235.097 2275.26 238.662 Q2277.09 242.203 2280.7 242.203 Q2284.33 242.203 2286.14 238.662 Q2287.97 235.097 2287.97 227.99 Q2287.97 220.861 2286.14 217.319 Q2284.33 213.754 2280.7 213.754 M2280.7 210.051 Q2286.51 210.051 2289.57 214.657 Q2292.64 219.24 2292.64 227.99 Q2292.64 236.717 2289.57 241.324 Q2286.51 245.907 2280.7 245.907 Q2274.89 245.907 2271.81 241.324 Q2268.76 236.717 2268.76 227.99 Q2268.76 219.24 2271.81 214.657 Q2274.89 210.051 2280.7 210.051 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1" /><path clip-path="url(#clip590)" d="M2300.86 239.356 L2305.75 239.356 L2305.75 245.236 L2300.86 245.236 L2300.86 239.356 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1" /><path clip-path="url(#clip590)" d="M2315.98 210.676 L2334.33 210.676 L2334.33 214.611 L2320.26 214.611 L2320.26 223.083 Q2321.28 222.736 2322.3 222.574 Q2323.32 222.389 2324.33 222.389 Q2330.12 222.389 2333.5 225.56 Q2336.88 228.731 2336.88 234.148 Q2336.88 239.727 2333.41 242.828 Q2329.94 245.907 2323.62 245.907 Q2321.44 245.907 2319.17 245.537 Q2316.93 245.166 2314.52 244.426 L2314.52 239.727 Q2316.6 240.861 2318.83 241.416 Q2321.05 241.972 2323.52 241.972 Q2327.53 241.972 2329.87 239.865 Q2332.2 237.759 2332.2 234.148 Q2332.2 230.537 2329.87 228.43 Q2327.53 226.324 2323.52 226.324 Q2321.65 226.324 2319.77 226.74 Q2317.92 227.157 2315.98 228.037 L2315.98 210.676 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1" /><polyline clip-path="url(#clip590)" style="stroke:#000000; stroke-linecap:round; stroke-linejoin:round; stroke-width:4; stroke-opacity:1; fill:none" points="2232.76,231.585 2256.76,231.585 "/>
<polyline clip-path="url(#clip590)" style="stroke:#000000; stroke-linecap:round; stroke-linejoin:round; stroke-width:4; stroke-opacity:1; fill:none" points="2232.76,1423.18 2232.76,47.2441 "/>
</svg>
mimeimage/svg+xmlrootassigneelast_run_timestampAE)5Űpersist_js_state·has_pluto_hook_features§cell_id$22c6cf9f-2266-4908-8bb5-ad30d7388c06depends_on_disabled_cells§runtime陵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 Kpublished_object_keysdepends_on_skipped_cells§errored$23038da7-9417-48fe-8431-e5a05dcf9593queued¤logsrunning¦outputbodyr<div class="markdown"><h3 id="Non-expert-call-to-compute-gradient">Non-expert call to compute gradient</h3>
</div>mimetext/htmlrootassigneelast_run_timestampAE)Jpersist_js_state·has_pluto_hook_features§cell_id$23038da7-9417-48fe-8431-e5a05dcf9593depends_on_disabled_cells§runtime 0published_object_keysdepends_on_skipped_cells§errored$3b8f0812-9700-45c4-b1ce-d8cdfe09c38bqueued¤logslinemsgA  0.000001 seconds (2 allocations: 320 bytes)
  0.000001 seconds
text/plaincell_id$3b8f0812-9700-45c4-b1ce-d8cdfe09c38bkwargsidPlutoRunner_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$3b8f0812-9700-45c4-b1ce-d8cdfe09c38bdepends_on_disabled_cells§runtime ~published_object_keysdepends_on_skipped_cells§errored$f0111b2d-7a7c-4029-8fd0-7c0785b5b038queued¤logsrunning¦outputbody<div class="markdown"><h3 id="Where-do-your-variables-get-stored?">Where do your variables get stored?</h3>
<p>Your program will use two distinct <strong>virtual address spaces</strong>:</p>
<ul>
<li><p><strong>Stack</strong></p>
<ul>
<li><p>Scalars</p>
</li>
<li><p>Small structures or collections with known size</p>
</li>
<li><p>Function parameters and memory addresses for their outputs</p>
</li>
<li><p>Values cleared from stack on a Last-in, First-out &#40;LIFO&#41; basis</p>
</li>
<li><p><em>Push</em>ing values onto top of stack is fast</p>
</li>
<li><p><em>Pop</em>ing values off the top of the stack is fast</p>
</li>
</ul>
</li>
<li><p><strong>Heap</strong></p>
<ul>
<li><p>Large arrays/collections</p>
</li>
<li><p>Structures/collections if size is not known at compile time</p>
</li>
<li><p>Stored until deallocated &#40;by programmer or garbage collector&#41;</p>
</li>
<li><p>Allocating memory from heap incurs latency</p>
</li>
<li><p>Deallocating can be fast, but is error prone</p>
</li>
<li><p>Deallocations typically defered until a <em>garbage collector</em> frees up memory that is no longer in use.</p>
</li>
</ul>
</li>
</ul>
</div>mimetext/htmlrootassigneelast_run_timestampAE))persist_js_state·has_pluto_hook_features§cell_id$f0111b2d-7a7c-4029-8fd0-7c0785b5b038depends_on_disabled_cells§runtime 55published_object_keysdepends_on_skipped_cells§errored$cf913e43-4499-4efc-87cb-2474222b8865queued¤logsrunning¦outputbodyf<div class="markdown"><h1 id="Expert-vs-non-expert-routines">Expert vs non-expert routines</h1>
</div>mimetext/htmlrootassigneelast_run_timestampAE)ǰpersist_js_state·has_pluto_hook_features§cell_id$cf913e43-4499-4efc-87cb-2474222b8865depends_on_disabled_cells§runtime published_object_keysdepends_on_skipped_cells§errored$1aab953a-f524-4d93-95bf-ea5524c47b8bqueued¤logslinemsg$You can't do modify a static vector.text/plaincell_id$1aab953a-f524-4d93-95bf-ea5524c47b8bkwargsidMain_workspace#2_9bf66cccfilen/home/runner/work/Notes-Fall2025/Notes-Fall2025/week4/week4_discuss.jl#==#1aab953a-f524-4d93-95bf-ea5524c47b8bgroupweek4_discusslevelWarnrunning¦outputbodymimetext/plainrootassigneelast_run_timestampAE)4persist_js_state·has_pluto_hook_features§cell_id$1aab953a-f524-4d93-95bf-ea5524c47b8bdepends_on_disabled_cells§runtime -published_object_keysdepends_on_skipped_cells§errored$8114f59e-1a8e-49c6-baaa-20ed19747d2bqueued¤logsrunning¦outputbody|<div class="markdown"><h2 id="How-to-generate-less-garbage?">How to generate less garbage?</h2>
<h3 id="For-small-allocations,--use-data-types-that-stay-on-the-stack">For small allocations,  use data types that stay on the stack</h3>
<ul>
<li><p><a href="https://docs.julialang.org/en/v1/manual/types/#Tuple-Types">Tuple</a> </p>
</li>
<li><p><a href="https://docs.julialang.org/en/v1/manual/types/#Named-Tuple-Types">NamedTuple</a></p>
</li>
<li><p>Custom <code>struct</code> &#40;with fields that go to the stack&#41;</p>
</li>
<li><p><a href="https://github.com/JuliaArrays/StaticArrays.jl">StaticArrays.jl</a></p>
</li>
</ul>
</div>mimetext/htmlrootassigneelast_run_timestampAE)persist_js_state·has_pluto_hook_features§cell_id$8114f59e-1a8e-49c6-baaa-20ed19747d2bdepends_on_disabled_cells§runtime 	published_object_keysdepends_on_skipped_cells§errored$f632c0ab-ea32-4973-8ec9-79a7f4f4c4adqueued¤logsrunning¦outputbodyelementsresult1.0text/plainmessage"Success"text/plaintypeNamedTupleobjectid6d99dcc63c7a883bmime!application/vnd.pluto.tree+objectrootassigneentlast_run_timestampAE)4%persist_js_state·has_pluto_hook_features§cell_id$f632c0ab-ea32-4973-8ec9-79a7f4f4c4addepends_on_disabled_cells§runtime>published_object_keysdepends_on_skipped_cells§errored$348ee204-546f-46c5-bf5d-7d4a761002ecqueued¤logsrunning¦outputbodyK<div class="markdown"><h1 id="Week-4-Discussion-Topics">Week 4 Discussion Topics</h1>
<ul>
<li><p>Memory heirarchy &amp; allocations</p>
<ul>
<li><p>Stack vs Heap allocations</p>
</li>
<li><p>Pre-allocating storage</p>
</li>
</ul>
</li>
<li><p>Garbage Collectors</p>
</li>
<li><p>Expert/Non-expert Interfaces</p>
</li>
</ul>
</div>mimetext/htmlrootassigneelast_run_timestampAE)Upersist_js_state·has_pluto_hook_features§cell_id$348ee204-546f-46c5-bf5d-7d4a761002ecdepends_on_disabled_cells§runtime ֿpublished_object_keysdepends_on_skipped_cells§errored$2e8da77c-004b-4d59-83f4-9fb981ea5658queued¤logsrunning¦outputbodyprefixMyMutableStructelementsresult0.0text/plainmessage"Lorem ipsum dolor sit amet"text/plaintypestructprefix_shortMyMutableStructobjectid834a672f036acd0bmime!application/vnd.pluto.tree+objectrootassigneelast_run_timestampAE)4persist_js_state·has_pluto_hook_features§cell_id$2e8da77c-004b-4d59-83f4-9fb981ea5658depends_on_disabled_cells§runtimeVtpublished_object_keysdepends_on_skipped_cells§errored$8fe1804c-4fce-4980-bb54-dad89c3062d1queued¤logsrunning¦outputbodyprefixInt64elements1text/plain2text/plain3text/plaintypeArrayprefix_shortobjectid2343ba8c69e2abd0mime!application/vnd.pluto.tree+objectrootassigneelast_run_timestampAE)5Dpersist_js_state·has_pluto_hook_features§cell_id$8fe1804c-4fce-4980-bb54-dad89c3062d1depends_on_disabled_cells§runtime published_object_keysdepends_on_skipped_cells§errored$31a1f316-8098-4496-9d20-b0782358bd4fqueued¤logsrunning¦outputbodyn<div class="markdown"><h4 id="Mutable-fixed-size-vectors/arrays">Mutable fixed-size vectors/arrays</h4>
</div>mimetext/htmlrootassigneelast_run_timestampAE)persist_js_state·has_pluto_hook_features§cell_id$31a1f316-8098-4496-9d20-b0782358bd4fdepends_on_disabled_cells§runtime :published_object_keysdepends_on_skipped_cells§errored$3f4cac5b-9b2a-4261-a01e-e2d4f692fb90queued¤logslinemsg  0.000000 seconds
text/plaincell_id$3f4cac5b-9b2a-4261-a01e-e2d4f692fb90kwargsidPlutoRunner_d1acb81efileP/home/runner/.julia/packages/Pluto/CBqeh/src/runner/PlutoRunner/src/io/stdout.jlgroupstdoutlevelLogLevel(-555)running¦outputbody4×4 SMatrix{4, 4, Float64, 16} with indices SOneTo(4)×SOneTo(4):
 0.303749   1.48623   0.820587  -0.599391
 0.802358  -0.852373  0.650567   0.0157583
 1.07678   -0.120267  0.148045   0.0646829
 0.750074  -1.02617   0.688718   0.697252mimetext/plainrootassigneelast_run_timestampAE)5԰persist_js_state·has_pluto_hook_features§cell_id$3f4cac5b-9b2a-4261-a01e-e2d4f692fb90depends_on_disabled_cells§runtime9published_object_keysdepends_on_skipped_cells§errored$f9714ea5-5d0e-4006-92c4-71b3e574d26cqueued¤logsrunning¦outputbodymimetext/plainrootassigneelast_run_timestampAE)4ݰpersist_js_state·has_pluto_hook_features§cell_id$f9714ea5-5d0e-4006-92c4-71b3e574d26cdepends_on_disabled_cells§runtime H<published_object_keysdepends_on_skipped_cells§errored$99a0be67-2dac-43ba-9223-03845c528fefqueued¤logsrunning¦outputbodyBenchmarkTools.Trial: 10000 samples with 217 evaluations per sample.
 Range [90m([39m[36m[1mmin[22m[39m … [35mmax[39m[90m):  [39m[36m[1m340.083 ns[22m[39m … [35m98.795 μs[39m  [90m┊[39m GC [90m([39mmin … max[90m): [39m0.00% … 99.52%
 Time  [90m([39m[34m[1mmedian[22m[39m[90m):     [39m[34m[1m381.590 ns              [22m[39m[90m┊[39m GC [90m([39mmedian[90m):    [39m0.00%
 Time  [90m([39m[32m[1mmean[22m[39m ± [32mσ[39m[90m):   [39m[32m[1m410.762 ns[22m[39m ± [32m 1.296 μs[39m  [90m┊[39m GC [90m([39mmean ± σ[90m):  [39m5.25% ±  1.72%

  [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 [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▂[34m▁[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▂
  340 ns[90m          Histogram: frequency by time[39m          481 ns [0m[1m<[22m

 Memory estimate[90m: [39m[33m240 bytes[39m, allocs estimate[90m: [39m[33m5[39m.mimetext/plainrootassigneelast_run_timestampAE)6"persist_js_state·has_pluto_hook_features§cell_id$99a0be67-2dac-43ba-9223-03845c528fefdepends_on_disabled_cells§runtimeΊzpublished_object_keysdepends_on_skipped_cells§errored$0dd9307f-1390-412b-8cf6-77deb33091a0queued¤logsrunning¦outputbodyw<div class="markdown"><h4 id="Examples-of-simple-struct&#39;s">Examples of simple <code>struct</code>&#39;s</h4>
</div>mimetext/htmlrootassigneelast_run_timestampAE)persist_js_state·has_pluto_hook_features§cell_id$0dd9307f-1390-412b-8cf6-77deb33091a0depends_on_disabled_cells§runtime ߘpublished_object_keysdepends_on_skipped_cells§errored$294c9958-5e2b-4b95-ba49-ecda696190b6queued¤logsrunning¦outputbodyBenchmarkTools.Trial: 10000 samples with 217 evaluations per sample.
 Range [90m([39m[36m[1mmin[22m[39m … [35mmax[39m[90m):  [39m[36m[1m342.023 ns[22m[39m … [35m 56.499 μs[39m  [90m┊[39m GC [90m([39mmin … max[90m): [39m0.00% … 99.08%
 Time  [90m([39m[34m[1mmedian[22m[39m[90m):     [39m[34m[1m392.392 ns               [22m[39m[90m┊[39m GC [90m([39mmedian[90m):    [39m0.00%
 Time  [90m([39m[32m[1mmean[22m[39m ± [32mσ[39m[90m):   [39m[32m[1m390.617 ns[22m[39m ± [32m562.523 ns[39m  [90m┊[39m GC [90m([39mmean ± σ[90m):  [39m1.43% ±  0.99%

  [39m [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[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▂[39m▃[39m▃[39m▅[32m█[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▃
  342 ns[90m           Histogram: frequency by time[39m          458 ns [0m[1m<[22m

 Memory estimate[90m: [39m[33m160 bytes[39m, allocs estimate[90m: [39m[33m3[39m.mimetext/plainrootassigneelast_run_timestampAE)7;yݰpersist_js_state·has_pluto_hook_features§cell_id$294c9958-5e2b-4b95-ba49-ecda696190b6depends_on_disabled_cells§runtime΄0published_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="onocftkcnzvt"><input type="checkbox" checked></bond></p>
</div>mimetext/htmlrootassigneelast_run_timestampAE)2persist_js_state·has_pluto_hook_features§cell_id$ae709a34-9244-44ee-a004-381fc9b6cd0cdepends_on_disabled_cells§runtimeA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)Z}persist_js_state·has_pluto_hook_features§cell_id$d35aa76c-b4e6-45f8-a4e3-ba37d674db82depends_on_disabled_cells§runtime published_object_keysdepends_on_skipped_cells§errored$fd53c52d-8acd-4ca5-bcf0-8375d64179ccqueued¤logsrunning¦outputbodyelements1.0text/plain"Success"text/plaintypeTupleobjectid1f0a077cbaf1429fmime!application/vnd.pluto.tree+objectrootassigneetlast_run_timestampAE)4vi8persist_js_state·has_pluto_hook_features§cell_id$fd53c52d-8acd-4ca5-bcf0-8375d64179ccdepends_on_disabled_cells§runtime1published_object_keysdepends_on_skipped_cells§errored$04ba8dc8-7b85-4bde-82fe-8d7e16d9142dqueued¤logsrunning¦outputbodymimetext/plainrootassigneelast_run_timestampAE)513persist_js_state·has_pluto_hook_features§cell_id$04ba8dc8-7b85-4bde-82fe-8d7e16d9142ddepends_on_disabled_cells§runtime6published_object_keysdepends_on_skipped_cells§errored$b7bdbd76-4bb1-473d-b3a7-f5757a42d6caqueued¤logsrunning¦outputbody0mimetext/plainrootassignee@allocated mis2last_run_timestampAE)4!persist_js_state·has_pluto_hook_features§cell_id$b7bdbd76-4bb1-473d-b3a7-f5757a42d6cadepends_on_disabled_cells§runtime Epublished_object_keysdepends_on_skipped_cells§errored$1b42bd08-9611-4d96-9d91-fdce9d24982fqueued¤logsrunning¦outputbodyBenchmarkTools.Trial: 10000 samples with 997 evaluations per sample.
 Range [90m([39m[36m[1mmin[22m[39m … [35mmax[39m[90m):  [39m[36m[1m19.052 ns[22m[39m … [35m39.793 ns[39m  [90m┊[39m GC [90m([39mmin … max[90m): [39m0.00% … 0.00%
 Time  [90m([39m[34m[1mmedian[22m[39m[90m):     [39m[34m[1m19.254 ns              [22m[39m[90m┊[39m GC [90m([39mmedian[90m):    [39m0.00%
 Time  [90m([39m[32m[1mmean[22m[39m ± [32mσ[39m[90m):   [39m[32m[1m19.460 ns[22m[39m ± [32m 1.119 ns[39m  [90m┊[39m GC [90m([39mmean ± σ[90m):  [39m0.00% ± 0.00%

  [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█
  19.1 ns[90m      [39m[90mHistogram: [39m[90m[1mlog([22m[39m[90mfrequency[39m[90m[1m)[22m[39m[90m by time[39m      26.5 ns [0m[1m<[22m

 Memory estimate[90m: [39m[33m0 bytes[39m, allocs estimate[90m: [39m[33m0[39m.mimetext/plainrootassigneelast_run_timestampAE)4=persist_js_state·has_pluto_hook_features§cell_id$1b42bd08-9611-4d96-9d91-fdce9d24982fdepends_on_disabled_cells§runtimeP&%published_object_keysdepends_on_skipped_cells§errored$a1f3a295-7f63-46e1-a493-5082a86dc1abqueued¤logsrunning¦outputbodyً<div class="markdown"><h4 id="What-if-I-want-to-mutate-my-struct&#39;s?">What if I want to mutate my <code>struct</code>&#39;s?</h4>
</div>mimetext/htmlrootassigneelast_run_timestampAE)4vpersist_js_state·has_pluto_hook_features§cell_id$a1f3a295-7f63-46e1-a493-5082a86dc1abdepends_on_disabled_cells§runtime εpublished_object_keysdepends_on_skipped_cells§errored$b718654a-2490-4bac-a1af-54f959eed0fbqueued¤logsrunning¦outputbody"Lorem ipsum dolor sit amet"mimetext/plainrootassigneelast_run_timestampAE)4wpersist_js_state·has_pluto_hook_features§cell_id$b718654a-2490-4bac-a1af-54f959eed0fbdepends_on_disabled_cells§runtime/published_object_keysdepends_on_skipped_cells§errored$15f1d255-0aa9-4837-b76e-1f7b401c93caqueued¤logsrunning¦outputbody-@NamedTuple{result::Float64, message::String}mimetext/plainrootassigneelast_run_timestampAE)4.persist_js_state·has_pluto_hook_features§cell_id$15f1d255-0aa9-4837-b76e-1f7b401c93cadepends_on_disabled_cells§runtime+˵published_object_keysdepends_on_skipped_cells§errored$624e8936-de28-4e09-9a4e-3ef2f6c7d9b0queued¤logsrunning¦outputbodymimetext/plainrootassigneelast_run_timestampAE)1GZpersist_js_state·has_pluto_hook_features§cell_id$624e8936-de28-4e09-9a4e-3ef2f6c7d9b0depends_on_disabled_cells§runtimehpublished_object_keysdepends_on_skipped_cells§errored$5f45fe0e-81df-4dd5-b827-628e0831755equeued¤logsrunning¦outputbodyV<div class="markdown"><h3 id="Potentially-additional-optional-parameters">Potentially additional optional parameters</h3>
<p>E.g., Here we can turn off &quot;tag checking&quot;.  &#40;See <a href="https://juliadiff.org/ForwardDiff.jl/dev/user/advanced/#Custom-tags-and-tag-checking">documentation about custom tags</a> for details.</p>
</div>mimetext/htmlrootassigneelast_run_timestampAE)BFpersist_js_state·has_pluto_hook_features§cell_id$5f45fe0e-81df-4dd5-b827-628e0831755edepends_on_disabled_cells§runtime %published_object_keysdepends_on_skipped_cells§errored$76187747-1b2f-42e1-b0e7-509b0ed42b6aqueued¤logsrunning¦outputbodyelements8text/plain26text/plaintypeTupleobjectidf80fc982437c4eccmime!application/vnd.pluto.tree+objectrootassigneelast_run_timestampAE)4]persist_js_state·has_pluto_hook_features§cell_id$76187747-1b2f-42e1-b0e7-509b0ed42b6adepends_on_disabled_cells§runtimeMipublished_object_keysdepends_on_skipped_cells§errored$aa3233da-122d-40a3-80bb-9b6472906ec0queued¤logsrunning¦outputbodyfalsemimetext/plainrootassigneelast_run_timestampAE)5(+Apersist_js_state·has_pluto_hook_features§cell_id$aa3233da-122d-40a3-80bb-9b6472906ec0depends_on_disabled_cells§runtime/published_object_keysdepends_on_skipped_cells§errored$541bbf9f-afa5-4837-83b1-84017bccc25cqueued¤logslinemsg-  0.000001 seconds (2 allocations: 80 bytes)
text/plaincell_id$541bbf9f-afa5-4837-83b1-84017bccc25ckwargsidPlutoRunner_d1acb81efileP/home/runner/.julia/packages/Pluto/CBqeh/src/runner/PlutoRunner/src/io/stdout.jlgroupstdoutlevelLogLevel(-555)running¦outputbodyprefixInt64elements1text/plain2text/plaintypeArrayprefix_shortobjectid4868c08b5b5a105bmime!application/vnd.pluto.tree+objectrootassignee@time v0last_run_timestampAE)4@persist_js_state·has_pluto_hook_features§cell_id$541bbf9f-afa5-4837-83b1-84017bccc25cdepends_on_disabled_cells§runtime 9published_object_keysdepends_on_skipped_cells§errored$0089fbf7-4aa8-4481-a52b-bc4d929ce1fdqueued¤logsrunning¦outputbodyelements0.816497text/plainprefixFloat64elements0.680414text/plain0.136083text/plaintypeArrayprefix_shortobjectidf4b551bad902f96!application/vnd.pluto.tree+objecttypeTupleobjectidb0ed887b8a73d1b2mime!application/vnd.pluto.tree+objectrootassigneelast_run_timestampAE)7>Ұpersist_js_state·has_pluto_hook_features§cell_id$0089fbf7-4aa8-4481-a52b-bc4d929ce1fddepends_on_disabled_cells§runtime published_object_keysdepends_on_skipped_cells§errored$66968290-4f45-49e9-a377-7d2b101a822fqueued¤logsrunning¦outputbodyprefix9FixedSizeArrays.FixedSizeArray{Int64, 1, Memory{Int64}}: elements1text/plain0text/plain3text/plaintypeArrayprefix_short9FixedSizeArrays.FixedSizeArray{Int64, 1, Memory{Int64}}: objectidf2ddeeb708d9f0a7mime!application/vnd.pluto.tree+objectrootassigneelast_run_timestampAE)5OXCpersist_js_state·has_pluto_hook_features§cell_id$66968290-4f45-49e9-a377-7d2b101a822fdepends_on_disabled_cells§runtimepublished_object_keysdepends_on_skipped_cells§errored$46d06e5b-5968-4cdb-97f3-f774f633cce0queued¤logsrunning¦outputbody<div class="markdown"><h2 id="Garbage-Collection">Garbage Collection</h2>
<ul>
<li><p>When try to allocate from heap, language may decide to run <strong>garbage collector</strong>.</p>
</li>
<li><p>Checks whether it&#39;s possible for code to reach memory that has been allocated.</p>
</li>
<li><p>If not, marks it for deallocation.</p>
</li>
<li><p>This can cause an unexpected delay.</p>
</li>
</ul>
</div>mimetext/htmlrootassigneelast_run_timestampAE)persist_js_state·has_pluto_hook_features§cell_id$46d06e5b-5968-4cdb-97f3-f774f633cce0depends_on_disabled_cells§runtime Ipublished_object_keysdepends_on_skipped_cells§errored$ed0bc201-03c0-448b-bfeb-9f43d7e9ad7aqueued¤logsrunning¦outputbody٥<div class="markdown"><p><a href="https://colin-scott.github.io/personal_website/research/interactive_latency.html">Interactive Memory Latency vs Year</a></p>
</div>mimetext/htmlrootassigneelast_run_timestampAE)}persist_js_state·has_pluto_hook_features§cell_id$ed0bc201-03c0-448b-bfeb-9f43d7e9ad7adepends_on_disabled_cells§runtime }published_object_keysdepends_on_skipped_cells§errored$d7fe5753-f02d-4a04-8967-32441149dfe4queued¤logsrunning¦outputbodyprefixMyImmutableStructelementsresult2.0text/plainmessage"Lorem ipsum dolor sit amet"text/plaintypestructprefix_shortMyImmutableStructobjectidc74bd3b88d29149emime!application/vnd.pluto.tree+objectrootassigneemislast_run_timestampAE)4_Npersist_js_state·has_pluto_hook_features§cell_id$d7fe5753-f02d-4a04-8967-32441149dfe4depends_on_disabled_cells§runtime.published_object_keysdepends_on_skipped_cells§errored$4c724a18-e3dc-4cdb-997c-b3687b0d51c5queued¤logsrunning¦outputbody"Success"mimetext/plainrootassigneelast_run_timestampAE)4]Fpersist_js_state·has_pluto_hook_features§cell_id$4c724a18-e3dc-4cdb-997c-b3687b0d51c5depends_on_disabled_cells§runtime,/published_object_keysdepends_on_skipped_cells§errored$bf07ac72-3fd3-4062-beb6-8bbcd2a95771queued¤logsrunning¦outputbodyx<div class="pluto-docs-binding">
<span id="multiply_matrix_vector_preallocated!">multiply_matrix_vector_preallocated!</span>
<div class="markdown"><p><code>multiply_matrix_vector_preallocated&#33;&#40;out::Vector, A::Matrix, b::Vector&#41;</code></p>
<p>Multiply matrix A and vector b by hand using rows for inner loop, using preallocated space for output</p>


</div>
</div>
mimetext/htmlrootassigneelast_run_timestampAE)2@persist_js_state·has_pluto_hook_features§cell_id$bf07ac72-3fd3-4062-beb6-8bbcd2a95771depends_on_disabled_cells§runtimepublished_object_keysdepends_on_skipped_cells§errored$060bc23d-52fa-4536-aa50-26390552997fqueued¤logsrunning¦outputbodymimetext/plainrootassigneelast_run_timestampAE)2DVpersist_js_state·has_pluto_hook_features§cell_id$060bc23d-52fa-4536-aa50-26390552997fdepends_on_disabled_cells§runtime>published_object_keysdepends_on_skipped_cells§errored$35332b4e-4caa-4448-a345-d272a6362647queued¤logsrunning¦outputbodyprefix$StaticArraysCore.SVector{3, Int64}: elements1text/plain2text/plain3text/plaintypeArrayprefix_short$StaticArraysCore.SVector{3, Int64}: objectid6e3572bbde4bef3cmime!application/vnd.pluto.tree+objectrootassigneelast_run_timestampAE)5 7persist_js_state·has_pluto_hook_features§cell_id$35332b4e-4caa-4448-a345-d272a6362647depends_on_disabled_cells§runtime!Ƶpublished_object_keysdepends_on_skipped_cells§errored$63ec6f40-1f29-4bf5-b48a-124f1e8d783bqueued¤logsrunning¦outputbodyٟ<div class="markdown"><div class="admonition question"><p class="admonition-title">Question:</p><p>Will this be stored on the stack or heap?</p>

</div>
</div>mimetext/htmlrootassigneelast_run_timestampAE)4 persist_js_state·has_pluto_hook_features§cell_id$63ec6f40-1f29-4bf5-b48a-124f1e8d783bdepends_on_disabled_cells§runtimeO6published_object_keysdepends_on_skipped_cells§errored$318991c3-f693-4364-8e99-623883739a86queued¤logslinemsg,  0.000001 seconds (1 allocation: 48 bytes)
text/plaincell_id$318991c3-f693-4364-8e99-623883739a86kwargsidPlutoRunner_d1acb81efileP/home/runner/.julia/packages/Pluto/CBqeh/src/runner/PlutoRunner/src/io/stdout.jlgroupstdoutlevelLogLevel(-555)running¦outputbody3.0mimetext/plainrootassigneelast_run_timestampAE)5E}persist_js_state·has_pluto_hook_features§cell_id$318991c3-f693-4364-8e99-623883739a86depends_on_disabled_cells§runtime m'published_object_keysdepends_on_skipped_cells§errored$e7d4bc52-ee18-4d0b-8bab-591b688398fequeued¤logsrunning¦outputbodyP<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")) && !el.classList.contains("no-toc")
	)
}


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 id = title_el.matches("assignee") ?
		title_el.innerText.replace(/^const /, "") :
		title_el.id ?
		title_el.id :
		parent_cell.id
	
	const inner_html = title_el.innerHTML
		
	const a = html`<a 
		class="${className}" 
		title="${title_el.innerText}"
		href="#${id}"
	>${inner_html}</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();
		history.replaceState(null, null, a.href)
		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',
			})
	   )
	}
	   
	// Remove any `id` attributes recursively, because they may interfere with linking-to-id using `#`
	const removeIdAttributes = (el) => {
		if (el && el.nodeType === 1) { // Element node
			if (el.hasAttribute?.("id")) el.removeAttribute?.("id")
			el.childNodes.forEach(removeIdAttributes)
		}
	}
	removeIdAttributes(a)

	// Remove Click-To-Copy-Header-ID feature
	a.querySelectorAll("pluto-header-id-copy-wrapper").forEach(el => el.remove())

	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 match_listener = () => {
	const small = (tocNode.closest("pluto-editor") ?? document.body).scrollWidth < 1000
	tocNode.classList.toggle("smallscreen", small)
	tocNode.classList.toggle("hide", small)
}
for(let s of [1000, 1100, 1200, 1300, 1400, 1500, 1600, 1700, 1800, 1900, 2000]) {
	let m = matchMedia(`(max-width: ${s}px)`)
	m.addListener(match_listener)
	invalidation.then(() => m.removeListener(match_listener))
}
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)
})

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

.plutoui-toc {
	font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Cantarell, "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;
	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.smallscreen:not(.hide) {
	box-shadow: 0 0 11px 0px #00000010;
}

.plutoui-toc.aside.hide {
	transform: translateX(calc(100% - 28px));
	color: transparent;
}
.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)2Ϫqpersist_js_state·has_pluto_hook_features§cell_id$e7d4bc52-ee18-4d0b-8bab-591b688398fedepends_on_disabled_cells§runtime:Ppublished_object_keysdepends_on_skipped_cells§errored$a1c68295-1450-4d5d-833d-57a7eabdbf22queued¤logsrunning¦outputbody<div class="markdown"><h3 id="Optional-parameter-for-improved-performance">Optional parameter for improved performance</h3>
<p>Here we specify the <a href="https://juliadiff.org/ForwardDiff.jl/dev/user/advanced/#Configuring-Chunk-Size">chunk size</a> that affects both how many calls to the function &#40;larger chunk→fewer calls&#41; and how much memory is needed &#40;larger chunk→more memory&#41;</p>
</div>mimetext/htmlrootassigneelast_run_timestampAE)$tpersist_js_state·has_pluto_hook_features§cell_id$a1c68295-1450-4d5d-833d-57a7eabdbf22depends_on_disabled_cells§runtime 7published_object_keysdepends_on_skipped_cells§errored$12e4d1e4-d284-4180-8342-d58dda578272queued¤logslinemsgX  0.000000 seconds (1 allocation: 32 bytes)
  0.000000 seconds (1 allocation: 48 bytes)
text/plaincell_id$12e4d1e4-d284-4180-8342-d58dda578272kwargsidPlutoRunner_d1acb81efileP/home/runner/.julia/packages/Pluto/CBqeh/src/runner/PlutoRunner/src/io/stdout.jlgroupstdoutlevelLogLevel(-555)running¦outputbodyprefix$StaticArraysCore.MVector{4, Int64}: elements1text/plain2text/plain3text/plain4text/plaintypeArrayprefix_short$StaticArraysCore.MVector{4, Int64}: objectida79ccb83cb18f63mime!application/vnd.pluto.tree+objectrootassigneelast_run_timestampAE)5<=persist_js_state·has_pluto_hook_features§cell_id$12e4d1e4-d284-4180-8342-d58dda578272depends_on_disabled_cells§runtime(#Ypublished_object_keysdepends_on_skipped_cells§errored$5de73fe6-fb0e-4a98-b2ba-f4e592f02006queued¤logsrunning¦outputbodyBenchmarkTools.Trial: 10000 samples with 994 evaluations per sample.
 Range [90m([39m[36m[1mmin[22m[39m … [35mmax[39m[90m):  [39m[36m[1m33.230 ns[22m[39m … [35m  8.243 μs[39m  [90m┊[39m GC [90m([39mmin … max[90m): [39m 0.00% … 98.68%
 Time  [90m([39m[34m[1mmedian[22m[39m[90m):     [39m[34m[1m34.309 ns               [22m[39m[90m┊[39m GC [90m([39mmedian[90m):    [39m 0.00%
 Time  [90m([39m[32m[1mmean[22m[39m ± [32mσ[39m[90m):   [39m[32m[1m48.182 ns[22m[39m ± [32m115.879 ns[39m  [90m┊[39m GC [90m([39mmean ± σ[90m):  [39m23.94% ± 13.01%

  [34m█[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 [39m▁
  [34m█[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 [39m█
  33.2 ns[90m       [39m[90mHistogram: [39m[90m[1mlog([22m[39m[90mfrequency[39m[90m[1m)[22m[39m[90m by time[39m       532 ns [0m[1m<[22m

 Memory estimate[90m: [39m[33m320 bytes[39m, allocs estimate[90m: [39m[33m2[39m.mimetext/plainrootassigneelast_run_timestampAE)3*̰persist_js_state·has_pluto_hook_features§cell_id$5de73fe6-fb0e-4a98-b2ba-f4e592f02006depends_on_disabled_cells§runtime·Gpublished_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)282persist_js_state·has_pluto_hook_features§cell_id$9ec9429d-c1f1-4845-a514-9c88b452071fdepends_on_disabled_cells§runtime Ipublished_object_keysdepends_on_skipped_cells§errored$2ad27ea5-77f7-4532-9005-7a63160e2503queued¤logsrunning¦outputbodyٖ<div class="markdown"><h2 id="Keeping-small-arrays-in-the-stack-and-out-of-the-heap">Keeping small arrays in the stack and out of the heap</h2>
</div>mimetext/htmlrootassigneelast_run_timestampAE)sXpersist_js_state·has_pluto_hook_features§cell_id$2ad27ea5-77f7-4532-9005-7a63160e2503depends_on_disabled_cells§runtime Fpublished_object_keysdepends_on_skipped_cells§errored$6371bcc6-3253-4dc4-82f8-647aedf4014equeued¤logsrunning¦outputbodyt<div class="markdown"><h4 id="Why-default-to-immutable?">Why default to immutable?</h4>
<ul>
<li><p>Often is more efficient. </p>
</li>
<li><p>Some structs can be packed efficiently into arrays</p>
</li>
<li><p>Compiler is often able to avoid allocating immutable objects.</p>
</li>
<li><p>Code using immutable objects can be easier to reason about.</p>
</li>
</ul>
</div>mimetext/htmlrootassigneelast_run_timestampAE)persist_js_state·has_pluto_hook_features§cell_id$6371bcc6-3253-4dc4-82f8-647aedf4014edepends_on_disabled_cells§runtime Gpublished_object_keysdepends_on_skipped_cells§errored$3b3d6fdb-5066-48f1-aa64-e28f5ad3c1f1queued¤logsrunning¦outputbodyN<details>
	<summary>Curious to learn more?</summary>
	<div class="details-content">
		<plutoui-detail><div class="markdown"><div class="admonition tip"><p class="admonition-title">Pro Tip</p><p>Julia&#39;s garbage collector is &quot;a non-compacting, generational, mark-and-sweep, tracing collector, which at a high level means the following…</p>
<p><strong>Mark-Sweep / Tracing</strong>:</p>
<ul>
<li><p>When the garbage collector runs, it starts from a set of “roots” and walks through the object graph, “marking” objects as reachable.</p>
</li>
<li><p>Any object that isn’t marked as reachable and will then be “swept away” — i.e. its memory is reclaimed—since you know it’s not reachable from the roots and is therefore garbage.</p>
</li>
</ul>
<p><strong>Generational</strong>:</p>
<ul>
<li><p>It’s common that more recently allocated objects become garbage more quickly—this is known as the “generational hypothesis”.</p>
</li>
<li><p>Generational collectors have different levels of collection: young collections which run more frequently and full collections which run less frequently.</p>
</li>
<li><p>If the generational hypothesis is true, this saves time since it’s a waste of time to keep checking if older objects are garbage when they’re probably not.&quot; </p>
</li>
</ul>
<p><strong>Non-compacting / Non-moving</strong>:</p>
<ul>
<li><p>Other garbage collection techniques can copy or move objects during the collection process.  </p>
</li>
<li><p>Julia does not use any of these—collection does not move or copy anything, it just reclaims unreachable objects.</p>
</li>
</ul>
<p>If you’re having issues with garbage collection, your primary recourse is to generate less garbage:</p>
<ul>
<li><p>Write non-allocating code wherever possible: simple scalar code can generally avoid allocations.</p>
</li>
<li><p>Use immutable objects &#40;i.e., <code>struct</code> rather than <code>mutable struct</code>&#41;, which can be stack allocated more easily and stored inline in other structures &#40;as compared to mutable objects which generally need to be heap-allocated and stored indirectly by pointer, all of which causes more memory pressure&#41;.</p>
</li>
<li><p>Use pre-allocated data structures and modify them instead of allocating and returning new objects, especially in loops.</p>
</li>
<li><p>Can call <code>GC.gc&#40;&#41;</code> to manually call garbage collector.  But this is mainly useful for benchmarking.</p>
</li>
</ul>
<p>&#40;nearly quote from <a href="https://discourse.julialang.org/t/details-about-julias-garbage-collector-reference-counting/18021">Julia Discourse post by Stefan Karpinski</a>&#41;</p>

</div>
</div></plutoui-detail>
	</div>
</details>
<style type="text/css">
plutoui-detail {
	display: block;
	margin-block-end: var(--pluto-cell-spacing);
}

plutoui-detail:last-child {
	margin-block-end: 0;
}

pluto-output div.summary-title-outer {
	display: inline-flex;
	vertical-align: text-top;
	width: calc(100% - 1em);
	margin-left: -1em;
	padding-left: 1em;
}

pluto-output div.summary-title-outer > div.summary-title-inner {
	display: inline-block;
}
</style>

mimetext/htmlrootassigneelast_run_timestampAE)4XNpersist_js_state·has_pluto_hook_features§cell_id$3b3d6fdb-5066-48f1-aa64-e28f5ad3c1f1depends_on_disabled_cells§runtimepublished_object_keysdepends_on_skipped_cells§errored$e46c0510-f604-4025-bef5-9029e3747447queued¤logsrunning¦outputbody<div class="markdown"><p>Physical differences cause large difference in memory <strong>latency</strong> and <strong>bandwidth</strong>:</p>
<h3 id="Memory-latency-heirarchy">Memory latency heirarchy</h3>
<ul>
<li><p>Registers</p>
</li>
<li><p>Cache L1</p>
</li>
<li><p>Cache L2</p>
</li>
<li><p>Cache L3</p>
</li>
<li><p>RAM</p>
</li>
<li><p>Local disk storage</p>
</li>
<li><p>Disk storage on local network</p>
</li>
<li><p>Disk storage on internet</p>
</li>
<li><p>Tape storage</p>
</li>
</ul>
</div>mimetext/htmlrootassigneelast_run_timestampAE)Spersist_js_state·has_pluto_hook_features§cell_id$e46c0510-f604-4025-bef5-9029e3747447depends_on_disabled_cells§runtime 5published_object_keysdepends_on_skipped_cells§errored$c7e5ad3c-a3ce-47a4-9154-ca33edc2811bqueued¤logsrunning¦outputbodyt<div class="markdown"><h4 id="Meaning-of-equality-can-be-confusing">Meaning of equality can be confusing</h4>
</div>mimetext/htmlrootassigneelast_run_timestampAE);persist_js_state·has_pluto_hook_features§cell_id$c7e5ad3c-a3ce-47a4-9154-ca33edc2811bdepends_on_disabled_cells§runtime Tpublished_object_keysdepends_on_skipped_cells§errored$41c6bcb6-c5c5-4a52-a678-31ffa22641e1queued¤logsrunning¦outputbody32mimetext/plainrootassignee@allocated mms2last_run_timestampAE)4persist_js_state·has_pluto_hook_features§cell_id$41c6bcb6-c5c5-4a52-a678-31ffa22641e1depends_on_disabled_cells§runtime 쐵published_object_keysdepends_on_skipped_cells§errored$ff336de5-cf53-41ca-9cc9-1ab37b851be3queued¤logslinemsg-  0.000000 seconds (2 allocations: 80 bytes)
text/plaincell_id$ff336de5-cf53-41ca-9cc9-1ab37b851be3kwargsidPlutoRunner_d1acb81efileP/home/runner/.julia/packages/Pluto/CBqeh/src/runner/PlutoRunner/src/io/stdout.jlgroupstdoutlevelLogLevel(-555)running¦outputbodyprefixInt64elements1text/plain2text/plain3text/plaintypeArrayprefix_shortobjectid2343ba8c69e2abd0mime!application/vnd.pluto.tree+objectrootassignee@time v1last_run_timestampAE)4persist_js_state·has_pluto_hook_features§cell_id$ff336de5-cf53-41ca-9cc9-1ab37b851be3depends_on_disabled_cells§runtime ϵpublished_object_keysdepends_on_skipped_cells§errored$9cc467f9-cc48-4026-87c5-dadfe239c5dbqueued¤logsrunning¦outputbody<div class="markdown"><h3 id="Implications">Implications</h3>
<ul>
<li><p>Mutable objects typically go onto heap </p>
</li>
<li><p>→ Only make structs mutable if a reason.</p>
</li>
<li><p>An immutable object can contain mutable objects &#40;e.g., arrays&#41;.</p>
</li>
</ul>
</div>mimetext/htmlrootassigneelast_run_timestampAE)Zްpersist_js_state·has_pluto_hook_features§cell_id$9cc467f9-cc48-4026-87c5-dadfe239c5dbdepends_on_disabled_cells§runtime published_object_keysdepends_on_skipped_cells§errored$5287e3b8-2309-4c78-91f0-f80e7ae7f209queued¤logsrunning¦outputbodymimetext/plainrootassigneelast_run_timestampAE)4rpersist_js_state·has_pluto_hook_features§cell_id$5287e3b8-2309-4c78-91f0-f80e7ae7f209depends_on_disabled_cells§runtime õpublished_object_keysdepends_on_skipped_cells§errored$1fa422e7-329d-4072-a786-fb73c718e49equeued¤logsrunning¦outputbody16mimetext/plainrootassigneelast_run_timestampAE)4Epersist_js_state·has_pluto_hook_features§cell_id$1fa422e7-329d-4072-a786-fb73c718e49edepends_on_disabled_cells§runtime&published_object_keysdepends_on_skipped_cells§errored$75661d12-7709-44d0-a5f3-d6c9a5eff952queued¤logsrunning¦outputbodyelementsTuple{Float64, String}text/plain16text/plaintypeTupleobjectidf22425dbcf9bc7dcmime!application/vnd.pluto.tree+objectrootassigneelast_run_timestampAE)4Ipersist_js_state·has_pluto_hook_features§cell_id$75661d12-7709-44d0-a5f3-d6c9a5eff952depends_on_disabled_cells§runtime4published_object_keysdepends_on_skipped_cells§errored$d6019e5a-e7a1-4676-a3f1-24fe62bfa931queued¤logsrunning¦outputbody2mimetext/plainrootassigneechunk_sizelast_run_timestampAE)7=Vpersist_js_state·has_pluto_hook_features§cell_id$d6019e5a-e7a1-4676-a3f1-24fe62bfa931depends_on_disabled_cells§runtime(۵published_object_keysdepends_on_skipped_cells§errored$ee76a23e-e940-4b32-a44a-9086d0461089queued¤logsrunning¦outputbodyelements0.816497text/plainprefixFloat64elements0.680414text/plain0.136083text/plaintypeArrayprefix_shortobjectid57e6a3a950248ad8!application/vnd.pluto.tree+objecttypeTupleobjectid5b575aca9b87c25emime!application/vnd.pluto.tree+objectrootassigneelast_run_timestampAE)6@persist_js_state·has_pluto_hook_features§cell_id$ee76a23e-e940-4b32-a44a-9086d0461089depends_on_disabled_cells§runtimepublished_object_keysdepends_on_skipped_cells§errored$aac0c3f8-ece3-431e-859d-790b8f3b995aqueued¤logslinemsgYou can't do that!text/plaincell_id$aac0c3f8-ece3-431e-859d-790b8f3b995akwargsidMain_workspace#2_f1de69eafilen/home/runner/work/Notes-Fall2025/Notes-Fall2025/week4/week4_discuss.jl#==#aac0c3f8-ece3-431e-859d-790b8f3b995agroupweek4_discusslevelWarnrunning¦outputbodymimetext/plainrootassigneelast_run_timestampAE)4persist_js_state·has_pluto_hook_features§cell_id$aac0c3f8-ece3-431e-859d-790b8f3b995adepends_on_disabled_cells§runtime dkpublished_object_keysdepends_on_skipped_cells§errored$c4da391c-e7dc-4ce1-9ccb-04aa2ca79e26queued¤logsrunning¦outputbody<div class="markdown"><div class="admonition hint"><p class="admonition-title">Hint</p><ul>
<li><p><code>sizeof&#40;mms&#41; &#61;</code> 16 </p>
</li>
<li><p><code>sizeof&#40;mms.result&#41; &#61;</code> 8</p>
</li>
<li><p><code>sizeof&#40;mms.message&#41; &#61;</code> 26</p>
</li>
<li><p><code>Base.summarysize&#40;mms.message&#41; &#61;</code>34</p>
</li>
<li><p><code>Base.summarysize&#40;mms&#41; &#61;</code>50</p>
</li>
</ul>

</div>
</div>mimetext/htmlrootassigneelast_run_timestampAE)4ױlpersist_js_state·has_pluto_hook_features§cell_id$c4da391c-e7dc-4ce1-9ccb-04aa2ca79e26depends_on_disabled_cells§runtime=,ppublished_object_keysdepends_on_skipped_cells§errored$9007f240-c88e-46c4-993d-fd6b93d8b18dqueued¤logsrunning¦outputbody<div class="markdown"><h1 id="Week-4-Admin-Announcements">Week 4 Admin Announcements</h1>
<h2 id="Project-proposals">Project proposals</h2>
<h3 id="Feedback">Feedback</h3>
<ul>
<li><p>Project repo, Pull requests, Feedback &#40;either Conversation or Files view&#41; </p>
</li>
<li><p>I&#39;ll look for any replies once I&#39;ve finished providing feedback to everyone.</p>
</li>
</ul>
</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$cb988242-8aa6-4f31-955e-021024e0c921queued¤logsrunning¦outputbody"f (generic function with 1 method)mimetext/plainrootassigneelast_run_timestampAE)5X+persist_js_state·has_pluto_hook_features§cell_id$cb988242-8aa6-4f31-955e-021024e0c921depends_on_disabled_cells§runtime 	Opublished_object_keysdepends_on_skipped_cells§errored$7d1edb0b-3144-4ac7-a939-2e211cdee81bqueued¤logsrunning¦outputbody~<div class="markdown"><h3 id="Mutating-version-for-improved-performance">Mutating version for improved performance</h3>
</div>mimetext/htmlrootassigneelast_run_timestampAE)persist_js_state·has_pluto_hook_features§cell_id$7d1edb0b-3144-4ac7-a939-2e211cdee81bdepends_on_disabled_cells§runtime opublished_object_keysdepends_on_skipped_cells§errored$c6eb773e-757e-466e-ba15-593c2b19fd1cqueued¤logsrunning¦outputbodyprefixFloat64elements0.680414text/plain0.136083text/plaintypeArrayprefix_shortobjectidc55bd776cc338c50mime!application/vnd.pluto.tree+objectrootassigneelast_run_timestampAE)6Ipersist_js_state·has_pluto_hook_features§cell_id$c6eb773e-757e-466e-ba15-593c2b19fd1cdepends_on_disabled_cells§runtime0۵published_object_keysdepends_on_skipped_cells§errored$4772a931-14a6-46c9-8b8c-44b39d213216queued¤logslinemsg&  0.000000 seconds
  0.000000 seconds
text/plaincell_id$4772a931-14a6-46c9-8b8c-44b39d213216kwargsidPlutoRunner_d1acb81efileP/home/runner/.julia/packages/Pluto/CBqeh/src/runner/PlutoRunner/src/io/stdout.jlgroupstdoutlevelLogLevel(-555)running¦outputbodymimetext/plainrootassigneelast_run_timestampAE)4tpersist_js_state·has_pluto_hook_features§cell_id$4772a931-14a6-46c9-8b8c-44b39d213216depends_on_disabled_cells§runtimepublished_object_keysdepends_on_skipped_cells§errored$cf7990f7-40ec-4a99-be58-e5342061baedqueued¤logsrunning¦outputbodyl<div class="markdown"><h4 id="Limitations-of-immutable-structs">Limitations of immutable structs</h4>
</div>mimetext/htmlrootassigneelast_run_timestampAE)4persist_js_state·has_pluto_hook_features§cell_id$cf7990f7-40ec-4a99-be58-e5342061baeddepends_on_disabled_cells§runtime ٵpublished_object_keysdepends_on_skipped_cells§errored$397e78ca-8b07-4593-8c92-9b69cbc9d2a3queued¤logsrunning¦outputbodyق<div class="markdown"><h4 id="Warning-about-mutating-collections-in-Pluto">Warning about mutating collections in Pluto</h4>
</div>mimetext/htmlrootassigneelast_run_timestampAE)Qpersist_js_state·has_pluto_hook_features§cell_id$397e78ca-8b07-4593-8c92-9b69cbc9d2a3depends_on_disabled_cells§runtime (published_object_keysdepends_on_skipped_cells§errored$fc9ae0ec-298b-4542-9c71-dbbe535b4bd9queued¤logsrunning¦outputbodyd<div class="markdown"><h2 id="Pre-allocating-storage-space">Pre-allocating storage space</h2>
</div>mimetext/htmlrootassigneelast_run_timestampAE)Bpersist_js_state·has_pluto_hook_features§cell_id$fc9ae0ec-298b-4542-9c71-dbbe535b4bd9depends_on_disabled_cells§runtime published_object_keysdepends_on_skipped_cells§errored$abee77fd-e2a2-403b-ab43-b4ea6741ba4cqueued¤logsrunning¦outputbodyZ<div class="markdown"><h1 id="Computer-Memory-Systems">Computer Memory Systems</h1>
</div>mimetext/htmlrootassigneelast_run_timestampAE)npersist_js_state·has_pluto_hook_features§cell_id$abee77fd-e2a2-403b-ab43-b4ea6741ba4cdepends_on_disabled_cells§runtime published_object_keysdepends_on_skipped_cells§errored$f68fb195-1fa6-4364-8d8f-427a6ea9a4b6queued¤logsrunning¦outputbodyBenchmarkTools.Trial: 10000 samples with 998 evaluations per sample.
 Range [90m([39m[36m[1mmin[22m[39m … [35mmax[39m[90m):  [39m[36m[1m17.016 ns[22m[39m … [35m56.639 ns[39m  [90m┊[39m GC [90m([39mmin … max[90m): [39m0.00% … 0.00%
 Time  [90m([39m[34m[1mmedian[22m[39m[90m):     [39m[34m[1m17.487 ns              [22m[39m[90m┊[39m GC [90m([39mmedian[90m):    [39m0.00%
 Time  [90m([39m[32m[1mmean[22m[39m ± [32mσ[39m[90m):   [39m[32m[1m17.636 ns[22m[39m ± [32m 1.090 ns[39m  [90m┊[39m GC [90m([39mmean ± σ[90m):  [39m0.00% ± 0.00%

  [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█[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█
  17 ns[90m        [39m[90mHistogram: [39m[90m[1mlog([22m[39m[90mfrequency[39m[90m[1m)[22m[39m[90m by time[39m      24.6 ns [0m[1m<[22m

 Memory estimate[90m: [39m[33m0 bytes[39m, allocs estimate[90m: [39m[33m0[39m.mimetext/plainrootassigneelast_run_timestampAE)7persist_js_state·has_pluto_hook_features§cell_id$f68fb195-1fa6-4364-8d8f-427a6ea9a4b6depends_on_disabled_cells§runtimec̵published_object_keysdepends_on_skipped_cells§errored$cbea527b-9a62-40d4-b922-47f4428a8b33queued¤logsrunning¦outputbodyelements0.816497text/plainprefixFloat64elements0.680414text/plain0.136083text/plaintypeArrayprefix_shortobjectid5ed94140ef299d8f!application/vnd.pluto.tree+objecttypeTupleobjectidea3b79acb2662857mime!application/vnd.pluto.tree+objectrootassigneelast_run_timestampAE)7сpersist_js_state·has_pluto_hook_features§cell_id$cbea527b-9a62-40d4-b922-47f4428a8b33depends_on_disabled_cells§runtime <\published_object_keysdepends_on_skipped_cells§errored$b55fc829-c857-44bb-af5b-cbbf8dcab5e7queued¤logsrunning¦outputbodytruemimetext/plainrootassigneelast_run_timestampAE)5'persist_js_state·has_pluto_hook_features§cell_id$b55fc829-c857-44bb-af5b-cbbf8dcab5e7depends_on_disabled_cells§runtime0published_object_keysdepends_on_skipped_cells§errored$abf6e65a-292a-4f4a-8eee-ea90cd22e376queued¤logsrunning¦outputbodymimetext/plainrootassigneelast_run_timestampAE)5F3persist_js_state·has_pluto_hook_features§cell_id$abf6e65a-292a-4f4a-8eee-ea90cd22e376depends_on_disabled_cells§runtime4published_object_keysdepends_on_skipped_cells§errored$34840126-4365-418d-bc55-4ac3bd85f43fqueued¤logsrunning¦outputbody9<div class="pluto-docs-binding">
<span id="multiply_matrix_vector_allocates">multiply_matrix_vector_allocates</span>
<div class="markdown"><p><code>multiply_matrix_vector_allocates&#40;A::Matrix, b::Vector&#41;</code></p>
<p>Multiply matrix A and vector b by hand, allocating space for output</p>


</div>
</div>
mimetext/htmlrootassigneelast_run_timestampAE)20persist_js_state·has_pluto_hook_features§cell_id$34840126-4365-418d-bc55-4ac3bd85f43fdepends_on_disabled_cells§runtime |published_object_keysdepends_on_skipped_cells§errored±cell_dependencies P$138806a6-08f9-4b82-9e8c-128baab3da31precedence_heuristic	cell_id$138806a6-08f9-4b82-9e8c-128baab3da31downstream_cells_mapupstream_cells_mapnt$f632c0ab-ea32-4973-8ec9-79a7f4f4c4ad$ba5059bf-bdbb-4c35-b9e7-b7e90641dc94precedence_heuristic	cell_id$ba5059bf-bdbb-4c35-b9e7-b7e90641dc94downstream_cells_mapupstream_cells_map@md_strgetindex$6d982d26-1917-4f46-babf-e0ea19886976precedence_heuristic	cell_id$6d982d26-1917-4f46-babf-e0ea19886976downstream_cells_mapupstream_cells_mapt$fd53c52d-8acd-4ca5-bcf0-8375d64179cc$22c6cf9f-2266-4908-8bb5-ad30d7388c06precedence_heuristic	cell_id$22c6cf9f-2266-4908-8bb5-ad30d7388c06downstream_cells_mapgridupstream_cells_mapf$cb988242-8aa6-4f31-955e-021024e0c921rangecollectheatmapxlabel!ylabel!$cf5262da-1043-11ec-12fc-9916cc70070cprecedence_heuristic	cell_id$cf5262da-1043-11ec-12fc-9916cc70070cdownstream_cells_mapupstream_cells_map@md_strgetindex$23038da7-9417-48fe-8431-e5a05dcf9593precedence_heuristic	cell_id$23038da7-9417-48fe-8431-e5a05dcf9593downstream_cells_mapupstream_cells_map@md_strgetindex$3b8f0812-9700-45c4-b1ce-d8cdfe09c38bprecedence_heuristic	cell_id$3b8f0812-9700-45c4-b1ce-d8cdfe09c38bdownstream_cells_mapupstream_cells_map @timeBase.gc_alloc_countBase.*Base.-zerosBase.gc_numBase.cumulative_compile_time_nsBase.GC_DiffrandBase+Base.time_printBase.time_nsBase.Threads.lock_profilingBase./Base.cumulative_compile_timing$f0111b2d-7a7c-4029-8fd0-7c0785b5b038precedence_heuristic	cell_id$f0111b2d-7a7c-4029-8fd0-7c0785b5b038downstream_cells_mapupstream_cells_map@md_strgetindex$cf913e43-4499-4efc-87cb-2474222b8865precedence_heuristic	cell_id$cf913e43-4499-4efc-87cb-2474222b8865downstream_cells_mapupstream_cells_map@md_strgetindex$1aab953a-f524-4d93-95bf-ea5524c47b8bprecedence_heuristic	cell_id$1aab953a-f524-4d93-95bf-ea5524c47b8bdownstream_cells_mapupstream_cells_map@warn'Base.CoreLogging.Base.fixup_stdlib_pathBase.CoreLogging.===BaseBase.CoreLogging.invokelatestBase.CoreLogging.isaBase.CoreLogging.>=#___this_pluto_module_namev6$4772a931-14a6-46c9-8b8c-44b39d213216Base.CoreLogging.!$8114f59e-1a8e-49c6-baaa-20ed19747d2bprecedence_heuristic	cell_id$8114f59e-1a8e-49c6-baaa-20ed19747d2bdownstream_cells_mapupstream_cells_map@md_strgetindex$f632c0ab-ea32-4973-8ec9-79a7f4f4c4adprecedence_heuristic	cell_id$f632c0ab-ea32-4973-8ec9-79a7f4f4c4addownstream_cells_mapnt$15f1d255-0aa9-4837-b76e-1f7b401c93ca$4c724a18-e3dc-4cdb-997c-b3687b0d51c5$138806a6-08f9-4b82-9e8c-128baab3da31upstream_cells_map$348ee204-546f-46c5-bf5d-7d4a761002ecprecedence_heuristic	cell_id$348ee204-546f-46c5-bf5d-7d4a761002ecdownstream_cells_mapupstream_cells_map@md_strgetindex$2e8da77c-004b-4d59-83f4-9fb981ea5658precedence_heuristic	cell_id$2e8da77c-004b-4d59-83f4-9fb981ea5658downstream_cells_mapmms$c4da391c-e7dc-4ce1-9ccb-04aa2ca79e26upstream_cells_mapMyMutableStruct$f9714ea5-5d0e-4006-92c4-71b3e574d26c$8fe1804c-4fce-4980-bb54-dad89c3062d1precedence_heuristic	cell_id$8fe1804c-4fce-4980-bb54-dad89c3062d1downstream_cells_mapupstream_cells_mapv1$ff336de5-cf53-41ca-9cc9-1ab37b851be3$31a1f316-8098-4496-9d20-b0782358bd4fprecedence_heuristic	cell_id$31a1f316-8098-4496-9d20-b0782358bd4fdownstream_cells_mapupstream_cells_map@md_strgetindex$3f4cac5b-9b2a-4261-a01e-e2d4f692fb90precedence_heuristic	cell_id$3f4cac5b-9b2a-4261-a01e-e2d4f692fb90downstream_cells_mapm2m1upstream_cells_map @timeBase.gc_alloc_countBase.*StaticArrays.randnBase.-@SMatrixBase.gc_numBase.cumulative_compile_time_nsBase.GC_DiffStaticArrays$624e8936-de28-4e09-9a4e-3ef2f6c7d9b0BaseBase.time_printBase.time_nsBase.Threads.lock_profilingBase./Base.cumulative_compile_timing$f9714ea5-5d0e-4006-92c4-71b3e574d26cprecedence_heuristic	cell_id$f9714ea5-5d0e-4006-92c4-71b3e574d26cdownstream_cells_mapMyMutableStruct$2e8da77c-004b-4d59-83f4-9fb981ea5658$41c6bcb6-c5c5-4a52-a678-31ffa22641e1upstream_cells_mapFloat64String$99a0be67-2dac-43ba-9223-03845c528fefprecedence_heuristic	cell_id$99a0be67-2dac-43ba-9223-03845c528fefdownstream_cells_mapupstream_cells_mapf$cb988242-8aa6-4f31-955e-021024e0c921ForwardDiff$624e8936-de28-4e09-9a4e-3ef2f6c7d9b0BenchmarkTools.Parameters##x_eval#247,BenchmarkTools.generate_benchmark_definitionBenchmarkTools$624e8936-de28-4e09-9a4e-3ef2f6c7d9b0#___this_pluto_module_nameForwardDiff.gradient@benchmarkx_eval$04ba8dc8-7b85-4bde-82fe-8d7e16d9142d##f#246$0dd9307f-1390-412b-8cf6-77deb33091a0precedence_heuristic	cell_id$0dd9307f-1390-412b-8cf6-77deb33091a0downstream_cells_mapupstream_cells_map@md_strgetindex$294c9958-5e2b-4b95-ba49-ecda696190b6precedence_heuristic	cell_id$294c9958-5e2b-4b95-ba49-ecda696190b6downstream_cells_mapupstream_cells_mapf$cb988242-8aa6-4f31-955e-021024e0c921ForwardDiff$624e8936-de28-4e09-9a4e-3ef2f6c7d9b0BenchmarkTools.Parameters,BenchmarkTools.generate_benchmark_definition##result#249BenchmarkTools$624e8936-de28-4e09-9a4e-3ef2f6c7d9b0#___this_pluto_module_name##f#250DiffResults@benchmarkx_eval$04ba8dc8-7b85-4bde-82fe-8d7e16d9142dForwardDiff.gradient!##x_eval#251DiffResults.GradientResult$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$d35aa76c-b4e6-45f8-a4e3-ba37d674db82precedence_heuristic	cell_id$d35aa76c-b4e6-45f8-a4e3-ba37d674db82downstream_cells_mapupstream_cells_map@md_strgetindex$fd53c52d-8acd-4ca5-bcf0-8375d64179ccprecedence_heuristic	cell_id$fd53c52d-8acd-4ca5-bcf0-8375d64179ccdownstream_cells_mapt$6d982d26-1917-4f46-babf-e0ea19886976$75661d12-7709-44d0-a5f3-d6c9a5eff952upstream_cells_map$04ba8dc8-7b85-4bde-82fe-8d7e16d9142dprecedence_heuristic	cell_id$04ba8dc8-7b85-4bde-82fe-8d7e16d9142ddownstream_cells_mapx_eval$c6eb773e-757e-466e-ba15-593c2b19fd1c$99a0be67-2dac-43ba-9223-03845c528fef$ee76a23e-e940-4b32-a44a-9086d0461089$294c9958-5e2b-4b95-ba49-ecda696190b6$0089fbf7-4aa8-4481-a52b-bc4d929ce1fd$f68fb195-1fa6-4364-8d8f-427a6ea9a4b6$cbea527b-9a62-40d4-b922-47f4428a8b33upstream_cells_map$b7bdbd76-4bb1-473d-b3a7-f5757a42d6caprecedence_heuristic	cell_id$b7bdbd76-4bb1-473d-b3a7-f5757a42d6cadownstream_cells_mapmis2upstream_cells_mapBase.gc_bytesBaseBase.-@allocatedMyImmutableStruct$5287e3b8-2309-4c78-91f0-f80e7ae7f209$1b42bd08-9611-4d96-9d91-fdce9d24982fprecedence_heuristic	cell_id$1b42bd08-9611-4d96-9d91-fdce9d24982fdownstream_cells_mapupstream_cells_mapBenchmarkTools.Parametersnrows$060bc23d-52fa-4536-aa50-26390552997f,BenchmarkTools.generate_benchmark_definitionzeros##y#256BenchmarkTools$624e8936-de28-4e09-9a4e-3ef2f6c7d9b0#___this_pluto_module_namencols$060bc23d-52fa-4536-aa50-26390552997frand$multiply_matrix_vector_preallocated!$bf07ac72-3fd3-4062-beb6-8bbcd2a95771@benchmark##A#257##b#258$a1f3a295-7f63-46e1-a493-5082a86dc1abprecedence_heuristic	cell_id$a1f3a295-7f63-46e1-a493-5082a86dc1abdownstream_cells_mapupstream_cells_map@md_strgetindex$b718654a-2490-4bac-a1af-54f959eed0fbprecedence_heuristic	cell_id$b718654a-2490-4bac-a1af-54f959eed0fbdownstream_cells_mapupstream_cells_mapmis$d7fe5753-f02d-4a04-8967-32441149dfe4$15f1d255-0aa9-4837-b76e-1f7b401c93caprecedence_heuristic	cell_id$15f1d255-0aa9-4837-b76e-1f7b401c93cadownstream_cells_mapupstream_cells_mapnt$f632c0ab-ea32-4973-8ec9-79a7f4f4c4adtypeof$624e8936-de28-4e09-9a4e-3ef2f6c7d9b0precedence_heuristiccell_id$624e8936-de28-4e09-9a4e-3ef2f6c7d9b0downstream_cells_mapFixedSizeArraysStaticArrays$3f4cac5b-9b2a-4261-a01e-e2d4f692fb90ForwardDiff$c6eb773e-757e-466e-ba15-593c2b19fd1c$99a0be67-2dac-43ba-9223-03845c528fef$ee76a23e-e940-4b32-a44a-9086d0461089$294c9958-5e2b-4b95-ba49-ecda696190b6$0089fbf7-4aa8-4481-a52b-bc4d929ce1fd$f68fb195-1fa6-4364-8d8f-427a6ea9a4b6$cbea527b-9a62-40d4-b922-47f4428a8b33PlutoUIPlotsPlutoTestBenchmarkTools$5de73fe6-fb0e-4a98-b2ba-f4e592f02006$1b42bd08-9611-4d96-9d91-fdce9d24982f$99a0be67-2dac-43ba-9223-03845c528fef$294c9958-5e2b-4b95-ba49-ecda696190b6$f68fb195-1fa6-4364-8d8f-427a6ea9a4b6PlutoTeachingToolsupstream_cells_map$5f45fe0e-81df-4dd5-b827-628e0831755eprecedence_heuristic	cell_id$5f45fe0e-81df-4dd5-b827-628e0831755edownstream_cells_mapupstream_cells_map@md_strgetindex$76187747-1b2f-42e1-b0e7-509b0ed42b6aprecedence_heuristic	cell_id$76187747-1b2f-42e1-b0e7-509b0ed42b6adownstream_cells_mapupstream_cells_mapsizeofmis$d7fe5753-f02d-4a04-8967-32441149dfe4$aa3233da-122d-40a3-80bb-9b6472906ec0precedence_heuristic	cell_id$aa3233da-122d-40a3-80bb-9b6472906ec0downstream_cells_mapupstream_cells_mapv5$4772a931-14a6-46c9-8b8c-44b39d213216===v1$ff336de5-cf53-41ca-9cc9-1ab37b851be3$541bbf9f-afa5-4837-83b1-84017bccc25cprecedence_heuristic	cell_id$541bbf9f-afa5-4837-83b1-84017bccc25cdownstream_cells_mapv0upstream_cells_map@timeBase.gc_alloc_countBase.*Base.-Base.gc_numBase.cumulative_compile_time_nsBase.GC_DiffBaseBase.time_printBase.time_nsBase.Threads.lock_profilingBase./Base.cumulative_compile_timing$0089fbf7-4aa8-4481-a52b-bc4d929ce1fdprecedence_heuristic	cell_id$0089fbf7-4aa8-4481-a52b-bc4d929ce1fddownstream_cells_mapupstream_cells_mapf$cb988242-8aa6-4f31-955e-021024e0c921DiffResultsForwardDiff$624e8936-de28-4e09-9a4e-3ef2f6c7d9b0DiffResults.valuex_eval$04ba8dc8-7b85-4bde-82fe-8d7e16d9142dForwardDiff.gradient!chunk_size$d6019e5a-e7a1-4676-a3f1-24fe62bfa931ForwardDiff.GradientConfigDiffResults.gradientDiffResults.GradientResult$66968290-4f45-49e9-a377-7d2b101a822fprecedence_heuristic	cell_id$66968290-4f45-49e9-a377-7d2b101a822fdownstream_cells_mapupstream_cells_mapv2$318991c3-f693-4364-8e99-623883739a86$46d06e5b-5968-4cdb-97f3-f774f633cce0precedence_heuristic	cell_id$46d06e5b-5968-4cdb-97f3-f774f633cce0downstream_cells_mapupstream_cells_map@md_strgetindex$ed0bc201-03c0-448b-bfeb-9f43d7e9ad7aprecedence_heuristic	cell_id$ed0bc201-03c0-448b-bfeb-9f43d7e9ad7adownstream_cells_mapupstream_cells_map@md_strgetindex$d7fe5753-f02d-4a04-8967-32441149dfe4precedence_heuristic	cell_id$d7fe5753-f02d-4a04-8967-32441149dfe4downstream_cells_mapmis$b718654a-2490-4bac-a1af-54f959eed0fb$1fa422e7-329d-4072-a786-fb73c718e49e$76187747-1b2f-42e1-b0e7-509b0ed42b6aupstream_cells_mapMyImmutableStruct$5287e3b8-2309-4c78-91f0-f80e7ae7f209$4c724a18-e3dc-4cdb-997c-b3687b0d51c5precedence_heuristic	cell_id$4c724a18-e3dc-4cdb-997c-b3687b0d51c5downstream_cells_mapupstream_cells_mapnt$f632c0ab-ea32-4973-8ec9-79a7f4f4c4ad$bf07ac72-3fd3-4062-beb6-8bbcd2a95771precedence_heuristic	cell_id$bf07ac72-3fd3-4062-beb6-8bbcd2a95771downstream_cells_map$multiply_matrix_vector_preallocated!$34840126-4365-418d-bc55-4ac3bd85f43f$1b42bd08-9611-4d96-9d91-fdce9d24982fupstream_cells_map zero@assertTupleisless@inboundsnothinglength<Base.simd_index@simd==Base.AssertionError@doc:Base.throwAbstractVectorAbstractMatrixjulia.simdloop#___this_pluto_module_namesizeBaseBase.simd_outer_rangeBase.simd_inner_length+Union*$060bc23d-52fa-4536-aa50-26390552997fprecedence_heuristic	cell_id$060bc23d-52fa-4536-aa50-26390552997fdownstream_cells_mapnrows$5de73fe6-fb0e-4a98-b2ba-f4e592f02006$1b42bd08-9611-4d96-9d91-fdce9d24982fncols$5de73fe6-fb0e-4a98-b2ba-f4e592f02006$1b42bd08-9611-4d96-9d91-fdce9d24982fupstream_cells_map$35332b4e-4caa-4448-a345-d272a6362647precedence_heuristic	cell_id$35332b4e-4caa-4448-a345-d272a6362647downstream_cells_mapupstream_cells_mapv5$4772a931-14a6-46c9-8b8c-44b39d213216$63ec6f40-1f29-4bf5-b48a-124f1e8d783bprecedence_heuristic	cell_id$63ec6f40-1f29-4bf5-b48a-124f1e8d783bdownstream_cells_mapupstream_cells_map@md_strquestion_boxgetindex$318991c3-f693-4364-8e99-623883739a86precedence_heuristic	cell_id$318991c3-f693-4364-8e99-623883739a86downstream_cells_mapv2$abf6e65a-292a-4f4a-8eee-ea90cd22e376$66968290-4f45-49e9-a377-7d2b101a822fupstream_cells_map@timeBase.cumulative_compile_timingBase.gc_alloc_countBase.*Base.-FixedSizeArrayBase.gc_numBase.cumulative_compile_time_nsBase.GC_DiffBaseBase.time_printBase.time_nsBase.Threads.lock_profilingBase./v3$12e4d1e4-d284-4180-8342-d58dda578272$e7d4bc52-ee18-4d0b-8bab-591b688398feprecedence_heuristic	cell_id$e7d4bc52-ee18-4d0b-8bab-591b688398fedownstream_cells_mapupstream_cells_mapTableOfContentstoc_aside$ae709a34-9244-44ee-a004-381fc9b6cd0c$a1c68295-1450-4d5d-833d-57a7eabdbf22precedence_heuristic	cell_id$a1c68295-1450-4d5d-833d-57a7eabdbf22downstream_cells_mapupstream_cells_map@md_strgetindex$12e4d1e4-d284-4180-8342-d58dda578272precedence_heuristic	cell_id$12e4d1e4-d284-4180-8342-d58dda578272downstream_cells_mapv4v3$318991c3-f693-4364-8e99-623883739a86upstream_cells_map@timeBase.gc_alloc_countBase.*Base.-@MVectorBase.gc_numBase.cumulative_compile_time_nsBase.GC_DiffBaseMVectorBase.time_printBase.time_nsBase.Threads.lock_profilingBase./Base.cumulative_compile_timing$5de73fe6-fb0e-4a98-b2ba-f4e592f02006precedence_heuristic	cell_id$5de73fe6-fb0e-4a98-b2ba-f4e592f02006downstream_cells_mapupstream_cells_map##b#254BenchmarkTools.Parametersnrows$060bc23d-52fa-4536-aa50-26390552997f,BenchmarkTools.generate_benchmark_definitionBenchmarkTools$624e8936-de28-4e09-9a4e-3ef2f6c7d9b0#___this_pluto_module_namencols$060bc23d-52fa-4536-aa50-26390552997frand##A#253@benchmark multiply_matrix_vector_allocates$34840126-4365-418d-bc55-4ac3bd85f43f$9ec9429d-c1f1-4845-a514-9c88b452071fprecedence_heuristic	cell_id$9ec9429d-c1f1-4845-a514-9c88b452071fdownstream_cells_mapupstream_cells_mapWidthOverDocs$2ad27ea5-77f7-4532-9005-7a63160e2503precedence_heuristic	cell_id$2ad27ea5-77f7-4532-9005-7a63160e2503downstream_cells_mapupstream_cells_map@md_strgetindex$6371bcc6-3253-4dc4-82f8-647aedf4014eprecedence_heuristic	cell_id$6371bcc6-3253-4dc4-82f8-647aedf4014edownstream_cells_mapupstream_cells_map@md_strgetindex$3b3d6fdb-5066-48f1-aa64-e28f5ad3c1f1precedence_heuristic	cell_id$3b3d6fdb-5066-48f1-aa64-e28f5ad3c1f1downstream_cells_mapupstream_cells_map@md_strprotipgetindex$e46c0510-f604-4025-bef5-9029e3747447precedence_heuristic	cell_id$e46c0510-f604-4025-bef5-9029e3747447downstream_cells_mapupstream_cells_map@md_strgetindex$c7e5ad3c-a3ce-47a4-9154-ca33edc2811bprecedence_heuristic	cell_id$c7e5ad3c-a3ce-47a4-9154-ca33edc2811bdownstream_cells_mapupstream_cells_map@md_strgetindex$41c6bcb6-c5c5-4a52-a678-31ffa22641e1precedence_heuristic	cell_id$41c6bcb6-c5c5-4a52-a678-31ffa22641e1downstream_cells_mapmms2upstream_cells_mapBase.gc_bytesBaseBase.-@allocatedMyMutableStruct$f9714ea5-5d0e-4006-92c4-71b3e574d26c$ff336de5-cf53-41ca-9cc9-1ab37b851be3precedence_heuristic	cell_id$ff336de5-cf53-41ca-9cc9-1ab37b851be3downstream_cells_mapv1$8fe1804c-4fce-4980-bb54-dad89c3062d1$b55fc829-c857-44bb-af5b-cbbf8dcab5e7$aa3233da-122d-40a3-80bb-9b6472906ec0upstream_cells_map@timeBase.gc_alloc_countBase.*Base.-Base.gc_numBase.cumulative_compile_time_nsBase.GC_DiffBaseBase.time_printBase.time_nsBase.Threads.lock_profilingBase./Base.cumulative_compile_timing$9cc467f9-cc48-4026-87c5-dadfe239c5dbprecedence_heuristic	cell_id$9cc467f9-cc48-4026-87c5-dadfe239c5dbdownstream_cells_mapupstream_cells_map@md_strgetindex$5287e3b8-2309-4c78-91f0-f80e7ae7f209precedence_heuristic	cell_id$5287e3b8-2309-4c78-91f0-f80e7ae7f209downstream_cells_mapMyImmutableStruct$d7fe5753-f02d-4a04-8967-32441149dfe4$b7bdbd76-4bb1-473d-b3a7-f5757a42d6ca$aac0c3f8-ece3-431e-859d-790b8f3b995aupstream_cells_mapFloat64String$1fa422e7-329d-4072-a786-fb73c718e49eprecedence_heuristic	cell_id$1fa422e7-329d-4072-a786-fb73c718e49edownstream_cells_mapupstream_cells_mapsizeofmis$d7fe5753-f02d-4a04-8967-32441149dfe4$75661d12-7709-44d0-a5f3-d6c9a5eff952precedence_heuristic	cell_id$75661d12-7709-44d0-a5f3-d6c9a5eff952downstream_cells_mapupstream_cells_mapsizeoft$fd53c52d-8acd-4ca5-bcf0-8375d64179cctypeof$d6019e5a-e7a1-4676-a3f1-24fe62bfa931precedence_heuristic	cell_id$d6019e5a-e7a1-4676-a3f1-24fe62bfa931downstream_cells_mapchunk_size$0089fbf7-4aa8-4481-a52b-bc4d929ce1fd$f68fb195-1fa6-4364-8d8f-427a6ea9a4b6upstream_cells_map$ee76a23e-e940-4b32-a44a-9086d0461089precedence_heuristic	cell_id$ee76a23e-e940-4b32-a44a-9086d0461089downstream_cells_mapupstream_cells_mapf$cb988242-8aa6-4f31-955e-021024e0c921DiffResultsForwardDiff$624e8936-de28-4e09-9a4e-3ef2f6c7d9b0DiffResults.valuex_eval$04ba8dc8-7b85-4bde-82fe-8d7e16d9142dForwardDiff.gradient!DiffResults.gradientDiffResults.GradientResult$aac0c3f8-ece3-431e-859d-790b8f3b995aprecedence_heuristic	cell_id$aac0c3f8-ece3-431e-859d-790b8f3b995adownstream_cells_mapmis_will_breakupstream_cells_map@warnBaseBase.CoreLogging.===Base.CoreLogging.invokelatestBase.CoreLogging.isaMyImmutableStruct$5287e3b8-2309-4c78-91f0-f80e7ae7f209Base.CoreLogging.>=#___this_pluto_module_name'Base.CoreLogging.Base.fixup_stdlib_pathBase.CoreLogging.!$c4da391c-e7dc-4ce1-9ccb-04aa2ca79e26precedence_heuristic	cell_id$c4da391c-e7dc-4ce1-9ccb-04aa2ca79e26downstream_cells_mapupstream_cells_map@md_strsizeofBasehintBase.summarysizemms$2e8da77c-004b-4d59-83f4-9fb981ea5658getindex$9007f240-c88e-46c4-993d-fd6b93d8b18dprecedence_heuristic	cell_id$9007f240-c88e-46c4-993d-fd6b93d8b18ddownstream_cells_mapupstream_cells_map@md_strgetindex$cb988242-8aa6-4f31-955e-021024e0c921precedence_heuristic	cell_id$cb988242-8aa6-4f31-955e-021024e0c921downstream_cells_mapf$22c6cf9f-2266-4908-8bb5-ad30d7388c06$c6eb773e-757e-466e-ba15-593c2b19fd1c$99a0be67-2dac-43ba-9223-03845c528fef$ee76a23e-e940-4b32-a44a-9086d0461089$294c9958-5e2b-4b95-ba49-ecda696190b6$0089fbf7-4aa8-4481-a52b-bc4d929ce1fd$f68fb195-1fa6-4364-8d8f-427a6ea9a4b6$cbea527b-9a62-40d4-b922-47f4428a8b33upstream_cells_mapsqrt^/+*$7d1edb0b-3144-4ac7-a939-2e211cdee81bprecedence_heuristic	cell_id$7d1edb0b-3144-4ac7-a939-2e211cdee81bdownstream_cells_mapupstream_cells_map@md_strgetindex$c6eb773e-757e-466e-ba15-593c2b19fd1cprecedence_heuristic	cell_id$c6eb773e-757e-466e-ba15-593c2b19fd1cdownstream_cells_mapupstream_cells_mapf$cb988242-8aa6-4f31-955e-021024e0c921ForwardDiff.gradientForwardDiff$624e8936-de28-4e09-9a4e-3ef2f6c7d9b0x_eval$04ba8dc8-7b85-4bde-82fe-8d7e16d9142d$4772a931-14a6-46c9-8b8c-44b39d213216precedence_heuristic	cell_id$4772a931-14a6-46c9-8b8c-44b39d213216downstream_cells_mapv5$35332b4e-4caa-4448-a345-d272a6362647$b55fc829-c857-44bb-af5b-cbbf8dcab5e7$aa3233da-122d-40a3-80bb-9b6472906ec0v6$1aab953a-f524-4d93-95bf-ea5524c47b8bupstream_cells_map@timeBase.gc_alloc_countBase.*Base.-Base.gc_numBase.cumulative_compile_time_nsBase.GC_DiffBase@SVectorSVectorBase.time_printBase.time_nsBase.Threads.lock_profilingBase./Base.cumulative_compile_timing$cf7990f7-40ec-4a99-be58-e5342061baedprecedence_heuristic	cell_id$cf7990f7-40ec-4a99-be58-e5342061baeddownstream_cells_mapupstream_cells_map@md_strgetindex$397e78ca-8b07-4593-8c92-9b69cbc9d2a3precedence_heuristic	cell_id$397e78ca-8b07-4593-8c92-9b69cbc9d2a3downstream_cells_mapupstream_cells_map@md_strgetindex$fc9ae0ec-298b-4542-9c71-dbbe535b4bd9precedence_heuristic	cell_id$fc9ae0ec-298b-4542-9c71-dbbe535b4bd9downstream_cells_mapupstream_cells_map@md_strgetindex$abee77fd-e2a2-403b-ab43-b4ea6741ba4cprecedence_heuristic	cell_id$abee77fd-e2a2-403b-ab43-b4ea6741ba4cdownstream_cells_mapupstream_cells_map@md_strgetindex$f68fb195-1fa6-4364-8d8f-427a6ea9a4b6precedence_heuristic	cell_id$f68fb195-1fa6-4364-8d8f-427a6ea9a4b6downstream_cells_mapupstream_cells_map f$cb988242-8aa6-4f31-955e-021024e0c921##result#241ForwardDiff$624e8936-de28-4e09-9a4e-3ef2f6c7d9b0BenchmarkTools.Parameters,BenchmarkTools.generate_benchmark_definitionBenchmarkTools$624e8936-de28-4e09-9a4e-3ef2f6c7d9b0#___this_pluto_module_nameDiffResults##x_eval#243x_eval$04ba8dc8-7b85-4bde-82fe-8d7e16d9142dForwardDiff.gradient!chunk_size$d6019e5a-e7a1-4676-a3f1-24fe62bfa931##f#242@benchmarkForwardDiff.GradientConfig##cfg#244DiffResults.GradientResult$cbea527b-9a62-40d4-b922-47f4428a8b33precedence_heuristic	cell_id$cbea527b-9a62-40d4-b922-47f4428a8b33downstream_cells_mapupstream_cells_mapf$cb988242-8aa6-4f31-955e-021024e0c921DiffResultsForwardDiff$624e8936-de28-4e09-9a4e-3ef2f6c7d9b0DiffResults.valueValx_eval$04ba8dc8-7b85-4bde-82fe-8d7e16d9142dForwardDiff.gradient!ForwardDiff.GradientConfigDiffResults.gradientDiffResults.GradientResult$b55fc829-c857-44bb-af5b-cbbf8dcab5e7precedence_heuristic	cell_id$b55fc829-c857-44bb-af5b-cbbf8dcab5e7downstream_cells_mapupstream_cells_mapv5$4772a931-14a6-46c9-8b8c-44b39d213216v1$ff336de5-cf53-41ca-9cc9-1ab37b851be3==$abf6e65a-292a-4f4a-8eee-ea90cd22e376precedence_heuristic	cell_id$abf6e65a-292a-4f4a-8eee-ea90cd22e376downstream_cells_mapupstream_cells_mapv2$318991c3-f693-4364-8e99-623883739a86$34840126-4365-418d-bc55-4ac3bd85f43fprecedence_heuristic	cell_id$34840126-4365-418d-bc55-4ac3bd85f43fdownstream_cells_map multiply_matrix_vector_allocates$5de73fe6-fb0e-4a98-b2ba-f4e592f02006upstream_cells_map @docBase.throwAbstractVectorAbstractMatrix@assertTuplezerospromote_type#___this_pluto_module_namesizelengthBase$multiply_matrix_vector_preallocated!$bf07ac72-3fd3-4062-beb6-8bbcd2a95771eltypeUnion==Base.AssertionErrorcell_execution_order P$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$348ee204-546f-46c5-bf5d-7d4a761002ec$abee77fd-e2a2-403b-ab43-b4ea6741ba4c$e46c0510-f604-4025-bef5-9029e3747447$ed0bc201-03c0-448b-bfeb-9f43d7e9ad7a$f0111b2d-7a7c-4029-8fd0-7c0785b5b038$fc9ae0ec-298b-4542-9c71-dbbe535b4bd9$ba5059bf-bdbb-4c35-b9e7-b7e90641dc94$3b8f0812-9700-45c4-b1ce-d8cdfe09c38b$bf07ac72-3fd3-4062-beb6-8bbcd2a95771$34840126-4365-418d-bc55-4ac3bd85f43f$060bc23d-52fa-4536-aa50-26390552997f$5de73fe6-fb0e-4a98-b2ba-f4e592f02006$1b42bd08-9611-4d96-9d91-fdce9d24982f$46d06e5b-5968-4cdb-97f3-f774f633cce0$3b3d6fdb-5066-48f1-aa64-e28f5ad3c1f1$8114f59e-1a8e-49c6-baaa-20ed19747d2b$fd53c52d-8acd-4ca5-bcf0-8375d64179cc$6d982d26-1917-4f46-babf-e0ea19886976$75661d12-7709-44d0-a5f3-d6c9a5eff952$f632c0ab-ea32-4973-8ec9-79a7f4f4c4ad$15f1d255-0aa9-4837-b76e-1f7b401c93ca$4c724a18-e3dc-4cdb-997c-b3687b0d51c5$138806a6-08f9-4b82-9e8c-128baab3da31$0dd9307f-1390-412b-8cf6-77deb33091a0$5287e3b8-2309-4c78-91f0-f80e7ae7f209$d7fe5753-f02d-4a04-8967-32441149dfe4$b718654a-2490-4bac-a1af-54f959eed0fb$1fa422e7-329d-4072-a786-fb73c718e49e$76187747-1b2f-42e1-b0e7-509b0ed42b6a$b7bdbd76-4bb1-473d-b3a7-f5757a42d6ca$cf7990f7-40ec-4a99-be58-e5342061baed$aac0c3f8-ece3-431e-859d-790b8f3b995a$6371bcc6-3253-4dc4-82f8-647aedf4014e$a1f3a295-7f63-46e1-a493-5082a86dc1ab$f9714ea5-5d0e-4006-92c4-71b3e574d26c$2e8da77c-004b-4d59-83f4-9fb981ea5658$63ec6f40-1f29-4bf5-b48a-124f1e8d783b$c4da391c-e7dc-4ce1-9ccb-04aa2ca79e26$41c6bcb6-c5c5-4a52-a678-31ffa22641e1$9cc467f9-cc48-4026-87c5-dadfe239c5db$2ad27ea5-77f7-4532-9005-7a63160e2503$541bbf9f-afa5-4837-83b1-84017bccc25c$ff336de5-cf53-41ca-9cc9-1ab37b851be3$4772a931-14a6-46c9-8b8c-44b39d213216$1aab953a-f524-4d93-95bf-ea5524c47b8b$3f4cac5b-9b2a-4261-a01e-e2d4f692fb90$c7e5ad3c-a3ce-47a4-9154-ca33edc2811b$8fe1804c-4fce-4980-bb54-dad89c3062d1$35332b4e-4caa-4448-a345-d272a6362647$b55fc829-c857-44bb-af5b-cbbf8dcab5e7$aa3233da-122d-40a3-80bb-9b6472906ec0$31a1f316-8098-4496-9d20-b0782358bd4f$12e4d1e4-d284-4180-8342-d58dda578272$318991c3-f693-4364-8e99-623883739a86$397e78ca-8b07-4593-8c92-9b69cbc9d2a3$abf6e65a-292a-4f4a-8eee-ea90cd22e376$66968290-4f45-49e9-a377-7d2b101a822f$cf913e43-4499-4efc-87cb-2474222b8865$cb988242-8aa6-4f31-955e-021024e0c921$22c6cf9f-2266-4908-8bb5-ad30d7388c06$23038da7-9417-48fe-8431-e5a05dcf9593$04ba8dc8-7b85-4bde-82fe-8d7e16d9142d$c6eb773e-757e-466e-ba15-593c2b19fd1c$99a0be67-2dac-43ba-9223-03845c528fef$7d1edb0b-3144-4ac7-a939-2e211cdee81b$ee76a23e-e940-4b32-a44a-9086d0461089$294c9958-5e2b-4b95-ba49-ecda696190b6$a1c68295-1450-4d5d-833d-57a7eabdbf22$d6019e5a-e7a1-4676-a3f1-24fe62bfa931$0089fbf7-4aa8-4481-a52b-bc4d929ce1fd$f68fb195-1fa6-4364-8d8f-427a6ea9a4b6$5f45fe0e-81df-4dd5-b827-628e0831755e$cbea527b-9a62-40d4-b922-47f4428a8b33$d35aa76c-b4e6-45f8-a4e3-ba37d674db82last_hot_reload_time        shortpathweek4_discuss.jlprocess_statusreadypathF/home/runner/work/Notes-Fall2025/Notes-Fall2025/week4/week4_discuss.jlpluto_versionv0.20.21last_save_timeAE)=cell_order P$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$348ee204-546f-46c5-bf5d-7d4a761002ec$abee77fd-e2a2-403b-ab43-b4ea6741ba4c$e46c0510-f604-4025-bef5-9029e3747447$ed0bc201-03c0-448b-bfeb-9f43d7e9ad7a$f0111b2d-7a7c-4029-8fd0-7c0785b5b038$fc9ae0ec-298b-4542-9c71-dbbe535b4bd9$ba5059bf-bdbb-4c35-b9e7-b7e90641dc94$3b8f0812-9700-45c4-b1ce-d8cdfe09c38b$34840126-4365-418d-bc55-4ac3bd85f43f$5de73fe6-fb0e-4a98-b2ba-f4e592f02006$bf07ac72-3fd3-4062-beb6-8bbcd2a95771$1b42bd08-9611-4d96-9d91-fdce9d24982f$060bc23d-52fa-4536-aa50-26390552997f$46d06e5b-5968-4cdb-97f3-f774f633cce0$3b3d6fdb-5066-48f1-aa64-e28f5ad3c1f1$8114f59e-1a8e-49c6-baaa-20ed19747d2b$fd53c52d-8acd-4ca5-bcf0-8375d64179cc$6d982d26-1917-4f46-babf-e0ea19886976$75661d12-7709-44d0-a5f3-d6c9a5eff952$f632c0ab-ea32-4973-8ec9-79a7f4f4c4ad$15f1d255-0aa9-4837-b76e-1f7b401c93ca$4c724a18-e3dc-4cdb-997c-b3687b0d51c5$138806a6-08f9-4b82-9e8c-128baab3da31$0dd9307f-1390-412b-8cf6-77deb33091a0$5287e3b8-2309-4c78-91f0-f80e7ae7f209$d7fe5753-f02d-4a04-8967-32441149dfe4$b718654a-2490-4bac-a1af-54f959eed0fb$1fa422e7-329d-4072-a786-fb73c718e49e$76187747-1b2f-42e1-b0e7-509b0ed42b6a$b7bdbd76-4bb1-473d-b3a7-f5757a42d6ca$cf7990f7-40ec-4a99-be58-e5342061baed$aac0c3f8-ece3-431e-859d-790b8f3b995a$6371bcc6-3253-4dc4-82f8-647aedf4014e$a1f3a295-7f63-46e1-a493-5082a86dc1ab$f9714ea5-5d0e-4006-92c4-71b3e574d26c$2e8da77c-004b-4d59-83f4-9fb981ea5658$63ec6f40-1f29-4bf5-b48a-124f1e8d783b$c4da391c-e7dc-4ce1-9ccb-04aa2ca79e26$41c6bcb6-c5c5-4a52-a678-31ffa22641e1$9cc467f9-cc48-4026-87c5-dadfe239c5db$2ad27ea5-77f7-4532-9005-7a63160e2503$541bbf9f-afa5-4837-83b1-84017bccc25c$ff336de5-cf53-41ca-9cc9-1ab37b851be3$4772a931-14a6-46c9-8b8c-44b39d213216$1aab953a-f524-4d93-95bf-ea5524c47b8b$3f4cac5b-9b2a-4261-a01e-e2d4f692fb90$c7e5ad3c-a3ce-47a4-9154-ca33edc2811b$8fe1804c-4fce-4980-bb54-dad89c3062d1$35332b4e-4caa-4448-a345-d272a6362647$b55fc829-c857-44bb-af5b-cbbf8dcab5e7$aa3233da-122d-40a3-80bb-9b6472906ec0$31a1f316-8098-4496-9d20-b0782358bd4f$12e4d1e4-d284-4180-8342-d58dda578272$318991c3-f693-4364-8e99-623883739a86$397e78ca-8b07-4593-8c92-9b69cbc9d2a3$abf6e65a-292a-4f4a-8eee-ea90cd22e376$66968290-4f45-49e9-a377-7d2b101a822f$cf913e43-4499-4efc-87cb-2474222b8865$cb988242-8aa6-4f31-955e-021024e0c921$22c6cf9f-2266-4908-8bb5-ad30d7388c06$23038da7-9417-48fe-8431-e5a05dcf9593$04ba8dc8-7b85-4bde-82fe-8d7e16d9142d$c6eb773e-757e-466e-ba15-593c2b19fd1c$99a0be67-2dac-43ba-9223-03845c528fef$7d1edb0b-3144-4ac7-a939-2e211cdee81b$ee76a23e-e940-4b32-a44a-9086d0461089$294c9958-5e2b-4b95-ba49-ecda696190b6$a1c68295-1450-4d5d-833d-57a7eabdbf22$d6019e5a-e7a1-4676-a3f1-24fe62bfa931$0089fbf7-4aa8-4481-a52b-bc4d929ce1fd$f68fb195-1fa6-4364-8d8f-427a6ea9a4b6$5f45fe0e-81df-4dd5-b827-628e0831755e$cbea527b-9a62-40d4-b922-47f4428a8b33$d35aa76c-b4e6-45f8-a4e3-ba37d674db82$624e8936-de28-4e09-9a4e-3ef2f6c7d9b0published_objectsnbpkginstall_time_ns   &ylinstantiatedòinstalled_versionsFixedSizeArrays1.2.0StaticArrays1.9.15ForwardDiff1.1.0PlutoUI0.7.71Plots1.40.19PlutoTest0.2.2BenchmarkTools1.6.0PlutoTeachingTools0.4.5terminal_outputsFixedSizeArraysW
[0m[1mResolving...[22m
[90m===[39m
[32m[1m   Installed[22m[39m LERC_jll ───────────────── v4.0.1+0
[32m[1m   Installed[22m[39m Collects ───────────────── v1.0.0
[32m[1m   Installed[22m[39m GR_jll ─────────────────── v0.73.17+0
[32m[1m   Installed[22m[39m Libmount_jll ───────────── v2.41.1+0
[32m[1m   Installed[22m[39m JpegTurbo_jll ──────────── v3.1.2+0
[32m[1m   Installed[22m[39m Pango_jll ──────────────── v1.56.3+0
[32m[1m   Installed[22m[39m SpecialFunctions ───────── v2.5.1
[32m[1m   Installed[22m[39m BenchmarkTools ─────────── v1.6.0
[32m[1m   Installed[22m[39m ColorVectorSpace ───────── v0.11.0
[32m[1m   Installed[22m[39m CommonSubexpressions ───── v0.3.1
[32m[1m   Installed[22m[39m Qt6ShaderTools_jll ─────── v6.8.2+1
[32m[1m   Installed[22m[39m Qt6Declarative_jll ─────── v6.8.2+1
[32m[1m   Installed[22m[39m Libtiff_jll ────────────── v4.7.1+0
[32m[1m   Installed[22m[39m Xorg_xcb_util_cursor_jll ─ v0.1.5+0
[32m[1m   Installed[22m[39m ColorSchemes ───────────── v3.30.0
[32m[1m   Installed[22m[39m OpenSpecFun_jll ────────── v0.5.6+0
[32m[1m   Installed[22m[39m PlutoTeachingTools ─────── v0.4.5
[32m[1m   Installed[22m[39m FixedSizeArrays ────────── v1.2.0
[32m[1m   Installed[22m[39m GR ─────────────────────── v0.73.17
[32m[1m   Installed[22m[39m Libuuid_jll ────────────── v2.41.1+0
[32m[1m   Installed[22m[39m Xorg_libXfixes_jll ─────── v6.0.1+0
[32m[1m   Installed[22m[39m Qt6Wayland_jll ─────────── v6.8.2+1
[32m[1m   Installed[22m[39m Qt6Base_jll ────────────── v6.8.2+1
[32m[1m   Installed[22m[39m Glib_jll ───────────────── v2.84.3+0
[32m[1m   Installed[22m[39m ForwardDiff ────────────── v1.1.0
[32m[1m   Installed[22m[39m Plots ──────────────────── v1.40.19
[32m[1m  No Changes[22m[39m to `~/.julia/scratchspaces/c3e4b0f8-55cb-11ea-2926-15256bba5781/pkg_envs/env_vmbwokibxs/Project.toml`
[32m[1m    Updating[22m[39m `~/.julia/scratchspaces/c3e4b0f8-55cb-11ea-2926-15256bba5781/pkg_envs/env_vmbwokibxs/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
[92m[1mPrecompiling[22m[39m project...
StaticArraysW
[0m[1mResolving...[22m
[90m===[39m
[32m[1m   Installed[22m[39m LERC_jll ───────────────── v4.0.1+0
[32m[1m   Installed[22m[39m Collects ───────────────── v1.0.0
[32m[1m   Installed[22m[39m GR_jll ─────────────────── v0.73.17+0
[32m[1m   Installed[22m[39m Libmount_jll ───────────── v2.41.1+0
[32m[1m   Installed[22m[39m JpegTurbo_jll ──────────── v3.1.2+0
[32m[1m   Installed[22m[39m Pango_jll ──────────────── v1.56.3+0
[32m[1m   Installed[22m[39m SpecialFunctions ───────── v2.5.1
[32m[1m   Installed[22m[39m BenchmarkTools ─────────── v1.6.0
[32m[1m   Installed[22m[39m ColorVectorSpace ───────── v0.11.0
[32m[1m   Installed[22m[39m CommonSubexpressions ───── v0.3.1
[32m[1m   Installed[22m[39m Qt6ShaderTools_jll ─────── v6.8.2+1
[32m[1m   Installed[22m[39m Qt6Declarative_jll ─────── v6.8.2+1
[32m[1m   Installed[22m[39m Libtiff_jll ────────────── v4.7.1+0
[32m[1m   Installed[22m[39m Xorg_xcb_util_cursor_jll ─ v0.1.5+0
[32m[1m   Installed[22m[39m ColorSchemes ───────────── v3.30.0
[32m[1m   Installed[22m[39m OpenSpecFun_jll ────────── v0.5.6+0
[32m[1m   Installed[22m[39m PlutoTeachingTools ─────── v0.4.5
[32m[1m   Installed[22m[39m FixedSizeArrays ────────── v1.2.0
[32m[1m   Installed[22m[39m GR ─────────────────────── v0.73.17
[32m[1m   Installed[22m[39m Libuuid_jll ────────────── v2.41.1+0
[32m[1m   Installed[22m[39m Xorg_libXfixes_jll ─────── v6.0.1+0
[32m[1m   Installed[22m[39m Qt6Wayland_jll ─────────── v6.8.2+1
[32m[1m   Installed[22m[39m Qt6Base_jll ────────────── v6.8.2+1
[32m[1m   Installed[22m[39m Glib_jll ───────────────── v2.84.3+0
[32m[1m   Installed[22m[39m ForwardDiff ────────────── v1.1.0
[32m[1m   Installed[22m[39m Plots ──────────────────── v1.40.19
[32m[1m  No Changes[22m[39m to `~/.julia/scratchspaces/c3e4b0f8-55cb-11ea-2926-15256bba5781/pkg_envs/env_vmbwokibxs/Project.toml`
[32m[1m    Updating[22m[39m `~/.julia/scratchspaces/c3e4b0f8-55cb-11ea-2926-15256bba5781/pkg_envs/env_vmbwokibxs/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
[92m[1mPrecompiling[22m[39m project...
ForwardDiffW
[0m[1mResolving...[22m
[90m===[39m
[32m[1m   Installed[22m[39m LERC_jll ───────────────── v4.0.1+0
[32m[1m   Installed[22m[39m Collects ───────────────── v1.0.0
[32m[1m   Installed[22m[39m GR_jll ─────────────────── v0.73.17+0
[32m[1m   Installed[22m[39m Libmount_jll ───────────── v2.41.1+0
[32m[1m   Installed[22m[39m JpegTurbo_jll ──────────── v3.1.2+0
[32m[1m   Installed[22m[39m Pango_jll ──────────────── v1.56.3+0
[32m[1m   Installed[22m[39m SpecialFunctions ───────── v2.5.1
[32m[1m   Installed[22m[39m BenchmarkTools ─────────── v1.6.0
[32m[1m   Installed[22m[39m ColorVectorSpace ───────── v0.11.0
[32m[1m   Installed[22m[39m CommonSubexpressions ───── v0.3.1
[32m[1m   Installed[22m[39m Qt6ShaderTools_jll ─────── v6.8.2+1
[32m[1m   Installed[22m[39m Qt6Declarative_jll ─────── v6.8.2+1
[32m[1m   Installed[22m[39m Libtiff_jll ────────────── v4.7.1+0
[32m[1m   Installed[22m[39m Xorg_xcb_util_cursor_jll ─ v0.1.5+0
[32m[1m   Installed[22m[39m ColorSchemes ───────────── v3.30.0
[32m[1m   Installed[22m[39m OpenSpecFun_jll ────────── v0.5.6+0
[32m[1m   Installed[22m[39m PlutoTeachingTools ─────── v0.4.5
[32m[1m   Installed[22m[39m FixedSizeArrays ────────── v1.2.0
[32m[1m   Installed[22m[39m GR ─────────────────────── v0.73.17
[32m[1m   Installed[22m[39m Libuuid_jll ────────────── v2.41.1+0
[32m[1m   Installed[22m[39m Xorg_libXfixes_jll ─────── v6.0.1+0
[32m[1m   Installed[22m[39m Qt6Wayland_jll ─────────── v6.8.2+1
[32m[1m   Installed[22m[39m Qt6Base_jll ────────────── v6.8.2+1
[32m[1m   Installed[22m[39m Glib_jll ───────────────── v2.84.3+0
[32m[1m   Installed[22m[39m ForwardDiff ────────────── v1.1.0
[32m[1m   Installed[22m[39m Plots ──────────────────── v1.40.19
[32m[1m  No Changes[22m[39m to `~/.julia/scratchspaces/c3e4b0f8-55cb-11ea-2926-15256bba5781/pkg_envs/env_vmbwokibxs/Project.toml`
[32m[1m    Updating[22m[39m `~/.julia/scratchspaces/c3e4b0f8-55cb-11ea-2926-15256bba5781/pkg_envs/env_vmbwokibxs/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
[92m[1mPrecompiling[22m[39m project...
nbpkg_syncW
[0m[1mResolving...[22m
[90m===[39m
[32m[1m   Installed[22m[39m LERC_jll ───────────────── v4.0.1+0
[32m[1m   Installed[22m[39m Collects ───────────────── v1.0.0
[32m[1m   Installed[22m[39m GR_jll ─────────────────── v0.73.17+0
[32m[1m   Installed[22m[39m Libmount_jll ───────────── v2.41.1+0
[32m[1m   Installed[22m[39m JpegTurbo_jll ──────────── v3.1.2+0
[32m[1m   Installed[22m[39m Pango_jll ──────────────── v1.56.3+0
[32m[1m   Installed[22m[39m SpecialFunctions ───────── v2.5.1
[32m[1m   Installed[22m[39m BenchmarkTools ─────────── v1.6.0
[32m[1m   Installed[22m[39m ColorVectorSpace ───────── v0.11.0
[32m[1m   Installed[22m[39m CommonSubexpressions ───── v0.3.1
[32m[1m   Installed[22m[39m Qt6ShaderTools_jll ─────── v6.8.2+1
[32m[1m   Installed[22m[39m Qt6Declarative_jll ─────── v6.8.2+1
[32m[1m   Installed[22m[39m Libtiff_jll ────────────── v4.7.1+0
[32m[1m   Installed[22m[39m Xorg_xcb_util_cursor_jll ─ v0.1.5+0
[32m[1m   Installed[22m[39m ColorSchemes ───────────── v3.30.0
[32m[1m   Installed[22m[39m OpenSpecFun_jll ────────── v0.5.6+0
[32m[1m   Installed[22m[39m PlutoTeachingTools ─────── v0.4.5
[32m[1m   Installed[22m[39m FixedSizeArrays ────────── v1.2.0
[32m[1m   Installed[22m[39m GR ─────────────────────── v0.73.17
[32m[1m   Installed[22m[39m Libuuid_jll ────────────── v2.41.1+0
[32m[1m   Installed[22m[39m Xorg_libXfixes_jll ─────── v6.0.1+0
[32m[1m   Installed[22m[39m Qt6Wayland_jll ─────────── v6.8.2+1
[32m[1m   Installed[22m[39m Qt6Base_jll ────────────── v6.8.2+1
[32m[1m   Installed[22m[39m Glib_jll ───────────────── v2.84.3+0
[32m[1m   Installed[22m[39m ForwardDiff ────────────── v1.1.0
[32m[1m   Installed[22m[39m Plots ──────────────────── v1.40.19
[32m[1m  No Changes[22m[39m to `~/.julia/scratchspaces/c3e4b0f8-55cb-11ea-2926-15256bba5781/pkg_envs/env_vmbwokibxs/Project.toml`
[32m[1m    Updating[22m[39m `~/.julia/scratchspaces/c3e4b0f8-55cb-11ea-2926-15256bba5781/pkg_envs/env_vmbwokibxs/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
[92m[1mPrecompiling[22m[39m project...
PlutoUIW
[0m[1mResolving...[22m
[90m===[39m
[32m[1m   Installed[22m[39m LERC_jll ───────────────── v4.0.1+0
[32m[1m   Installed[22m[39m Collects ───────────────── v1.0.0
[32m[1m   Installed[22m[39m GR_jll ─────────────────── v0.73.17+0
[32m[1m   Installed[22m[39m Libmount_jll ───────────── v2.41.1+0
[32m[1m   Installed[22m[39m JpegTurbo_jll ──────────── v3.1.2+0
[32m[1m   Installed[22m[39m Pango_jll ──────────────── v1.56.3+0
[32m[1m   Installed[22m[39m SpecialFunctions ───────── v2.5.1
[32m[1m   Installed[22m[39m BenchmarkTools ─────────── v1.6.0
[32m[1m   Installed[22m[39m ColorVectorSpace ───────── v0.11.0
[32m[1m   Installed[22m[39m CommonSubexpressions ───── v0.3.1
[32m[1m   Installed[22m[39m Qt6ShaderTools_jll ─────── v6.8.2+1
[32m[1m   Installed[22m[39m Qt6Declarative_jll ─────── v6.8.2+1
[32m[1m   Installed[22m[39m Libtiff_jll ────────────── v4.7.1+0
[32m[1m   Installed[22m[39m Xorg_xcb_util_cursor_jll ─ v0.1.5+0
[32m[1m   Installed[22m[39m ColorSchemes ───────────── v3.30.0
[32m[1m   Installed[22m[39m OpenSpecFun_jll ────────── v0.5.6+0
[32m[1m   Installed[22m[39m PlutoTeachingTools ─────── v0.4.5
[32m[1m   Installed[22m[39m FixedSizeArrays ────────── v1.2.0
[32m[1m   Installed[22m[39m GR ─────────────────────── v0.73.17
[32m[1m   Installed[22m[39m Libuuid_jll ────────────── v2.41.1+0
[32m[1m   Installed[22m[39m Xorg_libXfixes_jll ─────── v6.0.1+0
[32m[1m   Installed[22m[39m Qt6Wayland_jll ─────────── v6.8.2+1
[32m[1m   Installed[22m[39m Qt6Base_jll ────────────── v6.8.2+1
[32m[1m   Installed[22m[39m Glib_jll ───────────────── v2.84.3+0
[32m[1m   Installed[22m[39m ForwardDiff ────────────── v1.1.0
[32m[1m   Installed[22m[39m Plots ──────────────────── v1.40.19
[32m[1m  No Changes[22m[39m to `~/.julia/scratchspaces/c3e4b0f8-55cb-11ea-2926-15256bba5781/pkg_envs/env_vmbwokibxs/Project.toml`
[32m[1m    Updating[22m[39m `~/.julia/scratchspaces/c3e4b0f8-55cb-11ea-2926-15256bba5781/pkg_envs/env_vmbwokibxs/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
[92m[1mPrecompiling[22m[39m project...
PlotsW
[0m[1mResolving...[22m
[90m===[39m
[32m[1m   Installed[22m[39m LERC_jll ───────────────── v4.0.1+0
[32m[1m   Installed[22m[39m Collects ───────────────── v1.0.0
[32m[1m   Installed[22m[39m GR_jll ─────────────────── v0.73.17+0
[32m[1m   Installed[22m[39m Libmount_jll ───────────── v2.41.1+0
[32m[1m   Installed[22m[39m JpegTurbo_jll ──────────── v3.1.2+0
[32m[1m   Installed[22m[39m Pango_jll ──────────────── v1.56.3+0
[32m[1m   Installed[22m[39m SpecialFunctions ───────── v2.5.1
[32m[1m   Installed[22m[39m BenchmarkTools ─────────── v1.6.0
[32m[1m   Installed[22m[39m ColorVectorSpace ───────── v0.11.0
[32m[1m   Installed[22m[39m CommonSubexpressions ───── v0.3.1
[32m[1m   Installed[22m[39m Qt6ShaderTools_jll ─────── v6.8.2+1
[32m[1m   Installed[22m[39m Qt6Declarative_jll ─────── v6.8.2+1
[32m[1m   Installed[22m[39m Libtiff_jll ────────────── v4.7.1+0
[32m[1m   Installed[22m[39m Xorg_xcb_util_cursor_jll ─ v0.1.5+0
[32m[1m   Installed[22m[39m ColorSchemes ───────────── v3.30.0
[32m[1m   Installed[22m[39m OpenSpecFun_jll ────────── v0.5.6+0
[32m[1m   Installed[22m[39m PlutoTeachingTools ─────── v0.4.5
[32m[1m   Installed[22m[39m FixedSizeArrays ────────── v1.2.0
[32m[1m   Installed[22m[39m GR ─────────────────────── v0.73.17
[32m[1m   Installed[22m[39m Libuuid_jll ────────────── v2.41.1+0
[32m[1m   Installed[22m[39m Xorg_libXfixes_jll ─────── v6.0.1+0
[32m[1m   Installed[22m[39m Qt6Wayland_jll ─────────── v6.8.2+1
[32m[1m   Installed[22m[39m Qt6Base_jll ────────────── v6.8.2+1
[32m[1m   Installed[22m[39m Glib_jll ───────────────── v2.84.3+0
[32m[1m   Installed[22m[39m ForwardDiff ────────────── v1.1.0
[32m[1m   Installed[22m[39m Plots ──────────────────── v1.40.19
[32m[1m  No Changes[22m[39m to `~/.julia/scratchspaces/c3e4b0f8-55cb-11ea-2926-15256bba5781/pkg_envs/env_vmbwokibxs/Project.toml`
[32m[1m    Updating[22m[39m `~/.julia/scratchspaces/c3e4b0f8-55cb-11ea-2926-15256bba5781/pkg_envs/env_vmbwokibxs/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
[92m[1mPrecompiling[22m[39m project...
PlutoTestW
[0m[1mResolving...[22m
[90m===[39m
[32m[1m   Installed[22m[39m LERC_jll ───────────────── v4.0.1+0
[32m[1m   Installed[22m[39m Collects ───────────────── v1.0.0
[32m[1m   Installed[22m[39m GR_jll ─────────────────── v0.73.17+0
[32m[1m   Installed[22m[39m Libmount_jll ───────────── v2.41.1+0
[32m[1m   Installed[22m[39m JpegTurbo_jll ──────────── v3.1.2+0
[32m[1m   Installed[22m[39m Pango_jll ──────────────── v1.56.3+0
[32m[1m   Installed[22m[39m SpecialFunctions ───────── v2.5.1
[32m[1m   Installed[22m[39m BenchmarkTools ─────────── v1.6.0
[32m[1m   Installed[22m[39m ColorVectorSpace ───────── v0.11.0
[32m[1m   Installed[22m[39m CommonSubexpressions ───── v0.3.1
[32m[1m   Installed[22m[39m Qt6ShaderTools_jll ─────── v6.8.2+1
[32m[1m   Installed[22m[39m Qt6Declarative_jll ─────── v6.8.2+1
[32m[1m   Installed[22m[39m Libtiff_jll ────────────── v4.7.1+0
[32m[1m   Installed[22m[39m Xorg_xcb_util_cursor_jll ─ v0.1.5+0
[32m[1m   Installed[22m[39m ColorSchemes ───────────── v3.30.0
[32m[1m   Installed[22m[39m OpenSpecFun_jll ────────── v0.5.6+0
[32m[1m   Installed[22m[39m PlutoTeachingTools ─────── v0.4.5
[32m[1m   Installed[22m[39m FixedSizeArrays ────────── v1.2.0
[32m[1m   Installed[22m[39m GR ─────────────────────── v0.73.17
[32m[1m   Installed[22m[39m Libuuid_jll ────────────── v2.41.1+0
[32m[1m   Installed[22m[39m Xorg_libXfixes_jll ─────── v6.0.1+0
[32m[1m   Installed[22m[39m Qt6Wayland_jll ─────────── v6.8.2+1
[32m[1m   Installed[22m[39m Qt6Base_jll ────────────── v6.8.2+1
[32m[1m   Installed[22m[39m Glib_jll ───────────────── v2.84.3+0
[32m[1m   Installed[22m[39m ForwardDiff ────────────── v1.1.0
[32m[1m   Installed[22m[39m Plots ──────────────────── v1.40.19
[32m[1m  No Changes[22m[39m to `~/.julia/scratchspaces/c3e4b0f8-55cb-11ea-2926-15256bba5781/pkg_envs/env_vmbwokibxs/Project.toml`
[32m[1m    Updating[22m[39m `~/.julia/scratchspaces/c3e4b0f8-55cb-11ea-2926-15256bba5781/pkg_envs/env_vmbwokibxs/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
[92m[1mPrecompiling[22m[39m project...
BenchmarkToolsW
[0m[1mResolving...[22m
[90m===[39m
[32m[1m   Installed[22m[39m LERC_jll ───────────────── v4.0.1+0
[32m[1m   Installed[22m[39m Collects ───────────────── v1.0.0
[32m[1m   Installed[22m[39m GR_jll ─────────────────── v0.73.17+0
[32m[1m   Installed[22m[39m Libmount_jll ───────────── v2.41.1+0
[32m[1m   Installed[22m[39m JpegTurbo_jll ──────────── v3.1.2+0
[32m[1m   Installed[22m[39m Pango_jll ──────────────── v1.56.3+0
[32m[1m   Installed[22m[39m SpecialFunctions ───────── v2.5.1
[32m[1m   Installed[22m[39m BenchmarkTools ─────────── v1.6.0
[32m[1m   Installed[22m[39m ColorVectorSpace ───────── v0.11.0
[32m[1m   Installed[22m[39m CommonSubexpressions ───── v0.3.1
[32m[1m   Installed[22m[39m Qt6ShaderTools_jll ─────── v6.8.2+1
[32m[1m   Installed[22m[39m Qt6Declarative_jll ─────── v6.8.2+1
[32m[1m   Installed[22m[39m Libtiff_jll ────────────── v4.7.1+0
[32m[1m   Installed[22m[39m Xorg_xcb_util_cursor_jll ─ v0.1.5+0
[32m[1m   Installed[22m[39m ColorSchemes ───────────── v3.30.0
[32m[1m   Installed[22m[39m OpenSpecFun_jll ────────── v0.5.6+0
[32m[1m   Installed[22m[39m PlutoTeachingTools ─────── v0.4.5
[32m[1m   Installed[22m[39m FixedSizeArrays ────────── v1.2.0
[32m[1m   Installed[22m[39m GR ─────────────────────── v0.73.17
[32m[1m   Installed[22m[39m Libuuid_jll ────────────── v2.41.1+0
[32m[1m   Installed[22m[39m Xorg_libXfixes_jll ─────── v6.0.1+0
[32m[1m   Installed[22m[39m Qt6Wayland_jll ─────────── v6.8.2+1
[32m[1m   Installed[22m[39m Qt6Base_jll ────────────── v6.8.2+1
[32m[1m   Installed[22m[39m Glib_jll ───────────────── v2.84.3+0
[32m[1m   Installed[22m[39m ForwardDiff ────────────── v1.1.0
[32m[1m   Installed[22m[39m Plots ──────────────────── v1.40.19
[32m[1m  No Changes[22m[39m to `~/.julia/scratchspaces/c3e4b0f8-55cb-11ea-2926-15256bba5781/pkg_envs/env_vmbwokibxs/Project.toml`
[32m[1m    Updating[22m[39m `~/.julia/scratchspaces/c3e4b0f8-55cb-11ea-2926-15256bba5781/pkg_envs/env_vmbwokibxs/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
[92m[1mPrecompiling[22m[39m project...
PlutoTeachingToolsW
[0m[1mResolving...[22m
[90m===[39m
[32m[1m   Installed[22m[39m LERC_jll ───────────────── v4.0.1+0
[32m[1m   Installed[22m[39m Collects ───────────────── v1.0.0
[32m[1m   Installed[22m[39m GR_jll ─────────────────── v0.73.17+0
[32m[1m   Installed[22m[39m Libmount_jll ───────────── v2.41.1+0
[32m[1m   Installed[22m[39m JpegTurbo_jll ──────────── v3.1.2+0
[32m[1m   Installed[22m[39m Pango_jll ──────────────── v1.56.3+0
[32m[1m   Installed[22m[39m SpecialFunctions ───────── v2.5.1
[32m[1m   Installed[22m[39m BenchmarkTools ─────────── v1.6.0
[32m[1m   Installed[22m[39m ColorVectorSpace ───────── v0.11.0
[32m[1m   Installed[22m[39m CommonSubexpressions ───── v0.3.1
[32m[1m   Installed[22m[39m Qt6ShaderTools_jll ─────── v6.8.2+1
[32m[1m   Installed[22m[39m Qt6Declarative_jll ─────── v6.8.2+1
[32m[1m   Installed[22m[39m Libtiff_jll ────────────── v4.7.1+0
[32m[1m   Installed[22m[39m Xorg_xcb_util_cursor_jll ─ v0.1.5+0
[32m[1m   Installed[22m[39m ColorSchemes ───────────── v3.30.0
[32m[1m   Installed[22m[39m OpenSpecFun_jll ────────── v0.5.6+0
[32m[1m   Installed[22m[39m PlutoTeachingTools ─────── v0.4.5
[32m[1m   Installed[22m[39m FixedSizeArrays ────────── v1.2.0
[32m[1m   Installed[22m[39m GR ─────────────────────── v0.73.17
[32m[1m   Installed[22m[39m Libuuid_jll ────────────── v2.41.1+0
[32m[1m   Installed[22m[39m Xorg_libXfixes_jll ─────── v6.0.1+0
[32m[1m   Installed[22m[39m Qt6Wayland_jll ─────────── v6.8.2+1
[32m[1m   Installed[22m[39m Qt6Base_jll ────────────── v6.8.2+1
[32m[1m   Installed[22m[39m Glib_jll ───────────────── v2.84.3+0
[32m[1m   Installed[22m[39m ForwardDiff ────────────── v1.1.0
[32m[1m   Installed[22m[39m Plots ──────────────────── v1.40.19
[32m[1m  No Changes[22m[39m to `~/.julia/scratchspaces/c3e4b0f8-55cb-11ea-2926-15256bba5781/pkg_envs/env_vmbwokibxs/Project.toml`
[32m[1m    Updating[22m[39m `~/.julia/scratchspaces/c3e4b0f8-55cb-11ea-2926-15256bba5781/pkg_envs/env_vmbwokibxs/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
[92m[1mPrecompiling[22m[39m project...
enabled÷restart_recommended_msgrestart_required_msgbusy_packageswaiting_for_permission,waiting_for_permission_but_probably_disabled«cell_inputs P$138806a6-08f9-4b82-9e8c-128baab3da31cell_id$138806a6-08f9-4b82-9e8c-128baab3da31codent.messagemetadatashow_logsèdisabled®skip_as_script«code_folded$ba5059bf-bdbb-4c35-b9e7-b7e90641dc94cell_id$ba5059bf-bdbb-4c35-b9e7-b7e90641dc94codeDmd"""
For numerical calculations, allocating storage space on the heap can be a significant cost.  Often, we do the same thing over and over, resulting in many allocations for outputs (or temporay intermediate values).  Thus, there's an opportunity to allocate storage space once and reuse it in subsequent calculations.
"""metadatashow_logsèdisabled®skip_as_script«code_folded$6d982d26-1917-4f46-babf-e0ea19886976cell_id$6d982d26-1917-4f46-babf-e0ea19886976codet[2]metadatashow_logsèdisabled®skip_as_script«code_folded$22c6cf9f-2266-4908-8bb5-ad30d7388c06cell_id$22c6cf9f-2266-4908-8bb5-ad30d7388c06code٪begin
	grid = range(0,stop=1,length=40);
	local plt = heatmap(collect(grid), collect(grid), [f([x,y]) for x in grid, y in grid])
	xlabel!(plt, "x")
	ylabel!(plt, "y")
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$23038da7-9417-48fe-8431-e5a05dcf9593cell_id$23038da7-9417-48fe-8431-e5a05dcf9593code+md"### Non-expert call to compute gradient"metadatashow_logsèdisabled®skip_as_script«code_folded$3b8f0812-9700-45c4-b1ce-d8cdfe09c38bcell_id$3b8f0812-9700-45c4-b1ce-d8cdfe09c38bcode$let
	a = rand(32)
	b = zeros(32)
	c = a+b           # Stores results in a new array, assigns to c
	@time c .= a + b  # Writes results into existing storage for c, but creates temporary array
	@time c .= a.+b   # Writes results into existing storage for c, avoids creating temporary array
end;metadatashow_logsèdisabled®skip_as_script«code_folded$f0111b2d-7a7c-4029-8fd0-7c0785b5b038cell_id$f0111b2d-7a7c-4029-8fd0-7c0785b5b038codemd"""
### Where do your variables get stored?
Your program will use two distinct **virtual address spaces**:
- **Stack**
  + Scalars
  + Small structures or collections with known size
  + Function parameters and memory addresses for their outputs
  + Values cleared from stack on a Last-in, First-out (LIFO) basis
  + *Push*ing values onto top of stack is fast
  + *Pop*ing values off the top of the stack is fast
- **Heap**
  + Large arrays/collections
  + Structures/collections if size is not known at compile time
  + Stored until deallocated (by programmer or garbage collector)
  + Allocating memory from heap incurs latency
  + Deallocating can be fast, but is error prone
  + Deallocations typically defered until a *garbage collector* frees up memory that is no longer in use.
"""metadatashow_logsèdisabled®skip_as_script«code_folded$cf913e43-4499-4efc-87cb-2474222b8865cell_id$cf913e43-4499-4efc-87cb-2474222b8865code)md"""
# Expert vs non-expert routines
"""metadatashow_logsèdisabled®skip_as_script«code_folded$1aab953a-f524-4d93-95bf-ea5524c47b8bcell_id$1aab953a-f524-4d93-95bf-ea5524c47b8bcodeFtry
	v6[2] = 0
catch
	@warn "You can't do modify a static vector."
endmetadatashow_logsèdisabled®skip_as_script«code_folded$8114f59e-1a8e-49c6-baaa-20ed19747d2bcell_id$8114f59e-1a8e-49c6-baaa-20ed19747d2bcode}md"""
## How to generate less garbage?
### For small allocations,  use data types that stay on the stack
- [Tuple](https://docs.julialang.org/en/v1/manual/types/#Tuple-Types) 
- [NamedTuple](https://docs.julialang.org/en/v1/manual/types/#Named-Tuple-Types)
- Custom `struct` (with fields that go to the stack)
- [StaticArrays.jl](https://github.com/JuliaArrays/StaticArrays.jl)
"""metadatashow_logsèdisabled®skip_as_script«code_folded$f632c0ab-ea32-4973-8ec9-79a7f4f4c4adcell_id$f632c0ab-ea32-4973-8ec9-79a7f4f4c4adcode'nt = (;result = 1.0, message="Success")metadatashow_logsèdisabled®skip_as_script«code_folded$348ee204-546f-46c5-bf5d-7d4a761002eccell_id$348ee204-546f-46c5-bf5d-7d4a761002eccodeٲmd"""
# Week 4 Discussion Topics
- Memory heirarchy & allocations
  - Stack vs Heap allocations
  - Pre-allocating storage
- Garbage Collectors
- Expert/Non-expert Interfaces
"""metadatashow_logsèdisabled®skip_as_script«code_folded$2e8da77c-004b-4d59-83f4-9fb981ea5658cell_id$2e8da77c-004b-4d59-83f4-9fb981ea5658codeXbegin
	mms = MyMutableStruct(5.0, "Lorem ipsum dolor sit amet")
	mms.result = 0
	mms
endmetadatashow_logsèdisabled®skip_as_script«code_folded$8fe1804c-4fce-4980-bb54-dad89c3062d1cell_id$8fe1804c-4fce-4980-bb54-dad89c3062d1codev1metadatashow_logsèdisabled®skip_as_script«code_folded$31a1f316-8098-4496-9d20-b0782358bd4fcell_id$31a1f316-8098-4496-9d20-b0782358bd4fcode0md"""
#### Mutable fixed-size vectors/arrays
"""metadatashow_logsèdisabled®skip_as_script«code_folded$3f4cac5b-9b2a-4261-a01e-e2d4f692fb90cell_id$3f4cac5b-9b2a-4261-a01e-e2d4f692fb90codeHbegin
	m1 = @time @SMatrix [ 1  3 ; 2  4 ]
	m2 = @SMatrix randn(4,4)
endmetadatashow_logsèdisabled®skip_as_script«code_folded$f9714ea5-5d0e-4006-92c4-71b3e574d26ccell_id$f9714ea5-5d0e-4006-92c4-71b3e574d26ccodeDmutable struct MyMutableStruct
	result::Float64
	message::String
endmetadatashow_logsèdisabled®skip_as_script«code_folded$99a0be67-2dac-43ba-9223-03845c528fefcell_id$99a0be67-2dac-43ba-9223-03845c528fefcode+@benchmark ForwardDiff.gradient($f,$x_eval)metadatashow_logsèdisabled®skip_as_script«code_folded$0dd9307f-1390-412b-8cf6-77deb33091a0cell_id$0dd9307f-1390-412b-8cf6-77deb33091a0code,md"""
#### Examples of simple `struct`'s
"""metadatashow_logsèdisabled®skip_as_script«code_folded$294c9958-5e2b-4b95-ba49-ecda696190b6cell_id$294c9958-5e2b-4b95-ba49-ecda696190b6codejlet
	result = DiffResults.GradientResult(x_eval)
	@benchmark ForwardDiff.gradient!($result,$f,$x_eval)
endmetadatashow_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$d35aa76c-b4e6-45f8-a4e3-ba37d674db82cell_id$d35aa76c-b4e6-45f8-a4e3-ba37d674db82codemd"# Helper Code"metadatashow_logsèdisabled®skip_as_script«code_folded$fd53c52d-8acd-4ca5-bcf0-8375d64179cccell_id$fd53c52d-8acd-4ca5-bcf0-8375d64179cccodet = (1.0, "Success")metadatashow_logsèdisabled®skip_as_script«code_folded$04ba8dc8-7b85-4bde-82fe-8d7e16d9142dcell_id$04ba8dc8-7b85-4bde-82fe-8d7e16d9142dcodex_eval = [1.0, 2.0];metadatashow_logsèdisabled®skip_as_script«code_folded$b7bdbd76-4bb1-473d-b3a7-f5757a42d6cacell_id$b7bdbd76-4bb1-473d-b3a7-f5757a42d6cacodeG@allocated  mis2 = MyImmutableStruct(2.0, "Lorem ipsum dolor sit amet")metadatashow_logsèdisabled®skip_as_script«code_folded$1b42bd08-9611-4d96-9d91-fdce9d24982fcell_id$1b42bd08-9611-4d96-9d91-fdce9d24982fcode|let
	A = rand(nrows,ncols)
	b = rand(ncols)
	y = zeros(nrows)
	@benchmark multiply_matrix_vector_preallocated!($y,$A,$b)
endmetadatashow_logsèdisabled®skip_as_script«code_folded$a1f3a295-7f63-46e1-a493-5082a86dc1abcell_id$a1f3a295-7f63-46e1-a493-5082a86dc1abcode6md"""
#### What if I want to mutate my `struct`'s?
"""metadatashow_logsèdisabled®skip_as_script«code_folded$b718654a-2490-4bac-a1af-54f959eed0fbcell_id$b718654a-2490-4bac-a1af-54f959eed0fbcodemis.messagemetadatashow_logsèdisabled®skip_as_script«code_folded$15f1d255-0aa9-4837-b76e-1f7b401c93cacell_id$15f1d255-0aa9-4837-b76e-1f7b401c93cacodetypeof(nt)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 StaticArrays, FixedSizeArrays
	using BenchmarkTools 
	using ForwardDiff
	using Plots
	# Not demonstrated in notebook, but relevant to lesson
	#using AllocCheck # For checking whether functions allocate to heap
	#using Collects  # For storing iterables to FixedSizdArrays
	#using InlineStrings # For efficient storage of arrays of String
endmetadatashow_logsèdisabled®skip_as_script«code_folded$5f45fe0e-81df-4dd5-b827-628e0831755ecell_id$5f45fe0e-81df-4dd5-b827-628e0831755ecodemd"""
### Potentially additional optional parameters
E.g., Here we can turn off "tag checking".  (See [documentation about custom tags](https://juliadiff.org/ForwardDiff.jl/dev/user/advanced/#Custom-tags-and-tag-checking) for details."""metadatashow_logsèdisabled®skip_as_script«code_folded$76187747-1b2f-42e1-b0e7-509b0ed42b6acell_id$76187747-1b2f-42e1-b0e7-509b0ed42b6acode'sizeof(mis.result), sizeof(mis.message)metadatashow_logsèdisabled®skip_as_script«code_folded$aa3233da-122d-40a3-80bb-9b6472906ec0cell_id$aa3233da-122d-40a3-80bb-9b6472906ec0codev1 === v5metadatashow_logsèdisabled®skip_as_script«code_folded$541bbf9f-afa5-4837-83b1-84017bccc25ccell_id$541bbf9f-afa5-4837-83b1-84017bccc25ccodeD@time v0 = [1,2]      # Vector whose length can change, goes to heapmetadatashow_logsèdisabled®skip_as_script«code_folded$0089fbf7-4aa8-4481-a52b-bc4d929ce1fdcell_id$0089fbf7-4aa8-4481-a52b-bc4d929ce1fdcodelet
	result = DiffResults.GradientResult(x_eval)
	cfg = ForwardDiff.GradientConfig(f, x_eval, ForwardDiff.Chunk{chunk_size}())
	ForwardDiff.gradient!(result,f,x_eval, cfg)
	DiffResults.value(result), DiffResults.gradient(result)
endmetadatashow_logsèdisabled®skip_as_script«code_folded$66968290-4f45-49e9-a377-7d2b101a822fcell_id$66968290-4f45-49e9-a377-7d2b101a822fcodev2metadatashow_logsèdisabled®skip_as_script«code_folded$46d06e5b-5968-4cdb-97f3-f774f633cce0cell_id$46d06e5b-5968-4cdb-97f3-f774f633cce0codemd"""
## Garbage Collection
- When try to allocate from heap, language may decide to run **garbage collector**.
- Checks whether it's possible for code to reach memory that has been allocated.
- If not, marks it for deallocation.
- This can cause an unexpected delay.
"""metadatashow_logsèdisabled®skip_as_script«code_folded$ed0bc201-03c0-448b-bfeb-9f43d7e9ad7acell_id$ed0bc201-03c0-448b-bfeb-9f43d7e9ad7acode{md"
[Interactive Memory Latency vs Year](https://colin-scott.github.io/personal_website/research/interactive_latency.html)"metadatashow_logsèdisabled®skip_as_script«code_folded$d7fe5753-f02d-4a04-8967-32441149dfe4cell_id$d7fe5753-f02d-4a04-8967-32441149dfe4code:mis = MyImmutableStruct(2.0, "Lorem ipsum dolor sit amet")metadatashow_logsèdisabled®skip_as_script«code_folded$4c724a18-e3dc-4cdb-997c-b3687b0d51c5cell_id$4c724a18-e3dc-4cdb-997c-b3687b0d51c5codent[2]metadatashow_logsèdisabled®skip_as_script«code_folded$bf07ac72-3fd3-4062-beb6-8bbcd2a95771cell_id$bf07ac72-3fd3-4062-beb6-8bbcd2a95771code"""`multiply_matrix_vector_preallocated!(out::Vector, A::Matrix, b::Vector)`

Multiply matrix A and vector b by hand using rows for inner loop, using preallocated space for output"""
function multiply_matrix_vector_preallocated!(out::AbstractVector, A::AbstractMatrix, b::AbstractVector)
	@assert size(A,1) == length(out)
	@assert size(A,2) == length(b)
	@simd for j in 1:size(A,2)
		for i in 1:size(A,1)
			@inbounds out[i] += A[i,j]*b[j]
		end
	end
	return out
endmetadatashow_logsèdisabled®skip_as_script«code_folded$060bc23d-52fa-4536-aa50-26390552997fcell_id$060bc23d-52fa-4536-aa50-26390552997fcode!begin
	nrows = 32
	ncols = 1
end;metadatashow_logsèdisabled®skip_as_script«code_folded$35332b4e-4caa-4448-a345-d272a6362647cell_id$35332b4e-4caa-4448-a345-d272a6362647codev5metadatashow_logsèdisabled®skip_as_script«code_folded$63ec6f40-1f29-4bf5-b48a-124f1e8d783bcell_id$63ec6f40-1f29-4bf5-b48a-124f1e8d783bcode;question_box(md"Will this be stored on the stack or heap?")metadatashow_logsèdisabled®skip_as_script«code_folded$318991c3-f693-4364-8e99-623883739a86cell_id$318991c3-f693-4364-8e99-623883739a86code٫begin
	@time v2 = FixedSizeArray(v3)  # Vector with fixed size, but still likely to go to heap, since intended for larger arrays
	v2[1] = 1.0
	v2[2] = 2.0
	v2[3] = 3.0
endmetadatashow_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$a1c68295-1450-4d5d-833d-57a7eabdbf22cell_id$a1c68295-1450-4d5d-833d-57a7eabdbf22code2md"""
### Optional parameter for improved performance
Here we specify the [chunk size](https://juliadiff.org/ForwardDiff.jl/dev/user/advanced/#Configuring-Chunk-Size) that affects both how many calls to the function (larger chunk→fewer calls) and how much memory is needed (larger chunk→more memory)"""metadatashow_logsèdisabled®skip_as_script«code_folded$12e4d1e4-d284-4180-8342-d58dda578272cell_id$12e4d1e4-d284-4180-8342-d58dda578272codebegin
	@time v3 = MVector(1, 2, 3)     # Mutable vector of fixed size and type, goes to heap, but will try to waste less memory compared to a normal vector
	@time v4 = @MVector [1, 2, 3, 4, ]   # macro to ease constructing
endmetadatashow_logsèdisabled®skip_as_script«code_folded$5de73fe6-fb0e-4a98-b2ba-f4e592f02006cell_id$5de73fe6-fb0e-4a98-b2ba-f4e592f02006codeglet
	A = rand(nrows,ncols)
	b = rand(ncols)
	@benchmark y = multiply_matrix_vector_allocates($A,$b)
endmetadatashow_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$2ad27ea5-77f7-4532-9005-7a63160e2503cell_id$2ad27ea5-77f7-4532-9005-7a63160e2503codeBmd"""
## Keeping small arrays in the stack and out of the heap
"""metadatashow_logsèdisabled®skip_as_script«code_folded$6371bcc6-3253-4dc4-82f8-647aedf4014ecell_id$6371bcc6-3253-4dc4-82f8-647aedf4014ecodemd"""
#### Why default to immutable?
- Often is more efficient. 
- Some structs can be packed efficiently into arrays
- Compiler is often able to avoid allocating immutable objects.
- Code using immutable objects can be easier to reason about.
"""metadatashow_logsèdisabled®skip_as_script«code_folded$3b3d6fdb-5066-48f1-aa64-e28f5ad3c1f1cell_id$3b3d6fdb-5066-48f1-aa64-e28f5ad3c1f1codeWprotip(md"""
Julia's garbage collector is "a non-compacting, generational, mark-and-sweep, tracing collector, which at a high level means the following…

**Mark-Sweep / Tracing**:
- When the garbage collector runs, it starts from a set of “roots” and walks through the object graph, “marking” objects as reachable.
- Any object that isn’t marked as reachable and will then be “swept away” — i.e. its memory is reclaimed—since you know it’s not reachable from the roots and is therefore garbage.

**Generational**:
- It’s common that more recently allocated objects become garbage more quickly—this is known as the “generational hypothesis”.
- Generational collectors have different levels of collection: young collections which run more frequently and full collections which run less frequently.
- If the generational hypothesis is true, this saves time since it’s a waste of time to keep checking if older objects are garbage when they’re probably not." 

**Non-compacting / Non-moving**:
- Other garbage collection techniques can copy or move objects during the collection process.  
- Julia does not use any of these—collection does not move or copy anything, it just reclaims unreachable objects.

If you’re having issues with garbage collection, your primary recourse is to generate less garbage:

- Write non-allocating code wherever possible: simple scalar code can generally avoid allocations.

- Use immutable objects (i.e., `struct` rather than `mutable struct`), which can be stack allocated more easily and stored inline in other structures (as compared to mutable objects which generally need to be heap-allocated and stored indirectly by pointer, all of which causes more memory pressure).

- Use pre-allocated data structures and modify them instead of allocating and returning new objects, especially in loops.

- Can call `GC.gc()` to manually call garbage collector.  But this is mainly useful for benchmarking.

(nearly quote from [Julia Discourse post by Stefan Karpinski](https://discourse.julialang.org/t/details-about-julias-garbage-collector-reference-counting/18021))
""")metadatashow_logsèdisabled®skip_as_script«code_folded$e46c0510-f604-4025-bef5-9029e3747447cell_id$e46c0510-f604-4025-bef5-9029e3747447codemd"""
Physical differences cause large difference in memory **latency** and **bandwidth**:

### Memory latency heirarchy
- Registers
- Cache L1
- Cache L2
- Cache L3
- RAM
- Local disk storage
- Disk storage on local network
- Disk storage on internet
- Tape storage
"""metadatashow_logsèdisabled®skip_as_script«code_folded$c7e5ad3c-a3ce-47a4-9154-ca33edc2811bcell_id$c7e5ad3c-a3ce-47a4-9154-ca33edc2811bcode3md"""
#### Meaning of equality can be confusing
"""metadatashow_logsèdisabled®skip_as_script«code_folded$41c6bcb6-c5c5-4a52-a678-31ffa22641e1cell_id$41c6bcb6-c5c5-4a52-a678-31ffa22641e1codeD@allocated mms2 = MyMutableStruct(5.0, "Lorem ipsum dolor sit amet")metadatashow_logsèdisabled®skip_as_script«code_folded$ff336de5-cf53-41ca-9cc9-1ab37b851be3cell_id$ff336de5-cf53-41ca-9cc9-1ab37b851be3codeD@time v1 = [1,2,3]    # Vector whose length can change, goes to heapmetadatashow_logsèdisabled®skip_as_script«code_folded$9cc467f9-cc48-4026-87c5-dadfe239c5dbcell_id$9cc467f9-cc48-4026-87c5-dadfe239c5dbcodeٳmd"""
### Implications
- Mutable objects typically go onto heap 
- → Only make structs mutable if a reason.
- An immutable object can contain mutable objects (e.g., arrays).
"""metadatashow_logsèdisabled®skip_as_script«code_folded$5287e3b8-2309-4c78-91f0-f80e7ae7f209cell_id$5287e3b8-2309-4c78-91f0-f80e7ae7f209code>struct MyImmutableStruct
	result::Float64
	message::String
endmetadatashow_logsèdisabled®skip_as_script«code_folded$1fa422e7-329d-4072-a786-fb73c718e49ecell_id$1fa422e7-329d-4072-a786-fb73c718e49ecodesizeof(mis)metadatashow_logsèdisabled®skip_as_script«code_folded$75661d12-7709-44d0-a5f3-d6c9a5eff952cell_id$75661d12-7709-44d0-a5f3-d6c9a5eff952codetypeof(t), sizeof(t)metadatashow_logsèdisabled®skip_as_script«code_folded$d6019e5a-e7a1-4676-a3f1-24fe62bfa931cell_id$d6019e5a-e7a1-4676-a3f1-24fe62bfa931codechunk_size = 2metadatashow_logsèdisabled®skip_as_script«code_folded$ee76a23e-e940-4b32-a44a-9086d0461089cell_id$ee76a23e-e940-4b32-a44a-9086d0461089codeٕlet
	result = DiffResults.GradientResult(x_eval)
	ForwardDiff.gradient!(result,f,x_eval)
	DiffResults.value(result), DiffResults.gradient(result)
endmetadatashow_logsèdisabled®skip_as_script«code_folded$aac0c3f8-ece3-431e-859d-790b8f3b995acell_id$aac0c3f8-ece3-431e-859d-790b8f3b995acodeٝbegin 
	mis_will_break = MyImmutableStruct(3.0, "Lorem ipsum dolor sit amet")
	try
		mis_will_break.result = 4.0
	catch
		@warn "You can't do that!"
	end
endmetadatashow_logsèdisabled®skip_as_script«code_folded$c4da391c-e7dc-4ce1-9ccb-04aa2ca79e26cell_id$c4da391c-e7dc-4ce1-9ccb-04aa2ca79e26code
hint(md"""
- `sizeof(mms) = ` $(sizeof(mms)) 
- `sizeof(mms.result) =` $(sizeof(mms.result))
- `sizeof(mms.message) =` $(sizeof(mms.message))
- `Base.summarysize(mms.message) =`$(Base.summarysize(mms.message))
- `Base.summarysize(mms) =`$(Base.summarysize(mms))
""")metadatashow_logsèdisabled®skip_as_script«code_folded$9007f240-c88e-46c4-993d-fd6b93d8b18dcell_id$9007f240-c88e-46c4-993d-fd6b93d8b18dcodemd"""
# Week 4 Admin Announcements
## Project proposals
### Feedback
- Project repo, Pull requests, Feedback (either Conversation or Files view) 
- I'll look for any replies once I've finished providing feedback to everyone.
"""metadatashow_logsèdisabled®skip_as_script«code_folded$cb988242-8aa6-4f31-955e-021024e0c921cell_id$cb988242-8aa6-4f31-955e-021024e0c921code(f(x) = x[1]*x[2]/sqrt(1+(x[1]^2+x[2]^2))metadatashow_logsèdisabled®skip_as_script«code_folded$7d1edb0b-3144-4ac7-a939-2e211cdee81bcell_id$7d1edb0b-3144-4ac7-a939-2e211cdee81bcode1md"### Mutating version for improved performance"metadatashow_logsèdisabled®skip_as_script«code_folded$c6eb773e-757e-466e-ba15-593c2b19fd1ccell_id$c6eb773e-757e-466e-ba15-593c2b19fd1ccodeForwardDiff.gradient(f,x_eval)metadatashow_logsèdisabled®skip_as_script«code_folded$4772a931-14a6-46c9-8b8c-44b39d213216cell_id$4772a931-14a6-46c9-8b8c-44b39d213216codebegin
	@time v5 = SVector(1, 2, 3)        # Static vector of fixed size and type, goes to stack
	@time v6 = @SVector [1, 2, 3]      # macro for creating SVector without allocating on heap
end;metadatashow_logsèdisabled®skip_as_script«code_folded$cf7990f7-40ec-4a99-be58-e5342061baedcell_id$cf7990f7-40ec-4a99-be58-e5342061baedcode/md"""
#### Limitations of immutable structs
"""metadatashow_logsèdisabled®skip_as_script«code_folded$397e78ca-8b07-4593-8c92-9b69cbc9d2a3cell_id$397e78ca-8b07-4593-8c92-9b69cbc9d2a3code:md"""
#### Warning about mutating collections in Pluto
"""metadatashow_logsèdisabled®skip_as_script«code_folded$fc9ae0ec-298b-4542-9c71-dbbe535b4bd9cell_id$fc9ae0ec-298b-4542-9c71-dbbe535b4bd9code)md"""
## Pre-allocating storage space
"""metadatashow_logsèdisabled®skip_as_script«code_folded$abee77fd-e2a2-403b-ab43-b4ea6741ba4ccell_id$abee77fd-e2a2-403b-ab43-b4ea6741ba4ccodemd"# Computer Memory Systems"metadatashow_logsèdisabled®skip_as_script«code_folded$f68fb195-1fa6-4364-8d8f-427a6ea9a4b6cell_id$f68fb195-1fa6-4364-8d8f-427a6ea9a4b6codeپlet
	result = DiffResults.GradientResult(x_eval)
	cfg = ForwardDiff.GradientConfig(f, x_eval, ForwardDiff.Chunk{chunk_size}())
	@benchmark ForwardDiff.gradient!($result,$f,$x_eval, $cfg)
endmetadatashow_logsèdisabled®skip_as_script«code_folded$cbea527b-9a62-40d4-b922-47f4428a8b33cell_id$cbea527b-9a62-40d4-b922-47f4428a8b33codelet
	result = DiffResults.GradientResult(x_eval)
	cfg = ForwardDiff.GradientConfig(f, x_eval, ForwardDiff.Chunk{2}())
	ForwardDiff.gradient!(result,f,x_eval, cfg, Val{false}())
	DiffResults.value(result), DiffResults.gradient(result)
endmetadatashow_logsèdisabled®skip_as_script«code_folded$b55fc829-c857-44bb-af5b-cbbf8dcab5e7cell_id$b55fc829-c857-44bb-af5b-cbbf8dcab5e7codev1 == v5metadatashow_logsèdisabled®skip_as_script«code_folded$abf6e65a-292a-4f4a-8eee-ea90cd22e376cell_id$abf6e65a-292a-4f4a-8eee-ea90cd22e376codeWv2[2] = 0;  # Valid Julia code, but...
# Leads to ambiguous order of execution in Plutometadatashow_logsèdisabled®skip_as_script«code_folded$34840126-4365-418d-bc55-4ac3bd85f43fcell_id$34840126-4365-418d-bc55-4ac3bd85f43fcoden"""`multiply_matrix_vector_allocates(A::Matrix, b::Vector)`

Multiply matrix A and vector b by hand, allocating space for output"""
function multiply_matrix_vector_allocates(A::AbstractMatrix, b::AbstractVector) 
	@assert size(A,2) == length(b)
	out = zeros(promote_type(eltype(A),eltype(b)), size(A,1))
	multiply_matrix_vector_preallocated!(out,A,b)
	return out
endmetadatashow_logsèdisabled®skip_as_script«code_foldedënotebook_id$4493f668-bfda-11f0-0b3a-af963b4d6a71in_temp_dir¨metadata