<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom"><title>NotesByLex.com</title><link href="http://localhost:8000/" rel="alternate"/><link href="http://localhost:8000/feeds/all.atom.xml" rel="self"/><id>http://localhost:8000/</id><updated>2026-05-09T00:00:00+10:00</updated><entry><title>LLMs Corrupt Your Documents When You Delegate</title><link href="http://localhost:8000/llms-corrupt-your-documents-when-you-delegate.html" rel="alternate"/><published>2026-05-09T00:00:00+10:00</published><updated>2026-05-09T00:00:00+10:00</updated><author><name>Lex Toumbourou</name></author><id>tag:localhost,2026-05-09:/llms-corrupt-your-documents-when-you-delegate.html</id><summary type="html">&lt;p&gt;A large-scale study on long-horizon document tasks.&lt;/p&gt;</summary><content type="html">&lt;p&gt;An interesting paper from researchers at Microsoft.&lt;/p&gt;
&lt;p&gt;They introduce a benchmark called &lt;a href="delegate-52.html"&gt;DELEGATE-52&lt;/a&gt; that tests whether LLMs can safely carry out, what they call, "long-delegated workflows" for document editing across 52 domains. Every set of instructions in the benchmark is lossless and reversible, allowing the authors to measure how much each task degrades the file's information over multiple interactions.&lt;/p&gt;
&lt;p&gt;They found that even the strongest frontier models, including Gemini 3.1 Pro, Claude 4.6 Opus, and GPT 5.4 (the paper was released before their successors), corrupted an average of about 25% of document content after 20 interactions. Across all tested models, average degradation was about 50% &lt;a href='#labanLLMsCorruptYour2026' id='ref-labanLLMsCorruptYour2026-1'&gt;Laban et al. (2026)&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Python was the main exception. It was the only domain in which most models met the paper’s “delegation-ready” threshold, with 17 of 19 models scoring at least 98% after 20 interactions.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Three examples of document degradation over 20 interactions: a Linux Kernel Architecture graph diagram losing nodes and edges, a 12-Shaft Twill Diamond textile pattern becoming corrupted, and an ActionBoy Palm Tree 3D object losing geometry. Each shows progressive corruption from interaction 4 to 20." src="../../_media/llms-corrupt-figure-1-examples.png"&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Figure 1 from &lt;a href='#labanLLMsCorruptYour2026' id='ref-labanLLMsCorruptYour2026-2'&gt;Laban et al. (2026)&lt;/a&gt; shows examples of document degradation across different domains. The benchmark itself is text-only; the visual renderings are illustrative.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Surprisingly, the degradation didn't happen gradually over instructions, but models would typically fail catastrophically after a certain number of steps. Stronger frontier models would fare better only by delaying the step at which the degradation occurs.&lt;/p&gt;
&lt;p&gt;They also found that tool use did not prevent degradation. The tested models performed worse with tools, averaging an additional 6% of degradation.&lt;/p&gt;
&lt;h2 id="measuring-document-corruption"&gt;Measuring Document Corruption&lt;/h2&gt;
&lt;p&gt;To measure document corruption, they introduce a domain-specific &lt;a href="document-similarity-measure.html"&gt;Document Similarity Measure&lt;/a&gt; that parses documents into components. For a recipe, that means ingredients (name, quantity, unit), steps, and tips; for Python code, it means functions, classes, and imports. This lets them compare two parsed documents based on their actual content, rather than just raw text. Typical document similarity measures might overlook seemingly small changes, such as &lt;code&gt;200g&lt;/code&gt; to &lt;code&gt;800g&lt;/code&gt; of butter, which can be really bad in a recipe, whereas a surface-level rewrite that preserves the underlying structure doesn't need to be heavily penalised.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Pipeline diagram showing how a raw recipe text file is parsed into structured ingredients, steps and tips, then scored for semantic equivalence against a reference using a weighted formula: 0.4 times ingredient score plus 0.4 times step score plus 0.2 times tip score." src="../../_media/llms-corrupt-figure-5-document-parsing-similarity-score.png"&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Figure 5 from &lt;a href='#labanLLMsCorruptYour2026' id='ref-labanLLMsCorruptYour2026-3'&gt;Laban et al. (2026)&lt;/a&gt; - the domain-specific parsing pipeline, with a concrete recipe example showing how ingredients, steps and tips are extracted and compared&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;The approach of creating reversible transforms was inspired by &lt;a href="backtranslation.html"&gt;Backtranslation&lt;/a&gt;, a machine translation technique in which text is translated into another language and then back, allowing the result to be compared with the original. DELEGATE-52 adapts that idea to document editing: apply a forward edit, apply the inverse edit, and compare the reconstructed document to the original. Imagine splitting a CSV into separate files by expense category, then merging them back together. Or converting all amounts in an accounting ledger to euros, then converting back.&lt;/p&gt;
&lt;p&gt;They use a round-trip relay simulation method in which every task is assumed to be reversible, defined by a forward instruction and its inverse.&lt;/p&gt;
&lt;div class="d52-widget"&gt;
&lt;style&gt;
.d52-widget{--d52-ink:#1a1208;--d52-paper:#f5f0e8;--d52-paper-warm:#ede8dc;--d52-rule:#c8bfa8;--d52-amber:#d4700a;--d52-amber-light:#f5d49a;--d52-amber-pale:#fdf3dc;--d52-green:#2d6a4f;--d52-green-light:#b7e4c7;--d52-red:#9b2335;--d52-red-light:#f4b8c1;--d52-blue-mid:#2563a8;--d52-muted:#7a6e5f;font-family:Georgia,'Times New Roman',serif}
.d52-widget *{box-sizing:border-box}
.d52-rtp{display:flex;align-items:center;gap:0;overflow-x:auto;padding:1.5rem 0 0.5rem;flex-wrap:nowrap}
.d52-node{flex-shrink:0;display:flex;flex-direction:column;align-items:center;gap:.4rem}
.d52-doc{background:#fff;border:1.5px solid var(--d52-ink);border-radius:3px;padding:.65rem .85rem;font-family:'Courier New',monospace;font-size:.7rem;line-height:1.65;min-width:110px;max-width:128px;box-shadow:3px 3px 0 var(--d52-ink)}
.d52-doc.corrupt{border-color:var(--d52-amber);box-shadow:3px 3px 0 var(--d52-amber)}
.d52-doc-title{font-weight:700;font-size:.62rem;text-transform:uppercase;letter-spacing:.08em;border-bottom:1px solid #ccc;padding-bottom:.2rem;margin-bottom:.3rem;font-family:'Helvetica Neue',sans-serif}
.d52-dline{color:#444;margin-bottom:.05rem}
.d52-dline.cx{color:var(--d52-amber);font-weight:700}
.d52-arr{flex-shrink:0;display:flex;flex-direction:column;align-items:center;padding:0 .35rem;min-width:80px}
.d52-llm{background:var(--d52-ink);color:var(--d52-paper);border-radius:4px;padding:.4rem .55rem;font-family:'Helvetica Neue',sans-serif;font-size:.62rem;text-align:center;line-height:1.4;min-width:80px}
.d52-badge{display:block;background:var(--d52-amber);color:var(--d52-ink);font-size:.55rem;font-weight:700;letter-spacing:.05em;padding:.1rem .3rem;border-radius:2px;margin-top:.25rem;text-transform:uppercase}
.d52-aline{width:2px;height:14px;background:var(--d52-ink)}
.d52-achev{width:0;height:0;border-left:5px solid transparent;border-right:5px solid transparent;border-top:7px solid var(--d52-ink)}
.d52-node-lbl{font-family:'Helvetica Neue',sans-serif;font-size:.65rem;color:var(--d52-muted);text-align:center;max-width:128px}
.d52-score{display:inline-flex;align-items:center;gap:.3rem;font-family:'Courier New',monospace;font-size:.85rem;font-weight:700;padding:.4rem .7rem;border-radius:3px;margin-top:.4rem;background:var(--d52-paper);border:1.5px solid var(--d52-green);color:var(--d52-green)}
.d52-caption{font-family:'Helvetica Neue',sans-serif;font-size:.78rem;color:var(--d52-muted);margin-top:.75rem;line-height:1.5}
&lt;/style&gt;
&lt;div class="d52-rtp"&gt;
  &lt;div class="d52-node"&gt;
    &lt;div class="d52-doc"&gt;&lt;div class="d52-doc-title"&gt;Seed Doc&lt;/div&gt;&lt;div class="d52-dline"&gt;2 cups flour&lt;/div&gt;&lt;div class="d52-dline"&gt;1 cup sugar&lt;/div&gt;&lt;div class="d52-dline"&gt;½ tsp salt&lt;/div&gt;&lt;div class="d52-dline"&gt;— Mix dry&lt;/div&gt;&lt;div class="d52-dline"&gt;— Bake 350°F&lt;/div&gt;&lt;/div&gt;
    &lt;div class="d52-node-lbl"&gt;Original &lt;em&gt;s&lt;/em&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="d52-arr"&gt;
    &lt;div class="d52-llm"&gt;Forward edit&lt;br&gt;"→ metric"&lt;span class="d52-badge"&gt;🔄 Fresh context&lt;/span&gt;&lt;/div&gt;
    &lt;div class="d52-aline"&gt;&lt;/div&gt;&lt;div class="d52-achev"&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="d52-node"&gt;
    &lt;div class="d52-doc"&gt;&lt;div class="d52-doc-title"&gt;Transformed&lt;/div&gt;&lt;div class="d52-dline"&gt;473 ml flour&lt;/div&gt;&lt;div class="d52-dline"&gt;237 ml sugar&lt;/div&gt;&lt;div class="d52-dline"&gt;2.5 ml salt&lt;/div&gt;&lt;div class="d52-dline"&gt;— Mix dry&lt;/div&gt;&lt;div class="d52-dline"&gt;— Bake 175°C&lt;/div&gt;&lt;/div&gt;
    &lt;div class="d52-node-lbl"&gt;Edited &lt;em&gt;t&lt;/em&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="d52-arr"&gt;
    &lt;div class="d52-llm"&gt;Backward edit&lt;br&gt;"→ imperial"&lt;span class="d52-badge"&gt;🔄 Fresh context&lt;/span&gt;&lt;/div&gt;
    &lt;div class="d52-aline"&gt;&lt;/div&gt;&lt;div class="d52-achev"&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="d52-node"&gt;
    &lt;div class="d52-doc corrupt"&gt;&lt;div class="d52-doc-title"&gt;Reconstructed&lt;/div&gt;&lt;div class="d52-dline cx"&gt;2.01 cups flour&lt;/div&gt;&lt;div class="d52-dline"&gt;1 cup sugar&lt;/div&gt;&lt;div class="d52-dline"&gt;½ tsp salt&lt;/div&gt;&lt;div class="d52-dline"&gt;— Mix dry&lt;/div&gt;&lt;div class="d52-dline"&gt;— Bake 350°F&lt;/div&gt;&lt;/div&gt;
    &lt;div class="d52-node-lbl"&gt;Reconstructed &lt;em&gt;ŝ&lt;/em&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="d52-arr"&gt;
    &lt;div class="d52-llm" style="background:var(--d52-green)"&gt;sim(&lt;em&gt;s&lt;/em&gt;, &lt;em&gt;ŝ&lt;/em&gt;)&lt;/div&gt;
    &lt;div class="d52-aline" style="background:var(--d52-green)"&gt;&lt;/div&gt;
    &lt;div class="d52-achev" style="border-top-color:var(--d52-green)"&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="d52-node"&gt;
    &lt;div class="d52-score"&gt;RS&amp;#64;2 = 97.3&lt;/div&gt;
    &lt;div class="d52-node-lbl"&gt;Reconstruction&lt;br&gt;Score&lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;div class="d52-caption"&gt;Each LLM call is independent with no conversation history. Errors survive into the next round because they are baked into the document itself, not the context window.&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;It's worth checking out some examples in the GitHub repo, see &lt;a href="https://github.com/microsoft/delegate52/blob/main/domain_viewer/musicsheet.md#edit-tasks-6-total"&gt;music&lt;/a&gt;, &lt;a href="https://github.com/microsoft/delegate52/blob/main/domain_viewer/robotics.md#edit-tasks-6-total"&gt;robotics&lt;/a&gt; and &lt;a href="https://github.com/microsoft/delegate52/blob/main/domain_viewer/hamradio.md#edit-tasks-6-total"&gt;Ham radio&lt;/a&gt; as examples.&lt;/p&gt;
&lt;p&gt;They also tested the inclusion of distractor documents in LLM interactions and found that they harm documents more as interaction length increases.&lt;/p&gt;
&lt;p&gt;Basically, degradation severity is exacerbated by document size, interaction length, and the presence of distractor files. However, important to note that the LLM interactions themselves are stateless - it's not just that more noise in context causes outputs to degrade.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;The simulation below steps through a recipe domain across 8 round-trips. Each forward edit converts imperial measurements to metric; each backward edit reverts. Watch how errors compound through the document across completely independent calls.&lt;/p&gt;
&lt;div class="d52-sim-widget"&gt;
&lt;style&gt;
.d52-sim-widget{--d52s-ink:#1a1208;--d52s-paper:#f5f0e8;--d52s-warm:#ede8dc;--d52s-rule:#c8bfa8;--d52s-amber:#d4700a;--d52s-alight:#f5d49a;--d52s-apale:#fdf3dc;--d52s-green:#2d6a4f;--d52s-glight:#b7e4c7;--d52s-red:#9b2335;--d52s-rlight:#f4b8c1;--d52s-blue:#2563a8;--d52s-muted:#7a6e5f;font-family:Georgia,'Times New Roman',serif}
.d52-sim-widget *{box-sizing:border-box}
.d52s-controls{display:flex;align-items:center;gap:.85rem;margin-bottom:1.1rem;flex-wrap:wrap}
.d52s-btn{background:var(--d52s-ink);color:var(--d52s-paper);border:none;padding:.5rem 1.1rem;font-family:'Helvetica Neue',sans-serif;font-size:.8rem;font-weight:700;letter-spacing:.04em;cursor:pointer;border-radius:3px;transition:background .15s}
.d52s-btn:hover{background:var(--d52s-amber);color:var(--d52s-ink)}
.d52s-btn:disabled{opacity:.35;cursor:not-allowed;background:var(--d52s-ink);color:var(--d52s-paper)}
.d52s-btn.sec{background:transparent;color:var(--d52s-ink);border:1.5px solid var(--d52s-ink)}
.d52s-btn.sec:hover{background:var(--d52s-warm)}
.d52s-meta{font-family:'Courier New',monospace;font-size:.78rem;color:var(--d52s-muted)}
.d52s-score-lbl{font-family:'Courier New',monospace;font-size:.78rem;font-weight:700}
.d52s-istrip{background:var(--d52s-warm);border:1px solid var(--d52s-rule);border-radius:4px;padding:.7rem 1rem;margin-bottom:.85rem;display:grid;grid-template-columns:1fr 1fr;gap:.75rem;transition:opacity .3s}
.d52s-ibox{font-family:'Helvetica Neue',sans-serif;font-size:.78rem;line-height:1.4}
.d52s-ilbl{font-size:.62rem;font-weight:700;text-transform:uppercase;letter-spacing:.1em;color:var(--d52s-muted);display:flex;align-items:center;gap:.3rem;margin-bottom:.2rem}
.d52s-dot{width:6px;height:6px;border-radius:50%;display:inline-block}
.d52s-indicator{display:flex;align-items:center;gap:.5rem;font-family:'Helvetica Neue',sans-serif;font-size:.72rem;color:var(--d52s-muted);margin-bottom:.75rem;transition:opacity .3s}
.d52s-pill{background:var(--d52s-ink);color:var(--d52s-paper);padding:.15rem .5rem;border-radius:2px;font-size:.65rem;font-weight:700}
.d52s-fpill{background:var(--d52s-alight);color:var(--d52s-amber);padding:.15rem .5rem;border-radius:2px;font-size:.65rem;font-weight:700;border:1px solid var(--d52s-amber)}
.d52s-layout{display:grid;grid-template-columns:1fr 1fr;gap:1.25rem;margin-bottom:.75rem}
&amp;#64;media(max-width:560px){.d52s-layout{grid-template-columns:1fr}.d52s-istrip{grid-template-columns:1fr}}
.d52s-dlbl{font-family:'Helvetica Neue',sans-serif;font-size:.68rem;font-weight:700;text-transform:uppercase;letter-spacing:.1em;color:var(--d52s-muted);margin-bottom:.4rem}
.d52s-doc{background:#fff;border:1.5px solid var(--d52s-ink);border-radius:4px;padding:1rem;font-family:'Courier New',monospace;font-size:.75rem;line-height:1.8;min-height:190px;box-shadow:4px 4px 0 var(--d52s-rule)}
.d52s-doc .sh{font-family:'Helvetica Neue',sans-serif;font-size:.67rem;font-weight:700;text-transform:uppercase;letter-spacing:.08em;margin:.65rem 0 .25rem;color:var(--d52s-muted)}
.d52s-doc .ttl{font-family:Georgia,serif;font-size:.85rem;font-weight:700;margin-bottom:.4rem}
.d52s-il,.d52s-sl{display:flex;gap:.45rem;align-items:baseline;margin-bottom:.12rem;padding:.03rem .2rem;border-radius:2px}
.d52s-qty{min-width:52px;color:var(--d52s-blue)}
.ca{background:var(--d52s-alight) !important;color:var(--d52s-ink) !important}
.cr{background:var(--d52s-rlight) !important;color:var(--d52s-red) !important;text-decoration:line-through;opacity:.65}
.cn{background:var(--d52s-glight) !important;color:var(--d52s-green) !important}
.d52s-bottom{display:flex;align-items:flex-end;gap:1rem;margin-top:.5rem}
.d52s-bars{display:flex;gap:3px;align-items:flex-end;flex:1}
.d52s-bar{flex:1;background:var(--d52s-rule);border-radius:2px 2px 0 0;transition:height .4s ease,background .4s;min-height:3px}
.d52s-bar.act{background:var(--d52s-amber)}
.d52s-bar.pst{background:var(--d52s-muted)}
.d52s-big{font-family:'Courier New',monospace;font-size:2rem;font-weight:700;line-height:1;text-align:right;min-width:80px;transition:color .4s}
.d52s-biglbl{font-family:'Helvetica Neue',sans-serif;font-size:.68rem;color:var(--d52s-muted);text-align:right}
.d52s-legend{display:flex;gap:1.25rem;margin-top:.6rem;font-family:'Helvetica Neue',sans-serif;font-size:.73rem;flex-wrap:wrap}
.d52s-lswatch{padding:.1rem .35rem;border-radius:2px;font-size:.7rem}
&amp;#64;keyframes d52fadeUp{from{opacity:0;transform:translateY(8px)}to{opacity:1;transform:translateY(0)}}
.d52s-doc{animation:d52fadeUp .3s ease}
&lt;/style&gt;

&lt;div class="d52s-controls"&gt;
  &lt;button class="d52s-btn" id="d52s-next" onclick="d52sNext()"&gt;Next Round →&lt;/button&gt;
  &lt;button class="d52s-btn sec" onclick="d52sReset()"&gt;Reset&lt;/button&gt;
  &lt;span class="d52s-meta" id="d52s-rlbl"&gt;Round 0 of 8&lt;/span&gt;
  &lt;span class="d52s-score-lbl" id="d52s-slbl"&gt;&lt;/span&gt;
&lt;/div&gt;

&lt;div class="d52s-istrip" id="d52s-istrip" style="opacity:.4"&gt;
  &lt;div class="d52s-ibox"&gt;&lt;div class="d52s-ilbl"&gt;&lt;span class="d52s-dot" style="background:#2563a8"&gt;&lt;/span&gt;Forward edit&lt;/div&gt;&lt;span id="d52s-fwd"&gt;—&lt;/span&gt;&lt;/div&gt;
  &lt;div class="d52s-ibox"&gt;&lt;div class="d52s-ilbl"&gt;&lt;span class="d52s-dot" style="background:#2d6a4f"&gt;&lt;/span&gt;Backward edit&lt;/div&gt;&lt;span id="d52s-bwd"&gt;—&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;div class="d52s-indicator" id="d52s-ind" style="opacity:0"&gt;
  &lt;span class="d52s-pill"&gt;LLM call&lt;/span&gt;
  &lt;span class="d52s-fpill"&gt;🔄 Fresh context — no history&lt;/span&gt;
  &lt;span&gt;→ document received, instruction applied, output returned&lt;/span&gt;
&lt;/div&gt;

&lt;div class="d52s-layout"&gt;
  &lt;div&gt;
    &lt;div class="d52s-dlbl"&gt;Original (reference)&lt;/div&gt;
    &lt;div class="d52s-doc" id="d52s-orig"&gt;
      &lt;div class="ttl"&gt;Chocolate Chip Cookies&lt;/div&gt;
      &lt;div class="sh"&gt;Ingredients&lt;/div&gt;
      &lt;div class="d52s-il"&gt;&lt;span class="d52s-qty"&gt;2 cups&lt;/span&gt;&lt;span&gt;all-purpose flour&lt;/span&gt;&lt;/div&gt;
      &lt;div class="d52s-il"&gt;&lt;span class="d52s-qty"&gt;1 cup&lt;/span&gt;&lt;span&gt;granulated sugar&lt;/span&gt;&lt;/div&gt;
      &lt;div class="d52s-il"&gt;&lt;span class="d52s-qty"&gt;½ tsp&lt;/span&gt;&lt;span&gt;salt&lt;/span&gt;&lt;/div&gt;
      &lt;div class="d52s-il"&gt;&lt;span class="d52s-qty"&gt;2 sticks&lt;/span&gt;&lt;span&gt;unsalted butter&lt;/span&gt;&lt;/div&gt;
      &lt;div class="sh"&gt;Steps&lt;/div&gt;
      &lt;div class="d52s-sl"&gt;1. Cream butter and sugar until fluffy.&lt;/div&gt;
      &lt;div class="d52s-sl"&gt;2. Sift in flour and salt, fold gently.&lt;/div&gt;
      &lt;div class="d52s-sl"&gt;3. Bake at 350°F for 12 minutes.&lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
  &lt;div&gt;
    &lt;div class="d52s-dlbl"&gt;After round-trip reconstruction&lt;/div&gt;
    &lt;div class="d52s-doc" id="d52s-cur"&gt;
      &lt;div class="ttl"&gt;Chocolate Chip Cookies&lt;/div&gt;
      &lt;div class="sh"&gt;Ingredients&lt;/div&gt;
      &lt;div class="d52s-il"&gt;&lt;span class="d52s-qty"&gt;2 cups&lt;/span&gt;&lt;span&gt;all-purpose flour&lt;/span&gt;&lt;/div&gt;
      &lt;div class="d52s-il"&gt;&lt;span class="d52s-qty"&gt;1 cup&lt;/span&gt;&lt;span&gt;granulated sugar&lt;/span&gt;&lt;/div&gt;
      &lt;div class="d52s-il"&gt;&lt;span class="d52s-qty"&gt;½ tsp&lt;/span&gt;&lt;span&gt;salt&lt;/span&gt;&lt;/div&gt;
      &lt;div class="d52s-il"&gt;&lt;span class="d52s-qty"&gt;2 sticks&lt;/span&gt;&lt;span&gt;unsalted butter&lt;/span&gt;&lt;/div&gt;
      &lt;div class="sh"&gt;Steps&lt;/div&gt;
      &lt;div class="d52s-sl"&gt;1. Cream butter and sugar until fluffy.&lt;/div&gt;
      &lt;div class="d52s-sl"&gt;2. Sift in flour and salt, fold gently.&lt;/div&gt;
      &lt;div class="d52s-sl"&gt;3. Bake at 350°F for 12 minutes.&lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;div class="d52s-bottom"&gt;
  &lt;div style="flex:1"&gt;
    &lt;div class="d52s-bars" id="d52s-bars"&gt;&lt;/div&gt;
    &lt;div style="font-family:'Courier New',monospace;font-size:.63rem;color:var(--d52s-muted);text-align:right;margin-top:.2rem"&gt;RS&amp;#64;k across rounds&lt;/div&gt;
  &lt;/div&gt;
  &lt;div&gt;
    &lt;div class="d52s-big" id="d52s-big" style="color:var(--d52s-ink)"&gt;—&lt;/div&gt;
    &lt;div class="d52s-biglbl"&gt;Reconstruction score&lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;div class="d52s-legend"&gt;
  &lt;span&gt;&lt;span class="d52s-lswatch ca"&gt;■&lt;/span&gt; Corrupted value&lt;/span&gt;
  &lt;span&gt;&lt;span class="d52s-lswatch cr"&gt;■&lt;/span&gt; Deleted content&lt;/span&gt;
  &lt;span&gt;&lt;span class="d52s-lswatch cn"&gt;■&lt;/span&gt; Hallucinated content&lt;/span&gt;
&lt;/div&gt;

&lt;script&gt;
(function(){
var rounds=[
  {fwd:'Convert all measurements to metric units',bwd:'Convert all measurements back to imperial',score:97,doc:'&lt;div class="ttl"&gt;Chocolate Chip Cookies&lt;/div&gt;&lt;div class="sh"&gt;Ingredients&lt;/div&gt;&lt;div class="d52s-il"&gt;&lt;span class="d52s-qty ca"&gt;2.01 cups&lt;/span&gt;&lt;span&gt;all-purpose flour&lt;/span&gt;&lt;/div&gt;&lt;div class="d52s-il"&gt;&lt;span class="d52s-qty"&gt;1 cup&lt;/span&gt;&lt;span&gt;granulated sugar&lt;/span&gt;&lt;/div&gt;&lt;div class="d52s-il"&gt;&lt;span class="d52s-qty"&gt;½ tsp&lt;/span&gt;&lt;span&gt;salt&lt;/span&gt;&lt;/div&gt;&lt;div class="d52s-il"&gt;&lt;span class="d52s-qty"&gt;2 sticks&lt;/span&gt;&lt;span&gt;unsalted butter&lt;/span&gt;&lt;/div&gt;&lt;div class="sh"&gt;Steps&lt;/div&gt;&lt;div class="d52s-sl"&gt;1. Cream butter and sugar until fluffy.&lt;/div&gt;&lt;div class="d52s-sl"&gt;2. Sift in flour and salt, fold gently.&lt;/div&gt;&lt;div class="d52s-sl"&gt;3. Bake at 350°F for 12 minutes.&lt;/div&gt;'},
  {fwd:'Sort ingredients alphabetically',bwd:'Restore original ingredient order',score:94,doc:'&lt;div class="ttl"&gt;Chocolate Chip Cookies&lt;/div&gt;&lt;div class="sh"&gt;Ingredients&lt;/div&gt;&lt;div class="d52s-il"&gt;&lt;span class="d52s-qty ca"&gt;2.01 cups&lt;/span&gt;&lt;span&gt;all-purpose flour&lt;/span&gt;&lt;/div&gt;&lt;div class="d52s-il ca"&gt;&lt;span class="d52s-qty"&gt;2 sticks&lt;/span&gt;&lt;span&gt;unsalted butter&lt;/span&gt;&lt;/div&gt;&lt;div class="d52s-il ca"&gt;&lt;span class="d52s-qty"&gt;1 cup&lt;/span&gt;&lt;span&gt;granulated sugar&lt;/span&gt;&lt;/div&gt;&lt;div class="d52s-il"&gt;&lt;span class="d52s-qty"&gt;½ tsp&lt;/span&gt;&lt;span&gt;salt&lt;/span&gt;&lt;/div&gt;&lt;div class="sh"&gt;Steps&lt;/div&gt;&lt;div class="d52s-sl"&gt;1. Cream butter and sugar until fluffy.&lt;/div&gt;&lt;div class="d52s-sl"&gt;2. Sift in flour and salt, fold gently.&lt;/div&gt;&lt;div class="d52s-sl"&gt;3. Bake at 350°F for 12 minutes.&lt;/div&gt;'},
  {fwd:'Convert steps to passive voice',bwd:'Revert steps to active voice',score:89,doc:'&lt;div class="ttl"&gt;Chocolate Chip Cookies&lt;/div&gt;&lt;div class="sh"&gt;Ingredients&lt;/div&gt;&lt;div class="d52s-il"&gt;&lt;span class="d52s-qty ca"&gt;2.01 cups&lt;/span&gt;&lt;span&gt;all-purpose flour&lt;/span&gt;&lt;/div&gt;&lt;div class="d52s-il"&gt;&lt;span class="d52s-qty"&gt;2 sticks&lt;/span&gt;&lt;span&gt;unsalted butter&lt;/span&gt;&lt;/div&gt;&lt;div class="d52s-il"&gt;&lt;span class="d52s-qty"&gt;1 cup&lt;/span&gt;&lt;span&gt;granulated sugar&lt;/span&gt;&lt;/div&gt;&lt;div class="d52s-il"&gt;&lt;span class="d52s-qty"&gt;½ tsp&lt;/span&gt;&lt;span&gt;salt&lt;/span&gt;&lt;/div&gt;&lt;div class="sh"&gt;Steps&lt;/div&gt;&lt;div class="d52s-sl ca"&gt;1. Cream butter and sugar until fluffy; sift in flour and salt.&lt;/div&gt;&lt;div class="d52s-sl cr"&gt;2. Sift in flour and salt, fold gently.&lt;/div&gt;&lt;div class="d52s-sl"&gt;3. Bake at 350°F for 12 minutes.&lt;/div&gt;'},
  {fwd:'Add preparation notes after each step',bwd:'Remove preparation notes, restore original steps',score:81,doc:'&lt;div class="ttl"&gt;Chocolate Chip Cookies&lt;/div&gt;&lt;div class="sh"&gt;Ingredients&lt;/div&gt;&lt;div class="d52s-il"&gt;&lt;span class="d52s-qty ca"&gt;2.01 cups&lt;/span&gt;&lt;span&gt;all-purpose flour&lt;/span&gt;&lt;/div&gt;&lt;div class="d52s-il"&gt;&lt;span class="d52s-qty"&gt;2 sticks&lt;/span&gt;&lt;span&gt;unsalted butter&lt;/span&gt;&lt;/div&gt;&lt;div class="d52s-il"&gt;&lt;span class="d52s-qty"&gt;1 cup&lt;/span&gt;&lt;span&gt;granulated sugar&lt;/span&gt;&lt;/div&gt;&lt;div class="d52s-il ca"&gt;&lt;span class="d52s-qty"&gt;1 tsp&lt;/span&gt;&lt;span&gt;salt&lt;/span&gt;&lt;/div&gt;&lt;div class="sh"&gt;Steps&lt;/div&gt;&lt;div class="d52s-sl ca"&gt;1. Cream butter and sugar until fluffy; sift in flour and salt.&lt;/div&gt;&lt;div class="d52s-sl cr"&gt;2. Sift in flour and salt, fold gently.&lt;/div&gt;&lt;div class="d52s-sl"&gt;3. Bake at 350°F for 12 minutes.&lt;/div&gt;'},
  {fwd:'Rewrite recipe for a professional kitchen context',bwd:'Rewrite recipe for a home cook',score:72,doc:'&lt;div class="ttl"&gt;Chocolate Chip Cookies&lt;/div&gt;&lt;div class="sh"&gt;Ingredients&lt;/div&gt;&lt;div class="d52s-il"&gt;&lt;span class="d52s-qty ca"&gt;2.01 cups&lt;/span&gt;&lt;span&gt;all-purpose flour&lt;/span&gt;&lt;/div&gt;&lt;div class="d52s-il"&gt;&lt;span class="d52s-qty"&gt;2 sticks&lt;/span&gt;&lt;span&gt;unsalted butter&lt;/span&gt;&lt;/div&gt;&lt;div class="d52s-il"&gt;&lt;span class="d52s-qty"&gt;1 cup&lt;/span&gt;&lt;span&gt;granulated sugar&lt;/span&gt;&lt;/div&gt;&lt;div class="d52s-il ca"&gt;&lt;span class="d52s-qty"&gt;1 tsp&lt;/span&gt;&lt;span&gt;salt&lt;/span&gt;&lt;/div&gt;&lt;div class="sh"&gt;Steps&lt;/div&gt;&lt;div class="d52s-sl ca"&gt;1. Cream butter and sugar until fluffy; sift in flour and salt.&lt;/div&gt;&lt;div class="d52s-sl cr"&gt;2. Sift in flour and salt, fold gently.&lt;/div&gt;&lt;div class="d52s-sl cr"&gt;3. Bake at 350°F for 12 minutes.&lt;/div&gt;'},
  {fwd:'Group ingredients by category (dry/wet)',bwd:'Merge ingredient groups back to a flat list',score:61,doc:'&lt;div class="ttl"&gt;Chocolate Chip Cookies&lt;/div&gt;&lt;div class="sh"&gt;Ingredients&lt;/div&gt;&lt;div class="d52s-il ca"&gt;&lt;span class="d52s-qty"&gt;2.01 cups&lt;/span&gt;&lt;span&gt;all-purpose flour&lt;/span&gt;&lt;/div&gt;&lt;div class="d52s-il ca"&gt;&lt;span class="d52s-qty"&gt;2 sticks&lt;/span&gt;&lt;span&gt;unsalted butter&lt;/span&gt;&lt;/div&gt;&lt;div class="d52s-il ca"&gt;&lt;span class="d52s-qty"&gt;1 cup&lt;/span&gt;&lt;span&gt;granulated sugar&lt;/span&gt;&lt;/div&gt;&lt;div class="d52s-il ca"&gt;&lt;span class="d52s-qty"&gt;1 tsp&lt;/span&gt;&lt;span&gt;salt&lt;/span&gt;&lt;/div&gt;&lt;div class="d52s-il cn"&gt;&lt;span class="d52s-qty"&gt;2 large&lt;/span&gt;&lt;span&gt;eggs (added by model)&lt;/span&gt;&lt;/div&gt;&lt;div class="sh"&gt;Steps&lt;/div&gt;&lt;div class="d52s-sl ca"&gt;1. Cream butter and sugar until fluffy; sift in flour and salt.&lt;/div&gt;&lt;div class="d52s-sl cr"&gt;2. Sift in flour and salt, fold gently.&lt;/div&gt;&lt;div class="d52s-sl cr"&gt;3. Bake at 350°F for 12 minutes.&lt;/div&gt;'},
  {fwd:'Format recipe as a numbered list with time estimates',bwd:'Remove time estimates, restore original format',score:48,doc:'&lt;div class="ttl"&gt;Chocolate Chip Cookies&lt;/div&gt;&lt;div class="sh"&gt;Ingredients&lt;/div&gt;&lt;div class="d52s-il ca"&gt;&lt;span class="d52s-qty"&gt;2.01 cups&lt;/span&gt;&lt;span&gt;all-purpose flour&lt;/span&gt;&lt;/div&gt;&lt;div class="d52s-il ca"&gt;&lt;span class="d52s-qty"&gt;2 sticks&lt;/span&gt;&lt;span&gt;unsalted butter&lt;/span&gt;&lt;/div&gt;&lt;div class="d52s-il ca"&gt;&lt;span class="d52s-qty"&gt;1 cup&lt;/span&gt;&lt;span&gt;granulated sugar&lt;/span&gt;&lt;/div&gt;&lt;div class="d52s-il ca"&gt;&lt;span class="d52s-qty"&gt;1 tsp&lt;/span&gt;&lt;span&gt;salt&lt;/span&gt;&lt;/div&gt;&lt;div class="d52s-il cn"&gt;&lt;span class="d52s-qty"&gt;2 large&lt;/span&gt;&lt;span&gt;eggs (added by model)&lt;/span&gt;&lt;/div&gt;&lt;div class="sh"&gt;Steps&lt;/div&gt;&lt;div class="d52s-sl ca"&gt;1. Cream butter, sugar, and eggs until fluffy.&lt;/div&gt;&lt;div class="d52s-sl cn"&gt;2. Add vanilla extract and mix. (hallucinated)&lt;/div&gt;&lt;div class="d52s-sl cr"&gt;3. Bake at 350°F for 12 minutes.&lt;/div&gt;'},
  {fwd:'Translate recipe into French, then back to English',bwd:'Standardise units and terminology',score:31,doc:'&lt;div class="ttl ca"&gt;Chocolate Chip Biscuits&lt;/div&gt;&lt;div class="sh"&gt;Ingredients&lt;/div&gt;&lt;div class="d52s-il ca"&gt;&lt;span class="d52s-qty"&gt;480 ml&lt;/span&gt;&lt;span&gt;all-purpose flour&lt;/span&gt;&lt;/div&gt;&lt;div class="d52s-il cr"&gt;&lt;span class="d52s-qty"&gt;2 sticks&lt;/span&gt;&lt;span&gt;unsalted butter&lt;/span&gt;&lt;/div&gt;&lt;div class="d52s-il cn"&gt;&lt;span class="d52s-qty"&gt;225 g&lt;/span&gt;&lt;span&gt;softened butter&lt;/span&gt;&lt;/div&gt;&lt;div class="d52s-il ca"&gt;&lt;span class="d52s-qty"&gt;1 cup&lt;/span&gt;&lt;span&gt;caster sugar&lt;/span&gt;&lt;/div&gt;&lt;div class="d52s-il ca"&gt;&lt;span class="d52s-qty"&gt;1 tsp&lt;/span&gt;&lt;span&gt;salt&lt;/span&gt;&lt;/div&gt;&lt;div class="d52s-il cn"&gt;&lt;span class="d52s-qty"&gt;2 large&lt;/span&gt;&lt;span&gt;eggs&lt;/span&gt;&lt;/div&gt;&lt;div class="sh"&gt;Steps&lt;/div&gt;&lt;div class="d52s-sl ca"&gt;1. Beat butter and sugar until pale and creamy.&lt;/div&gt;&lt;div class="d52s-sl cn"&gt;2. Fold in sifted flour with a spatula.&lt;/div&gt;&lt;div class="d52s-sl ca"&gt;3. Bake at 175°C for 10–15 min.&lt;/div&gt;'}
];
var cur=0,max=rounds.length,scores=rounds.map(function(r){return r.score;});
var bars=document.getElementById('d52s-bars');
for(var i=0;i&lt;max;i++){var b=document.createElement('div');b.className='d52s-bar';b.id='d52b'+i;b.style.height=Math.round((scores[i]/100)*60)+'px';bars.appendChild(b);}
function upBars(n){for(var i=0;i&lt;max;i++){var b=document.getElementById('d52b'+i);if(!b)continue;b.classList.remove('act','pst');if(i===n-1)b.classList.add('act');else if(i&lt;n-1)b.classList.add('pst');}}
function scoreColor(s){return s&gt;=90?'#2d6a4f':s&gt;=75?'#d4700a':s&gt;=55?'#c05a00':'#9b2335';}
window.d52sNext=function(){
  if(cur&gt;=max)return;
  var r=rounds[cur];cur++;
  document.getElementById('d52s-istrip').style.opacity='1';
  document.getElementById('d52s-fwd').textContent=r.fwd;
  document.getElementById('d52s-bwd').textContent=r.bwd;
  document.getElementById('d52s-ind').style.opacity='1';
  var doc=document.getElementById('d52s-cur');
  doc.style.animation='none';void doc.offsetWidth;doc.style.animation='d52fadeUp .3s ease';
  doc.innerHTML=r.doc;
  var c=scoreColor(r.score);
  document.getElementById('d52s-big').style.color=c;
  document.getElementById('d52s-big').textContent=r.score;
  document.getElementById('d52s-slbl').textContent='Round '+cur+' score: '+r.score;
  document.getElementById('d52s-slbl').style.color=c;
  document.getElementById('d52s-rlbl').textContent='Round '+cur+' of '+max;
  upBars(cur);
  if(cur&gt;=max)document.getElementById('d52s-next').disabled=true;
};
window.d52sReset=function(){
  cur=0;
  document.getElementById('d52s-istrip').style.opacity='.4';
  document.getElementById('d52s-fwd').textContent='—';
  document.getElementById('d52s-bwd').textContent='—';
  document.getElementById('d52s-ind').style.opacity='0';
  document.getElementById('d52s-cur').innerHTML='&lt;div class="ttl"&gt;Chocolate Chip Cookies&lt;/div&gt;&lt;div class="sh"&gt;Ingredients&lt;/div&gt;&lt;div class="d52s-il"&gt;&lt;span class="d52s-qty"&gt;2 cups&lt;/span&gt;&lt;span&gt;all-purpose flour&lt;/span&gt;&lt;/div&gt;&lt;div class="d52s-il"&gt;&lt;span class="d52s-qty"&gt;1 cup&lt;/span&gt;&lt;span&gt;granulated sugar&lt;/span&gt;&lt;/div&gt;&lt;div class="d52s-il"&gt;&lt;span class="d52s-qty"&gt;½ tsp&lt;/span&gt;&lt;span&gt;salt&lt;/span&gt;&lt;/div&gt;&lt;div class="d52s-il"&gt;&lt;span class="d52s-qty"&gt;2 sticks&lt;/span&gt;&lt;span&gt;unsalted butter&lt;/span&gt;&lt;/div&gt;&lt;div class="sh"&gt;Steps&lt;/div&gt;&lt;div class="d52s-sl"&gt;1. Cream butter and sugar until fluffy.&lt;/div&gt;&lt;div class="d52s-sl"&gt;2. Sift in flour and salt, fold gently.&lt;/div&gt;&lt;div class="d52s-sl"&gt;3. Bake at 350°F for 12 minutes.&lt;/div&gt;';
  document.getElementById('d52s-big').textContent='—';
  document.getElementById('d52s-big').style.color='var(--d52s-ink)';
  document.getElementById('d52s-slbl').textContent='';
  document.getElementById('d52s-rlbl').textContent='Round 0 of 8';
  document.getElementById('d52s-next').disabled=false;
  upBars(0);
};
})();
&lt;/script&gt;
&lt;/div&gt;

&lt;hr&gt;
&lt;h2 id="delegate-52"&gt;DELEGATE-52&lt;/h2&gt;
&lt;p&gt;The benchmark contains 310 work environments across 52 domains. Each environment includes real seed documents, distractor files, and 5-10 reversible edit tasks that resemble the kinds of tasks a worker might delegate to an LLM.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Grid of 52 domain icons organised into five colour-coded categories: Code and Configuration (11 domains including Python, Docker, JSON), Science and Engineering (11 domains including Crystal, Molecule, Quantum), Creative and Media (11 domains including Music Sheet, Screenplay, LaTeX), Structured Records (11 domains including Accounting, Genealogy, Spreadsheet), and Everyday (8 domains including Recipe, Chess, Transit)." src="../../_media/llms-corrupt-figure-3-categories.png"&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Figure 3 from &lt;a href='#labanLLMsCorruptYour2026' id='ref-labanLLMsCorruptYour2026-4'&gt;Laban et al. (2026)&lt;/a&gt; - the 52 domains across five categories: Code &amp;amp; Configuration, Science &amp;amp; Engineering, Creative &amp;amp; Media, Structured Records, and Everyday&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Figure 4 shows an example work environment from the accounting domain.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Work environment diagram for the accounting domain, showing the Hack Club ledger as the seed document with distractor files including a chart of accounts and expense reimbursement policy. Ten edit tasks branch out, including category split, person split, CSV conversion, euro conversion, and fund accounting, each with a forward and backward instruction." src="../../_media/llms-corrupt-figure-4-account-example.png"&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Figure 4 from &lt;a href='#labanLLMsCorruptYour2026' id='ref-labanLLMsCorruptYour2026-5'&gt;Laban et al. (2026)&lt;/a&gt; - a work environment from the accounting domain, using a Hack Club ledger as the seed document, with forward/backward edit pairs like splitting by expense category and merging back&lt;/em&gt;&lt;/p&gt;
&lt;h2 id="results"&gt;Results&lt;/h2&gt;
&lt;p&gt;They tested 19 models across the benchmark. All 19 models degraded documents over the course of the simulation. The top performers, such as Gemini 3.1 Pro, Claude 4.6 Opus, and GPT 5.4, still corrupted an average of about 25% of the document content after 20 interactions. Across all tested models, average degradation was about 50%, with weaker models failing more severely.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Heatmap table of round-trip relay scores for 19 LLMs at workflow lengths 2 through 20. All models show declining scores from left to right, colour-coded from green (high preservation) through yellow to red (severe degradation). Gemini 3.1 Pro scores highest at 80.9 after 20 interactions; GPT 5 Nano scores lowest at 10.0." src="../../_media/llms-corrupt-table-1.png"&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Table 1 from &lt;a href='#labanLLMsCorruptYour2026' id='ref-labanLLMsCorruptYour2026-6'&gt;Laban et al. (2026)&lt;/a&gt; - round-trip relay results for 19 LLMs across 20 interactions, colour-coded by degradation severity. Every model declines over time; frontier models delay but do not avoid degradation.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Short-term performance did not reliably predict long-horizon performance. Some models that looked similar after two interactions diverged sharply after twenty, while others that started behind later caught up. This is one of the reasons the paper argues for long-horizon evaluation rather than only testing one-shot or short workflows.&lt;/p&gt;
&lt;p&gt;The kind of degradation also changes with model strength. Weaker models tend to lose content through deletion, while frontier models are more likely to preserve content but corrupt it.&lt;/p&gt;
&lt;h2 id="takeaways"&gt;Takeaways&lt;/h2&gt;
&lt;p&gt;One takeaway is that we need to be careful not to extrapolate model capabilities from one area to all domains. Models follow a &lt;a href="jagged-frontier-of-llm-capability.html"&gt;Jagged Frontier of LLM Capability&lt;/a&gt;, where they can excel in some tasks while making serious errors in others. For example, they perform well on Python and poorly on some structured-but-unfamiliar document formats, such as textual 3D object files.&lt;/p&gt;
&lt;p&gt;It also raises interesting questions about whether we need to decouple the reasoning engine from the state management system. LLMs may be useful as the reasoning layer, but long-running document workflows probably need external state, parsers, validators, diffs, tests, and reversible operations to prevent silent corruption.&lt;/p&gt;&lt;section id="bib"&gt;&lt;h4&gt;References&lt;/h4&gt;&lt;p id='labanLLMsCorruptYour2026'&gt;Philippe Laban, Tobias Schnabel, and Jennifer Neville.
&lt;span class="bibtex-protected"&gt;&lt;span class="bibtex-protected"&gt;LLMs Corrupt Your Documents When You Delegate&lt;/span&gt;&lt;/span&gt;.
April 2026.
&lt;a href="https://arxiv.org/abs/2604.15597"&gt;arXiv:2604.15597&lt;/a&gt;, &lt;a href="https://doi.org/10.48550/arXiv.2604.15597"&gt;doi:10.48550/arXiv.2604.15597&lt;/a&gt;. &lt;a class="cite-backref" href="#ref-labanLLMsCorruptYour2026-1" title="Jump back to reference 1"&gt;↩&lt;/a&gt;&lt;a class="cite-backref" href="#ref-labanLLMsCorruptYour2026-1" title="Jump back to reference 1"&gt; &lt;sup&gt;1&lt;/sup&gt; &lt;/a&gt;&lt;a class="cite-backref" href="#ref-labanLLMsCorruptYour2026-2" title="Jump back to reference 2"&gt;&lt;sup&gt;2&lt;/sup&gt; &lt;/a&gt;&lt;a class="cite-backref" href="#ref-labanLLMsCorruptYour2026-3" title="Jump back to reference 3"&gt;&lt;sup&gt;3&lt;/sup&gt; &lt;/a&gt;&lt;a class="cite-backref" href="#ref-labanLLMsCorruptYour2026-4" title="Jump back to reference 4"&gt;&lt;sup&gt;4&lt;/sup&gt; &lt;/a&gt;&lt;a class="cite-backref" href="#ref-labanLLMsCorruptYour2026-5" title="Jump back to reference 5"&gt;&lt;sup&gt;5&lt;/sup&gt; &lt;/a&gt;&lt;a class="cite-backref" href="#ref-labanLLMsCorruptYour2026-6" title="Jump back to reference 6"&gt;&lt;sup&gt;6&lt;/sup&gt; &lt;/a&gt;&lt;/p&gt;
&lt;/section&gt;</content><category term="reference"/><category term="AgenticReasoning"/><category term="LimitationsofLLMs"/></entry><entry><title>AI-Induced Cognitive Atrophy</title><link href="http://localhost:8000/ai-induced-cognitive-atrophy.html" rel="alternate"/><published>2026-05-07T06:33:00+10:00</published><updated>2026-05-07T09:14:00+10:00</updated><author><name>Lex Toumbourou</name></author><id>tag:localhost,2026-05-07:/ai-induced-cognitive-atrophy.html</id><summary type="html">&lt;p&gt;We probably need to do deliberate daily mental exercise&lt;/p&gt;</summary><content type="html">&lt;p&gt;Something I’m increasingly worried about is that the more mental labour we offload to AI, the more our own cognitive capacity starts to dwindle.&lt;/p&gt;
&lt;p&gt;In a popular paper from 2025 (&lt;a href="ai-meets-the-classroom-when-does-chatgpt-harm-learning.html"&gt;AI Meets the Classroom: When Does ChatGPT Harm Learning?&lt;/a&gt;), they found that students in a programming course who used LLMs to generate answers to questions (substitution) saw a significant decrease in topic understanding, even though they perceived an increase &lt;a href='#lehmannAIMeetsClassroom2025' id='ref-lehmannAIMeetsClassroom2025-1'&gt;Lehmann et al. (2025)&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Learning is effortful: you need to exert mental energy to learn. However, AI can give you the illusion of learning without any mental exertion at all.&lt;/p&gt;
&lt;p&gt;The study also found that students who used AI to complement learning activities, like asking for explanations rather than answers, actually saw an increase in understanding. But when given a free choice, most students defaulted to substitution and found that nearly half of all solution requests came without the student making a single attempt first. Our brains tend to prefer to conserve energy. They also found that students with weaker foundations learned less with AI access, while stronger students benefited more.&lt;/p&gt;
&lt;p&gt;For a software developer, it’s impossible to ignore the upside from modern agentic coding workflows; they are clearly here to stay. But, at the same time, for complicated projects beyond what can be vibe-coded, a pre-developed intuition for software is necessary to guide those agents safely.&lt;/p&gt;
&lt;p&gt;So the natural question arises for a software developer, and a knowledge worker in general: how do we find the balance between making the most of AI while avoiding letting our skills, intuition and understanding decay?&lt;/p&gt;
&lt;p&gt;Just as many people leading sedentary lifestyles have to make a deliberate effort to exercise, because inactivity is really bad for our bodies, I think we’re going to realise that a similar process is necessary for our minds.&lt;/p&gt;
&lt;p&gt;My hypothesis is that you need to deliberately spend time every day exercising your skills, operating near your cognitive limits - performing deep &lt;a href="system-2-thinking.html"&gt;System 2 Thinking&lt;/a&gt; - if you want to avoid the kind of atrophy that will make you worse at wielding AI agents. The idea of &lt;a href="progressive-overload.html"&gt;Progressive Overload&lt;/a&gt; in strength training is to gradually increase resistance via heavier weights, building overall capacity. The same paradigm applies to cognitive capacity.&lt;/p&gt;
&lt;p&gt;One thing I've been experimenting with is making sure I allocate at least 30 minutes a day on something mentally difficult, like writing code by hand for an unfamiliar problem or reading difficult papers. Writing these notes is another task that feels like a form of this exercise.&lt;/p&gt;&lt;section id="bib"&gt;&lt;h4&gt;References&lt;/h4&gt;&lt;p id='lehmannAIMeetsClassroom2025'&gt;Matthias Lehmann, Philipp&amp;nbsp;B. Cornelius, and Fabian&amp;nbsp;J. Sting.
&lt;span class="bibtex-protected"&gt;&lt;span class="bibtex-protected"&gt;AI Meets&lt;/span&gt;&lt;/span&gt; the &lt;span class="bibtex-protected"&gt;&lt;span class="bibtex-protected"&gt;Classroom&lt;/span&gt;&lt;/span&gt;: &lt;span class="bibtex-protected"&gt;&lt;span class="bibtex-protected"&gt;When Do Large Language Models Harm Learning&lt;/span&gt;&lt;/span&gt;?
March 2025.
&lt;a href="https://arxiv.org/abs/2409.09047"&gt;arXiv:2409.09047&lt;/a&gt;, &lt;a href="https://doi.org/10.48550/arXiv.2409.09047"&gt;doi:10.48550/arXiv.2409.09047&lt;/a&gt;. &lt;a class="cite-backref" href="#ref-lehmannAIMeetsClassroom2025-1" title="Jump back to reference 1"&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/section&gt;</content><category term="permanent"/><category term="LearningWithAI"/><category term="LearningAndTeaching"/></entry><entry><title>OpenGame: Open Agentic Coding for Games</title><link href="http://localhost:8000/opengame-open-agentic-coding-for-games.html" rel="alternate"/><published>2026-04-29T00:00:00+10:00</published><updated>2026-04-29T00:00:00+10:00</updated><author><name>Lex Toumbourou</name></author><id>tag:localhost,2026-04-29:/opengame-open-agentic-coding-for-games.html</id><summary type="html">&lt;p&gt;An agentic framework for end-to-end game creation&lt;/p&gt;</summary><content type="html">&lt;p&gt;Paper describes &lt;strong&gt;OpenGame&lt;/strong&gt;, an agentic framework designed for end-to-end web game creation. &lt;a href='#jiangOpenGameOpenAgentic2026' id='ref-jiangOpenGameOpenAgentic2026-1'&gt;Jiang et al. (2026)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The authors argues that to build products as complex as games, the field needs to move beyond &lt;em&gt;generalist code agents&lt;/em&gt; to &lt;em&gt;specialist frameworks&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;They throw the kitchen sink at the problem of game design: a base model, a code agent, a new collection of &lt;a href="agent-skills.html"&gt;Agent Skills&lt;/a&gt; for game development, and a new benchmark and evaluation framework.&lt;/p&gt;
&lt;p&gt;&lt;img alt="jiang-et-all-figure-2.png" src="../../_media/jiang-et-all-figure-2.png"&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Figure 2. from &lt;a href='#jiangOpenGameOpenAgentic2026' id='ref-jiangOpenGameOpenAgentic2026-2'&gt;Jiang et al. (2026)&lt;/a&gt; - showcasing the entire end-to-end OpenGame system.&lt;/em&gt;&lt;/p&gt;
&lt;h3 id="base-model"&gt;Base Model&lt;/h3&gt;
&lt;p&gt;The authors contribute a new foundation model based on a &lt;a href="qwen35-27b.html"&gt;Qwen3.5-27B&lt;/a&gt; backbone, called &lt;strong&gt;GameCoder-27B&lt;/strong&gt;, via a three-stage pipeline:&lt;/p&gt;
&lt;p&gt;&lt;a href="continual-pre-training-cpt.html"&gt;Continual Pre-Training (CPT)&lt;/a&gt; on a corpus of open-source Phaser and JavaScript/TypeScript game repositories from GitHub, with docs and tutorials, to build strong priors over game loops, physics systems, asset usage, and state management.&lt;/p&gt;
&lt;p&gt;&lt;a href="fine-tuning.html"&gt;Supervised Fine-Tuning&lt;/a&gt; on game generation prompts using &lt;code&gt;gpt-codex5.1&lt;/code&gt;, with solutions from &lt;code&gt;minimax2.5&lt;/code&gt;. For example: &lt;em&gt;"Implement a 2D platformer character controller with double-jump and sprite animations."&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="reinforcement-learning.html"&gt;Reinforcement Learning (RL)&lt;/a&gt; at the component level: execution grounded, rewarding unit test pass rate and execution success on single-file gameplay logic and targeted functional modules (e.g., collision detection, state-machine transitions). Getting the model strong at the component level works because a downstream agent assembles those building blocks into a full multi-file project.&lt;/p&gt;
&lt;h3 id="code-agent-design"&gt;Code Agent Design&lt;/h3&gt;
&lt;p&gt;To produce a complete game, the authors argue you need Structured &lt;a href="long-horizon-workflow.html"&gt;Long-Horizon Workflow&lt;/a&gt; systems.&lt;/p&gt;
&lt;p&gt;OpenGame orchestrates the agent through six operational phases, using a persistent &lt;code&gt;todo_write&lt;/code&gt; tool that lets the agent plan, execute, and transition across phases in a controlled manner.&lt;/p&gt;
&lt;h4 id="1-classification"&gt;1. Classification&lt;/h4&gt;
&lt;p&gt;The agent invokes &lt;code&gt;classify-game-type&lt;/code&gt;, which applies a Physics-First Classification rule. Rather than relying on ambiguous genre labels, it categorises the task by physical constraints and spatial mechanics (e.g. "falling without ground support" == platformer archetype, "snapping to a grid" == &lt;code&gt;grid_logic&lt;/code&gt;). This sets the macro-level execution plan.&lt;/p&gt;
&lt;h4 id="2-scaffolding"&gt;2. Scaffolding&lt;/h4&gt;
&lt;p&gt;Once the game archetype is known, the agent runs &lt;code&gt;run_shell_command&lt;/code&gt; to copy the shared scaffolding codebase and relevant architectural documentation into the workspace, giing the model a baseline to operate from.&lt;/p&gt;
&lt;h4 id="3-gdd-generation"&gt;3. GDD Generation&lt;/h4&gt;
&lt;p&gt;The agent invokes &lt;code&gt;generate-gdd&lt;/code&gt; to produce a technical Game Design Document. This tool dynamically loads archetype-specific API constraints from the scaffolded documentation, ensuring the proposed mechanics are feasible under the selected framework. The agent extracts the implementation roadmap from the GDD and uses &lt;code&gt;todo_write&lt;/code&gt; to refine its high-level plan into granular, file-specific actions.&lt;/p&gt;
&lt;h4 id="4-multimodal-asset-synthesis"&gt;4. Multimodal Asset Synthesis&lt;/h4&gt;
&lt;p&gt;The agent reads &lt;code&gt;asset_protocol.md&lt;/code&gt; to ensure parameter compliance, then invokes &lt;code&gt;generate-game-assets&lt;/code&gt;, leveraging multimodal generation models to synthesise backgrounds, character animations, static items, and audio assets from the GDD's asset registry. For tile-based games, &lt;code&gt;generate-tilemap&lt;/code&gt; converts ASCII layouts into structured JSON tilemaps. The agent then reads the produced &lt;code&gt;assetpack.json&lt;/code&gt; to record exact texture and asset keys needed during implementation, substantially reducing downstream asset-reference hallucinations.&lt;/p&gt;
&lt;h4 id="5-context-aware-code-implementation"&gt;5. Context-Aware Code Implementation&lt;/h4&gt;
&lt;p&gt;Before writing gameplay logic, the agent merges GDD parameters into &lt;code&gt;gameConfig.json&lt;/code&gt;, enforcing a data-driven interface between design and code.&lt;/p&gt;
&lt;p&gt;To mitigate context overflow during implementation, they introduce a &lt;strong&gt;Three-Layer Reading Strategy&lt;/strong&gt;: using &lt;code&gt;read_file&lt;/code&gt;, the agent progressively loads (1) an API summary for the template system, (2) the target source file (&lt;code&gt;_Template*.ts&lt;/code&gt;) to be modified, and (3) the implementation guide, loaded last to maximise immediate salience.&lt;/p&gt;
&lt;p&gt;Code generation follows a &lt;strong&gt;Template Method Pattern&lt;/strong&gt;: rather than writing the project from scratch, the agent copies template files and overrides designated hook methods (e.g., &lt;code&gt;setupCustomCollisions&lt;/code&gt;) to inject game-specific logic while preserving the deterministic lifecycle management of base classes.&lt;/p&gt;
&lt;h4 id="6-verification-and-self-correction"&gt;6. Verification and Self-Correction&lt;/h4&gt;
&lt;p&gt;The agent reads &lt;code&gt;debug_protocol.md&lt;/code&gt; to perform a static self-review over common generative failure modes, then uses &lt;code&gt;run_shell_command&lt;/code&gt; to execute &lt;code&gt;npm run build&lt;/code&gt; and &lt;code&gt;npm run test&lt;/code&gt; under headless browser evaluation.&lt;/p&gt;
&lt;p&gt;When build or test failures occur, the agent parses compiler output, localises the faulty script, and iteratively repairs the project until a playable game is obtained. This phase provides the operational substrate for the Debug Skill described below.&lt;/p&gt;
&lt;h3 id="agent-evolution-with-game-skills"&gt;Agent Evolution with Game Skills&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Game Skill&lt;/strong&gt; is a "reusable, evolving capability" composed of two components: Template Skill and Debug Skill. Together, they let the agent scaffold stable architectures and systematically repair integration errors, rather than patching isolated bugs.&lt;/p&gt;
&lt;h4 id="template-skill"&gt;Template Skill&lt;/h4&gt;
&lt;p&gt;Grows an evolving library of specialised project skeletons &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;L&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;L&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.68333em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;L&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;, starting from a game-agnostic meta template &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;msub&gt;&lt;mi&gt;M&lt;/mi&gt;&lt;mn&gt;0&lt;/mn&gt;&lt;/msub&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;M_0&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.83333em;vertical-align:-0.15em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault" style="margin-right:0.10903em;"&gt;M&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.30110799999999993em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:-0.10903em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;0&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; and expanding into specialised template families like gravity-based side-view and top-down continuous motion.&lt;/p&gt;
&lt;p&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;msub&gt;&lt;mi&gt;M&lt;/mi&gt;&lt;mn&gt;0&lt;/mn&gt;&lt;/msub&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;M_0&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.83333em;vertical-align:-0.15em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault" style="margin-right:0.10903em;"&gt;M&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.30110799999999993em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:-0.10903em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;0&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; intentionally assumes no genre, physics regime, or gameplay mechanic, just the universal structure required for a playable game: project layout, initialisation, asset loading, scene loops, and configuration interfaces.&lt;/p&gt;
&lt;p&gt;As the agent completes games, reusable fragments are extracted and merged back into &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;L&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;L&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.68333em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;L&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;. This sharply reduces the search space of generation and stabilises project-wide structure across diverse requests.&lt;/p&gt;
&lt;h4 id="debug-skill"&gt;Debug Skill&lt;/h4&gt;
&lt;p&gt;Maintains a living debugging protocol &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;P&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;P&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.68333em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.13889em;"&gt;P&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;, updated from observed build, test, and runtime outcomes. Each new failure pattern is appended as a verified &lt;code&gt;(error signature, root cause, verified fix)&lt;/code&gt; triple. This lets the agent accumulate verified fixes and systematically resolve high-frequency integration failures across games, rather than re-diagnosing the same classes of error from scratch.&lt;/p&gt;
&lt;h3 id="opengame-bench"&gt;OpenGame-Bench&lt;/h3&gt;
&lt;p&gt;A new evaluation pipeline for agentic game generation, scoring output across three metrics:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Build Health: whether the project compiles and runs without errors under headless browser execution.&lt;/li&gt;
&lt;li&gt;Visual Usability: whether the game is visually coherent and navigable, assessed via VLM judging.&lt;/li&gt;
&lt;li&gt;Intent Alignment: whether the generated game matches the original natural-language specification.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Evaluation uses a combination of headless browser execution and VLM judging across 150 game prompts.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;They identify three reasons why general-purpose LLMs struggle to produce complete, playable games:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Logical Incoherence&lt;/strong&gt;: the model loses track of global state across the game loop, causing freezes, failures to terminate, or mechanics that never materialise.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Engine-Specific Knowledge Gaps&lt;/strong&gt;: general models misuse or ignore engine abstractions, reimplementing mechanics from scratch instead of using framework-native physics, scene, and event systems.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cross-File Inconsistencies&lt;/strong&gt;: individual files look plausible, but the overall project breaks due to mismatched asset keys, flawed scene wiring, missing config fields, or broken init order.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The argument is that fixing this requires frameworks that understand the &lt;em&gt;intrinsic structure&lt;/em&gt; of games, not just better prompting of generalist agents.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;Reminds me of the &lt;a href="sheetcopilot-agent.html"&gt;SheetCopilot Agent&lt;/a&gt;, an agentic framework for spreadsheet controls, and systems like &lt;a href="alphaevolve-a-coding-agent-for-scientific-and-algorithmic-discovery.html"&gt;AlphaEvolve&lt;/a&gt;, a system for algorithmic discovery.&lt;/p&gt;&lt;section id="bib"&gt;&lt;h4&gt;References&lt;/h4&gt;&lt;p id='jiangOpenGameOpenAgentic2026'&gt;Yilei Jiang, Jinyuan Hu, Qianyin Xiao, Yaozhi Zheng, Ruize Ma, Kaituo Feng, Jiaming Han, Tianshuo Peng, Kaixuan Fan, Manyuan Zhang, and Xiangyu Yue.
&lt;span class="bibtex-protected"&gt;&lt;span class="bibtex-protected"&gt;OpenGame&lt;/span&gt;&lt;/span&gt;: &lt;span class="bibtex-protected"&gt;&lt;span class="bibtex-protected"&gt;Open Agentic Coding&lt;/span&gt;&lt;/span&gt; for &lt;span class="bibtex-protected"&gt;&lt;span class="bibtex-protected"&gt;Games&lt;/span&gt;&lt;/span&gt;.
April 2026.
&lt;a href="https://arxiv.org/abs/2604.18394"&gt;arXiv:2604.18394&lt;/a&gt;, &lt;a href="https://doi.org/10.48550/arXiv.2604.18394"&gt;doi:10.48550/arXiv.2604.18394&lt;/a&gt;. &lt;a class="cite-backref" href="#ref-jiangOpenGameOpenAgentic2026-1" title="Jump back to reference 1"&gt;↩&lt;/a&gt;&lt;a class="cite-backref" href="#ref-jiangOpenGameOpenAgentic2026-1" title="Jump back to reference 1"&gt; &lt;sup&gt;1&lt;/sup&gt; &lt;/a&gt;&lt;a class="cite-backref" href="#ref-jiangOpenGameOpenAgentic2026-2" title="Jump back to reference 2"&gt;&lt;sup&gt;2&lt;/sup&gt; &lt;/a&gt;&lt;/p&gt;
&lt;/section&gt;</content><category term="reference"/><category term="AgenticReasoning"/><category term="GameDevelopment"/></entry><entry><title>Naming Things Is Easy Now</title><link href="http://localhost:8000/naming-things-is-easy-now.html" rel="alternate"/><published>2026-04-25T10:58:00+10:00</published><updated>2026-04-25T13:19:00+10:00</updated><author><name>Lex Toumbourou</name></author><id>tag:localhost,2026-04-25:/naming-things-is-easy-now.html</id><summary type="html">&lt;p&gt;I guess there is only one hard thing left in Computer Science?&lt;/p&gt;</summary><content type="html">&lt;blockquote&gt;
&lt;p&gt;“There are only two hard things in Computer Science: cache invalidation and naming things.” - &lt;strong&gt;Phil Karlton&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I don't think naming things is hard anymore (cache invalidation is about the same).&lt;/p&gt;
&lt;p&gt;LLMs, with their default of sampling from the highest-probability tokens, make for painfully boring and mediocre writing, but for many naming tasks, that’s exactly what you want. For example: naming methods for a public API; choosing names for events, actions, states etc; or trying to name an as-yet unnamed but known concept.&lt;/p&gt;
&lt;p&gt;It also drastically reduces the time wasted bike-shedding or being stuck in analysis paralysis that often comes with naming tasks.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://simonwillison.net/2023/Aug/3/weird-world-of-llms/"&gt;Simon Willison said something similar&lt;/a&gt; in the context of API design:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;“A common criticism of these things is that they always come up with the most obvious answer… but when you’re designing an API, that’s exactly what you want.”&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I’m sure many others have said it too.&lt;/p&gt;
&lt;p&gt;My approach to naming things with LLMs is something like this:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Start by coming up with a few names for the thing on my own. I treat these names as a kind of hold-out set. This also helps me clarify exactly what I’m trying to name.&lt;/li&gt;
&lt;li&gt;Then I ask my LLM of choice to come up with a collection of 5-10 names, with ranking and justification, with enough context. That’s typically:&lt;ul&gt;
&lt;li&gt;A good description of what the thing is: what the class does, what the idea is, and so on.&lt;/li&gt;
&lt;li&gt;What the thing is not, especially if there are similarly named concepts that do not fit.&lt;/li&gt;
&lt;li&gt;The surrounding vocabulary of the codebase, API, paper, or note collection (which may come from the research step in &lt;a href="research-plan-implement-workflow.html"&gt;Research, Plan, Implement Workflow&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Review the candidate names generated by the model and compare them with my hold-out set.&lt;/li&gt;
&lt;li&gt;If one of the top candidate names is in the hold-out set, that’s a pretty damn good signal we have a winner. If the model’s candidates and mine are completely different, there’s a good chance I haven’t explained the concept well enough.&lt;/li&gt;
&lt;li&gt;If I don’t see a clear winner in the candidate set, I’ll do another round. This time, I’ll give it my hold-out set of names and ask it to critique my names against its candidates.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;In a short while, I usually find a name that feels obviously right. Sometimes I prefer one of my original names, but at least I have a good idea of why - and why it's better than the other options.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;Photo by &lt;a href="https://unsplash.com/@sigmund?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText"&gt;Compagnons&lt;/a&gt; on &lt;a href="https://unsplash.com/photos/green-sticky-notes-on-a-white-wall-1SljVTio_T4?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText"&gt;Unsplash&lt;/a&gt;&lt;/p&gt;</content><category term="permanent"/><category term="AgentNativeNotes"/><category term="KnowledgeManagement"/><category term="SoftwareEngineering"/></entry><entry><title>Obsidian Markdown Notebook: code execution with outputs stored in the file</title><link href="http://localhost:8000/obsidian-markdown-notebook-code-execution-with-outputs-stored-in-the-file.html" rel="alternate"/><published>2026-04-21T00:00:00+10:00</published><updated>2026-04-21T00:00:00+10:00</updated><author><name>Lex Toumbourou</name></author><id>tag:localhost,2026-04-21:/obsidian-markdown-notebook-code-execution-with-outputs-stored-in-the-file.html</id><summary type="html">&lt;p&gt;A Jupyter Notebook-style Obsidian plugin that runs code in your notes and stores the outputs directly in the Markdown file.&lt;/p&gt;</summary><content type="html">&lt;p&gt;I've built &lt;a href="https://github.com/lextoumbourou/obsidian-markdown-notebook"&gt;Obsidian Markdown Notebook&lt;/a&gt;, a plugin that lets you execute code in Obsidian with both code and output stored in the same file, kinda like a Markdown &lt;a href="https://jupyter.org/"&gt;Jupyter Notebook&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Right now, the supported languages are Python, JavaScript, Bash, and R. If you want support for more, let me know.&lt;/p&gt;
&lt;p&gt;Here's an example of plotting Fourier series components:&lt;/p&gt;
&lt;p&gt;&lt;a href="../_media/obsidian-markdown-notebook-cover-2.png"&gt;&lt;img alt="Image of the plugin in action, with code that generates Fourier series components" src="../_media/obsidian-markdown-notebook-cover-2.png"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;There are quite a few similar plugins already for executing code in Obsidian. However, none of them are designed from the start to store outputs directly in the Markdown file itself. It scratches an itch I've had for a while.&lt;/p&gt;
&lt;p&gt;By default, outputs are rendered as HTML. For example, a pandas DataFrame renders as a table:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="sb"&gt;```python&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;pandas&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;as&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;pd&lt;/span&gt;
&lt;span class="n"&gt;df&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pd&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;DataFrame&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;a&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;b&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;]})&lt;/span&gt;
&lt;span class="n"&gt;df&lt;/span&gt;
&lt;span class="sb"&gt;```&lt;/span&gt;
&amp;lt;!-- nb-output hash=&amp;quot;a1b2c3d4e5f6a7b8&amp;quot; format=&amp;quot;html&amp;quot; --&amp;gt;
&amp;lt;div class=&amp;quot;nb-output-html&amp;quot;&amp;gt;...&amp;lt;/div&amp;gt;
&amp;lt;!-- /nb-output --&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;&lt;a href="../_media/pandas-dataframe-example.png"&gt;&lt;img alt="Shows the plugin with a Pandas DataFrame" src="../_media/pandas-dataframe-example.png"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;You can also render as an image by adding &lt;code&gt;format=image&lt;/code&gt; to the code fence:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="sb"&gt;```python&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;{format=image}
&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;matplotlib.pyplot&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;as&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;plt&lt;/span&gt;
&lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;plot&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;show&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="sb"&gt;```&lt;/span&gt;
&amp;lt;!-- nb-output hash=&amp;quot;209f46a0d3ce8ca2&amp;quot; format=&amp;quot;image&amp;quot; --&amp;gt;
![](../_media/209f46a0d3ce8ca2.png)
&amp;lt;!-- /nb-output --&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;The image filename is a hash of the language and source code, so two notes with identical code fences will share the same cached image. You can also assign an &lt;code&gt;id&lt;/code&gt; to control the filename:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="sb"&gt;```python&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;{format=image id=numberplot}
&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;matplotlib.pyplot&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;as&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;plt&lt;/span&gt;
&lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;plot&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;show&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="sb"&gt;```&lt;/span&gt;
&amp;lt;!-- nb-output id=&amp;quot;numberplot&amp;quot; hash=&amp;quot;209f46a0d3ce8ca2&amp;quot; format=&amp;quot;image&amp;quot; --&amp;gt;
![](../_media/numberplot.png)
&amp;lt;!-- /nb-output --&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Output blocks use HTML comments, so they're invisible in PDF export and any standard Markdown renderer.&lt;/p&gt;
&lt;p&gt;Each output block stores a hash of the cell's source code. If the code hasn't changed, the cached output is shown without re-executing. Re-running a cell updates the output in place.&lt;/p&gt;
&lt;p&gt;You can also specify document-level defaults in the YAML frontmatter, or set project-level defaults in plugin settings.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nn"&gt;---&lt;/span&gt;
&lt;span class="nt"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;My document&lt;/span&gt;
&lt;span class="nt"&gt;notebook&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;format&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;image&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;markdownLinks&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;true&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="c1"&gt;# There&amp;#39;s other settings too - see the GitHub repo for the full list.&lt;/span&gt;
&lt;span class="nn"&gt;---&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h3 id="similar-plugins"&gt;Similar Plugins&lt;/h3&gt;
&lt;p&gt;There is a lot of prior art here, but again the major gap is that none of them focuses on storing the output artifact alongside the code.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/twibiral/obsidian-execute-code"&gt;Obsidian Execute Code Plugin&lt;/a&gt; is the closest relative. It does support persistent output since version 2.0.0. However, the output is plain text, and I want rich output (HTML tables, images) to be a first-class citizen from the start.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/mokeyish/obsidian-code-emitter"&gt;Obsidian Code Emitter&lt;/a&gt; is a great plugin that supports 15 different languages without requiring any system dependencies. However, the outputs do not survive vault reload and cannot be rendered to PDF.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/d-eniz/jupymd"&gt;JupyMD&lt;/a&gt; uses &lt;a href="https://github.com/mwouts/jupytext"&gt;Jupytext&lt;/a&gt; to pair a Markdown file with a Jupyter notebook, but the outputs are stored in the Jupyter file. I just want something totally native where everything lives in the Markdown file.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;And of course, &lt;a href="https://github.com/jupyter/notebook"&gt;Jupyter Notebook&lt;/a&gt; was the primary inspiration. There is also a &lt;a href="https://github.com/jupyter/enhancement-proposals/pull/103"&gt;Markdown-based notebooks proposal&lt;/a&gt; from 2023 that stalled without a consensus. I want it now, damn it!&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;See the &lt;a href="https://github.com/lextoumbourou/obsidian-markdown-notebook"&gt;project Github&lt;/a&gt; for more details.&lt;/p&gt;
&lt;p&gt;Also, side note: the project was developed using a &lt;a href="research-plan-implement-workflow.html"&gt;Research, Plan, Implement Workflow&lt;/a&gt;. You can see the Markdown files for each stage in the &lt;a href="https://github.com/lextoumbourou/obsidian-markdown-notebook/tree/main/.claude"&gt;&lt;code&gt;.claude&lt;/code&gt;&lt;/a&gt; directory.&lt;/p&gt;</content><category term="permanent"/><category term="ObsidianPlugins"/></entry><entry><title>Research, Plan, Implement Workflow</title><link href="http://localhost:8000/research-plan-implement-workflow.html" rel="alternate"/><published>2026-03-22T00:00:00+10:00</published><updated>2026-04-20T19:33:00+10:00</updated><author><name>Lex Toumbourou</name></author><id>tag:localhost,2026-03-22:/research-plan-implement-workflow.html</id><summary type="html">&lt;p&gt;An approach to agentic software development that I use&lt;/p&gt;</summary><content type="html">&lt;p&gt;For people who have been using Claude Code or a similar agentic coding tool for a while, a very obvious pattern emerges: start each session by asking the agent to research the code, work on a plan (or spec), then implement it.&lt;/p&gt;
&lt;p&gt;This is absolutely not an original idea. My colleagues have been using this approach, and there's some great writing on it, like &lt;a href="https://boristane.com/blog/how-i-use-claude-code"&gt;this blog post by Boris Tane&lt;/a&gt; (and I'm sure there are many others).&lt;/p&gt;
&lt;p&gt;The idea is that each development loop starts with &lt;strong&gt;Research&lt;/strong&gt;, then &lt;strong&gt;Planning&lt;/strong&gt;, then &lt;strong&gt;Implementation&lt;/strong&gt;. It's very similar to &lt;a href="spec-first-llm-development.html"&gt;Spec-First LLM Development&lt;/a&gt; - in fact, it's a concrete instantiation of it. Where spec-first is the abstract principle, this is the hands-on workflow.&lt;/p&gt;
&lt;h2 id="research"&gt;Research&lt;/h2&gt;
&lt;p&gt;In the research phase, you ask the model to read the relevant code. For my work codebase, that's usually an entire service directory or a path within it. For a smaller project, it might be the entire repository. The prompt might be like:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;"Read and understand the billing service in the &lt;code&gt;billing_service&lt;/code&gt; directory. Pay close attention to how we handle cancelling monthly subscriptions."&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;In Tane's workflow, findings always get written to a persistent &lt;code&gt;research.md&lt;/code&gt; file. I find that useful for complex problems, though for smaller tasks, a verbal summary in the chat can be enough. The important thing, either way, is that you read the output and verify your understanding before moving to planning.&lt;/p&gt;
&lt;h2 id="planning"&gt;Planning&lt;/h2&gt;
&lt;p&gt;Once you're satisfied with the research, ask for a detailed implementation plan. For example:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;"Come up with a plan for adding the ability to pause a monthly subscription. The user will be able to specify how many months to pause for. Include the approach, file paths, code snippets showing the key changes, and any trade-offs."&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Claude Code's &lt;strong&gt;Planning Mode&lt;/strong&gt; does a great job of this. Alternatively, storing it in a &lt;code&gt;plan.md&lt;/code&gt; file gives you full control; you can edit it in your editor, and it persists as a real artifact.&lt;/p&gt;
&lt;p&gt;One trick that works well: if you've seen a good implementation of something similar in another codebase, share that code as a reference alongside the plan request. The StrongDM &lt;a href="software-factory.html"&gt;Software Factory&lt;/a&gt; approach calls this &lt;a href="https://factory.strongdm.ai/techniques/gene-transfusion"&gt;Gene Transfusion&lt;/a&gt;. A bit dramatic for my tastes - but you get the idea.&lt;/p&gt;
&lt;p&gt;A useful technique is to get the LLM to interview you: ask it to clarify requirements before writing the plan. This forces both of you to agree on exactly what the solution needs to look like before any code is written. This is a feature built into Claude Code's Planning Mode, and it works great.&lt;/p&gt;
&lt;p&gt;Typically, you expect to iterate on the plan a few times to get it right. This is the time you really want to be paying attention with your neurons firing - getting the plan right can save you a lot of time downstream.&lt;/p&gt;
&lt;p&gt;The plan will usually also contain an implementation checklist to be followed during the build.&lt;/p&gt;
&lt;h2 id="implementation"&gt;Implementation&lt;/h2&gt;
&lt;p&gt;When the plan is right, issue the implementation command:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;"Implement based on the plan. Write the tests first."&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Sometimes, depending on the problem, I won't require Claude to write the tests first, but TDD is often a nice way to verify the plan.&lt;/p&gt;
&lt;p&gt;At the end of the implementation cycle, I'll review the changes, and typically expect some further iterations. I'm not afraid to edit the code myself - especially comments. Sometimes, I'll edit via pseudo code and ask it to go back and implement it, if I think the implementation is too far off.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;The pattern tends to come naturally after using agentic coding tools for a while, but it's helpful to give it a name.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;Photo by &lt;a href="https://unsplash.com/@vooglam_official?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText"&gt;Vooglam Eyewear&lt;/a&gt; on &lt;a href="https://unsplash.com/photos/desk-with-laptop-blueprints-and-tools-0dhIl78b__o?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText"&gt;Unsplash&lt;/a&gt;&lt;/p&gt;</content><category term="permanent"/><category term="SoftwareEngineering"/><category term="AgenticReasoning"/></entry><entry><title>Self-Generated Agent Context Files Don't Help Either</title><link href="http://localhost:8000/self-generated-agent-context-files-dont-help-either.html" rel="alternate"/><published>2026-02-26T00:00:00+10:00</published><updated>2026-02-26T00:00:00+10:00</updated><author><name>Lex Toumbourou</name></author><id>tag:localhost,2026-02-26:/self-generated-agent-context-files-dont-help-either.html</id><summary type="html">&lt;p&gt;Self-generated agent context files don't help.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Self-Generated &lt;a href="agent-context-files.html"&gt;Agent Context Files&lt;/a&gt; don't help either.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://arxiv.org/abs/2602.11988"&gt;This paper&lt;/a&gt;, released around the same time as &lt;a href="skillsbench.html"&gt;SkillsBench&lt;/a&gt;, evaluates whether repository context files (&lt;code&gt;AGENTS.md&lt;/code&gt;, &lt;code&gt;CLAUDE.md&lt;/code&gt;) actually improve coding-agent performance.&lt;/p&gt;
&lt;p&gt;The authors test issue-resolution tasks (bug fixes and feature work derived from real PRs) under three settings:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;no context file&lt;/li&gt;
&lt;li&gt;LLM-generated context file&lt;/li&gt;
&lt;li&gt;developer-written context file&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Similarly to SkillsBench's results, they conclude that LLM-generated context files generally reduce task success rates (about 3% on average) while increasing costs by 20%+. &lt;sup id="fnref:1"&gt;&lt;a class="footnote-ref" href="#fn:1"&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;p&gt;Developer-written context files perform better than LLM-generated ones and can provide a small lift (~4% on average), but they still increase token usage. &lt;sup id="fnref2:1"&gt;&lt;a class="footnote-ref" href="#fn:1"&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;p&gt;Seems that agents do follow context-file instructions, but it typically means they run more tests, traverse more files, and spend more reasoning tokens. The problem is that this is often just extra exploration overhead rather than a meaningful improvement. Also, if the repository already has good developer documentation, duplicating the information into agent content files adds little value - agents can already read the existing docs.&lt;/p&gt;
&lt;p&gt;So, putting the paper findings together, it seems the rules of thumb with context files and agents are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;don't mindlessly auto-generate AGENTS files&lt;/li&gt;
&lt;li&gt;focus effort on standard high-quality developer documentation first&lt;/li&gt;
&lt;li&gt;keep agent context files minimal and high-signal&lt;/li&gt;
&lt;li&gt;use a small number of targeted skills/context instructions where they clearly help&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Related articles:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="self-generated-skills-dont-help.html"&gt;Self-Generated Skills Don't Help&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="openclaw-the-missing-piece-for-obsidians-second-brain.html"&gt;OpenClaw: the missing piece for Obsidian's second brain&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="spec-first-llm-development.html"&gt;Spec-First LLM Development&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="footnote"&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id="fn:1"&gt;
&lt;p&gt;Gloaguen, T., Li, J., Schmid, L., Bichsel, B., and Vechev, M. (2026). &lt;em&gt;Evaluating AGENTS.md: Are Repository-Level Context Files Helpful for Coding Agents?&lt;/em&gt; arXiv. &lt;a href="https://arxiv.org/abs/2602.11988"&gt;https://arxiv.org/abs/2602.11988&lt;/a&gt;&amp;#160;&lt;a class="footnote-backref" href="#fnref:1" title="Jump back to footnote 1 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;a class="footnote-backref" href="#fnref2:1" title="Jump back to footnote 1 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</content><category term="reference"/><category term="AgenticReasoning"/><category term="SoftwareEngineering"/><category term="AIAgents"/></entry><entry><title>Self-Generated Skills Don't Help</title><link href="http://localhost:8000/self-generated-skills-dont-help.html" rel="alternate"/><published>2026-02-21T00:00:00+10:00</published><updated>2026-02-21T00:00:00+10:00</updated><author><name>Lex Toumbourou</name></author><id>tag:localhost,2026-02-21:/self-generated-skills-dont-help.html</id><summary type="html">&lt;p&gt;Curated skills boost agent performance by 16 points; self-generated ones don't help at all.&lt;/p&gt;</summary><content type="html">&lt;p&gt;&lt;a href="agent-skills.html"&gt;Agent Skills&lt;/a&gt; are structured packages of Markdown files and scripts that augment &lt;a href="ai-agents.html"&gt;AI Agents&lt;/a&gt;' capabilities. They usually look something like this:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;~/.claude/skills/some-skill/
├── SKILL.md
└── scripts/
    └── some_script.py
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;They were first introduced as a feature of the Claude ecosystem around October 2025 &lt;sup id="fnref:1"&gt;&lt;a class="footnote-ref" href="#fn:1"&gt;1&lt;/a&gt;&lt;/sup&gt;, and have recently exploded in popularity, thanks to &lt;a href="openclaw.html"&gt;OpenClaw&lt;/a&gt; and friends.&lt;/p&gt;
&lt;p&gt;Despite a lot of benchmarks existing to measure agentic AI capability, none so far have been created solely for the purpose of measuring the efficacy of skills, including how and when to use them, and what differentiates good skills from bad ones. That's where the paper &lt;a href="https://arxiv.org/abs/2602.12670"&gt;&lt;em&gt;SkillsBench: Benchmarking How Well Agent Skills Work Across Diverse Tasks&lt;/em&gt;&lt;/a&gt; by Li et al. (Feb 2026) comes in. &lt;sup id="fnref:2"&gt;&lt;a class="footnote-ref" href="#fn:2"&gt;2&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;p&gt;In the paper, they describe their &lt;a href="skillsbench.html"&gt;SkillsBench&lt;/a&gt; benchmark of 84 tasks across 11 domains. Each task in the benchmark is tested under 3 conditions:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;no skills&lt;/li&gt;
&lt;li&gt;curated skills&lt;/li&gt;
&lt;li&gt;self-generated skills - that is, skills entirely created from the LLM's own knowledge. &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The skills themselves were pulled from GitHub, community marketplaces, and corporate partners, with around 47k skills tested as part of the collection.&lt;/p&gt;
&lt;p&gt;They found that the self-generated skills offered no benefit (or worse) on average. However, curated skills raised the average pass rate by 16.2 percentage points, with effects varying across domains. Healthcare tasks got the biggest boost from skills, while software got the least, suggesting that the models already have a lot of useful knowledge about how to achieve software tasks, and less-understood domains get the biggest boost from skills.&lt;/p&gt;
&lt;p&gt;Also, 2-3 focused skills per task seems to be the sweet spot, with the authors seeing diminishing returns beyond that.&lt;/p&gt;
&lt;p&gt;They test several LLMs with their respective agent harnesses and find that Gemini performs best overall. However, skills had the greatest impact on the Claude Code's capability, which I guess makes sense since Anthropic created skills in the first place and probably has the greatest lead with their models fine-tuning to use skills. Codex CLI showed competitive raw performance, but it frequently neglects the provided skills. Agents acknowledge the skill content but often implement solutions independently. I suspect Codex will improve at skill utilisation in future versions as OpenAI refines its implementation.&lt;/p&gt;
&lt;p&gt;&lt;img alt="skillsbench-fig-1.png" src="../../_media/skillsbench-fig-1.png"&gt;&lt;/p&gt;
&lt;p&gt;The paper provides a concrete definition of a skill, contrasting it with other agentic paradigms like &lt;a href="few-shot-examples.html"&gt;Few-Shot Examples&lt;/a&gt;, &lt;a href="retrieval-augmented-generation.html"&gt;Retrieval Augmented Generation&lt;/a&gt; and &lt;a href="tool-documentation.html"&gt;Tool Documentation&lt;/a&gt;.
According to the paper, a Skill is an artifact that satisfies four criteria:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Procedural&lt;/strong&gt;: It teaches &lt;em&gt;how&lt;/em&gt; to do something (workflows, step-by-step procedures) rather than just stating facts&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;General&lt;/strong&gt;: It applies to a category of problems, not just one specific instance&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Structured&lt;/strong&gt;: It includes a &lt;code&gt;SKILL.md&lt;/code&gt; file and can bundle supporting resources like scripts, templates, or examples&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Portable&lt;/strong&gt;: It lives entirely in the filesystem, making it easy to edit, version control, share, and use across different agent harnesses&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The paper draws a nice analogy to computing paradigms: foundation models provide base capabilities (like CPUs), agent harnesses orchestrate context and tools (like operating systems), and skills extend competence to specialised domains (like applications).&lt;/p&gt;
&lt;p&gt;In my own work, I've been finding a lot of success recently by adding skills to our project. They tend to be really useful for guiding the LLM on how to run the test suite and evals effectively, how to check for common issues across the codebase, and even for parsing logs and debugging common customer issues. Any time I find myself repeatedly performing a cumbersome sequence of steps, turning it into a Skill pays dividends pretty quickly. They're just docs and convenience scripts at the end of the day. Not exactly a brand new paradigm for software engineers.&lt;/p&gt;
&lt;p&gt;Related articles:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;My current OpenClaw setup: &lt;a href="openclaw-the-missing-piece-for-obsidians-second-brain.html"&gt;OpenClaw: the missing piece for Obsidian's second brain&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Another article on AI-Assisted Development best practices: &lt;a href="spec-first-llm-development.html"&gt;Spec-First LLM Development&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="footnote"&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id="fn:1"&gt;
&lt;p&gt;Introducing Agent Skills. (n.d.). Claude. Retrieved February 23, 2026, from https://claude.com/blog/skills&amp;#160;&lt;a class="footnote-backref" href="#fnref:1" title="Jump back to footnote 1 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:2"&gt;
&lt;p&gt;Li, X., Chen, W., Liu, Y., Zheng, S., Chen, X., He, Y., Li, Y., You, B., Shen, H., Sun, J., Wang, S., Zeng, Q., Wang, D., Zhao, X., Wang, Y., Chaim, R. B., Di, Z., Gao, Y., He, J., … Lee, H. (2026). &lt;em&gt;SkillsBench: Benchmarking How Well Agent Skills Work Across Diverse Tasks&lt;/em&gt; (Version 1). arXiv. https://doi.org/10.48550/ARXIV.2602.12670&amp;#160;&lt;a class="footnote-backref" href="#fnref:2" title="Jump back to footnote 2 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</content><category term="reference"/><category term="AgenticReasoning"/><category term="SoftwareEngineering"/></entry><entry><title>Generative Modelling via Drifting</title><link href="http://localhost:8000/generative-modelling-via-drifting.html" rel="alternate"/><published>2026-02-11T00:00:00+10:00</published><updated>2026-02-15T00:00:00+10:00</updated><author><name>Lex Toumbourou</name></author><id>tag:localhost,2026-02-11:/generative-modelling-via-drifting.html</id><summary type="html">&lt;p&gt;A new paradigm for single-step generative modelling&lt;/p&gt;</summary><content type="html">&lt;p&gt;This paper introduces a new paradigm for single-step generative modelling called &lt;a href="drifting-models.html"&gt;Drifting Models&lt;/a&gt; &lt;sup id="fnref:1"&gt;&lt;a class="footnote-ref" href="#fn:1"&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;p&gt;Where Diffusion/Flow Matching performs iterative denoising at inference time, Drifting Models shift the iterative process into training.&lt;/p&gt;
&lt;p&gt;&lt;img alt="drifting-models-figure-4.png" src="../../_media/drifting-models-figure-4.png"&gt;&lt;/p&gt;
&lt;p&gt;The core of the algorithm is the computation of a "drift field", which is a vector for each generated sample that points toward the direction of the real distribution. The goal is to calculate a drift field where when model's output distribution matches the real distribution, the drift is zero.&lt;/p&gt;
&lt;p&gt;The drift field is calculated using positive and negative samples. Positive samples are real examples from the same class in the training data. Negative samples are other model outputs in the batch (though other negatives, such as real examples from other classes, are also tested). We want the drift field to attract toward positives, repel from negatives, but at equilibrium, attraction and repulsion balance out: &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi mathvariant="bold"&gt;V&lt;/mi&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;msup&gt;&lt;mi mathvariant="bold"&gt;V&lt;/mi&gt;&lt;mo&gt;+&lt;/mo&gt;&lt;/msup&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;msup&gt;&lt;mi mathvariant="bold"&gt;V&lt;/mi&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;/msup&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mn&gt;0&lt;/mn&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;\mathbf{V} = \mathbf{V}^+ - \mathbf{V}^- = 0&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.68611em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathbf" style="margin-right:0.01597em;"&gt;V&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.854661em;vertical-align:-0.08333em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;&lt;span class="mord mathbf" style="margin-right:0.01597em;"&gt;V&lt;/span&gt;&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.771331em;"&gt;&lt;span style="top:-3.063em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mbin mtight"&gt;+&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;−&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.771331em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;&lt;span class="mord mathbf" style="margin-right:0.01597em;"&gt;V&lt;/span&gt;&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.771331em;"&gt;&lt;span style="top:-3.063em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mbin mtight"&gt;−&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.64444em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;0&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="drifting-models-figure-2.png" src="../../_media/drifting-models-figure-2.png"&gt;&lt;/p&gt;
&lt;p&gt;Leaving aside computing the drifting field for a second, the loss computation is straightforward.&lt;/p&gt;
&lt;p&gt;We compute a drifting vector for each output sample and train the model so its output moves toward its drifted version, indirectly minimising the magnitude of the drift. We use stop-gradient to avoid back-propagating through the drift computation.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;noise&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;rand&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="n"&gt;N&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;C&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;

&lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;noise&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;y_neg&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;
&lt;span class="n"&gt;y_pos&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;training_data&lt;/span&gt;

&lt;span class="n"&gt;V&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;compute_V&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y_pos&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y_neg&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;x_drifted&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;stopgrad&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;V&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;loss&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;mse_loss&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;x_drifted&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;The drifting can occur in feature space (via an image encoder such as SimCLR or MoCo-v2) or even raw pixel space. Albeit the best results on ImageNet came from feature space.&lt;/p&gt;
&lt;h2 id="computing-the-drift-vector-v"&gt;Computing the Drift Vector - V&lt;/h2&gt;
&lt;p&gt;The computation for the Drift Vector - V can be broken down into a couple of steps&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;compute_V&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;samples&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y_pos&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y_neg&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="c1"&gt;# ...&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;V&lt;/span&gt;  &lt;span class="c1"&gt;# A batch of drift vectors, each in dimension to the input samples&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h3 id="1-compute-l2-distances"&gt;1. Compute L2 Distances&lt;/h3&gt;
&lt;p&gt;We first compute the distance between the model samples and the positive samples (a batch of training examples) and negative examples (the model samples themselves). The paper uses the L2 norm, which is available in scipy as cdist:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;scipy.spatial.distance&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;cdist&lt;/span&gt;

&lt;span class="c1"&gt;# compute_V&lt;/span&gt;

&lt;span class="n"&gt;dist_pos&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;cdist&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;samples&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y_pos&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;dist_neg&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;cdist&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;samples&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y_neg&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;So we have two matrices that represent the distance between each sample.&lt;/p&gt;
&lt;table style="border: 0"&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;dist_pos&lt;/strong&gt;&lt;br&gt;
Distance to positive samples
&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;dist_neg&lt;/strong&gt;&lt;br&gt;
Distance to negative samples
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;img src="../../_media/drifting-models-01_dist_pos.png"&gt;&lt;/td&gt;
&lt;td&gt;&lt;img src="../../_media/drifting-models-02a_dist_neg_raw.png"&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;

&lt;h3 id="2-mask-out-self"&gt;2. Mask out self&lt;/h3&gt;
&lt;p&gt;Since we're using the batch of model outputs as negatives, we want to ensure that the model ignores any self-distances. In practice, we set this to a very large distance, to ensure it's ignored the softmax (nearby generated samples contribute stronger repulsion, so we don't want a sample repelling itself).&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="c1"&gt;# Add a large value to the diagonal so self-distances are ignored in softmax&lt;/span&gt;
&lt;span class="n"&gt;dist_neg&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;eye&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;N&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mf"&gt;1e6&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;dist_neg_masked&lt;/strong&gt; - Self-distances are masked so samples don't repel themselves:&lt;/p&gt;
&lt;p&gt;&lt;img src="../../_media/drifting-models-02b_dist_neg_masked.png"&gt;&lt;/p&gt;
&lt;h3 id="3-compute-weights-via-softmax"&gt;3. Compute weights via Softmax&lt;/h3&gt;
&lt;p&gt;We now compute a Softmax operation that performs attention over these distances.&lt;/p&gt;
&lt;p&gt;First, we concatenate the distance matrices and convert to logits using temperature scaling:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;logit_pos&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;dist_pos&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;temperature&lt;/span&gt;
&lt;span class="n"&gt;logit_neg&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;dist_neg&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;temperature&lt;/span&gt;
&lt;span class="n"&gt;logit&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;concatenate&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="n"&gt;logit_pos&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;logit_neg&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;axis&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# [N, N_pos + N_neg]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;&lt;a href="temperature-scaling.html"&gt;Temperature Scaling&lt;/a&gt; controls how sharply the model focuses on nearby samples. Lower temperature = winner takes all.&lt;/p&gt;
&lt;p&gt;The paper uses &lt;strong&gt;bidirectional normalisation&lt;/strong&gt;: softmax over both rows (which y sample to attend to) and columns (which x sample attends). These are combined via geometric mean:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;A_row&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;softmax&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;logit&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;axis&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# normalize over y samples&lt;/span&gt;
&lt;span class="n"&gt;A_col&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;softmax&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;logit&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;axis&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# normalize over x samples&lt;/span&gt;
&lt;span class="n"&gt;A&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sqrt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;A_row&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;A_col&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;      &lt;span class="c1"&gt;# geometric mean&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;This bidirectional normalisation helps prevent any single sample from dominating the attention.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;A&lt;/strong&gt; - Combined attention matrix (positives on left, negatives on right):&lt;/p&gt;
&lt;p&gt;&lt;img src="../../_media/drifting-models-03_attention.png"&gt;&lt;/p&gt;
&lt;p&gt;Finally, we split back into positive and negative attention:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;A_pos&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;A&lt;/span&gt;&lt;span class="p"&gt;[:,&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;N_pos&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;  &lt;span class="c1"&gt;# [N, N_pos]&lt;/span&gt;
&lt;span class="n"&gt;A_neg&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;A&lt;/span&gt;&lt;span class="p"&gt;[:,&lt;/span&gt; &lt;span class="n"&gt;N_pos&lt;/span&gt;&lt;span class="p"&gt;:]&lt;/span&gt;  &lt;span class="c1"&gt;# [N, N_neg]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;A_pos&lt;/strong&gt; - Attention to positives&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;A_neg&lt;/strong&gt; - Attention to negatives (self masked)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;img src="../../_media/drifting-models-04a_A_pos.png"&gt;&lt;/td&gt;
&lt;td&gt;&lt;img src="../../_media/drifting-models-04b_A_neg.png"&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;

&lt;h3 id="4-cross-weighting"&gt;4. Cross-weighting&lt;/h3&gt;
&lt;p&gt;Finally, we scale the positive weights by the total repulsion strength, and the negative weights by the total attraction strength:&lt;/p&gt;
&lt;p&gt;We sum the negative weights and scale each positive weight:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="c1"&gt;# attraction scaled by repulsion strength&lt;/span&gt;
&lt;span class="n"&gt;W_pos&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;A_pos&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;A_neg&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;axis&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;keepdims&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;And sum the positive weights to scale each negative weight:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="c1"&gt;# repulsion scaled by attraction strength&lt;/span&gt;
&lt;span class="n"&gt;W_neg&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;A_neg&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;A_pos&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;axis&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;keepdims&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;This cross-weighting ensures that if you're strongly attracted to positives, you're also strongly repelled from negatives (and vice versa). It maintains the balance needed for the anti-symmetric property.&lt;/p&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;W_pos&lt;/strong&gt; - Cross-weighted positives&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;W_neg&lt;/strong&gt; - Cross-weighted negatives&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;img src="../../_media/drifting-models-05a_W_pos.png"&gt;&lt;/td&gt;
&lt;td&gt;&lt;img src="../../_media/drifting-models-05b_W_neg.png"&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;

&lt;h3 id="5-compute-drift-vectors"&gt;5. Compute Drift Vectors&lt;/h3&gt;
&lt;p&gt;These weights are used to compute weighted averages of the positive and negative samples:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;drift_pos&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;W_pos&lt;/span&gt; &lt;span class="o"&gt;@&lt;/span&gt; &lt;span class="n"&gt;y_pos&lt;/span&gt;  &lt;span class="c1"&gt;# [N, D] - weighted sum of positive samples&lt;/span&gt;
&lt;span class="n"&gt;drift_neg&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;W_neg&lt;/span&gt; &lt;span class="o"&gt;@&lt;/span&gt; &lt;span class="n"&gt;y_neg&lt;/span&gt;  &lt;span class="c1"&gt;# [N, D] - weighted sum of negative samples&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;The final drift vector is the difference - attraction toward positives minus repulsion from negatives:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;V&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;drift_pos&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;drift_neg&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;&lt;img src="../../_media/drifting-models-06_drift_vectors.png"&gt;&lt;/p&gt;
&lt;p&gt;When the generated distribution matches the data distribution, the attraction and repulsion cancel and &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi mathvariant="bold"&gt;V&lt;/mi&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mn&gt;0&lt;/mn&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;\mathbf{V} = 0&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.68611em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathbf" style="margin-right:0.01597em;"&gt;V&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.64444em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;0&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;. The paper shows this is a necessary condition for equilibrium (though the converse is not strictly proven).&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="the-anti-symmetric-property"&gt;The Anti-Symmetric Property&lt;/h2&gt;
&lt;p&gt;The theoretical foundation of the method rests on the anti-symmetry property that the drift field satisfies.&lt;/p&gt;
&lt;p&gt;&lt;span class="katex-display"&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;msub&gt;&lt;mi mathvariant="bold"&gt;V&lt;/mi&gt;&lt;mrow&gt;&lt;mi&gt;p&lt;/mi&gt;&lt;mo separator="true"&gt;,&lt;/mo&gt;&lt;mi&gt;q&lt;/mi&gt;&lt;/mrow&gt;&lt;/msub&gt;&lt;mo stretchy="false"&gt;(&lt;/mo&gt;&lt;mi mathvariant="bold"&gt;x&lt;/mi&gt;&lt;mo stretchy="false"&gt;)&lt;/mo&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;msub&gt;&lt;mi mathvariant="bold"&gt;V&lt;/mi&gt;&lt;mrow&gt;&lt;mi&gt;q&lt;/mi&gt;&lt;mo separator="true"&gt;,&lt;/mo&gt;&lt;mi&gt;p&lt;/mi&gt;&lt;/mrow&gt;&lt;/msub&gt;&lt;mo stretchy="false"&gt;(&lt;/mo&gt;&lt;mi mathvariant="bold"&gt;x&lt;/mi&gt;&lt;mo stretchy="false"&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;\mathbf{V}_{p,q}(\mathbf{x}) = -\mathbf{V}_{q,p}(\mathbf{x})&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1.036108em;vertical-align:-0.286108em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;&lt;span class="mord mathbf" style="margin-right:0.01597em;"&gt;V&lt;/span&gt;&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15139200000000003em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathdefault mtight"&gt;p&lt;/span&gt;&lt;span class="mpunct mtight"&gt;,&lt;/span&gt;&lt;span class="mord mathdefault mtight" style="margin-right:0.03588em;"&gt;q&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.286108em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathbf"&gt;x&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1.036108em;vertical-align:-0.286108em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;−&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;&lt;span class="mord mathbf" style="margin-right:0.01597em;"&gt;V&lt;/span&gt;&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15139200000000003em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathdefault mtight" style="margin-right:0.03588em;"&gt;q&lt;/span&gt;&lt;span class="mpunct mtight"&gt;,&lt;/span&gt;&lt;span class="mord mathdefault mtight"&gt;p&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.286108em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathbf"&gt;x&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Where:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;p&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;p&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.625em;vertical-align:-0.19444em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;p&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; is the target data distribution (positive samples) and&lt;/li&gt;
&lt;li&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;q&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;q&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.625em;vertical-align:-0.19444em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.03588em;"&gt;q&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; is the generated distribution (negative samples)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Swapping &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;p&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;p&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.625em;vertical-align:-0.19444em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;p&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; and &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;q&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;q&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.625em;vertical-align:-0.19444em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.03588em;"&gt;q&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; flips the sign of the drift, which means that when &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;q&lt;/mi&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mi&gt;p&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;q = p&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.625em;vertical-align:-0.19444em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.03588em;"&gt;q&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.625em;vertical-align:-0.19444em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;p&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; (the generated distribution matches the data distribution), we have &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;msub&gt;&lt;mi mathvariant="bold"&gt;V&lt;/mi&gt;&lt;mrow&gt;&lt;mi&gt;p&lt;/mi&gt;&lt;mo separator="true"&gt;,&lt;/mo&gt;&lt;mi&gt;p&lt;/mi&gt;&lt;/mrow&gt;&lt;/msub&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;msub&gt;&lt;mi mathvariant="bold"&gt;V&lt;/mi&gt;&lt;mrow&gt;&lt;mi&gt;p&lt;/mi&gt;&lt;mo separator="true"&gt;,&lt;/mo&gt;&lt;mi&gt;p&lt;/mi&gt;&lt;/mrow&gt;&lt;/msub&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;\mathbf{V}_{p,p} = -\mathbf{V}_{p,p}&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.972218em;vertical-align:-0.286108em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;&lt;span class="mord mathbf" style="margin-right:0.01597em;"&gt;V&lt;/span&gt;&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15139200000000003em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathdefault mtight"&gt;p&lt;/span&gt;&lt;span class="mpunct mtight"&gt;,&lt;/span&gt;&lt;span class="mord mathdefault mtight"&gt;p&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.286108em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.972218em;vertical-align:-0.286108em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;−&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;&lt;span class="mord mathbf" style="margin-right:0.01597em;"&gt;V&lt;/span&gt;&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15139200000000003em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathdefault mtight"&gt;p&lt;/span&gt;&lt;span class="mpunct mtight"&gt;,&lt;/span&gt;&lt;span class="mord mathdefault mtight"&gt;p&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.286108em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;, which means &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi mathvariant="bold"&gt;V&lt;/mi&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mn&gt;0&lt;/mn&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;\mathbf{V} = 0&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.68611em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathbf" style="margin-right:0.01597em;"&gt;V&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.64444em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;0&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;.&lt;/p&gt;
&lt;p&gt;With this equilibrium in place, the model naturally stops drifting once it matches the target distribution.&lt;/p&gt;
&lt;h2 id="multi-temperature"&gt;Multi-Temperature&lt;/h2&gt;
&lt;p&gt;A single temperature may not capture both local and global structure. The paper uses multiple temperatures summed together (Appendix A.6):&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;temperatures&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;0.02&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.05&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.2&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;V_total&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;compute_V&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y_pos&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y_neg&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;temperatures&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Lower temperatures (0.02) draw sharp attention to the nearest neighbours. Higher temperatures (0.2) spread attention more broadly. Combining them gives a richer gradient signal.&lt;/p&gt;
&lt;h2 id="classifier-free-guidance"&gt;Classifier-Free Guidance&lt;/h2&gt;
&lt;p&gt;Drifting models support CFG naturally. Given a class label &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;c&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;c&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.43056em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;c&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;, the positive samples become &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;msup&gt;&lt;mi mathvariant="bold"&gt;y&lt;/mi&gt;&lt;mo&gt;+&lt;/mo&gt;&lt;/msup&gt;&lt;mo&gt;∼&lt;/mo&gt;&lt;msub&gt;&lt;mi&gt;p&lt;/mi&gt;&lt;mtext&gt;data&lt;/mtext&gt;&lt;/msub&gt;&lt;mo stretchy="false"&gt;(&lt;/mo&gt;&lt;mo&gt;⋅&lt;/mo&gt;&lt;mi mathvariant="normal"&gt;∣&lt;/mi&gt;&lt;mi&gt;c&lt;/mi&gt;&lt;mo stretchy="false"&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;\mathbf{y}^+ \sim p_{\text{data}}(\cdot|c)&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.9657709999999999em;vertical-align:-0.19444em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;&lt;span class="mord mathbf" style="margin-right:0.01597em;"&gt;y&lt;/span&gt;&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.771331em;"&gt;&lt;span style="top:-3.063em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mbin mtight"&gt;+&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;∼&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1em;vertical-align:-0.25em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;p&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.33610799999999996em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord text mtight"&gt;&lt;span class="mord mtight"&gt;data&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord"&gt;⋅&lt;/span&gt;&lt;span class="mord"&gt;∣&lt;/span&gt;&lt;span class="mord mathdefault"&gt;c&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;. For guidance, mix in real samples from &lt;em&gt;other&lt;/em&gt; classes as extra negatives:&lt;/p&gt;
&lt;p&gt;&lt;span class="katex-display"&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mover accent="true"&gt;&lt;mi&gt;q&lt;/mi&gt;&lt;mo&gt;~&lt;/mo&gt;&lt;/mover&gt;&lt;mo stretchy="false"&gt;(&lt;/mo&gt;&lt;mo&gt;⋅&lt;/mo&gt;&lt;mi mathvariant="normal"&gt;∣&lt;/mi&gt;&lt;mi&gt;c&lt;/mi&gt;&lt;mo stretchy="false"&gt;)&lt;/mo&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mo stretchy="false"&gt;(&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;mi&gt;γ&lt;/mi&gt;&lt;mo stretchy="false"&gt;)&lt;/mo&gt;&lt;msub&gt;&lt;mi&gt;q&lt;/mi&gt;&lt;mi&gt;θ&lt;/mi&gt;&lt;/msub&gt;&lt;mo stretchy="false"&gt;(&lt;/mo&gt;&lt;mo&gt;⋅&lt;/mo&gt;&lt;mi mathvariant="normal"&gt;∣&lt;/mi&gt;&lt;mi&gt;c&lt;/mi&gt;&lt;mo stretchy="false"&gt;)&lt;/mo&gt;&lt;mo&gt;+&lt;/mo&gt;&lt;mi&gt;γ&lt;/mi&gt;&lt;mtext&gt; &lt;/mtext&gt;&lt;msub&gt;&lt;mi&gt;p&lt;/mi&gt;&lt;mtext&gt;data&lt;/mtext&gt;&lt;/msub&gt;&lt;mo stretchy="false"&gt;(&lt;/mo&gt;&lt;mo&gt;⋅&lt;/mo&gt;&lt;mi mathvariant="normal"&gt;∣&lt;/mi&gt;&lt;mi mathvariant="normal"&gt;∅&lt;/mi&gt;&lt;mo stretchy="false"&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;\tilde{q}(\cdot|c) = (1-\gamma) q_\theta(\cdot|c) + \gamma \, p_{\text{data}}(\cdot|\varnothing)&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1em;vertical-align:-0.25em;"&gt;&lt;/span&gt;&lt;span class="mord accent"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.6678599999999999em;"&gt;&lt;span style="top:-3em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault" style="margin-right:0.03588em;"&gt;q&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-3.35em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="accent-body" style="left:-0.16666em;"&gt;~&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.19444em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord"&gt;⋅&lt;/span&gt;&lt;span class="mord"&gt;∣&lt;/span&gt;&lt;span class="mord mathdefault"&gt;c&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1em;vertical-align:-0.25em;"&gt;&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord"&gt;1&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;−&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1em;vertical-align:-0.25em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.05556em;"&gt;γ&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault" style="margin-right:0.03588em;"&gt;q&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.33610799999999996em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:-0.03588em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mathdefault mtight" style="margin-right:0.02778em;"&gt;θ&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord"&gt;⋅&lt;/span&gt;&lt;span class="mord"&gt;∣&lt;/span&gt;&lt;span class="mord mathdefault"&gt;c&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;+&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1em;vertical-align:-0.25em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.05556em;"&gt;γ&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;p&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.33610799999999996em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord text mtight"&gt;&lt;span class="mord mtight"&gt;data&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord"&gt;⋅&lt;/span&gt;&lt;span class="mord"&gt;∣&lt;/span&gt;&lt;span class="mord amsrm"&gt;∅&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;where &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;msub&gt;&lt;mi&gt;p&lt;/mi&gt;&lt;mtext&gt;data&lt;/mtext&gt;&lt;/msub&gt;&lt;mo stretchy="false"&gt;(&lt;/mo&gt;&lt;mo&gt;⋅&lt;/mo&gt;&lt;mi mathvariant="normal"&gt;∣&lt;/mi&gt;&lt;mi mathvariant="normal"&gt;∅&lt;/mi&gt;&lt;mo stretchy="false"&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;p_{\text{data}}(\cdot|\varnothing)&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1em;vertical-align:-0.25em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;p&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.33610799999999996em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord text mtight"&gt;&lt;span class="mord mtight"&gt;data&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord"&gt;⋅&lt;/span&gt;&lt;span class="mord"&gt;∣&lt;/span&gt;&lt;span class="mord amsrm"&gt;∅&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; is the unconditional distribution (samples from any class). This property is baked into training: the model learns to extrapolate from the unconditional distribution toward the class-conditional one.&lt;/p&gt;
&lt;h2 id="mode-collapse-robustness"&gt;Mode Collapse Robustness&lt;/h2&gt;
&lt;p&gt;Unlike GANs, drifting models are robust to mode collapse. Figure 3 in the paper shows that even when &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;q&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;q&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.625em;vertical-align:-0.19444em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.03588em;"&gt;q&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; is initialised collapsed onto a single mode, the method recovers the full distribution, because if &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;q&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;q&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.625em;vertical-align:-0.19444em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.03588em;"&gt;q&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; collapses to one mode, the positive samples from &lt;em&gt;other&lt;/em&gt; modes of &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;p&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;p&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.625em;vertical-align:-0.19444em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;p&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; still attract generated samples toward them. The attraction from missing modes pulls samples out of the collapsed state.&lt;/p&gt;
&lt;p&gt;&lt;img alt="drifting-models-figure-3.png" src="../../_media/drifting-models-figure-3.png"&gt;&lt;/p&gt;
&lt;h2 id="results"&gt;Results&lt;/h2&gt;
&lt;p&gt;They achieve &lt;strong&gt;1.54 FID&lt;/strong&gt; on ImageNet 256×256 with a single forward pass (1-NFE), outperforming all previous single-step methods and somewhat competitive with multi-step diffusion models.&lt;/p&gt;
&lt;p&gt;In pixel space (no VAE), they achieve &lt;strong&gt;1.61 FID&lt;/strong&gt; - also state-of-the-art for one-step pixel-space generation.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Method&lt;/th&gt;
&lt;th&gt;Space&lt;/th&gt;
&lt;th&gt;NFE&lt;/th&gt;
&lt;th&gt;FID&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;DiT-XL/2&lt;/td&gt;
&lt;td&gt;latent&lt;/td&gt;
&lt;td&gt;250&lt;/td&gt;
&lt;td&gt;2.27&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Drifting Model, L/2&lt;/td&gt;
&lt;td&gt;latent&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;1.54&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;iMeanFlow-XL/2&lt;/td&gt;
&lt;td&gt;latent&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;1.72&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Drifting Model, L/16&lt;/td&gt;
&lt;td&gt;pixel&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;1.61&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;div class="footnote"&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id="fn:1"&gt;
&lt;p&gt;Deng, M., Li, H., Li, T., Du, Y., &amp;amp; He, K. (2026). &lt;em&gt;Generative Modeling via Drifting&lt;/em&gt; (Version 2). arXiv. https://doi.org/10.48550/ARXIV.2602.04770&amp;#160;&lt;a class="footnote-backref" href="#fnref:1" title="Jump back to footnote 1 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</content><category term="reference"/><category term="GenerativeModelling"/><category term="ImageGeneration"/></entry><entry><title>Software Factory</title><link href="http://localhost:8000/software-factory.html" rel="alternate"/><published>2026-02-08T00:00:00+10:00</published><updated>2026-02-08T00:00:00+10:00</updated><author><name>Lex Toumbourou</name></author><id>tag:localhost,2026-02-08:/software-factory.html</id><summary type="html">&lt;p&gt;is verification the future of software engineering?&lt;/p&gt;</summary><content type="html">&lt;p&gt;&lt;strong&gt;Software Factory&lt;/strong&gt; &lt;sup id="fnref:1"&gt;&lt;a class="footnote-ref" href="#fn:1"&gt;1&lt;/a&gt;&lt;/sup&gt; refers to the idea of completely abandoning the notion of writing code, even reviewing it, leaving engineers to manage the agent's goal and validate the correctness of the system. Effectively, developers become system-level QA engineers, writing specs and unblocking agents.&lt;/p&gt;
&lt;p&gt;StrongDM defines a set of principles for the Software Factory approach &lt;sup id="fnref:2"&gt;&lt;a class="footnote-ref" href="#fn:2"&gt;2&lt;/a&gt;&lt;/sup&gt;, which requires thinking in terms of "&lt;strong&gt;The Loop&lt;/strong&gt;": the model starts with a seed, iterates, validates, receives feedback, and continues until all the "holdout scenarios" pass. With that paradigm, the question for the engineer is how to structure the problem so that each criterion can be validated (without return-true-in-tests cheating) and can receive meaningful feedback to guide its further development. StrongDM goes so far as to build "Digital Twin Universes": entire replicas of all the tools it integrates with, such as Jira, Okta, and Google Sheets, which it uses to exhaustively test its scenarios.&lt;/p&gt;
&lt;p&gt;For a software engineer who's made a living writing software by hand for many years, I can't help but feel anxious when I hear people talking about developing software like this. Clearly, my industry is changing. But I do see some inevitability in this paradigm, or at least some of the ideas. Because, even before I knew it was a thing, I've been seeing it as a natural way to solve problems in the Opus 4.5+ era of agentic software development.&lt;/p&gt;
&lt;p&gt;For example, I wanted an MLX (basically, PyTorch for Apple Silicon hardware) version of &lt;a href="https://github.com/facebookresearch/demucs"&gt;Demucs&lt;/a&gt;, one of the best audio stem-splitting models available. Without knowing a term for it, more just because I was lazy, I set up a software factory. I gave the model context of the reference implementation (the original PyTorch implementation), and the validation scenario: given a range of audio inputs I selected, the MLX outputs must match the PyTorch outputs within a numerical tolerance. I gave the agent an &lt;code&gt;IMPLEMENTATION_NOTES.md&lt;/code&gt; file (see &lt;a href="spec-first-llm-development.html"&gt;Spec-First LLM Development&lt;/a&gt;) to serve as both the plan and working memory, to be updated as it goes. I reviewed the initial plan to check that we agreed on the success criteria, then left it to work. And it did work. The results are &lt;a href="https://github.com/lextoumbourou/mlx-demucs"&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;In another project, I wanted to integrate &lt;a href="https://pocketsmith.com"&gt;Pocketsmith&lt;/a&gt; (my budgeting tool) into &lt;a href="openclaw.html"&gt;OpenClaw&lt;/a&gt; as a "skill". I pointed the agent at several existing OpenClaw skills as concrete exemplars (which StrongDM calls "Gene Transfusion"), gave it the Pocketsmith API documentation, provided a basic indication of how I wanted to use it, told it how to plan and track its tasks, and let it work. The verification was mainly just me testing it and making sure I was satisfied with the interface it had constructed. This skill is just for my own personal use, so I'm not so worried about exhaustive verification - the surface for things to go disastrously wrong is limited. The results are &lt;a href="https://github.com/lextoumbourou/pocketsmith-skill"&gt;here&lt;/a&gt;. I also integrated my preferred share portfolio tool, &lt;a href="https://www.sharesight.com/"&gt;Sharesight&lt;/a&gt;, using a similar approach. See &lt;a href="https://github.com/lextoumbourou/sharesight-skill"&gt;sharesight-skill&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Dan Shapiro &lt;sup id="fnref:3"&gt;&lt;a class="footnote-ref" href="#fn:3"&gt;3&lt;/a&gt;&lt;/sup&gt; discusses 5 levels of software autonomy, with &lt;strong&gt;Dark Software Factory&lt;/strong&gt; at Level 5, where software is a "black box that turns specs into software". I might not quite be operating at Shapiro's level 5 here - I still find myself butting in on the agent's work with my opinions about code quality - but I can certainly see the path towards it.&lt;/p&gt;
&lt;p&gt;For my actual work at Canva, our users depend on us getting things exactly right, and currently, &lt;a href="https://www.linkedin.com/posts/brendanhumphreys_no-you-wont-be-vibe-coding-your-way-to-activity-7305080254417547264-qidy/"&gt;engineers must own AI-generated code as if they wrote every line themselves&lt;/a&gt;, so we're not doing Dark Software Factory anytime soon. But agentic coding is a fact of life today. Even if the code itself is carefully peer-reviewed at the end, there are definitely lessons to take away: how can I make sure the agent has all the context it needs with exemplar references? How can I enable it to validate at every stage of the implementation, and how can I provide feedback to guide its work? How can I be as exhaustive as possible in all the testing scenarios, removing any means of cheating?&lt;/p&gt;
&lt;p&gt;The present of engineering is becoming more about reviewing code than writing it. But the future of engineering might be more about exhaustive verification of your system's correctness, and not much about the actual code at all.&lt;/p&gt;
&lt;p&gt;Discussion on &lt;a href="https://bsky.app/profile/notesbylex.com/post/3mecieamjac2d"&gt;Bluesky&lt;/a&gt;, &lt;a href="https://www.linkedin.com/feed/update/urn:li:activity:7426027007207059456/?originTrackingId=maBhvwgNnwJXZQ%2BUNUWKbA%3D%3D"&gt;LinkedIn&lt;/a&gt; or &lt;a href="https://fedi.notesbylex.com/@lex/116031765064843416"&gt;Mastodon&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Cover by &lt;a href="https://unsplash.com/@homaappliances?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText"&gt;Homa Appliances&lt;/a&gt; on &lt;a href="https://unsplash.com/photos/a-machine-that-is-inside-of-a-building-_XDK4naBbgw?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText"&gt;Unsplash&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;h2 id="references"&gt;References&lt;/h2&gt;
&lt;div class="footnote"&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id="fn:1"&gt;
&lt;p&gt;Moynihan, L. (2024, December). &lt;a href="https://lukepm.com/blog/the-software-factory"&gt;&lt;em&gt;The Software Factory&lt;/em&gt;&lt;/a&gt;. LukePM.com.&amp;#160;&lt;a class="footnote-backref" href="#fnref:1" title="Jump back to footnote 1 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:2"&gt;
&lt;p&gt;StrongDM. (n.d.). &lt;a href="https://factory.strongdm.ai/"&gt;&lt;em&gt;StrongDM Software Factory&lt;/em&gt;&lt;/a&gt;.&amp;#160;&lt;a class="footnote-backref" href="#fnref:2" title="Jump back to footnote 2 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:3"&gt;
&lt;p&gt;Shapiro, D. (2026, January). &lt;a href="https://www.danshapiro.com/blog/2026/01/the-five-levels-from-spicy-autocomplete-to-the-software-factory/"&gt;&lt;em&gt;The Five Levels: From Spicy Autocomplete to the Dark Factory&lt;/em&gt;&lt;/a&gt;.&amp;#160;&lt;a class="footnote-backref" href="#fnref:3" title="Jump back to footnote 3 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</content><category term="permanent"/><category term="SoftwareEngineering"/></entry><entry><title>OpenClaw: the missing piece for Obsidian's second brain</title><link href="http://localhost:8000/openclaw-the-missing-piece-for-obsidians-second-brain.html" rel="alternate"/><published>2026-01-29T00:00:00+10:00</published><updated>2026-01-29T11:40:00+10:00</updated><author><name>Lex Toumbourou</name></author><id>tag:localhost,2026-01-29:/openclaw-the-missing-piece-for-obsidians-second-brain.html</id><summary type="html">&lt;p&gt;how I integrate OpenClaw into my Obsidian vault&lt;/p&gt;</summary><content type="html">&lt;p&gt;I've been an Obsidian user for many years. I like it a lot. I like the paradigm of linking notes that comes from &lt;a href="zettelkasten.html"&gt;Zettelkasten&lt;/a&gt;. I like having a single place to keep all my notes, to track progress on my goals and so forth.&lt;/p&gt;
&lt;p&gt;My workflow is pretty simple. I just create a new Daily Note every day; it contains my todo list and notes I take throughout the day. I also use &lt;a href="permanent-notes.html"&gt;Permanent Notes&lt;/a&gt; to keep track of ideas and link them to daily notes, I also use these notes to help me learn and memorise new concepts. When I have a note that I feel is meaty enough, I'll move it to a &lt;a href="https://github.com/lextoumbourou/notes"&gt;public repo&lt;/a&gt; which is published on my blog, so I kind of have a system for blogging, albeit I end up with this pretty odd thing, that's somewhere in between a blog and a half-baked personal Wiki. I also have folders for tracking people in my life (particularly birthdays, gift ideas, and various things I want to remember about them), as well as using them for life admin tasks, like managing house repairs, insurance, and so on.&lt;/p&gt;
&lt;p&gt;There are aspects of my life that end up outside of Obsidian. I have been using a ChatGPT project to track calories and workouts. I use the Oura Ring for sleep and step tracking. Information about my house is scattered across emails, Dropbox, and files. My wife and I use Google Sheets for finance tracking. I also use Claude and Gemini for various projects, and for things like recipes. I would love to have all this information in Obsidian. I like the freedom of completely owning my data and not being locked into any particular vendor. But, mostly it's just too cumbersome to copy and paste data into Obsidian, and I haven't had the time or energy to figure out how to automate it.&lt;/p&gt;
&lt;p&gt;Which is where OpenClaw comes in.&lt;/p&gt;
&lt;h2 id="openclaw"&gt;OpenClaw&lt;/h2&gt;
&lt;p&gt;Recently, a lot of the tech-internet has been talking about a 2-week-old AI assistant project called &lt;a href="https://openclaw.ai"&gt;OpenClaw&lt;/a&gt; (which, per the &lt;a href="https://docs.openclaw.ai/start/lore#the-origin-story"&gt;lore&lt;/a&gt;, was originally called Warelay, then Clawdbot, then Moltbot - hopefully OpenClaw will be the final name). Sure, it's just a cron wrapper with an LLM integration and some plugins, but there's a lot that can be done with that. To me, this feels like a first look at the next phase of agents: proactivity. Instead of just using AI reactively: give it some prompts and get an answer, OpenClaw can do things in the background, check in on you, give you reminders and suggestions.&lt;/p&gt;
&lt;p&gt;But for me, this really feels like the missing piece of the puzzle for Obsidian to live up to its claim of being a "second brain".&lt;/p&gt;
&lt;p&gt;I'm only a few days into it, but here are some notes about my setup and what I've been using it for so far.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="basic-setup"&gt;Basic Setup&lt;/h2&gt;
&lt;p&gt;If you're using OpenClaw for the first time, I recommend just installing it and using the setup wizard: &lt;code&gt;openclaw onboard&lt;/code&gt;. It's really good. Don't worry about getting it set up perfectly right away; just talk to it and work with it to set it up the way you want.&lt;/p&gt;
&lt;p&gt;My OpenClaw lives on an old MacBook that I already have running 24/7 for a few various tasks. I call my agent &lt;strong&gt;M&lt;/strong&gt; because I set it up when it was called Moltbot, and I cbf thinking too hard about it.&lt;/p&gt;
&lt;p&gt;I communicate with &lt;strong&gt;M&lt;/strong&gt; via WhatsApp. I created a new WhatsApp account by purchasing a ~$10 SIM card at the supermarket to get a new number, and used an old phone from the cupboard to verify the account.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Simcard and phone I used to setup WhatsApp" src="../_media/openclaw-and-obsidian/openclaw-simcard-for-whatsapp.jpeg"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="First conversation with M" src="../_media/openclaw-and-obsidian/whatsapp-first-chat.jpg"&gt;&lt;/p&gt;
&lt;p&gt;You can also chat directly with OpenClaw via terminal with &lt;code&gt;openclaw tui&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;The OpenClaw workspace stores its memory and information about the tools available to it, alongside its &lt;a href="https://docs.openclaw.ai/reference/templates/SOUL"&gt;soul&lt;/a&gt; file. By default, that workspace lives in &lt;code&gt;~/.openclaw/workspace&lt;/code&gt;, but I've put it in my Obsidian vault under &lt;code&gt;~/obsidian-vault/openclaw&lt;/code&gt; so it's synced alongside my Obsidian files, and means I can update the OpenClaw workspace files like any other files in my vault.&lt;/p&gt;
&lt;p&gt;OpenClaw puts config in &lt;code&gt;~/.openclaw&lt;/code&gt;, and to track changes, I turned that into a Git repo:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nb"&gt;cd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;~/.openclaw
&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-e&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;logs/\nmedia/&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;.gitignore
git&lt;span class="w"&gt; &lt;/span&gt;init
git&lt;span class="w"&gt; &lt;/span&gt;add&lt;span class="w"&gt; &lt;/span&gt;.
git&lt;span class="w"&gt; &lt;/span&gt;commit&lt;span class="w"&gt; &lt;/span&gt;-m&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Init&amp;quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;I also moved the cronpath into my workspace, so that my crons can be synced and managed alongside my other workspace files:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;~/.openclaw/openclaw.json&lt;/code&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;quot;cron&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;&amp;quot;enabled&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;&amp;quot;store&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;~/obsidian-vault/openclaw/cron/jobs.json.md&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;&amp;quot;maxConcurrentRuns&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Had to give the json file a suffix of &lt;code&gt;md&lt;/code&gt; to get it to sync - oh well.&lt;/p&gt;
&lt;h2 id="security"&gt;Security&lt;/h2&gt;
&lt;p&gt;You can run &lt;code&gt;openclaw security audit&lt;/code&gt; for a security audit. Some notes about my configuration: &lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;I only accepts DMs from me. I've set &lt;code&gt;allowFrom&lt;/code&gt; to only my phone number, so I'm the only one who can message M directly. I do have plans to give my wife access at some point.&lt;/li&gt;
&lt;li&gt;Make sure to configure &lt;code&gt;loopback&lt;/code&gt; Gateway binding (&lt;code&gt;gateway.bind&lt;/code&gt;) unless you know what you're doing I have &lt;code&gt;gateway.bind&lt;/code&gt; set to &lt;code&gt;loopback&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Double-check file permissions are well locked down: I've set &lt;code&gt;~/.openclaw/&lt;/code&gt; to &lt;code&gt;700&lt;/code&gt; and config files to &lt;code&gt;600&lt;/code&gt;, so only my user can read them. You can run &lt;code&gt;openclaw doctor&lt;/code&gt; to automatically check and fix permissions.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="describing-your-obsidian-vault-to-openclaw"&gt;Describing your Obsidian vault to OpenClaw&lt;/h2&gt;
&lt;p&gt;Initially, you don't need to configure anything with OpenClaw manually. It's usually easiest to just chat with it what you want and let it update its own files. Eventually, once you have it pretty close, you might find yourself wanting to fine-tune it by hand.&lt;/p&gt;
&lt;p&gt;I have my Obsidian vault explained to OpenClaw in my &lt;code&gt;TOOLS.md&lt;/code&gt; file, which has been updated through a combination of conversations with OpenClaw, manual edits and Claude Code for major refactors. Here's the first few lines of it so you get a sense:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gh"&gt;#&lt;/span&gt; TOOLS.md - Local Notes

&lt;span class="gu"&gt;##&lt;/span&gt; Obsidian Vault

My workspace is &lt;span class="sb"&gt;`openclaw/`&lt;/span&gt; inside Lex&amp;#39;s Obsidian vault. Access vault files via &lt;span class="sb"&gt;`../`&lt;/span&gt;.

&lt;span class="k"&gt;-&lt;/span&gt; **Key files:**
  &lt;span class="k"&gt;-&lt;/span&gt; &lt;span class="sb"&gt;`../todo.md`&lt;/span&gt; — current tasks with deadlines
  &lt;span class="k"&gt;-&lt;/span&gt; &lt;span class="sb"&gt;`../finances/finances-summary.md`&lt;/span&gt; — property, stocks, crypto
  &lt;span class="k"&gt;-&lt;/span&gt; &lt;span class="sb"&gt;`../health/health-summary.md`&lt;/span&gt; — health info and fitness routines
  &lt;span class="k"&gt;-&lt;/span&gt; &lt;span class="sb"&gt;`../people/birthdays.md`&lt;/span&gt; — important birthdays
&lt;span class="k"&gt;-&lt;/span&gt; **Daily notes:** &lt;span class="sb"&gt;`../daily/YYYY-MM-DD.md`&lt;/span&gt;
&lt;span class="k"&gt;-&lt;/span&gt; **Subscriptions:** &lt;span class="sb"&gt;`../finances/subscriptions.md`&lt;/span&gt; — alert before renewals flagged for review
&lt;span class="k"&gt;-&lt;/span&gt; **Projects:** &lt;span class="sb"&gt;`../projects/`&lt;/span&gt; and &lt;span class="sb"&gt;`../bachelors-degree-2022/cm3070-final-project/`&lt;/span&gt;
&lt;span class="k"&gt;-&lt;/span&gt; **Sickness log:** &lt;span class="sb"&gt;`../health/conditions/sickness-log.md`&lt;/span&gt;

&lt;span class="gu"&gt;##&lt;/span&gt; Current Focus

**Source of truth:** &lt;span class="sb"&gt;`../todo.md`&lt;/span&gt;

Always read todo.md for current priorities, deadlines, and what&amp;#39;s in progress. Don&amp;#39;t maintain a separate list - todo.md is canonical.
&lt;span class="gh"&gt;#&lt;/span&gt; ...
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2 id="things-i-use-openclaw-for"&gt;Things I Use OpenClaw For&lt;/h2&gt;
&lt;h3 id="tracking-sleep-and-health"&gt;Tracking sleep and health&lt;/h3&gt;
&lt;p&gt;I have an Oura Ring, which I use for sleep and step tracking. I find it really useful. But, as I said, I also like the idea that my data is mine to keep. If I ever find another way to track sleep or steps that I prefer, I'm free to move. So it's nice to make the source-of-truth for that data my existing Obsidian vault.&lt;/p&gt;
&lt;p&gt;A key feature of OpenClaw is skills, which are essentially Markdown and scripts that give OpenClaw (or any agent that supports them) new capabilities. There's already a skill for the &lt;a href="https://github.com/kesslerio/oura-analytics-openclaw-skill"&gt;Oura ring by kesslerio&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;And I get &lt;strong&gt;M&lt;/strong&gt; to fetch my sleep and steps via the &lt;a href="https://docs.openclaw.ai/gateway/heartbeat#heartbeat"&gt;Heartbeat&lt;/a&gt;, and put it into my Daily Notes.&lt;/p&gt;
&lt;p&gt;I also weigh myself each morning, message OpenClaw to save it to my daily note, and I have aggregate notes that show me my progress over time.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Morning check-in via WhatsApp" src="../_media/openclaw-and-obsidian/whatsapp-morning-checkin.jpg"&gt;&lt;/p&gt;
&lt;p&gt;I used to use DataView to aggregate this data, but it makes more sense to have a script generate the summary so OpenClaw can easily track my progress.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Weight tracking summary" src="../_media/openclaw-and-obsidian/openclaw-weight-tracking-example.png"&gt;&lt;/p&gt;
&lt;h3 id="tracking-workouts-and-diet"&gt;Tracking Workouts and Diet&lt;/h3&gt;
&lt;p&gt;When I work out, I share various metrics with OpenClaw, and encourage it to keep me consistent with things like my workout routine, flexibility routines and daily step goals.&lt;/p&gt;
&lt;p&gt;I'm in a cut phase of my health journey, and I will take a picture of what I eat to track calories, aiming to stay under 2200 per day until the cut finishes.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Macros and Calorie tracking" src="../_media/openclaw-and-obsidian/openclaw-calorie-tracking-example.png"&gt;&lt;/p&gt;
&lt;p&gt;I have been using ChatGPT projects for this before, and while it works well, I'd rather have the sense that I have full ownership of my data.&lt;/p&gt;
&lt;p&gt;I find having &lt;strong&gt;M&lt;/strong&gt; helping me track my food and workouts, and goals keeps me consistent - like having a coach checking in on my progress.&lt;/p&gt;
&lt;p&gt;&lt;img alt="openclaw-calorie-log.png" src="../_media/openclaw-and-obsidian/openclaw-calorie-log.png"&gt;&lt;/p&gt;
&lt;h3 id="todos-and-life-admin"&gt;Todos and Life Admin&lt;/h3&gt;
&lt;p&gt;My &lt;code&gt;todo.md&lt;/code&gt; is the source of truth for what I'm working on, it includes priorities and deadlines. Beyond that, I've been getting &lt;strong&gt;M&lt;/strong&gt; to help me track all sorts of life admin:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Subscriptions, especially ones I intend to cancel&lt;/li&gt;
&lt;li&gt;Insurance policies and claims&lt;/li&gt;
&lt;li&gt;Birthdays for family and friends&lt;/li&gt;
&lt;li&gt;Taxable purchases and deductions&lt;/li&gt;
&lt;li&gt;Property repairs and contractor details&lt;/li&gt;
&lt;li&gt;My dog's medication, vet visits, and registration&lt;/li&gt;
&lt;li&gt;Possessions I've bought (with receipts)&lt;/li&gt;
&lt;li&gt;Recipes, with a journal of modifications as I improve them&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;There's a lot. You can also give M access to your Gmail, Calendar and Docs via the &lt;a href="https://www.clawhub.com/steipete/gog"&gt;gog skill&lt;/a&gt;, which has proven to be quite useful, albeit it a little unsettling. Use at your own risk.&lt;/p&gt;
&lt;h3 id="morning-routine"&gt;Morning Routine&lt;/h3&gt;
&lt;p&gt;The morning routine is where it all comes together. I have a cron job that runs each morning to create my daily note. M reads my to-do list, checks for upcoming birthdays, fetches my Oura sleep data, and sends me a WhatsApp message with a summary and suggestions for what to focus on.&lt;/p&gt;
&lt;p&gt;When I weigh myself, I message M, and it logs the weight, fetches yesterday's steps, and gives me a quick health summary. It's a nice way to start the day - I get a snapshot of my priorities without having to dig through files myself.&lt;/p&gt;
&lt;h2 id="let-ai-design-the-system"&gt;Let AI Design the System&lt;/h2&gt;
&lt;p&gt;In the past, I'd get stuck trying to design the perfect Obsidian system before actually using it. I'd spend so long planning the "ultimate" setup that I never ended up with anything.&lt;/p&gt;
&lt;p&gt;Now I just tell the LLM what I want to track and let it figure out the structure. It updates its own memory as it goes. For bigger refactors across many files, I use Claude Code instead of OpenClaw.&lt;/p&gt;
&lt;h2 id="on-costs"&gt;On Costs&lt;/h2&gt;
&lt;p&gt;OpenClaw really has become an indispensable part of my Obsidian and life management strategy. However, it comes at a pretty huge price (literally). All these heartbeats, and skill running and file editing eats up a lot of tokens, especially using the recommended model Opus 4.5. Not even going to mention how much I've spent on it so far - it's too much. But, I'm hoping once I have the system built, day-to-day operations will become a lot cheaper. Plus, the cost of LLM intelligence tends to track downward over time. So hopefully it will be financially sustainable.&lt;/p&gt;
&lt;p&gt;Edit: since writing this article I've switched to using GPT-5.4 Codex via my existing ChatGPT Plus subscription ($20 USD/month). I will admit that it's a bit of a downgrade from Opus, but it's good enough.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;Discussion on &lt;a href="https://news.ycombinator.com/item?id=46841993"&gt;Hacker News&lt;/a&gt;, &lt;a href="https://bsky.app/profile/notesbylex.com/post/3mdqxwotdgc2c"&gt;Bluesky&lt;/a&gt; or &lt;a href="https://fedi.notesbylex.com/@lex/115992306678660814"&gt;Mastodon&lt;/a&gt;.&lt;/p&gt;</content><category term="permanent"/><category term="Obsidian"/><category term="OpenClaw"/><category term="KnowledgeManagement"/><category term="Zettelkasten"/></entry><entry><title>Spec-First LLM Development</title><link href="http://localhost:8000/spec-first-llm-development.html" rel="alternate"/><published>2026-01-19T00:00:00+10:00</published><updated>2026-01-19T00:00:00+10:00</updated><author><name>Lex Toumbourou</name></author><id>tag:localhost,2026-01-19:/spec-first-llm-development.html</id><summary type="html">&lt;p&gt;in which the LLM maintains a spec file alongside the project&lt;/p&gt;</summary><content type="html">&lt;p&gt;&lt;strong&gt;Spec-First LLM Development&lt;/strong&gt; is the simple idea that, instead of asking an LLM to immediately output code after prompting, you first ask it to output a spec file, which is continually updated as you and the LLM develop software together. The spec file is stored in version control and should be re-read by the LLM whenever new context is added.&lt;/p&gt;
&lt;p&gt;Luke Bechtel writes a really useful article called &lt;a href="https://lukebechtel.com/blog/vibe-speccing"&gt;Vibe Specs: Vibe Coding That Actually Works&lt;/a&gt; that has more details about how it looks in practice. Also, in a &lt;a href="https://news.ycombinator.com/item?id=46670279"&gt;Hacker News thread&lt;/a&gt;, antirez, creator of Redis, shared his approach, using &lt;a href="implementation_notes.html"&gt;IMPLEMENTATION_NOTES.md&lt;/a&gt; in his flux2.c project. He says: &lt;em&gt;"This project was possible only once I started to tell Opus that it needed to take a file with all the implementation notes, and also accumulating all the things we discovered during the development process. And also, the file had clear instructions to be taken updated, and to be processed ASAP after context compaction. This kinda enabled Opus to do such a big coding task in a reasonable amount of time without losing track"&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Another really interesting solution to this problem comes from &lt;a href="https://en.wikipedia.org/wiki/Steve_Yegge"&gt;Steve Yegge&lt;/a&gt; in his project &lt;a href="https://github.com/steveyegge/beads"&gt;beads&lt;/a&gt;, which is a much more engineered approach that builds a dependency-aware graph of tasks. It looks like Claude is going to implement a similar solution in Claude Code called &lt;a href="https://x.com/trq212/status/2014480496013803643"&gt;Tasks&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;It's nothing new. The concept of &lt;a href="software-requirements-specifications-srs.html"&gt;Software Requirements Specifications (SRS)&lt;/a&gt; was commonplace as early as 1975 &lt;sup id="fnref:1"&gt;&lt;a class="footnote-ref" href="#fn:1"&gt;1&lt;/a&gt;&lt;/sup&gt;. However, I suspect I haven't seen many of these in my career because keeping them up to date with the pace of software change was just too difficult an undertaking. Now that we have LLMs to do it for us, the story is very different.&lt;/p&gt;
&lt;p&gt;It seems that a lot of the paradigms for writing high-quality software, that in practice often get pushed aside due to them being deemed too labour intensive - SRS being one obvious example, but other practices like &lt;a href="test-driven-development.html"&gt;Test-Driven Development&lt;/a&gt; and &lt;a href="property-based-testing.html"&gt;Property-based Testing&lt;/a&gt; - start to sound a lot more sensible when it's the LLM doing the hard labour, and the engineer reaping the rewards in the form of reliable software.&lt;/p&gt;
&lt;p&gt;Personally, I've had some success adding implementation notes to my toolkit for recent projects. I've been working on porting some PyTorch projects to the MLX framework (see &lt;a href="https://github.com/lextoumbourou/mlx-demucs"&gt;mlx-demucs&lt;/a&gt;, &lt;a href="https://github.com/lextoumbourou/mlx-contentvec"&gt;mlx-contentvec&lt;/a&gt; and &lt;a href="https://github.com/lextoumbourou/mlx-rvc"&gt;mlx-rvc&lt;/a&gt; for recent examples), and anecdotally, it seems to prevent the LLM from getting stuck in loops, especially across context compactions. It also seems to help prevent it from making the same kinds of errors, like failing to use uv or using the wrong Python version for comparison testing, working better than instructions in &lt;a href="agents.html"&gt;AGENTS.md&lt;/a&gt; or &lt;a href="https://code.claude.com/docs/en/memory"&gt;CLAUDE.md&lt;/a&gt; instructions alone.&lt;/p&gt;
&lt;p&gt;That said, a text file feels like a pretty rudimentary solution to &lt;a href="memory.html"&gt;Memory&lt;/a&gt; for an LLM - I'm sure there's going to be a lot more exploration in this space.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;Discussion on &lt;a href="https://bsky.app/profile/notesbylex.com/post/3mdqtpk6e5s2c"&gt;Bluesky&lt;/a&gt;, &lt;a href="https://fedi.notesbylex.com/@lex/115991998235821477"&gt;Mastodon&lt;/a&gt; and &lt;a href="https://fedi.notesbylex.com/@lex/115991998235821477"&gt;Mastodon&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="references"&gt;References&lt;/h2&gt;
&lt;div class="footnote"&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id="fn:1"&gt;
&lt;p&gt;Ramamoorthy, C. V., &amp;amp; Ho, S. F. (1975). Testing large software with automated software evaluation systems. ACM SIGPLAN Notices, 10(6), 382–394. https://doi.org/10.1145/390016.808461&amp;#160;&lt;a class="footnote-backref" href="#fnref:1" title="Jump back to footnote 1 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</content><category term="permanent"/><category term="SoftwareEngineering"/><category term="AgenticReasoning"/></entry><entry><title>Title As Link Text: automatic note titles in Obsidian links</title><link href="http://localhost:8000/title-as-link-text-automatic-note-titles-in-obsidian-links.html" rel="alternate"/><published>2025-11-01T00:00:00+10:00</published><updated>2025-11-01T00:00:00+10:00</updated><author><name>Lex Toumbourou</name></author><id>tag:localhost,2025-11-01:/title-as-link-text-automatic-note-titles-in-obsidian-links.html</id><summary type="html">&lt;p&gt;An Obsidian plugin that automatically replaces filenames in your links with the actual note title, supporting both Wikilinks and Markdown links.&lt;/p&gt;</summary><content type="html">&lt;p&gt;I've built &lt;a href="https://github.com/lextoumbourou/obsidian-title-as-link-text"&gt;Title As Link Text&lt;/a&gt;, a new Obsidian plugin that automatically updates your links to use the note's title instead of the filename.&lt;/p&gt;
&lt;p&gt;If you use a Zettelkasten-style system or just have notes with slugged filenames, you end up with links that look like this:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;[[20230408102501]]
[&lt;span class="nt"&gt;document-name&lt;/span&gt;](&lt;span class="na"&gt;./complex-topic.md&lt;/span&gt;)
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;When what you actually want is:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;[[20230408102501|My Awesome Note]]
[&lt;span class="nt"&gt;Understanding Complex Topics&lt;/span&gt;](&lt;span class="na"&gt;./complex-topic.md&lt;/span&gt;)
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;The plugin handles both Wikilinks and Markdown links, and updates them automatically whenever you save or rename a file. It plays nicely with other plugins that make Obsidian play nice with Markdown links, like &lt;a href="https://github.com/snezhig/obsidian-front-matter-title"&gt;Frontmatter Title&lt;/a&gt; and &lt;a href="https://github.com/agathauy/wikilinks-to-mdlinks-obsidian"&gt;Wikilinks to MDLinks&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id="how-it-finds-the-title"&gt;How it finds the title&lt;/h3&gt;
&lt;p&gt;It checks three things in order:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;A frontmatter property (default: &lt;code&gt;title&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;The first H1 heading in the file&lt;/li&gt;
&lt;li&gt;The filename itself as a fallback&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;So if you have a &lt;code&gt;title&lt;/code&gt; in your frontmatter, that wins. If not, it looks for a &lt;code&gt;# Heading&lt;/code&gt;. If neither exists, it just uses the filename as-is.&lt;/p&gt;
&lt;p&gt;You can also configure which frontmatter property to use, so if you prefer &lt;code&gt;name&lt;/code&gt;, &lt;code&gt;heading&lt;/code&gt;, or something custom, that works too.&lt;/p&gt;
&lt;h3 id="alias-support"&gt;Alias support&lt;/h3&gt;
&lt;p&gt;It also handles aliases. If a note has aliases defined in frontmatter and a link text matches one of them (even partially or fuzzily), the plugin leaves it alone rather than overwriting it with the title. You can tune the similarity threshold or turn alias matching off entirely if you don't want it.&lt;/p&gt;
&lt;h3 id="installation"&gt;Installation&lt;/h3&gt;
&lt;p&gt;It's available as a Community Plugin.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Open &lt;strong&gt;Settings&lt;/strong&gt; &amp;gt; &lt;strong&gt;Community Plugins&lt;/strong&gt; &amp;gt; &lt;strong&gt;Browse&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Search for &lt;strong&gt;Title As Link Text&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Install&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;There are also two commands available if you want to do a one-off update rather than relying on auto-save: "Update all links" and "Update links for current file".&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;See the &lt;a href="https://github.com/lextoumbourou/obsidian-title-as-link-text"&gt;project GitHub&lt;/a&gt; for more details.&lt;/p&gt;</content><category term="permanent"/><category term="ObsidianPlugins"/></entry><entry><title>CBIS-DDSM Mammography Dataset</title><link href="http://localhost:8000/cbis-ddsm-mammography-dataset.html" rel="alternate"/><published>2025-10-18T00:00:00+10:00</published><updated>2025-10-18T00:00:00+10:00</updated><author><name>Lex Toumbourou</name></author><id>tag:localhost,2025-10-18:/cbis-ddsm-mammography-dataset.html</id><summary type="html">ImageNet for Mammography</summary><content type="html">&lt;p&gt;&lt;strong&gt;CBIS-DDSM (Curated Breast Imaging Subset of DDSM)&lt;/strong&gt; &lt;sup id="fnref:1"&gt;&lt;a class="footnote-ref" href="#fn:1"&gt;1&lt;/a&gt;&lt;/sup&gt; is a &lt;a href="mammography.html"&gt;Mammography&lt;/a&gt; dataset for &lt;a href="computer-aided-detection-cade.html"&gt;Computer-Aided Detection (CADe)&lt;/a&gt; and &lt;a href="computer-aided-diagnosis.html"&gt;Computer-Aided Diagnosis (CADx)&lt;/a&gt;, derived from an earlier dataset, the Digital Database for Screening Mammography (DDSM) &lt;sup id="fnref:2"&gt;&lt;a class="footnote-ref" href="#fn:2"&gt;2&lt;/a&gt;&lt;/sup&gt;. This note comes from background research for my Breast Cancer Detection BSc final project.&lt;/p&gt;
&lt;p&gt;The idea of CBIS-DDSM was to provide a standardised mammography dataset towards an &lt;a href="imagenet.html"&gt;ImageNet&lt;/a&gt; for mammography. Though a few mammography datasets already existed: the DDSM itself &lt;sup id="fnref2:2"&gt;&lt;a class="footnote-ref" href="#fn:2"&gt;2&lt;/a&gt;&lt;/sup&gt;, the Mammographic Imaging Analysis Society (MIAS) database &lt;sup id="fnref:3"&gt;&lt;a class="footnote-ref" href="#fn:3"&gt;3&lt;/a&gt;&lt;/sup&gt;, and the Image Retrieval in Medical Applications (IRMA) project &lt;sup id="fnref:4"&gt;&lt;a class="footnote-ref" href="#fn:4"&gt;4&lt;/a&gt;&lt;/sup&gt;, they were limited by accessibility and data quality issues.&lt;/p&gt;
&lt;p&gt;DDSM was already a promising dataset for this purpose, comprising 2620 scanned mammography studies from multiple hospitals. It contains ROI annotations and &lt;a href="breast-imaging-reporting-and-data-system-bi-rads.html"&gt;Breast Imaging Reporting and Data System (BI-RADS)&lt;/a&gt; labels for a series of Mammography studies, along with extensive metadata. However, it had several problems: inaccurate region-of-interest annotations, personal health information in some images, and an obsolete file format (LJPEG).&lt;/p&gt;
&lt;p&gt;The authors of the CBIS-DDSM subset stripped the dubious annotations and the examples containing PII. They also wrote a conversion tool for LJPEG and converted the images into TIFF files, which are then stored as &lt;a href="dicom.html"&gt;DICOM&lt;/a&gt; files, the standard for medical images, to create CBIS-DDSM.&lt;/p&gt;
&lt;p&gt;They also included convenience images, including the region-of-interest mask and the cropped region. You can see an example of it later in the article.&lt;/p&gt;
&lt;p&gt;Finally, they improved the accuracy of the existing region-of-interest annotations by applying the &lt;a href="chan-vese-algorithm.html"&gt;Chan-Vese Algorithm&lt;/a&gt;, initialised with the original contours, but only to the mass examples, not the calcifications. In the figure below, in red, the original annotations; in blue, some example annotations created by physicians; and in green, the annotations derived from the Chan-Vese model, which clearly improve on the original annotations.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Figure 2 from Lee et al demonstrating the Chan-Vese algorithm for improving ROI annotations" src="../_media/cbis-ddsm-figure-2.png" /&gt;&lt;/p&gt;
&lt;p&gt;I'm going to walk through how the dataset works in this rendered notebook.&lt;/p&gt;
&lt;p&gt;The dataset can be downloaded from the &lt;a href="https://www.cancerimagingarchive.net/collection/cbis-ddsm"&gt;Cancer Imaging Archive&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I downloaded the &lt;strong&gt;Images&lt;/strong&gt; dataset to the &lt;code&gt;~/datasets/CBIS-DDSM&lt;/code&gt; folder, which uncompresses into the &lt;code&gt;./CBIS-DDSM&lt;/code&gt; directory.&lt;/p&gt;
&lt;p&gt;The image dataset is a 164GB compressed dataset, which uncompresses to around 180GB.&lt;/p&gt;

&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;

&lt;div class="inner_cell"&gt;
    &lt;div class="input_area"&gt;
&lt;div class=" highlight hl-ipython3"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;pathlib&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Path&lt;/span&gt;

&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;matplotlib.pyplot&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;as&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;plt&lt;/span&gt;

&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;pandas&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;as&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;pd&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;pydicom&lt;/span&gt;

&lt;span class="n"&gt;pd&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_option&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;display.max_colwidth&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

    &lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;



&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;

&lt;div class="inner_cell"&gt;
    &lt;div class="input_area"&gt;
&lt;div class=" highlight hl-ipython3"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;DATASET_ROOT&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Path&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;/Users/lex/datasets/CBIS-DDSM&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nb"&gt;cd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;DATASET_ROOT&lt;span class="o"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;du&lt;span class="w"&gt; &lt;/span&gt;-sh&lt;span class="w"&gt; &lt;/span&gt;*.csv&lt;span class="w"&gt; &lt;/span&gt;CBIS-DDSM
&lt;/pre&gt;&lt;/div&gt;

    &lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;div class="output_wrapper"&gt;
&lt;div class="output"&gt;

&lt;div class="output_area"&gt;

&lt;div class="output_subarea output_stream output_stdout output_text"&gt;
&lt;pre&gt;512K	calc_case_description_test_set.csv
1.0M	calc_case_description_train_set.csv
512K	mass_case_description_test_set.csv
1.0M	mass_case_description_train_set.csv
3.0M	metadata.csv
180G	CBIS-DDSM
&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;



&lt;p&gt;2 files are provided for each split, representing either &lt;strong&gt;calcification&lt;/strong&gt; or &lt;strong&gt;mass abnormalities&lt;/strong&gt; found in the breast.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;calc_case_description_{train|test}_set.csv&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;mass_case_description_{train|test}_set.csv&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;

&lt;div class="inner_cell"&gt;
    &lt;div class="input_area"&gt;
&lt;div class=" highlight hl-ipython3"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;train_mass_df&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pd&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;read_csv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;DATASET_ROOT&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;mass_case_description_train_set.csv&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;train_mass_df&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;head&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

    &lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;div class="output_wrapper"&gt;
&lt;div class="output"&gt;

&lt;div class="output_area"&gt;


&lt;div class="output_html rendered_html output_subarea output_execute_result"&gt;&lt;div&gt;
&lt;style scoped&gt;
    .dataframe tbody tr th:only-of-type {
        vertical-align: middle;
    }

    .dataframe tbody tr th {
        vertical-align: top;
    }

    .dataframe thead th {
        text-align: right;
    }
&lt;/style&gt;
&lt;table border="1" class="dataframe"&gt;
  &lt;thead&gt;
    &lt;tr style="text-align: right;"&gt;
      &lt;th&gt;&lt;/th&gt;
      &lt;th&gt;0&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;th&gt;patient_id&lt;/th&gt;
      &lt;td&gt;P_00001&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;th&gt;breast_density&lt;/th&gt;
      &lt;td&gt;3&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;th&gt;left or right breast&lt;/th&gt;
      &lt;td&gt;LEFT&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;th&gt;image view&lt;/th&gt;
      &lt;td&gt;CC&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;th&gt;abnormality id&lt;/th&gt;
      &lt;td&gt;1&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;th&gt;abnormality type&lt;/th&gt;
      &lt;td&gt;mass&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;th&gt;mass shape&lt;/th&gt;
      &lt;td&gt;IRREGULAR-ARCHITECTURAL_DISTORTION&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;th&gt;mass margins&lt;/th&gt;
      &lt;td&gt;SPICULATED&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;th&gt;assessment&lt;/th&gt;
      &lt;td&gt;4&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;th&gt;pathology&lt;/th&gt;
      &lt;td&gt;MALIGNANT&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;th&gt;subtlety&lt;/th&gt;
      &lt;td&gt;4&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;th&gt;image file path&lt;/th&gt;
      &lt;td&gt;Mass-Training_P_00001_LEFT_CC/1.3.6.1.4.1.9590.100.1.2.422112722213189649807611434612228974994/1.3.6.1.4.1.9590.100.1.2.342386194811267636608694132590482924515/000000.dcm&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;th&gt;cropped image file path&lt;/th&gt;
      &lt;td&gt;Mass-Training_P_00001_LEFT_CC_1/1.3.6.1.4.1.9590.100.1.2.108268213011361124203859148071588939106/1.3.6.1.4.1.9590.100.1.2.296736403313792599626368780122205399650/000000.dcm&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;th&gt;ROI mask file path&lt;/th&gt;
      &lt;td&gt;Mass-Training_P_00001_LEFT_CC_1/1.3.6.1.4.1.9590.100.1.2.108268213011361124203859148071588939106/1.3.6.1.4.1.9590.100.1.2.296736403313792599626368780122205399650/000001.dcm\n&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;



&lt;p&gt;Before we get to the metadata, let's take a look at some major bugs with the provided CSV.&lt;/p&gt;
&lt;h3&gt;Addressing Inconsistent Image Mappings&lt;/h3&gt;
&lt;p&gt;As you can see, each row in the CSV files contains references to 3 DICOM files:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;image file path&lt;/code&gt; - the full mammogram&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ROI mask file path&lt;/code&gt; - binary mask of the region of interest&lt;/li&gt;
&lt;li&gt;&lt;code&gt;cropped image file path&lt;/code&gt; - cropped region containing the abnormality&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;However, the DICOM filenames don't match the files downloaded from the &lt;strong&gt;Images&lt;/strong&gt; dataset in a quite confusing way.&lt;/p&gt;
&lt;p&gt;The CSVs reference files like &lt;code&gt;000000.dcm&lt;/code&gt; or &lt;code&gt;000001.dcm&lt;/code&gt;, but the actual files are named &lt;code&gt;1-1.dcm&lt;/code&gt; or &lt;code&gt;1-2.dcm&lt;/code&gt;. Even worse, the mapping between these naming conventions is inconsistent. Additionally, some entries in the &lt;code&gt;ROI mask file path&lt;/code&gt; column incorrectly point to cropped images rather than actual binary masks.&lt;/p&gt;
&lt;p&gt;Thankfully, Andrés Sarmiento created a &lt;a href="https://gitlab.com/ACSG-64/cbis-ddsm-description-correction-and-verification-tool"&gt;tool&lt;/a&gt; that fixes these issues by interrogating the mask files to determine if they're crops or masks, and correcting the filepath references. The corrected CSV files are available as a &lt;a href="https://huggingface.co/datasets/ACSG-64/CBIS-DDSM-description-corrected"&gt;HuggingFace dataset&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I downloaded the correct CSV to &lt;code&gt;~/datasets/CBIS-DDSM/fixed-csv&lt;/code&gt;, and the rest of the notebook will use it accordingly.&lt;/p&gt;
&lt;h2&gt;Train / Test Data&lt;/h2&gt;
&lt;p&gt;As mentioned, the training and test data are split by the abnormality type present in the scan: calcification or mass. I find it easiest to combine the training into a single file:&lt;/p&gt;

&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;

&lt;div class="inner_cell"&gt;
    &lt;div class="input_area"&gt;
&lt;div class=" highlight hl-ipython3"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;train_mass_df&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pd&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;read_csv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;DATASET_ROOT&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;fixed-csv&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;mass_case_description_train_set.csv&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;train_calc_df&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pd&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;read_csv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;DATASET_ROOT&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;fixed-csv&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;calc_case_description_train_set.csv&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;train_df&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pd&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;concat&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="n"&gt;train_mass_df&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;train_calc_df&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="n"&gt;train_mass_df&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;train_calc_df&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;None&lt;/span&gt;
&lt;span class="n"&gt;train_df&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;head&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

    &lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;div class="output_wrapper"&gt;
&lt;div class="output"&gt;

&lt;div class="output_area"&gt;


&lt;div class="output_html rendered_html output_subarea output_execute_result"&gt;&lt;div&gt;
&lt;style scoped&gt;
    .dataframe tbody tr th:only-of-type {
        vertical-align: middle;
    }

    .dataframe tbody tr th {
        vertical-align: top;
    }

    .dataframe thead th {
        text-align: right;
    }
&lt;/style&gt;
&lt;table border="1" class="dataframe"&gt;
  &lt;thead&gt;
    &lt;tr style="text-align: right;"&gt;
      &lt;th&gt;&lt;/th&gt;
      &lt;th&gt;0&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;th&gt;patient_id&lt;/th&gt;
      &lt;td&gt;P_00001&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;th&gt;breast_density&lt;/th&gt;
      &lt;td&gt;3.0&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;th&gt;left or right breast&lt;/th&gt;
      &lt;td&gt;LEFT&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;th&gt;image view&lt;/th&gt;
      &lt;td&gt;CC&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;th&gt;abnormality id&lt;/th&gt;
      &lt;td&gt;1&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;th&gt;abnormality type&lt;/th&gt;
      &lt;td&gt;mass&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;th&gt;mass shape&lt;/th&gt;
      &lt;td&gt;IRREGULAR-ARCHITECTURAL_DISTORTION&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;th&gt;mass margins&lt;/th&gt;
      &lt;td&gt;SPICULATED&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;th&gt;assessment&lt;/th&gt;
      &lt;td&gt;4&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;th&gt;pathology&lt;/th&gt;
      &lt;td&gt;MALIGNANT&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;th&gt;subtlety&lt;/th&gt;
      &lt;td&gt;4&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;th&gt;image file path&lt;/th&gt;
      &lt;td&gt;Mass-Training_P_00001_LEFT_CC/1.3.6.1.4.1.9590.100.1.2.422112722213189649807611434612228974994/1.3.6.1.4.1.9590.100.1.2.342386194811267636608694132590482924515/1-1.dcm&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;th&gt;cropped image file path&lt;/th&gt;
      &lt;td&gt;Mass-Training_P_00001_LEFT_CC_1/1.3.6.1.4.1.9590.100.1.2.108268213011361124203859148071588939106/1.3.6.1.4.1.9590.100.1.2.296736403313792599626368780122205399650/1-2.dcm&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;th&gt;ROI mask file path&lt;/th&gt;
      &lt;td&gt;Mass-Training_P_00001_LEFT_CC_1/1.3.6.1.4.1.9590.100.1.2.108268213011361124203859148071588939106/1.3.6.1.4.1.9590.100.1.2.296736403313792599626368780122205399650/1-1.dcm&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;th&gt;breast density&lt;/th&gt;
      &lt;td&gt;NaN&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;th&gt;calc type&lt;/th&gt;
      &lt;td&gt;NaN&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;th&gt;calc distribution&lt;/th&gt;
      &lt;td&gt;NaN&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;



&lt;p&gt;We do the same for the test set:&lt;/p&gt;

&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;

&lt;div class="inner_cell"&gt;
    &lt;div class="input_area"&gt;
&lt;div class=" highlight hl-ipython3"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;test_mass_df&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pd&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;read_csv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;DATASET_ROOT&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;fixed-csv&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;mass_case_description_test_set.csv&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;test_calc_df&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pd&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;read_csv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;DATASET_ROOT&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;fixed-csv&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;calc_case_description_test_set.csv&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;test_df&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pd&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;concat&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="n"&gt;test_mass_df&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;test_calc_df&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="n"&gt;test_mass_df&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;test_calc_df&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;None&lt;/span&gt;
&lt;span class="n"&gt;test_df&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;head&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

    &lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;div class="output_wrapper"&gt;
&lt;div class="output"&gt;

&lt;div class="output_area"&gt;


&lt;div class="output_html rendered_html output_subarea output_execute_result"&gt;&lt;div&gt;
&lt;style scoped&gt;
    .dataframe tbody tr th:only-of-type {
        vertical-align: middle;
    }

    .dataframe tbody tr th {
        vertical-align: top;
    }

    .dataframe thead th {
        text-align: right;
    }
&lt;/style&gt;
&lt;table border="1" class="dataframe"&gt;
  &lt;thead&gt;
    &lt;tr style="text-align: right;"&gt;
      &lt;th&gt;&lt;/th&gt;
      &lt;th&gt;0&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;th&gt;patient_id&lt;/th&gt;
      &lt;td&gt;P_00016&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;th&gt;breast_density&lt;/th&gt;
      &lt;td&gt;4.0&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;th&gt;left or right breast&lt;/th&gt;
      &lt;td&gt;LEFT&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;th&gt;image view&lt;/th&gt;
      &lt;td&gt;CC&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;th&gt;abnormality id&lt;/th&gt;
      &lt;td&gt;1&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;th&gt;abnormality type&lt;/th&gt;
      &lt;td&gt;mass&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;th&gt;mass shape&lt;/th&gt;
      &lt;td&gt;IRREGULAR&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;th&gt;mass margins&lt;/th&gt;
      &lt;td&gt;SPICULATED&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;th&gt;assessment&lt;/th&gt;
      &lt;td&gt;5&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;th&gt;pathology&lt;/th&gt;
      &lt;td&gt;MALIGNANT&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;th&gt;subtlety&lt;/th&gt;
      &lt;td&gt;5&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;th&gt;image file path&lt;/th&gt;
      &lt;td&gt;Mass-Test_P_00016_LEFT_CC/1.3.6.1.4.1.9590.100.1.2.416403281812750683720028031170500130104/1.3.6.1.4.1.9590.100.1.2.245063149211255120613007755642780114172/1-1.dcm&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;th&gt;cropped image file path&lt;/th&gt;
      &lt;td&gt;Mass-Test_P_00016_LEFT_CC_1/1.3.6.1.4.1.9590.100.1.2.259596319110047779433501728143778409887/1.3.6.1.4.1.9590.100.1.2.30820586311062570442302321942433426184/1-2.dcm&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;th&gt;ROI mask file path&lt;/th&gt;
      &lt;td&gt;Mass-Test_P_00016_LEFT_CC_1/1.3.6.1.4.1.9590.100.1.2.259596319110047779433501728143778409887/1.3.6.1.4.1.9590.100.1.2.30820586311062570442302321942433426184/1-1.dcm&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;th&gt;breast density&lt;/th&gt;
      &lt;td&gt;NaN&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;th&gt;calc type&lt;/th&gt;
      &lt;td&gt;NaN&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;th&gt;calc distribution&lt;/th&gt;
      &lt;td&gt;NaN&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;



&lt;p&gt;Then combine both splits for analysis:&lt;/p&gt;

&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;

&lt;div class="inner_cell"&gt;
    &lt;div class="input_area"&gt;
&lt;div class=" highlight hl-ipython3"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;all_df&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pd&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;concat&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="n"&gt;train_df&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;test_df&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

    &lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;metadata.csv&lt;/code&gt; file maps the CSV path references to actual file locations on disk:&lt;/p&gt;

&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;

&lt;div class="inner_cell"&gt;
    &lt;div class="input_area"&gt;
&lt;div class=" highlight hl-ipython3"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;metadata_df&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pd&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;read_csv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;DATASET_ROOT&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;metadata.csv&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;metadata_df&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;head&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

    &lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;div class="output_wrapper"&gt;
&lt;div class="output"&gt;

&lt;div class="output_area"&gt;


&lt;div class="output_html rendered_html output_subarea output_execute_result"&gt;&lt;div&gt;
&lt;style scoped&gt;
    .dataframe tbody tr th:only-of-type {
        vertical-align: middle;
    }

    .dataframe tbody tr th {
        vertical-align: top;
    }

    .dataframe thead th {
        text-align: right;
    }
&lt;/style&gt;
&lt;table border="1" class="dataframe"&gt;
  &lt;thead&gt;
    &lt;tr style="text-align: right;"&gt;
      &lt;th&gt;&lt;/th&gt;
      &lt;th&gt;0&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;th&gt;Series UID&lt;/th&gt;
      &lt;td&gt;1.3.6.1.4.1.9590.100.1.2.419081637812053404913157930753972718515&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;th&gt;Collection&lt;/th&gt;
      &lt;td&gt;CBIS-DDSM&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;th&gt;3rd Party Analysis&lt;/th&gt;
      &lt;td&gt;NaN&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;th&gt;Data Description URI&lt;/th&gt;
      &lt;td&gt;https://doi.org/10.7937/K9/TCIA.2016.7O02S9CY&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;th&gt;Subject ID&lt;/th&gt;
      &lt;td&gt;Calc-Test_P_00038_LEFT_CC_1&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;th&gt;Study UID&lt;/th&gt;
      &lt;td&gt;1.3.6.1.4.1.9590.100.1.2.161465562211359959230647609981488894942&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;th&gt;Study Description&lt;/th&gt;
      &lt;td&gt;NaN&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;th&gt;Study Date&lt;/th&gt;
      &lt;td&gt;08-29-2017&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;th&gt;Series Description&lt;/th&gt;
      &lt;td&gt;ROI mask images&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;th&gt;Manufacturer&lt;/th&gt;
      &lt;td&gt;NaN&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;th&gt;Modality&lt;/th&gt;
      &lt;td&gt;MG&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;th&gt;SOP Class Name&lt;/th&gt;
      &lt;td&gt;Secondary Capture Image Storage&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;th&gt;SOP Class UID&lt;/th&gt;
      &lt;td&gt;1.2.840.10008.5.1.4.1.1.7&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;th&gt;Number of Images&lt;/th&gt;
      &lt;td&gt;2&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;th&gt;File Size&lt;/th&gt;
      &lt;td&gt;14.06 MB&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;th&gt;File Location&lt;/th&gt;
      &lt;td&gt;./CBIS-DDSM/Calc-Test_P_00038_LEFT_CC_1/08-29-2017-DDSM-NA-94942/1.000000-ROI mask images-18515&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;th&gt;Download Timestamp&lt;/th&gt;
      &lt;td&gt;2025-11-25T05:30:27.736&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;



&lt;p&gt;CBIS-DDSM contains 1,566 studies.&lt;/p&gt;

&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;

&lt;div class="inner_cell"&gt;
    &lt;div class="input_area"&gt;
&lt;div class=" highlight hl-ipython3"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;images_per_patient&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;all_df&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;groupby&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;patient_id&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Total patients: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;images_per_patient&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

    &lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;div class="output_wrapper"&gt;
&lt;div class="output"&gt;

&lt;div class="output_area"&gt;

&lt;div class="output_subarea output_stream output_stdout output_text"&gt;
&lt;pre&gt;Total patients: 1566
&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;



&lt;p&gt;They separate the studies by the abnormality type present, either "mass" or "calcification".&lt;/p&gt;
&lt;p&gt;The paper&lt;sup id="fnref:1"&gt;&lt;a class="footnote-ref" href="#fn:1"&gt;1&lt;/a&gt;&lt;/sup&gt; claims there are 891 mass cases, although the actual dataset appears to have 892 mass abnormalities.&lt;/p&gt;

&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;

&lt;div class="inner_cell"&gt;
    &lt;div class="input_area"&gt;
&lt;div class=" highlight hl-ipython3"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;all_df&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;all_df&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;abnormality type&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;mass&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;patient_id&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;unique&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

    &lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;div class="output_wrapper"&gt;
&lt;div class="output"&gt;

&lt;div class="output_area"&gt;



&lt;div class="output_text output_subarea output_execute_result"&gt;
&lt;pre&gt;892&lt;/pre&gt;
&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;



&lt;p&gt;The paper also describes 753 calcification abnormalities that match what we see.&lt;/p&gt;

&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;

&lt;div class="inner_cell"&gt;
    &lt;div class="input_area"&gt;
&lt;div class=" highlight hl-ipython3"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;all_df&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;all_df&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;abnormality type&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;calcification&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;patient_id&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;unique&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

    &lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;div class="output_wrapper"&gt;
&lt;div class="output"&gt;

&lt;div class="output_area"&gt;



&lt;div class="output_text output_subarea output_execute_result"&gt;
&lt;pre&gt;753&lt;/pre&gt;
&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;



&lt;p&gt;We know that a mammogram consists of 2 images per breast: a craniocaudal (CC) view from above and a mediolateral oblique (MLO) view from the side.&lt;/p&gt;

&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;

&lt;div class="inner_cell"&gt;
    &lt;div class="input_area"&gt;
&lt;div class=" highlight hl-ipython3"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;fig&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ax&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;subplots&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;figsize&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="n"&gt;images_per_patient&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;value_counts&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sort_index&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;plot&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;kind&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;bar&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;#3498db&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;edgecolor&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;black&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_title&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Distribution of Images per Patient&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fontsize&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fontweight&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;bold&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_xlabel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Number of Images&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_ylabel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Number of Patients&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;enumerate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;images_per_patient&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;value_counts&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sort_index&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;values&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;ha&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;center&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;va&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;bottom&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tight_layout&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;show&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

    &lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;div class="output_wrapper"&gt;
&lt;div class="output"&gt;

&lt;div class="output_area"&gt;



&lt;div class="output_png output_subarea "&gt;
&lt;img src="data:image/png;base64,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5ozZpu/BSpUqmc/7ZMmSiT/R/7+ffPKJ9OvXT5zozz//NP+v9P+wp1u3bpnXUD/vnU5PZunfVaFChcSJr09wcLA7YPvll1+8/ld16NDBJC2cZMyYMfLcc88lmKAtLuzfv1/q1KljviPp+02/uz7//PMmkaQhYcqUKeX333931Htw4cKFUW7X/7maHNOTC6pBgwbiUxp0I+Havn27KygoyNfNiLFGjRq56tWr5/r7779dBw8eNNfz58/vOn78uNl/5swZR/XHUrFiRde7775rrs+aNcuVPn161zvvvOPe37t3b1etWrVcTjJ8+HDz2qxatcpre5IkSVy7d+92OVGiRIlcZ8+eNdebNWvmqlSpkuvixYvm9n///eeqWbOm66WXXnI5ScmSJV0rVqww1z/77DNXihQpXG+99ZZr8uTJri5durhSpUrlmjJlisuJr9XKlStdnTt3dmXKlMmVNGlSV4MGDVw//PCD686dOy4nGjx4sCt16tSuJk2auLJly+YaMWKEK2PGjK4hQ4a4hg0b5sqcObOrX79+LiepXLmya8CAAe7bX375pevRRx8118+fP+8qXbq0eT86jf5/euihh1zBwcGuatWquZo2bWouel23FSxY0BzjT5z2fcJy6tQpV4UKFUzbEydO7GrevLn5PLc48XvFhAkTorxo//r06eO+7SSPPPKI+fxWCxYsMK+Jfqb36tXL1bhxY/MZb+130v8pfU30u8Ps2bNdN27ccDldw4YNzeuyY8cO8x0iNDTUbLt586YrLCzMVb9+fdcrr7zictrrFBQUZH5Gd0kInxEE3T72/fff3/Uybty4BPFGiaksWbKYP2RLeHi4q127dq48efK4Dh8+7Mh/jipNmjTuL2AaEGhgunXrVvf+nTt3urJmzepymo0bN7oKFy7s6t69u/nA9aegW79QL1++3Gv/b7/95sqdO7fLSTTIPnbsmLlepkwZ16effuq1/+uvv3YVK1bM5eTXSt9733zzjatOnTrmC06OHDnMSS2nBT0FChRwfffdd+4AR/vy1VdfuffPmzfPBHNOe//pZ7dFP//0y7N+liv9G9PXy2n0S7R+0bx06VKkfbpN99WuXdvlJH/88cddL/o35sT/vy1atDAnejZt2mROQJYrV85Vvnx5c9JH6XtRP0+cRNubK1cuV758+bwuuj1nzpzmup4Ud5KQkBDXkSNHzHV9vfSko6cPPvjA/A9zEn09pk6daj4P9HNPT6LqiWL9zudUevJ327Zt5vqVK1dMH3/55Rev70n6nd1JnnrqKZPks75TWBLa91mCbh9zytmZmNIsz549eyJt79Chg/kHs3btWkf1xzPoPnTokPu2Zhc9v4hqUKTZESfSjIF+qdGMqv4j0X8sCelDKjb07+XcuXPmugYCEf8xOvF10n/ymzdvdp/U0mDOk74vNTByctDtSUfF9O/f35U3b17HfVbo62CN6lH6t7Rr1y6v91/KlCldTqKvw6+//uqVddTX7tq1a+b20aNHHfc3Zb1Wd/virCePnfZ3dbfvE9Z2p/1NWZ/lGzZscN+2snE6yuLff/915Mn8N954w7Q/4velhBYkxEbatGnNyR3rf5V13fN/ldM+/zz/T+nPkSNHuooWLWrebzr6Qk+CX7582eXk/1P6fdbz++2JEydcyZMndznN2LFjTVLFczRFQvt7onq5j+lc53nz5pn5flFddD6nk2iBMZ0DGNU8R50j5/P5FPcpX758cvDgQfdtnT+WJ08e922ds2TNW3canR83ffp06dOnj5m76bT59hHVqFFDypYtK5cvXzZzlzwdP37ccYXUnn76aVPESlWrVk3mzp3rtV8Lxel8W3+hf1cDBgyQo0ePmrnCTqLzgffs2WOu6+eF/i1Zt9Xu3bslS5Ys4iRaLK1du3bmtfjpp5+kWbNm5n2o87uV/o3lzJlTnEbnBmshoejovoj1LhI6rWXx2Wefmb+diJcjR47IokWLxIkuXbpk6lp4rrCh35v0//ITTzwh586dE6fRuc46t17n1ur3I3+gnwuzZs0y18uUKSM///yz1379/HDiZ4VFP7t79uxpiupq37SeRdeuXR333U/rKul3VsuoUaO8/i/9/fffXn9vTtG1a1czt7tXr17yxhtvmPpLCY1zqrn4qXLlyplK3xqQRkULDTmp1l3jxo3Nh27z5s0j7dN/LHoiQf/ZOE379u29gtESJUp47V+yZImjiqhFRYs+aeE7fT86tWiIFh30FLHgzg8//OC4atkjR46UypUrmy80WuBOC7voP/zQ0FAT8GhhOC3s5zT6Hrtb1Wv97KtVq5Y4iQakWmBRP89XrVplvqC9/fbb8u+//5r+DB061BTlcZIhQ4aYiuX169c3n4FaCOmrr75y79d+aaE4p3n1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"
&gt;
&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;



&lt;p&gt;Looking at the distribution of images per patient, about 1005 patients have both views, while many have only a single image, which is basically an incomplete mammogram (containing only one view per patient, instead of the expected two).&lt;/p&gt;
&lt;h2&gt;Fetching Images&lt;/h2&gt;
&lt;p&gt;Even with the corrected CSVs, we still need to do a few things to look up the DICOM images for each study.&lt;/p&gt;
&lt;p&gt;The file paths in the CSV (e.g. &lt;code&gt;Mass-Training_P_00001_LEFT_CC/1.3.6.1.4.1.9590.100.1.2.422112722213189649807611434612228974994/1.3.6.1.4.1.9590.100.1.2.342386194811267636608694132590482924515/1-1.dcm&lt;/code&gt;) aren't direct paths to the files on disk. They encode metadata: subject ID, study UID, series UID, and filename. We need to parse these components and cross-reference with &lt;code&gt;metadata.csv&lt;/code&gt; to find the actual file location.&lt;/p&gt;

&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;

&lt;div class="inner_cell"&gt;
    &lt;div class="input_area"&gt;
&lt;div class=" highlight hl-ipython3"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;pydantic&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;BaseModel&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nc"&gt;DCMData&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;BaseModel&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;subject_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;
    &lt;span class="n"&gt;study_uid&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;
    &lt;span class="n"&gt;series_uid&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;
    &lt;span class="n"&gt;dcm_file&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;get_file_data_from_dcm&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dcm_path&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;DCMData&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="sd"&gt;&amp;quot;&amp;quot;&amp;quot;Parse DICOM path string to extract metadata components.&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;
    &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dcm_path&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;strip&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;/&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;dcm_og&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;strip&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;.&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;DCMData&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;subject_id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="n"&gt;study_uid&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="n"&gt;series_uid&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="n"&gt;dcm_file&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;dcm_og&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

    &lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;



&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;

&lt;div class="inner_cell"&gt;
    &lt;div class="input_area"&gt;
&lt;div class=" highlight hl-ipython3"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;get_filepath_from_dcm_data&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dcm_data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;DCMData&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;Path&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="sd"&gt;&amp;quot;&amp;quot;&amp;quot;Look up actual file path from metadata using DCM data.&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;
    &lt;span class="n"&gt;meta_row&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;metadata_df&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;metadata_df&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Subject ID&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;dcm_data&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;subject_id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;metadata_df&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Series UID&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;dcm_data&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;series_uid&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;metadata_df&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Study UID&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;dcm_data&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;study_uid&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;iloc&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="n"&gt;file_location&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;meta_row&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;File Location&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;DATASET_ROOT&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;Path&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;file_location&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dcm_data&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;dcm_file&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;.dcm&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

    &lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;



&lt;p&gt;Now we can load the DICOM images using pydicom:&lt;/p&gt;

&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;

&lt;div class="inner_cell"&gt;
    &lt;div class="input_area"&gt;
&lt;div class=" highlight hl-ipython3"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;dicom_to_array&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;file_path&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Path&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="sd"&gt;&amp;quot;&amp;quot;&amp;quot;Load a DICOM file and return pixel array.&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;
    &lt;span class="n"&gt;ds&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pydicom&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;dcmread&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;file_path&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;ds&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pixel_array&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

    &lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;



&lt;p&gt;Let's load an example patient to see all three image types (full mammogram, ROI mask, and cropped region):&lt;/p&gt;

&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;

&lt;div class="inner_cell"&gt;
    &lt;div class="input_area"&gt;
&lt;div class=" highlight hl-ipython3"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;patient_df&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;all_df&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;all_df&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;patient_id&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;P_00065&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;row&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;patient_df&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;patient_df&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;image view&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;CC&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;iloc&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="n"&gt;img_path&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;get_filepath_from_dcm_data&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;get_file_data_from_dcm&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;image file path&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;]))&lt;/span&gt;
&lt;span class="n"&gt;mask_path&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;get_filepath_from_dcm_data&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;get_file_data_from_dcm&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;ROI mask file path&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;]))&lt;/span&gt;
&lt;span class="n"&gt;crop_path&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;get_filepath_from_dcm_data&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;get_file_data_from_dcm&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;cropped image file path&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;]))&lt;/span&gt;

&lt;span class="n"&gt;original_img&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;dicom_to_array&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;img_path&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;mask_img&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;dicom_to_array&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mask_path&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;crop_img&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;dicom_to_array&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;crop_path&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

    &lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;



&lt;p&gt;Visualising the original mammogram, the binary ROI mask, an overlay of the two, and the cropped abnormality region:&lt;/p&gt;

&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;

&lt;div class="inner_cell"&gt;
    &lt;div class="input_area"&gt;
&lt;div class=" highlight hl-ipython3"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;fig&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;axes&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;subplots&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;figsize&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

&lt;span class="n"&gt;axes&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;imshow&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;original_img&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cmap&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;gray&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;axes&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;axis&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;off&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;axes&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;imshow&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mask_img&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cmap&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;gray&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;axes&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;axis&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;off&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;axes&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;imshow&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;original_img&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cmap&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;gray&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;axes&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;imshow&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mask_img&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cmap&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;jet&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;alpha&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.4&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;axes&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;axis&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;off&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;axes&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;imshow&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;crop_img&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cmap&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;gray&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;axes&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;axis&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;off&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tight_layout&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;fig&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;subplots_adjust&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;top&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.92&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;wspace&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.01&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;titles&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Original&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;ROI Mask&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Overlay&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Cropped ROI&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;title&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;zip&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;axes&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;titles&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get_position&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;x0&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get_position&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;width&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;
    &lt;span class="n"&gt;fig&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.98&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ha&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;center&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;va&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;top&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fontsize&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fontweight&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;bold&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;show&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

    &lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;div class="output_wrapper"&gt;
&lt;div class="output"&gt;

&lt;div class="output_area"&gt;



&lt;div class="output_png output_subarea "&gt;
&lt;img src="data:image/png;base64,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"
&gt;
&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;



&lt;h2&gt;Key Metadata&lt;/h2&gt;
&lt;p&gt;The most important label is &lt;code&gt;pathology&lt;/code&gt;, indicating whether the abnormality is &lt;strong&gt;benign&lt;/strong&gt;, &lt;strong&gt;benign_without_callback&lt;/strong&gt; (clearly no risk of malignancy), or &lt;strong&gt;malignant&lt;/strong&gt;.&lt;/p&gt;

&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;

&lt;div class="inner_cell"&gt;
    &lt;div class="input_area"&gt;
&lt;div class=" highlight hl-ipython3"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;pathology_counts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;all_df&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;pathology&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;value_counts&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;figure&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;figsize&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;bar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pathology_counts&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;pathology_counts&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;values&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;#2ecc71&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;#3498db&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;#e74c3c&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Pathology Distribution&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fontsize&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fontweight&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;bold&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ylabel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Count&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;xticks&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;rotation&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;45&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;enumerate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pathology_counts&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;values&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;ha&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;center&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;va&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;bottom&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tight_layout&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;show&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

    &lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;div class="output_wrapper"&gt;
&lt;div class="output"&gt;

&lt;div class="output_area"&gt;



&lt;div class="output_png output_subarea "&gt;
&lt;img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAxYAAAHpCAYAAAAf5apCAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjcsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvTLEjVAAAAAlwSFlzAAAPYQAAD2EBqD+naQAAXzNJREFUeJzt3QmcjfX7//HLviR7SNkqiQpFpEVE1pRSUpJKlEgooSRRibKnULZCe4SKhKLIVlqQVLYIyU62+D/e1/d/n9+ZMcOMM5xZXs/H4zzmnPvcM3OfWc457/vzua5PuqNHjx41AAAAAIhA+kg+GQAAAACEYAEAAAAgYgQLAAAAABEjWAAAAACIGMECAAAAQMQIFgAAAAAiRrAAAAAAEDGCBQAAAICIESwAAAAARIxgAQBRVrx4cUuXLp1fktq9994b+tpffvmlpWZ6fMFj1eM+3Xr06BH6/mPGjDktv9/k/jMBkLZkjPYBAEByoDeFzz777DHbc+bMaZdccondf//9fjmZN4d6cxe8qW/YsKGVL18+SY45NdOb8bVr1/p1/cwzZcpkuXPn9u3XXXedPfzww349KS1dutQmTZrk16tVq+aXlGDgwIG2Y8eO0N8xAEQLwQIAjmPXrl02b948v3zzzTc2atSoRH8NhYogtOjNMMEicY4ePWoHDx60LVu2+GXhwoX+ZvqVV16xVq1ahfa77LLLbO7cuX69YMGCJxUswsNlYoOFgmfNmjX9+oUXXmini34WQQiLHSwi/ZkAQGIQLAAglrp169qTTz5p+/fvt3fffdfeeOMN3z569Gg/U16xYsVoH2KaMnjwYLv00kv9zbN+B1999ZUdOnTIHnzwQTvrrLPslltu8f1y5cpl11xzzWk/vr1799oZZ5xhRYsW9UtyEq2fCYC0iRoLAIilQIEC/mZMZ59HjBhhJUqUCN0XnP198cUX/Yz2ueeea9myZbPs2bNbmTJlrFu3brZv377Q/prGE34W/L777otzHn5g69atPhc+T548duaZZ9odd9xh27ZtO2a/Dz74wKpXr+7Tg7JkyWLnnXeetW3b1v76668EP85Zs2ZZ/fr1LX/+/JY5c2YrUqSIf+9Vq1Yds++PP/7o30+PU49Zj+mLL744Zv5+s2bNQttmz54d42t06NAhdN+HH36Y4ONUqNDPunnz5v41b7vtttB9HTt2tMOHDx+3nuCff/6xhx56yIoVK+aPUz9XjSjceeedHlKCkST9bgJ6fMHXCkYBdAzBtu+++85HKPSzy5Ejx3FrLGL/fvU49PvVm/6mTZv6KExgzZo1oa8Re8Qkdq2GvoeuB6MVEtwf7HO8GotNmzZZu3bt7Pzzz/e/If0t6Xu+//77MfaLfUyLFi0K/S0UKlTI/+aPHDmS4N8ngFTsKADg6DPPPHNUT4m6NG/ePMZ95cqVC9334osv+rZSpUqFtsW+VK9ePfS58e2jy+jRo32fYsWKhbaVLl36mP2aNm0a43ieeOKJeL9moUKFjv7xxx+hffVYgvtmz54d2j506NCj6dKli/NrnHnmmUcXLlwY2ldfL3fu3MfsF/5zCX5m+h7BthYtWsQ47vPPP9+358yZ8+i///573N9H+M8k/Lhl3bp1R9OnTx+6f+7cucd87/Df4fXXXx/vz+upp5465vvFvuhvQ6677rrQtvPOOy/GPrH/hoLfbeyvXbZs2WO+vrbt37/f9129enVou75ffD8T0fc43t/X8X4m+p3qbyW+z+3cuXNo3/BjOvvss49my5btmP1ff/314/4+AaQNjFgAQDwOHDhgb731lp+tDz97LjoDrvs+/fRTPys8efJkq1evnt+ns+qqyQhGOMLPhGuKlbbpEuwfTkW448aNs1dffdXPrss777xjO3fu9OsLFiywvn37+vWsWbPayy+/7N9bZ5CDs9CarnU869ev99ED5Z706dP7GedPPvnEbr/9dr9/9+7dfnb7f7nI7KmnngoVB5ctW9YmTpxogwYNsl9//fWYr63Cap0BF41K6Gcoy5Yts99//92va+qSjv1kaWTlnHPOiVEbER89lmDkRPUG+ll99tlnNmzYMGvUqJFPYQpGgPS7Ceh3FvyeNDIR27p16+yZZ56x6dOn24ABAxJ87Hv27PHpdRpt0GiH6O9LI2OJpb8fHZ9GDQLBMQcja/HR34j+VkSjEPq59O/fP/R76dOnj/+txaYRscsvv9w+/vhjH+0IDB8+PNHHDyAVinayAYDkIPxsc3yXihUrHj18+LDv//PPPx9t0qTJ0XPPPfdopkyZjtl30KBBcX7t8DPZcZ2JnjhxYmh7nTp1QtuXLl3q29q1axfa9thjj4X2/fvvv49myZLFt2sk4p9//ol3xKJ///6hbY0aNQp9jYMHD8Y4i/39998f/e+//47myJEjtO2nn34K7d+lS5c4z4Y///zzoe0ffvihb+vdu3do27Rp0074+zjeiIVUqlQpdP9zzz0X79n5ffv2hUY3brjhhqPLly8/eujQoTi/Z/gIQDBKES58xOLJJ5885v6EjFjMmDEjtF1n+YPtGlVJ7IjFibbH9zPR30YwWqW/ma1bt4b2199UsP+jjz56zDFlzpz56KZNm3y7/jayZ8/u2zWiBQCMWADACWjk4O6777Zp06ZZhgwZfE77VVdd5SMJf/75pxcSxxac4U8snfEP5MuX75ivFz5KULly5dB1nf1WnYVopOG3336L93vE9zXU0lVn9cP30/x/nWUXzalX691AlSpV4vz6Gu3Qz0nGjx/vH3VGPKhfqVGjhkVqw4YNoeuqVYiP6l9USyEzZszwOhg9Dj3O7t27h0aCEqtBgwYn9XnhP+9KlSqFrv/xxx92uqiGJhiN0uhS+N9Z+DHFNSJ10UUXhbpLabRLtSKR/L0DSF3oCgUA8XSFUrGqCn1Llizpb1ADY8eO9Ta0wZvrzp07+5uzKVOmhKYpnWwxa/BGTTJm/L+n6OCN4PEkxQJsx/saCf36hQsXtjp16vj0Kl30BjWYVqPpVuGP62SsXr3aNm7cGLp9ova96iRVtWpVPxZNydLna/qULmpdq8CYWEnRujWun2f4tv/++++Ywu9T7US/4/C/T4n0dwkgdWHEAgDi6Qp19dVXe01BeKiIfbZcAeTmm2/2/eM7+60zu4FIu+eEr4+gN8XhnY+CGga9ObzgggsS/TU08vL999/H2E8/C4WroK3qihUrQvfPnz8/3u/RokUL/6gaC9UoBI87GD04WQpYjz32WChoqdPTlVdeedzP0ZtfrXehugCN5Gzfvt1HnOTzzz/3x5XY39PJhrjwn3d4DUMw2hQ++hLUQMjXX38dOs5I/770txEcv/5m9LcT1zGdzrU4AKQOnGoAgETSm9nwNRY0VUpvyEaOHHnCs7wqaFb7Wk07uuKKK7zNZ2Lojbm+p2iBOI0OaERFi6QFhdK1a9e2vHnzxvs11K5VoywKEh999JEXIevNuUZigna1mjJUrlw5fwOqaT8TJkwItZN9+umnvXhZBdzxufHGGz2UaCqVFhYUrfEQvKFPjJ9++smPQ21P9TMOL0zu16/fCc+aa7qPCrX1ePTz0jFp1EIUUPRzUxF3+O9Joxga5VAxswr2jzfdKjG09kbv3r19jRQVxQcUTkUtXzX6pTf7CkFqElCqVCkv0o+Pjjt4PEOGDLEKFSr48QaNBmLT19ffiB6jHnvjxo29mF8hQ00DApGGQABpULSLPAAgubebjW3t2rWhotXwy9VXXx1n8e+PP/4YZ2tXFcUer/g2vlaxyaXdbHjr1Lh+Zo8//niM/XXcCXW89q+6qGB+2LBhMT4nvtaqGTJkiPfr1K5dO84C+PBL8HMLL94OfneJLd4uWbLkMV//kksuidF+t2vXrsfsozav4b+DcOEF17ELv+P7mfz+++8n1W42oQXlANImpkIBQCLpzLum0KjQVdOkdEZcZ3ofeOCBOPfXmeM333zTSpcunegRirioFeh7773nhd45c+b00Q8tntamTRtfuC18Qb/jtRtVMbPqSTS6obP+Opt/zz332JIlS3w0JaCvp4Xk1JZUZ/DPPvtsb1Gr4ueACqLjmw6VFGfA9Ri1yrZWPdeieJqSpbP/CfHCCy/4GXot7Kefvy4aBejUqVOMxeBUAD9p0iQv7I49/S2pqDWxRgj0e9MUsyZNmvhCg+Htd/Vz1dQtjV5oJEWjGRr1iW/URCNO2l+/v4RO0dLUK/2taFHFYARNx6RRGrXD1QKQAJBY6ZQuEv1ZAIA0RS8Vsd+0dunSxUOOaA0ETaeJ6w2spukoVC1fvvy0HS8A4PSjxgIAcEKqjXj00Ud9cTTR/Pyg1kNnu2+99dbQvocPH7Z9+/b5qE4w918jIQCA1I0RCwDACcU3xUbbVTCsaVgBrSodvtq4irhXrlzpU3sAAKkXNRYAgBN65JFHvPWu5vlrhELz+dVpSbUX4aEinOoG1Ib3s88+I1QAQBrAiAUAAACAiDFiAQAAACBiFG8ngFYy3bhxo7cGPNnVVgEAAICURpObdu/e7VNg06c//pgEwSIBFCqKFCkS7cMAAAAAomL9+vW+HtDxECwSQCMVwQ9UCwgh+dNiUmqFuXTpUtu0aZONHz/ebrzxxjj3bd++vY0ePdp69+7ti4aFL2q2bt26Yxai0uJcov3jWkRKC4X99ddfSf6YAAAATrddu3b5Cfbg/fDxECwSIJj+pFBBsEg5KlSo4KvRqr++3uzH9bubOHGirz6r4T11sAnfR7/3nj17WsuWLUPb9E+llXDlqaee8r7+4WrUqOErFvN3AgAAUpOElAMQLJAq1a1b1y/Hs2HDBm+hOX36dKtfv36c+yhIFCpUKM77cuTI4ZfADz/84CsLDxs2LMKjBwAASHnoCoU0W5DfrFkz69Spk1188cXx7qepTvny5bPLLrvMXnrpJV9ROD5vvPGGXXjhhXbttdeeoqMGAABIvhixQJrUp08fy5gxo7Vr1y7efXTf5Zdfbnnz5rV58+ZZ165dvXaif//+x+y7f/9+r+Po0qXLKT5yAACA5IkRC6Q5S5YssUGDBtmYMWOOO19QRdrVqlXz1YYfeugh69evnw0ZMsQOHDgQZ62GWrE1b978FB89kDLNmTPHGjRo4PVM+r+bNGlSvPvq/037DBw4MLRtzZo11qJFCytRooRly5bNzj//fG+mcPDgwRif+95771n58uW9rqpYsWI+0ggAOD0IFkhz5s6da1u2bLGiRYv6qIUua9eutccee8yKFy8e7+dVrlzZp0LpDU5c06DUdapgwYKn+OiBlGnv3r1Wrlw5Gzp06HH3U0j/9ttvPYCE++WXX3wK4/Dhw23ZsmU2YMAAr2d68sknQ/t89tln1rRpUw8mP//8s7366qu+3yuvvHLKHhcA4P8wFQppjmoratasGWNb7dq1fft9990X7+epda0WhilQoECM7atXr7bZs2fb5MmTT9kxA2m9oUKdOnX8EjjvvPNs5cqV9tprr9nLL7/s29566y1r2LChB4tgH01h1NTHNm3asMApAJxiBAukSnv27LHffvstxpt/BQPVS2ikQgXZ4TJlyuTdn0qVKuW358+fbwsWLLDq1at7Zyjd7tChg919992WJ0+eGJ87atQoO/vss0/4pglA5A0Vwu3cudP/pwOapqgpUOE0berPP//0UcnjjUgCACLHVCikSosXL/ZOTroE9RK63r179wR9fpYsWeydd96x6667zt/kPP/88x4sRowYccybIdVq3HvvvZYhQ4ZT8liAtCAhDRXC6cSBap4efPDBGCOPH330kc2cOdP/N3/99VevjRIWrQSAU48RC6RKKro+evRogvePXTehblCa530imhqlFdkBRN5QQYtVJmS6kqZMaVrU7bffHmMBS13//fffvd7p0KFDvlClFrHs0aOH/68CAE4tnmkBACmmocLGjRt9iuJVV111zAiiQolGPjQVUp+/adMmq1SpUqjeAgBwajFiAQBIEQ0VNFKhUFGhQgUb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AEga6Y5qMQgcl6ZXqTuUCrmjVW9RbknHqHxf4HT4oUJ/S4muGP5btA8BOCUWPXiBpUSbGlwb7UMATolCU+ZaSngfnKxrLAAAAACkDAQLAAAAABEjWAAAAACIGMECAAAAQMQIFgAAAAAiRrAAAAAAEDGCBQAAAICIESwAAAAARIxgAQAAACBiBAsAAAAAESNYAAAAAIgYwQIAAABAxAgWAAAAACJGsAAAAAAQMYIFAAAAgIgRLAAAAABEjGABAAAAIGIECwAAAAARI1gAAAAAiBjBAgAAAEDECBYAAAAAIkawAAAAABAxggUAAACAiBEsAAAAAESMYAEAAAAgYgQLAAAAAGkrWLz44ouWLl06a9++fWjb/v37rU2bNpYvXz7LkSOHNWrUyDZv3hzj89atW2f169e37NmzW4ECBaxTp052+PDhKDwCAAAAIHVKMcFi0aJFNnz4cCtbtmyM7R06dLApU6bY+++/b1999ZVt3LjRbr311tD9//33n4eKgwcP2rx582zs2LE2ZswY6969exQeBQAAAJA6pYhgsWfPHmvatKm9/vrrlidPntD2nTt32siRI61///52/fXXW4UKFWz06NEeIL799lvf5/PPP7fly5fbuHHjrHz58la3bl3r1auXDR061MMGAAAAgDQSLDTVSaMONWvWjLF9yZIldujQoRjbL7roIitatKjNnz/fb+vjpZdeagULFgztU7t2bdu1a5ctW7Yszu934MABvz/8AgAAACB+GS2Ze+edd+y7777zqVCxbdq0yTJnzmy5c+eOsV0hQvcF+4SHiuD+4L649O7d25599tkkfBQAAABA6pasRyzWr19vjz76qI0fP96yZs162r5v165dfZpVcNFxAAAAAEihwUJTnbZs2WKXX365ZcyY0S8q0B48eLBf18iD6iR27NgR4/PUFapQoUJ+XR9jd4kKbgf7xJYlSxbLmTNnjAsAAACAFBosatSoYT/99JMtXbo0dKlYsaIXcgfXM2XKZDNnzgx9zsqVK729bJUqVfy2PuprKKAEZsyY4WGhTJkyUXlcAAAAQGqTrGsszjzzTLvkkktibDvjjDN8zYpge4sWLaxjx46WN29eDwuPPPKIh4krr7zS769Vq5YHiGbNmlnfvn29rqJbt25eEK6RCQAAAACpPFgkxIABAyx9+vS+MJ66Oanj06uvvhq6P0OGDDZ16lRr3bq1Bw4Fk+bNm1vPnj2jetwAAABAapLigsWXX34Z47aKurUmhS7xKVasmH366aen4egAAACAtClZ11gAAAAASBkIFgAAAAAiRrAAAAAAEDGCBQAAAICIESwAAAAARIxgAQAAACBiBAsAAAAAESNYAAAAAIgYwQIAAABAxAgWAAAAACJGsAAAAAAQMYIFAAAAgIgRLAAAAABEjGABAAAAIGIECwAAAAARI1gAAAAAiBjBAgAAAEDECBYAAAAAIkawAAAAABAxggUAAACAiBEsAAAAAESMYAEAAAAgYgQLAAAAABEjWAAAAACIGMECAAAAQMQIFgAAAABSd7Do3bu3XXHFFXbmmWdagQIFrGHDhrZy5coY++zfv9/atGlj+fLlsxw5clijRo1s8+bNMfZZt26d1a9f37Jnz+5fp1OnTnb48OHT/GgAAACA1CtZB4uvvvrKQ8O3335rM2bMsEOHDlmtWrVs7969oX06dOhgU6ZMsffff9/337hxo916662h+//77z8PFQcPHrR58+bZ2LFjbcyYMda9e/coPSoAAAAg9cloydi0adNi3FYg0IjDkiVLrGrVqrZz504bOXKkTZgwwa6//nrfZ/To0Va6dGkPI1deeaV9/vnntnz5cvviiy+sYMGCVr58eevVq5d17tzZevToYZkzZ47SowMAAABSj2Q9YhGbgoTkzZvXPypgaBSjZs2aoX0uuugiK1q0qM2fP99v6+Oll17qoSJQu3Zt27Vrly1btizO73PgwAG/P/wCAAAAIBUEiyNHjlj79u3t6quvtksuucS3bdq0yUcccufOHWNfhQjdF+wTHiqC+4P74qvtyJUrV+hSpEiRU/SoAAAAgNQhxQQL1Vr8/PPP9s4775zy79W1a1cfHQku69evP+XfEwAAAEjJknWNRaBt27Y2depUmzNnjp177rmh7YUKFfKi7B07dsQYtVBXKN0X7LNw4cIYXy/oGhXsE1uWLFn8AgAAACAVjFgcPXrUQ8XEiRNt1qxZVqJEiRj3V6hQwTJlymQzZ84MbVM7WrWXrVKlit/Wx59++sm2bNkS2kcdpnLmzGllypQ5jY8GAAAASL0yJvfpT+r49PHHH/taFkFNhOoesmXL5h9btGhhHTt29IJuhYVHHnnEw4Q6Qona0ypANGvWzPr27etfo1u3bv61GZUAAAAA0kCweO211/xjtWrVYmxXS9l7773Xrw8YMMDSp0/vC+Opm5M6Pr366quhfTNkyODTqFq3bu2B44wzzrDmzZtbz549T/OjAQAAAFKvjMl9KtSJZM2a1YYOHeqX+BQrVsw+/fTTJD46AAAAACmixgIAAABAykCwAAAAABAxggUAAACAiBEsAAAAAESMYAEAAAAgYgQLAAAAABEjWAAAAACIGMECAAAAQMQIFgAAAAAiRrAAAAAAEDGCBQAAAICIESwAAAAARIxgAQAAACBiBAsAAAAAESNYAAAAAIgYwQIAAABAxAgWAAAAACJGsAAAAAAQMYIFAAAAgIgRLAAAAABEjGABAAAAIGIECwAAAAARI1gAAAAAiBjBAgAAAEDECBYAAAAAIkawAAAAABCxNBUshg4dasWLF7esWbNa5cqVbeHChdE+JAAAACBVSDPB4t1337WOHTvaM888Y999952VK1fOateubVu2bIn2oQEAAAApXkZLI/r3728tW7a0++67z28PGzbMPvnkExs1apR16dIlxr4HDhzwS2Dnzp3+cdeuXRYt/+35v+MBUpto/m9F4r9/d0f7EIBTIqX+T+4+dDjahwCcEtmj+D8ZPB8cPXr0hPumO5qQvVK4gwcPWvbs2e2DDz6whg0bhrY3b97cduzYYR9//HGM/Xv06GHPPvtsFI4UAAAASH7Wr19v55577nH3SRMjFlu3brX//vvPChYsGGO7bv/yyy/H7N+1a1efNhU4cuSIbdu2zfLly2fp0qU7LccMi2oyL1KkiP8D5cyZM9qHA6R5/E8CyQv/k2nL0aNHbffu3Va4cOET7psmgkViZcmSxS/hcufOHbXjQXToyZInTCD54H8SSF74n0w7cuXKlaD90kTxdv78+S1Dhgy2efPmGNt1u1ChQlE7LgAAACC1SBPBInPmzFahQgWbOXNmjOlNul2lSpWoHhsAAACQGqSZqVCqmVCxdsWKFa1SpUo2cOBA27t3b6hLFBDQNDi1JY49HQ5AdPA/CSQv/E8iTXeFCrzyyiv20ksv2aZNm6x8+fI2ePBgXygPAAAAQGTSVLAAAAAAcGqkiRoLAAAAAKcWwQIAAABAxAgWAAAAACJGsAAAAAAQMYIFEAX//fdftA8BAAAgSREsgNPsxx9/tGbNmtmePXuifSgAACAJ7N69O9qHkCwQLIDT6IcffrArrrjCSpYsaTly5Ij24QCp1saNG23evHnRPgwAacDbb79tDz30kM9GSOurOBAsgNNk+fLldtVVV9njjz9uzz77bLQPB0i19u/fb02bNrXu3bvb3Llzo304AFKpIEQoWJx11lmWIUMGS5cunaVlBAvgNPjpp5/suuuus7PPPtuef/75aB8OkKplzZrVevbsabt27bKBAwfaV199Fe1DApCKg4WmQWXPnj3ah5MsECyAU2zp0qV25ZVXerD4559/rGXLlrZv375oHxaQqhsjXHvttTZo0CBbvXq1DR48mHABIMmlT/+/t9GZMmWybNmy+fW03pyFYAGcQj///LNVqVLFHn30Ufvggw/svffeswkTJvjtf//9N9qHB6Qaa9as8cYIO3fuDG3T/57CxR9//MHIBYAk89FHH9k999wTuq0Ri5w5c/r1tD4VKmO0DwBIzRYvXmxdu3b1ud5yww032KRJk6xhw4Z+W2dSg7McAE7Ohg0b7LzzzvPr11xzjTdHaNCggVWuXNlHLsaPH+81F0OHDrXDhw9bjRo1on3IAFLw9Cddxo0b59MuR4wYYTt27LDMmTPHGMUIp+edjBnTxlvudEfTevk6cAqsXbvWOnfubKNGjfJ5l7GfVGbMmOHh4q677iJcABHSFMNGjRrZnDlz/P/um2++8ZELjWLceOONdvPNN9uBAwdswIABVrZsWT/TeP3110f7sAGkYB9//LGfsLjjjjv8uUbKli3roxdnnHGGBw3VeW3ZssXuu+8+u+mmmywtIFgAp8Bnn31mjzzyiJUoUcImTpzorWXjCxda06J///4UfgER2Lp1q91yyy128OBBn26YN29e+/DDD71xwltvvWWXX365zZo1y/dt0qSJjRw5kkAPIMG+/PJL+/bbb2379u3Wvn17K1iwoE2ZMsXatm3ro6Z6PT98+LCPXmgkQ8FCt3PlyuWjpoxYADhpejJRuHjuuef8zMXkyZPjDBczZ8706VEKIZoLDiDhoxQ6S6hAXrp06dC2WrVqebtZnU284IILfPumTZt8X01DVB1Gv379Qp8DACcyevRofz2vX7++r0WlE4Jy6NAhmz59ujdl0ejo66+/Hu/XUFG32tGmdgQLIIkcOXIkxtxKhQidzejdu7eHivjChc6CFCpUyC666KIoHTmQsqxYscLatGljWbJk8RbOmnIY2LZtm9WpU8enIOh/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AQAAkIIpQASuu+46bys7cOBAW79+vW/LkiVLKFw88MADfl3hIvYIBSMWiBRToQAAAFJwTcV7771nnTp1siuvvDK0/ZprrvHw8MUXX3i9hRw4cMCnR6kNrWoqVNwNJCVGLAAAAFIgBYdx48bZxIkTrXbt2j5KsWzZMr+va9eutmPHDhszZozvp2lOGrlYtGiRVa9e3S644IJoHz5SIUYsAAAAUphgsbtZs2bZ22+/bWeffbavR1GwYEEflWjfvr01btzYNm7c6MXcefPm9UJu1VwEggXxgKTCiAUAAEAKo1AhFSpUsN27d3v9hKZF3XDDDT5Kcccdd9h9991nCxYssFdeecX3DQ8VQqhAUmPEAgAAIAWtqP3WW2/ZyJEjQ7UT69ats3LlytlLL73kxdkambjtttu8S9TcuXO9puKbb76xKlWqRPvwkcoxYgEAAJACaFRi6dKlNmfOHLv44ott7NixtmbNGitatKgNGTLERyw0HUojE1OnTrU777zTu0RVqlTJL8CpxogFAABACgoXe/bssTZt2viaFOecc449++yzduGFF3pnKC2A17Zt29A0J+17xhln+NQpaipwqhEsAAAAUqAJEybYhx9+aB9//LG98MILtmnTJps0aZLNmDHDzj///Bj7hq+0DZwqBAsAAIAUJDwk7Ny506dA9ezZ09eu0JoW+vjpp59ajhw5on2oSGOIrgAAACmIQkVwXjhXrlzWqlUrX8vi3HPP9TCh4KHpT8DpxogFAABAMl+vIiFUT7F69WorU6aM11Iw/QmnG8ECAAAgGZk3b54dOHDAV8hObLgIUKiNaMgYle8KAACAGBQgtm/f7mtRFC9e3DJmzGjXXnuth4oThYvg/uB8MaEC0cD4GAAAQDKgYJA3b157/fXXbevWrTZw4ED76quvQvfFN8kkPHSoHW1iRzeApEKwAAAASAZUEyFXX321DRo0yOslBg8efNxwER4qBgwY4J+rcAFEA8ECAAAgiqZNm+araWsV7UCVKlU8XPzxxx/xjlyEh4rhw4fbc889Z+3bt7dMmTJF6ZEgraN4GwAAIEq+/vprq1q1ql+/9NJLrWTJklajRg2rU6eOlShRwn755Re788477aKLLrKWLVva9ddff0xxtkLFE088YaNGjbJGjRpF9fEgbWPEAgAAIEpKlSplNWvW9Law99xzjweG0aNHW9myZa1WrVo+ktGsWTNbvny5b585c6Z/XhAqRowYQahAssGIBQAAQBSpUPumm27yqU3jxo3zjlAff/yxh4k33njDRy6CqVCdOnWyPn36+PW33nrLmjdvbh988IHdeuutUX4UAMECAADgtFq2bJnXThQpUsTKly/v2/755x8fodi3b59NmTLFLrjgAt+u9rPbtm2z9957zzZt2mT9+vXzNrQa2Zg6dapfr1+/fpQfEfA/BAsAAIDT5O233/ai7AIFCngHp86dO4fuU4BQbcXu3bt9xOLCCy+M82scPnzYA8XJLJwHnEoECwAAgNNAdRCPPvqor1OhImyFC5k1a5YXbp911lmhcLF3716bNGmSF3MDKQXF2wAAAKeh+9Mzzzxjr776qjVp0iQUKm6//XYv3lbY2LFjhy+Qp/azOXPm9Jaz69evj/ahAwlGsAAAADjFFi9e7FOb6tWrF1qHQqFixYoVHjiefvppDx2qqVC4mDx5st1yyy1WuHDhaB86kGAZE74rAAAAEktBYsaMGd5SNl++fL7twIEDHhxefvllK1asmJ1zzjnWqlUr37dLly4+LUqjGLHXrACSM0YsAAAATiEFg9y5c3vdhLo+6XaWLFnsrrvu8lAhDzzwgI9mqFtU7BBBqEBKQbAAAABIYlrIbuLEiaEOTqqj+Pbbb+3TTz/1oKCRieAiW7Zs8euXXXZZtA8dOGlMhQIAAEgiCgcakejWrZuPUChEaCRCC9h9+OGHPkqROXNmXxAvoLqKe++91z+2bt06qscPRIJ2swAAAEnk0KFDlilTJtu5c6c1atTI16RQyGjQoIEtWbLE162YM2eO3X333Va2bFnbvHmzd4zatWuXF3jrc6mpQEpFsAAAAEgCWtRuw4YN1rhxY8ufP7+HBY1MqK6iR48ePnKxZs0aGzt2rI0ePdpHNMqVK+eXPn36+JSpYOoUkBIRLAAAAJLAww8/bGPGjLHBgwd7xyd1gArChUKEwoUWv9NoxNatW31kQgEkGJ1gpAIpHZEYAAAgAkeOHPFWslqHImvWrNa1a1ffpqlQChdak0LhomfPnj4iUb9+fQ8U4XSel1CBlI5gAQAAEAGFCgWDdOnSWf/+/T08PPXUU35feLi4+eabrW/fvrZ//35fHE+fF9DnAikd7WYBAABOwrvvvmstW7a02bNn2+rVq0PbNRVK3Z+00J06QWnaU86cOb0GQ0XdakUbHiqA1IIRCwAAgERSEXbz5s3t4MGD9ssvv9iyZct8utOFF15obdu2tUGDBvlIxTPPPOOjERqtKFCggC1cuNAXxwNSI+IyAABAIqh+4txzz7WhQ4da3rx5rXjx4vb+++97gBg2bJgvclepUiW76KKLLFeuXDZgwACbMGGCj1Zkz57daylUqA2kNoxYAAAAJJCmNmmBO61Lceedd3pAeOihh6xKlSreQla3P/vsM5s1a5a99tprduDAAVu7dq19+eWX9uijj4a+DoXaSI0IFgAAAAkwYsQIDxGqkRCNPmjFbBVrP/LII77Y3bPPPms33nijX7Zt22b//POPTZ8+3T9PIxpBkTeQGhEsAAAATmD48OFeO/HRRx9Z9erVQ9s1etGiRQsvxtb9Wtzu6aef9vvOPPNMnypVsmRJv83id0jt+OsGAAA4Dk1x0oiEQoWmQAV69erlYSJPnjx2//33+zbtp5ChdrOZMmWK8XUIFUjt+AsHAACIx9dff+0jEgoR4aFC61B888031qpVq9DIhcKFpjm1bt3azjnnHJ8mBaQl6Y5qsh8AAADipC5Pais7duxYq1ixooeKlStX2pQpU6xYsWKhlbcDGtlQ61lGKJDWECwAAABiUZDYt2+f5c6d22+rfeyuXbuscOHCvuCdOj9pVCK8GFtBQ/UXOXLk8NvUVCCtIVgAAADEaimrdSe0mramP6nTk1x//fXeNlZrVjRq1CjG5+g+jVrMmDGDrk9Is1ggDwAAIKz7k2olNMXpuuuus+eff95eeeUVv09rU1x55ZX2xBNP2Ny5c0OfU79+fdu4caOPYgQtZYG0iPE5AAAAM3vjjTe8q9N7771nDRs29G1am0JB4c8///TVtufNm+fTne677z6vuXjhhRds1apVtmzZMu8CxfQnpGWMWAAAgDRPU5zU4albt26hUCHLly/3wFGmTBmrXLmyTZw40WbPnu21Ftdee62tX7+eUAH8fwQLAACQ5qkQ+5prrrElS5bY4sWLfZvqKPbu3etrUqiuQsXcnTt39hW158yZYx06dPD9CRXA/1C8DQAAYOZTmtq1a2cZMmSwHTt22L///uuF3MWLF/f7v//+e6tQocIxxduECuB/GLEAAAAws5IlS9rgwYPtwIED9vPPP1uXLl08VGidCp2H1aV06dJWqFChGJ9HqAD+hxELAACAML///ru1adPG28d27drVaylErWf37NljM2fOjLEgHoD/IVgAAADEMy0qCBcDBgzwUQxdVFMRe7VtAEyFAgAAiHdalNal0OJ36vwUhArVVBAqgGMxYgEAABCPX375xV599VXr37+/11JQqA3Ej2ABAACQAIQK4PgIFgAAAAAixgRBAAAAABEjWAAAAACIGMECAAAAQMQIFgAAAAAiRrAAAAAAEDGCBQAAAICIESwAAAAARIxgAQAAACBiBAsAAAAAFqn/B8LxGTN6z2kmAAAAAElFTkSuQmCC"
&gt;
&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;



&lt;p&gt;The dataset also includes &lt;a href="breast-imaging-reporting-and-data-system-bi-rads.html"&gt;Breast Imaging Reporting and Data System (BI-RADS)&lt;/a&gt; assessment categories (0-6) that indicate the level of suspicion. The distribution shows most cases fall into categories 4 and 5 (suspicious/highly suggestive of malignancy), which makes sense given that this is a dataset specifically curated around abnormalities.&lt;/p&gt;

&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;

&lt;div class="inner_cell"&gt;
    &lt;div class="input_area"&gt;
&lt;div class=" highlight hl-ipython3"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;assessment_counts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;all_df&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;assessment&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;value_counts&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sort_index&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;figure&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;figsize&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;bar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;assessment_counts&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;astype&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;assessment_counts&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;values&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;#9b59b6&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;BI-RADS Assessment Distribution&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fontsize&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fontweight&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;bold&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;xlabel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Assessment Category&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ylabel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Count&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;idx&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;enumerate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;assessment_counts&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;items&lt;/span&gt;&lt;span class="p"&gt;()):&lt;/span&gt;
    &lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;ha&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;center&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;va&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;bottom&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tight_layout&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;show&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

    &lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;div class="output_wrapper"&gt;
&lt;div class="output"&gt;

&lt;div class="output_area"&gt;



&lt;div class="output_png output_subarea "&gt;
&lt;img src="data:image/png;base64,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Nmzo3L5s2TKpU6eOeT/tsvHRRx/J9evXH6oblNZV66zHUnou2k3FEhoaKv/++695/tprr8n69evlm2++kZEjR0rVqlXNd6GWL1/u7Eb1wQcfmHJ67vodlS1b1llOX/v555+b56VKlTJ10dfWqFHDbFu4cKFZVFhYmPz999/mefv27U1dNEl47Nix8tRTT5nE9wepoytNxNfP9Pvvv5f69eubbXoMPbZ2LVuxYoVJbreSlK3fgF4zBgcHO7upvfHGG6ZL2ocffmjqo99Xly5dTLmYfv/9d+natas5tnZnU/qZffbZZ+a5/tZcf8dWtz9d3nnnHXlYOjhA+fLlnet79uy5Z3mru1/hwoXN56jnN3PmTOncubOzy92D1lXPvW/fvqbb36effur8vd3P6dOnZfbs2aab3qOPPur87vQ39qAee+wxU7/KlSs7t+lxrXrny5fvnt3LDh06ZJ5rFyntiqjfm/V56G/d+t26unLlivn/k/5djRgxwrldPwMANtwn8ACAh07e1u4oq1evvm/rg2uyaGwJmvdK3n766acdBw8evKtuy5cvd5Zp3769s8uEdqPRbZpw7dq9534tFtqVxvV9//zzT7P9zp075m5xXPXT1g29q3o/ehztoqSv0Tpayeh6x9W124pFu3lY27WrkiaRx+btt992llu0aJHbHWVXrt2uJk6c6PweZsyY4dyuLURKv1Nrm3anOnny5F1dTh6kjq53o7V1Qr8npfV1/S1Z76EDArgeV2lCvrWtcuXKbr+lmjVrOvft2rXLlHe9K69duCzbtm1zbtcWroRM3o7ZYqG0m5a1X1vYYn4ernfntbuSVV89X01ojs396uraYtGhQ4e79senxUJ/FxZtoXJtAXnQFov7bY/rM9G/X9cWn3379jnLT5o0ybldf9sx6xRzEAfXVg/XboQAHgwtFgAShHVndMOGDSYZVe9Ga1K1tiScPXv2nq9duXKludPvuvTp0yde77t37165cOHCfe/+q6xZs0qjRo3Mc024ju9wtyrmkLY6pKzSu+E6rK4OCat3yfXua5o0adxaN8aMGXPf4+vndu7cOfNc62jdOX7xxRdjPacWLVpIzpw5zfN+/fqZu7o5cuQw34Pe7bV07NjRtCJZx8qVK5dJRm/VqpVJtLccOXLE+VzvYFvfgw6jazl48KB51O0lSpQwz0ePHm0SfPXz0KFVdVheq4UkvnV0pa0l+j0pLWupUqWKs4VDz8FitVC41l/v/Lv+lrSFJeY5uNJWFotVX9djJybX35X1m4qLtqqoX375xfzOMmXKZFqd+vfv7xxA4EHpkMgPo3r16s7nTzzxhPO5tiLF1iqUGLTV7OLFi+Z5xowZ3Vp/XOvk+tuw6G/MtYUkqb93IKUisACQIKyRZOrVqydDhgwx3XisbizaRSih/PDDD3L58mVn4KFBRdu2bZ1dbmJ7z9atWzvnEdDuPQ/THeqnn35yPi9WrJjpxhLzQku76+zevdt0E9ELd4tuux/Xumgdrfpq3V27wlhzaejIVeHh4TJw4EDzueuFkV5kaZeWNm3aOI+nF1taToMFraNevEZERMjixYvNd7R169Z4fwZWty69iNPPQwNI7a6kdbl69aoZ8ahHjx4m2HiQOrpyvbh2DdCsYCOmB72Ija1rmuvIXToPy8Me+0FpdxzXeSxcL3Rjo112NLjUAFEDMP19aKA0fvx4E4y6dpWLL2vEMzti69LmKioqym39n3/+sf2e96vD/eoUc7S2pPzegZSMwAJAonD9xzm2FgVXL7/8sinvutyrNUEvMseNG+e8a64T1Ln2jdYLcysH4l60f7XmYtyPtrzo+1k0kLFovkfM99KLNe3vH9eFVWzDfGrf8PhciGrrjtLPSPvajxo1yrQU6cXazp07nWWt42m5cuXKyccff2xaVfRurPbPV9qyYE2gVrJkSbfgLeb3oYu2vljH1P7pGkBq3oTeLde++law5fre8aljQnCtv7ZAxFZ/DSpeeeWVhzq+a5CTUEP/Dh061ATJSj+7Zs2a3fc17dq1M0Moa16BBnNWa5wGKNad+Qep6/0uwOOyY8cO5/Pt27ffNZmla5B4/vx559+ZtmhYORF2P2P9DQYEBJjn+t0eOHAg1jq5/jYAJK7/H6IDgA16F/zHH380d031Lrgm7ibmP+x6h1G7Hr366qtmXe/a9u7d22x37TKkM3NrdxFXs2bNkp9//tkEPJoAG/OCLjIy0pzLjRs3zIWwJsPqRb3SC+U333zTWVbnq9BEY72LrBe0+fPnN12aXJNYq1Wrds9zWbVqlbP7hc7IrEnGrvSCadq0aea5npu2huijbtP5EHR2cL2I0+5UruegtPVAgzQ9R+2ypN1nrIRn13LaZcpKDu7UqZNJ9NXATbubHD161JyjdmF69913zferLSDamqJltGuSdknTz8v1mPGtY0KoVKmSaZ3RC2xtOdGEZv1OdK4TvZjVC2FtpbG6zjwo1zvc+tvQ70y7q+lvW1vr4kM/Rw1EtUVLPxvXVrX33nvvvnOe1K5d23SB0m4+jzzyiAksfv3117s+z4So6/0MGjTI/K3p70mfW7T7m0Vnn9cWK21B7NChg9StW1emTJkSZ6DtWm/tUte0aVPJkCGDSfSPKxDRQMv629DfsP4+9TvWR4sOMAAgiTxgTgYAPNDM2zofwa1btxJluFkd11/nRbD2ffnllybx0krQ1nkTrLkBXGnCr/Wal156Kd4zb+v8BjFn3r5X4rYumnAbV9KyxTVBW5NOYzp//ryZwdtKbtZhSnVo0nu971dffWVeO2LEiDjL6JCqOsRtfIabdU3k1YToe5ULCQkx5eJbx7iSleNKQo4rufhew81ay/2OEVdddFhbK3nadYktIftBZ94eMmSI22viqoMOBBDXccqWLWsGAIhPXV2Tt2P7G4xP8rb+LcQ8vg6IEBER4Sz/6aefxjrsb4ECBWJN0nZNuI6Z+B3XZ6J/G/cbbtZ1YIGYx02qWcWB1IKuUAASnN5l1LvHetdbu9VYM2Qnxvv897//da5rkrTelbbu3GrirtVVIq6EVde8BVfanUNzCbSFQvuvT5061STNat92V3pnVFsFtIzmXugdXD8/P/NcW0t27dplcg3iol04XO9cP/fcc3eV0STmWrVqmed691frrMPf6hCu2sKhLQaaRK4tAnrOOrym3slVetdXu//o96F3hLWcHk/rqy0XehfcdchgHXJWW170WHoe2sqhQ7Bqq431Weudb82b0KFotduX3rnWrjzaMjN58mSzT8W3jglF30cTt7UVS4dA1frr96/nrtu029bD0nPU70lzReI7JGtcx9HPX1tY9HvRljPNVYkPbRnQFgH9TepvU/+utOuRnpu2BFnD/CZUXe9Fk+81n0bzZvTvUFuztDVGuydZdHhgrbO2kmgZzcfRLnH6txEb/Tz0t6O/OdduUfein6V28dP30b9NHahA/wb1t6h/szrL+cN29wLw4Hw0uniI1wEAAACAEy0WAAAAAGwjsAAAAABgG4EFAAAAANsILAAAAADYRmABAAAAwDYCCwAAAAC2MfN2PEVHR5vZUnVMcMbEBgAAQGrgcDjk6tWrkj9//vvOMUNgEU8aVBQsWNDT1QAAAACS3KlTp6RAgQL3LENgEU/W7KX6oWbNmtXT1QEAAAAS3ZUrV8zNdeta+F4ILOLJ6v6kQQWBBQAAAFITn3ikApC8DQAAAMA2AgsAAAAAthFYAACAVGnz5s3SvHlzM9qNdvNYsmTJXWUOHjwozz33nGTLlk0yZcok1apVk5MnTzr3v/LKK1KsWDHJkCGD5M6dW1q0aCGHDh1y7j9//rw0btzYvEf69OlNX/XevXubfutASkNgAQAAUqXr169LpUqVZPLkybHu/+233+TJJ5+U0qVLy8aNG2Xv3r0yZMgQ8ff3d5apUqWKzJ492wQga9asMUNzNmrUSKKiosx+HZ5Tg41ly5bJkSNHZM6cObJu3Tp59dVXk+w8gaTi49C/ANyX3lnQuxWXL18meRsAgBRGWywWL14sLVu2dG5r166dpEuXTr744ot4H0eDDw1Wjh07ZloyYjNx4kQZM2aMGWkSSEnXwLRYAAAAxDIx7vfffy8lS5aUoKAgyZMnj1SvXj3W7lKuLSDaelG0aNE4577SebG+++47eeqppxKx9oBnEFgAAADEEBERIdeuXZNRo0aZHIm1a9fK888/L61atZJNmza5lZ0yZYpkzpzZLKtWrZLQ0FDx8/NzK9O+fXvJmDGjPPLII+au72effZbEZwQkPgILAACAWFoslOZHvP7661K5cmV5++235dlnn5Vp06a5le3YsaP8/PPPJuDQFo42bdrIzZs33cqMHz9edu/eLUuXLjW5G/3790/S8wGSAhPkAQAAxJArVy7x9fWVsmXLum0vU6aM/Pjjj27btP+5LiVKlJAaNWpI9uzZTb6GtlJYAgMDzaKJ4Dly5JA6deqYRPB8+fIl2TkBiY0WCwAAgBi0K5MOLXv48GG37TqyU+HCheN8nY6Jo0tkZOR9W0PuVQbwRrRYAACAVElzKHT0Jsvx48dlz549pkWhUKFCMmDAAGnbtq3UrVtX6tWrJ6tXr5bly5eboWfV77//LgsXLjTDy+ocFn/++afJydA5LZo2bWrKrFy5Us6dO2eCFM3BOHDggDlu7dq1pUiRIh47dyAxEFgAAIBUadeuXSZgsFh5D8HBwWa+CU3W1nyKkJAQ6du3r5QqVUq+/fZbM7eF0vkstmzZIhMmTJCLFy9K3rx5TRCydetWM4qU0iBjxowZJk9DWyh0tChNANd8DSClYR6LeGIeCwAAAKQ2V5jHAgAAAEBSIrAAAAAAYBuBBQAAAADbCCwAAAAA2MaoUAAAIFn4rMMqT1chRes2v4mnq4AUjhYLAAAAALYRWAAAAADw7sBi8+bN0rx5c8mfP7/4+PjIkiVL7ipz8OBBee6558z4uZkyZTIzV548edK5/+bNm9KrVy/JmTOnmdGydevWZoZLV1q+WbNmkjFjRjNhjc54eefOnSQ5RwAAACA18Ghgcf36dalUqZJMnjw51v2//fabmd2ydOnSsnHjRtm7d68MGTLEzHRp0Zksly9fLosWLZJNmzbJ6dOnzYyWlqioKBNU3Lp1y8yEOXfuXDOb5tChQ5PkHAEAAIDUINnMvK0tFosXL5aWLVs6t7Vr107SpUsnX3zxRayv0RkAc+fOLfPnz5cXXnjBbDt06JCUKVNGwsLCpEaNGrJq1Sp59tlnTcCRN29eU2batGkycOBA+fvvv8XPzy9e9WPmbQAAEhfJ24mL5G2k2pm3o6Oj5fvvv5eSJUtKUFCQ6cJUvXp1t+5S4eHhcvv2bWnYsKFzm7ZuFCpUyAQWSh8rVKjgDCqUHk8/pAMHDsT5/pGRkaaM6wIAAADAywKLiIgIuXbtmowaNUoaN24sa9euleeff950c9IuT+rs2bOmxSEgIMDttRpE6D6rjGtQYe239sUlJCTERGfWUrBgwUQ4SwAAACBlSNYtFqpFixYmj6Jy5cry9ttvm25N2pUpsQ0aNMg0+VjLqVOnEv09AQAAAG+VbAOLXLlyia+vr5QtW9Ztu+ZPWKNCBQYGmqTsS5cuuZXRUaF0n1Um5ihR1rpVJjbp06c3/chcFwAAAABeFlhoFycdWvbw4cNu248cOSKFCxc2z6tUqWKSu9evX+/cr+U18KhZs6ZZ18d9+/aZrlWW0NBQEyjEDFoAAAAAPBxf8SDNoTh27Jhz/fjx47Jnzx7JkSOHScDW+Sbatm0rdevWlXr16snq1avN0LI69KzS3IeuXbtK//79zWs0WOjTp48JJnREKNWoUSMTQHTq1ElGjx5t8ioGDx5s5r7QVgkAAAAAXh5Y7Nq1ywQMFg0QVHBwsJlrQpO1NZ9CE6n79u0rpUqVkm+//dbMbWEZP368pEmTxkyMpyM56YhPU6ZMce5PmzatrFixQnr27GkCDp1kT48/fPjwJD5bAAAAIOVKNvNYJHfMYwEAQOJiHovExTwWSLXzWAAAAADwHgQWAAAAAGwjsAAAAABgG4EFAAAAANsILAAAAADYRmABAAAAwDYCCwAAAAC2EVgAAAAAsI3AAgAAAIBtBBYAAAAAbCOwAAAAAGAbgQUAAAAA2wgsAAAAANhGYAEAAADANgILAAAAALYRWAAAAACwjcACAAAAgG0EFgAAAABsI7AAAAAAYBuBBQAAAADbCCwAAAAA2EZgAQAAAMA2AgsAAAAAthFYAAAAALCNwAIAAACAbQQWAAAAAGwjsAAAAABgG4EFAAAAANsILAAAAADYRmABAAAAwDYCCwAAAAC2EVgAAAAAsI3AAgAAAIBtBBYAAAAAbCOwAAAAAGAbgQUAAAAA7w4sNm/eLM2bN5f8+fOLj4+PLFmyJM6yr776qikzYcIEt+0XLlyQjh07StasWSUgIEC6du0q165dcyuzd+9eqVOnjvj7+0vBggVl9OjRiXZOAAAAQGrk0cDi+vXrUqlSJZk8efI9yy1evFi2bdtmApCYNKg4cOCAhIaGyooVK0yw0qNHD+f+K1euSKNGjaRw4cISHh4uY8aMkWHDhsn06dMT5ZwAAACA1MjXk2/epEkTs9zLX3/9JX369JE1a9ZIs2bN3PYdPHhQVq9eLTt37pSqVauabZMmTZKmTZvK2LFjTSAyb948uXXrlsyaNUv8/PykXLlysmfPHhk3bpxbAAIAAAAgheZYREdHS6dOnWTAgAEmIIgpLCzMdH+yggrVsGFDSZMmjWzfvt1Zpm7duiaosAQFBcnhw4fl4sWLSXQmAAAAQMrm0RaL+/nwww/F19dX+vbtG+v+s2fPSp48edy2afkcOXKYfVaZokWLupXJmzevc1/27NljPXZkZKRZXLtUAQAAAPCyFgvNh/j4449lzpw5Jmk7qYWEhEi2bNmciyZ9AwAAAPCywGLLli0SEREhhQoVMq0Quvzxxx/yxhtvSJEiRUyZwMBAU8bVnTt3zEhRus8qc+7cObcy1rpVJjaDBg2Sy5cvO5dTp04lwlkCAAAAKUOy7QqluRWaL+FKcyN0e5cuXcx6zZo15dKlS6Z1o0qVKmbbhg0bTG5G9erVnWXeeecduX37tqRLl85s0xGkSpUqFWc3KJU+fXqzAAAAAEjmgYXON3Hs2DHn+vHjx82ITZojoS0VOXPmdCuvgYG2MmhQoMqUKSONGzeW7t27y7Rp00zw0Lt3b2nXrp1zaNoOHTrIe++9Z+a3GDhwoOzfv990sRo/fnwSny0AAACQcnk0sNi1a5fUq1fPud6/f3/zGBwcbHIr4kOHk9VgokGDBmY0qNatW8vEiROd+zU/Yu3atdKrVy/TqpErVy4ZOnQoQ80CAAAACcjH4XA4EvKAKZWOCqVBiuZb6CzfAAAgYX3WYZWnq5CidZt/77nDALvXwMk2eRsAAACA9yCwAAAAAGAbgQUAAAAA2wgsAAAAANhGYAEAAADANgILAAAAALYRWAAAAACwjcACAAAAgG0EFgAAAABsI7AAAAAAYBuBBQAAAADbCCwAAAAA2EZgAQAAAMA2AgsAAAAAthFYAAAAALCNwAIAAACAbQQWAAAAAGwjsAAAAABgG4EFAAAAANsILAAAAADYRmABAAAAwDYCCwAAAAC2EVgAAAAAsI3AAgAAAIBtBBYAAAAAbCOwAAAAAGAbgQUAAAAA2wgsAAAAANhGYAEAAADANgILAAAAALYRWAAAAACwjcACAAAAgG0EFgAAAABsI7AAAAAAYBuBBQAAAADbCCwAAAAAeHdgsXnzZmnevLnkz59ffHx8ZMmSJc59t2/floEDB0qFChUkU6ZMpkznzp3l9OnTbse4cOGCdOzYUbJmzSoBAQHStWtXuXbtmluZvXv3Sp06dcTf318KFiwoo0ePTrJzBAAAAFIDjwYW169fl0qVKsnkyZPv2nfjxg3ZvXu3DBkyxDx+9913cvjwYXnuuefcymlQceDAAQkNDZUVK1aYYKVHjx7O/VeuXJFGjRpJ4cKFJTw8XMaMGSPDhg2T6dOnJ8k5AgAAAKmBryffvEmTJmaJTbZs2Uyw4OqTTz6RJ554Qk6ePCmFChWSgwcPyurVq2Xnzp1StWpVU2bSpEnStGlTGTt2rGnlmDdvnty6dUtmzZolfn5+Uq5cOdmzZ4+MGzfOLQABAAAAkEpyLC5fvmy6TGmXJxUWFmaeW0GFatiwoaRJk0a2b9/uLFO3bl0TVFiCgoJM68fFixc9cBYAAABAyuPRFosHcfPmTZNz0b59e5NPoc6ePSt58uRxK+fr6ys5cuQw+6wyRYsWdSuTN29e577s2bPH+n6RkZFmce1SBQAAAMCLWyw0kbtNmzbicDhk6tSpSfKeISEhpjuWtWjSNwAAAAAvDSysoOKPP/4wORdWa4UKDAyUiIgIt/J37twxI0XpPqvMuXPn3MpY61aZ2AwaNMh0vbKWU6dOJfCZAQAAAClHGm8IKo4ePSrr1q2TnDlzuu2vWbOmXLp0yYz2ZNmwYYNER0dL9erVnWV0pCg9lkUDlFKlSsXZDUqlT5/eBDGuCwAAAIBkGFjofBM6QpMu6vjx4+a5jvqkgcALL7wgu3btMiM7RUVFmZwIXXSUJ1WmTBlp3LixdO/eXXbs2CE//fST9O7dW9q1a2dGhFIdOnQwids6v4UOS7tw4UL5+OOPpX///p48dQAAACBF8WjytgYN9erVc65bF/vBwcFmrolly5aZ9cqVK7u97ocffpCnn37aPNegQ4OJBg0amNGgWrduLRMnTnSW1fyItWvXSq9evaRKlSqSK1cuGTp0KEPNAgAAACklsNDgQBOy43KvfRYdAWr+/Pn3LFOxYkXZsmXLQ9URAAAAgJfnWAAAAADwDgQWAAAAAGwjsAAAAABgG4EFAAAAANsILAAAAADYRmABAAAAwDYCCwAAAAC2EVgAAAAAsI3AAgAAAIBtBBYAAAAAbCOwAAAAAGAbgQUAAAAA2wgsAAAAANhGYAEAAADANgILAAAAALYRWAAAAACwjcACAAAAgG0EFgAAAABsI7AAAAAAYBuBBQAAAADbCCwAAAAA2EZgAQAAAMA2AgsAAAAAthFYAAAAALCNwAIAAACAbQQWAAAAAGwjsAAAAABgG4EFAAAAANsILAAAAADYRmABAAAAwDYCCwAAAAC2EVgAAAAAsI3AAgAAAIBtBBYAAAAAbCOwAAAAAGAbgQUAAAAA7w4sNm/eLM2bN5f8+fOLj4+PLFmyxG2/w+GQoUOHSr58+SRDhgzSsGFDOXr0qFuZCxcuSMeOHSVr1qwSEBAgXbt2lWvXrrmV2bt3r9SpU0f8/f2lYMGCMnr06CQ5PwAAACC18Ghgcf36dalUqZJMnjw51v0aAEycOFGmTZsm27dvl0yZMklQUJDcvHnTWUaDigMHDkhoaKisWLHCBCs9evRw7r9y5Yo0atRIChcuLOHh4TJmzBgZNmyYTJ8+PUnOEQAAAEgNfD355k2aNDFLbLS1YsKECTJ48GBp0aKF2fb5559L3rx5TctGu3bt5ODBg7J69WrZuXOnVK1a1ZSZNGmSNG3aVMaOHWtaQubNmye3bt2SWbNmiZ+fn5QrV0727Nkj48aNcwtAAAAAAKTAHIvjx4/L2bNnTfcnS7Zs2aR69eoSFhZm1vVRuz9ZQYXS8mnSpDEtHFaZunXrmqDCoq0ehw8flosXLybpOQEAAAAplUdbLO5FgwqlLRSudN3ap4958uRx2+/r6ys5cuRwK1O0aNG7jmHty549e6zvHxkZaRbXLlUAAAAAvKzFwtNCQkJMC4m1aNI3AAAAAC8LLAIDA83juXPn3LbrurVPHyMiItz237lzx4wU5VomtmO4vkdsBg0aJJcvX3Yup06dSqAzAwAAAFKeZBtYaPclvfBfv369W3ckzZ2oWbOmWdfHS5cumdGeLBs2bJDo6GiTi2GV0ZGibt++7SyjI0iVKlUqzm5QKn369GYIW9cFAAAAQDIMLHS+CR2hSRcrYVufnzx50sxr0a9fPxk5cqQsW7ZM9u3bJ507dzYjPbVs2dKUL1OmjDRu3Fi6d+8uO3bskJ9++kl69+5tRozScqpDhw4mcVvnt9BhaRcuXCgff/yx9O/f35OnDgAAAKQoHk3e3rVrl9SrV8+5bl3sBwcHy5w5c+Stt94yc13osLDaMvHkk0+a4WV1ojuLDierwUSDBg3MaFCtW7c2c19YND9i7dq10qtXL6lSpYrkypXLTLrHULMAAABAwvFx6IQRuC/thqVBiuZb0C0KAICE91mHVZ6uQorWbX7sc4cBCXUNnGxzLAAAAAB4DwILAAAAALYRWAAAAACwjcACAAAAgG0EFgAAAABsI7AAAAAAYBuBBQAAAADbCCwAAAAA2EZgAQAAAMAzgcWjjz4q58+fv2v7pUuXzD4AAAAAqctDBRYnTpyQqKiou7ZHRkbKX3/9lRD1AgAAAOBFfB+k8LJly5zP16xZI9myZXOua6Cxfv16KVKkSMLWEAAAAEDKCixatmxpHn18fCQ4ONhtX7p06UxQ8dFHHyVsDQEAAACkrMAiOjraPBYtWlR27twpuXLlSqx6AQAAAEipgYXl+PHjCV8TAAAAAKkrsFCaT6FLRESEsyXDMmvWrISoGwAAAICUHFi89957Mnz4cKlatarky5fP5FwAAAAASL0eKrCYNm2azJkzRzp16pTwNQIAAACQOuaxuHXrltSqVSvhawMAAAAg9QQW3bp1k/nz5yd8bQAAAACknq5QN2/elOnTp8u6deukYsWKZg4LV+PGjUuo+gEAAADwAg8VWOzdu1cqV65snu/fv99tH4ncAAAAQOrzUIHFDz/8kPA1AQAAAJC6ciwAAAAAwHaLRb169e7Z5WnDhg0Pc1gAAAAAqSmwsPIrLLdv35Y9e/aYfIvg4OCEqhsAAACAlBxYjB8/Ptbtw4YNk2vXrtmtEwAAAIDUnGPx0ksvyaxZsxLykAAAAABSW2ARFhYm/v7+CXlIAAAAACm1K1SrVq3c1h0Oh5w5c0Z27dolQ4YMSai6AQAAAEjJgUW2bNnc1tOkSSOlSpWS4cOHS6NGjRKqbgAAAABScmAxe/bshK8JAAAAgNQVWFjCw8Pl4MGD5nm5cuXkscceS6h6AQAAAEjpgUVERIS0a9dONm7cKAEBAWbbpUuXzMR5CxYskNy5cyd0PQEAAACktFGh+vTpI1evXpUDBw7IhQsXzKKT4125ckX69u2b8LUEAAAAkPJaLFavXi3r1q2TMmXKOLeVLVtWJk+eTPI2AAAAkAo9VItFdHS0pEuX7q7tuk33AQAAAEhdHiqwqF+/vrz22mty+vRp57a//vpLXn/9dWnQoEGCVS4qKsrMi1G0aFHJkCGDFCtWTEaMGGHmzbDo86FDh0q+fPlMmYYNG8rRo0fdjqNdtTp27ChZs2Y1OSFdu3aVa9euJVg9AQAAgNTuoQKLTz75xORTFClSxFzs66IX/7pt0qRJCVa5Dz/8UKZOnWreT0ef0vXRo0e7vYeuT5w4UaZNmybbt2+XTJkySVBQkNy8edNZRoMKzQcJDQ2VFStWyObNm6VHjx4JVk8AAAAgtfNxuN7+fwD6Ms2zOHTokFnXfAttLUhIzz77rOTNm1dmzpzp3Na6dWvTMvHll1+aOuTPn1/eeOMNefPNN83+y5cvm9fMmTPHjFylAYnmf+zcuVOqVq3qzBFp2rSp/Pnnn+b18aFBk04MqMfXlg8AAJCwPuuwytNVSNG6zW/i6SrACz3INfADtVhs2LDBXKTrG/j4+MgzzzxjRojSpVq1amYuiy1btkhCqVWrlqxfv16OHDli1n/55Rf58ccfpUmT//vDOH78uJw9e9YtoNETr169uoSFhZl1fdTuT1ZQobS8zhauLRxxiYyMNOfpugAAAABIgMBiwoQJ0r1791ijFb2gf+WVV2TcuHGSUN5++23T6lC6dGmTGK4T8PXr1890bVIaVChtoXCl69Y+fcyTJ4/bfl9fX8mRI4ezTGxCQkLMOVlLwYIFE+y8AAAAgFQdWGiLQePGjePcr0PN6mzcCeXrr7+WefPmyfz582X37t0yd+5cGTt2rHlMbIMGDTJNPtZy6tSpRH9PAAAAIFXMY3Hu3LlYh5l1HszXV/7++29JKAMGDHC2WqgKFSrIH3/8YVoTgoODJTAw0FkvHRXKtZ6VK1c2z7WMzhTu6s6dO2akKOv1sUmfPr1ZAAAAACRwi8UjjzxiZtiOy969e90u8O26ceOGyYVwlTZtWudcGToSlQYHmodh0VwIzZ2oWbOmWdfHS5cuubWkaK6IHkNzMQAAAAAkcYuFjqSk80podyh/f3+3ff/++6+8++67ZiSnhNK8eXN5//33pVChQiYx/OeffzY5HP/5z3/Mfk0g15yLkSNHSokSJUygofXTkZ5atmzpHK1K66u5ITok7e3bt6V3796mFSS+I0IBAAAASMDhZrWL0eOPP25aDfTivFSpUma7Djk7efJkM6Gd5kLETKZ+WFevXjWBwuLFi013Jg0E2rdvbybE8/PzM2W0+hrQTJ8+3bRMPPnkkzJlyhQpWbKk8zja7Unru3z5ctMCokPW6twXmTNnjnddGG4WAIDExXCziYvhZvEwHuQa+IHnsdAch549e8qaNWucM2Bry4FOSqfBhbYapEQEFgAAJC4Ci8RFYIHEvgZ+oK5QqnDhwrJy5Uq5ePGiHDt2zAQX2g0pe/bsD1VZAAAAAN7vgQMLiwYSOikeAAAAADzQqFAAAAAAEBsCCwAAAAC2EVgAAAAAsI3AAgAAAIBtBBYAAAAAbCOwAAAAAGAbgQUAAAAA2wgsAAAAANhGYAEAAADANgILAAAAALYRWAAAAACwjcACAAAAgG0EFgAAAABsI7AAAAAAYBuBBQAkY3/99Ze89NJLkjNnTsmQIYNUqFBBdu3aFWvZV199VXx8fGTChAmx7o+MjJTKlSubMnv27EnkmgMAUhsCCwBIpi5evCi1a9eWdOnSyapVq+TXX3+Vjz76SLJnz35X2cWLF8u2bdskf/78cR7vrbfeuud+AADs8LX1agBAovnwww+lYMGCMnv2bOe2okWLxtqq0adPH1mzZo00a9Ys1mNpYLJ27Vr59ttvzXMAABIaLRYAkEwtW7ZMqlatKi+++KLkyZNHHnvsMZkxY4ZbmejoaOnUqZMMGDBAypUrF+txzp07J927d5cvvvhCMmbMmES1BwCkNgQWAJBM/f777zJ16lQpUaKEaY3o2bOn9O3bV+bOnevWquHr62u2x8bhcMjLL79s8i80SAEAILHQFQoAkiltjdBg4IMPPjDr2mKxf/9+mTZtmgQHB0t4eLh8/PHHsnv3bpOQHZtJkybJ1atXZdCgQUlcewBAakOLBQAkU/ny5ZOyZcu6bStTpoycPHnSPN+yZYtERERIoUKFTKuFLn/88Ye88cYbUqRIEVNmw4YNEhYWJunTpzf7ixcvbrZrwKLBCQAACYUWCwBIpnREqMOHD7ttO3LkiBQuXNg819yKhg0buu0PCgoy27t06WLWJ06cKCNHjnTuP336tCmzcOFCqV69epKcBwAgdSCwAIBk6vXXX5datWqZrlBt2rSRHTt2yPTp082idG4LXVzp0LSBgYFSqlQps66tGa4yZ85sHosVKyYFChRIsnMBAKR8dIUCgGSqWrVqZn6Kr776SsqXLy8jRowwk9917NjR01UDAOAutFgAQDL27LPPmiW+Tpw4cc/9mnuhI0UBAJDQaLEAAAAAYBuBBQAAAADbCCwAAAAA2EaOBQDE4bMOqzxdhRSt2/wmnq4CACAB0WIBAAAAwDYCCwAAAHi1YcOGiY+Pj9tSunRp52h5MfdZy6JFi0yZ8+fPS+PGjSV//vySPn16KViwoPTu3VuuXLni4TPzLnSFAgAAgNcrV66crFu3zrnu6/t/l7kaJJw5c8atrE40OmbMGGnS5P+6ZKZJk0ZatGghI0eOlNy5c8uxY8ekV69ecuHCBZk/f34Sn4n3IrAAAACA19NAIjAw8K7tadOmvWu7Tj7apk0byZw5s1nPnj279OzZ07m/cOHC8t///tcEH4g/ukIBAADA6x09etR0ZXr00UelY8eOcvLkyVjLhYeHy549e6Rr165xHuv06dPy3XffyVNPPZWINU55kn1g8ddff8lLL70kOXPmlAwZMkiFChVk165dzv06g+zQoUMlX758Zn/Dhg3ND8uVNmPpDyxr1qwSEBBgfkjXrl3zwNkAAAAgoVWvXl3mzJkjq1evlqlTp8rx48elTp06cvXq1bvKzpw5U8qUKSO1atW6a1/79u0lY8aM8sgjj5jrxs8++yyJziBlSNaBxcWLF6V27dqSLl06WbVqlfz666/y0UcfmeYqy+jRo2XixIkybdo02b59u2TKlEmCgoLk5s2bzjIaVBw4cEBCQ0NlxYoVsnnzZunRo4eHzgoAAAAJSXMlXnzxRalYsaK5Dly5cqVcunRJvv76a7dy//77r8mZiKu1Yvz48bJ7925ZunSp/Pbbb9K/f/8kOoOUIVnnWHz44Ycm4Wb27NnObUWLFnVrrZgwYYIMHjzYJNyozz//XPLmzStLliyRdu3aycGDB030unPnTqlataopM2nSJGnatKmMHTvWNJkBAAAg5dAeKiVLljRJ2K6++eYbuXHjhnTu3DnW12kuhi46olSOHDlMq8eQIUNMzxh4eYvFsmXLTDCgEWiePHnksccekxkzZjj3azPX2bNnTfcnS7Zs2UxzWFhYmFnXR/1xWUGF0vKa/a8tHHGJjIw0Q4y5LgAAAEj+tMu7tjjEDAi0G9Rzzz1nRn66n+joaOc1IVJAYPH777+bfnIlSpSQNWvWmGz9vn37yty5c81+DSqUtlC40nVrnz5qUBJz1ACNQq0ysQkJCTFBirVoywkAAACSnzfffFM2bdpk5qzYunWrPP/882Y0KM2ZsGjrhXaH79at212v165T2kNm//795hjff/+9vPrqq6ZLfpEiRZL4bLxXsu4KpZGitjR88MEHZl1bLPQL13yK4ODgRH3vQYMGufWr0xYLggsAAIDk588//zRBhE50p60RTz75pGzbts2tZWLWrFlSoEABadSo0V2v1wGAtFfM66+/bloo9JqvVatW8vbbbyfxmXi3ZB1YaPNV2bJl3bZpFv+3335rnltjEp87d86tqUvXK1eu7CwTERHhdow7d+6YkaJiG+vYorMu6gIAAIDkbcGCBfctozeqrZvVMdWrV8+0dCAFd4XS5qfDhw+7bTty5IiZtMRK5NbgYP369W4tC5o7UbNmTbOujzoqgI5ZbNmwYYNpDdFcDAAAAAApvMVCm6N0jGGNLnV2xB07dpgp2HVRPj4+0q9fPzP9uuZhaKChmfs60lPLli2dLRyNGzeW7t27my5Ut2/flt69e5sRoxgRCgAAAEgFgUW1atXMlOua7zB8+HATOOjwsjovheWtt96S69evm3kptGVC+9Tp8LL+/v7OMvPmzTPBRIMGDcxoUK1btzZzXwAAAABIGD4OnQwC96VdrHR0qMuXL5uZGAGkfJ91WOXpKqRo3eY38XQVkMzwN5e4+JtDYl8DJ+sWCwAAACRvBISJr5uXBIXJOnkbAAAAgHcgsAAAAABgG4EFAAAAANsILAAAAADYRmABAAAAwDYCCwAAAAC2EVgAAAAAsI3AAgCARDRq1Cjx8fGRfv36mfUTJ06Y9diWRYsWmTJz5syJs0xERISHzwgAYscEeQAAJJKdO3fKp59+KhUrVnRuK1iwoJw5c8at3PTp02XMmDHSpMn/TYLVtm1bady4sVuZl19+WW7evCl58uRJotoDwIMhsAAAIBFcu3ZNOnbsKDNmzJCRI0c6t6dNm1YCAwPdyi5evFjatGkjmTNnNusZMmQwi+Xvv/+WDRs2yMyZM5PwDADgwdAVCgCARNCrVy9p1qyZNGzY8J7lwsPDZc+ePdK1a9c4y3z++eeSMWNGeeGFFxKhpgCQMGixAAAggS1YsEB2795tukLdj7ZClClTRmrVqnXPMh06dHBrxQCA5IbAAgCABHTq1Cl57bXXJDQ0VPz9/e9Z9t9//5X58+fLkCFD4iwTFhYmBw8elC+++CIRagsACYfAAgCABKRdm3Tkpscff9y5LSoqSjZv3iyffPKJREZGmjwL9c0338iNGzekc+fOcR7vs88+k8qVK0uVKlWSpP4A8LAILAAASEANGjSQffv2uW3r0qWLlC5dWgYOHOgMKqwuTs8995zkzp07zgTwr7/+WkJCQhK93gBgF4EFAAAJKEuWLFK+fHm3bZkyZZKcOXO6bT927JhpxVi5cmWcx1q4cKHcuXNHXnrppUStMwAkBEaFAgDAA2bNmiUFChSQRo0axVlGWzRatWolAQEBSVo3AHgYtFgAAJDINm7ceNe2Dz74wCz3snXr1kSsFQAkLFosAAAAANhGYAEAAADANgILAAAAALaRYwEASFE+67DK01VI8brNb+LpKgBIhmixAAAAAGAbgQUAAAAA2wgsAAAAANhGYAEAAADANgILAAAAALYRWAAAAACwjcACAAAAgG0EFgAAAABsI7AAAAAAYBuBBQAAAADbCCwAAAAA2EZgAQAAAMA2AgsAAAAAqSuwGDVqlPj4+Ei/fv2c227evCm9evWSnDlzSubMmaV169Zy7tw5t9edPHlSmjVrJhkzZpQ8efLIgAED5M6dOx44AwAAACBl8prAYufOnfLpp59KxYoV3ba//vrrsnz5clm0aJFs2rRJTp8+La1atXLuj4qKMkHFrVu3ZOvWrTJ37lyZM2eODB061ANnAQAAAKRMXhFYXLt2TTp27CgzZsyQ7NmzO7dfvnxZZs6cKePGjZP69etLlSpVZPbs2SaA2LZtmymzdu1a+fXXX+XLL7+UypUrS5MmTWTEiBEyefJkE2wAAAAASCWBhXZ10laHhg0bum0PDw+X27dvu20vXbq0FCpUSMLCwsy6PlaoUEHy5s3rLBMUFCRXrlyRAwcOxPmekZGRpozrAgAAACB2vnFsTzYWLFggu3fvNl2hYjp79qz4+flJQECA23YNInSfVcY1qLD2W/viEhISIu+9914CnQUAAACQsiXrFotTp07Ja6+9JvPmzRN/f/8kfe9BgwaZrlbWonUBAAAA4IWBhXZ1ioiIkMcff1x8fX3NognaEydONM+15UHzJC5duuT2Oh0VKjAw0DzXx5ijRFnrVpnYpE+fXrJmzeq2AAAAAPDCwKJBgwayb98+2bNnj3OpWrWqSeS2nqdLl07Wr1/vfM3hw4fN8LI1a9Y06/qox9AAxRIaGmoChbJly3rkvAAAAICUJlnnWGTJkkXKly/vti1Tpkxmzgpre9euXaV///6SI0cOEyz06dPHBBM1atQw+xs1amQCiE6dOsno0aNNXsXgwYNNQri2SgAAAABI4YFFfIwfP17SpEljJsbTkZx0xKcpU6Y496dNm1ZWrFghPXv2NAGHBibBwcEyfPhwj9YbAAAASEm8LrDYuHGj27omdeucFLrEpXDhwrJy5cokqB0AAACQOiXrHAsAAAAA3oHAAgAAAIBtBBYAAAAAbCOwAAAAAGAbgQUAAAAA2wgsAAAAANhGYAEAAADANgILAAAAALYRWAAAAACwjcACAAAAgG0EFgAAAABsI7AAAAAAYBuBBQAAAADbCCwAAAAA2EZgAQAAAMA2AgsAAAAAthFYAAAAALCNwALxFhISItWqVZMsWbJInjx5pGXLlnL48GG3Mq+88ooUK1ZMMmTIILlz55YWLVrIoUOH3Mrs3LlTGjRoIAEBAZI9e3YJCgqSX375JYnPBgAAAAmJwALxtmnTJunVq5ds27ZNQkND5fbt29KoUSO5fv26s0yVKlVk9uzZcvDgQVmzZo04HA5TJioqyuy/du2aNG7cWAoVKiTbt2+XH3/80QQqGlzo8QAAAOCdfD1dAXiP1atXu63PmTPHtFyEh4dL3bp1zbYePXo49xcpUkRGjhwplSpVkhMnTpiWDG29uHDhggwfPlwKFixoyr377rtSsWJF+eOPP6R48eJJfFYAAABICLRY4KFdvnzZPObIkSPW/dqSoa0XRYsWdQYRpUqVkpw5c8rMmTPl1q1b8u+//5rnZcqUMYEIAAAAvBOBBR5KdHS09OvXT2rXri3ly5d32zdlyhTJnDmzWVatWmW6Tfn5+Zl92u1p48aN8uWXX5o8DC2jLSFazteXBjQAAABvRWCBh6K5Fvv375cFCxbcta9jx47y888/m5yMkiVLSps2beTmzZtmn7ZQdO3a1QQkmqvx008/mcCkWbNmZh8AAAC8E7eI8cB69+4tK1askM2bN0uBAgXu2p8tWzazlChRQmrUqGFGflq8eLG0b99e5s+fb/ItwsLCJE2a/4trdZuWWbp0qbRr184DZwQAAAC7CCwQbzrCU58+fUyQoN2ZNHciPq/RJTIy0qzfuHHDBBQ+Pj7OMta6dq8CAACAd6IrFB6o+5PmRmgLg+ZKnD171ixWF6bff//dzHWho0SdPHlStm7dKi+++KLJpWjatKkp88wzz8jFixfNsXRI2gMHDkiXLl1MfkW9evU8fIYAAAB4WAQWiLepU6eakaCefvppyZcvn3NZuHCh2e/v7y9btmwxQYQOG9u2bVsTgGiAocPSqtKlS8vy5ctl7969UrNmTalTp46cPn3aJHDrsQAAAOCd6AqFeNMuTfeSP39+Wbly5X2Po60WugAAACDloMUCAAAAgG0EFgAAAABsI7AAAAAAYBuBBQAAAADbSN72Ip91WOXpKqRo3eY38XQVAAAAvBYtFgAAAABsI7AAAAAAYBuBBQAAAICUH1iEhIRItWrVzAzOOntzy5Yt5fDhw25lbt68Kb169ZKcOXNK5syZpXXr1nLu3Dm3MidPnpRmzZpJxowZzXEGDBggd+7cSeKzAQAAAFKmZB9YbNq0yQQN27Ztk9DQULl9+7Y0atRIrl+/7izz+uuvy/Lly2XRokWm/OnTp6VVq1bO/VFRUSaouHXrlmzdulXmzp0rc+bMkaFDh3rorAAAAICUJdmPCrV69Wq3dQ0ItMUhPDxc6tatK5cvX5aZM2fK/PnzpX79+qbM7NmzpUyZMiYYqVGjhqxdu1Z+/fVXWbduneTNm1cqV64sI0aMkIEDB8qwYcPEz8/PQ2cHAAAApAzJvsUiJg0kVI4cOcyjBhjaitGwYUNnmdKlS0uhQoUkLCzMrOtjhQoVTFBhCQoKkitXrsiBAweS/BwAAACAlCbZt1i4io6Oln79+knt2rWlfPnyZtvZs2dNi0NAQIBbWQ0idJ9VxjWosPZb+2ITGRlpFosGIQAAAABSQIuF5lrs379fFixYkCRJ49myZXMuBQsWTPT3BAAAALyV1wQWvXv3lhUrVsgPP/wgBQoUcG4PDAw0SdmXLl1yK6+jQuk+q0zMUaKsdatMTIMGDTLdrqzl1KlTiXBWAAAAQMqQ7AMLh8NhgorFixfLhg0bpGjRom77q1SpIunSpZP169c7t+lwtDq8bM2aNc26Pu7bt08iIiKcZXSEqaxZs0rZsmVjfd/06dOb/a4LAAAAAC/NsdDuTzri09KlS81cFlZOhHZPypAhg3ns2rWr9O/f3yR0awDQp08fE0zoiFBKh6fVAKJTp04yevRoc4zBgwebY2sAAQAAACCFBxZTp041j08//bTbdh1S9uWXXzbPx48fL2nSpDET42nCtY74NGXKFGfZtGnTmm5UPXv2NAFHpkyZJDg4WIYPH57EZwMAAACkTL7e0BXqfvz9/WXy5MlmiUvhwoVl5cqVCVw7AAAAAF6RYwEAAAAg+SOwAAAAAGAbgQUAAAAA2wgsAAAAANhGYAEAAADANgILAAAAALYRWAAAAACwjcACAAAAgG0EFgAAAABsI7AAAAAAYBuBBQAAAADbCCwAAAAA2EZgAQAAAMA2AgsAAAAAthFYAAAAALCNwAIAAACAbQQWAAAAAGwjsAAAAABgG4EFAAAAANsILAAAAADYRmABAAAAwDYCCwAAAAC2EVgAAAAAsI3AAgAAAIBtBBYAAAAAbCOwAAAAAGAbgQUAmTp1qlSsWFGyZs1qlpo1a8qqVas8XS0AAOBFCCwASIECBWTUqFESHh4uu3btkvr160uLFi3kwIEDnq4aAADwEr6ergAAz2vevLnb+vvvv29aMbZt2yblypXzWL0AAID3ILAA4CYqKkoWLVok169fN12iAAAA4oPAAoCxb98+E0jcvHlTMmfOLIsXL5ayZct6uloAAMBLkGMBwChVqpTs2bNHtm/fLj179pTg4GD59ddfPV0tAADgJWixAGD4+flJ8eLFzfMqVarIzp075eOPP5ZPP/3U01UDAABegBYLALGKjo6WyMhIT1cDAAB4CVosAMigQYOkSZMmUqhQIbl69arMnz9fNm7cKGvWrPF01QAAgJcgsAAgERER0rlzZzlz5oxky5bNTJanQcUzzzzj6aoBAAAvkaq6Qk2ePFmKFCki/v7+Ur16ddmxY4enqwQkCzNnzpQTJ06Yrk8aZKxbt46gAgAAPJBUE1gsXLhQ+vfvL++++67s3r1bKlWqJEFBQeYiCgAAAIA9qSawGDdunHTv3l26dOlixuafNm2aZMyYUWbNmuXpqgEAAABeL1UEFrdu3ZLw8HBp2LChc1uaNGnMelhYmEfrBgAAAKQEqSJ5+59//pGoqCjJmzev23ZdP3ToUKyv0b7mrkNtXr582TxeuXJFPOXf2zc89t6pQWJ9t3O7hibKcfH/Bc9MnHwQ/ua882+O7y3x8d15J74373XFg9ef1ns7HI77lk0VgcXDCAkJkffee++u7QULFvRIfZD4+n7j6RrgYfHdeSe+N+/Fd+ed+N68V99k8N3pcPQ6cqSk9sAiV65ckjZtWjl37pzbdl0PDAyMc1x/TfZ2nSzswoULkjNnTvHx8Un0Ons7jW41CDt16pRkzZrV09VBPPG9eS++O+/Fd+ed+N68F9/dg9GWCg0q8ufPf9+yqSKw8PPzkypVqsj69eulZcuWzkBB13v37h3ra9KnT28WVwEBAUlS35RE/2D5o/U+fG/ei+/Oe/HdeSe+N+/Fdxd/92upSFWBhdLWh+DgYKlatao88cQTMmHCBLl+/boZJQoAAACAPakmsGjbtq38/fffMnToUDl79qxUrlxZVq9efVdCNwAAAIAHl2oCC6XdnuLq+oSEpd3IdDLCmN3JkLzxvXkvvjvvxXfnnfjevBffXeLxccRn7CgAAAAASO0T5AEAAABIXAQWAAAAAGwjsAAAAABgG4EFEtzkyZOlSJEi4u/vL9WrV5cdO3Z4ukqIh82bN0vz5s3NBDg6CeSSJUs8XSXEQ0hIiFSrVk2yZMkiefLkMXP1HD582NPVwn1MnTpVKlas6BxHv2bNmrJq1SpPVwsPaNSoUeb/l/369fN0VXAfw4YNM9+V61K6dGlPVyvFIbBAglq4cKGZM0RHW9i9e7dUqlRJgoKCJCIiwtNVw33ovC76fWlgCO+xadMm6dWrl2zbtk1CQ0Pl9u3b0qhRI/N9IvkqUKCAuSgNDw+XXbt2Sf369aVFixZy4MABT1cN8bRz50759NNPTYAI71CuXDk5c+aMc/nxxx89XaUUh1GhkKC0hULvnn7yySfOGc4LFiwoffr0kbffftvT1UM86Z2cxYsXO2eqh/fQ+Xq05UIDjrp163q6OngAOXLkkDFjxkjXrl09XRXcx7Vr1+Txxx+XKVOmyMiRI83cWDrxLpJ3i4W2xO/Zs8fTVUnRaLFAgrl165a5+9awYUPntjRp0pj1sLAwj9YNSC0uX77svEiFd4iKipIFCxaYVibtEoXkT1sJmzVr5vbvHZK/o0ePmu6+jz76qHTs2FFOnjzp6SqlOKlqgjwkrn/++cf8AxlzNnNdP3TokMfqBaQW2kKofb1r164t5cuX93R1cB/79u0zgcTNmzclc+bMppWwbNmynq4W7kODQO3qq12h4F09KubMmSOlSpUy3aDee+89qVOnjuzfv9/kqCFhEFgAQAq6i6r/SNJv2DvoBY52y9BWpm+++UaCg4NNFzaCi+Tr1KlT8tprr5l8Jh2gBN6jSZMmzueaF6OBRuHCheXrr7+m+2ECIrBAgsmVK5ekTZtWzp0757Zd1wMDAz1WLyA16N27t6xYscKM7qWJwUj+/Pz8pHjx4uZ5lSpVzB3wjz/+2CQEI3nS7r46GInmV1i0pV7/7jS3MDIy0vw7iOQvICBASpYsKceOHfN0VVIUciyQoP9I6j+O69evd+uaoev0GwYSh46/oUGFdqPZsGGDFC1a1NNVwkPS/1/qhSmSrwYNGpgubNrSZC1Vq1Y1/fX1OUGFdyXg//bbb5IvXz5PVyVFocUCCUqHmtXmfP0f7RNPPGFGydCExC5duni6aojH/2Rd79wcP37c/EOpScCFChXyaN1w7+5P8+fPl6VLl5p+wmfPnjXbs2XLJhkyZPB09RCHQYMGma4Z+rd19epV8x1u3LhR1qxZ4+mq4R70byxm/lKmTJkkZ86c5DUlc2+++aaZq0m7P50+fdoMi6+BYPv27T1dtRSFwAIJqm3btma4y6FDh5oLHB2Cb/Xq1XcldCP50bH069Wr5xYkKg0UNeENyXeiNfX000+7bZ89e7a8/PLLHqoV7ke703Tu3NkkkWoQqH2+Nah45plnPF01IEX6888/TRBx/vx5yZ07tzz55JNm/h99joTDPBYAAAAAbCPHAgAAAIBtBBYAAAAAbCOwAAAAAGAbgQUAAAAA2wgsAAAAANhGYAEAAADANgILAAAAALYRWAAAAACwjcACAAAAgG0EFgCQDISFhUnatGmlWbNmnq5Ksjds2DCpXLlyvMpeuXJF3nnnHSldurT4+/tLYGCgNGzYUL777jtxOBzxOsbGjRvFx8dHLl26ZLPmAJCy+Xq6AgAAkZkzZ0qfPn3M4+nTpyV//vyerpLX00DgySeflMuXL8vIkSOlWrVq4uvrK5s2bZK33npL6tevLwEBAeJtbt26JX5+fp6uBgDchRYLAPCwa9euycKFC6Vnz56mxWLOnDlu+y9evCgdO3aU3LlzS4YMGaREiRIye/Zs50Vm7969JV++fOaOfOHChSUkJMTt4rpbt27mtVmzZjUX07/88otzvz6vV6+eZMmSxeyvUqWK7Nq1y+z7448/pHnz5pI9e3bJlCmTlCtXTlauXOl2F3/NmjXy2GOPmXrpsSMiImTVqlVSpkwZc7wOHTrIjRs3nO8XHR1t6le0aFHzmkqVKsk333zj3G8dd/369VK1alXJmDGj1KpVSw4fPmz262fz3nvvmXprOV1ifl6W//3vf3LixAnZvn27BAcHS9myZaVkyZLSvXt32bNnj2TOnNmU++KLL8x76WegLRpaZz0Ppa/Xz0fp56Dv9/LLL8frXNSyZcvM96XfjR5n7ty5d7V+fPvtt+azTZ8+vRQpUkQ++ugjt2PothEjRkjnzp3NZ9qjRw/zWev37urvv/82AYd+dgDgEQ4AgEfNnDnTUbVqVfN8+fLljmLFijmio6Od+3v16uWoXLmyY+fOnY7jx487QkNDHcuWLTP7xowZ4yhYsKBj8+bNjhMnTji2bNnimD9/vvO1DRs2dDRv3ty89siRI4433njDkTNnTsf58+fN/nLlyjleeuklx8GDB83+r7/+2rFnzx6zr1mzZo5nnnnGsXfvXsdvv/1m6rZp0yaz74cfftB+RI4aNWo4fvzxR8fu3bsdxYsXdzz11FOORo0amXWtk77XqFGjnPUZOXKko3Tp0o7Vq1ebY86ePduRPn16x8aNG92OW716dbPtwIEDjjp16jhq1apl9t+4ccOcg9b7zJkzZtFtMUVFRTmyZ8/u6NGjR7w+/5UrV5r6hIWFOWrWrOlo0qSJ2Xfnzh3Ht99+a+p0+PBh836XLl2K17n8/vvvjnTp0jnefPNNx6FDhxxfffWV45FHHjHHunjxoimza9cuR5o0aRzDhw83x9djZMiQwTxaChcu7MiaNatj7NixjmPHjpll3rx55vxu3rzpLDdu3DhHkSJF3H47AJCUCCwAwMP0onnChAnm+e3btx25cuUyF9gWDQy6dOkS62v79OnjqF+/fqwXkxpk6AWp68Wn0sDl008/Nc+zZMnimDNnTqzHrlChgmPYsGGx7rMCgHXr1jm3hYSEmG16kW155ZVXHEFBQea51iNjxoyOrVu3uh2ra9eujvbt28d53O+//95s+/fff836u+++66hUqZLjXs6dO2deoxfbD0qDMH3t1atX3epkBQPxPZeBAwc6ypcv77b/nXfecTtWhw4dTPDmasCAAY6yZcu6BRYtW7Z0K6OfhQYWCxcudG6rWLFinN8XACQFukIBgAdpF58dO3ZI+/btzbrmALRt29bkWli0i9SCBQtMwrLmBmzdutW5T7vlaLeeUqVKSd++fWXt2rXOfdpdSLtZ5cyZ03T7sZbjx4/Lb7/9Zsr079/fdJXShOZRo0Y5tys9nuYm1K5dW959913Zu3fvXfWvWLGi83nevHlN16VHH33UbZvVrejYsWOmW9QzzzzjVp/PP//c7X1jHle7eSnrOPER38RsFR4ebrp8FSpUyHSHeuqpp8z2kydPxvma+JyLfrea1+HqiSeecFs/ePCg+Xxd6frRo0clKirKuU27arnSrlWdOnWSWbNmmfXdu3fL/v37nd20AMATSN4GAA/SAOLOnTtuydp6Uaz97T/55BPJli2bNGnSxOQ7aH5DaGioNGjQQHr16iVjx46Vxx9/3AQKmtewbt06adOmjQkStK+/BhV6Ua55CzFZScs6wpLmFHz//ffmGBpAaBDz/PPPm4AjKCjI7NOARfMJtP+/Jplb0qVL53yuuQOu69Y2zUVQWh+lx3vkkUfcyun5uop5XGUdJz40p0TP8dChQ/csd/36dXOOusybN8+8TgMKXdf8lbg8yLkkBM1xiUm/Hw02//zzT5Nzo3kXmmMDAJ5CiwUAeIgGFHqHWy/WtdXBWrSlQQONr776yllWL3g1AfnLL7+UCRMmyPTp0537NKFXWzlmzJhhksA1GfjChQsm6Dh79qxpBSlevLjbkitXLufrNaH59ddfN8FDq1atnInhqmDBgvLqq6+a4VnfeOMN8x4PS5On9aJbL9xj1kffJ740Qdn1bn5s0qRJI+3atTPBgo6yFVtgoJ+/Bh7nz583rTV16tQxw9LGbBmxRmByfc/4nIu2IlmJ8JadO3e6rWuS+08//eS2Tdf1O9Hhh++lQoUKpiVDv5P58+fLf/7zn3uWB4DERosFAHjIihUrzIhPXbt2NS0Trlq3bm1aM/SifujQoWa0Jh05KDIy0rxOL0jVuHHjTKuEjsykF9OLFi0yIxvp3XptuahZs6a0bNlSRo8ebS5W9SJb77Jri4Qeb8CAAfLCCy+YkY30zrde+Op7q379+pnWEn2d1vOHH35wvu/D0G5Gb775pglitPXBGgpWL6Q1ONLAKT50lCRtpdEgrECBAua4sbUSvP/++6a1pnr16ua5XoRrS8iWLVtM64ueq3Z/0sBh0qRJ5rPW7kQ6ApMrbQXQVhP93Js2bWpGgIrPubzyyivm+xk4cKD5jrW+1ghWViuMBmvaXUrfU4NDnc9EW6qmTJkSr89CWy10dCht0dDvFAA8KkkyOQAAd3n22WcdTZs2jXXf9u3bTZLvL7/84hgxYoSjTJkyZrSgHDlyOFq0aGFGHFLTp083I0ZlypTJJGo3aNDAjMhkuXLliknwzp8/vxmhSEeQ6tixo+PkyZOOyMhIR7t27cw2Pz8/U6Z3797OJGl9roneOtJR7ty5HZ06dXL8888/cSY060hG2bJlczuPmInWmmSuieqlSpUy9dHjanJ3zNGmXI/7888/m206IpaVON26dWtHQECA2e46glJMOoLT22+/7ShRooQ5x7x585qRshYvXuxMeNdRtHQ0JT1PHRFKR9zS4+r7WnTUpsDAQIePj48jODg4Xueili5dakbL0mM//fTTjqlTp7oloqtvvvnGJGvrMQoVKmRG+nKlydvjx4+P9fw0wVyTyP/73//G+RkAQFLx0f94NrQBACB10JaTadOmyalTpxLkeDrPRrFixUzri3Z9AwBPoisUAACJRLs0aVcnHZlLu0mNGTPmrontHsbt27dNbsjgwYOlRo0aBBUAkgUCCwAAEokOG6tD9moyveZzaE7FoEGDbB9XgxSdyVvzX2LO9g0AnkJXKAAAAAC2MdwsAAAAANsILAAAAADYRmABAAAAwDYCCwAAAAC2EVgAAAAAsI3AAgAAAIBtBBYAAAAAbCOwAAAAAGAbgQUAAAAAsev/AavAl+MlBnJ6AAAAAElFTkSuQmCC"
&gt;
&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;



&lt;h3&gt;Mass Descriptors&lt;/h3&gt;
&lt;p&gt;For mass abnormalities, the dataset includes shape and margin descriptors - clinically important features for diagnosis:&lt;/p&gt;

&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;

&lt;div class="inner_cell"&gt;
    &lt;div class="input_area"&gt;
&lt;div class=" highlight hl-ipython3"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;fig&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;axes&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;subplots&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;figsize&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;14&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

&lt;span class="n"&gt;shape_counts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;all_df&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;mass shape&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;dropna&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;value_counts&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;axes&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;barh&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;shape_counts&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;shape_counts&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;values&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;#e67e22&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;axes&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_title&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Mass Shape Distribution&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fontsize&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fontweight&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;bold&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;axes&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_xlabel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Count&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;margins_counts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;all_df&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;mass margins&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;dropna&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;value_counts&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;axes&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;barh&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;margins_counts&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;margins_counts&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;values&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;#16a085&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;axes&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_title&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Mass Margins Distribution&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fontsize&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fontweight&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;bold&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;axes&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_xlabel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Count&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tight_layout&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;show&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

    &lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;div class="output_wrapper"&gt;
&lt;div class="output"&gt;

&lt;div class="output_area"&gt;



&lt;div class="output_png output_subarea "&gt;
&lt;img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABXIAAAHqCAYAAACpyLalAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjcsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvTLEjVAAAAAlwSFlzAAAPYQAAD2EBqD+naQABAABJREFUeJzsnQm4VdMf91cpikKUNCgkhESDKckQShRCZKhMUSpDgylRJKKUIXOZZUpmlSJDMvWXMWmeJEokEe33+az3XeddZ9+9z9nnDnVvfT/Ps+vec/aw1trr3PPb3/UbSgVBEBghhBBCCCGEEEIIIYQQxZbSG7sBQgghhBBCCCGEEEIIITIjIVcIIYQQQgghhBBCCCGKORJyhRBCCCGEEEIIIYQQopgjIVcIIYQQQgghhBBCCCGKORJyhRBCCCGEEEIIIYQQopgjIVcIIYQQQgghhBBCCCGKORJyhRBCCCGEEEIIIYQQopgjIVcIIYQQQgghhBBCCCGKORJyhRBCCCGEEEIIIYQQopgjIVcIIYTYSNx4442mVKlSdhs9erTZXNl1111T47ChmTdvXuraRx55ZLG5NxtzTIQQQgghihPYaM4uwnYrSbh2Y9ttaN59993U9Tt16pR6nZ/d6+yzOY3JpoCEXCGEEBsFXyhjO+644/Ls8/nnn6ftw7Z27VpTnFm5cqW56qqrTN26dc1WW21lKlasaI0U+nfttdeaP//802wu97Rs2bJm++23N/Xq1TNnnnmmeeutt4rsumx33XWXKSlgNLt2/+9//9vYzRFCCCHEJmyjsijtt3WvvfbKs8+yZcvMlltumbbf999/v1HaWxzxxU9n5+6www6mfv36pnPnzuajjz4q9Gv+9ttvKXuxJDl9vPzyy6l2lzThvSRQZmM3QAghhIB33nnHzJ8/39SuXTv12kMPPWRKEn/99Zc5/PDDzbfffpt67Z9//jGrV6+2fZswYYLp2rWr2WabbczmwL///mtWrVplNx4ExowZY0466STz1FNPWYHb8cILLxTo4eemm26y/zN3Lr/88pyOrVatmnn//fftz9ttt53ZkEKuazdC/wEHHJD2fkHHRAghhBCFw6Zgo4b54YcfzJQpU8wRRxyRem3UqFFm3bp1pjhy9913W3vS2W7Fxc7FgYPt66+/tkLrhRdeaO677z4r8jqcnVmuXLl8CbnOXmzevHmaV20SDjzwwNT1q1atajakkPvYY4+lvKnDnrcFGRMhIVcIIUQxYf369eaRRx4xAwYMsL/jufr000+bksSTTz6ZEnEbNmxo+vTpYypXrmwWLFhgpk+fbsW5zYVWrVpZD+QVK1aYiRMnmgceeMCK2q+++qo599xzrYHnaNy48UZp45o1a8zWW29txffixsYaEyGEEEJsejZqFA8//HBKyA2CwP5e1DB2+XFowOu1OIEHLtvPP/9sbdvHH388NYb0z48S2xh2JnMWuxsnheJo5xbHNpUklFpBCCHERsd5Z+IJgOEBeG/+8ccfaZ6bYUhhcNhhh9mVedIYVKhQwQqod9xxh10lD3tAtmjRwoZAsUpepUoVc9BBB5mePXumVvjhxRdftMYFhg/hZTvvvLP9vW/fvtZAy8QXX3yR+plQovbt25tjjjnGGnojRoyw3hycLw5W8F1KhgYNGphJkyalvY/42aZNG7PbbrvZcaF9eIdw/nDYkh/+hSdwv379TI0aNUz58uWt0e631TF37lxz0UUX2XPShp122sn24bvvvjO5wrGMG+2l74yrY9y4cda7JVs+WMRfBE3uK+2h/dzD22+/PTXG/jGMbzjnlh9KyP7333+/DSdkDjz33HOxOXLD3HvvvWaPPfawngONGjWyY5okd1tUrl1+dt4VwP0L7xM3JszBBx980BxyyCF2DtCevffe24rm/jwOt2nGjBmme/fu9r4wBxDaGS8hhBBCbPo2alSfcDBw5588ebKZPXu2tRnihNbBgwdb26JmzZrWlmAxfJ999jHXX3+9XRz38e0YHBratWtn273ffvul9nnvvfdMkyZNrC1Tp04dc8899+Sx2zLZWWEb7tNPPzVHHXWUbRdjQ7vcPQN+vuWWW2wbaD/XrVWrlmndurUV6nOB45o1a2b7RZuxdX3vYTyeM+WDTdIWbHlsfn+8wjarb2c++uij5uabb7Z2PPPo448/js2R68N8xC7dZZddYp8T4uzScK5dd0+cNy5wT8L5eONy5CI+33bbbTZSjXnIveSZiLnHe3Ft+umnn6yjSKVKlez85vkFZ5JNlkAIIYTYCPTv3x+L026dOnUKypYta39+/fXX7fsHH3yw/f3iiy9O7cf2119/pc6x1VZbpb3nb507d07t9/333wfly5eP3XfWrFl2v3fffTcoXbp07H7r1q3L2Kfe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6dWrV6qftG3w4MF5zk+feO/GG29MG5f87B/eLrnkkth762+MIedzvzPWu+yyi7n44ovNihUr0q5P/++6666016ZPn25OP/10Ox8Yo7p165qLLrrI/PDDD1nHP3z/ttxySzu/br75ZhMEQWq/XNoX1ceosTz++OPtuT799NM87y1fvtxceumlplatWmarrbYyO++8s93/ww8/NO+++27WMWWfOOLul9t4P2qsM81Fx9ixY80hhxxitttuO1OxYkWz7777pn3GGMcDDjgg9j7873//s79n6iN/B4QQQghRvOD7uXv37tYGxXbBVjrppJPMO++8E2lX+DbT1ltvberXr28efvjhPOedPHmyOeGEE8yOO+5o99tnn33MVVddZRYvXmzfx9bcfvvtI9vkPxM4WwPbyx3rWLp0qSlTpkzKLk1q18A///xjbr/9dtOgQQPbPmx6nk9GjRpl1q1bl/Nzk/8M49s/tA+78Morr0x7ZkjyHBW+Pjbzscceax599FGzfv36LHfW2GeOo48+2j6z0Eds7Y4dO9q+R9ltnL9du3Zmzpw5BbLh3Xl/++23PG0Kny/u+S/MrbfeaufAkCFD0s6VyTZm/ML3w9+effbZPONQunRpO28OPPBAe6+ZY0IIITYcEnJjaNmypf1S4kt62LBh5oEHHjD9+/fPsx+GDPt99tln1rA57bTTzFdffZW2DyIv+/jb/PnzU+9zDb4Ix48fbwYNGmS/+BFY+WJ87bXXzMSJE4usn4888og1TKdMmWKWLFkSuQ/Xp83sU716dXPiiSeaZcuWZT33iy++aI3CvffeO4/xgZh3zDHHWKPp7bffNt99950dS86PWItgTLswLvjdwZiUL1/eipEOjGkMPR+MWIzratWq5WlXrvtjdIXvH0YtQp//2qGHHppnX64FjAO/L1iwwPbzrbfesmJmJrj3GNgYtE899ZQdoyeffNIaTv369TNJcfdv1qxZ5qabbjK33HKLNW59krZvwIABecaC++TDOT766CNz2WWX5bkOYPwyxx977DFrzL7yyitWYP3111/NYYcdlnbuM844I/VZdBv7xPHSSy+l9vvkk0/S+s/G+2GyzUVgbnC/aTvn/fzzz+04uoeY/DBz5sw8Y4mQLIQQQojiA+Jno0aNzKRJk6xAhp2PnXTUUUeZbt26xR7nbKavv/7anHPOOdZGfPPN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ujn++OOt6Dlz5swiayMCMtf4/fffzbRp0+xrvXr1SrWDrWbNmrYP/msORFv/dTbuk487ln48/vjjZvvttzctWrQwt9xyS5H1SwghhBBCCCGEECUfCblClCC6detmPUbHjx9vmjdvbmrVqmU9WidOnGgWL15srrvuOivUIuwuWLAg7djnn3/e/Pvvv+bss89OvfbII4+Yc845x278XJQgIr/wwgtWvLzwwgvNbrvtZho0aGAefPBB06ZNG/saYrMDr9Wdd97ZbnXr1jU333yzKV26tJkxY0aRCc2jRo0y5557runQoUNqPPAGdu1g22KLLUzFihXTXnNstdVWaa+z4XXs447l3h1xxBG2//369TM33HBDkYrUQgghhNiwkVIOFqz9aJ2qVaua008/3cyfPz8tamnw4MF2cZ2oHSKmDj74YPPwww+nXe+nn34y3bt3N7vvvru1O1gQP+mkk6zt5+AaUQv04Qglv11ESu25557m1ltvtTaRY968ebERSR9//HGeSCrsJGwf2s7i9apVqxKNI84JnTt3tgvm9As78ayzzjKfffZZbL/8tuAA0KRJEzNu3Lg858Zxgb5ut9121q7bf//9bdtWrFiRMaLM9f1///uf/R0HBH6nf2vXrk3b99NPP02L1HI89NBD1t7luizeH3jggXaMfXAgwIbn3nMfsBNZ5CcSzd2LXO6Va2/43jE/99hjD2tT+8fFRZ/RHod/fe5PjRo17LwLR8sJIYQoeiTkClFCwNh8++23TdeuXa2B74PBh0A7ZswYc8IJJ9gHBIxqH0TKU0891RqRMHv2bDN16lTrgcr2/vvvpz1QFDZPP/20NTox+sJcddVV9oFnwoQJkcfycPPYY4/Zn/3UEIXJ5MmTzZo1a6zhjLBNegpfWC5KeODDoI56+BBCCCFEyYyUckIhXHTRRTYiZ8mSJfb7HgEYe8Nx00032fRTAwcONN9++621Sy6++GLz22+/pfZBmCPVFCmZhgwZYr766ivz1ltvmaOOOsou9ucH1y4Wk6+55hq7sEwfwuA0EI46oi3hSCrSVH300Ue27SzeI5DS50wg1nKuH374wTzwwAO2/2PHjrVCIjZiJrBvuS7naNq0qTnttNPsuDgQSNu3b29F3jfffNN8/fXX5s477zRffvmleeKJJ/I1ZizK0z4fHABYpPchQu7yyy83PXr0sOIq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jiuYgdcuoioPMw5EbTww2KhUTOoFKiWTHiIsUnONcLuo3MuDFB4cUWFtPJjhEfPGG28kuj/krnNtdtvhhx+etg9CNK9jLPNwxoMD7SWVgxBCCCE2zUipqCgjCB/rg30Cf/75p7XxWMhnAZzfw/iFu6IilhDc8MjMFLGElyyeo7169SoUb1ZsKNJXYeMhUiMw+xFd2JwUNKOf2HlRdRpyKUh20EEHmUaNGqUcGzp06GBWr16dZ3E/fG7Ga9GiRWbZsmVp77PQj9BJAbswLNTjAIF9mUuhOf+eMibY6syVJUuW5NmXtuPFW9j3irnHef/55x9TUKi5wbNGu3btCnwuIYQQCQmEEEKUKFatWoXFbv8XQojNFf0tFBubH374IahcuXLQrFmz4L333gsWLFgQvPnmm8F+++0X1K1bN/j111/tfs2bNw8uuuiiYOnSpXb73//+F7Rr1y4oV65c8P3339t9+H3o0KHBxx9/HMybNy+YPHlycMghhwR77rlnsG7dOrvP7Nmzg5133jnYZ599ghdeeMFe/9tvvw2GDx8e7L333ql2Pf3000H58uWDe++91+4zffr04Pzzzw+222674KeffkrtR7t69uyZ1ifazLHPP/+8/X3u3Ln2czZx4sRU+932119/2X1GjRoVbLvttva1JUuW2DY98sgjQZ06dYLdd9/dvpaJadOmBRUrVgwOO+yw4PXXX7f9/PLLL4Obb745OOKII1L70Y6xY8fG/g5vvPFGsNVWWwWLFi2yv/fp0yfYYostgt69ewcfffSRHVv6ctpppwV33XWX3Yfx3XfffYOjjjoq+PDDD+316X+1atWCvn37ps7NPeGaK1eutL///fffwfLly4P169fb32mL/3h9ySWXBAMGDAg++OADe92pU6cGrVu3DqpUqRL88ssvqfHm3tWsWTN47LHHgm+++cbeM8Zvjz32SF0rl3vF/Y66dwsXLrTjU6NGDdtXR//+/W3/w/c3PFfcHOY89IWxLVu2bHDppZcG+fnbXXlkv5yOE0KITYlVBbBjJeQKIUQJQ+KFEELob6EoHiDQdezYMahataoVtXbZZZege/fuKaHOiWDMVbdVqlTJvjZp0qTUPg8++KAV1xD5ttxyy6BWrVpBp06d7Pl9EEW7desW1K5d2+6HKNemTRsrMvo89dRTQaNGjaxASttOOOEEK476RImD0KVLFyvs/ffffykxMGp75plnUkKue61UqVJWMD7ooIOsiJn08zlz5szgvPPOC6pXr277Rf/OOuus4IsvvshJyEVURRj1xcUxY8ZYQZix2GabbYL999/fts2JpLB48WJ7Hxl3xFHE8sGDBwf//PNPrJAbJizkIrYz7gjC9Im+IdjPmDEj7bjffvstuPrqq634z37crxYtWtjzOZE4l3sVFnLdhqCNYIwg+/PPP6cJuVH3F0E8ag7TRvp04oknBi+99FKQKxJyhRAiKJAdW4p/knrvCiGE2PiQdoI8aaRlUOEzIcTmiv4WCiFEyf3bXXlkP7P8kmQF1YQQYlPj9wLYscqRK4QQQgghhBBCCCGEEMUcCblCCCGEEEIIIYTYYMzu0GtjN0EIIUokEnKFEEIIIYQQQgghhBCimCMhVwghhBBCCCGEEEIIIYo5EnKFEEIIIYQQQgghhBCimCMhVwghhBBCCCGEEBuMOk/fsbGbIIQQJRIJuUJsQDp16mRKlSplt7Jly5rddtvN9OnTx6xduzZtv9dee800b97cVKxY0Wy99damSZMmZvTo0Wn7vPvuu/Y8v/32W57r7Lrrruauu+5K/c5+5cqVM/Pnz0/b7+STT7Ztimtf1apVzbHHHmseffRRs379+qz947iXX3459v1vvvnGnHHGGaZKlSpmq622Mnvuuae54YYbzJo1a/K037Vjiy22MNWrVzcXXHCBWblyZWofxmP77bfP2o558+bZ3//3v/9lbX+XLl3s9Z5//vm0c2XabrzxxtQ1oraPP/441V6/T5UqVTIHH3ywGTBggFm1alXWtgkhhBBCCCGEEGLzRkKuEBuYli1bmqVLl5o5c+aYYcOGmQceeMD0798/9f7dd99t2rZta5o2bWqmTZtmZsyYYc4880xzySWXmF698l/dFQER0TRp+xAn33zzTXPUUUeZnj17mhNPPNH8+++/+b4+gibC5T///GNef/1188MPP5hbbrnFCpyIxbzug8BJOxYsWGCeeuopM2XKFNOjRw9TVCAmP/vss1ZYR7h20Aa3IY5vu+22aa/592TixIlp77E1atQo9b47dtGiReajjz4yF198sXn88cfNAQccYJYsWVJkfRNCCCGEEEIIIUTJR0KuEBsYPFF33nlns8suu1iP2BYtWpgJEybY9xYuXGiuuuoqc/nll5tBgwaZffbZx+yxxx72tSFDhpg777zTirv54bLLLjNPPvmk+frrrxO1r0aNGqZhw4bm2muvNePGjbOibtgrOClBEFiP2nr16pmXXnrJHHTQQaZ27drm9NNPN6+++qqZOnWqFbV98EZ27UBM7tixo/niiy9MUYEXLuN99dVXW9GYewG0wW3bbbedFcT91ypUqJA6x4477pj2HhuezQ53bLVq1exYMCYIuqtXr7YCshBCCLG58NNPP5nu3bub3Xff3doe2EUnnXSSeeeddyKji/xoHaKV6tevbx5++OE85508ebI54YQT7Hcy+/Hdjh21ePHifEX0EEXjjnWwKFumTBn7Pvs5xo4daw455BBrL2DH7Lvvvtam82Hh+vbbbzcNGjSw7atcubJdvB81apRZt25dThFc4UgoPyKI9tWqVctceeWV5u+//07t40cI+RuRW4UZoeVHJTloB/eF94gsi+tHkvvoItPcRrQX+3/11Vd52oNNd/7559sIry233NLaoDgp/Prrr2n7HXnkkXnul8+KFSvs+xzPeTgf58XpwMcfPzb6gKMEzhmOTBFj4XaEPwtxPPPMM3a+duvWLe1cmSLLeN9dI+r9wYMHp7XXbW5+c61Zs2ZlbZsQQojCQ0KuEBsRRFWEPIxBeOGFF6wRH+V5S9g/oiFGWn7gIQGvWoTKXDn66KPtAwcibH7ASP3222/tw0Tp0ul/djgvYnamfmG0I/ji0VtUPPLII+acc86xD1+tWrXKt2idKzvttJM5++yzzSuvvGL++++/yH148Pn999/TNiGEEKKkgihExMqkSZPsQjXi21tvvWUXbn0RKoyL1sF+4jv7oosusgvNDqKcsClYNH3xxRet7XH//ffbFEYshucHFpSJnvF57LHH7Os+CNDt27c37dq1M5988on5/PPPbeSRE2ediHv88cdbcYyoHGxA9qXPRGSRgippBFccCMIcN3fuXHPfffeZJ554wtx8881p+4Sji9jC6bcKGqGFME9bfBC6/QXwOHK5jzNnzrTtfPvtt6291Lp167QoL8avcePGVmzE1vzxxx/tubhfhx56qBVnk8B+iPREX3E85yGSi/9JgcZ1osaPjWshrDN2RQm2LII//XSiP7a7awdzLRxB5tv27vPlbyy2+Lhjv/zyS+t08t1331lb3i3ACCGEKHrKbIBrCCFC+W8xYjGCMTgRNu+55x77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5SNGjEir8kufoyoFU5Gatv7222+J2yeEEEIIIYQQQojNGwm5QpRw/v77b9OiRQvz6KOPmptvvtn88MMP5o033jD//vuvOfjgg83HH3+ctv++++5rli5dajcEVkTPE0880VZLLCoeeeQR0717dzNlyhSzZMkS+9rw4cNT7WCDUaNGpX7/9NNPU8dfdNFFafuy3X777WnXcMciXt97771m9erVtv+PP/541vbdfffdpm3btqZp06Zm2rRpZsaMGebMM8+0YnGvXv83f9e5555r/vzzT/PSSy/lOf6FF14w//zzjznnnHPS+tynTx8r6EaJv0IIIYQQQmyu1Hn6jo3dBCGEKJGU2dgNEEIUjLvuussKstOnTzcNGjSwr9WuXdu8+OKLVsi84IILzNdff209QKFMmTJm5513tj/z/4ABA6wIigCMF2phg6A6ZswY89lnn5mffvrJerlee+211huYzWf77bdPtc0HD9mo1+OOxZv3uOOOMx07djSXXXaZOemkk6w3bRQLFy40V111lfUsHjRoUOp1Xttyyy1Njx49rHczY8l5EMw7dOiQdg5ew1N5hx12sL/PnTvXfPTRR/YeTJ482Yq/4WOEEEIIIYQQQgghckEeuUKUcJ5++mlz7LHHpkRcR+nSpc0VV1xhvv32W/Pll1/GevMi4iKC7rXXXkXSvueee87svffe9vx4rCJ6BkFgNgT0/48//jATJkyI3Qdv2nXr1qU8b326dOliKlSoYL1qAVF80qRJZv78+al95syZYz2Nec/BmJJGAqGaPuOdWxC4T7///nvaJoQQQgghhBBCiM0LCblClHDwpK1Xr17ke+519nF89dVXVpxkK1++vLnjjjusUEmO16IAEdOlHGjZsqVN4RDOyZuN++67L9Vmtz311FNZj0NAhnnz5sXuw9gguFarVi3Pe3jk7r777qnxO/7440316tWtUOvAw3iXXXYxxxxzjP19/fr19jXXZ1I0fPDBB9ZLN7/ceuutKQ9mNq4nhBCiZONyxfs53x3kV+c99onLk0+UC2mL+J4iPz7fDUSOvPPOO6l9iFBxOeSJbqlfv755+OGH81zvv//+M8OGDbPvlytXzkaxtGrVynz44Ydp+/H9xuJvJh577DEb4cP1yDtP/nny0Eflincb9gipnx588MG0/eJy8YfbQQ2AAw44wGSDmgJEz1BLgEVS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Wpt32GEH07x5c1tZNRPh49x2zjnnpO332GOP2THbeuutTcWKFe25X3vttTznow4fFV8PPvhgGwpGddfGjRvbisj+2MCiRYtsdeD99tsvsm1x45cLVEmmMjH3LMzcuXNNhw4drJcD97FmzZqmbdu25vvvv7dVlOkrFWx91q9fbw477DBz2mmnpc2/Sy65JM/5u3XrZt9jH0d+9w9vVH2mKnXUe/7GPv68pjotlWvbt2+fJ0wvah5SQZmqwowN48jn66yzzjKfffZZovH320L1aar/0qfPP/88bb9MfXH3jmrEUWOHBwuvM5cdY8eONYcccohNRM583XfffdP6xpgwN12/M40h85PKv4MGDcrTvzPOOMNe57///ks0HkIIIYQQQgghhNi82OyF3DCIWkuXLjVz5swxw4YNMw888IDp379/nv1GjRpl90OEQnhFjPvqq6/S9kHkZR9/mz9/fup9rnHggQea8ePHW2Fn+vTpVmBFPEbYnDhxYpH185FHHjHdu3c3U6ZMMUuWLInch+vTZvZBoDzxxBPNsmXLsp7bHee2e++9N/Ver169TJcuXaz4N2PGDPPJJ5+Yww8/3Iqe99xzT9p5zj33XCuY8d7kyZOtyNavXz8rmjNmPohpCGFU/ps2bZopbD744APz119/2fuMEO2zbt06c+yxx9pqgy+99JKZOXOmGTNmjKlfv7757bffzJ577mkGDx5sx5vxcNx55512Dtx///2p13bZZRfz7LPP2ms5WEhABK5Vq1aeduW6v5vf/vbMM89YQdl/jbEM78s+/rxevHixefHFF21/Tz/99Izjx+ekUaNGVtTmM/Xtt99agRRx/Kqrrkp8H9zn7ptvvrHzavXq1Vbof/zxx/PsS7vCfd1pp51S7yO48zmYNWtW7PXeeecdO1fbtWtn5yqi8S233GLveRTcf3ct9g9/HvgssThx0003pf29eP755+1nnrnFAosQQgghhBCbMnWevmNjN0EIIUokSq0QAk9BPOacSNaiRQszYcIEc9ttt6Xthwce+7ENHDjQDB8+3IqNiHcOPPDcuaLo2rWrDX9C5MLD0LH77rtb8RKP1KIA8QuhkevioYgIeu211+bZb8cdd0z1kfcRDBFJ27Rpk/H87rgwH3/8sRUvR4wYYUVNB8IY4uOVV15p+824P/fcc+app56yXrS85th1113t9RFsHYwTAt99991nvT0R5xD3ChPOicct3sN4UPft2zf1HqLi7NmzrehXu3Zt+xr/I/A76C99ueiii6xgh6fuDTfcYO9D5cqVU/s1bNjQngtB8Oyzz7av8TOiLB6sYXLd35/fYfzXy5cvb/7+++/Iff15jUfuBRdcYHr06GHvCSJvGO4PnrN40OLVjSev44ADDrDjmRT3uXNz4bjjjjMdO3Y0l112mTnppJNMpUqVUvsi2jpP2Sj22msvu891111n51sUr776qr2PvXv3Tr2GMO97wfvgve5wnvzhzwPzl7lEu/k8IfbjQY3YT5uEEEIIIYQQQgghopBHbga+/vpr89FHH9mQ/Tj+/fdfK/JBpv3C/Prrr9arFAHHF3HDgllRgGiFJySiEWkPHn300YyiMd6ezuMxlz6GwfOTFAl45IbBKxMvRzw8ARGX9vkirj8uhLk7ENBJtYDoTn8QnP/8809TWPzxxx/WY5JzO89bP81ElSpVrDj5wgsvxIbF02bEZo576KGHrLB55plnRori559/vt3Xwf0hJUEcue5fmPz888/WsxYv0jhPUjypEbu5x76I68gktibhiiuusPeIBZdcQTxlzsWld0CApe38LShMWPjhbwCLQCzokHLBX9wIg6iOUO5vQgghhBBCCCGE2LyQkBsCb0nERsKu8a5FqPK98Rzk9mQ/PBwRkvAOJBzdB8GPffytVatWqXyhiKdhDzy8M92+vtdnYYLw7PLWEj5PO9977708+xFKTzsQmu+44w4bGn/MMcdkPb87zm2kjADC6uvUqRMpBpO6AW9O9gHC3ZN6J9IfRFGERAQxPJoRXgsLhGG8ScmNyjW4lhPvoUaNGtbLGA9bPEKPPvpoK9CRNsEHL13y+5KXlTB7xLwouDekciANB9uHH36YJ89wfvd389vfovK1ZsLNa+YFOZ0R0jMtSLjUBSweFAXuvH5eW8A72+8n9y/Ko5nPbdxnDXGVfM78LeAzzr1HKEdYLQjMdcR3xp4FHX7OtHBz66232sULt+G1LoQQQgghhBBCiM0LCbkhjjrqKOtBSMgzoc94NpIfMwz5c9nvzTffNPvss495+OGH08KqgcJI7ONv7JcJ8mqyH6JTQcWiKMgbyjUQooHUDuQA9YVJB2H/iLB4LFKMjRQMFIEDBOk4gYzj/D4zPo6k6SKS7kdYOqkEfOGSn6P6k18Q7sLnRyjGC9SBkEmaCjyJDz30UPs+4xL2EmU+kY4AgTAqDYHz8KUIHeONwMfPfvqFguzv5re/RRVLy4Sb13ixkioDMZT0GHEUVYqQ8PnDQijez34/33jjjcjjb775ZrtvOO8yIE6//vrrduHl+uuvt/Mdz+KDDjooT8G9XEHwp7gZuaBdSo44rrnmGiugu23hwoUFurYQQoh0+A7nu5nFYBbpWTAjZQ9pk4DFPBZjHfzuCllS0JQFvygbj8XOE044wabZYT9sIr5HyDMfLpiZqVCrKyjLgrI71sHiMPZcrsU64Z9//jG33367adCggW0f9gMphbAnXD74XIoB+4Vl/WKftI+0T6TR8u3bJMWBw9dnEZkIKewzCsdmwx1Lii8f2sF9cQVd4/qR5D6GC61im7F/uH4G8B1ONBVODDg3YAOQZopIHZ9sBYxXrFhh3+d4zsP5OG+4AG242C19wJGDWhUON7+wl8KE2xH+LGSKxGO+YiP758pUFJb33TWi3ieSym+v29z85lqZah84KHpLeq+437ONQS4URbHe8ObqqkT1K0lx37iC1f7nxv+scl9xXiGV3YABA6xtKoQQYsMhITcEX7CIlhi0GIgIulGiICHX7EeOToxdxFC8d30II2cff8N7E/iZL0KEVR8eIHiPHKU+GChRX5IImX6agWzQF9JBYOxhVLONHDnSirXh8/MQg7FxyimnWM9B/nfGNw8rcQIZx/l95oHI5RbFS5WHhjAUXCNcnH3cvuSRzQZFvXiQwJBw/cG7Eg9V591bECjKhQHDA4s7Pw9FiHh46obvEQ99iJpffvmladasmRUJw7jzZAJDHIOJ4lf8nI2k+7v57W/hBYhsuHldr149+0DGeFx66aWx+7t7muR+5ofvvvvO/h/OCczvfj/jxFK8xMldfPXVV8eKzuxz4YUX2nn/xRdf2HnBgkVBSTIXgM8Qwr+/CSGEKBwQMYg6mjRpkhkyZIgV39566y27+OmLUGEQMBBRSb/DIi/fJSzwOyjuSdonbEbsLL47KHCKvcVCaH7AjgwX+OS739mXuRTrxB47/vjjrTh28cUX23Ri7Euf7777bptaKNdiwHFFSufOnWtrGTzxxBN5bKNsxYH963OvGGPuDeInhXixa7OBbeqnoXJCNwu02cjlPrpCq2+//ba1mVlc9+1exq9x48ZWbEToZKGYc3G/cARAnE0C+2F/IeBxPOfBLuV/IonCUWF+AVuuhe3B2BUlPHNgP9NPJ/pnKwrL++HPl7+F01C5Y7G7eVbBJuQZzi3AFBcKs1gvgnX4/SOOOCL22kmK+8YVrGbjb2P4s7po0SL794K/G/QB8TiueLYQQojCR0JuFsGKIl944pEnNg688/iSy+SVGIbVcLwJ7rnnnkT5XEkzEF65JR8rhosTyrKBocuXLUan76nIORB2MbTiOO2006zRhxEOPDBkE8jCEJaO4YJBHIbUDXhZOO9nikEhxI4bNy7PvohtTnTGMMEjItwfRFSE+ILC+TGOOKd/DQTMTF6/iPSE/Oc3Vy8GN4Y/D1w8ZBX2/oUJAiiiJgJnFBh3eK4w76I8Z1iMKAh4hWBY8pCVX0iLwXwLi/NR4CWCN05h5mEWQgix8SBXOd/bCEvYIdhViCV814e9OMMLuIh7LMKziMzCqIvEQeigECgb9ggefXx/YFOwKMj3Tn4gWiwsSPI7r8cV68SGdIU6EZH8788pU6ZY0Qvxlu9r+oINhiMDi/nhYqkIopzHFQNOWqSU4xAOqX0QthdcEVV/w+vWx10f+5NIIOxzbEREXRayk4wb3/G+Pc99CY9bmFzvI4Ib7aSNeHDifesvZDPOeM8SBUQBXbyUiXJDQMO7lwKsSWA/hDOO43jOQ5sQkLGnwwsQbvzYuM/YbrRt+fLlpihAuEfo4zrMPSfQ8hlx7cBrOVxc2XcucJ8vfwun8XLHukLRjAcCKYV44+pWbAzc58AV6qWuBkWKKda7cuXKyDnkb36NCZ7Hwu9nqmHC55+FjyRzy78XbnPRmP5nlehCHDoYZ+4zz3eI9kIIITYMEnKzcPrpp9vwEd/wjQJjDYHSD3dDcCQUJrw5MQtRFHGVlXmEMFaRWYV98sknrdHnF4/iYQKDkWNYUUVMZBWUL388BX0wysLh88uWLbP5UdmfL11yyfobDy7ZhEmMWLw28htSjqcB3hM8VCDqzZ492/YToZx8sbzmcn+StxRPElJAsMJOGD/eGfSBhwdC3OgXDwP0P9wfjsNDxffSwKgMj0smMQ5RFM8RzhU+P9fkIYeVdc6D8YhRhpcG3hCMJQZ/VLG2JHDvmQ+cL66IWH72xzskPB9/+eUXUxC4Z3hrxz2UukJvCKUI7Hhw4ylCSB+LH7mMEaIvbWYu8ADJAgNe2XiVh0NT8ZAP99X3RPLhgZHPGLmOfQhJwzAl3I35Q6oRPJ45DwsxQgghSjZ4NuJ9G5frPUlBTuw6PDWxsZygQoolFljjxI38FvqkSCrXIfII+J/fiQjKtVgn6aCwqQ488MA87yHexOW+T1IMOArsALyeEdoKA1IU4X3pe3HGgcMFIporqkv6AURs0htlIr/3EYcDtzjsxom5htDKwkE48o77hbDH80C2lFTMN87N/hznw3k5P9eJ8+5FdONZA2cMhLuiwKX6ImqwsFOeZQLBk2cN7MSwA0xxoyDFegu7uG9BQHhmLr7yyiux4rmK9gohROEiITcLrHqyWkr+sEyiHx6RhHL7Xrl8SbFiGd5cCgbCtRGGMKLJgYkxiqhLOFuvXr1swSwHYiJCLuIgxijXQ5jCCA17LSBsYZT720MPPWSNKK4VlYoBIZcvdz9fVhi8FhCw8CLOL3h/IEbj/YsgSn/pA7nI/HApxD/6MXToUPseXgv777+/FdYQ/vA6pT94ekYV0UJYZJz9tA8IdeFxcYXYosAgIV8Z5wrDKjQbbaCoFg8HN910k304wQsDYZrfk3pWRJFrCH2S/XlYDc/Hww8/3BSGMUouWRcmF+W1zvzioYHQU8aOh1EeMpPkWQvnGOaek86BkEiuifdQlAdCuK+ZjHo+c+EQS+YdovN5551nr4nXC587PGmSFuMTQghRfHHFZ/NTkBMvXFf4loVFcka6xXUW3flO5runMEFgRRhzUUcuj7/vNZe0WCdtTNrvpMWA44oDcxzfm3g6Y/MmLQ6cDdofLnYaBwuxbtzw4iWHrfMKjSPX++gKrSLwYsdi67gx5lzMNWygKHgdUT6blyzvs7Cd6Txch7kdVewWT1dsXERj39OzsEBoZnxdfQnmHgsOLIjn5/Plb9Q0yG8R3OJGfov1kvrFfx8bOxvZivvGFaxOknrE9QVROpzn2aGivUIIUbhkT864ieOHY8WFZhEWxOaIWilHeHS5OoEk9mzZwDBEuGXLBmJVlGDl4xdryAWMAL9fUX0knDxT7i4eFJIUtsKQTpL3FeOS5PxxxbgyjRkeCv6qcH4KbiFuZwrLwvvVgXCblDjDMltoYLjwRn72TxJ+mOnccfOaPG3+GEfNQ0Lr8JLOL0nvIWGP2fZlQYDNhwe18MMToWhsmYgbkySfh/x+XoUQQhQOBSnIiZDJ339yRvIznpAsWLrzhotwFhbYUAguRCzhMTp16tQ8eWJdsU6in4hiIkUEqaiwV9gfmy6XvvNdSPQLTg3kyMXRIaoYcBj2xYkAewphkUV1vGD9VEYIi+F0C2GP1Tj8ccZexNPU9zz1QVjEnmeBFjsnHIWT7fxJQGhkbBlv7g/5a6POWRjk5/4BYjFOFYjlLIYnTZGWFDxMmScI5UABPVeczndSSfr58gnngs5WBBfPa7/oMik52IoDmYr18plwhBdpWBBBiHe4WiTZIDc1Ij/OCH7OXR/E/bgFgvz0xcHiDZ9939lJYq4QQuSfzV7IFUKIksrO1365sZsghBAlGvLAIj7kpyAnApWrF4CgiqcqkUYIRyxe4mmKyJvJm5NFREQvvBh970iXPz4qiorr4AGHtyuiCxFOpHmKgugvV7CTKCHahVhDhEvSwrJ+sVRAkCOKjKgk0nVlwhUHdgIUXnu0G1HJve6KqOYHnChcsVOKYxFdEwdpBMjTS5spvoWQSXsykfQ+OmgL3rj0Fa9l0oQReeYXOqbNUdFevI5XdzYvYd7nGr4DSfg8XMcfU//+AVF+zC0i9rgXLqKrsAor4/jhi/HMb6L+iFZL6gXsPl8FKYJLDRD/s5Frgd+iJFOx3kypV0jVkZ9x8Yv7xqW6cAWr89MX5lBcqg7E5qSCsxBCiOwotYLYrMGID4cQuQ1PCrFhYKzj7kPS8EohhBAiVxB2SNdELYSoFFpJC3IigCDaubQBpFpAcCE1VxTuvAh+eNOGhVjnoRpX0BavXKI6kkQ4xRXrJMqL4lBRaaZIpRWXUixpMeAoXB7/XI+Lgny7hJk7z2C8DJ2wHidGuXEjZVKSGgRJ72MU5F0mn/DYsWPTCh3jDRvuP2mbyFnMHMrmAcz4EyZP6gaO8+G8nJ85nUm05Bqcx7WDfRFOwymo8JzEkzppYWVC6ylCh8e1X5OCOYYnMN6gRQmCMZ7WiKGkUMNz3J8TxUnILYxivUVZ3DcpLFgwFymCWBSpOoQQQuRFHrliswaPhLiHieJk7G3qEA7JQ0kUScMrhRBCiPyAiNu0aVObZgqvTnLyI64SIk44epznYxiKLOEdS054PHNJK0CdBcQwhEOE1EWLFpnHH3/cLlRS5JX8l1SxR2Dk9913390WvqWILqJeXCg5nnUU5I3z3CN9EMVpCW8ndB7BEYHLL9bJNUi/cMwxx9iQd3LmE9JN+2+77TbrtXfAAQdEnp9rE/rO2GXygnVFShHYyBHL+CIK+uHbrjhwGIRZJwy5Yq2kaKCALzn/ybuJhy1jmxRqTJBGKWkNAgT6JPcxCkRz7lP//v2tyIV4Sp0J0mIgtOIJi+BIvQDGknvt19rwCxj74BnMAvg777xj7yUiM/OOHLSI69zjcJFmN36AoEo7SD3hF8kj9J3zUnuDlFmIsswLPIBPPfXUtPNR3DncLuYZRYIRrLHpwoI0c5E5xT1IAt7S4XnBmPr3jjayD3Md0RxxlHQRzOskQr0PzwPhPvF5wJM1070I1yrJ9DngPiCkUiCbFGjMoahivXiM+zCm4RQL+cEV9x0yZEjk+248fWgfOa79zyr/0yfStDBn8NimoJoQQogNRCCEEKJEsWrVKpKR2f+FEGJzpTD/Fi5ZsiTo1q1bULt27WDLLbcMatSoEbRp0yaYPHmyfZ/Xhw0blto//Lvj+OOPD1q1apX6fcKECfa1SpUqBeXKlQv23nvvoFevXvZ6jpUrVwY9evQI6tSpE5QvXz6oW7du0KdPn+CPP/5I7TN37lzb1+nTp0e2n9d5n/1g0qRJQbt27YJddtnF9qdq1apBy5Ytg/fffz/tuLVr1wa33nprUL9+fdu+HXbYIWjatGkwevToYN26dXafjh07Bm3bts1zTY6rUqVKsHr1avs71x87dmzqfX53W6lSpYJq1aoF7du3D2bPnp3aZ9SoUWn7+dvSpUtT13evlSlTxl6zRYsWwaOPPhr8999/Ge9rVLt8GHved/c5bv9s95HjOY7z+SxYsMC2ecyYManX5s2bZ/vEPSlbtqy9R927dw9++eWXtGObN28eOS4DBw607y9fvtwex/Gch/N16tQpmD9/ftp5/PFjq1ixYtCkSZPghRdeSNvv33//DUaMGGHnwtZbbx3UrFnT3i83p/y5H9WuJ554wh7btWvXyLFmDJiLtDvbnI67RpcuXdKOdRvtrVevnr32rFmzgmz0798/aNCgQdrvUdc75phjEt2LTPj7M3f4nHNPPv/887T93ByK2qZOnRrZ7iT9Cu/P38vKlSun/b0Ij6e/PfPMM3k+q3yet9tuu+Cggw4KBgwYkPPfYPe3u/LIfjkdJ4QQmxKrCmDHluKfDSUaCyGEKDh4BeH9MLPvrmbPwblVgRZCiE3tbyF5PZN6WAohhCgef7srj+xnll8yYGM3RwghSpwdq0Q2QgghhBBCCCGEEEIIUcyRkCuEEEIIIYQQQuSAivUWjNkd4vNrCyGEiEdCrjGmU6dOtghBXOJ7ihRQmGGrrbayFV0p8EBhgnBRCZL6uw0X6WbNmpn33nsvbT/eI7l9tjYceeSRtghFNkgyTzL/1q1bp53Lb0t4o0iDu0bU+xSe8tvrtm222cbUrVvXnj9c1TbXNjrmzZuXdg0KjDVv3ty8//77afuRAeTBBx80Bx98sDWOSLxPIRGKGlDgwN2DqKIc7hquQIH/e/i+RW2ZxjRcsIGqvMwPiglQGIDxotAFhQ2SXivu3o8ePTqtIIJ/PsaXghwXX3yxWbFiReQ8dhWJKbQQhjnBWOZK+P5RFILCLVRqpqhJpvZTsITCCHvvvbctaEb7uL8UoINsY0X/HY899php0qSJLYJBG5hDr732Wtr1qVLtH0/xDgpvUPE66fXCcyk/12d86LsP48L4CCGEEEKIkgHPTNiEUZuzZ4UQQojCRkJuBhC8WrRoYR599FFbWRYx7o033rCVjBGcPv7447T9EWiWLl1qN8RLRDyq6ZLzoqig+mv37t3NlClTzJIlS+xrw4cPT7WDDUaNGpX6/dNPP00dj8jo78tG9VsfdyziNVVwqXJL/6m0mt82hpk4caK9BvtUr17djhtViR3nnnuuFTfbtm1rJk+ebA2kfv36mXHjxpnx48eb/EKlZb/vNWvWtBWVw+MHiLbhsXrmmWdS7yPcUeWXefPUU0/ZKtdPPvmkFfVpay7XSoqbcwsWLLD3iSrOl156aZ79XnzxRbsvomnUQkJBcffvyy+/tN4J9L1Bgwa2onIcN910k60ETUXkb7/91t5XhGiq4II/LojM5I3xX3NVsvm/S5cutrr3jBkzbLViKm8zV6jKHIZq4Bz/9ttv23vFAsM///yT+Hphcr3+nDlzEn92hBBCCCFE8QQnhD322CNyq1GjxsZunhBCiE2UMhu7AcUZxBwEWbwsEaWgdu3aVhRDyLzgggvM119/nfKkLFOmjNl5553tz/yPSIe4hgCMt15hg6A6ZswY89lnn5mffvrJevRde+21VjhkC3v8ubb54EEY9XrcsXhuHnfccaZjx47msssuMyeddJKpVKlSzm0Ms+OOO9prsPH+s88+a6ZNm2batGljnnvuOSuMIkAijjloC++TJDq/uPAnB56teFRGjQke2XFjhVdw586drYfn2LFjU6/vtttudq4gTuZyraT4cw6DEW9g5lyUmH7OOedYz2Z+RnQsTNz9g913393Oi2OOOcZ+RmbPnm37GuaVV14xXbt2tW12uM8Z+OPCfOZzFh4rFlPuvPNOM2LECLtY4LjlllvM2rVrzZVXXmnnDN7Kjp122ik1p1kcYA59//33Zv/99896vV9++aXA12c/vPw7dOhg55QQQgghhBBCCCFEEuSRm4Gnn37aHHvssWniEpQuXdpcccUV1osQD8Qo8PRDUEMw2muvvYqkfQiceFhyfkQ6PIcR6jYE9P+PP/4wEyZMKNQ2kgLAeStuueWW9n9EXI73RVyHS2OxscG7E5GvT58+ke/7KQWKCsL+aYcbNwdCKgsSZ5xxht1IWzF//vwibQufkZ49e9rrxKXhQCSdNGmSWb58eb6vg0c04jgesWGuuuoqs27dOrvwEgWe8iwYQHjMivL6iMd49d999935uqYQQgghhBAlnTpP32GqPjZoYzdDCCFKHBJyM4Anbb169SLfc6+zj4Ncm87rkpyfd9xxhxV6CNEuCpyXpQv7R5gK5+TNxn333ZcnOT/CaTYQZ514WBhtPOyww+y1ycPLuDVq1Mh6dAK5VpOK4f49cBspBQoDUieEz00aAddGf1w2FK6/zDe8f0l/0bdv37R9EM8puIDnNCFgxx9/fKTXbmGTbY4MHTrUirgIunjDkmfszTffzOkafP7q1KkTKcSSooPPnv8ZBVJauDzLLNbgkZvf+5af6+MFj0furbfemjjtCgtDeJ77mxBCCCGEEEIIITYvJORmIRcPV8RGl+AeL0RylRI2TlqBwoY8n+TiPOuss1Ih9oTLI5zmwtlnn50nOT/CVtJxcWklfHHTFUvLpY2kXyCFBd6L5JUiBUPZsmXTrpXrPXAbeY0Lg6OOOirPuV1fN5QndFx/yXuMgItI64f4U1SLQlxOTAd+ZnzXr19fpG0Lz5Ew++yzj01NQnqC888/3/z88882JcOFF16Yr+skBY9kPp+MAUUM77///pyOL+j1gZQTpKO47bbbEu2P6OtSprD5qRqEEEIIIYQQQgixeSAhNwOIPBRtisK9zj4OvPJcgvsDDzzQDB482OYtJdeug5yoUV545FDNJUUAYijh2Xj9IZCyjRw50gqhuRRX45rh5Py0MRuu/3iBgi9ukhs41zYiTFEc7pRTTrFervyPF6IbY3KYJsG/B24jr3FhgLdw+Nx4uLo2QtJ2ZgIvzqRzxPV3v/32s/ONXLQUEXOQamHx4sVWQHf34Mwzz7QpDzIVIisMwnMkLgUD+aNJN/DSSy9ZcZV5M3fu3ETXYNwpHkaxsjAU1sNz1f+MuvYggJPnGdG4IPmC83N94D6QR5fChHEFAH2uueYaOyfctnDhwny3WQghxKYL9QhY0CVfPXnYsa9YJHXf+dQX8O1SfmfBlY2Ikfr165uHH344z3kpSEodABYh2Y/FWFIIYWMA399xaaQ4tyu0SpQOv2OvuGMdFBbl+5H3/Wgeag9QTBYbCBuVSCvsBh++hynWSzo02le5cmXTtGlTG4FEmiPo1KlTqq84C2APkBKLnPZx7XW/u4321apVy+bAd3aq67+/n9vKlSuX2id8/apVq9oUbkROJV1c5/ufxW9sa2xAbFxSWf36669p+x155JFp7eBaOJf4qbVY7Md2JCqJyC5sWuo6hO9/tjkVNWZ+n08++eTIdjE22EgsVvuL4m6ORG2u0LQ/3swlos5oO88gSZ6DaIc/h8K/h4nrXzbefffdVDuxeZnDPCMy78JFjm+88cbIPvtRY+H76jaet+L6xfsulZiDvwF89jf0/BVCCFE4SMjNAILXxIkT8+TB5ctq2LBh1ogN588Ng3FB3lcHAlI4ZyiGFNeIEnyi4MuaPLIUWfIFVM6BYUc6h6IGAwDBsUWLFvZ3X9ykmFRB2njaaadZQ5m0D0BRKMLTx40bl2dfDL9chOuiggJwPDTwEBEFImxSmCNffPFFntd5Ldscuf76621qCicOIooyj8OexLyWq/d2LvAZoQAYD0kYrEnhMwV//vlnov3pBwX1HnjggTzvMQ4Ymu3atYs9vlu3btYr2C9QlwsFuT4PVDyM+sJ7HDw48XnzNyGEEMIHAYzUVOSfHzJkiE2/9NZbb9mIIr7v4kD8QlTi+5ConYsuuigt1RHfcdh7pEJiMZ4aEUSzYH9h5+UHHB1cTQQHEUS87oNYyIIr36VEeWFDsxDqxFkn4hKRhCh58cUXm48++sjuS5/JR0/aKQdpvugri7DY8vSNdEfZQBDmOBaasU+feOIJc/PNN6ftw3cz+/hbuCaBuz73ijHm3iDEnnjiiSkxLg7a3LhxY5vOCzv6xx9/tPeBMTr00EPNihUr0vbnPnItbEJsaERgP0IL+4MxGDhwoL2niPWMn2+z5ndOZcK1i8g9FqpvuOGGyOgonsHC40lbwuO9aNEie89pO3PqgAMOSLRIviGhr7TJRdDRN5wwGE8f7MJwnz/44IPI8fM3npviQIzl+cD/zERR1PNXCCFE4RH/V38zA2MUgcsHYwfDh1VnDFVWepctW2Y9RvE25EvYDxvnC4xVa6AQGOkCMIz8nKWs4BNWzeoqq5gIVhiZK1euzBNSTv7QcJuqVatmC1exP+cJe2hi6CLQuZD/bKxZsybVZl80YmXbgUHHPngeIKhi9LIqjbEU531BPtn8tpEx7dGjh12ZpogUBboQ2kjRgCGCaFqlShVr/GCA4iXgr/YXFfQ/PFYYTgi4eOviwYA4R2oK2o+oTQE0Cr4tWLAgz2p4HKTkuOeee+w5mBPcj9dff90a7a+++mrGYzHkyTfLHOXBhP1feeUVayz6nHfeedbrGaPfeRXjGROeb3h6+HMhDjxBGBvmEw+CCP08RNFuFjPiBHu8ZciPzMMhD0cY9IjVSXPW0l8MyN69e9sHOeYBhuqTTz5pvV1pR6Y0BHjtYBAzVhwblwaiqK7PQycPn0IIIURB6dq1q/0e4/sXu8QXh/DijAMvV76HAZuVRWmK2ZJfH5EMe4QNm8uBN98RRxyR00K1D1ExiKN87zv4ndcRFh3YMdgKfM86sBN8u4/v2ilTpthUZv7iMR6k2GV+1Aw2lesr388I1PQ1W6oj7F3/OArwhhfdGXu3Txz+9RGtGzZsaL2NqQuBV2Sm9FIIp3jhjh8/3nrQAt7B9Jl8/dddd52NfPNtHHctnh8uu+yytOKs2IfMGcbIEXZQye+cyoTfrs6dO1ubl3uA/euD93em8fTHm/5Rv4RnNtqGxyu2WHEBJxc3h5i/zB/uG332hVqeK7LNIX/8ksDzE/f6oYcesvczjqKev0IIIQoPeeR6oS98ofobK9WsQCN6XXvttVaYYyUSYYrQHr64fFjxx5BgYzUYAQ+DiuP9L1MEP8JQWFXmfAhgGKCEqPhQiCncJr6EEUExPKNSMSCSYsjOmDEjUb85n2uz21xOWwdGFq8jrmFwkAcXgw5P2TgK2kYMeQQxjDsMC8aC4lgIyM2bN7diJUIvhtCGEsLwQAiP1eGHH556n7bgEYAXJmPDeDGWLBKEvTYywYMH84E0DYwhCwjMpeeff97Ol2xcccUVdo7hMYLR7YrG+fAaDwG+kYsHaXi+IcQmgXYyHoRkXn311daY5v6yUh8H940HNIxujFruOWPGA0omz4IwPMDRV4RuBGu8VRg/5oqfLzgOHmxYmGF880NBrn/00UfbTV4MQgghCgILs9gpiH2+4OaIW3gPR9PgcctCvCviyXcjQijCWBRJzhsFi95cx4lY/M/v2AQ+iEbY1ywSx0GRXuyQqAggbLKo8QDOid0WVbA0Ezg18HyAfVYYYAcgoJJiKtP9JV0WQpwTcf0xouYFDiRxefs5HlvSbzPH0Q8cR4pqTmWCtlK3AHs313uQSTBlLBAuiXgsrnAPcWj58MMPbY2IogRPW0R+PO+TRrwV9vwVQghRyARCCCFKFKtWreJJLZjZd9eN3RQhhNjofwv5f3Nn2rRpdixeeumljPvVrl07GDZsWNrvW265ZbDNNtsEZcqUsefYYYcdglmzZtn3L7300mDbbbfNev1Ro0YF2223XeR7nHPs2LH257lz59rfp0+fHlx++eVB586d7ev8f8UVV9jXeZ/9YPXq1cEJJ5xgX6Ot7du3Dx555JFg7dq1qfOXL18+6NGjR9Y2duzYMdhiiy1sX7faait7ztKlSwcvvPBCbHvd7+XKlUs77sQTTwz++eeftP7zOvv4W8uWLdOu37Zt28i20a969erFtv3jjz/O0y6foUOH2veXLVtmf2/evHlQtmxZ24att97avrfnnnumxhW++eYbe03GoH79+kGXLl2CN954I+c5FTVmcX3228X/bmw//PDD1D5ujnBfw+OZZL6NHDkybSyioB09e/aM/T1p/7IxefJke+zKlSvzvPfmm2/a9xhn6N+/v70X4T5zX6LGz21XXnll1n7xeeHzM2DAAPs6fwP4fUPNX67P32m3LVy40F6v8sh+wU6jb8lhRIUQYtOhIHasUisIIYQQQghRgonzxEwCaQsoZETuS37G65MoNHfeXNMOJYXQfNIrkQ4Kz19Sh4UjVPAEJTpo9uzZNocrEXEUWSN9EfsTZp5L34kUIloOz0RSRRABlCmXvoN98frFy5PctKRKO/fcc9PSZpGiIpxuIew9G4c/znhq+hFT5OL390sKnql4YoJLDUd6MvIM01bqEuCVzO94hhJNhEc0c4HIroLMqSTtwgOb1FbMAbYweBgT4ZUrrt2MJ97afjoJ8ro2a9bMFAf8dvp1MvAm9gnXRfDva1LPaFIi4JFLpFg4hUVhz98oKGiXpCaEEEKIZEjIFULEEn6YCOeQjipOITYcO1+bXohRCCHE5kndunWtkEKYeq6Q698VrEVQJU0SaYIQ+kh9RIooRF5SKMWB2IQ4SnqG0qX/f+Y2l0M3KtUW13FpqBDsSE8UztXvIAcsGzk4EbFoF0If6b/4OWm/EYadSE2aM0LCSQdGTYdMkIbAHYfYRi0M2k3qLPc6/XY/5wopnigQCwhuvXr1Snuf83J/2Y8aB1HHU9OAGhIOxty1h//pJ/eQcXO5TGlzkyZN7Hb55Zdbmw+BmjHOZU4hAkYVH+b+h++93y7SPfAz6epcAWUHuYjzM56MBfORHLuk8PDTSYSL6W1MaKfLN+0gxUS2PvvjlwvY7aRRY87613QU1vyNglzYLH44fv/994w1JIQQQmRGOXKFELHwMMFDVdTGe0IIIYTY+FC4lNzz9957b2QezKRFyRBX2rdvnypCRmFSxCUKoEXhzou4iTdtWIh1Hn6IrXFeudSpyKVwFiIUnriun9QloADx9OnT8+xLvYW4vKAIV9TAoJDuX3/9ZXLBFXLN9bgoyFNLAV/nGUyeVyesO2ENUZIiyeTkD1+TWht4nnLfMnlFJmkz4j0wZrnMKe4/nr0+eC9/+eWXsfceqLtB0ViE68LwACbfLHU1KIbH/UVg9scyqYdpUcM9ePDBB23BQF98L0oYDzxj8UifN29eoZ03PH/jPIIR1/1NCCFE/pFHrhAiFh4m2IQQQghRvEFwa9q0qTnooIPsYiuFYRFXJ0yYYMUb5wGYDYQ1vGMpTItnLmkFKAyKFx0FfBFSFy1aZB5//HErxN15551m3333tWH7CLL8TuHWmTNnWi9PBMY4T8iLLrrInH766bHh4RS2XbNmjTnhhBNM7dq1rXg4YsQIK9AibALXIP0ChVwHDhxoC9Ei4NH+2267zXqiUoQ4Cq5NOgnGLuwF68N1EUzxOJ41a5YdXwRKP/QfIZJ9wmBHOS/lv//+2+6DyEm6A4qJIa6deOKJacWRo6AAMCkIEFfxqsQDkkJwtJ/xveWWW9L2Z9xce7gWY1OuXDl7n5xIz3zhnHgcz5071wr49AtP6VzmFN6WeDVzHPcF4ffuu++26ROc928cpD6gbRTao02OX3/9Nc94Mk/ogz/e/M/9IdUG6SPwWB08eLDJFYq+hRci8GB2xagZn/D7eC3HFdMLC8xr1661ntwI3iyM/PLLL3kKhDG24T4jzocLYueX1q1bWw/lBx54IM85i3r+CiGEKDwk5AohhBBCCFHCQTzFAxZBjzyypEPA269Ro0ZWdEsKXpmIfTfccIN54403bM5cxD3Csgnrx5sQMRfxxg+XJmSfnKcIc0uWLDE1a9a0+/fr1y/2WuSoJbVDHM2bN7diIiIRwhHpAw488EAzfvx46wXqvP0QFhGcEagQZPHYRWTt0aOHFaUzXR+RGmGN3KFxohwpHJyohuiJJyWiIcc7ELqj0k9wHzgGEL7Yh+PoC6kdEKY7duyYlpIiCkRDxGnG+IwzzjArVqyw58X7lNfwoPV56KGH7AZcCxGW++nGDUH4mWeesUIcaRE419FHH23Fc9evpHOKNBMIgUOHDjVXX321HX/2Ie9uNhGSdnN/ue6pp56aej2cagFo75lnnpk23twTPDzpF+PIQkR+PD7x5GXzQWDGYxv8ue54//337cJBNmgb7WThgzHl88X53LxwIMyH5xDzGxG4sGBxIyoncVHPXyGEEIVHKSqeFeL5hBBCFDEY23iczOy7q9lz8NyN3RwhhNiofwsRoRSqK4QQJetvd+WR/Uzp8uXMso7XbuwmCSFEibJjtXQmhBBCCCGEEEIIIYQQxRwJuUIIIYQQQgghRA60atXKpkuI2ki9IYQQQhQFEnKFEFnp1KmTze3FVrZsWVtgo0+fPnlydr322ms2nx1FRsiP1qRJEzN69Oi0fahOzXmiKmiTc++uu+5K/c5+FLWYP39+2n7kg6NNce0jHxvFNh599FFbmCQJCxcutEVaqlevbit0U1SFPGsU2wBy83HuZ599NvJ4inw0bNgw9Ts5BMn7Ru4/ikNk66sQQgghhCg5PPzww7YAWtR2ySWXbOzmFXtmd+iltApCCJEPJOQKIRLRsmVLW/Bgzpw5qYIiFNdwUJ24bdu2trrxtGnTzIwZM2xBCgzZTJWgs4E4S8GVpO2bN2+eefPNN81RRx1lhViKsVAFOBP0icrcVKKmkMaPP/5o7r//fvPOO++YQw891BYUQRym2i/icBiqMz/33HNWzHVQfZkq3lRwfvnll/PZeyGEEEIIURypUaOG2WOPPSK3cPE5IYQQorCQkCuESARVc6lau8suu1iPWKoJUyXaebNSzfjyyy+3oWRUvMaI5bUhQ4aYO++804q7+YFq0k8++aT5+uuvE7UPoxrP2GuvvdaMGzfOirphr+Aw3bp1s164VMHGo7hWrVo2XG7ixIlm8eLF5rrrrrP7IdQi7i5YsCDt+Oeff96KxWeffXbqtUceecScc845duNnIYQQQgghhBBCiIIgIVcIkTOIqh999JEVP+GFF14w69ati/S87dKli80VhqdrfsDDF6/aq6++Oudjjz76aNOgQQPz0ksvxe6Dt+3bb79tunbtasqXL5/2HsIw4uyYMWNMEATmhBNOsJ65YWF41KhR5tRTTzXbb7+9/X327Nlm6tSp5owzzrDb+++/nyc9RC6QmoGqlv4mhBBCCCGEEEKIzQsJuUKIRJD/FkGWnLX169c3P//8s+ndu7d974cffjDbbbedqVatWp7jEHt33313u09+ufXWW81bb71lBdFcIbUB6RbiIJ0CIm29evUi3+f1lStXmuXLl5stttjCdOzY0Qq5HONEW9pFfl0H6Rfw6K1UqZINrTv++OOt2FuQ/jO+bsMrWgghhBBCiJJKnafvMFUfU1E4IYTIFQm5QohEkHOW4g2kSEDM7Ny5s2nXrt0GuTapGs4777x8eeUiuJJnF8jX61cUDu+XBATbuXPnmsmTJ9vfEWgpXIb3L/z333/msccesykVHPyM+Ju08FqYa665xqxatSq1kcpCCCGEEEIIIYQQmxcScoUQidhmm21s3ltSFeBxiqDrcr/uueeeVmBcsmRJnuP++ecf67XKPrDtttva/9k/zG+//WY9TqO46aabzBdffJFz4bDvvvvO7LbbbvbnAQMGpFUUBvqE0Mt+ccfjWVulShX7e926dU2zZs2sgIsw+/jjj1tR24nFpGkgr2779u1NmTJl7EbRN1IrkF83P5D/l3HzNyGEEEIIIYQQQmxeSMgVQuRM6dKlbTGx66+/3vz111/WM7ds2bK2qFmY+++/3/z555/mrLPOSgmhHP/555+n7Tdnzhwr7jrBNwzpBCh8xnXxek3CpEmTzFdffZXyHN5pp53SKgrDjjvuaI499lhz33332b74/PTTT+app56yoqwTal3RsxdffNFuiLadOnVKvYe4jXDrC8ZsvKaiZ0IIIYQoLIjQIVKoevXqNpVV7dq1Tc+ePc2vv/6a2ufII4+0NozbyPV/+umnp+Xux64aPHiwTUdFvQDSQh188MHm4YcfzmMXde/e3abMYpEZ2+ykk05KW6jmGlGL7thKFMuNahdpu7D/SCXlR0iRGstvu799/PHHdh8intxrpMBi8Z22s3gf5TQQhiirDh062DGkHTVr1jRt27Y133//fVqf3IbDAfUbsDHj+lYUY0VB4WxQn4ExaN26ddq54saQjaiy8P3wN6LZosYBBw9ses4ftumFEEIULRJyhRD5gocAjMV7773X1KpVy9x+++3mrrvuMtddd501fvHCHTp0qOnTp4+56qqrrFENFStWNBdeeKF97ZVXXrEG9JQpU2xRsUMOOcQcdthhGVMM4PU7ceLEyIJgGM0Iq3juDho0yBriFEojLUMm7rnnHns8uWxpCw9G5ORF4K1Ro4a55ZZb8vQd4ZpCbscdd1wqZy15dF999VWbemK//fZL22gDxjrF1Ry0NSz4ko9XCCGEECITLIA3btzY5vqnoOyPP/5oF88RCg899NA0e+Oiiy4yS5cutTbUuHHjrJ3jp4Ai6mnYsGFm4MCB5ttvv7Xpoy6++GIbKeWLqo0aNbIC5pAhQ+xCObYSqbe6deuWrz64ds2cOdPaeDfccIPtQxjsPvbzN9riIFKJ1xYtWmSL8dJ2IqYOOOCAyGgxB4V6sfUQfCmMSzsocEstCL/vQCQW1/jwww9N5cqVrX3JPYiiKMYqCTgMIB5jy7p+Dx8+PG3c/L6wffrpp3nuh79h30eNwzfffGOfAVavXm1tfMZbCCHEBiIQQogsdOzYMWjbtm2e12+99dagSpUqwerVq+3v48aNC5o1axZss802Qbly5YJGjRoFjz76aJ7j/vrrr6B///7B3nvvHZQvXz7YbbfdgosvvjhYvnx52n78iRo7dmzaa4MGDbKv0ya/fbzGVqZMGdumFi1a2Gv/999/ifo4b948e56qVasGZcuWDXbZZZege/fuwS+//BK5P+3les8991zqtTvuuCPYfvvtg3/++SfP/n///bd9b/jw4fb32rVrp9rsb0888UTWtq5atcruO7Pvron6JoQQmyLubyH/C7G50bJly6BmzZrBmjVr0l5funRpsPXWWweXXHKJ/b158+ZBz5490/bB1mAfR4MGDYIbb7wx4/VatWoV1KhRI2Xz+axcuTKj7RZlS0a1q2HDhsEpp5yS+n3u3Ln2fNOnT49t16hRo4Ltttsuz+vLli0LKleuHJx99tmxx3Jezo8NmIlwnxYvXmxfu//++yP7tiHGKswff/wRVKhQIfj++++D9u3bB7fcckuivuRyjbhjzzvvvKBixYrBihUrglz+dlce2S/YaXR0O4UQYlNnVQHsWHnkCiGyQthaVOgXxcd+/vlnG14Fbdq0sV4ArM6TpuCzzz6z+WPDELp244032vyza9assR4NDzzwgPVw8MFmDIeq4bHB67TJbx+vseFdQZsmTJhgr00ahyQQjsh58Oolr++CBQvMiBEjbOqFKGgv18M714GXMR61eOuGIeSR93r06JHy1nBt9jffQ0YIIYQQIgzetuTk79q1q02F4LPzzjvbKCc8S6MKuXLsc889l4qUcsfgPUpkUdz18CjFm9TZfD7bb799gfpDO99//30b0YW9VBiQTotxIPorLiUX9Q+wE1944YXEabvAjTn24oYeqzi4p6TG2GuvvawtST2LpIV8C8oVV1xh/vjjD2t7R0HU2++//562CSGEyD8ScoUQQgghhBCihEA6BUS6evXqRb7P6yweO2GWOgAVKlSwwiIL1KQQQOhzkAqLfRF0999/f5sX9c0330y9T9oGrodQWJi4dpFD9ogjjrBFZN2Ctw9pt9jP35JAexEY/ZzBPqTPYtGelA7k1j366KNteom4lAmAAwI1Ikgv1rx58zzvF9VYJUmr4JwBWrZsadNFvPfee/m6H/5GrYhsuL7ipBAFuY/JLew2l5JMCCFE/pCQK4QQJZSdr/1yYzdBCCGEEBuJpB6XeKaSh//LL780H3zwgS34So5/RE7YZ599zNdff20LiFE8jcgmCnNR0yCX6+SKaxd5Z1u1amXrLETVSsC7OFxTIAmu3RTnQpD0BUo8gAHPWVfcltzCzz//vNl3333zeJdStJfjqPVAsVuEU0TvuGtuSBDmP/nkk1Rh4TJlythCvbkW2XX3w9+ItstlnKMgmg5h2W3kaBZCCJF/yhTgWCGEEEIIIYQQGxCEWEQzUlSdcsoped7ndTxMSR0AeEFyjDsWga9atWpWIHViLSkGmjRpYrfLL7/cPPnkk+bcc8+14mrdunXt9Uh9kA2ETsS6MBQPox0+frtIDcDPFL5t0aJF2n54cLr9coFxoBAaXsgIkn46Cbxx/TYjXLPdfPPNtvgt/1MIzUExONpFm924RlFUY5UJ7ue///5rqlevniau4ulMQd+k5/LvR67jDLvttlvk+7SDTQghROEgj1whhBBCCCGEKCEgTCIyEgpPTQIf512KR2achyRpASB8rA9euvDnn3+aHXbYwYqb9957r/09Snh0kKP1888/T3uf/LN4A++5556x18PbtWfPnqZXr16F4tWKV/HTTz9tay0gUiOaIlK6LZxb2MGYkSog3E/STnBcJhEXNsRY+SDgPv744+bOO+9M86TlHAi7zzzzjClq7rrrLiuYhwV4IYQQRYM8coUQooTy06AG5s+tSptqN83e2E0RQgghxAYET0vSEDjvUbwhv/nmG9O7d2/rbXrLLbek5XVF4IVly5bZPLAUniW9Apx22mmmadOm9nwIlnPnzrXh8IiJLv8pwiT7HHTQQWbAgAE2rQAiIikIRo4cmfLKvPLKK80FF1xgj0NsRsy8++67bc5e5/0bR5cuXWzbSF1AmxzkuHXt94uG0QdA+OV9/kconTp1qhk0aJD1MB08eHDs9RA8+/fvbz2PEa4ptEZeWfIH9+3b1+SXohgrchiHU0rgVU1f2Z/zhD1v27VrZ711yXmcBH+eOPCkxbvbwfiyDwXMfvjhB1v8l4LIiMlFVchNCCFEOhJyhRBCCCGEEKIEQQj/Z599ZoXIM844w6xYscKKsHig8hqeoY6HHnrIboAoh7D4xhtvWI9QQAzGc5OiVIT6cx4Kf91444023yrsvvvu5osvvrAC8VVXXWWWLl1qvVMbNWpkxUkHeVoRVCmgdvXVV5utt97a7jNlyhRTtWrVjH2izeedd5697qmnnpp6PcrTk/aeeeaZ9ufff//dipp40+IZSr86duxoPXz5PY6aNWuaXXfd1dx00022UBfHu9+vuOIKk1+KYqzwLmbzQfSeNm1aKuVDGITc22+/3cyYMSMyn28Yf544mBtvvfVW6vfOnTvb/xHRWTA4/PDDbX7ehg0b5jBCQgghCkKpYGNkZBdCCJFveGDBYJ/Zd1dTUR65QojN/G8hwlMmsUYIIUTx+9tdeWQ/U7p8ObOs47Ubu0lCCFGi7FjlyBWbDJ06dbJeCFGQAwzvBELECBGqXLmyOf30020Img8eAKzGu40PVrNmzWyYlQ/vEUaUrQ1HHnmkLRiRDcKiyFfWunXrtHP5bQlveAy4a0S974dR+a9vs8021ouD84fzckUxevToPKFShG/Vr1/f/PPPP2mv491BWBpeCM6zgX4tXrw4bT88E/Dw4H32A7e/28j/Rsjf9OnTs45nVBsz9Yfzt2zZMu11QsV4/d133017/bXXXjPNmze3udXwlKAICOfwCbedfal4TCXkWbNmRV4/vLnwQCGEEEIIIYQQQogoJOSKTR5yOBFyRL4rcoiRzwnBkVxVVK/9+OOP0/ZHgENoZENgRfQ88cQTI6vKFhbkr+revbsNpVqyZIl9bfjw4al2sMGoUaNSv3/66aep4y+66KK0fdkIpfJxxyJek7tr9erVtv/ktMoVKvf+8ccfVhz3hVDa0a9fv7TwKsKuwtd47LHH0qoF+0ycONG28+2337ZtbNWqVVphiMIAEZnrTJ48OeN+5Clr27atzXNG6BqhaYTxIZJTjCOu7RSYIDcbOdAaNGhg3nnnnbT9WHEL36/58+cXah+FEEIIIYQorszu0EveuEIIkQ8k5IpNHiqpIsjiWUkOsdq1a9viAxRSqFevnvUu9TOMIPKRG4yNwgcUKUBQRAAuCjj3mDFjzKWXXmo9cp23J97Arh1sgNep+92vmounqL8vW9g93x2LJy+eri+88II5++yzzWWXXWaLJOQC50YYpkIuAifgKYs4S3EMH3KUsa8Pv/N6FHji0s7GjRubO+64wxblcNcoLPBKPv/8820+sjgWLlxo85rRL0RZ5gLVinltyJAhaX0Pt53caAjACLuI5cwxqhA78MAN369seeOEEEIIIYQQQgixeSMhV2zyUBiASrB4RvqULl3aFjL49ttvrQdlnDcvoiMiqCsIUdg899xztlot5z/nnHOs5/CGSl1N//GspYpurhx11FGma9euVpB9/vnnbT/wvHVFMRxt2rSxQvEHH3xgf+d/fj/ppJOyXqN8+fL2/3AKh8KANBpfffWVFbSj4PV169ZFet5SVblChQq20EYmmGMU2sDbNkkaCyGEEEIIIYQQQog4JOSKTR48afG8jcK97nvbIu4h0rEhJOIVimBXVIVUSKuAgAvkbSWFQzgnbzbuu+++VJvd9tRTT2U9DgEZXJ7aXKG6MZBuAK9Vdz6fsmXLpgRq4H9+5/VMkE6Barz0BQ/qTH318wEnpXr16lZkve6662yajTDMCbyiqYIchjzAeN0m8dKOGmPucbgPpJCIgwUFkqH7mxBCCCGEEEIIITYvJOSKzYJcPFzxjP3f//5nN7woSXlAYbTPPvus0Ns1c+ZM88knn5izzjrL/o43a/v27a24mwukSHBtdhuesEnHhVB/yFUcRejGY5XUDoiicZDGAK/dn376yf7P73Ecdthh9vqVKlWyntKknfDTDkT1lfQX+aFv375m+fLlKZG5KAiPMVAMLdyHhx9+OKNgjqjstl122aXI2iuEEEIIIURRU+fpO0zVxwbZTQghRHLSY6CF2ATZc889bdGpKNzr7ON7W5IL1XHggQeal19+2ebaffLJJ1NCXFTxM7xIEdqSgmCLNyjeob7wt9VWW5l77rkn8bnYz29zUlz/d9ttN/s/gqIjqQcy4vMWW2yRJlSGqV+/vvVMRbDGC3q//fZLu5YPwi35aMk3S0qLJH3daaedTH7g/OT0vemmm2xBOx/mBPeY4nP+/XGpHmbPnm3TS+Q6xi7lQi73izZeeeWVqd/xyJWYK4QQQgghhBBCbF7II1ds8hD2T9GpcB7c9evXm2HDhlnRMJw/NwxC5V9//ZXmtRvOeUoxK67hi8KZQMAlpyxFs3zPTM6BcJgt/2phgDiNYNuiRQv7O+Ki2/IrjsaBF+67776b0RsXECjr1KkTKeIWBd27d7fC6vDhw9Neb9eunU3/wP0Jc//995s///wz5UkdB3NsxIgRVsRlQSC/IOxzn/xNCCGEEEIIIYQQmxfyyBWbFHhQhj09ycc6btw4W1wLUe7ggw82y5Ytszld8ZZE5PW9SRFYSQEAFALDQ5SCaIThO/COvOCCC6yXKYXUEPXuvvtuW8TrwgsvTLs+ofvhNpF3derUqXZ/zhP2vEVExFs3ae7XNWvWpNrsi3+kJ/C9hdmHfKvkdn3ggQespzFicjbRFJE63AfOH5d7OIqLLrrIpqjYUAJtUsqVK2c9crt165b2eq1atcztt99urrrqKrvPueeea4Vd5tK1115rX2cu+fz66692jLkfX3/9tRXKSZ3x+uuv28UA3+s6fL8A8RxRWQghhBBCCCGEECKMFAOxSYHHJ56P/oZIN2nSJHPeeedZAQ5vU4qKIax9/PHH5pBDDkk7xzfffGOFVrYDDjjAPPfcc2bkyJH2eAeemOQ0Jbdqo0aN7PkQ5qZMmZKWzxWefvrpPG166KGHrFCLJ2xU+gSEXHLyzpgxI1G/OZ9rs9vC3qKdO3e2ryM+k/eXPLSIjB06dMh6/tWrV+fpA8J4LpCCoXLlyvb/4kbHjh1t8bIwl19+uRk7dqx5//33TePGjW1KCO4n84EieGG4n4wxqSSuvvpqK3RzD8MpGEiNEL5fbD///HOR9lMIIYQoKhYuXGijbogqIk1V7dq1bf58FjkdRx55pF08dxs2E4u88+fPT1s8Hjx4sLVXyMW/ww472IXTcC557C6iavj+ZnGZiB5sk3feeSe1D9dg0TpMp06dzMknnxzZLhZvia4iP71fY4GipX7b/Q17EkaPHp16DTuTBXXaTi7/qJRcYWgHtkfc72Hi+pfEXnbtZAEZWxTbrk+fPmbp0qVp+954442RffYL3Ibvq9tcMdmofvH+s88+m3YtFsB33XXX1O/+ePob98i/l+51FtyZUzhZYKMTGZUNCgwfffTRdp5R86Fu3brWLiSNVnis3JzFTp8zZ07qHLSZtvtMnz7dzm32p72cF6cGVyjXnRdHizDh8yW9z8xZ5t2QIUPSzhU3b9kYP3eNqM3do1zmjBBCiKKl+CkqQuQTjD22OG6++Wa7ZQJjlS0JCKDZRFCMnvxw0EEH5SnQFlewLck1cin2FgYDzxl5ubyP4Zjpuojk/vvZ9s/U12xtzLYvRi8CfhQUjctWOC5J2/PTViGEEKIkgKh16KGHWgGU1FCkFOJ7tXfv3ubNN9+0QidCGSBmIWzyvYmAi8BH9BSLpsACPFFD1ApgEZXFTxa3iWLyRdWmTZvaKB9EKxZQ161bZ95++20bYfP999/n3AfXLiKXcAC4+OKL7flZ/PYhkmvfffdNe428/g7SH1HMlv4h0n300UdWYBs1apT58MMP8+Td35jQTtrLGH/xxRc2EglHA+wtxtRBf+m3T3hh3o1fpn18EDevv/76VCqrONx4+oTrMuBQwfiyCEDU3VtvvWUXEV544QXzyiuvxLaDiDuOZUGAVFgsHMyaNcu8+OKL9lzhsaJGBu8zN1g0YLHej7hyvPbaa7Zfxx9/vHnqqadsyjAW6yn4269fPxvtVxQgXiOs8j+fPfj0009TfWEu0i5334E+OxhDxsMnHEmXdM4IIYQoOiTkCiGEEEIIIfIN4ileuOPHj08JQ6QowmMPEeu6666z0SyA1+POO+9sfyYa5bLLLjNdunRJnQvhrWvXrtab0RGuZcD7iHlEFm2zzTZpgmO2XPxx+O0iigkhecKECXmEXERbt18UtMvvH9E5iH60DZHNFc4tDpDSCaGO9iLCt23b1t4z+vzBBx+k9kMIzdTn8Pglgcgx7jVRZdzPJOMZBx7Zbp8aNWqYhg0b2oi7Y445xjp5hNOeOZivHIcY6WC+hsVMf6y4pzfccIM5++yzzY8//mjrZviQXov5c8IJJ9ioLgeLG3hnR3ngFgZ4FlPPAzGdtGmItocddpipUqVKah+3mOL6EsbNhcKYM0IIIYoOpVYQQmxS8KBE2oioDa+ITYmdr/3SVLtp9sZuhhBCiM2YFStWWE9YxDjfuw8QexC88ECMilzhWFJY+TnnOQaPWGoMxF0Pj0vEY1/EdRQ0Fz/txDsYr17E6cIA8YtxQLgMe3oWJ7h/1GfAc7io0z3h1YnAj/BIrYnChnQJLAC89NJLsfsw10gLQGq0XHDz3KVf8OGz8Msvv1jRPoqiqhWBVyziON7N/M/vxWXO4OWOB6+/CSGEyD8ScoUQmxRvvPGGLcwWtWVLkSCEEEKI3CDUHPEzrgAqr5MWwQmz9913n11cRYTFu5VQbULBHUOHDrX7IrLtv//+ViQiPYMDL0iu5+doLQxcu/DuPOKII2x+1R49euTZDy/H8EJxEmgvRXT9nMHFETeupK9wfPXVV3n6HC7I68bPbRSFzQbiPykWuOdxkFs4fO1WrVol7ovfjzB4fSN6Nm/e3HrannLKKdYTO5PQiPBLnQQ8f8PeuO7z4K69oaC9pJEgRQnwPwsk1LjIBcYiPNYLFizI15zxIbUIOXXdRj5rIYQQ+UepFYQQmxQUVxFCCCHEhiVprng8U/HEBPKZDho0yBx33HHm888/tzlI99lnH/P111/b3/Hyw1uS1ATkl6fgWUHy/idpF6Jz//79rWDLFgbv4jjROhOu3aQKIELITyeBUN2sWTNTHPDb6UCwxJvYx+VYjbqvST1PEc3xyCVHbTiFhYM5QS5Wn7Dnd6a+uH4gPPtpLRA5yW9LXlhqaOAFPm3aNDsfb7vtNpu2A3HXUbNmTXs+Uifg6Use3SiP7aKan5kgLzUpIVwKEupQYA8zVy+44ILE5xk2bJgt3OuTJKdz1Jzxueaaa8yVV16ZJjxLzBVCiPwjIVcIIYQQQgiRL/bYYw8r4Hz33XfWozEMr1eqVCmVqxOPPI5xxxICjmCG6ORymZYuXdo0adLEbhRDQ4A799xzrVBYt25de70kBc0QAfHoDEOeUtrh47cLb0Z+Js9qWNhCgHL75QLjgPiJFzIRQn46Cbw7iwu00xVydSBYZuuzP365gPcoHq6Iqf41HcyF/JzX9YXctIBg3KtXr8j9GH/mF9vAgQNt7tf777/fFt5zkG6D+0eaDOZVHBwLzE8KAMbhhHDmZ1j0jpqfmeAzRHFBv6gbHuV4uuci5OIFn9+5DVH3zwn2bEIIIQoHpVYQQogSyk+DGpil/evYTQghhNgYIEwee+yxNrSeYks+P/30k/U+bd++fay3Hl6RED7WBy9dIJcqBZuOP/54c++990bmVvWLSeFJimevDzlqv/zyy5TgFgUh5T179rTCX2F4WJI79OmnnzYnn3yyFSYRAhHM3JbUw7So4R48+OCDNrWEXySrKGE8CL2nGF6mNAi5goctKSHatWtnf0eA9cc8DhYdWFgIzy0EYbxeM4m4gHd55cqV0wqoRc1PFiToe3h+zpkzx4q7meanD3387LPPzLvvvpuWTozfp06dmmjBo6TNGSGE2NyRR64QQgghhBAi35BXlDQECKx4ViJ64SHYu3dv6+14yy23pPYlNB2B16VWwAOSPKkIYHDaaaeZpk2b2vPhITh37lwbmo2w5XJxIuKyz0EHHWQ9Lcml+++//5oJEyZYQdB5CBLOjUcixyE2I87dfffdNn2C8/6Ng9QHtI0QetrkIMeta78Dj0r6AAi/vM//iHaIaYTr42E5ePDgnMeWfMEIcz4IjVWrVrU/Mz7h9xEJowrBRQnMa9eutbl7ERQRHynUFS4QxtiG+4ww79pQUFq3bm09lB944IE853TjGQZhFiHUFdNiH0R65hTF8BCHTzzxRHPeeefFXpfrMXZ4kiPSMhaPP/64nbvMk/zAuJMChPy7eF6TZxnhmHHF05ucs88++6wVhJmD5BLGk7Z+/fpm4cKFpm/fvtYTPJzWI+4+443L5wAhNQwe7bw/ZMiQRG1nvobHmnb6cynpnBFCCFF0SMgVQgghhBBC5BsEJbwCyS17xhlnmBUrVlgRFg9UXsOL1vHQQw/ZzXk/IsJSqNQVjkIMJucnQhyeiZzn6KOPNjfeeGMqdHz33Xe3eVMRiBHCKECFN2CjRo2skOsXb0IIpJjW1Vdfbbbeemu7D3l3s4mQtBkRkOueeuqpqdfDqRaA9p555pmp/J8IrQidhM/Tr44dO1oP33Be2STgycvmg8B8/fXX25/93KN+GoDDDz8867lpG+3EA5kxRUznfIy5D8Kmny8WCJVH0CssyEsblZPYjWcY7rlrJ8It+zA/mFPkih0xYoQddyf2RoEA+sEHH9j8uUuWLLHjsO+++5qXX37ZFkDLL23btjUfffSRncMdOnRI5YRlHrPQ4Rg+fLgV9xFv58+fb/vDggPzOuzBHnWf33vvPZt2hOOjwBv5zjvvtAsJZcuWzdruzp0753mNPvDZyXXOCCGEKEICIcRGZ8GCBUHnzp2DatWqBWXLlg1q1aoV9OjRI/jll1+Cn376KShTpkzwzDPPRB57/vnnBwceeGDq9zVr1gSVKlUKdtxxx2Dt2rV59q9du3YwbNiwxG3r379/0KBBg9Tv69evD4455pjguOOOy7PvvffeG2y33XbBwoULg8mTJxOLGGy//fbBX3/9lbbfJ598Yt/z/wS5/d220047Baeeemowe/bsrG0PtzFbfzh/ly5d0l6fPn26fX3u3Llpr48ePTpo3LhxUL58+aBChQrBEUccEbz66qtp+/htL1WqVLDtttsGBxxwQNC7d+9gyZIlkdcPb3vttVeQlFWrVtljZvbdNVhyw+52E0KIzQ33t5D/hRBClKy/3ZVH9gt2Gn2L3YQQYnNjVQHsWOXIFWIjQy6sxo0bm1mzZlmPjh9//NEWWHjnnXdskQRW0Ak5o2BBGEIECdPyCxkQAog3AWGEeBQUNqzCU+GXyr6EpPkhX3369LGhaFT29UOyxo4dm3YOwrxq1aoVef6ZM2dar4jnn3/eeoBQqZpQucKE8EfawJhngtx4hFaS22/GjBm2gjEeLnhaEEYa1/ZPP/3UekdMnDjR7LfffjZ/mQ/3B08Sf8MjRAghhBBCCCGEECIOCblCbGS6detmqwGPHz/ehnEhcLZq1cqKgIsXL7YVmhFqEXbJq+WD2EnesrPPPjv1GgIlFYDZ+LkoIDyMcDCETgRcwhZpI+FVVPz1IazNF6EpikBuMF6PgpxnhMeR6+uGG24w3377rRW3CxPCwo466ig7tnF8/PHHNhyNvGL0k/xm9erVs+FuVNAmjIxcZuG2E1pGHj9CLD/88EMb6nnppZem7UfoH/v5G4UxhBBCCCEKCnYkoe9RG2H2QhQHZnfoZZZ1vNZuQgghkiMhV4iNCDnk3n77bdO1a9c8FYsR9xBox4wZY0444QSby2306NFp++AZS942imzA7Nmz/097dwIvY/n/f/yiZCkVKVvZShtSCqEQop2SshRJpFRU2lSiIhFJC0oLFdqJNltKG4lsSYVosaVNlqLO//G6vv9rftfc5545M3N25/18PO6cM3PP3NvENZ/7c30+tqkG9elYqJFGza3sQCC2efPm5sorr7TZqcuXL4/K0HUI7LIfLghNxnCVKlVMnTp1MtyGOyf//PNPlu8/NcnYF2r6hSE7mi88ZOQGUY9v9+7d9vUZ7T911wjo0hwiVTTxoL6av4iIiIiEodkWjbHCFsYlIiIikn8pkCuSi5jaTzYrmZ5heJzOynRIJnBKIJf1XdCWACmBVIfMV7IwaPRAkw4ahhDszS5PPvmkDeCSocrPZJ8GkaXKPrkgNPvo73MslBt46KGHbLdr1wAFlCzIiuwSAskEu2M1iPjmm29sB2OypYMqVKhgG5awTkZch+3vv/8+8hilFoLHEO+LFY0m6HbtFjKiRURERMIwdmImUdjiN54TERGR/EeBXJE8wAVn4yH4SRmD999/3/5OgJbMVjrggjqy48ePtyUVHH4mgPrff/9l+P5kzCYbHCVIS8YqAWc6U8fbd/aDesBkDPulIIKor7v//vvbYCk1gMl69YOpt9xyS5Zll9A5mGA4ZS1SvS4Zce/hdx8mMB08hnvvvTfme9xxxx22c7dbgiUdRERERERERGTvt29u74BIQUZmBAG+lStXmgsvvDDd8zxOdi2ZrgRNTz/9dBvAbdq0qZkwYYLp3r17JEBIiQZq6tKYy0eAl/q6Z555Ztx9IXBKQNFJNGODeq8s8ZCR26NHD1tHl+ZlhxxySMx1CayS7crx0igtiFqynDdfqtklZNxyDm+//fZ09YSpc0sDMso6BLNyaWhGeQPWyQjXEATdHd4veAzxFC1a1C4iIiIiInuDIyc+ZAoXL2Z/Vp1cEZHEKSNXJBcR0CTA+sQTT9gmYL6NGzeaF1980QZmXbCWQCgZqiwEba+44orI+gQiabAVzPTksUSanhGMza6pd7x3586dzdy5czMsq1C1alUbYA0L4mYHGqpRIoEGbD7O219//RVa95eSD0WKFDFt27aN+95cU0pO0LgtrOyEiIiIiIiIiEiilJErkstoFNawYUNbz5ap/gQyV6xYYUsIUONs0KBBkXXbtWtnbrjhBlvOoGXLlpFaqVu2bDHTpk0zb775pqlZs2bU+xNAJduXxmouOEsQ2M++ReXKlW32b6yAZHB9Aq0EXBN133332WOKl42bG2gid9NNN5lhw4ZFPd6gQQPTu3dvu89k5VI6ggZnL7zwgnnkkUfMyJEj09WqpaHZrl27zLZt28wXX3xhhg4dan755Rfz+uuvR623Z88eG6j3EaxnX0REREREREREwigjVySXVa9e3SxcuNBUq1bNNt8iOEoZgjPOOMPWk/UzY0uUKGEzRWmA5me2UmaBurLNmzdP9/48Vrx4cRuA9DNKTzrppKjlrbfeirmPZKwG1yeYnAzKCVAWwa8Vm1f07dvX1gUOIlhLtvSkSZNsgPyUU04xH374oZkyZYq5/vrr061P7VtKVJx88slmyJAhpkWLFrYZ3PHHHx+1HoH68uXLRy0E0kVERCRrMXuJsUdYPf1evXrZ59wMJ/4M1vznxiv/5jNOo8wRN3EpE0XZKofySbwPC2O1WrVqmXHjxqXbHuWuHn74Yft8sWLF7A10yk99/PHHUevRV+Dggw+Oe1z0Rahbt67dHjfXmzRpYqZPnx61DjOh3H6xMB6sUaOGnS3ko2QXjWuDgvsxYMAAc+KJJ5qMkADA+JVx399//x15L39fwhYaw7KNsOdc81i3v+5xrgmJD1yT4I3zMGyD17kEheDvGZ2DVD57LMzk4oY9M/Fo/BvsX+F/hvyF8aS/n8HF9caIdVyUKiPBwMc15DyHnU9/8f+f8R/nOwffXzg+EhdERCRnKZArkgcQxGOgyJcFsj9pPDZq1KjQ7FWm+tNAi+xc5+abb7bBXQaJYQFUniOT1w3seH1w8Zuk+Rjoha0/a9asyPNhg18GhawXa/DLFyW/mVhG67t9D/uiEWsfYh1PcF1q8pLVzPb9WrYgYE6gnS8llFogkMuXhbBjZWFgTv1ctkFGbrly5RI6n2TyioiISNYj+EoJJb+MFf/uTpw40VSqVCnuuIObs3PmzLEzd5YtW2beffdde7OdILCPpqUbNmywN3AZU1GD/5133ok8z7/13IxnPWb8UEOfQCv7xjiCm8TJ3IDmhjrlt5YuXWoWLFhgTjvtNNO6dWs70yto1apVdt+++uor+7prrrkmKhCd1SgBRsCY4Ks7LvaVfXALM584R/5jbqYTr/UfZ6Fvgc+9dvXq1XZ73DTn/JIMkZecddZZdj/5LPF54LPD9T/vvPPsDK2wz5C/BBMHGH/7zz/++ONxt08QlwSOjASvBQvjWB99OnichAS2y7i4fv36NqFERERyjkoriIiIiIjIXqtOnTo24EfGZqdOnexj/EwQl5JWsVx77bU2A5FAKVmIDoHGYM1/smLdzdvbbrvNBsFmzpxpM27x8ssvm1dffdWWwfJvCJMdu3XrVnPVVVfZbE1/O2E+++wzM3z4cHvD3w/yUYqL4DTlogjo+uWfyMp0N8q5sc9rFy1aFDqTKyvQm4FgNsFrfiaISzYwi59oQDZx8Ia3660Q9rjPf+3hhx9uTj31VBs45roww41ZUXkBGcNuP8kc5rPIvnLuSeLguod9hmIhySOjdXx8RkaMGGFvPPA5iCXWtfDxGXLrkPhAmbcuXbqY6667zn6mY5VoExGRrKWMXBHZq1AiIdYyb948szcp12+JKT9wtV1EREQkNgJ8ZBQ6TG/v2rVrzPXpLUD2LQGwsOBqrBlEzMwhQ5TZUAQrHbJ/jz766HSzetzMKoK5BH4zQrknxjRhJa54H+r5s/0wBFY5JmZ+kUmZHQiYUxqMYCoLY69169aZnEBQkWBiIiUWclOzZs1M7dq1c2Q/O3ToYJsYk+2bHW688Uab9ZvIZ1dERLKGArkislehpEGshRq3IiIiUvCQIcr0fIKKLNSljVVWCt99950NfPq1WeMhC5cAKxmYF198sQ0o+tmW9Bs47rjjQl/rHmedjLAO/RT8ILFDnX7KRQXfh4xV9o3XnHvuueaee+4xjRs3NtmBADlZyBw/dXJp5usH0BNBCYvgzfiwGsdBhQsXtsFyyhjkdXyugvvpPkPxkhBokOw/v3jx4rjbcXV2yfwmyB4LPSGC237xxRcTOg7EO+fUSabsmL+IiEjqVFpBRPYqZB2IiIiI+A499FAbxGQ6OwFafqYZVyx+Hf9E3HLLLbb5EzVE+ZmyDMExSbLvmVX7RjCQafsE1CgTwVR4gqzUys1KNHOjCdsjjzwSeYxgOTV9+/fvbwOtiaB5LCUofASoEz03rrEuAWUXCKUfBbVd8wp/P4OfIR/lGHwvvfRS1A0Bv4RGLATTqaF8991328zwMJQcufPOO6MeozlbIseBeM2MH3jgATNw4MAM30tERBKjQK6ISD61cXBts73o/74UqbyCiIhIxuUVCGIioyZR1atXt8Gpr7/+OqH3JihM4JbllVdeMbVq1bIzgWjCBTJFaXAWxj3OOhlhHTKLaY4bzMr9+eefbbZj8H2oA+xKQVDfd/78+bamrgvkEiT9448/0m3r999/NwcddJBJ1HvvvWd++uknWxM3GOCluRo1gBPBcaVyY57tfPvtt6Zu3br293HjxkUa3IU1BM5NXPNgfWb3GYqHwG0q54asXBrMESwOw3VO5X3dZzderek77rjD1m52+IwmEoAWEZFwKq0gIiIiIiJ7vbPOOssGQKkjS5ZiPK4sAAHf7du3hwY5YyFIRTCTAJbTvn17G2ScNm1auvVpXkYTq0QCnbzPX3/9ZcaOHZvuuYceesgGLNu2bRv3PfbZZ59IgNNlwNL8LIjHEgkuOzQ2Y/+Cpa14jOeyG9nA1CZ2x082qwuuk5GbV8yZM8eWj8joOmWlevXqmYsuusjcfvvtWfq+I0eOtDcC4jWXo9wI6/iLiIikThm5IiIiIiKy1yOA6TII+TkjBHEbNWpkg2A0izrhhBPMnj17bGOn0aNHx8ywRe/evU3NmjXNwoULbWYuwUwydWnINWzYMNO8eXObmcg2KCPAc35TNbJLCYIGA2JkVfLeZFYSlG7Tpo0NTL/wwgu2pAGBtWC24+bNm82uXbsipRWef/55W8fXITP3scceMzfccIOt68t23nrrLdtYLRh4JgAc3C/KNhCcY12OheP2de7c2Vx44YW2gRwB8oxwjjdu3Bj1GNnR/lT/HTt22HVY98cffzRvvPGGefjhh+2xnHHGGSZZq1atSvcY2cvxrkWsmsc+zjn7yXts2rTJNpuj1MB5551nz4uPpmHB4y5RokSWBT7JwuaY9t03fQjAnc/gMVLr2L95wTocE3WYuZkwZcoUM2HChJjN/0REJOspI1cKNOpQMQAOw0CVZhBkIjCQYbpTu3bt0tXXGjBggB1cuoWpSaeffrr54IMPotbjOQY7Ge1D06ZNTZ8+fTLcdzoC8yWEGm/+e/n7ElyqVKkS2UbY834jCf9xvlgwxZD3/+KLLzLcN+rP+QM6fnfvRX208uXL20wVuib7/P0qVqyYPfcMdv1acDRTiHV8n332WWQ9vtzwRalOnTp2/7kudAi+66677NTDjM538Bi4zieeeGKGx87nhi8pfF4Y6AZxDdz+Mjhn6iVT/0RERCT7JZMRWK1aNZuVSmDw5ptvtgFKsmYpE0AgNx5KKrRs2dLWhgX/7r/88sumX79+NuBIFizjRRqvzZ07N914lKzbk046KWo5//zz7XMEa2lORaCVfSJQ/OGHH9px5vXXX59uX9gWYy8yU2modfXVV5tHH3006jh5PWUkyKysX7++3VeCy2Qx+wjgBfeL9yOYx3iLAHUQjxUvXtwGmxPBWJv99ZdgRu1TTz1lH6fxG5mmX331la0fy3lJBYH24HEReM3oWmSEwC37yfiPc/n++++bUaNGmalTp6a7mcBnJXjct956q8kqjKspL0JQP8idT3/p0KFD1Dpdu3a1j9PgjIA5DdG4MdCxY8cs20cREclYobSsqrovkg8RmOTucjDASgCuWbNmNtDIdDcGtAzmCCqShTFr1ixz6qmnRgJ8r776qn0MZBswtY3BLxkCrrYYA3iyBYID9eA+EFgkYMggPR4yJhhAMVWNLAI6FVPfzJ8qx2CLTsFuEM6AkWYfbIPBHNklse76s7/utQz4GLjT8Zb9pCNxMIsgGAQlOOqmHfI72SPsJ3/lrF271jYBIUBOnTbH3y+uAVPPevToYQe8ro4bgVzqcHG+XaaEw7REphTyWr48LV261DZXIJuG42a7fOkhu4BrGe98B4+B68yxBzMygviSQoYCx8mXqWCdOAby3bp1M927d7fZD3xOmOb29ttv26YciSCDh8/VqtuqmJKqkSsiBZT7u5B/+zRVV0Qkf/3dXWb03aZw8WL2sU1d+uX2bomI5JtxrEoriIQgqEfG6+LFi20WJ8gEeO2112xQl0Dc8uXLIx1amaJUrlw5+zN/EogkCErw0zVcyEpkBpB1wHQ9pjgRdCTDg78Igk0pyCp1+xYM2oY9Huu1BCAJjjIlkEYhZCL4060ywrly70WAmXPIFD7+AvP/4vL3izv/TPUjeB7srEzQNtb+k+lCIxDOD1kTTqVKlUyTJk2yrGt0GALrdGhmG/wcDOS6KYhu38mMGTp0qD3GRAO5IiIiIiIiIlLwqLSCSIiJEyfaqXMuiOtQFuDGG2+007eWLFkS+lqyQQniEgRlKlt2YLob05p4f4KGZMjmVHI9x08NLwKPqaJWG9nJZAjHqlHH8cybN89O8wt2Zc4IWbdcPz+I63MB+Ky2evVqewPgkksusQv7z5TJWP777z97c4DGHMkeo4iIiIjkDmbtMTMu1hIsHybpre7Y12biKhtXRCQ5CuSKhCCTNlYDA/c46zh0nnUDN2qAUVqBYGJ2TfV0WZ+g9AHp+MGavBmhhlhw0Pniiy9m+DoCyK7EQTLYR7ZB/TSaVVAjrFevXlGNPfz9ouxC48aNbbCTzN2ghg0bptt/h2sTDKLTZMOtx2uzAwF1smrJVHbdrgnqB5GF646RZiOsT6mMWLg5QOayv4iIiIhI7qCkGeW2Yi08LyIikh1UWkEkhmQyXAka0qUXZKtS9oDGaAQraUCRlagzS2MBMlpdWQem7xPcpd5rojp16mTuvPPOqMf8bsAZnReX1eoHUAkujxkzJvR1lBOgYQidld955x0bNKZ7bqz9IkuVZnMEXcMCr5zjRLoF+wHi7du323q7NPTIanQjHj9+vO0Y7Z+Pvn372uYVZHM7dJqmNvKGDRvsz9QLpgFJLNTzpdaviIiIiOQ+xt/xxm4iIiLZRYFckRA03Fq5cmXoc+5x1nGYFu8P5pjST2Msau26Dr0EMslKDaKZVrCubTwEbPfs2RN1p5/gKtmd1JNN9L1YL5UBqDt+Go7Bb/4VLwOZQKbbHgFYyhBQ9/b555+PuV+UkOBnGsvRRdl3xBFHxNz/6tWr24C3j7q8IFPWxz5nxXV57733zE8//ZSuJi4BXrpbU+rBKVOmjN13Fpqd1apVywb86XAd5o477jA33XRT5Hcycjl+ERERERERESk4FMgVCdG+fXubFUodXL9OLtP8aaRFwC1YPzeI2q87d+6Mytr94osvbLMwP8jHNuJNq/cRwJ0wYYIZPny4bTzma9OmjS3n0LNnT5OdCE4T/HSB1VSzEW6//XZz5JFH2pq7derUCV2HbN/evXvbrFYazyVa27ZDhw7mrrvusq+JVSfXvy4zZsxI9zjZw36wPpEAu/vc+Mg65jk/kOsjIEvwl2Dt1KlTQ9chSM8iIiIiIrI3OHLiQ6Zw8WIpv161dUWkoFIgVwo8sjH9rFI3JZ6g2vnnn2+DpvXr1zebNm0ygwcPthmps2bNigoqEmDduHFjVGkFGqJRC9Uho7Jbt262xixBPab5P/roo7aEQDCQu2XLlnT7REYpjbRYn/cJZou2bdvWBgwTDeTu2LEjss8OwULqtfpZqaxDjVbqzo4dO9ZmGhNMpplbZhDApG4tZQemT58ec72rr77a3HfffbYpGPVkna1bt6bbf/apWLFiNjj81ltvmebNm9vyDKeffro9Lo6Bsg5+gzWygslkpg4v14FzwGsJik+bNi3q/QnMB68LmdYEtlmX8ho1a9aMer5z5872OH/99dd02cAOwWpet3DhwiwvxSEiIiIiIiIiewcFcqXAmzt3brqsTQKlc+bMsYHbfv36mXXr1tmA3RlnnGE+++yzdMG6FStWRKbulyhRwmaajh492gbx/CxRSiCMGDHCZqOy3sknn2zrtQZr006cONEuPoKZ8+fPt5mwYVP+CeQOHTrULF261JxwwgkZHvdTTz1lFx/Nud59993I7127drV/EhytWLGiOe2002x93lgZtMki4NqgQQP7nvXq1Qtdh+An53HAgAHmoosuijweLLUAgq9kxbK/lDMge5hmY2S7kk1NOQiakbFdp1q1avYakEnLe/7zzz822E7JAxrJ+QgEBz8rBIt5T5q28XMQj9EAjxIbYU3bQIY3GdYEtd9+++0EzpyIiIiIiIiIFDSF0pLp6CQiIrmOGrkE81fdVsWULPq/JmrlB67O7d0SEcmVvwuZWROvRruIiOS9v7vLjL5bpRVEpMD6MxPj2P9roy4iIiIiIiIJo8zT9ddfb2f4UJ6J0lGU5mJmEKpUqWJnCDn8TnkuFmZn0fB03Lhx6d73/fffN+ecc4455JBD7HrM3rn55pttY1U899xzMctc8d6UwsL3339vf6eslHuts2HDBrPvvvva51nPeeONN2yjWb5gMiOtRo0apk+fPlGvZQYTM8HoGcH+0ci1UaNGdibU7t277TpXXHFF5FiLFCliZ0bdeuutZteuXTH31/3uFvavUqVKtkQZpb4cjt9fzy3MynKC22cGHOXNnnnmGTtTKxE//PCDufLKK22TYZobV65c2ZbEosSXr2nTplH7wbbatWtnZ/X5vTGGDBliZ34xW4tZZ5RvC17/jD5TYefMP2b6ZoTtF+eG/g8PPPCAnSXouM9I2MJMxOD55rNEyTL2/d577w1tGiwiItlHgVwRkXyqXL8lNhNX2bgiIiI5jwAYZbIoxzVs2DCzbNkyW6KKUly9evWK+TqCXwRRly9fbvsydO/e3dbwd+hJQLmncuXK2R4B9F0YM2aMDZjRuyEVlMiix4Fv/Pjx9nEfwUKasFKyi9JXNOqlcasLzrogLuW4CEr26NHDfPLJJ3Zdjpn+D5QccyhTxbGuWbPGNgzm2OhfkBECwrxu7dq15oknnjDPP/+8uf/++6PWIYOJdfzFD5z62+dacY65NgRizzvvPNvjIh72md4F3377rS3f9d1339nrwDmiNBj9D3xcR7b1888/214bBIG5vs7AgQPtOaBcGteUYD3nj54Umf1MxeP2a9WqVbbcGKW8OI4geoAEzyf7EjzfP/74o73m7DufqRNPPNEes4iI5AzVyBUREREREUnStddeazMUCWJSK98hg5UszljIciVICxrjktk6c+ZMW3OfIBk19VkI+vmZvI0bN44K+iWjS5cukb4BDr/zOIFFh+atZNbecsstkcfI4vSzPMkwpr8ATVr93gFkkJKFSqDXIaPUHSuZpQSoOdYHH3ww7v6Sbey/rnXr1mbRokVR63Du3Tqx+NsnaE2fB7KN6WFAlmmw4bCPwClZuDNmzLAZtCA7mGOmHwb9FeiJ4ZCZ7LZF74zrrrvONu11aIrLZ4Zz5JDRnBWfqXj8/aL/BU1+uQY0/PWR/R3vfPrnm+M77rjjbKYw+0amNf0gREQk+ykjV0REREREJAlkY5IpSbDPD7g5scoe+JjeT8btb7/9ZgOGoNkqgVACY2ESed8wF1xwgd3ORx99ZH/nT34nEOcjUEdGLdnCsbz44os2IBtsAAtKGISdD/CeZHK6Y00UzWbJUGUqf1Zo1qyZDaC+/vrrca/ve++9ZwOrLojrn6NOnTqZl156KapEQfD1L7/8ctQ+8zqOY8uWLdn2mYqHfZ03b575+uuvk74GsRx22GH2XBCkpnREGEpiUAvSX0REJHUK5IqIiIiIiCSBafYExqh3miyycA844ACbLXrxxRfbeqMuM5Rp/ExhJ+MxKxFgZZo/9WHBn/zO4z5qs9atW9fW7iULuH379nZdvz4t+5jocU+fPt0eK/VZec/NmzdHZfvG0qFDh8jrjjnmGJv16WcTg1ITrOMvZDUngv336wIHcYxcX7JOw/A4gXA/KEsJCPaBICzZrZQycOcbI0aMsOsT0D3hhBNMz549o0pqZOYzFY/bLz5vZHVzA4GM76CGDRumO5+JYH+3bduWrm6wQ01e6i27hQxrERFJnUoriIjkUxsH1zbbi6Z+P061dUVERFITKxMzEQQyaUpFvVF+JuvzqKOOirwvU9izA1PzCdYNHjzYZv5++umn6erEEoR86623zOrVq20NV5pd0WTtkUceseszTT+ZY6e2K+UHtm/fbktF0LyM+rsZYV2yfsnyJMBJs7PLL7/cTJ48OapERbDcQjB7Nhb/PBNQ9csC/PXXX1HrJYrMVMotYNOmTfY8t2zZ0tYZZl9pWEdWMr9//PHHtjwFGdF8Fmh4lpnPVCL7ReCZ+sR8BliCyDCOFbiOx+13rM8tAXiun0NGroK5IiKpUyBXREREREQkCdWrV7eBK6apJ6tMmTI2cMtCQJVMVZpqEeijHi2ZpgR542XlkrVLcJTsysKF/++mrquhS+ZjENshe5JsVwJ2NWvWNF9++WXo+1MDloVMYYKA7BeBPmqs8nOix01g2AWpyU6lpMHTTz9tunXrFvd1ZK2615GRS8Yn+03DM/c4x+1+TtbKlStN1apVI83n+vbtG/U878v1Zb0LL7ww9PVkUh966KGRxzjnbn/4k+PkGnLeXMY1+0zGM0ufPn1sAJkANec4mc8UgWE+J0Fc/+C19/eLcg/8TJ1gAuU+gqupnE/OBZ9HspDDkAnMIiIiWUOlFURERERERJJQunRp06pVK/P444/bgGpQok3JCJ5deumlkbIBlFqgfikN0MK49yW4STZtMBDrMlQJtsbKyp07d25SjbMosUAmrjvOjh07mlmzZpnFixenW3f37t2h58MFMfv162fuuusus3PnTpOMffbZx/6Z7OvCUKd22bJlkcxg6ry6wLoLZBKUPPPMM21ZguA2N27caOsEc93iZU8nss8E78E5S+YzxfUns9dH9vKSJUtiXntQLqF37942cJ0VGcCUypg4caJthuffUBARkeyjv20lSzE1iAFNcGFKFH744Qc7cKxQoYIdpFauXNkOJsJqKvEa7voffvjh9i4ud825E0+H3CA6wjJYIqshaMCAAebEE0/M1HFNmjTJvj/NB8I89dRTNsOAwRGNCGj+QD0okHFABoTfwRdvv/22PQcMuKnRxXliGz/99FPUemRkMA2N510tr1TXD1uYMte0adOYz7PwvBvIu8cY0HNcTAXz8eWA5/3BJgPFJ5980jZ8cOeIzBO6Hu/YsSPD8881dNvl2MhkocYXr/drtiHWsTBtzuF3aq6tW7cu6rUMQvkMO9Qxo6MvHYpd12MG2EyHczgn7Ic77ngLXaHJzKCZhY9BN+9PHTkRERHJHwi4ETyrV6+ebVpGXVWyE0eNGmUaNGiQ8PswFp42bZod4xLYpawApQwYQ37wwQd2vMLYg/EuYwlQM5Zp+4yrZ8+ebdauXWsbZVGmgQBjxYoVQ7fVvXt3O75xGaJhYy4arTGu4T0J1rINArQENkEmaaNGjUzz5s3tOWAcs2bNGpvtSaYn5yGWdu3a2fErr4uHcSQB059//tmeA7JmCVD6U/8ZX7JOcCFL2WGcyGOMlxlzU+6gdevW5rzzzjOdO3eOuw+PPfaYfT1jP8og8D2Gc8x54PwOGjQoan3GtG4fOCeMIRlvcp1ckJ5rO3/+fHtNOcd8t+C4XF3cRD9TlCpgDE6gmXUI6Pfo0cOWT4h1bR0+RzSQ4/19fB8Lnstdu3alO99812CfyLCmRAMZv0OGDIm7TRERyToK5EqWO+uss+w/8P5CEJYBHsE7BhsERgnUjhkzxg4+GZj4wS0GsieffLIdZIwdO9Z89dVX5o033rCDHOp0BQdN1Mti0Ok3FMhKTI3i/dlvf0ADtsmAlqYBDKIYaLOuq6/FgI3pYNSk8genDKTvvvtuU6dOncjjDAonTJgQ9f7jx4+PORhPdn2yJ4LXhvNM1173+4IFC9Kt63f1ZSDNY9T4okkGx+E3agjDlDHOEQNn6q1xnjj2qVOnmhkzZphE8IWF7a5fv96+B18ECJYzgOT8+tin4HEGM1sIrPbv3z/uNsnU4AsM55TPIh15CRSH3XhgP/ztXXLJJen+X6C5CV/Q/BsCfDHq0qWLPZd8qRAREZH8oVq1ajY4SB1YxqeUKiDIx9iWurCJIiuTYJ8blxCMZXxE8JFp/Yx/Cc4xfd0vAcCU/SZNmtjAHOMkxqKMtYI32X3uhjh/huH9GLMT5GS7NA8jeMf+kAUKbj7PnDnTjncZpxO8pVQAwUb2gfMQb/vXXXedHZfFytwFyRzc/Cahg0QOjo/xpr/f1FplneBClqhD4JXHuPHOuIwxJPvJGNRlzMZCqQO+k3CdGddRaoJgKdebesFk0AYTO9w+sM4vv/xiEzfceSMgTMCeurgEbxn/cY45t+64Ev1McU64znwPYSzPsXGdCDiXLVs27nGx31xfgvZ+0JtSC8FzOWXKlHTnm+8ZfHfj2nMMjJWzujmfiIjEVigtu6qqS4FENiNBSv8ffYeBIME/AmJ+IwIGHQyMGFAwQOEjSaYnd7AJKgan6fD+ZHQ6BNkICDNQI9OXulJ+AX0GKexPrBpgGSEbwQURGYAxQGVKmZ/FSY2sZ599NuZ7MGjktfPmzbNZqZwngtOffPKJHbiRMUuwm6lmDMo5Rw6DPzIryMBgXxiIpro+A62MspPjrct7EZBlcZh6xiCOTrwgu4DBJxkBXCeyM9gfrgFfLnxcawaFYXXcfLGuIdeaTGgahVAzDQRa2W+yZGMhiMsXIfaZjAn3hYNryT4/99xz9nPGdeV4+FITS9g5iff/AvtMxvbzzz9vMzM4Nra3dOlS+wUtEe6crbqtiimpZmciUkC5vwupE5no358iIpI3/u4uM/puU7h4sZTfZ1OXflm6XyIi+WUcq4xcyRFk27733ns2wyDYTZbp6nRTJSBJYI9g3YoVK+xd6LBaS34Q12XLks3I/wQEiwmKZSUCtOeee659f7bD9oL7T3mC4DR9H4FNjp2AJ+UfCG6SSRvMhrjgggtsAPSjjz6yv/Mnv3PnPkyy62cl7uAzJYvtUSIiFmqIEVwOBnFdQDWjIG48LlPEzxhOFFMCyYC9/fbbQ5+nBAQLgdhg+YbMYJ/JJGa6Hf9P8DOfsXh/ebN9/qL3FxEREREREREpWMLn1IhkAnU+CYA5BNpcQX2/rpWPxwkIUrPL1dVytaLiYV2CqC6QR6CVmlFkqsZrPpBMsJLA8KOPPmp/b9++vQ0wk+nqOt1SMuGiiy6ymZlMk2Kq0TnnnGOzLf1ANAE7soZ5j+HDh4ceX5EiRewxME3qtNNOs3/yO4+HSXZ9pv8Hg+OuBESiKA/A+SW4SJMNpmfFq8XFNXJTyrKDm5Lmo15YcFoh07+4YeDjmpxwwgk2U/r000+Peo4gO9eeMg1kfFMCg8xcrh+vyQxq4TGlj8/J9ddfbwP98bCfAwcOzNQ2RURERETyitUd+2o2hYhICpSRK1mOoBRZtW6hDpWTSCWPZKp9ELikZAG1vkBgjNR0utFmBep/Ub+L9wXboU6VX4uXmlDUyaL7LQE6gptk3lKryq87RSYyAW2ahLFeLDSUIGuXkhP8mVFX4WTWJ+vZvzaplJugjAGv4xxTJoIawK7Db5jsrt7C+weD9gRsg8dJ9nJYTTpKesTKyqVGLk02qI3L9aTMAgHdzGZ9s7933nmn/XwQFM8Inaz5XLuFZhsiIiIiIiIiUrAoI1ey3P77758usMfUe4JXdDilaUMQj1OP9NBDD7VZrX4t0Vjo6Ep9XAKYfokCHifQSifdzKKMAmUh/HIQBN+oZ0qGpJ/dSp1VFkoo9OzZ02Z40mXXz7ZkP2msEC9bmPrAZJnSxIBMZd4zXsA1mfWpHRwv6JoIgtm8BwuBY7ZPEzuComG4nlzL7MJnx2VHO5RrSPQ4uY7sY1hdZ1CrmeA9Cw3ayD4mC5sauJnhPrOxmo34aCrCIiIiIiIiIiIFlzJyJUfQEItAGFPed+7cGfUcgVjqqNIQiwAnjaoIClJ+wM9odWggBbrAbtu2zTbl8jMvJ02aZEstuPVStXXrVjv9ffLkyVHvz/YoAxGczu9zQc143XjjIauW7M+MsnFTXT+rEBjmupExGguN4WjGxrkMy6YlwzRVBIgpV0HmbGaOge7J/fr1szcBMsK1TfW6ioiIiIiIiIikShm5kmMee+wxW6OVUgj333+/zaKkqRlT9StWrGgGDRpk1yOYS/OnFi1a2KxWpqCTcUot12nTptkAKpmuZMvShKx27drpAm033nijDQ736tXLPkbwOJilWrJkSXPkkUfG3N/nn3/eBqAvueSSdBm0lFpg+0y3p2lVhQoVTLNmzczhhx9uNmzYYI+P7GLq5aaCuqzt2rVL19gts+sTnCZw7uM1ZJ2mijIRZAEvXLjQZuYGcf7eeOMNmzFMGYGWLVvac0MpCsoyUCO2TZs2GW6HkhXsO8F9joPANeeZwD+fId+OHTvSHScZrWR9hyEQ/dRTT9naxwSmwTY4pwTHqYnL54VjHDp0aGjjNhERERERScyREx8yhYun/h3E2dSlX5bsj4hIfqGMXMkx1atXt4GwatWq2eAeQdQePXrY0gPUmKVpllOvXj27LtPjCVJSMoAapwR+R44caTZt2mTeeuut0ExMyh1QvoFAq0NGKGUa/OXqq6+Ou7+UZ+B9wsogsF3qpv7yyy824EzDNYJ+TNHnOQKjs2fPtoHgVDDdnhIGiUy7T2Z99pWavv4Sq6RAogicE5zt379/6POcv4kTJ5oRI0bYbdEwjMDogAEDbECUwH4iuPbsb6VKlUzTpk3Nyy+/bAOwNCrzm+uBoGzwOAkkx8JnjyZuu3btijzGe7oawI0bN7bBakor8HnkpoSIiIiIiIiISE4qlJbdnYhERCRL/fnnn7YO8KrbqpiSRVO/H1d+4Oos3S8Rkdz4u5ASPep8LiKSv/7uLjP6bmXkikiB9WcmxrHKyBUREREREckHfvjhB1v2ibJeNBOuXLmyLXNFSSiHmUvMiHJL2bJl7cyxdevWRdahL8CQIUNs+TKa+jI7iZlI48aNi9oepaoog8WMOspU0Vvg/PPPtzPPHLYRNsOLxrB++Sx/v5i9xky2Bx54wPZMcL7//vuoffcXZsDhueeeizxGE2FKZ7Hv9957b0K9F9iPPn36xPw9KNbxZYQyYG4/mTHIF3ZmBd566622FJuPmWphx8z1CTt//kL5sVjHxfP0+/Axu7FKlSqR3/3z6S9+6TWupXu8SJEi9jNF/xNmMIb1NBERkeyjGrlSYDEl/+yzz475PDV5JWcESyP43nnnHVsrWdIr12+JstBEREQKiDVr1tj+CwRAae7r95tgvESg05UqoxQUgU2CpARwCfBddtlldvyLgQMHmrFjx9pyUfQ4IDOIsmY09PWDqo0aNbL9FIYNG2Zq1apldu/ebd577z3bh4Kms8ly+/X333+bOXPm2DJrvD89J3yzZs0yNWrUiHrML1nG+GfVqlX2+Ghw/Mknn9igMH02Pv74YxvozivYT/aXc7xo0SLbb4EScAR6OacOx8tx+4Jl09z5i7eOj2AsPSoo/UYANhZ3Pn3B8nL0BuH8chOAMnc0HOYmwquvvmpLziVaEk5ERDJHf9tKgcWgNdgATXJHvOtAIzwRERGRgo7gKVm4NP4lixb0DiDLk94TNAgePXq0fbxEiRKmXLly9md6BVx33XVR/SEIvF177bU2U9cJNhDmeYJ5CxYsMPvvv39UwJGs4FT4+9W1a1cbSJ45c2a6QC5BW7deGPbLPz76aZApzL6R8frCCy+YvOKwww6zwWr2lyA8PSK4ZhzzRx99FFmPQGi8Yw6ev0TQI4JrTf8Irmci5zMWMrLdOozP69SpY0499VTTvHlzm9V71VVXJbxfIiKSOpVWkAKLATDN1GItknPiXQf3RUVERESkoPr1119tJizBuODYiOBap06dzEsvvRRVpsB/LU1iKT/gv4aM2C1btsTcHhmXBI/9IK5DYDIz2E+yg8nqJTidVQFTzgOBS7JG8yquX8+ePW3m8ObNm7N1W2TaEuAni3f79u1Z/v7NmjWzNwBef/31LH9vEREJp0CuiIiIiIhIHvbtt9/a4CeZp2F4nLIILjD7xBNP2NJVBGHJbmXaPPVMnREjRth1CeiecMIJNrBIeQbnu+++s9vza7RmBbdfZHc2btzY1le94YYb0q3XsGFDu56/JIL93bZtW1TN4LzInVfKVzjLli1Ld8xcl7Dz55abb745w20R/KfEAtc8FmoLB7cdrwRd8Fj84wiijAZlJfxFRERSp9IKIiL51MbBtc32oqnfjys/cHWW7o+IiIhkr7CM2zBkppKJCeqZDh482LRs2dJ88cUXpmTJkub44483y5cvt7+TGfrhhx/a0gQ0taLhWaLbSZbbL4LO99xzjw3YsgSRXRwraB2P229KBbz44otR5STyUt8Ffz+dY445xmYT+4K9EPzrmmhmNEFzMnJpWhcsYeHwmaB+ry/RWXEcS7Cero/axdRkFhGRrKFAroiIiIiISB5GuSmCZStXrjQXXnhhuud5vFSpUubQQw+1vx900EGRUmH8SXMtaskSIHW1TAsXLmzq1q1rF5qhUVf28ssvt4HC6tWr2+0l0tCMICAZnUE0IWM/fP5+Ue6Bn6mz2qJFi6j1jjjiiJRKnXEeCH6ShXzBBRdElZPIS30X2E9UqVIl8hglJjI6Zv/8JYNGdw899JC5//77o7bp8FlItbQcx0LjvVjuuOMOc9NNN0V+JyOX6ysiIqlRaQUREREREZE8jMDkmWeeaafW79y5M+q5jRs32uzTSy+9NGZm5D777GP/DL7WR5YuqKVaunRp06pVK/P444+H1lYlSOtnkpLZ66NG7ZIlS2xzr1iYvt+7d2/Tt2/fLMkApt7sxIkTTZs2bWxgkgBzXuy7wDV48sknbWkJF3jPbpwPMmNphhevDEKyqLNMSYi2bdvGzQgmuO4vIiKSOgVyJVt9+umnduB47rnnpnvujTfesHfgubPMQIsus2QD4L777rNZAzRa8DEgZDAwffp0+zuDVZbPPvssXS0mBrw8N3fu3Mjjqa4fXCZPnmynnsV6nsXd7W7atGnkMepTMaBlIOUPWBlQ8fyXX34ZtV+vvfaafT3niMEuNcyYGhU8L2HoHuvvD68/+eST0zUjSGb/wpbguWRwyuC/TJky9rwGcQ3JkKAhBdvjPPHFg8H3gAED4p7TeNO24l0vt/D+Yec63mfRfRkZMmSIrQHGlwCOjwwPph7659F/jX8d/GlvsY4xq2vQiYiIyN7lscces2MrAqyUQvjhhx9sQzICvGSbDho0KLLujh07bICXhbEXU+oZd1FeARdffLF5+OGHzfz58826devs+JfGZowD3ZiEIC5joHr16tkxKXV6yb4cNWqUadCgQWRbZFsyJiLIzDqMsXr06GHLJ7js31goffDNN9/Y9/dR49btv1t27doVeZ5xKo9t2LDB7hP1fynRwFiOMVuyqBfMfvsLJSmctWvXpns+0eZhjHHZV84N3yEaNWpkfvnlFxtU9e3ZsyfdMfv7kFl8H2P8Onbs2HTPufMZXKhh7PDZ47GffvrJlmGgXEfr1q3NeeedZzp37pxl+ykiIvGptIJkK6ZxUY+JP3/++WdToUIF+/js2bNt8I4BJ0E9AllfffWVmTlzZmQKzrRp0+yActKkSfax3bt3my5dutipQQwYHKbmPPvsszYQ5wfmCFyGBTyTXZ91zzrrrKjHCMzRAMAfKBJ49td1mQ/o3r27DcAyAOLONYNb3iNWnSowre3BBx80N954ox0oce4YAI4ZM8Y8//zzNoMhI9zxprkFaPzA/l1yySVmxYoVNnsi2f2bNWuWDXL6CID7GIizDgPCKVOm2OvsD5KbN29urx+dl9kGgVXqgTEYJiPDb+rAVD/2hf1LBIN5h6mD/fv3jxw/uMYMnH0ZfRZBXS8GvXyBOuWUU+yUsIULF9ovKKng/HAuffvuq7+ORUREJDbKHTD+oLYs4znGrTQrIwOVx7jR7Dz11FN2ASUXSAZ4++23I+M/gsGMsbl5T1kE3qdZs2b2hrMbk1SrVs0G7Bgj0VSLcRYZpCQG+EHIDh062HEfzbRuv/12U6JECbsOweayZcvGPSb2mSAg273ooosijwdLLYD9bd++vf2ZsRhjb8ZtjHc5Lr4nMD5OJeOTTF4WH4kld911l/3ZLw3gzJs3z5x22mkZvjf75pIqOKcE03k/zrmP8TnH5COBxQ9gZxbfLcJqErvzGcQ1d/vJTQPW4fPBZ6p27do2qM95J+NXRERyRqG07KpkLwXeX3/9Zf+xdwNOBpD9+vWzz5G5SHbA+++/H/P11OQ66aSTbNCSrAEGeGQ3Ll26NDJAY1DEAItBBHeI3ZQpBkgEahmAsQ2yJVNdnyAvA+SMxFqX9zrxxBPNyJEjI48xuK1cuXIkO5ZgJrWlFi9ebNddsGCBvWPOa8ICtkxny6i5AeeK8+xPfeOuOtkYTL9r165dyvsXzxlnnGEH2fzVwutnzCslNuUAAGnHSURBVJgReY7ALtslazeRwCXZuhxDWKZrRsKOP+xYEvkssh716PgcxxJ2HsP2g88x5yGYfZ0MBttknKy6rYopqWZnIlJAub8LCUJpqq6ISP76u7vM6LtN4eLFMv1+m7r87/uliEhBGcfq1plkGxoYMDWLu9Bk0TLlyd034M4ud53plhsLryVLgKxQsjf5mYzS4IecoCMBPzcla/369TYDgGYNYZJdPytx/Ny9J0hNQ4NYCLRy1/7aa68NfT6RDrVBTI0bP368/blOnTqZ2r9YVq9ebctpkCXCwnsxXc/hujNtjIB3XrmHlMhnkXXIVCajODeQKc1f9P4iIiIiIiIiIgWL5vJKtqGcAgFcUG6AOw0ffPCBzVyk3AJBvlq1atnMT7JhyYrt1KmTnULkkI06depUc84559jXkO0Z5sorr7SBYrZHBiTrx2sekMz6TBfzyySAqfeVKlVK+FxQM4zaYf/8848tEUFW7A033BBzfUooMPWqSJEiJjM45wSEQRYs70dzhSOPPDKl/WMqVnDqFJnXDueUkhNMt3LT9gi+k4UKrjNZ2R07drQlFKi5xjQ+ptRlNPUuuyTyWWSqIFnhBHQpi8B5oCYYx5oKmkK46+LwWaRsRhhuYlDeQURERETyBsaBjCHDMN51MxEl3OqOfTWbQkQkBcrIlWxBXVLKAxAEBdPoqUNKcBf777+/eeutt8x3331nSx0Q1KL2FoE9mjP45QqoFUtJAFejKgxBMDJB16xZYwOzBGrjSWZ9GkEEmxu4Wr+JIijI6z7++GM76OOYwupTOVmVrUrjLrfPlBKg1i4BVOoPp7J/1J0Nnotgxq8L3sMFyv1GCdRZo6wFQUuCovxJ9jXBzdyQyGeRLs5k7NLYjc8KTSvOP//8DBt4xEKWevA8UqM4FmpGE5R3C81NRERERCT3kAQRHM+5xe/5ICIikpWUkSvZgoAtU+j9gCfBSTIcaRhFLRCQGcpCQIzgIZ1yCRZ27do18jpXSzVeTVUabtFAq1u3brYhAMFImntlxfpkYR511FEmMzhe9x6UnOBnMj/DGjmA8/DRRx/Z7NjMZOWSPevvO3WKqVlLowMCkcnuH43iYp0Lyl/QxdZvbuYCvDQUo6Oyf/6plctCcJlayA899FCk9ENuyOizyLmk+RoLNW9feOEFW46Ddam5S0YBQdYgauO6z7tD2YpkPlP8f+NnqouIiIhI7qpYsWJu74KIiBRAysiVLEcAd8KECWb48OFRd6ZpKEVgl46zYahbS5fb7du3p7RdMiXnzp1rp+kHSyFkxfpZhYxPSkb07ds3ZuYtpQcoWUDJgzDBBl7J4Fgps5CZ/YsVvKfJWTAjgcdcJnYYgpoEUFO97tkhkc8iWbpw65BlS2fnIB4jKCwiIiIiIiIikhnKyJUsN336dPPbb7/ZbNdgJmLbtm1tUI+p9UxbpzYtdUkJTI4aNcpmoPqZm8mgDi/NqBKttZTo+uwb+xssWcCU/FRdffXV5r777rMN16i9GlS/fn1z66232in+ZLleeOGFNgjO9H9KEZx22mk22JoRArFu3wnezpw502bO9u/fP6X927p1a7pzQeM1spkp1/Dmm2+amjVrRj1PoJz9//XXX80nn3xiJk+ebIO7BDfZP1739ttv21q6uYH6vRl9FjkHjRo1suUmyNBeu3atLXfAMVAWAjTlI9uc2sJk9ZJBS8kGblwES1lwsyN4Hikjklt1gkVEREREctKREx8yhYsXy/L33dRFtYlFZO+mQK5kOQK1TMkPBnFdIHfo0KG2dio1Rwnybdq0yTbHYno90/7JbEwFgbAyZcpk+fp+mQe/+dTtt99uUlW6dGl77AQRL7rootB1KH9w8sknm8cff9wGb6kzS+YqQcUuXboktJ0///zTlC9f3v5MYJFAJbVYb7vttpT2L6wUBIFKgs0Etps3b57ueR4rXry4LUVAOQsyXQlQU+eVfapevbqtMUaZgtzQpEkTe47jfRZp2sZxct0pn0AwlyZtnB9X8oPmdB9++KEttcB5onEcQd5XXnnF3jTwrVixInJdHM4FZT5ERERERERERMIUSsuqrkoiIpIjCNBzo2TVbVVMyaKpV8gpP3B1lu6XiEhu/F3IDTZ1PhcRyV9/d5cZfbcyckWkwPozE+NYZeSKiORT5fotUfBCREREREREpIBQszORfKpGjRq2MVnY8uKLL5q90fr162MeMwvPi4iIiGQF6tlff/31tnwSJZCOOOIIc/7555vZs2dHmqOOHDkysj6/U7qLhVJStWrVsuWjgt5//31bm/+QQw6x69FA1fVFwHPPPWd7EIThvadMmWJ//v777+3vNLJ1r3U2bNhgyz/xPOs5b7zxhjn11FNtFhA9HxhP9unTJ+q1lIeiFFrt2rXt/lGKjF4B9DOghwCuuOKKyLEWKVLEVK1a1fZ3CJaJ8vfX/e4W9q9SpUrmpptuMn///XdkHY7fX88txYr9X/ZmcPv0GaC3wTPPPGPLkWUkbL/83300R+b5VJoNU4bLP17OZePGje3nxj9mNG3aNPS4e/bsGXr+3ELvjHjHxXlbt25d1LbatGljz2HY+fQXvzyY//mmbBq/X3LJJWbOnDlJnxcREUmdMnJF8ikahLnBdNDe2jSLhm9ffvll3OdFREREMovgJ8FLAqrDhg2zQVnGXTSN7dWrl/n6669DX0cvgu7du9tGqtTJ5+eKFSuas88+2z4/duxYc+2119p+BzSVJRjGjegJEyaY4cOHmxEjRiS9r7w/r6cRqzN+/Hj7uH+TmwD0pZdeagYNGmQuuOACG5D76quvbDNcP4hLb4AlS5bYxrecA2b/fPbZZ+ahhx6yfQROPPFEuy5BPhfc/eKLL+wx8Z70eYiH1/BaXsd26EdBrwW257DNVatWRb2O9/a57f/777+2z8G7775rmwG/+uqrtgGv62OQ2wiWz5o1ywaYaRxMYPj+++83zz//vP2ZgLrD54XPkI9getj5c/bbb7+42+e80eiYz0Q87nz6uIER9vnmc8L/I/TAoDcE144+ESIikv3yxr9uIpI0GpcVNAzIjzrqqNzeDREREdnLEWwlALZgwQIbZPSDcldeeWXM1xGUoykqaC5LZiuBUgK5P/74o7nhhhvs8vDDD0deQzCXLM1UMj5BAJUAnB/I5Xce94Oj06ZNs4HZW265JfLY0UcfbbMzHTJFad66cOFCG7R1yEpu166dDeD5QT53rGQrE9DjWDMK5BIc91/XunVrs2jRoqh1OPdunVj87RO0rlOnjs02ptEuWb1XXXWVySvjV7efJB1wU4DsYTKeOVcEdf2gbUbH7Z+/RFx33XX2BgHXvWbNmgmdz0Q+32RT87mlgS+BYhoyp9q0WkREEqdArohIPrVxcG2zPRPNzuJRIzQRESmofv31V5vdSeaqH8R1YpU98JF9SRmD3377LZIxSYYugVBKEIRJ5H3DkF07ZswY89FHH9lp9vzJdikD4QdyCcBNnDjRLF++PGZAj/JcBGT9IK5DCQOWMLznJ598knSiwTfffGOn5vvT/DOjWbNmNkD6+uuv55lAbphjjz3WBvfZTz+Qmx0I3nOeb7/9djN9+vQsf3+yoPmcTZ06NfSzTQkJv4wEDX5ERCR1qpErIiIiIiLy/3333XcmLS3NBtuSRRYudfvJbiRDsVSpUpGA4rfffmtLBpDBmJUIrl522WW2Piz4k9+DQVfq/datW9dmhJIF3L59e7uuH2RjHxM9boKCHCs1WHnPzZs3R2X7xtKhQ4fI68jgJMvZzyYGXbyDvRBceYqMsP9+XeC8Kmw/n3jiiQx7X7jz55ZYtX19DzzwgL05MW/evAyvp78MHjw4w/cuXbq0Oeyww2Kec7ZNTWa3kIUtIiKpU0auiIiIiIjI/0cQN1UEMskupdkYP1OiwZWF4n2DdV6zCuUeGjZsaANvZP5++umnZs+ePVHrkF381ltvmdWrV9uGa9S9pcnaI488YtdnWn8yx37GGWeY0aNHm+3bt9tSEZQQaNu2bYavY12yfqltS9CcZmeXX365mTx5ctQU/mC5BRpsJcI/zzQKo46r89dff5m8Iuzz0KlTp3S1ZoO9L9z5cxK5MUBDvc6dO9us3I8//jju9QwGaVM9FocgPdfYz8hVMFdEJHXKyBWRDPGFxNVPI2uDzIkePXqkW4/pVHQt3rZtW6Tj8HHHHZduPb5g8BzZIGEdigsXLmwOP/xw2/yC7I6MOgr7+5fIsfA+Q4YMiXqc9w0OQPmCwWCZLBOyRsiqIRskOAD2953O0axXv3592xCCjJKw7cfrCiwiIiK5p3r16vbf5lgNzeIpU6aMDdyefvrpdrxDPVwairl6tIwLCPLGQ9YuwVHKM/hcDV2yGoMYq5DhSbYmY694tVCPPPJImyU8btw4Gyxl/1566aXIPiZ63ASGOVZKGZDZO3/+fPP0009n+DpKPPA6snHPPfdcM3DgQLt9groOY0HW8Rfq4CZi5cqVdjwKxmI0ynVLXuLvp8O1DR633wzNP39uCSv/EYbzzPWOlcHrrqe/JBLIpYHbli1b0h2LQ3Y6n2l/ERGR1CmQKyJJYTBGZ2SCl3RudsjqIOjJ427AyYCQQCxZHj4G+TRICGJgx5cbmoE89dRT5p133rEZGlmNoCzNJagfFy+zgCmHfAGg9heDbToLk0HQtGnTdINgf9+pEUegm/NEZ+eff/45al2CtqzrL5MmTcry4xQREZHkEbxq1aqVefzxx21ANSjRpmSMGS699NJI2QBKLVAvlwZoYdz7EuAkmzYYeHQZqgRbY2XlMlaJ14wtiJvqZOK64+zYsaOZNWuWWbx4cbp1d+/eHXo+XOC1X79+5q677jI7d+40yeAmOJJ9XRjq7S5btiySGcyUfz8wmVcQLKfUQSIZzFmFzyONz7hOJCtkFTK6uf6JJlWIiEjmqLSCiCTt5JNPttO+unXrZptbEBgle5baa02aNImsxxQ7vhCQpdGgQQP7GIFOvmTceOON6YKXfodiuvqSxXL33XfbgX2i0+kSwXQ0sj6o2RXry9TLL79sXn31VfPmm2/aZiHOk08+aTMPyGSh47DLgvD3nSluZMPwOrKXyVT2p/Ul0hVYREREcg9BXJpE1atXz97UPeGEE2xwdebMmXb6OTd4E8HNYLJjFy5caE455RR705tgGtPLmepOIJWxETd/qUk6fPhwO3Zo2bKlDcjye7Vq1cyqVatMnz59bGA4VmZq9+7dTbt27WI2TRswYIDZsWOHOeecc2xTMgLHo0aNsgFaxjRgG5RfaN68uW1gRfM0btCz/9wE52Y8N6nDsG3KSXDu+vbtG/OcsN2NGzfajGNq8nJ+CU77s7i4oc46QQRmCRq6WWKsQ1By06ZNNjDK2O68886z5zZZa9euTRc8JzvbIUDsZ8cy9iMbOSN8btzxMoZkHEyDM85jsKYw1yd43Iwbme2VFbipQLIEx8pnyefOp4+xPFnmDrPuWIfPDO/B+JbMbs57XgqUi4jszRTIFZGUEMidNm2aDbYyqGYwG9YQgS8hZLByt56MDzJ2yUgN1vsKQ/CWQW+wxltmkfnBvhJkZv8p4xBEV2e+VPhBXId6cnQZ5stcvOwDzgu1zghk8yXDZZyIiIhI3kbwlAzYQYMG2X/3mT1z6KGH2pvZwTqiGdUmJSjbv39/8/bbb9uauYwvHnroIXPhhRfam9UEcwk++nVEKTVwzz33mKuvvtrO7GGswvrc4I4lGHQL4mY7QVaCnAQ+CQ6edNJJZsaMGTYL2AUNGd8QcB47dqwNyDJ+I8jKmCleyQa2T5Cam+TXXHNNzCn/3Pz3b4I3btzYjst4vUOgO6z2K9fB3QwncMs6vI5jIahKYLpLly6RYG8y/PPv+M3B2E8f47pExqgrVqyw+8n6lE7gM0FAlXPE+fYRZGXxkR3OsWZVtjkN+cjKDXLn08fnwi+1weeYhcxyrsOpp55qZs+ebevriohIziiUlplq/iJSIFDXleyJYDkBaqrxhYZgK3VjyTRxCNiS1cHr+JJABi5lEshsGDFihFmzZo0ZOXJkpMOtvz7I0OBLDSULPv/888iAn+zfYECUDAJqrCXStdc/FrKEGUyTXcLvfEFyfyXyhYXBa9h7UpKBgTCZKWTbBvfdN2bMGDtQ5wsTgV22T/YCx+FjQB02qHbH53eUdk0iVt1WxZQsmj0VcsoPXJ0t7ysiklX4u5CgCDVHVXNRRCR//d1dZvTdpnDx6PFwVtjUJXw8LSKyt4xjlZErIikjCEptLwKYfhA3LCv32WeftXVxqa3GlL7HHnss3Xr8Jca0QgLDu3btstP5mK4Vr1MvyCxIpdYXgdhmzZrFnP6XFfe53Hv4jdSS7QrMdDUaVIiIiIiIiIhIwaVArohkCtPZ/KlwYSgvQOYqtdnIyo21PnXHmMbIdDimdoXVxXWdeoOvS7TxiI8pckxXY3obmbI+pj3Gqn/nHo/VbCS4LnfYDjnkkHRdgRPF/vnT/VxGroiIiIjkHhIQYqFp7+mnn56j+5OfrO7YV7MpRERSoECuiGQ7sk0vuOAC20CMUgOxEMDN6UYJQ4YMsc0mXG04p3379raGLnWAg3VyaTxCYNY1Boll8+bNttYudXRTqdXmUD8tWENNRERERHJXsDmaL1ZTOhERkcxQIFdEEkLZg+Bg1c8yzQh1ZJ944omkXpMTatWqZTOGaY4RDOS+8sortmHGsGHDbPdmMmFpEvLmm2/a5/wmHq67Mn+SHfzpp5/axh3UvSFYnGxXYBERERHJ23I6AUFERESBXBFJyNy5c23TMl+3bt0Sfj1lEsJKJeQF9957r+0O7aOmLRnENGSjLi9dpmlQRoM0zkWjRo2i1nfdlXkd08TI8CUI3Lt373TTxhLpCiwiIiIiIiIi4iuUlhXdfEREJMc7XK66rYopWTT1kg3xlB+4OlveV0Qkq2Sm26+IiOTu391lRt9tChcvli3b2NSlX7a8r4hIXhjHZk8EQERERERERERERESyjEoriMheY/369eb444+P+fxXX31lKlWqZPYW5fotURaaiIiIiIiISAGhjFwR2WtUqFDBNmSLtfC8iIiISF50xRVXmDZt2qT7OUyVKlVsHf9kff/997aev1tKlixpatSoYXr16mW+/fbbdI1q/XXdQs8Af5/D1vnuu+9Cj8OtH2wEO2XKFPu4Qz+CsPdlcQ1jBwwYEHnMNY1t3LixPS80ls3IkiVLzAUXXGAOO+wwe0yc00svvdRs3rw59FzRsLdly5Zm8eLFkfdo2rSp6dOnT9T7cuxdu3Y1hx9+uClatKipWrWq6dChg1m4cGHU+wabCIe9X6LXedKkSWafffax19F/r1jnkIXn3TbCnnfXKJnPjIiIZD9l5IrIXoNBvLoHi4iIiMQ3a9YsG4zbsWOHWbZsmXnkkUdM7dq1zbRp00zz5s0j6zHzZ9WqVVGv9QOuOOuss8yzzz4b9dihhx4ac9sETR988EFz9dVXm1KlSsXdT7YdnH1E4NXhGDiW//77z2zdutUGgO+//37z/PPP258JOobZsmWLPc7zzjvPvPfee+bggw+2Acs333zTbN++PfRc/fjjj+aGG24wZ599tm1Qy2uCCNbyvjVr1jRjx441xx57rNm2bZuZOnWqufnmm80HH3xgssPTTz9tbr31VrvN4cOH23P8+uuvm3/++cc+/8MPP5h69epFjgX77bdfVOPf7t27R71n8Nwl+pkREZHspUCuiIiIiIhIAUJ2ably5ezP1apVM+eff74NxnXr1s2sXr3aZne6oK1bLxayTjNax9eiRQubtfrAAw+YoUOHxl2XoG1YwNS/ie+2zcyrWrVqmTPPPNMGGAkWE9QN8/HHH9sGM+PGjbPvATJnzzjjjJjniuWhhx4yjRo1MvPnzzetWrWKWo8e4mQcV69e3cybN88ULvx/k19PPPFE07t3b5Md1q5daz755BPz2muvmffff98GcDt27GhKly4dWWfXrl1RxxJE0Daja5joZ0ZERLKXArkiIvnUxsG1zfaiuV8hp/zA1bm9CyIiIpIJBB0JNF544YXmiy++sNmb2YWA3+DBg22wkQxXShBkJbJgyZoloBkrkEtAcs+ePeaNN94wF198cbos41iKFy9u/3SZrj5KJaxYscJMnDgxKojrxAtIZwbZ0Oeee67tfn7ZZZfZ7FzO7d70mRERkf+T+xEAERERERERyVUEQEGJAYes1QMOOCBqIUjqmz59etTz7dq1y3BbBP/IUr3nnnvirkeQ139vVxYgkWPxjyPo1FNPNf369bMBT2rrckzDhg0zmzZtivma33//3dx33312P8KClq5erDuPOYGSEtQyJoCL9u3bm48++shm6SbjtttuS3edySpO5TMTRL3iP//8M2oREZHUKSNXRERERESkgKM0APzsVKbcL1q0KDQr1aEc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IrH+LuTmoabniojkr7+7y4y+2xQuXiy3d0f+v01d+uX2LogUKH9mYhyb+xEAEREREREREREREYlLNXJFJCaapVEDOQx1bVesWJHj+yT/p1y/JcpCExERERERESkgFMgVkZguuOACU79+/dDnihQpkuP7IyIiIiIiIiJSUKm0gojEVLJkSdvALGwhI1dERERExHfFFVfYZq89e/ZM91yvXr3sc6zj1m3Tpk3UOjS/vf76620j4aJFi5ojjjjCnH/++baRrlOlShX7PiwlSpQwtWrVso2gg/7991/bhJbnixUrZkqVKmUb7H788cdR6z333HPm4IMPjntc48ePN3Xr1rXbY4xM497p06dHrUPzYLdfLDR4rlGjhnnyySej1mvatKnp06dPum0E92PAgAHmxBNPNBnZuXOnbaJbpkwZ8/fff0fey9+XsOX777+32wh7jmbE/v66x7kmFStWtNfk9ddfz3DfREQkaykjV0Qkn9o4uLbZngeaneUVaromIiKSNxB8nTx5sg2iEszErl27zMSJE02lSpVivo7AYqNGjWwwc9iwYTYAu3v3bvPee+/ZIPDXX38dWffee+813bt3Nzt27DCvvPKK/ZkAI4Fa0NO7ffv2ZtasWfa9mjdvbpvLPP744zYwyWuCQeRY+vbtax577DFz//3329ewTy+88IJp3bq1eeSRR8x1110Xtf6qVats+SsCrNOmTTPXXHONOfLII+0+ZIfXXnvNBow55ilTpphLL73ULmeddVZknYsuusjUrFnTnjfn0EMPtX/yWs6Tb999o0MFnF9eu2fPHvPjjz+aN954w55fgvHBQLWIiGQfBXJFREREREQky9SpU8esXr3aZmx26tTJPsbPBHGrVq0a83XXXnutzfpcsGCB2X///SOPE2i88soro9YlK7ZcuXL259tuu80MHTrUzJw5MxLIffnll82rr75q3nzzTZs96hB03Lp1q7nqqqvMmWeeGbWdMJ999pkZPny4GTVqlM0UdgYNGmSD0zfddJMN6BK8dg477LBIZu0NN9xgX7to0aJsC+Q+/fTT5rLLLrOBXH4miEsA3QXRsd9++9lsYnfOgkHbsMd9/msPP/xwc+qpp9qsXa7LJZdcYlq0aJENRyYiIkFK5RIREREREZEsRYDv2Wefjfz+zDPPmK5du8Zc/9dffzXvvvuuzbwNC67GKn3w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UaaB81e/fn0bDA6rmRXmxhtvtEFlMpoTqZvlZ5CSPesvBGITwX5yPmrVqmVuv/12c9xxx5mlS5fGbXzAdSPQTF0xgrdcc84ZU8ySKYdBsJRjJdBNwJrmFpw/Pit+veBYKG1AGQjObyoys/1mzZrZhex1EREREREREZF4CqXlVpcmERFJCTdAuEGy6rYqpmRR3Y9zyg9cndu7ICK58HchN0yV1SUikj/o724REZOpvwsVARARERERERERERHJ41QjV0Ri6tmzZ1T5Bd9ll11mxowZk+P7JP+nXL8lymQQERERkXznyIkPmcLFi+X2bojkmk1d+uX2Lkg+pUCuiMR07733mr59+4Y+pwCiiIiIiIiIiEjOUSBXRGI67LDD7CIiIiIiIiIiIrlLNXJFREREREREQvzwww/myiuvNBUqVDD77befqVy5sundu7fZunVrZJ2mTZuaQoUKRZayZcuadu3amXXr1kXW+ffff82QIUPMsccea4oXL25Kly5t6tevb8aNGxe1vY0bN5rrr7/eVKtWzRQtWtQcccQR5vzzzzezZ8+OrMM2pkyZkm5fr7jiCtOmTZvQ/SpWrJg5+uijzQMPPGD8fufff/991L77y2effWbXee655yKP7bPPPqZUqVJ235m9R6MeERHJOcrIFRHJpzYOrm22F9X9uPyi/MDVub0LIiIikoQ1a9aYBg0a2ADopEmTTNWqVc2KFSvMLbfcYt555x0b6CQgi+7du9vAJkFSArh9+vSxPSXmzZtnnx84cKAZO3aseeyxx8wpp5xiO5YvXLjQ/Pbbb1FB1UaNGpmDDz7YDBs2zNSqVcvs3r3bvPfee6ZXr17m66+/TvoY3H79/fffZs6cOaZHjx72/a+55pqo9WbNmmVq1KgR9dghhxwSVVZt1apV9vh+//1388knn9ig8LPPPms+/vhjG+gWEZHsp0CuiIiIiIiISADBU7JwZ8yYYbNoUalSJXPSSSeZI4880tx5551m9OjR9vESJUqYcuXK2Z/Lly9vrrvuOnP11VdH3uvNN9801157rc3UdWrXrh21PZ4n63XBggVm//33jzxOgJWs4FT4+9W1a1cbSJ45c2a6QC5BW7deGPbLP77jjjvOZgqzb7feemvMBskiIpK1lMolIiIiIiIi4vn1119tJizBVRfEdQhodurUybz00ktRZQr817788su2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IpJjjpz4kClcvFhu74aIFACbuqTvX5OfqbSCiIiIiIiIiIiISB6njFwRkXxq4+DaZruanYkUKGqaJyIiIiJScCkCICIiIiIiIgXSli1bzDXXXGMqVapkihYtasqVK2datWplPv74Y/t8lSpVTKFCheyy//77mzp16phXXnkl8voBAwaYE088MV038jvvvNMce+yxplixYvY9W7RoYV5//XWTlpYWed+RI0em25/g+11xxRWmTZs2GR7Hjz/+aPbbbz9Ts2bNqPdy+x5rcdsIe+6ss86KvJd/HooXL25/v+SSS8ycOXOSPOMiIpIZCuSKiIiIiIhIgdS2bVuzePFiM378ePPNN9+YN9980zRt2tRs3bo1ss69995rNmzYYNerW7euufTSS80nn3wS+n6///67adiwoZkwYYK54447zKJFi8yHH35oX3PrrbeaP/74I1uO47nnnrOBVYLI8+fPt4/17dvX7rdbDj/88MixuMUhaOs/zjJp0qSobbjXrlq1yh7fwQcfbAPUgwYNypZjEhGR9BTIFZEsFS9rYOfOneaee+4xRx99tM14KFOmjGnXrp1ZsWJF1HrB7IGDDjrInH766eaDDz6IWo/npkyZkuE+MBjv06dPhvv+6aefmn322cece+65Ue8VL4uBbAS3jbDne/bsGbW/fkZH9erV7ft/8cUXGe6biIiIiGQtgq7z5s0zDz74oDnjjDNM5cqVTb169WwA9oILLoisV7JkSZtVyxj28ccftxmp06ZNC33Pfv36me+//94GU7t06WKOP/54+7ru3bubL7/80hxwwAFZfhxk+T777LPm8ssvNx07djRPP/20fZxtsd9uYZzrjsUtjstG9pdSpUpFbce9luzlxo0bmyeffNLcfffdpn///ja4KyIi2U+BXBHJEX///be9Y//MM8+Y+++/32Y8vP3222bPnj2mfv365rPPPotav0aNGpFsAAKsBD3PO++8bMtiAIPe66+/3mZN/Pzzz/axRx55JF3WAgNl9/vnn38eeT0D9GAmw9ChQ6O24V5L8JovAn/99Zc9frIaRERERCTnEOhkITGAsWoi9t13X1OkSBHzzz//pHvuv//+M5MnTzadOnUyFSpUCN0er89q77//vtmxY4cda1922WV2H7Zv325yQu/evW0geerUqaHPc17JEvYXERFJnQK5IpIjqAFGQHb6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d27o+7Js3LjRrjNgwIDIY/vuu68pU6aMady4sT0vf//9d9LnRkREUqdArojI//fDDz+YK6+80lSoUMHst99+pnLlyqZ3795m69atZtOmTaZIkSJm8uTJoa/t1q2bqVOnTuT3nTt3mtKlS9uBbtgAN9UvBSIiIiKSf8yaNcts2LDBLFmyxAwePNisXLnS1K5d28yePTtqvQMPPNCu5y/r1q2LWuess85Kt07VqlVjbptA8IMPPmh+++23DPdz1apV6d77sMMOizxPEJrH1q9fb95//33Trl0788ADD5iGDRuabdu2pXRuREQkeQrkiogYY9asWWNOOeUUmyExadIkm90wZswYO8hu0KCBDeKee+655plnnkn32u3bt5uXX37ZBnOd1157zQ54jz32WJv5ICIiIiIFzyGHHGLKlStnqlWrZlq3bm0Du/Xr17fjxn///TeyHtmurOcvZcuWjXqvokWLpltnn332ibntFi1a2HUIuGaEoG3wvQsX/r9wAZm4PEbCQ61atcz1119vPvjgA7N8+XIbLBYRkZyhQK6IiDF2mhtZuDNmzDBNmjQxlSpVMmeffbYdbP/000/mzjvvtANuArtkIvheeeUVs2fPHtOpU6fIY08//bS57LLL7MLPIiIiIiIER5nxRbbtF198ka3bIshLFvCjjz5qfvzxxyx/fxIWGC+//vrrMddhZtqff/4ZtYiISOoUyBWRAu/XX3817733nrn22mtN8eLFo54j84AA7UsvvWTOOeccmxlBHTPfs88+ay666CJz8MEH299Xr15tPv30U3PJJZfYZd68eemmxiVDA2ARERGRvQcBUFdH1/njjz/MAQccELUQJPVNnz496nnKG2TkwgsvNCeeeKK555574q53+OGHR703M8sSPRb/OILIBj7ooIMiyxFHHJHQ+4qISLh9YzwuIlJgUE4hLS3NHHfccaHP8zi1xaiV26VLFxvIvfvuu+0UOIK2BGpnzpwZWZ/yCwy8S5UqZX9v1aqVDfbSKCIVDIAHDhyY4tGJiIiISF7CuBN+0zGaoS1atChqvWCCwRlnnGFGjx4d+X3//fdPaHuUPmjWrJnp27dvzHUYz7IPDmXFEj0W/ziC7rjjDnPTTTdFfichQcFcEZHUKSNXRCQwqI6HZmhr1661TR5AgJbGZQyOQa2z8ePH25IKDj8T/P3vv/9S2i8GwGRpuIWmbCIiIiKSP9HwDH6jMkouHHXUUVFLxYoVo15H4NZ/vnz58gltr3HjxjaxgDFlLOyL/940/U30WOI1XKOuL43c/EVERFKnQK6IFHgMVskkcIPqIB4nu/bQQw811atXN6effroN4BKYnTBhgunatWskE4ESDdTUvfTSS21TCJb27dvb0grB7sSJ0gBYREREZO/A+HHUqFE2+HnSSSfl2HaHDBlipk2bZst/ZZWvv/7avPvuu6Zt27ZZ9p4iIhKfSiuISIFHN+EzzzzTPPHEE+bGG2+Mmsa2ceNG8+KLL5rOnTtHgrU0PbvmmmvMBRdcYIO2V1xxRWR9GpsRuKU5mm/QoEH2ObYjIiIiInkHM56+/PLLdONDVwKA8V7weTJWXRmteCjNxXhyx44dZvny5WbkyJFmwYIF5q233rLNyPyZYawXdNhhh9ls3cyqVauW7ftAEDnM5s2bza5du9KdA1digca+7B+BaI5p7ty55v7777f1d2+55ZZM75+IiCRGgVwREWPMY489Zho2bGinnTEoJUtixYoVdmDKtDYCsQ6NJW644QZz9dVXm5YtW0YG+Vu2bLGZDm+++aapWbNm1PsTCKbZBI3VSpcunekvBSIiIiKSNQhKBrNjuXE/btw4+/NDDz1kF9/zzz8fVUorlhYtWtg/S5QoYcd51Ll98skn7YwwH7Vjw0olbNiwwTbfzQr33nuvbeAb5phjjkn3GNm7p556qv2ZcTH7R/CZpmXHH3+8LdVAcgOzx0REJGcUSkukKKSISAFA+QM6+jJFjIArg+Y2bdrYx8hI8BHEZRD+8ssvRzoGDx8+3AaByWgINoj4559/TNmyZW3TMoLA1NVle0GJfClgoM8AetVtVUzJoqqQIyLJKz9wtcnv3N+FZNKp5IyISP76u7vM6LtN4eLFcnt3RKSA2tSlX74dxyqQKyKSzyiQKyKZpUCuiIjkBgVyRSQv2JSPA7kqrSAiIiIiIiKShJ49e5oXXngh9DlmV40ZMybH9yk/Wd2xr27CiYikQBm5IiL5jLLQRET0d6GI5C5KafH3UBj+TqJJmaSnv7tFRIwyckVERERERERyCoFaBWtFRCSnqbiiiIiIiIiIiIiISB6njFwRkXxq4+DaZruanYlIPrc3NF4TEZHkHDnxITU7E5F8b1MuNE1TBEBEREREREREREQkj1MgV0RERERERERERCSPUyBXRLLFFVdcYdq0aRP5uVChQnYpUqSIqVq1qrn11lvNrl27ol7j1mGhc2PdunXN1KlTo9Z57rnnotZzS7Fi0VOzNm7caHr37m2OOuoo+1zZsmVNo0aNzOjRo82OHTuitjllypS4+4+mTZuaPn36ZHjcn376qdlnn33Mueeem+6577//PmqfS5cubZo0aWLmzZuX4fuKiIiI7M0Yu11//fWmWrVqpmjRouaII44w559/vpk9e7Z9vkqVKmbkyJGR9fndjalKlChhatWqZcaNG5fufd9//31zzjnnmEMOOcSud/zxx5ubb77Z/PTTT5Gx5cEHHxy6T/440Y3jGOe51zobNmww++67r32e9Zw33njDnHrqqbYzecmSJU2NGjXSjSf/+ecfM3ToUFO7dm27f2XKlLFj1meffdbs3r076bG0P671x53sX6VKlcxNN91k/v7776TG1sHtM64+88wzzTPPPGP++++/DK6siIhkJQVyRSRHnHXWWXaQu2bNGvPwww+bsWPHmnvuuSfdegxaWW/hwoV2EHvxxRebZcuWRa1DkJd1/GXdunWR59nGSSedZGbMmGEGDx5sFi9ebAOsDHinT59uZs2alW3H+fTTT9svIR9++KH5+eefQ9dh++wz61SoUMGcd955ZtOmTdm2TyIiIiJ5GcHPk08+2cyZM8cMGzbMjv3effddc8YZZ5hevXrFfN29995rx1TLly83l112menevbt55513Is8z3mzRooUpV66cee2118xXX31lxowZY/744w8zfPjwlPa1YsWKZsKECVGPjR8/3j7uIwB96aWXmrZt25oFCxaYL774wgwaNCgSnHVB3FatWpkhQ4aYHj16mE8++cSuyzE/+uijZsWKFUmPpWONrdeuXWueeOIJ8/zzz5v7778/qbG1v32uFeeYa0PSBOPYPXv2JH0eRUQkNWp2JiI5gswKBtEgw4JB9cyZM82DDz4YtR4ZEazHct9995lHHnnEZlKQZeGQDeDeK8y1115rsw4IBu+///6Rx8nwaN26tUlLS8uWY/zrr7/MSy+9ZLdLVgkZDv36pS9+TkaIO0aenzx5spk/f7654IILsmW/RERERPIyxm6M7whi+mM3MlivvPLKmK8jy9WNCW+77Tab2cr48uyzzzY//vijueGGG+xC4NPP5G3cuLH5/fffU9rX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MdgmaLzqtiqmZFHdjxOR/K38wNWZ+ruQGpiaqisikj+4v7vLjL7bFC5eLLd3R0QkUzZ16Zfj41hFAERERERERERERETyuPB5ICIikueV67dEWWgiIiIiku+s7thX41gRkRQoI1dEREREREREREQkj1MgV0RERERERERERCSPUyBXREREREREREREJI9TIFdEREREREREREQkj1MgV0RERERERERERCSPUyBXREREREREREREJI9TIFdEREREREREREQkj1MgV0RERERERERERCSPUyBXREREREREREREJI9TIFdEREREREREREQkj1MgV0RERERERERERCSPUyBXREREREREREREJI9TIFdEREREREREREQkj1MgV0RERERERERERCSPUyBXREREREREREREJI9TIFdEREREREREREQkj1MgV0RERERERERERCSP2ze3d0BERJKTlpZm//zzzz9ze1dERHKN+zvQ/Z0oIiJ5n8axIiImU+NYBXJFRPKZrVu32j+POOKI3N4VEZFct23bNnPQQQfl9m6IiEgCNI4VEcncOFaBXBGRfKZ06dL2z/Xr1xf44AV3Mvki8MMPP5gDDzzQFFQ6D/+j81CwzgUZDAx+K1SokNu7IiIiCdI4NnUF4d/27KDzlhqdt+w9d5kZxyqQKyKSzxQu/L/y5gx+9Y/q/3AedC50Hhydh4JzLhQEEBHJXzSOzby9/d/27KLzlhqdt+w7d6mOY9XsTERERERERERERCSPUyBXREREREREREREJI9TIFdEJJ8pWrSoueeee+yfBZ3Oxf/oPPyPzsP/0bkQEZG8SP8+pU7nLjU6b6nRecu7565QGhV2RURERERERERERCTPUkauiIiIiIiIiIiISB6nQK6IiIiIiIiIiIhIHqdAroiIiIiIiIiIiEgep0CuiEg+8/jjj5sqVaqYYsWKmfr165sFCxaYvcmHH35ozj//fFOhQgVTqFAhM2XKlKjnKe3ev39/U758eVO8eHHTokUL8+2330at8+uvv5pOnTqZAw880Bx88MGmW7du5q+//jL5yQMPPGDq1q1rSpYsaQ477DDTpk0bs2rVqqh1du3aZXr16mUOOeQQc8ABB5i2bduaTZs2Ra2zfv16c+6555oSJUrY97nlllvMnj17TH4xevRoc8IJJ9hrydKgQQPzzjvvFKhzEGbIkCH2/48+ffqYgn4uREQk/9jbx7HJ0rg3NRonp0bj6r1jHK5ArohIPvLSSy+Zm266yXbBXLRokaldu7Zp1aqV2bx5s9lbbN++3R4XA/0wQ4cONaNGjTJjxowx8+fPN/vvv789B/zj6TCYXbFihZk5c6aZPn26HST36NHD5CcffPCBHQx89tln9jh2795tWrZsac+Pc+ONN5pp06aZV155xa7/888/m4suuijy/L///msHC//884/55JNPzPjx481zzz1nvxDkF4cffrgdLH3xxRdm4cKFplmzZqZ169b2+haUcxD0+eefm7Fjx9qBuK8gngsREck/CsI4Nlka96ZG4+TUaFy9l4zD00REJN+oV69eWq9evSK///vvv2kVKlRIe+CBB9L2Rvwz9cYbb0R+/++//9LKlSuXNmzYsMhjv//+e1rRokXTJk2aZH//6quv7Os+//zzyDrvvPNOWqFChdJ++umntPxq8+bN9rg++OCDyHEXKVIk7ZVXXomss3LlSrvOp59+an9/++230woXLpy2cePGyDqjR49OO/DAA9P+/vvvtPyqVKlSaePGjSuQ52Dbtm1p1atXT5s5c2ZakyZN0nr37m0fL4jnQkRE8peCNo5Nlsa9qdM4OXUFeVydX8fhysgVEcknuHvH3VOmVDmFCxe2v3/66aemIFi7dq3ZuHFj1Dk46KCD7NQ8dw74k2llp5xySmQd1udckcmQX/3xxx/2z9KlS9s/+SyQfeCfi2OPPdZUqlQp6lzUqlXLlC1bNrIOWRx//vln5M57fsKd7MmTJ9tsC6aCFcRzQPYJd/P9Y0ZBPBciIpJ/aBybvII87k2WxsnJ07g6/47D901h30VEJBf88ssv9h9c/y9/8PvXX39tCgIGswg7B+45/qTmkG/fffe1Azu3Tn7z33//2RpMjRo1MjVr1rSPcSz77befHbzHOxdh58o9l18sW7bMDjCZRkjNqTfeeMMcf/zx5ssvvyww5wAMtpmKypSuoIL0eRARkfxH49jkFdRxb7IK+jg5WRpX5/9xuAK5IiIi+eDu7/Lly81HH32U27uSK4455hg7uCTb4tVXXzVdunSxtacKkh9++MH07t3b1oGjQYyIiIiIaJycLI2r8/84XKUVRETyiTJlyph99tknXfdLfi9XrpwpCNxxxjsH/BlsmkE3UDr65sfzdN1119nGFe+//75tUOBwLExT/P333+Oei7Bz5Z7LL7jDfdRRR5mTTz7ZdimmKcgjjzxSoM4BU7b4XNepU8dm2rAw6KYBCj9zR7+gnAsREcl/NI5NXkEc9yZL4+TkaVyd/8fhCuSKiOSjf3T5B3f27NlRU4n4nekxBUHVqlXtP3T+OaCuEDXA3DngT/4R5R9cZ86cOfZcUVMsv6DnBYNTpjux/xy7j89CkSJFos7FqlWrzPr166POBdOn/AE+d5IPPPBAO4Uqv+Ja/v333wXqHDRv3tweBxkUbqEeHp2q3c8F5VyIiEj+o3Fs8grSuDdZGidnnYI4rs734/Ck27SJiEiumTx5su1U+9xzz9kutT169Eg7+OCDo7pf7g3dQBcvXmwX/pkaMWKE/XndunX2+SFDhthjnjp1atrSpUvTWrdunVa1atW0nTt3Rt7jrLPOSjvppJPS5s+fn/bRRx/Z7qIdOnRIy0+uueaatIMOOiht7ty5aRs2bIgsO3bsiKzTs2fPtEqVKqXNmTMnbeHChWkNGjSwi7Nnz560mjVrprVs2TLtyy+/THv33XfTDj300LQ77rgjLb+4/fbbbQfitWvX2uvN73RinjFjRoE5B7H43XIL+rkQEZG8ryCMY5OlcW9qNE5OjcbVe8c4XIFcEZF85tFHH7X/SOy3335p9erVS/vss8/S9ibvv/++HcgGly5dutjn//vvv7S77747rWzZsvbLQPPmzdNWrVoV9R5bt261A9gDDjgg7cADD0zr2rWrHSjnJ2HngOXZZ5+NrMMg/tprr00rVapUWokSJdIuvPBCO4j1ff/992lnn312WvHixdPKlCmTdvPNN6ft3r07Lb+48sor0ypXrmw/7wx2uN5usFlQzkGiA8iCfC5ERCR/2NvHscnSuDc1GienRuPqvWMcXoj/JJ1XLCIiIiIiIiIiIiI5RjVyRURERERERERERPI4BXJFRERERERERERE8jgFckVERERERERERETyOAVyRURERERERERERPI4BXJFRERERERERERE8jgFckVERERERERERETyOAVyRURERERERERERPI4BXJFRERERERERERE8jgFckVERERERERERETyOAVyRURECpiNGzea66+/3lSrVs0ULVrUHHHEEeb88883s2fPztH9KFSokJkyZUqOblNERERE8i+NY6Wg2ze3d0BERERyzvfff28aNWpkDj74YDNs2DBTq1Yts3v3bvPee++ZXr16ma+//jq3d1FEREREJB2NY0WMKZSWlpaW2zshIiIiOeOcc84xS5cuNatWrTL7779/1HO///67HRivX7/eZjqQ2VC4cGFz1llnmUcffdSULVvWrnfFFVfYdf0shD59+pgvv/zSzJ071/7etGlTc8IJJ5hixYqZcePGmf3228/07NnTDBgwwD5fpUoVs27dusjrK1eubAfnIiIiIiJhNI4VUWkFERGRAuPXX3817777rs1YCA5+weD3v//+M61bt7brfvDBB2bmzJlmzZo15tJLL016e+PHj7fbmT9/vhk6dKi599577fvh888/t38+++yzZsOGDZHfRURERESCNI4V+R+VVhARESkgvvvuO8NEnGOPPTbmOmQvLFu2zKxdu9bWHMOECRNMjRo17CC1bt26CW+PTIZ77rnH/ly9enXz2GOP2fc/88wzzaGHHhoZdJcrVy7TxyYiIiIiey+NY0X+Rxm5IiIiBUQi1ZRWrlxpB75u8Ivjjz/eDlR5LhkMgH3ly5c3mzdvTuo9REREREQ0jhX5HwVyRURECgiyCeiwm9lGENQbCw6maTQRVKRIkajf2TZT3kREREREkqFxrMj/KJArIiJSQJQuXdq0atXKPP7442b79u3pnqfxw3HHHWd++OEHuzhfffWVfY6MBjCdjHpgPhpEJIsB8r///pvSsYiIiIhIwaFxrMj/KJArIiJSgDD4ZdBZr14989prr5lvv/3WTjUbNWqUadCggWnRooWpVauW6dSpk1m0aJFZsGCB6dy5s2nSpIk55ZRT7Hs0a9bMLFy40NYc4/XUD1u+fHnS+0LHX2qNbdy40fz222/ZcLQiIiIisrfQOFZEgVwREZECpVq1anZge8YZZ5ibb77Z1KxZ0zZtYCA6evRoO21s6tSpplSpUqZx48Z2QMxrXnrppch7kA1x9913m1tvvdU2jdi2bZsdJCdr+PDhtvsvdcxOOumkLD5SEREREdmbaBwrYkyhtEQqRouIiIiIiIiIiIhIrlFGroiIiIiIiIiIiEgep0CuiIiIiIiIiIiISB6nQK6IiIiIiIiIiIhIHqdAroiIiIiIiIiIiEgep0CuiIiIiIiIiIiISB6nQK6IiIiIiIiIiIhIHqdAroiIiIiIiIiIiEgep0CuiIiIiIiIiIiISB6nQK6IiIiIiIiIiIhIHqdAroiIiIiIiIiIiEgep0CuiIiIiIiIiIiISB6nQK6IiIiIiIiIiIiIydv+H+oEPobQpMSsAAAAAElFTkSuQmCC"
&gt;
&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;



&lt;p&gt;Irregular shapes and spiculated margins are typically more concerning for malignancy, while oval/round shapes with circumscribed margins tend to be benign.&lt;/p&gt;
&lt;h3&gt;Breast Density&lt;/h3&gt;
&lt;p&gt;Breast density (1-4 scale) affects mammogram interpretation - denser tissue makes abnormalities harder to detect:&lt;/p&gt;

&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;

&lt;div class="inner_cell"&gt;
    &lt;div class="input_area"&gt;
&lt;div class=" highlight hl-ipython3"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;density_col&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;breast_density&amp;#39;&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;breast_density&amp;#39;&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;all_df&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;columns&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;breast density&amp;#39;&lt;/span&gt;
&lt;span class="n"&gt;breast_density_counts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;all_df&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;density_col&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;value_counts&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sort_index&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;figure&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;figsize&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;bar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;breast_density_counts&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;astype&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;breast_density_counts&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;values&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;#2980b9&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Breast Density Distribution&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fontsize&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fontweight&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;bold&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;xlabel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Breast Density (1=fatty, 4=extremely dense)&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ylabel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Count&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;enumerate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;breast_density_counts&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;values&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;ha&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;center&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;va&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;bottom&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tight_layout&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;show&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

    &lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;div class="output_wrapper"&gt;
&lt;div class="output"&gt;

&lt;div class="output_area"&gt;



&lt;div class="output_png output_subarea "&gt;
&lt;img src="data:image/png;base64,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64YNGyR37txJbktrKp5++mm3WgwAAAB40QPyypUrJ6tXr5bff/9djh8/bsJF5cqVpUiRIulTQmQZGhb2798vsbGx8tlnn0lYWJhs27bNGS66d+9uno2i/Sf+9a9/yZNPPilfffXVbc3uIiMjTV+Mf//73x7aEwAAAKTJk7eVBgl9KB6QUlr7UKlSJWdn7T179si7774rs2bNcj4LRScNqo0bNzbnmNZqPPXUU27b+eijj6Ru3bpmGwAAAPDCUaGAtJSQkCBxcXFJLtOaMJ0SL7969aosWbJEwsPDM6iUAAAASNcaCyA1tE9Ou3btpGzZsnLlyhVZuHChbN261Qwt++OPP8rixYvN8LL6DIszZ86YoWm1/4SOROZK17t165b06NHDY/sCAACA2xEskCH0IXa9evUy/Se0uZM+LE9DhfapOHfunOzYsUOmTJli+u7oAACPPPKIGSgg8TMqtNN2ly5dxN/f32P7AgAAgNsRLJAh7vS8idKlS5sBAVJCwwYAAAAyH/pYAAAAALCNYAEAAADANoIFAAAAANsIFgAAAABso/N2JlFjzHpPFwGZ3JHRbTxdBAAAgGRRYwEAAADANoIFAAAAANsIFgAAAABsI1gAAAAAsI1gAQAAAMA2ggUAAAAA2wgWAAAAAGwjWAAAAACwjWABAAAAwDaCBQAAAADbCBYAAAAAbCNYAAAAALCNYAEAAADANoIFAAAAAO8OFjNmzJDatWtL4cKFzdSkSRNZs2aNc/n169elX79+EhAQIAULFpTQ0FC5ePGi2zZOnTolHTp0kPz580tgYKAMHTpUbt265YG9AQAAALIvjwaLMmXKyIQJEyQqKkr27t0rrVq1kk6dOsnhw4fN8sGDB8vKlStl6dKlsm3bNjl37px06dLF+f74+HgTKm7cuCE7d+6UefPmydy5c2XUqFEe3CsAAAAg+/H15Id37NjR7fUbb7xhajF27dplQsfs2bNl4cKFJnCoOXPmSPXq1c3yxo0by/r16+XIkSOyceNGKVGihNStW1fGjh0rw4cPl9dff11y587toT0DAAAAspdM08dCax8WLVok165dM02itBbj5s2bEhwc7FynWrVqUrZsWYmMjDSv9WetWrVMqLCEhITI5cuXnbUeSYmLizPruE4AAAAAvDhYHDx40PSfyJMnj7z44ouyfPlyqVGjhly4cMHUOPj7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"
&gt;
&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;



&lt;h2&gt;Train/Test Split&lt;/h2&gt;
&lt;p&gt;The authors provide standardised train/test splits (80/20), stratified by BI-RADS assessment to ensure similar difficulty distribution:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Set&lt;/th&gt;
&lt;th&gt;Benign Cases&lt;/th&gt;
&lt;th&gt;Malignant Cases&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Calcification Training&lt;/td&gt;
&lt;td&gt;329 (552 abnormalities)&lt;/td&gt;
&lt;td&gt;273 (304 abnormalities)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Calcification Test&lt;/td&gt;
&lt;td&gt;85 (112 abnormalities)&lt;/td&gt;
&lt;td&gt;66 (77 abnormalities)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Mass Training&lt;/td&gt;
&lt;td&gt;355 (387 abnormalities)&lt;/td&gt;
&lt;td&gt;336 (361 abnormalities)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Mass Test&lt;/td&gt;
&lt;td&gt;117 (135 abnormalities)&lt;/td&gt;
&lt;td&gt;83 (87 abnormalities)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Note that case counts differ from abnormality counts since some cases contain multiple abnormalities.&lt;/p&gt;
&lt;h2&gt;Segmentation Quality&lt;/h2&gt;
&lt;p&gt;The authors validated their Chan-Vese segmentations against hand-drawn ROIs from an experienced radiologist on 118 images. The mean Dice coefficient between computer-generated and hand-drawn ROIs was &lt;strong&gt;0.792 ± 0.108&lt;/strong&gt;, compared to &lt;strong&gt;0.398 ± 0.195&lt;/strong&gt; for the original DDSM annotations vs hand-drawn. These results represent a statistically significant improvement (Wilcoxon signed-rank test, p = 5.54 × 10⁻¹⁹).&lt;/p&gt;
&lt;p&gt;During curation, 339 mass images where the lesion was not clearly visible were removed after review by a trained mammographer.&lt;/p&gt;
&lt;h2&gt;Limitations&lt;/h2&gt;
&lt;p&gt;While CBIS-DDSM is valuable for research, it has some limitations worth noting. The original DDSM images were digitised from film mammograms, not acquired digitally. Modern Full-Field Digital Mammography (FFDM) systems produce higher-quality images, and newer datasets like &lt;a href="inbreast.html"&gt;InBreast&lt;/a&gt; and &lt;a href="vindr-mammo.html"&gt;VinDr-Mammo&lt;/a&gt; tend to contain these sorts of images. Additionally, DDSM images are focused on a specific abnormality, but a breast may contain multiple abnormalities, warranting investigation. Lastly, the original DDSM was collected in the 1990s, so imaging quality and patient demographics may differ from those in contemporary datasets.&lt;/p&gt;
&lt;p&gt;Despite these limitations, CBIS-DDSM remains one of the most widely used public mammography datasets for developing and benchmarking CAD algorithms.&lt;/p&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;div class="footnote"&gt;
&lt;hr /&gt;
&lt;ol&gt;
&lt;li id="fn:1"&gt;
&lt;p&gt;Lee, R. S., Gimenez, F., Hoogi, A., Miyake, K. K., Gorovoy, M., &amp;amp; Rubin, D. L. (2017). A curated mammography data set for use in computer-aided detection and diagnosis research. &lt;em&gt;Scientific Data&lt;/em&gt;, 4(1), 170177. &lt;a href="https://doi.org/10.1038/sdata.2017.177"&gt;https://doi.org/10.1038/sdata.2017.177&lt;/a&gt;&amp;#160;&lt;a class="footnote-backref" href="#fnref:1" title="Jump back to footnote 1 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:2"&gt;
&lt;p&gt;Heath, M., Bowyer, K., Kopans, D., Moore, R. &amp;amp; Kegelmeyer, W. P. The Digital Database for Screening Mammography. Proceedings of the Fifth International Workshop on Digital Mammography 212–218 (2001). Available at http://marathon.csee.usf.edu/Mammography/software/HeathEtAlIWDM_2000.pdf&amp;#160;&lt;a class="footnote-backref" href="#fnref:2" title="Jump back to footnote 2 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:3"&gt;
&lt;p&gt;Suckling, J. et al. The Mammographic Image Analysis Society digital mammogram database. &lt;em&gt;Exerpta Medica&lt;/em&gt; 375–378 (1994). &lt;a href="http://peipa.essex.ac.uk/info/mias.html"&gt;http://peipa.essex.ac.uk/info/mias.html&lt;/a&gt;&amp;#160;&lt;a class="footnote-backref" href="#fnref:3" title="Jump back to footnote 3 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:4"&gt;
&lt;p&gt;Lehmann, T. M. et al. IRMA—Content-based image retrieval in medical applications. &lt;em&gt;Methods Inf. Med.&lt;/em&gt; 43, 354–361 (2004).&amp;#160;&lt;a class="footnote-backref" href="#fnref:4" title="Jump back to footnote 4 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</content><category term="permanent"/><category term="BreastCancerDetection"/><category term="MedicalImaging"/><category term="Mammography"/></entry><entry><title>Mammography</title><link href="http://localhost:8000/mammography.html" rel="alternate"/><published>2025-10-15T00:00:00+10:00</published><updated>2025-10-15T00:00:00+10:00</updated><author><name>Lex Toumbourou</name></author><id>tag:localhost,2025-10-15:/mammography.html</id><summary type="html">&lt;p&gt;A breast cancer screening method&lt;/p&gt;</summary><content type="html">&lt;p&gt;As part of my final project for my BSc, I worked on Breast Cancer Detection. This note was made while doing background research for that topic. See topic #BreastCancerDetection&lt;/p&gt;
&lt;p&gt;X-ray &lt;strong&gt;Mammography&lt;/strong&gt; is a breast cancer screening method and remains one of the more effective population-wide tools for early detection of Breast Cancer &lt;sup id="fnref:1"&gt;&lt;a class="footnote-ref" href="#fn:1"&gt;1&lt;/a&gt;&lt;/sup&gt;. The breast is compressed between two plates to spread the tissue and reduce motion blur evenly. A typical screening exam records two views of the breast: &lt;a href="caniocaudal-cc.html"&gt;Caniocaudal (CC)&lt;/a&gt;, a top-to-bottom view, and &lt;a href="mediolateral-mlo.html"&gt;Mediolateral (MLO)&lt;/a&gt;, a side view.&lt;/p&gt;
&lt;p&gt;&lt;img alt="mammography-screen-views.png" src="../_media/mammography-screen-views.png"&gt;&lt;/p&gt;
&lt;p&gt;When reading a mammogram, a radiologist looks for specific abnormalities: masses, calcifications, distortion of breast tissue, or asymmetries when comparing the two breasts and two views.&lt;/p&gt;
&lt;p&gt;To standardise reporting, radiologists use the &lt;a href="breast-imaging-reporting-and-data-system-bi-rads.html"&gt;Breast Imaging Reporting and Data System (BI-RADS)&lt;/a&gt;, which assigns a category from 0 to 6 indicating the level of suspicion:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;0&lt;/strong&gt; - incomplete: additional imaging needed.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;1&lt;/strong&gt; - negative.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2&lt;/strong&gt; - benign.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;3&lt;/strong&gt; - probably benign: short-interval follow-up suggested.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;4&lt;/strong&gt; - suspicious: biopsy should be considered.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;5&lt;/strong&gt; - highly suggestive of malignancy.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;6&lt;/strong&gt; - known biopsy with proven malignancy.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Categories 4 and 5 typically warrant a biopsy to confirm or rule out cancer.&lt;/p&gt;
&lt;p&gt;&lt;img alt="mammography-bi-rads.png" src="../_media/mammography-bi-rads.png"&gt;&lt;/p&gt;
&lt;p&gt;Radiologists also classify breast composition by density using four categories:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;A&lt;/strong&gt; - almost entirely fatty&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;B&lt;/strong&gt; - scattered fibroglandular densities&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;C&lt;/strong&gt; - heterogeneously dense&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;D&lt;/strong&gt; - extremely dense&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Higher breast density both increases breast cancer risk and reduces mammographic sensitivity, as dense tissue appears white on mammograms (the same appearance as potential tumours), effectively masking lesions.&lt;/p&gt;
&lt;p&gt;&lt;img alt="mammography-breast-density-categories.png" src="../_media/mammography-breast-density-categories.png"&gt;&lt;/p&gt;
&lt;p&gt;Modern screening often utilise &lt;a href="digital-breast-tomosynthesisd-dbt.html"&gt;Digital Breast Tomosynthesis (DBT)&lt;/a&gt;, or "3D mammography." Unlike standard 2D mammography, DBT captures multiple X-ray projections from different angles to reconstruct the breast in "slices." This minimises the effect of overlapping tissue, improving detection rates in dense breasts.&lt;/p&gt;
&lt;p&gt;On of the canonical Mammography datasets is &lt;a href="cbis-ddsm-mammography-dataset.html"&gt;CBIS-DDSM Mammography Dataset&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="references"&gt;References&lt;/h2&gt;
&lt;div class="footnote"&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id="fn:1"&gt;
&lt;p&gt;Misra, S., Solomon, N. L., Moffat, F. L., &amp;amp; Koniaris, L. G. (2010). &lt;em&gt;Screening criteria for breast cancer&lt;/em&gt;. &lt;strong&gt;Advances in Surgery, 44&lt;/strong&gt;, 87–100. &lt;a href="https://doi.org/10.1016/j.yasu.2010.05.008"&gt;https://doi.org/10.1016/j.yasu.2010.05.008&lt;/a&gt;&amp;#160;&lt;a class="footnote-backref" href="#fnref:1" title="Jump back to footnote 1 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</content><category term="permanent"/><category term="MedicalImaging"/><category term="BreastCancerDetection"/></entry><entry><title>SPARQL</title><link href="http://localhost:8000/sparql.html" rel="alternate"/><published>2025-09-16T00:00:00+10:00</published><updated>2025-09-16T00:00:00+10:00</updated><author><name>Lex Toumbourou</name></author><id>tag:localhost,2025-09-16:/sparql.html</id><summary type="html">&lt;p&gt;a query language for RDF databases&lt;/p&gt;</summary><content type="html">&lt;p&gt;&lt;strong&gt;SPARQL&lt;/strong&gt; (or &lt;strong&gt;SPARQL Protocol and RDF Query Language&lt;/strong&gt;) is a Query Language for &lt;a href="rdf.html"&gt;RDF&lt;/a&gt; databases and &lt;a href="triplestores.html"&gt;Triplestores&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;It uses pattern-based queries. ph databases have no fixed starting points of order.
Use variables beginning with question marks (e.g., &lt;code&gt;?friend&lt;/code&gt;, &lt;code&gt;?name&lt;/code&gt;). It also defined how to communicate with SPARQL endpoints over HTTP - it's not just a query language.&lt;/p&gt;
&lt;h2 id="example-queries"&gt;Example Queries&lt;/h2&gt;
&lt;p&gt;All of these queries can be run live against https://dbpedia.org/sparql&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;Let's start with a query to fetch basic info about the city of London. We can define variables using a &lt;code&gt;?&lt;/code&gt; prefix. Then in our query we can describe a pattern which matches &lt;a href="rdf-triples.html"&gt;RDF Triples&lt;/a&gt; where the Subject is &lt;a href="https://dbpedia.org/page/London"&gt;London&lt;/a&gt; and any predicate or object matching.: &lt;code&gt;&amp;lt;http://dbpedia.org/resource/London&amp;gt; ?property ?value .&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Also, for readability, we'll convert &lt;code&gt;http://dbpedia.org/resource/&lt;/code&gt; into a prefix:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;PREFIX&lt;/span&gt; &lt;span class="nn"&gt;dbr&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nl"&gt;&amp;lt;http://dbpedia.org/resource/&amp;gt;&lt;/span&gt;

&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="nv"&gt;?property&lt;/span&gt; &lt;span class="nv"&gt;?value&lt;/span&gt;
&lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nn"&gt;dbr&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nt"&gt;London&lt;/span&gt; &lt;span class="nv"&gt;?property&lt;/span&gt; &lt;span class="nv"&gt;?value&lt;/span&gt; &lt;span class="p"&gt;.&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;LIMIT&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Challenge&lt;/strong&gt;: Can you list basic information about Sydney, Australia?&lt;/p&gt;
&lt;p&gt;Answer:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;PREFIX&lt;/span&gt; &lt;span class="nn"&gt;dbr&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nl"&gt;&amp;lt;http://dbpedia.org/resource/&amp;gt;&lt;/span&gt;

&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="nv"&gt;?property&lt;/span&gt; &lt;span class="nv"&gt;?value&lt;/span&gt;
&lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nn"&gt;dbr&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nt"&gt;Australia&lt;/span&gt; &lt;span class="nv"&gt;?property&lt;/span&gt; &lt;span class="nv"&gt;?value&lt;/span&gt; &lt;span class="p"&gt;.&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;LIMIT&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;hr&gt;
&lt;p&gt;We define much more complex patterns for the data we want to fetch by providing multiple triples statements. The RDFS schema also contains a number of useful predicates, like &lt;code&gt;rdf:type&lt;/code&gt; (which is used to say subject isA object) and &lt;code&gt;rdfs:label&lt;/code&gt; is a human readable name for a resource.&lt;/p&gt;
&lt;p&gt;Here's a query that gets all the cities in the UK (but only the English labels):&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;PREFIX&lt;/span&gt; &lt;span class="nn"&gt;dbo&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nl"&gt;&amp;lt;http://dbpedia.org/ontology/&amp;gt;&lt;/span&gt;
&lt;span class="k"&gt;PREFIX&lt;/span&gt; &lt;span class="nn"&gt;dbr&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nl"&gt;&amp;lt;http://dbpedia.org/resource/&amp;gt;&lt;/span&gt;

&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="nv"&gt;?city&lt;/span&gt; &lt;span class="nv"&gt;?name&lt;/span&gt;
&lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nv"&gt;?city&lt;/span&gt; &lt;span class="nn"&gt;dbo&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nt"&gt;country&lt;/span&gt; &lt;span class="nn"&gt;dbr&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nt"&gt;United_Kingdom&lt;/span&gt; &lt;span class="p"&gt;.&lt;/span&gt;
    &lt;span class="nv"&gt;?city&lt;/span&gt; &lt;span class="nn"&gt;rdf&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nt"&gt;type&lt;/span&gt; &lt;span class="nn"&gt;dbo&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nt"&gt;City&lt;/span&gt; &lt;span class="p"&gt;.&lt;/span&gt;
    &lt;span class="nv"&gt;?city&lt;/span&gt; &lt;span class="nn"&gt;rdfs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nt"&gt;label&lt;/span&gt; &lt;span class="nv"&gt;?name&lt;/span&gt; &lt;span class="p"&gt;.&lt;/span&gt;
    &lt;span class="k"&gt;FILTER&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;lang&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;?name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;en&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;You can rewrite the above query is saving having to use the &lt;code&gt;?city&lt;/code&gt; prefix on each line as follows. Also, an alias for &lt;code&gt;rdf:type&lt;/code&gt; is &lt;code&gt;a&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;PREFIX&lt;/span&gt; &lt;span class="nn"&gt;dbo&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nl"&gt;&amp;lt;http://dbpedia.org/ontology/&amp;gt;&lt;/span&gt;
&lt;span class="k"&gt;PREFIX&lt;/span&gt; &lt;span class="nn"&gt;dbr&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nl"&gt;&amp;lt;http://dbpedia.org/resource/&amp;gt;&lt;/span&gt;

&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="nv"&gt;?city&lt;/span&gt; &lt;span class="nv"&gt;?name&lt;/span&gt;
&lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nv"&gt;?city&lt;/span&gt; &lt;span class="nn"&gt;dbo&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nt"&gt;country&lt;/span&gt; &lt;span class="nn"&gt;dbr&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nt"&gt;United_Kingdom&lt;/span&gt; &lt;span class="p"&gt;;&lt;/span&gt;
          &lt;span class="k"&gt;a&lt;/span&gt; &lt;span class="nn"&gt;dbo&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nt"&gt;City&lt;/span&gt; &lt;span class="p"&gt;;&lt;/span&gt;
          &lt;span class="nn"&gt;rdfs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nt"&gt;label&lt;/span&gt; &lt;span class="nv"&gt;?name&lt;/span&gt; &lt;span class="p"&gt;.&lt;/span&gt;
    &lt;span class="k"&gt;FILTER&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;lang&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;?name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;en&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Challenge: using &lt;code&gt;dbo:TelevisionShow&lt;/code&gt; as the type, and using &lt;code&gt;dbo:genre dbo:Science_fiction&lt;/code&gt; return all science fiction TV Shows from the produced or created in Australia.&lt;/p&gt;
&lt;p&gt;Answer:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;PREFIX&lt;/span&gt; &lt;span class="nn"&gt;dbo&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nl"&gt;&amp;lt;http://dbpedia.org/ontology/&amp;gt;&lt;/span&gt;
&lt;span class="k"&gt;PREFIX&lt;/span&gt; &lt;span class="nn"&gt;dbr&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nl"&gt;&amp;lt;http://dbpedia.org/resource/&amp;gt;&lt;/span&gt;

&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="nv"&gt;?show&lt;/span&gt; &lt;span class="nv"&gt;?name&lt;/span&gt;
&lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nv"&gt;?show&lt;/span&gt; &lt;span class="nn"&gt;dbo&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nt"&gt;genre&lt;/span&gt; &lt;span class="nn"&gt;dbr&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nt"&gt;Science_fiction&lt;/span&gt; &lt;span class="p"&gt;;&lt;/span&gt;
          &lt;span class="nn"&gt;dbo&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nt"&gt;country&lt;/span&gt; &lt;span class="nn"&gt;dbr&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nt"&gt;Australia&lt;/span&gt; &lt;span class="p"&gt;;&lt;/span&gt;
          &lt;span class="k"&gt;a&lt;/span&gt; &lt;span class="nn"&gt;dbo&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nt"&gt;TelevisionShow&lt;/span&gt; &lt;span class="p"&gt;;&lt;/span&gt;
          &lt;span class="nn"&gt;rdfs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nt"&gt;label&lt;/span&gt; &lt;span class="nv"&gt;?name&lt;/span&gt; &lt;span class="p"&gt;.&lt;/span&gt;
    &lt;span class="k"&gt;FILTER&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;lang&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;?name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;en&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;hr&gt;
&lt;h3 id="filtering"&gt;Filtering&lt;/h3&gt;
&lt;p&gt;We can use the &lt;code&gt;FILTER&lt;/code&gt; call to filter by certain values. For example, to find all cities in the world that have more than 10_000_000 people, and you can &lt;code&gt;ORDER BY DESC(?population)&lt;/code&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;PREFIX&lt;/span&gt; &lt;span class="nn"&gt;dbo&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nl"&gt;&amp;lt;http://dbpedia.org/ontology/&amp;gt;&lt;/span&gt;

&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="nv"&gt;?city&lt;/span&gt; &lt;span class="nv"&gt;?name&lt;/span&gt; &lt;span class="nv"&gt;?population&lt;/span&gt;
&lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nv"&gt;?city&lt;/span&gt; &lt;span class="k"&gt;a&lt;/span&gt; &lt;span class="nn"&gt;dbo&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nt"&gt;City&lt;/span&gt; &lt;span class="p"&gt;;&lt;/span&gt;
          &lt;span class="nn"&gt;rdfs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nt"&gt;label&lt;/span&gt; &lt;span class="nv"&gt;?name&lt;/span&gt; &lt;span class="p"&gt;;&lt;/span&gt;
          &lt;span class="nn"&gt;dbo&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nt"&gt;populationTotal&lt;/span&gt; &lt;span class="nv"&gt;?population&lt;/span&gt; &lt;span class="p"&gt;.&lt;/span&gt;
    &lt;span class="k"&gt;FILTER&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;lang&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;?name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;en&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;FILTER&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;?population&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;10000000&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="k"&gt;ORDER BY&lt;/span&gt; &lt;span class="k"&gt;DESC&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;?population&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;LIMIT&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Challenge: the album genre of rock music is &lt;code&gt;dbp:genre dbr:Rock_music&lt;/code&gt;, the property of release year is available in &lt;code&gt;dbp:relYear&lt;/code&gt; and the &lt;code&gt;rdf:type&lt;/code&gt; is &lt;code&gt;dbo:Album&lt;/code&gt;. Can you list all the rock albums released after 2010?&lt;/p&gt;
&lt;p&gt;Answer:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;PREFIX&lt;/span&gt; &lt;span class="nn"&gt;dbo&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nl"&gt;&amp;lt;http://dbpedia.org/ontology/&amp;gt;&lt;/span&gt;
&lt;span class="k"&gt;PREFIX&lt;/span&gt; &lt;span class="nn"&gt;dbr&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nl"&gt;&amp;lt;http://dbpedia.org/resource/&amp;gt;&lt;/span&gt;
&lt;span class="k"&gt;PREFIX&lt;/span&gt; &lt;span class="nn"&gt;dbp&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nl"&gt;&amp;lt;http://dbpedia.org/property/&amp;gt;&lt;/span&gt;

&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="nv"&gt;?album&lt;/span&gt; &lt;span class="nv"&gt;?name&lt;/span&gt; &lt;span class="nv"&gt;?relyear&lt;/span&gt;
&lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nv"&gt;?album&lt;/span&gt; &lt;span class="k"&gt;a&lt;/span&gt; &lt;span class="nn"&gt;dbo&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nt"&gt;Album&lt;/span&gt; &lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="nn"&gt;dbp&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nt"&gt;genre&lt;/span&gt; &lt;span class="nn"&gt;dbr&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nt"&gt;Rock_music&lt;/span&gt; &lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="nn"&gt;rdfs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nt"&gt;label&lt;/span&gt; &lt;span class="nv"&gt;?name&lt;/span&gt; &lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="nn"&gt;dbp&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nt"&gt;relyear&lt;/span&gt; &lt;span class="nv"&gt;?relyear&lt;/span&gt; &lt;span class="p"&gt;.&lt;/span&gt;
    &lt;span class="k"&gt;FILTER&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;lang&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;?name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;en&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;FILTER&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;?relyear&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;2015&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="k"&gt;ORDER BY&lt;/span&gt; &lt;span class="k"&gt;DESC&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;?relyear&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;LIMIT&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</content><category term="permanent"/></entry><entry><title>RDF</title><link href="http://localhost:8000/rdf.html" rel="alternate"/><published>2025-09-14T00:00:00+10:00</published><updated>2025-09-14T00:00:00+10:00</updated><author><name>Lex Toumbourou</name></author><id>tag:localhost,2025-09-14:/rdf.html</id><summary type="html">&lt;p&gt;A graph-based data model for the Semantic Web&lt;/p&gt;</summary><content type="html">&lt;p&gt;&lt;strong&gt;RDF&lt;/strong&gt; (or &lt;strong&gt;Resource Description Framework&lt;/strong&gt;) is a data model for representing data as a graph. RDF is the foundational technology for the &lt;a href="semantic-web.html"&gt;Semantic Web&lt;/a&gt;, which was Tim Berners-Lee's vision for a machine-readable web, once described as Web 3.0 (unrelated to the crypto bros blockchain-powered &lt;a href="https://en.wikipedia.org/wiki/Web3"&gt;Web3&lt;/a&gt;). RDF is also the backbone of a standard for interconnecting datasets called &lt;a href="linked-data.html"&gt;Linked Data&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Though the Semantic Web never fully materialised, partially due to its reliance on users to input correct data &lt;sup id="fnref:1"&gt;&lt;a class="footnote-ref" href="#fn:1"&gt;1&lt;/a&gt;&lt;/sup&gt;, the RDF standard does live on in multiple forms. Many social media sites and feed readers also support various RDF serialisation standards, such as JSON-LD, to read metadata on websites &lt;sup id="fnref:4"&gt;&lt;a class="footnote-ref" href="#fn:4"&gt;4&lt;/a&gt;&lt;/sup&gt;. I've also seen it deployed in organisations for taxonomy management, such as maintaining databases of keywords and their relationships (e.g., if an item is a Daffodil, it's also a Flower, which means it's also a Plant).&lt;/p&gt;
&lt;p&gt;It's worth taking the time to wrap your head around RDF, although it can seem a little cumbersome at first.&lt;/p&gt;
&lt;p&gt;In RDF, data points are defined as triples in the form: &lt;code&gt;&amp;lt;subject&amp;gt; &amp;lt;predicate&amp;gt; &amp;lt;object&amp;gt;&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img alt="rdf-cover.png" src="../_media/rdf-cover.png"&gt;&lt;/p&gt;
&lt;p&gt;Jumping straight into an example, here's how I might represent information about myself in this form:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&amp;lt;Lex&amp;gt; &amp;lt;is a&amp;gt; &amp;lt;person&amp;gt;
&amp;lt;Lex&amp;gt; &amp;lt;has occupation&amp;gt; &amp;lt;Software Engineer&amp;gt;
&amp;lt;Lex&amp;gt; &amp;lt;has pet&amp;gt; &amp;lt;Doggo&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Then let's also define some triples for my dog, Doggo:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&amp;lt;Doggo&amp;gt; &amp;lt;is a&amp;gt; &amp;lt;dog&amp;gt;
&amp;lt;Doggo&amp;gt; &amp;lt;has breed&amp;gt; &amp;lt;Staghound&amp;gt;
&amp;lt;Doggo&amp;gt; &amp;lt;is aged&amp;gt; 6
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;A key detail of RDF is that Subjects and Predicates must be represented as an IRI (Internationalised Resource Identifier), of which URLs are a subset. Objects can be IRIs, but can also be literals: strings, numbers, dates, etc.&lt;/p&gt;
&lt;p&gt;These IRIs serve as globally unique identifiers for resources (the "R" in RDF). For instance, I could describe myself using my website's URL and reference schema.org's standardised definition of a person, so that other people would know I was a person.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;https&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="c1"&gt;//notesbylex.com/Lex&amp;gt; &amp;lt;rdf:type&amp;gt; &amp;lt;http://schema.org/Person&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;This IRI-based approach provides two powerful capabilities. First, it enables shared vocabularies across the internet: different datasets can reference the same definitions, ensuring everyone means the same thing by "Person" or "owns." Second, it allows easy creation of new vocabularies, whether public standards or private organisational schemas.&lt;/p&gt;
&lt;p&gt;RDF's graph structure also enables logical reasoning across the data.&lt;/p&gt;
&lt;p&gt;For example, given the information:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;Aspirin&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;inhibits&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;COX-2&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;enzyme&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;COX-2&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;enzyme&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;produces&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;Prostaglandins&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;Prostaglandins&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;mediate&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;Inflammation&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;We can infer that:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;Aspirin&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;reduces&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;Inflammation&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;The technique of representing information in a way that allows us to perform logical inference over it originates from a branch of AI known as &lt;a href="knowledge-representation.html"&gt;Knowledge Representation&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="rdf-serialisation"&gt;RDF Serialisation&lt;/h2&gt;
&lt;p&gt;There are multiple ways to serialise RDF data, each with different advantages:&lt;/p&gt;
&lt;h3 id="n-triples"&gt;&lt;a href="n-triples.html"&gt;N-Triples&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;The simplest serialisation format, expressing each triple on a separate line using full URIs. While it is verbose, it's also easy to parse and process programmatically.&lt;/p&gt;
&lt;p&gt;The example earlier was an of how I might express myself using N-Triples format:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&amp;lt;https://example.org/person#lex&amp;gt; &amp;lt;https://example.org/hasName&amp;gt; &amp;quot;Lex&amp;quot; .
&amp;lt;https://example.org/person#lex&amp;gt; &amp;lt;https://example.org/hasOccupation&amp;gt; &amp;quot;software engineer&amp;quot; .
&amp;lt;https://example.org/person#lex&amp;gt; &amp;lt;https://example.org/hasPet&amp;gt; &amp;lt;https://example.org/dog#Doggo&amp;gt; .
&amp;lt;https://example.org/dog#Doggo&amp;gt; &amp;lt;https://example.org/hasName&amp;gt; &amp;quot;Doggo&amp;quot; .
&amp;lt;https://example.org/dog#Doggo&amp;gt; &amp;lt;https://example.org/hasBreed&amp;gt; &amp;quot;Staghound&amp;quot; .
&amp;lt;https://example.org/dog#Doggo&amp;gt; &amp;lt;https://example.org/hasAge&amp;gt; 6 .
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;You'll notice that I've used &lt;code&gt;http://example.org&lt;/code&gt; as the prefix for my subjects and predicates. Since RDF mandates the use of URIs for these attributes, &lt;code&gt;http://example.org&lt;/code&gt; is a reserved domain name specifically designated for use in documentation and examples (see &lt;a href="https://www.rfc-editor.org/rfc/rfc2606.html"&gt;RFC 2606&lt;/a&gt;).&lt;/p&gt;
&lt;h3 id="turtle-terse-rdf-triple-language"&gt;&lt;a href="turtle-terse-rdf-triple-language.html"&gt;Turtle (Terse RDF Triple Language)&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Turtle&lt;/strong&gt; (or &lt;strong&gt;Terse RDF Triple Language&lt;/strong&gt;) is a human-readable RDF serialisation format. It includes features like:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Prefixes to reduce redundant URL prefixes.&lt;/li&gt;
&lt;li&gt;A semicolon (&lt;code&gt;;&lt;/code&gt;) to keep the same subject, continues with a new predicate&lt;/li&gt;
&lt;li&gt;A comma (&lt;code&gt;,&lt;/code&gt;) keeps the same subject and predicate, adds a new object.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;"a"&lt;/code&gt; shortcut - replaces "is of type".&lt;/li&gt;
&lt;li&gt;Language tags to specify labels in different languages.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Example:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;@prefix&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;foaf:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;&amp;lt;http://xmlns.com/foaf/0.1/&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
&lt;span class="k"&gt;@prefix&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;ex:&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="nv"&gt;&amp;lt;https://example.org/&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;

&lt;span class="nn"&gt;ex&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nt"&gt;person&lt;/span&gt;&lt;span class="c"&gt;#lex&lt;/span&gt;
    &lt;span class="kt"&gt;a&lt;/span&gt; &lt;span class="nn"&gt;foaf&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nt"&gt;Person&lt;/span&gt; &lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nn"&gt;foaf&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nt"&gt;name&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;Lex&amp;quot;&lt;/span&gt; &lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nn"&gt;ex&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nt"&gt;hasOccupation&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;software engineer&amp;quot;&lt;/span&gt; &lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nn"&gt;ex&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nt"&gt;hasPet&lt;/span&gt; &lt;span class="nn"&gt;ex&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nt"&gt;dog&lt;/span&gt;&lt;span class="c"&gt;#Doggo .&lt;/span&gt;

&lt;span class="nn"&gt;ex&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nt"&gt;dog&lt;/span&gt;&lt;span class="c"&gt;#Doggo&lt;/span&gt;
    &lt;span class="kt"&gt;a&lt;/span&gt; &lt;span class="nn"&gt;ex&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nt"&gt;Dog&lt;/span&gt; &lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nn"&gt;foaf&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nt"&gt;name&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;Doggo&amp;quot;&lt;/span&gt; &lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nn"&gt;ex&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nt"&gt;hasBreed&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;Staghound&amp;quot;&lt;/span&gt; &lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nn"&gt;ex&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nt"&gt;hasAge&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt; &lt;span class="p"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Turtle is one of the most common RDF serialisation approaches, and most RDF databases tend to support it.&lt;/p&gt;
&lt;h3 id="rdfa"&gt;&lt;a href="rdfa.html"&gt;RDFa&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;RDFa allows RDF data to be embedded directly into HTML markup using special attributes, which enables web pages to contain machine-readable structured data alongside human-readable content. RDFa is useful for search engine optimisation and semantic web apps.&lt;/p&gt;
&lt;p&gt;RDFa attributes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;about&lt;/code&gt; - specifies the subject of the RDF statements.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;property&lt;/code&gt; - creates a literal value relationship.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;rel&lt;/code&gt; - create a resource relationship.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;resource&lt;/code&gt; - specifies the object resource.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;typeof&lt;/code&gt; - declares the RDF type of the subject.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;datatype&lt;/code&gt; - specifies the data type of literal values.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Example:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;!DOCTYPE html&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;html&lt;/span&gt; &lt;span class="na"&gt;xmlns&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;http://www.w3.org/1999/xhtml&amp;quot;&lt;/span&gt;
      &lt;span class="na"&gt;xmlns:foaf&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;http://xmlns.com/foaf/0.1/&amp;quot;&lt;/span&gt;
      &lt;span class="na"&gt;xmlns:ex&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;https://example.org/&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;head&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
          &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;title&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Person and Pet Profile&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;title&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;head&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;body&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
          &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;about&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;https://example.org/person#lex&amp;quot;&lt;/span&gt; &lt;span class="na"&gt;typeof&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;foaf:Person&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
              &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;h1&lt;/span&gt; &lt;span class="na"&gt;property&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;foaf:name&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Lex&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;h1&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
              &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Occupation: &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;span&lt;/span&gt; &lt;span class="na"&gt;property&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;ex:hasOccupation&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;software engineer&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;span&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
              &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Pet ownership:&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
              &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;about&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;https://example.org/dog#Doggo&amp;quot;&lt;/span&gt; &lt;span class="na"&gt;typeof&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;ex:Dog&amp;quot;&lt;/span&gt; &lt;span class="na"&gt;rel&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;ex:hasPet&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
                  &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;h2&lt;/span&gt; &lt;span class="na"&gt;property&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;foaf:name&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Doggo&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;h2&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
                  &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Breed: &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;span&lt;/span&gt; &lt;span class="na"&gt;property&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;ex:hasBreed&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Staghound&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;span&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
                  &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Age: &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;span&lt;/span&gt; &lt;span class="na"&gt;property&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;ex:hasAge&amp;quot;&lt;/span&gt; &lt;span class="na"&gt;datatype&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;xsd:integer&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;6&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;span&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; years old&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
              &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
          &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;body&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;html&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h3 id="json-ld"&gt;&lt;a href="json-ld.html"&gt;JSON-LD&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;JSON-LD expresses RDF using familiar JSON syntax while maintaining full RDF compatibility. A good format for working with web applications since it uses common JSON syntax while maintaining full RDF compatibility. Search engines actively use JSON-LD for processing Schema.org structured data.&lt;/p&gt;
&lt;p&gt;Keywords of JSON-LD:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;@context&lt;/code&gt; - defines namespace prefixes and mappings.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;@id&lt;/code&gt; - specifies the subject URI.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;@type&lt;/code&gt; - declares the RDF type.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;@value&lt;/code&gt; and &lt;code&gt;@type&lt;/code&gt; - for typed literal values.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;@graph&lt;/code&gt; - contains an array of linked data objects.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;&amp;quot;@context&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nt"&gt;&amp;quot;foaf&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;http://xmlns.com/foaf/0.1/&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nt"&gt;&amp;quot;ex&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;https://example.org/&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nt"&gt;&amp;quot;xsd&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;http://www.w3.org/2001/XMLSchema#&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;&amp;quot;@graph&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="nt"&gt;&amp;quot;@id&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;ex:person#lex&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="nt"&gt;&amp;quot;@type&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;foaf:Person&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="nt"&gt;&amp;quot;foaf:name&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Lex&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="nt"&gt;&amp;quot;ex:hasOccupation&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;software engineer&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="nt"&gt;&amp;quot;ex:hasPet&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;                &lt;/span&gt;&lt;span class="nt"&gt;&amp;quot;@id&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;ex:dog#Doggo&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="nt"&gt;&amp;quot;@id&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;ex:dog#Doggo&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="nt"&gt;&amp;quot;@type&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;ex:Dog&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="nt"&gt;&amp;quot;foaf:name&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Doggo&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="nt"&gt;&amp;quot;ex:hasBreed&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Staghound&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="nt"&gt;&amp;quot;ex:hasAge&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;                &lt;/span&gt;&lt;span class="nt"&gt;&amp;quot;@value&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;                &lt;/span&gt;&lt;span class="nt"&gt;&amp;quot;@type&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;xsd:integer&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h3 id="rdfxml"&gt;&lt;a href="rdf-xml.html"&gt;RDF/XML&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;One of the first approaches to RDF serialisation, using XML syntax, makes it more verbose but useful for systems already processing XML, but 
mostly considered less readable than Turtle or JSON-LD formats.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;rdf:about&lt;/code&gt; specifies the subject URI&lt;/li&gt;
&lt;li&gt;&lt;code&gt;rdf:resource&lt;/code&gt; creates relationships to other resources&lt;/li&gt;
&lt;li&gt;&lt;code&gt;rdf:datatype&lt;/code&gt; specifies data types for literal values&lt;/li&gt;
&lt;li&gt;Nested elements represent predicates and objects&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;rdf:RDF&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;xmlns:rdf=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;http://www.w3.org/1999/02/22-rdf-syntax-ns#&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;         &lt;/span&gt;&lt;span class="na"&gt;xmlns:foaf=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;http://xmlns.com/foaf/0.1/&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;         &lt;/span&gt;&lt;span class="na"&gt;xmlns:ex=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;https://example.org/&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;foaf:Person&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;rdf:about=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;https://example.org/person#lex&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;foaf:name&amp;gt;&lt;/span&gt;Lex&lt;span class="nt"&gt;&amp;lt;/foaf:name&amp;gt;&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;ex:hasOccupation&amp;gt;&lt;/span&gt;software&lt;span class="w"&gt; &lt;/span&gt;engineer&lt;span class="nt"&gt;&amp;lt;/ex:hasOccupation&amp;gt;&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;ex:hasPet&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;rdf:resource=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;https://example.org/dog#Doggo&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;/foaf:Person&amp;gt;&lt;/span&gt;

&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;ex:Dog&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;rdf:about=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;https://example.org/dog#Doggo&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;foaf:name&amp;gt;&lt;/span&gt;Doggo&lt;span class="nt"&gt;&amp;lt;/foaf:name&amp;gt;&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;ex:hasBreed&amp;gt;&lt;/span&gt;Staghound&lt;span class="nt"&gt;&amp;lt;/ex:hasBreed&amp;gt;&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;ex:hasAge&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;rdf:datatype=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;http://www.w3.org/2001/XMLSchema#integer&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;6&lt;span class="nt"&gt;&amp;lt;/ex:hasAge&amp;gt;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;/ex:Dog&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/rdf:RDF&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2 id="blank-nodes"&gt;Blank Nodes&lt;/h2&gt;
&lt;p&gt;RDF also supports blank nodes (or anonymous nodes) for representing resources without URIs. These are useful when you need to describe something but don't need to give it a permanent identifier. For example, representing an address without creating a URI for it:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nn"&gt;ex&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nt"&gt;person&lt;/span&gt;&lt;span class="c"&gt;#lex ex:hasAddress [&lt;/span&gt;
    &lt;span class="kt"&gt;a&lt;/span&gt; &lt;span class="nn"&gt;ex&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nt"&gt;Address&lt;/span&gt; &lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nn"&gt;ex&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nt"&gt;street&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;123 Main St&amp;quot;&lt;/span&gt; &lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nn"&gt;ex&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nt"&gt;city&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;Springfield&amp;quot;&lt;/span&gt; &lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nn"&gt;ex&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nt"&gt;zipCode&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;12345&amp;quot;&lt;/span&gt;
&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2 id="rdf-vocabulary"&gt;RDF Vocabulary&lt;/h2&gt;
&lt;p&gt;RDF provides the structural foundation, but vocabularies define the actual meaning of the data. The RDF ecosystem includes several foundational vocabularies and extensions:&lt;/p&gt;
&lt;h3 id="core-rdf-vocabularies"&gt;Core RDF Vocabularies&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;RDF&lt;/strong&gt; - The core Resource Description Framework vocabulary that provides basic terms like &lt;code&gt;rdf:type&lt;/code&gt;, &lt;code&gt;rdf:Property&lt;/code&gt;, and &lt;code&gt;rdf:Statement&lt;/code&gt; for describing the fundamental structure of RDF data.&lt;/li&gt;
&lt;li&gt;&lt;a href="rdfs.html"&gt;RDF Schema&lt;/a&gt; - Extends RDF with terms for defining classes (&lt;code&gt;rdfs:Class&lt;/code&gt;), properties (&lt;code&gt;rdfs:Property&lt;/code&gt;), subclass relationships (&lt;code&gt;rdfs:subClassOf&lt;/code&gt;), and domain/range constraints (&lt;code&gt;rdfs:domain&lt;/code&gt;, &lt;code&gt;rdfs:range&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;&lt;a href="web-ontology-language-owl.html"&gt;Web Ontology Language (OWL)&lt;/a&gt; - A more expressive vocabulary built on RDF and RDFS that adds complex logical constructs like &lt;code&gt;owl:equivalentClass&lt;/code&gt;, &lt;code&gt;owl:disjointWith&lt;/code&gt;, and &lt;code&gt;owl:inverseOf&lt;/code&gt; for creating sophisticated ontologies and enabling automated reasoning.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="common-application-vocabularies"&gt;Common Application Vocabularies&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;FOAF&lt;/strong&gt; (Friend of a Friend) - for describing people and relationships.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Dublin Core&lt;/strong&gt; - for metadata about resources.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Schema.org&lt;/strong&gt; - for structured data on web pages.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="ecosystem"&gt;Ecosystem&lt;/h2&gt;
&lt;p&gt;While RDF provides the data model, several extensions provide additional capabilities.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="web-ontology-language-owl.html"&gt;Web Ontology Language (OWL)&lt;/a&gt; - A more expressive language built on RDF for creating complex ontologies and reasoning.&lt;/li&gt;
&lt;li&gt;&lt;a href="triplestores.html"&gt;Triplestores&lt;/a&gt; - Specialised databases designed to store and efficiently query RDF triple data.&lt;/li&gt;
&lt;li&gt;&lt;a href="sparql.html"&gt;SPARQL&lt;/a&gt; - the standard query language for retrieving and manipulating RDF data, similar to SQL for relational databases.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="footnote"&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id="fn:1"&gt;
&lt;p&gt;(2018, May 27). Whatever happened to the semantic web? Two-Bit History. https://twobithistory.org/2018/05/27/semantic-web.html&amp;#160;&lt;a class="footnote-backref" href="#fnref:1" title="Jump back to footnote 1 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:2"&gt;
&lt;p&gt;Webber, J. (n.d.). RDF vs. property graphs: Choosing the right approach for implementing a knowledge graph. Neo4j. https://neo4j.com/blog/knowledge-graph/rdf-vs-property-graphs-knowledge-graphs/&amp;#160;&lt;a class="footnote-backref" href="#fnref:2" title="Jump back to footnote 2 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:3"&gt;
&lt;p&gt;King, R. D., Rowland, J., Oliver, S. G., Young, M., Aubrey, W., Byrne, E., ... &amp;amp; Sparkes, A. (2009). The automation of science. &lt;em&gt;Science&lt;/em&gt;, 324(5923), 85-89.&amp;#160;&lt;a class="footnote-backref" href="#fnref:3" title="Jump back to footnote 3 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:4"&gt;
&lt;p&gt;Paterson, C. (2024, August 20). Being on the semantic web is easy, and, frankly, well worth the bother. csvbase. https://csvbase.com/blog/13&amp;#160;&lt;a class="footnote-backref" href="#fnref:4" title="Jump back to footnote 4 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</content><category term="permanent"/><category term="KnowledgeRepresentation"/><category term="LinkedData"/></entry><entry><title>Genetic Algorithms</title><link href="http://localhost:8000/genetic-algorithms.html" rel="alternate"/><published>2025-09-07T00:00:00+10:00</published><updated>2025-09-07T00:00:00+10:00</updated><author><name>Lex Toumbourou</name></author><id>tag:localhost,2025-09-07:/genetic-algorithms.html</id><summary type="html">&lt;p&gt;an optimisation technique inspired by natural selection&lt;/p&gt;</summary><content type="html">&lt;p&gt;&lt;strong&gt;Genetic Algorithms&lt;/strong&gt; are an optimisation technique inspired by natural selection.&lt;/p&gt;
&lt;p&gt;The high-level idea is that we start from a population of possible solutions to a problem, where, importantly, we have a way to evaluate how good each solution is - called a &lt;strong&gt;fitness function&lt;/strong&gt;. Then we perform a loop that involves selecting from the fittest solutions (with randomness), breeding these solutions together, creating mutations, and replacing the population with the new solutions.&lt;/p&gt;
&lt;p&gt;The solutions need to be represented in a way that allows us to breed and mutate solutions. Typically, this is an array, where each element represents some parameter of a solution. For example, for testing robot designs, we might have elements that correspond to how many joints they have, and another that describes joint length, and so on. This representation is called a &lt;a href="genotype.html"&gt;Genotype&lt;/a&gt;, a term borrowed from biology, where all living organisms have a genetic code that stores their information, encoded in DNA. The expression of the &lt;strong&gt;genotype&lt;/strong&gt;, for example, the robot that is constructed as a result of the information in the array, is called a &lt;a href="phenotype.html"&gt;Phenotype&lt;/a&gt;. In this example, we might utilise a fitness function that tests the robot's ability to complete a task, or to simply move without falling.&lt;/p&gt;
&lt;p&gt;The algorithm looks like this:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Initialisation&lt;/strong&gt;: Create a random population of candidate solutions genotypes.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Fitness&lt;/strong&gt;: Evaluate the fitness of each individual in the population.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Selection&lt;/strong&gt;: Select "parents" based on their fitness.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Crossover&lt;/strong&gt;: also known as "Breeding", where parents create a new "offspring" by combining the genotype in some way.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Mutation&lt;/strong&gt;: the offspring is mutated in different ways using algorithms that involve randomness.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Replacement&lt;/strong&gt;: replace some or all of the population with the new offspring.&lt;/li&gt;
&lt;li&gt;Repeat 2-6 until the termination condition is met.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;a href="_media/genetic-algorithms-overview.png" target="_blank"&gt;&lt;img src="_media/genetic-algorithms-overview.png" alt="Genetic Algorithms Overview - an overview of this article in visual form" style="max-width: 100%" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;One of the most famous examples comes from &lt;a href="evolving-virtual-creatures.html"&gt;Evolving Virtual Creatures&lt;/a&gt; by Karl Sims, where he evolved virtual creatures in a simulated 3D environment. In his groundbreaking work, Sims used genetic algorithms to simultaneously evolve both the morphology (body structure) and neural networks (brain/control systems) of virtual creatures.&lt;/p&gt;
&lt;p&gt;It has also recently been used within &lt;a href="alphaevolve-a-coding-agent-for-scientific-and-algorithmic-discovery.html"&gt;AlphaEvolve&lt;/a&gt;, where DeepMind utilised it to explore the solution space for several mathematical and scientific problems. For solutions encoded as software, they utilised LLMs for the code generation and modification tasks, including combining and modifying solutions.&lt;/p&gt;
&lt;h2 id="fitness-function"&gt;&lt;a href="fitness-function.html"&gt;Fitness Function&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;A fitness function evaluates the population in some way. In the Virtual Creatures example, the fitness is based on how far they travel under different conditions. In AlphaEvolve, the fitness is a test specific to the problem it is trying to solve, designed to find an optimal solution.&lt;/p&gt;
&lt;h2 id="selection"&gt;&lt;a href="selection.html"&gt;Selection&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Selection algorithms determine which individuals will become parents for the next generation, giving fitter individuals a higher chance of reproduction while maintaining some diversity. There are a series of common selection algorithms typically used.&lt;/p&gt;
&lt;h3 id="roulette-wheel"&gt;Roulette Wheel&lt;/h3&gt;
&lt;p&gt;When selections are based on the proportion of fitness across the population, think about a roulette wheel as a pie chart, where each pie is proportional to its fitness as a whole. The more fit take up more space, so they're more likely to be selected, but there's also some entropy to ensure the solution space is explored.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Calculate the fitness of all individuals&lt;/li&gt;
&lt;li&gt;Generate a random number between 0 and the whole fitness.&lt;/li&gt;
&lt;li&gt;Select the individual whose cumulative fitness exceeds that of others.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="tournament-selection"&gt;Tournament Selection&lt;/h3&gt;
&lt;p&gt;A simpler approach, where we select some individuals at random from the population and choose one of the highest-fitness individuals from each sample.&lt;/p&gt;
&lt;h3 id="rank-selection"&gt;Rank Selection&lt;/h3&gt;
&lt;p&gt;Individuals are ranked by fitness, and the selection probability is based on rank rather than raw fitness values. This approach is particularly helpful when fitness values exhibit large variations or when dealing with negative fitness values.&lt;/p&gt;
&lt;h2 id="crossover"&gt;&lt;a href="crossover.html"&gt;Crossover&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Crossover, also known as breeding, is where we combine the genetic material of the two selected parents to create a new offspring. The goal is to create new solutions that potentially inherit the best features from both parents while exploring new areas of the solution space. Different crossover methods are suited to different types of problems and solution representations.&lt;/p&gt;
&lt;h3 id="one-point-crossover"&gt;One-Point Crossover&lt;/h3&gt;
&lt;p&gt;A single crossover point is chosen randomly. Everything before this point comes from Parent 1, and everything after comes from Parent 2.&lt;/p&gt;
&lt;p&gt;For example:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Parent 1: &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mo stretchy="false"&gt;[&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;mo separator="true"&gt;,&lt;/mo&gt;&lt;mn&gt;0&lt;/mn&gt;&lt;mo separator="true"&gt;,&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;mo separator="true"&gt;,&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;mo separator="true"&gt;,&lt;/mo&gt;&lt;mn&gt;0&lt;/mn&gt;&lt;mo separator="true"&gt;,&lt;/mo&gt;&lt;mn&gt;0&lt;/mn&gt;&lt;mo separator="true"&gt;,&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;mo stretchy="false"&gt;]&lt;/mo&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;[1, 0, 1, 1, 0, 0, 1]&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1em;vertical-align:-0.25em;"&gt;&lt;/span&gt;&lt;span class="mopen"&gt;[&lt;/span&gt;&lt;span class="mord"&gt;1&lt;/span&gt;&lt;span class="mpunct"&gt;,&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;0&lt;/span&gt;&lt;span class="mpunct"&gt;,&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;1&lt;/span&gt;&lt;span class="mpunct"&gt;,&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;1&lt;/span&gt;&lt;span class="mpunct"&gt;,&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;0&lt;/span&gt;&lt;span class="mpunct"&gt;,&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;0&lt;/span&gt;&lt;span class="mpunct"&gt;,&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;1&lt;/span&gt;&lt;span class="mclose"&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;Parent 2: &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mo stretchy="false"&gt;[&lt;/mo&gt;&lt;mn&gt;0&lt;/mn&gt;&lt;mo separator="true"&gt;,&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;mo separator="true"&gt;,&lt;/mo&gt;&lt;mn&gt;0&lt;/mn&gt;&lt;mo separator="true"&gt;,&lt;/mo&gt;&lt;mn&gt;0&lt;/mn&gt;&lt;mo separator="true"&gt;,&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;mo separator="true"&gt;,&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;mo separator="true"&gt;,&lt;/mo&gt;&lt;mn&gt;0&lt;/mn&gt;&lt;mo stretchy="false"&gt;]&lt;/mo&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;[0, 1, 0, 0, 1, 1, 0]&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1em;vertical-align:-0.25em;"&gt;&lt;/span&gt;&lt;span class="mopen"&gt;[&lt;/span&gt;&lt;span class="mord"&gt;0&lt;/span&gt;&lt;span class="mpunct"&gt;,&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;1&lt;/span&gt;&lt;span class="mpunct"&gt;,&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;0&lt;/span&gt;&lt;span class="mpunct"&gt;,&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;0&lt;/span&gt;&lt;span class="mpunct"&gt;,&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;1&lt;/span&gt;&lt;span class="mpunct"&gt;,&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;1&lt;/span&gt;&lt;span class="mpunct"&gt;,&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;0&lt;/span&gt;&lt;span class="mclose"&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;Child: &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mo stretchy="false"&gt;[&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;mo separator="true"&gt;,&lt;/mo&gt;&lt;mn&gt;0&lt;/mn&gt;&lt;mo separator="true"&gt;,&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;mo separator="true"&gt;,&lt;/mo&gt;&lt;mtext&gt; &lt;/mtext&gt;&lt;mstyle mathcolor="red"&gt;&lt;mi mathvariant="bold"&gt;∣&lt;/mi&gt;&lt;/mstyle&gt;&lt;mtext&gt; &lt;/mtext&gt;&lt;mn&gt;0&lt;/mn&gt;&lt;mo separator="true"&gt;,&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;mo separator="true"&gt;,&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;mo separator="true"&gt;,&lt;/mo&gt;&lt;mn&gt;0&lt;/mn&gt;&lt;mo stretchy="false"&gt;]&lt;/mo&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;[1, 0, 1, \ \textcolor{red}{\bf{|}} \ 0, 1, 1, 0]&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1em;vertical-align:-0.25em;"&gt;&lt;/span&gt;&lt;span class="mopen"&gt;[&lt;/span&gt;&lt;span class="mord"&gt;1&lt;/span&gt;&lt;span class="mpunct"&gt;,&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;0&lt;/span&gt;&lt;span class="mpunct"&gt;,&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;1&lt;/span&gt;&lt;span class="mpunct"&gt;,&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mspace"&gt; &lt;/span&gt;&lt;span class="mord" style="color:red;"&gt;&lt;span class="mord" style="color:red;"&gt;&lt;span class="mord mathbf" style="color:red;"&gt;∣&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace"&gt; &lt;/span&gt;&lt;span class="mord"&gt;0&lt;/span&gt;&lt;span class="mpunct"&gt;,&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;1&lt;/span&gt;&lt;span class="mpunct"&gt;,&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;1&lt;/span&gt;&lt;span class="mpunct"&gt;,&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;0&lt;/span&gt;&lt;span class="mclose"&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="two-point-crossover"&gt;Two-Point Crossover&lt;/h3&gt;
&lt;p&gt;Two (or N) crossover points are selected, and the genetic material between these points is swapped between parents.&lt;/p&gt;
&lt;h3 id="uniform-crossover"&gt;Uniform Crossover&lt;/h3&gt;
&lt;p&gt;For each gene position, randomly choose which parent to inherit from (typically with 50% probability for each parent). This approach provides more mixing than point-based methods.&lt;/p&gt;
&lt;h3 id="order-crossover-ox"&gt;Order Crossover (OX)&lt;/h3&gt;
&lt;p&gt;Specifically designed for permutation problems like the Travelling Salesman Problem, where each gene must appear exactly once. In this example, we can switch around nodes (if it generates a valid graph).&lt;/p&gt;
&lt;h2 id="mutation"&gt;&lt;a href="mutation.html"&gt;Mutation&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;In the mutation step, we modify the child solution slightly, allowing us to maintain genetic diversity and continue exploring the solution space. There are many mutation algorithms.&lt;/p&gt;
&lt;h3 id="bit-flip"&gt;Bit-flip&lt;/h3&gt;
&lt;p&gt;For binary representations, each bit has a small probability (typically 1-5%) of being flipped from 0 to 1 or vice versa.&lt;/p&gt;
&lt;h3 id="gaussian"&gt;Gaussian&lt;/h3&gt;
&lt;p&gt;For real-valued genes, add a random value drawn from a Gaussian (normal) distribution with mean zero and a small standard deviation.&lt;/p&gt;
&lt;p&gt;Formula: &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mtext&gt;new gene&lt;/mtext&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mtext&gt;old gene&lt;/mtext&gt;&lt;mo&gt;+&lt;/mo&gt;&lt;mi mathvariant="script"&gt;N&lt;/mi&gt;&lt;mo stretchy="false"&gt;(&lt;/mo&gt;&lt;mn&gt;0&lt;/mn&gt;&lt;mo separator="true"&gt;,&lt;/mo&gt;&lt;mi&gt;σ&lt;/mi&gt;&lt;mo stretchy="false"&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;\text{new gene} = \text{old gene} + \mathcal{N}( 0, \sigma )&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.625em;vertical-align:-0.19444em;"&gt;&lt;/span&gt;&lt;span class="mord text"&gt;&lt;span class="mord"&gt;new gene&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.8888799999999999em;vertical-align:-0.19444em;"&gt;&lt;/span&gt;&lt;span class="mord text"&gt;&lt;span class="mord"&gt;old gene&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;+&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1em;vertical-align:-0.25em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathcal" style="margin-right:0.14736em;"&gt;N&lt;/span&gt;&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord"&gt;0&lt;/span&gt;&lt;span class="mpunct"&gt;,&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.03588em;"&gt;σ&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h3 id="swap-mutation"&gt;Swap Mutation&lt;/h3&gt;
&lt;p&gt;For permutation problems, randomly select two positions and swap their values.&lt;/p&gt;
&lt;h3 id="insertion-mutation"&gt;Insertion Mutation&lt;/h3&gt;
&lt;p&gt;Remove a gene from one position and insert it at another random position.&lt;/p&gt;
&lt;h2 id="advantages-and-limitations"&gt;Advantages and Limitations&lt;/h2&gt;
&lt;p&gt;There are several advantages to genetic algorithms over other AI approaches, such as supervised learning. Firstly, no training data is required. If we can construct a fitness function and encode the problem effectively, then we can run a Genetic Algorithm search over the solution space. It can also handle discrete, continuous and mixed variable types. Since each solution is evaluated independently, it is highly parallelisable, allowing cores to be allocated to evaluate one or a subset of the solutions, so it is good when the search space is huge. It is also robust to noisy/weird objectives and can typically escape local optima.&lt;/p&gt;
&lt;p&gt;On the other hand, there's no guarantee of finding a global optimum; typically, many parameters need to be tuned, which can be computationally expensive and can easily lead to premature convergence.&lt;/p&gt;
&lt;h2 id="schema-theorem"&gt;Schema Theorem&lt;/h2&gt;
&lt;p&gt;For the theoretical foundation of Genetic Algorithms see &lt;a href="schema-theorem.html"&gt;Schema Theorem&lt;/a&gt;.&lt;/p&gt;</content><category term="permanent"/><category term="EvolutionaryAlgorithms"/></entry><entry><title>Optimising Computation At The Token-Level</title><link href="http://localhost:8000/optimising-computation-at-the-token-level.html" rel="alternate"/><published>2025-07-21T00:00:00+10:00</published><updated>2025-07-27T00:00:00+10:00</updated><author><name>Lex Toumbourou</name></author><id>tag:localhost,2025-07-21:/optimising-computation-at-the-token-level.html</id><summary type="html">&lt;p&gt;Optimising computation at the token-level&lt;/p&gt;</summary><content type="html">&lt;p&gt;Really interesting paper from researchers at KAIST AI, Mila and Google: "Mixture-of-Recursions: Learning Dynamic Recursive Depths for Adaptive Token-Level Computation"&lt;/p&gt;
&lt;p&gt;They build on the &lt;a href="recursive-transformer.html"&gt;Recursive Transformer&lt;/a&gt;, where layers (or groups of layers) can be applied repeatedly during decoding, allowing us to reduce the overall layer count of a network. They add a router to each stack of layers, which assigns the number of repeats (or recursion depth) per token.&lt;/p&gt;
&lt;p&gt;This routing strategy means that simple tokens (think: "and", "the", etc) only need to traverse a small recursive depth, and more content-rich tokens can be assigned larger recursion depths, effectively allowing the model to optimise computation at the token level. The routing is a form of &lt;a href="latent-reasoning.html"&gt;Latent Reasoning&lt;/a&gt;, where the model can effectively think at each layer group within the network.&lt;/p&gt;
&lt;p&gt;They also introduce a "recursion-wise key/value caching" mechanism, where key-value pairs are cached based on corresponding recursion.&lt;/p&gt;
&lt;p&gt;Interestingly, although the MoR learns to assign recursive depth to each token during training, at inference time, the depth can be optionally fixed, enabling a form of test-time scaling that trades compute for performance.&lt;/p&gt;
&lt;p&gt;I feel that this has the potential to dramatically decrease LLM parameter counts, continuing the tradition of democratising AI.&lt;/p&gt;
&lt;p&gt;&lt;img alt="mixture-of-recursions-fig-1.png" src="../_media/mixture-of-recursions-fig-1.png"&gt;&lt;/p&gt;
&lt;p&gt;They experiment with multiple-layer configuration strategies:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Cycle&lt;/strong&gt;: Layers reused cyclically (e.g., [0,1,2,0,1,2,0,1,2])&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Sequence&lt;/strong&gt;: Same layer repeated before moving to next (e.g., [0,0,0,1,1,1,2,2,2])&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Middle-Cycle/Middle-Sequence&lt;/strong&gt;: Keep unique first and last layers, share only middle layers&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Best performance: Middle-Cycle strategy&lt;/p&gt;
&lt;p&gt;&lt;img alt="mor-param-sharing-strategies.png" src="../_media/mor-param-sharing-strategies.png"&gt;&lt;/p&gt;
&lt;p&gt;They also try two different routing strategies:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Expert-choice&lt;/strong&gt;: Each recursion depth selects its top-k tokens. Guarantees a fixed compute budget but requires auxiliary loss to avoid causality violation&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Token-choice&lt;/strong&gt;: Each token is assigned a fixed recursion depth upfront. No causality issues, but needs load balancing&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Best performance: Expert-choice with auxiliary loss and linear router&lt;/p&gt;
&lt;p&gt;&lt;img alt="mor-routing-strategies.png" src="../_media/mor-routing-strategies.png"&gt;&lt;/p&gt;
&lt;p&gt;And two different K/V caching strategies:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Recursion-wise caching&lt;/strong&gt;: Only cache K/V pairs for tokens active at each recursion depth. Reduces memory by ~50%&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Recursive sharing&lt;/strong&gt;: Reuse K/V pairs from the first recursion for all subsequent steps. Maximum memory savings but slight accuracy drop&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Best performance: Recursion-wise caching for expert-choice routing&lt;/p&gt;</content><category term="reference"/><category term="LargeLanguageModels"/><category term="LatentReasoning"/><category term="TestTimeScaling"/></entry><entry><title>Absurdly Good Doggo Consistency with FLUX.1 Kontext</title><link href="http://localhost:8000/absurdly-good-doggo-consistency-with-flux1-kontext.html" rel="alternate"/><published>2025-06-01T00:00:00+10:00</published><updated>2025-06-01T00:00:00+10:00</updated><author><name>Lex Toumbourou</name></author><id>tag:localhost,2025-06-01:/absurdly-good-doggo-consistency-with-flux1-kontext.html</id><summary type="html">&lt;p&gt;Experiments with multi-turn character consistent editing&lt;/p&gt;</summary><content type="html">&lt;p&gt;This new image editing model from Black Forest Labs called &lt;strong&gt;FLUX.1 Kontext&lt;/strong&gt; is really good. You can read more about it &lt;a href="https://bfl.ai/models/flux-kontext"&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Although GPT Image 1 is still one of the &lt;a href="https://notesbylex.com/imagen-4-is-faster-but-gpt-is-still-the-goat"&gt;best image models out there&lt;/a&gt;, it is pretty limited in its ability to edit: characters get lost, and there's usually unrelated changes returned in the images.&lt;/p&gt;
&lt;p&gt;On the other hand, FLUX.1 Kontext, thanks to approach of &lt;a href="flow-matching.html"&gt;Flow Matching&lt;/a&gt; in latent space, maintains a high-quality level of text-to-image quality but with an absurdly good ability to edit photos. One remarkable thing is that it can maintain character consistency through many edits (called &lt;em&gt;multi-turn editing&lt;/em&gt;). Even without the context of the chain of images, or any sort of in-painting, I found that it was able to keep a source character consistent, even after many rounds of editing.&lt;/p&gt;
&lt;p&gt;To demonstrate the character consistency, I found the most recently taken photo of my dog, Doggo.&lt;/p&gt;
&lt;p&gt;Doggo recently had TPLO surgery on each of her legs in two separate staggered surgeries due to some painful arthritis. She is fully recovered now and doing much better.&lt;/p&gt;
&lt;p&gt;However, for the first two weeks after surgery, our poor puppy had to wear a giant cone to prevent her chewing off her stitches, which she hated.&lt;/p&gt;
&lt;p&gt;&lt;a href="_media/flux1-experiments/doggo-cone-1.jpg" target="_blank"&gt;
  &lt;img src="_media/flux1-experiments/doggo-cone-1.jpg" alt="Original: A picture of my dog after TPLO surgery" /&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Let's see if Kontext can remove the cone from poor Doggo's head.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;"remove the cone from my dog's head"&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href="_media/flux1-experiments/doggo-cone-2.jpg" target="_blank"&gt;
  &lt;img src="_media/flux1-experiments/doggo-cone-2.jpg" alt="Updated Original - a very convincing removal of my Dog's cone" /&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Much better.&lt;/p&gt;
&lt;p&gt;That works so well. Of course, if you look close enough, you can see the artifact where the cone was, but that's my dog, alright.&lt;/p&gt;
&lt;p&gt;Again, the amazing thing about the Kontext model is its ability to do multi-turn editing. Using the most recent output as input, let's see if we can make my poor Dog look like her usual happy self:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;"make my dog look happy"&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href="_media/flux1-experiments/doggo-cone-3.jpg" target="_blank"&gt;
  &lt;img src="_media/flux1-experiments/doggo-cone-3.jpg" alt="Doggo happy edit" /&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Admittedly, I had to try this prompt a few times before I got something that looked convincing like this. One of them made her head too big, and the other did some weird stuff with her ears.&lt;/p&gt;
&lt;p&gt;Anyway, that's pretty happy! I don't think she's ever quite smiled like that, but it's close.&lt;/p&gt;
&lt;p&gt;Now, to maximise her happiness, I move her to one of her favourite places in the world:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;"change the background to a sunny beach scene."&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href="../_media/flux1-experiments/doggo-cone-4-beach.jpg" target="_blank"&gt;
  &lt;img src="../_media/flux1-experiments/doggo-cone-4-beach.jpg" alt="Doggo on the beach" /&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I'm really impressed by the cast shadows. The model has figure out where it wants the sun to be, and can generate shadows at roughly match that model. Wild.&lt;/p&gt;
&lt;p&gt;Finally, to achieve peak happiness, I put her favourite chew toy next to her, a red deer antler.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;"add an antler bone in front of her"&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href="../_media/flux1-experiments/doggo-cone-5-beach.jpg" target="_blank"&gt;
  &lt;img src="../_media/flux1-experiments/doggo-cone-5-beach.jpg" alt="Doggo with antler bone in front of her" /&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Even after four rounds of editing, it still looks exactly like Doggo - really impressive stuff.&lt;/p&gt;
&lt;p&gt;She looks so happy; I think this could be a birthday card.&lt;/p&gt;
&lt;p&gt;My nephew's birthday is coming up, and he loves Minecraft. So I'll try turning it into a Minecraft-themed bday.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Change background to minecraft. Write "Happy Birthday, Nephew" in bright, colorful text on top of the image.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href="../_media/flux1-experiments/doggo-cone-6-bday.jpg" target="_blank"&gt;
  &lt;img src="../_media/flux1-experiments/doggo-cone-6-bday.jpg" alt="Minecraft birthday Doggo" /&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Looking pretty good, albeit a little distorted.&lt;/p&gt;
&lt;p&gt;I wonder if I can use the same photo for all my future greeting card needs. It's June, but still, it's never too early to be planning Christmas. It is coming into winter in the Southern Hemisphere, after all. Isn't Christmas in July a thing?&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;change text to "Seasons Greetings" with a Christmas font. Convert into a snowy background. Remove antler. Add a snowman next to her. Add a Christmas hat on top.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href="../_media/flux1-experiments/doggo-xmas-1.jpg" target="_blank"&gt;
  &lt;img src="../_media/flux1-experiments/doggo-xmas-1.jpg" alt="Christmas Doggo" /&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Amazing. Now we're seven edits deep, and it still looks like my Doggo. Granted, we've started to see some artifacts, and there's some roughness around the edges, but this is looking good.&lt;/p&gt;
&lt;p&gt;Kontext also excels at style transfer, so let's try a few different styles for the Christmas Card.&lt;/p&gt;
&lt;style&gt;
table tr, table td {
   border: none;
}
&lt;/style&gt;

&lt;table style="width:100%; table-layout: fixed;"&gt;
  &lt;tr&gt;
    &lt;td style="text-align:center; vertical-align:top;"&gt;
      &lt;a href="../_media/flux1-experiments/doggo-90s-christmas.jpg" target="_blank"&gt;
        &lt;img src="../_media/flux1-experiments/doggo-90s-christmas.jpg" width="150" /&gt;
      &lt;/a&gt;&lt;br&gt;
      &lt;span style="font-size:smaller;"&gt;"Convert into the style of a 90s Christmas Movie poster"&lt;/span&gt;
    &lt;/td&gt;
    &lt;td style="text-align:center; vertical-align:top;"&gt;
      &lt;a href="../_media/flux1-experiments/doggo-vintage.jpg" target="_blank"&gt;
        &lt;img src="../_media/flux1-experiments/doggo-vintage.jpg" width="150" /&gt;
      &lt;/a&gt;&lt;br&gt;
      &lt;span style="font-size:smaller;"&gt;"Convert into a Vintage Storybook Style Christmas Card."&lt;/span&gt;
    &lt;/td&gt;
    &lt;td style="text-align:center; vertical-align:top;"&gt;
      &lt;a href="../_media/flux1-experiments/doggo-illustration.jpg" target="_blank"&gt;
        &lt;img src="../_media/flux1-experiments/doggo-illustration.jpg" width="150" /&gt;
      &lt;/a&gt;&lt;br&gt;
      &lt;span style="font-size:smaller;"&gt;"Convert into a watercolor illustrated Christmas Card."&lt;/span&gt;
    &lt;/td&gt;
    &lt;td style="text-align:center; vertical-align:top;"&gt;
      &lt;a href="../_media/flux1-experiments/doggo-simpsons.jpg" target="_blank"&gt;
        &lt;img src="../_media/flux1-experiments/doggo-simpsons.jpg" width="150" /&gt;
      &lt;/a&gt;&lt;br&gt;
      &lt;span style="font-size:smaller;"&gt;"change into the style of The Simpsons"&lt;/span&gt;
    &lt;/td&gt;
  &lt;/tr&gt;
&lt;/table&gt;

&lt;p&gt;Few interesting variations on the text, but very impressive nonetheless.&lt;/p&gt;
&lt;p&gt;Back to the original Christmas Card, the Kontext paper demonstrates even more incredible global edits, like adding multiple characters, and rotating camera angles.&lt;/p&gt;
&lt;p&gt;&lt;img alt="figure1.png" src="../_media/flux1-experiments/figure1.png"&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Figure 1: Consistent character synthesis with FLUX.1 Kontext by Black Forest Labs&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Let's experiment with some of that.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Remove text. There are now two dogs driving in a pink convertible.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href="../_media/flux1-experiments/doggo-convertable.jpg" target="_blank"&gt;
  &lt;img src="../_media/flux1-experiments/doggo-convertable.jpg" alt="doggo-convertable.jpg" /&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I mean, that kind of works. I think it's still my dog in the driver's seat. Hard to tell whether the snowman or Doggo is driving the car, but between them I assume they've got it covered.&lt;/p&gt;
&lt;p&gt;I tried the prompt "Watch them from behind.", which is actually given as an example in the paper. That was immediately flagged as NSFW and refused. Kontext, you definitely are misunderstanding me.&lt;/p&gt;
&lt;p&gt;I tried an alternate prompt.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;"turn the camera to watch them from the back"&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href="../_media/flux1-experiments/doggo-car.jpg" target="_blank"&gt;
  &lt;img src="../_media/flux1-experiments/doggo-car.jpg" alt="doggo-car.jpg" /&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Not sure exactly what's going on here, but it has turned the car around, but not any of the character. Starting to get a little terrifying, feeling a bit like &lt;a href="https://en.wikipedia.org/wiki/Loab"&gt;Loab&lt;/a&gt; might be waiting a few turns down the line, so I'll stop.&lt;/p&gt;
&lt;p&gt;Now, the showcase of all the edits:&lt;/p&gt;
&lt;h2 id="flux1-kontext-character-consistency"&gt;FLUX.1: Kontext - Character Consistency&lt;/h2&gt;
&lt;table style="width:100%; table-layout: fixed;"&gt;
  &lt;tr&gt;
    &lt;td style="text-align:center; vertical-align:top;"&gt;
      &lt;a href="_media/flux1-experiments/doggo-cone-1.jpg" target="_blank"&gt;
        &lt;img src="_media/flux1-experiments/doggo-cone-1.jpg" width="150" /&gt;
      &lt;/a&gt;&lt;br&gt;
      &lt;span style="font-size:smaller;"&gt;Source image&lt;/span&gt;
    &lt;/td&gt;
    &lt;td style="text-align:center; vertical-align:top;"&gt;
      &lt;a href="_media/flux1-experiments/doggo-cone-2.jpg" target="_blank"&gt;
        &lt;img src="_media/flux1-experiments/doggo-cone-2.jpg" width="150" /&gt;
      &lt;/a&gt;&lt;br&gt;
      &lt;span style="font-size:smaller;"&gt;"remove the cone from my dog's head"&lt;/span&gt;
    &lt;/td&gt;
    &lt;td style="text-align:center; vertical-align:top;"&gt;
      &lt;a href="_media/flux1-experiments/doggo-cone-3.jpg" target="_blank"&gt;
        &lt;img src="_media/flux1-experiments/doggo-cone-3.jpg" width="150" /&gt;
      &lt;/a&gt;&lt;br&gt;
      &lt;span style="font-size:smaller;"&gt;"make my dog look happy"&lt;/span&gt;
    &lt;/td&gt;
    &lt;td style="text-align:center; vertical-align:top;"&gt;
      &lt;a href="_media/flux1-experiments/doggo-cone-4-beach.jpg" target="_blank"&gt;
        &lt;img src="_media/flux1-experiments/doggo-cone-4-beach.jpg" width="150" /&gt;
      &lt;/a&gt;&lt;br&gt;
      &lt;span style="font-size:smaller;"&gt;"change the background to a sunny beach scene"&lt;/span&gt;
    &lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td style="text-align:center; vertical-align:top;"&gt;
      &lt;a href="_media/flux1-experiments/doggo-cone-5-beach.jpg" target="_blank"&gt;
        &lt;img src="_media/flux1-experiments/doggo-cone-5-beach.jpg" width="150" /&gt;
      &lt;/a&gt;&lt;br&gt;
      &lt;span style="font-size:smaller;"&gt;"add an antler bone in front of her"&lt;/span&gt;
    &lt;/td&gt;
    &lt;td style="text-align:center; vertical-align:top;"&gt;
      &lt;a href="_media/flux1-experiments/doggo-cone-6-bday.jpg" target="_blank"&gt;
        &lt;img src="_media/flux1-experiments/doggo-cone-6-bday.jpg" width="150" /&gt;
      &lt;/a&gt;&lt;br&gt;
      &lt;span style="font-size:smaller;"&gt;"Change background to Minecraft. Write 'Happy Birthday, Nephew' in bright, colorful text"&lt;/span&gt;
    &lt;/td&gt;
    &lt;td style="text-align:center; vertical-align:top;"&gt;
      &lt;a href="_media/flux1-experiments/doggo-xmas-1.jpg" target="_blank"&gt;
        &lt;img src="_media/flux1-experiments/doggo-xmas-1.jpg" width="150" /&gt;
      &lt;/a&gt;&lt;br&gt;
      &lt;span style="font-size:smaller;"&gt;"Seasons Greetings, snowy background, snowman, Christmas hat, remove antler"&lt;/span&gt;
    &lt;/td&gt;
    &lt;td style="text-align:center; vertical-align:top;"&gt;
      &lt;a href="_media/flux1-experiments/doggo-convertable.jpg" target="_blank"&gt;
        &lt;img src="_media/flux1-experiments/doggo-convertable.jpg" width="150" /&gt;
      &lt;/a&gt;&lt;br&gt;
      &lt;span style="font-size:smaller;"&gt;"Two dogs driving in a pink convertible"&lt;/span&gt;
    &lt;/td&gt;
  &lt;/tr&gt;
&lt;/table&gt;

&lt;p&gt;It's a very impressive model indeed. We can contrast the same sequence of turns with GPT Image 1, which the paper reports as the second best performing model for character consistency.&lt;/p&gt;
&lt;p&gt;&lt;img alt="character-ref.png" src="../_media/flux1-experiments/character-ref.png"&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Figure 9: Image-to-image evaluation on KontextBench by Black Forest Labs&lt;/em&gt;&lt;/p&gt;
&lt;h2 id="gpt-image-1-character-consistency"&gt;GPT Image 1 - Character Consistency&lt;/h2&gt;
&lt;table style="width:100%; table-layout: fixed;"&gt;
  &lt;tr&gt;
    &lt;td style="text-align:center; vertical-align:top"&gt;
      &lt;a href="_media/flux1-experiments/doggo-cone-1.jpg" target="_blank"&gt;
        &lt;img src="_media/flux1-experiments/doggo-cone-1.jpg" width="150" /&gt;
      &lt;/a&gt;&lt;br&gt;
      &lt;span style="font-size:smaller;"&gt;Source image&lt;/span&gt;
    &lt;/td&gt;
    &lt;td style="text-align:center; vertical-align:top;"&gt;
      &lt;a href="_media/flux1-experiments/doggo-gpt-image-1.png" target="_blank"&gt;
        &lt;img src="_media/flux1-experiments/doggo-gpt-image-1.png" width="150" /&gt;
      &lt;/a&gt;&lt;br&gt;
      &lt;span style="font-size:smaller;"&gt;1. "remove the cone from my dog's head" (gpt-image-1)&lt;/span&gt;
    &lt;/td&gt;
    &lt;td style="text-align:center; vertical-align:top;"&gt;
      &lt;a href="_media/flux1-experiments/doggo-gpt-image-2.png" target="_blank"&gt;
        &lt;img src="_media/flux1-experiments/doggo-gpt-image-2.png" width="150" /&gt;
      &lt;/a&gt;&lt;br&gt;
      &lt;span style="font-size:smaller;"&gt;2. "make my dog look happy" (gpt-image-1)&lt;/span&gt;
    &lt;/td&gt;
    &lt;td style="text-align:center; vertical-align:top;"&gt;
      &lt;a href="_media/flux1-experiments/doggo-gpt-image-3.png" target="_blank"&gt;
        &lt;img src="_media/flux1-experiments/doggo-gpt-image-3.png" width="150" /&gt;
      &lt;/a&gt;&lt;br&gt;
      &lt;span style="font-size:smaller;"&gt;3. "change the background to a sunny beach scene"&lt;/span&gt;
    &lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td style="text-align:center; vertical-align:top;"&gt;
      &lt;a href="_media/flux1-experiments/doggo-gpt-image-4.png" target="_blank"&gt;
        &lt;img src="_media/flux1-experiments/doggo-gpt-image-4.png" width="150" /&gt;
      &lt;/a&gt;&lt;br&gt;
      &lt;span style="font-size:smaller;"&gt;4. "add an antler bone in front of her"&lt;/span&gt;
    &lt;/td&gt;
    &lt;td style="text-align:center; vertical-align:top;"&gt;
      &lt;a href="_media/flux1-experiments/doggo-gpt-image-5.png" target="_blank"&gt;
        &lt;img src="_media/flux1-experiments/doggo-gpt-image-5.png" width="150" /&gt;
      &lt;/a&gt;&lt;br&gt;
      &lt;span style="font-size:smaller;"&gt;5. "Change background to minecraft. Write 'Happy Birthday, Nephew' in bright, colorful text on top of the image."&lt;/span&gt;
    &lt;/td&gt;
    &lt;td style="text-align:center; vertical-align:top;"&gt;
      &lt;a href="_media/flux1-experiments/doggo-gpt-image-6.png" target="_blank"&gt;
        &lt;img src="_media/flux1-experiments/doggo-gpt-image-6.png" width="150" /&gt;
      &lt;/a&gt;&lt;br&gt;
      &lt;span style="font-size:smaller;"&gt;6. "change text to 'Seasons Greetings'. Convert into a snowy background. Remove antler. Add a snowman next to her. Add a Christmas hat on top."&lt;/span&gt;
    &lt;/td&gt;
    &lt;td style="text-align:center; vertical-align:top;"&gt;
      &lt;a href="_media/flux1-experiments/doggo-gpt-image-7.png" target="_blank"&gt;
        &lt;img src="_media/flux1-experiments/doggo-gpt-image-7.png" width="150" /&gt;
      &lt;/a&gt;&lt;br&gt;
      &lt;span style="font-size:smaller;"&gt;7. "Remove text. There are now two dogs driving in a pink convertible."&lt;/span&gt;
    &lt;/td&gt;
  &lt;/tr&gt;
&lt;/table&gt;

&lt;p&gt;Still an incredible model, but we can see clearly that even by the second image it's a totally different dog.&lt;/p&gt;
&lt;p&gt;Black Forest Labs cooked with this one, as the kids would say.&lt;/p&gt;</content><category term="permanent"/><category term="ImageEditing"/><category term="ImageGeneration"/></entry><entry><title>Learning to Reason without External Rewards</title><link href="http://localhost:8000/learning-to-reason-without-external-rewards.html" rel="alternate"/><published>2025-05-28T00:00:00+10:00</published><updated>2025-05-28T00:00:00+10:00</updated><author><name>Lex Toumbourou</name></author><id>tag:localhost,2025-05-28:/learning-to-reason-without-external-rewards.html</id><summary type="html">&lt;p&gt;aka Self-Confidence is All You Need&lt;/p&gt;</summary><content type="html">&lt;p&gt;Another very interesting paper on the topic of reward modelling, that continues to turn assumptions on their head about how to train reasoning LLMs.&lt;/p&gt;
&lt;p&gt;This paper proposes a new RL training method that doesn't rely on reward models (&lt;a href="reinforcement-learning-from-human-feedback.html"&gt;RLHF&lt;/a&gt;) like ChatGPT, selected high-quality ground truth examples (RLVR) like DeepSeek R1, or even verifiable generated data (Self-Play) like &lt;a href="absolute-zero-reinforced-self-play-reasoning-with-zero-data.html"&gt;AbsoluteZero&lt;/a&gt;, to develop complex reasoning capability (thinking mode).&lt;/p&gt;
&lt;p&gt;&lt;img alt="" src="../../_media/rlif-cover.png"&gt;&lt;/p&gt;
&lt;p&gt;Turns out we can just use the model's internal sense of confidence as the reward signal to train a reasoning model 🤯&lt;/p&gt;
&lt;p&gt;The authors take GRPO (from Deepseek R1) and replace the verifiable reward signal with a "self-certainty score" (specifically the KL divergence between the model's output distribution and a uniform distribution), then train on a collection of prompts relative to the evaluated domains. They demonstrate reasoning performance comparable to GRPO on math while exceeding it on coding tasks.&lt;/p&gt;
&lt;p&gt;They introduce a new paradigm, "Reinforcement Learning from Internal Feedback" (RLIF) and call their approach &lt;a href="intuitor.html"&gt;INTUITOR&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;If this approach scales, it could unlock the ability to generally improve reasoning LLMs in domains where high-quality ground truth isn't available or not verifiable (i.e., any domain other than math and code) and provide evidence that pre-trained LLMs "possess richer latent behavioural priors than previously recognised."&lt;/p&gt;
&lt;p&gt;&lt;img alt="" src="../../_media/intuitor-fig2.png"&gt;&lt;/p&gt;
&lt;p&gt;Interesting, indeed.&lt;/p&gt;</content><category term="reference"/><category term="ReinforcementLearning"/><category term="RewardModeling"/><category term="LargeLanguageModels"/></entry><entry><title>John Carmack is working on game-playing robots</title><link href="http://localhost:8000/john-carmack-is-working-on-game-playing-robots.html" rel="alternate"/><published>2025-05-23T00:00:00+10:00</published><updated>2025-05-23T00:00:00+10:00</updated><author><name>Lex Toumbourou</name></author><id>tag:localhost,2025-05-23:/john-carmack-is-working-on-game-playing-robots.html</id><summary type="html">&lt;p&gt;on John Carmack's Upperbound 25 Talk Notes&lt;/p&gt;</summary><content type="html">&lt;p&gt;John Carmack shared his notes from a recent talk at an AI conference about the research he and his team of six are conducting at his new AGI company, Keen Technologies.&lt;/p&gt;
&lt;p&gt;I'm a big fan of Carmack. I grew up on his games, from Commander Keen to Quake. I love his approach to engineering, especially after reading Masters of Doom about the early years of id Software.&lt;/p&gt;
&lt;p&gt;Keen Technologies is revisiting a seemingly largely solved problem: playing Atari Games.&lt;/p&gt;
&lt;p&gt;In 2013, Deepmind described the first deep-RL approach to playing Atari games that achieved human-level performance just from reading pixels (on some games, at least). Then, in 2020, Deepmind returned and smashed their own record by beating nearly all Atari games to human-level performance in their Agent57 approach. See &lt;a href="playing-atari-with-deep-reinforcement-learning.html"&gt;Playing Atari with Deep Reinforcement Learning&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;So you might think Atari is completely solved, so what's left to research? Well, has it been solved with &lt;strong&gt;robots&lt;/strong&gt;??&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;"A reality check for people that think full embodied AGI is right around the corner is to ask your dancing humanoid robot to pick up a joystick and learn how to play an obscure video game."&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Carmack's team has built a system that uses servo motors to control a physical controller, which can learn to play Atari games in real-time, using just camera input as a signal.&lt;/p&gt;
&lt;p&gt;I think the intersection of AI research and hardware will be a boon for the capability of embodied AI in general. Despite the rapid progress of LLM technology deployed to consumers, it's yet to meaningfully demonstrate improvements in embodied agents, even though vision understanding capabilities are getting so good.&lt;/p&gt;
&lt;p&gt;The real-time aspect is really important: "Reality is not a turn-based game", he says. So far, all the prior work with game playing, and even with the LLM interactions we've seen, have assumed a turn-based approach. You write a prompt, the LLM writes a response, and so on; even with the LLMs that operate using voice, the experience is largely the same. Say some things, and wait for a response, then say something else, which is a different style of conversation to the one we'd have with a person, with pauses, and interruptions, etc. Some of the boundaries to human-like conversations are clearly in the hardware.&lt;/p&gt;
&lt;p&gt;Secondly, he's choosing not to focus on pre-trained LLMs, putting him at odds with nearly everyone else in AI right now.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;"I believe in the importance of learning from a stream of interactive experience, as humans and animals do."&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I think there's likely a lot of value in continuing to explore techniques outside of LLMs, as there's a distinct possibility that the progress of AI will be stuck in a local minima for a while, with so much investment and effort thrown into LLMs, just because of much juice is clearly left to extract from them. It's good to have someone so talented and driven thinking about other possibilities. Still, I don't see why LLMs couldn't be trained on a big enough corpus of robot game-playing that they could demonstrate the same capability that Carmack is going for. This point he does acknowledge, with a references to Sutton's Bitter Lesson. Incidentally, Sutton joined the team at Keen technologies in 2023.&lt;/p&gt;
&lt;p&gt;Anyway, who am I to question Carmack? Let him cook.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;There's a lot of other really interesting details in there. I highly recommend reading the notes.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://docs.google.com/document/d/1-Fqc6R6FdngRlxe9gi49PRvU97R83O7ZTN_KFXo_jf0/edit?tab=t.0#heading=h.628l6khl68xe"&gt;Talk notes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.google.com/presentation/d/1GmGe9ref1nxEX_ekDuJXhildpWGhLEYBMeXCclVECek/edit?slide=id.p#slide=id.p"&gt;Slides&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://x.com/ID_AA_Carmack/status/1925710474366034326"&gt;Tweet&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content><category term="reference"/><category term="GamePlayingAI"/><category term="LimitationsofLLMs"/></entry><entry><title>Imagen 4 is faster, but GPT is still the GOAT</title><link href="http://localhost:8000/imagen-4-is-faster-but-gpt-is-still-the-goat.html" rel="alternate"/><published>2025-05-21T00:00:00+10:00</published><updated>2025-05-21T00:00:00+10:00</updated><author><name>Lex Toumbourou</name></author><id>tag:localhost,2025-05-21:/imagen-4-is-faster-but-gpt-is-still-the-goat.html</id><summary type="html">&lt;p&gt;a few comparisons of Google's Imagen 4 vs OpenAI's gpt-image-1&lt;/p&gt;</summary><content type="html">&lt;p&gt;Yesterday, Google &lt;a href="https://blog.google/technology/ai/generative-media-models-io-2025"&gt;announced&lt;/a&gt; a bunch of new generative tools at the ongoing Google I/O event. Although, at the time of writing, they're mostly unavailable outside of the USA:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Veo 3&lt;/strong&gt;: state-of-the-art video generation that can generate videos with audio.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Veo 2&lt;/strong&gt;: updated to include camera controls, outpainting, and adding and removing objects.)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Flow AI&lt;/strong&gt;: a filmmaking tool that appears to be used to create videos with continuity between clips.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;SynthID Detector&lt;/strong&gt;: a tool for detecting the SynthID watermark that Google inject in all generated content.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Lyria 2&lt;/strong&gt;: an updated version of the music generation tool.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Imagen 4&lt;/strong&gt;: This promises a number of improvements to Imagen 3, including supporting up to 2k resolution and improved typography.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Imagen 4&lt;/strong&gt; seems to be the only thing available to me right now in Australia, and only via the Gemini app. However, when generating images in Gemini, they don't mention the model name in the image outputs - I'm not sure if I'm testing Imagen 3 or 4. Imagen 4 is publicly available on &lt;a href="https://fal.ai/models/fal-ai/imagen4/preview"&gt;Fal.ai&lt;/a&gt;; however, as a preview, I'm not sure I quite understand the logic behind that, but I do appreciate how complicated shipping products at Google's scale is.&lt;/p&gt;
&lt;p&gt;I did a quick test of some prompts to compare &lt;strong&gt;Imagen 4&lt;/strong&gt; to OpenAI's &lt;strong&gt;gpt-image-1&lt;/strong&gt;, which is currently the SOTA for image gen.&lt;/p&gt;
&lt;p&gt;TL;DR &lt;strong&gt;gpt-image-1&lt;/strong&gt; is still the greatest for overall quality and prompt adherence, but &lt;strong&gt;Imagen 4&lt;/strong&gt; is about 5- 10x faster. They are both incredible image generators.&lt;/p&gt;
&lt;hr&gt;
&lt;blockquote&gt;
&lt;p&gt;"A group of Mercians, from the Kingdom of Essex in the year 500, sit around a table showing each other a picture on an iPhone."&lt;/p&gt;
&lt;/blockquote&gt;
&lt;table&gt;
  &lt;tr&gt;
    &lt;th&gt;Imagen 4&lt;/th&gt;
    &lt;th&gt;gpt-image-1&lt;/th&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;&lt;img src="../_media/imagegen4-mercian.png" width="100%"/&gt;&lt;br/&gt;Gen time: &lt;strong&gt;10.21s&lt;/strong&gt;&lt;/td&gt;
    &lt;td&gt;&lt;img src="../_media/gpt-image-1-mercian.png" width="100%"/&gt;&lt;br/&gt;Gen time: &lt;strong&gt;62.00s&lt;/strong&gt;&lt;/td&gt;
  &lt;/tr&gt;
&lt;/table&gt;

&lt;p&gt;In terms of aesthetic quality and prompt adherence, gpt-image-1 is the clear winner. The phone is turned around the wrong way in the Imagen 4 version, and it feels more AI-slop-esque. However, you can see that Imagen 4 ran about 6x faster.&lt;/p&gt;
&lt;hr&gt;
&lt;blockquote&gt;
&lt;p&gt;"A group of young women, in the 1920s, watch as one of them flies a drone in the streets of Brooklyn, NYC."&lt;/p&gt;
&lt;/blockquote&gt;
&lt;table&gt;
  &lt;tr&gt;
    &lt;th&gt;Imagen 4&lt;/th&gt;
    &lt;th&gt;gpt-image-1&lt;/th&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;&lt;img src="../_media/imagegen4-drone.png" width="100%"/&gt;&lt;br/&gt;Gen time: &lt;strong&gt;9.6s&lt;/strong&gt;&lt;/td&gt;
    &lt;td&gt;&lt;img src="../_media/gpt-image-1-drone.png" width="100%"/&gt;&lt;br/&gt;Gen time: &lt;strong&gt;47.25s&lt;/strong&gt;&lt;/td&gt;
  &lt;/tr&gt;
&lt;/table&gt;

&lt;p&gt;In this example, I would say this is one rare example of Imagen 4 being better, although both are really good.&lt;/p&gt;
&lt;hr&gt;
&lt;blockquote&gt;
&lt;p&gt;"Leonardo da Vinci sits at a HP laptop, prompting ChatGPT with the text: 'portrait of a woman with a mysterious smile, folded hands, and a soft, mountainous background', the Mona Lisa is shown on screen."&lt;/p&gt;
&lt;/blockquote&gt;
&lt;table&gt;
  &lt;tr&gt;
    &lt;th&gt;Imagen 4&lt;/th&gt;
    &lt;th&gt;gpt-image-1&lt;/th&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;&lt;img src="../_media/imagegen4-vinci.png" width="100%"/&gt;&lt;br/&gt;Gen time: &lt;strong&gt;8.00s&lt;/strong&gt;&lt;/td&gt;
    &lt;td&gt;&lt;img src="../_media/gpt-image-1-vinci.png" width="100%"/&gt;&lt;br/&gt;Gen time: &lt;strong&gt;58.70s&lt;/strong&gt;&lt;/td&gt;
  &lt;/tr&gt;
&lt;/table&gt;

&lt;p&gt;Again, while both are incredible, gpt-image-1 is nearly flawless. The text is a tiny bit off, but overall, it captured exactly the intention, and looks pretty amazing. Imagen 4 leans more towards the AI-slop aesthetic, reminiscent of earlier versions of DALL-E.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;I saw a nice paper last year that did some investigation into the poor performance of rare "concepts" in AI image datasets (&lt;a href="no-zero-shot-without-exponential-data-pretraining-concept-frequency-determines-multimodal-model-performance.html"&gt;No 'Zero-Shot' Without Exponential Data: Pretraining Concept Frequency Determines Multimodal Model Performance&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;The thesis is that image classification and generation models perform much worse on rare concepts in the dataset. They created a dataset of rare concepts (at least rare in the LAION family of datasets) called &lt;a href="let-it-wag.html"&gt;Let It Wag&lt;/a&gt;. I made images with three rare concepts from the Let It Wag dataset: &lt;strong&gt;red-necked grebe&lt;/strong&gt;, &lt;strong&gt;Globeflower&lt;/strong&gt; and &lt;strong&gt;SR-20&lt;/strong&gt;. Not sure how rare these are in OpenAI's or Google's dataset, but it gives some indication of how "rareness" affects the image outputs.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;"A Red-necked Grebe sits next to a Globeflower while an SR-20 aircraft prepares for take off in the distance."&lt;/p&gt;
&lt;/blockquote&gt;
&lt;table&gt;
  &lt;tr&gt;
    &lt;th&gt;Imagen 4&lt;/th&gt;
    &lt;th&gt;gpt-image-1&lt;/th&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;&lt;img src="../_media/imagegen-1-glebeduck.png" width="100%"/&gt;&lt;br/&gt;Gen time: &lt;strong&gt;8.57s&lt;/strong&gt;&lt;/td&gt;
    &lt;td&gt;&lt;img src="../_media/gpt-image-1-glebeduck.png" width="100%"/&gt;&lt;br/&gt;Gen time: &lt;strong&gt;57.13s&lt;/strong&gt;&lt;/td&gt;
  &lt;/tr&gt;
&lt;/table&gt;

&lt;p&gt;I'm no expert on Globe Flowers, Red-necked Grebes or SR-20s, but while Imagen 4 does a really good job, it seems gpt-image-1 is better. But only marginally. These are really impressive results. Both models can do well on even extremely rare concepts.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;For the last test, I tested a very specific prompt containing some complicated poses.&lt;/p&gt;
&lt;p&gt;I enlisted GPT-4o's help to write this prompt:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;A three-frame sequence showing Egyptian queen Cleopatra performing a Romanian deadlift using dumbbells with perfect form: Frame 1 — standing tall at the top of the movement, dumbbells at her thighs; Frame 2 — at the bottom position with a flat back and slight knee bend, weights just below the knees; Frame 3 — halfway up on the return, hips driving forward, maintaining strong posture and control. Photo realistic.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;table&gt;
  &lt;tr&gt;
    &lt;th&gt;Imagen 4&lt;/th&gt;
    &lt;th&gt;gpt-image-1&lt;/th&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;&lt;img src="../_media/imagen4-cleo.png" width="100%"/&gt;&lt;br/&gt;Image gen: &lt;strong&gt;5.60s&lt;/strong&gt;&lt;/td&gt;
    &lt;td&gt;&lt;img src="../_media/gpt-image-1-cleo.png" width="100%"/&gt;&lt;br/&gt;Image gen: &lt;strong&gt;71.47s&lt;/strong&gt;&lt;/td&gt;
  &lt;/tr&gt;
&lt;/table&gt;

&lt;p&gt;gpt-image-1 got it usefully close. I'd say the form is nearly perfect, although Cleo goes from holding one and a half dumbbells to a barbell. I don't know what exercise Imagen 4 is doing, but it ain't what I had in mind.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="summary"&gt;Summary&lt;/h2&gt;
&lt;p&gt;I'd say gpt-image-1 wins in 4/5 of my simplistic tests, based on aesthetics and prompt adherence. However, Imagen 4 was sometimes more than 10x faster than gpt-image-1. I could see Imagen 4 being useful for rapid prototyping and exploration of ideas.&lt;/p&gt;</content><category term="permanent"/><category term="ImageGeneration"/></entry><entry><title>Vibe-Coding Mathematical Discoveries</title><link href="http://localhost:8000/vibe-coding-mathematical-discoveries.html" rel="alternate"/><published>2025-05-18T00:00:00+10:00</published><updated>2025-05-18T00:00:00+10:00</updated><author><name>Lex Toumbourou</name></author><id>tag:localhost,2025-05-18:/vibe-coding-mathematical-discoveries.html</id><summary type="html">&lt;p&gt;Using evolutionary algorithms with LLM-coding agents&lt;/p&gt;</summary><content type="html">&lt;p&gt;You may have heard of DeepMind's new whitepaper about their coding agent, AlphaEvolve. It discovered a new algorithm for multiplying matrices, improving a 56-year-old solution, and many other mathematical problems, including optimising Google's internal infrastructure scheduling algorithms.&lt;/p&gt;
&lt;p&gt;AlphaEvolve builds on DeepMind's 2023 work called FunSearch, where the basic idea is to continuously improve LLM-generated solutions to problems expressed as programs (i.e. code gen), re-prompting with previously-generated solutions selected using an evolutionary algorithm. At a high level:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Start with a prompt describing a problem, including a code base skeleton, with markers to show where the LLM should modify the code (&lt;strong&gt;EVOLVE-BLOCK START&lt;/strong&gt; / &lt;strong&gt;EVOLVE-BLOCK END&lt;/strong&gt;)&lt;/li&gt;
&lt;li&gt;Use an evaluation function that assesses the solution's correctness and measures other properties, such as runtime, simplicity, num operations, etc.&lt;/li&gt;
&lt;li&gt;Create a program database, which can start empty or be seeded with known solutions.&lt;/li&gt;
&lt;li&gt;Sample programs from the database, using an evolutionary selection strategy based on island models (see below).&lt;/li&gt;
&lt;li&gt;Instruct a set of LLMs to generate new programs to improve the evaluation metrics.&lt;/li&gt;
&lt;li&gt;Now evaluate the results (using a lot of $ worth of distributed computation), and store the most promising programs.&lt;/li&gt;
&lt;li&gt;Repeat 5-6 until you have SOTA result.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The sampling algorithm is based on prior work on evolutionary algorithms (MAP-Elites and island models):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Solutions are clustered into "islands" based on performance characteristics.&lt;/li&gt;
&lt;li&gt;Programs in islands evolve independently from other islands, and high-performance programs are selected as parents.&lt;/li&gt;
&lt;li&gt;The LLM plays the breeder role, generating offspring programs by generating new programs seeded from the parents.&lt;/li&gt;
&lt;li&gt;Information flows between the islands by "culling" the worst programs in the islands, replacing them with the best programs from the surviving islands&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The main improvements on FunSearch are that a) it can evolve an entire codebase, not just a single function, and b) they have access to more powerful LLMs, from PaLM2 to Gemini Flash/Pro 2.0. Presumably, even more improvements can be made by utilising the latest generation of Gemini models (2.5 Pro, etc).&lt;/p&gt;
&lt;p&gt;One interesting detail is that the open problems were suggested by mathematicians Javier Gomez Serrano and Terence Tao, who also helped formulate them as inputs. So, in a way, this might be the first example of vibe-coded mathematical discoveries.&lt;/p&gt;
&lt;p&gt;&lt;img alt="alphaevolve-fig-2.png" src="../../_media/alphaevolve-fig-2.png"&gt;&lt;/p&gt;
&lt;p&gt;Discussion on &lt;a href="https://www.linkedin.com/feed/update/urn:li:activity:7328934233345798144/"&gt;Linkedin&lt;/a&gt;.&lt;/p&gt;</content><category term="reference"/><category term="AgenticReasoning"/><category term="LargeLanguageModels"/><category term="EvolutionaryAlgorithms"/></entry><entry><title>NoProp: Training Neural Networks Without Back-Propagation or Forward-Propagation</title><link href="http://localhost:8000/noprop-training-neural-networks-without-back-propagation-or-forward-propagation.html" rel="alternate"/><published>2025-05-15T00:00:00+10:00</published><updated>2025-05-15T00:00:00+10:00</updated><author><name>Lex Toumbourou</name></author><id>tag:localhost,2025-05-15:/noprop-training-neural-networks-without-back-propagation-or-forward-propagation.html</id><summary type="html">&lt;p&gt;an alternative training method to backprop that does local layer learning&lt;/p&gt;</summary><content type="html">&lt;p&gt;This paper proposes a "back-propagation-free" (kinda) approach to training a denoising (Diffusion / Flow Matching) model.&lt;/p&gt;
&lt;p&gt;The main difference between the backprop approach and NoProp is that each block (layer) is optimised to denoise independently instead of propagating errors throughout the entire network, think: gradient descent per block. They also don't need to do a forward pass through the whole network. Each block is given a copy of the input data embeddings and a noised version of the label, meaning blocks can be sampled randomly throughout training, effectively allowing for much better ability to parallelise training.&lt;/p&gt;
&lt;p&gt;At inference time, the noised label is replaced with the output of the preceding layer.&lt;/p&gt;
&lt;p&gt;&lt;img alt="noprop-figure-1.png" src="../../_media/noprop-figure-1.png"&gt;&lt;/p&gt;
&lt;p&gt;In theory, NoProp could reduce the memory needed to train models, as activations wouldn't need to be stored for all layers at once. Also, since it doesn't depend on the preceding block's output, nor does it have to propagate gradients through the whole network, it should be much easier to parallelise the network's training. A final selling point is that the model isn't necessarily learning a hierarchical representation, or at least is learning a different type of hierarchy than backprop.&lt;/p&gt;
&lt;p&gt;Each layer is trained using the sum of multiple loss functions:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Cross-entropy loss on the final prediction.&lt;/li&gt;
&lt;li&gt;KL divergence between the initial noise and standard normal.&lt;/li&gt;
&lt;li&gt;L2 loss between the block output and the label embedding (scaled by SNR change).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;They experiment with a few different versions, including using continuous time steps (NoProp-CT and NoProp-FM), instead of discrete blocks (NoProp-DT), similar to Flow Matching.&lt;/p&gt;
&lt;p&gt;They test on MNIST, CIFAR-10, and CIFAR-100. There's not much to improve upon those problems in 2025, but they get comparable or even slightly better results than traditional backprop while using about half the GPU memory.&lt;/p&gt;</content><category term="reference"/><category term="MachineLearning"/></entry><entry><title>Absolute Zero: Reinforced Self-play Reasoning with Zero Data</title><link href="http://localhost:8000/absolute-zero-reinforced-self-play-reasoning-with-zero-data.html" rel="alternate"/><published>2025-05-12T00:00:00+10:00</published><updated>2025-05-12T00:00:00+10:00</updated><author><name>Lex Toumbourou</name></author><id>tag:localhost,2025-05-12:/absolute-zero-reinforced-self-play-reasoning-with-zero-data.html</id><summary type="html">&lt;p&gt;learn to reason without any human-annotated data.&lt;/p&gt;</summary><content type="html">&lt;p&gt;This paper introduces the &lt;a href="absolute-zero-reasoner.html"&gt;Absolute Zero Reasoner&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The idea is to train a reasoning model (from a foundation Qwen-2.5-7B* model) without needing any human-annotated data. Previous &lt;a href="deepseek-r1-zero.html"&gt;DeepSeek-R1-Zero&lt;/a&gt; approach learned CoT reasoning just from input/output pairs, but this goes a step further and proposes the inputs and outputs to solve.&lt;/p&gt;
&lt;p&gt;&lt;img alt="absolute-zero-comparison.png" src="../../_media/absolute-zero-comparison.png"&gt;&lt;/p&gt;
&lt;p&gt;The proposing and solving steps both have relevant reward functions: they reward the model to propose examples that are the correct level of difficulty for it, and penalise wrong answers in the solving step.&lt;/p&gt;
&lt;p&gt;The tasks it proposes and solves are either:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;deduction&lt;/strong&gt; (prediction output, given program and input)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;abduction&lt;/strong&gt; (prediction input, given program and output)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;induction&lt;/strong&gt; (predict/synthesis program, given input and output)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img alt="propose-solve.png" src="../../_media/propose-solve.png"&gt;&lt;/p&gt;
&lt;p&gt;Of note, is that they also notice some potentially unsafe reasoning chains generated throughout the training, which they call an "uh-oh moment".&lt;/p&gt;
&lt;p&gt;&lt;img alt="uh-oh-moment.png" src="../../_media/uh-oh-moment.png"&gt;&lt;/p&gt;
&lt;p&gt;It's pretty wild that this works. In theory, we can improve reasoning capability of models by just training them longer with no additional data needed, although I'm a bit dubious about how far it can be pushed, given that the proposing step is still limited to the distribution of the foundation model's training data.&lt;/p&gt;
&lt;hr&gt;</content><category term="reference"/><category term="ReinforcementLearning"/><category term="ReasoningModels"/><category term="LargeLanguageModels"/></entry><entry><title>Playing Atari with Deep Reinforcement Learning</title><link href="http://localhost:8000/playing-atari-with-deep-reinforcement-learning.html" rel="alternate"/><published>2025-05-05T00:00:00+10:00</published><updated>2025-05-05T00:00:00+10:00</updated><author><name>Lex Toumbourou</name></author><id>tag:localhost,2025-05-05:/playing-atari-with-deep-reinforcement-learning.html</id><summary type="html">&lt;p&gt;a classic paper applying neural networks to RL for game playing&lt;/p&gt;</summary><content type="html">&lt;p&gt;&lt;em&gt;My summary (still a draft) of the paper &lt;a href="https://arxiv.org/abs/1312.5602"&gt;Playing Atari with Deep Reinforcement Learning&lt;/a&gt; by Volodymyr Mnih, Koray Kavukcuoglu, David Silver, Alex Graves, Ioannis Antonoglou, Daan Wierstra, Martin Riedmiller&lt;/em&gt;&lt;/p&gt;
&lt;h2 id="overview"&gt;Overview&lt;/h2&gt;
&lt;p&gt;In late 2013, DeepMind researchers published a Reinforcement Learning approach to playing Atari games with AI called &lt;a href="deep-q-networks.html"&gt;Deep Q-Network (DQN)&lt;/a&gt;. This was one of the first approaches to game playing could successfully "learn control policies" (i.e. play games), only from observing the raw pixels from the game, thanks to recent advanced in deep learning.&lt;/p&gt;
&lt;p&gt;&lt;img alt="atari-fig-1.png" src="../../_media/atari-fig-1.png"&gt;&lt;/p&gt;
&lt;p&gt;This paper was published about one month before Google announced it would acquire DeepMind in January 2014.&lt;/p&gt;
&lt;p&gt;In this article, I'm going to walk through the architecture they described in the paper, and attempt to implement it using &lt;a href="https://github.com/ml-explore/mlx"&gt;MLX&lt;/a&gt; (which is a library I've been meaning to play with).&lt;/p&gt;
&lt;h2 id="high-level"&gt;High-Level&lt;/h2&gt;
&lt;p&gt;The paper describes a &lt;a href="convolutional-neural-network.html"&gt;CNN&lt;/a&gt; architecture that inputs game frames as raw pixels, and outputs predicted future rewards (i.e. the game score) for each available action (i.e. move up, move left, etc).&lt;/p&gt;
&lt;p&gt;A naive approach to processing frames from the games could be to process a sequential batch of frames at each training step. However, these frames would be strongly correlated. Instead, they used a technique, from a 1993 attempt to train a robotic policy using neural networks, called &lt;a href="experience-replay.html"&gt;Experience Replay&lt;/a&gt;, which effectively stores a history of game states, their corresponding score (rewards) from action taken, and samples from this each training step.&lt;/p&gt;
&lt;p&gt;In practice, the agent plays randomly for a bit, gets the rewards throughout the game, and then uses a neural network to predict the rewards. As the model trains, the agent increasingly uses the model to take the optimal action, which balances exploiting and exploring.&lt;/p&gt;
&lt;p&gt;The paper was also made possible thanks to the &lt;a href="https://jair.org/index.php/jair/article/view/10819"&gt;The Arcade Learning Environment (ALE)&lt;/a&gt;, released a year prior, which provides an evaluation methodology and toolkit for testing RL agents in Atari games. They test 7 Atari 2600 games, outperforming all previous approaches, and human experts on three games.&lt;/p&gt;
&lt;h2 id="approach-detail"&gt;Approach Detail&lt;/h2&gt;
&lt;h3 id="architecture"&gt;Architecture&lt;/h3&gt;
&lt;p&gt;They describe the model as follows:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The input to the neural network consists of an 84 × 84 × 4 image produced by &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;ϕ&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;\phi&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.8888799999999999em;vertical-align:-0.19444em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;ϕ&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;. The first hidden layer convolves 16 8 × 8 filters with stride 4 with the input image and applies a rectifier nonlinearity. The second hidden layer convolves 32 4 × 4 filters with stride 2, again followed by a rectifier nonlinearity. The final hidden layer is fully connected and comprises 256 rectifier units. The output layer is a fully connected linear layer with a single output for each valid action. The number of valid actions varied between 4 and 18 in the games we considered.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;So that's two conv layers with &lt;a href="relu.html"&gt;ReLU&lt;/a&gt;, followed by two fully-connected layers. In an MLX model, that might look like this:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;mlx.core&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;as&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;mx&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;mlx.nn&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;as&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;nn&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nc"&gt;DQN&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;nn&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Module&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="fm"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;num_actions&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="nb"&gt;super&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="fm"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;conv1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;nn&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Conv2d&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;in_channels&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;out_channels&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;16&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;kernel_size&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;stride&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;conv2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;nn&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Conv2d&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;in_channels&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;16&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;out_channels&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;32&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;kernel_size&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;stride&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;fc1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;nn&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Linear&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2592&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;256&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# 9x9x32 = 2592&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;fc2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;nn&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Linear&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;256&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;num_actions&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="fm"&gt;__call__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="c1"&gt;# MLX expects height, width, channels, and needs float, not int, representations.&lt;/span&gt;
        &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;transpose&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mf"&gt;255.&lt;/span&gt;
        &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;nn&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;relu&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;conv1&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;    &lt;span class="c1"&gt;# (batch, 84, 84, 4) -&amp;gt; (batch, 20, 20, 16)&lt;/span&gt;
        &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;nn&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;relu&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;conv2&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;    &lt;span class="c1"&gt;# -&amp;gt; (batch, 9, 9, 32)&lt;/span&gt;
        &lt;span class="n"&gt;batch_size&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;shape&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
        &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;reshape&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;batch_size&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# -&amp;gt; (batch, 2592)&lt;/span&gt;
        &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;nn&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;relu&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;fc1&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;      &lt;span class="c1"&gt;# -&amp;gt; (batch, 256)&lt;/span&gt;
        &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;fc2&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;               &lt;span class="c1"&gt;# -&amp;gt; (batch, num_actions)&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;

&lt;span class="n"&gt;batch_size&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;32&lt;/span&gt;
&lt;span class="n"&gt;num_actions&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;
&lt;span class="n"&gt;frame_stack&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;
&lt;span class="nb"&gt;input&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;mx&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;random&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;normal&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;batch_size&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;frame_stack&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;84&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;84&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

&lt;span class="n"&gt;model&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;DQN&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;num_actions&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;output&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;input&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;output&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;shape&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# (32, 4)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h3 id="dataset"&gt;Dataset&lt;/h3&gt;
&lt;p&gt;The ALE provides an evaluation set built on top of the &lt;a href="https://stella-emu.github.io/"&gt;Stella&lt;/a&gt; an Atari emulator, and is maintained by the Farama Foundation. Farama also maintains the Gymnasium library, a handy toolkit for testing reinforcement learning agents.&lt;/p&gt;
&lt;p&gt;I'm going to load the Pacman game, which requires only a few lines of code:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;gymnasium&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;as&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;gym&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;ale_py&lt;/span&gt;

&lt;span class="n"&gt;env&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;gym&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;make&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;ALE/Pacman-v5&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;The environment that Gymnasium provides has a few different ways of interacting, but for this purpose, we can reset the game with the &lt;code&gt;reset()&lt;/code&gt; method, which gives us the state of the game and some info about the game.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;info&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;env&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;reset&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;shape&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;info&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;The state of the game is just a numpy image, which we can take a look at:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;matplotlib&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;pyplot&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;plt&lt;/span&gt;

&lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Pacman State&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;axis&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;off&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;imsave&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;PUBLIC_MEDIA_DIR&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;pacman_state_1.png&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;&lt;img alt="Pacman state at the state of the game" src="../../_media/pacman_state_1.png"&gt;&lt;/p&gt;
&lt;p&gt;We can take an action in the game, by passing one of the actions represented as an integer into &lt;code&gt;step(action: int)&lt;/code&gt;. Where 0 is noopt, and 1, 2, 3, 4 is up, right, left, down, respectively.&lt;/p&gt;
&lt;p&gt;For example, if I go right for 100 frames, and print the game state, you can see we've moved to the right:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;reward&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;terminated&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;truncated&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;info&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;env&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;step&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Pacman State after moving to the right&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;axis&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;off&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;imsave&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;PUBLIC_MEDIA_DIR&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;pacman_state_2.png&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;&lt;img alt="Pacman state in ALE after moving right for 100 frames" src="../../_media/pacman_state_2.png"&gt;&lt;/p&gt;
&lt;p&gt;We can use the RecordVideo wrapper to record a video of the agent exploring the space with a random policy.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;gymnasium&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;as&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;gym&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;ale_py&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;random&lt;/span&gt;

&lt;span class="n"&gt;env&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;gym&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;wrappers&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;RecordVideo&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;gym&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;make&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;ALE/Pacman-v5&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;render_mode&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;rgb_array&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="n"&gt;video_folder&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;PUBLIC_MEDIA_DIR&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;pacman_ale&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;episode_trigger&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;lambda&lt;/span&gt; &lt;span class="n"&gt;episode_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;True&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;observation&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;info&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;env&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;reset&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="n"&gt;done&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;False&lt;/span&gt;
&lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;done&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;action&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;random&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;choice&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;env&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;action_space&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="n"&gt;observation&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;reward&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;terminated&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;truncated&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;info&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;env&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;step&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;action&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;done&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;terminated&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="n"&gt;truncated&lt;/span&gt;

&lt;span class="n"&gt;env&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;close&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;video controls loop&gt;&lt;source src="../../_media/pacman_ale/rl-video-episode-0.mp4" type="video/mp4"&gt;&lt;/video&gt;

&lt;h3 id="preprocessing"&gt;Preprocessing&lt;/h3&gt;
&lt;p&gt;The preprocessing from the paper converts the RGB representation into grayscale and puts four consecutive frames together, representing one game state. This exact processing is provided by the &lt;code&gt;AtariPreprocessing&lt;/code&gt; wrapper in Gymnasium:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;gymnasium.wrappers&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;as&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;wrappers&lt;/span&gt;

&lt;span class="n"&gt;env&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;gym&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;make&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;ALE/Pacman-v5&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;frameskip&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;env&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;wrappers&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AtariPreprocessing&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;env&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;obs&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;env&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;reset&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;imsave&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;PUBLIC_MEDIA_DIR&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;pacman_preprocessed.png&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;obs&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cmap&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;grey&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;&lt;img alt="Pacman after preprocessing" src="../../_media/pacman_preprocessed.png"&gt;&lt;/p&gt;
&lt;p&gt;Now we can stack the last N timesteps together, which is how a single observation is recognised.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;env&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;wrappers&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;FrameStackObservation&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;env&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;stack_size&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Which might look something like this:&lt;/p&gt;
&lt;p&gt;&lt;img alt="Environment observation" src="../../_media/pacman_frame_stack_3d_layered.png"&gt;&lt;/p&gt;
&lt;h3 id="epsilon-greedy-policy"&gt;Epsilon-greedy policy&lt;/h3&gt;
&lt;p&gt;A key component of Reinforcement Learning is the tradeoff between &lt;strong&gt;exploring&lt;/strong&gt; and &lt;strong&gt;exploiting&lt;/strong&gt;. The is, we need to ensure that the model takes enough random actions to examine the space adequately, but also follows the policy it is learning at times, so that it makes progress when going in the correct direction (see &lt;a href="exploration-exploitation-dilemma.html"&gt;Exploration-Exploitation Dilemma&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;They set an epislon parameter which slowly anneals (changes throughout training), starting at 1, always selecting random, and gradually going to 0.1, where only 10% of the time we are going random, the rest we are using the highest reward action, as predicted by the model so far.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The behavior policy during training was &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;ϵ&lt;/mi&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;mi&gt;g&lt;/mi&gt;&lt;mi&gt;r&lt;/mi&gt;&lt;mi&gt;e&lt;/mi&gt;&lt;mi&gt;e&lt;/mi&gt;&lt;mi&gt;d&lt;/mi&gt;&lt;mi&gt;y&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;\epsilon-greedy&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.66666em;vertical-align:-0.08333em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;ϵ&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;−&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.8888799999999999em;vertical-align:-0.19444em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.03588em;"&gt;g&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.02778em;"&gt;r&lt;/span&gt;&lt;span class="mord mathdefault"&gt;e&lt;/span&gt;&lt;span class="mord mathdefault"&gt;e&lt;/span&gt;&lt;span class="mord mathdefault"&gt;d&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.03588em;"&gt;y&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; with annealed linearly from 1 to 0.1 over the first million frames, and fixed at 0.1 thereafter.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;epsilon&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;1.0&lt;/span&gt;  &lt;span class="c1"&gt;# Epsilon greedy parameter&lt;/span&gt;
&lt;span class="n"&gt;epsilon_min&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;0.1&lt;/span&gt;  &lt;span class="c1"&gt;# Minimum epsilon greedy parameter&lt;/span&gt;
&lt;span class="n"&gt;epsilon_max&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;1.0&lt;/span&gt;  &lt;span class="c1"&gt;# Maximum epsilon greedy parameter&lt;/span&gt;
&lt;span class="n"&gt;epsilon_interval&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;epsilon_max&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;epsilon_min&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# Rate at which to reduce chance of random action being taken&lt;/span&gt;
&lt;span class="n"&gt;epsilon_greedy_frames&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;1000000.0&lt;/span&gt;


&lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;get_next_action&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;epsilon&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;epsilon&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;random&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;random&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
        &lt;span class="n"&gt;action&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;mx&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;random&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;randint&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;env&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;action_space&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;action&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;mx&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;argmax&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mx&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;expand_dims&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;action&lt;/span&gt;


&lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;anneal_epsilon&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;epsilon&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;epsilon&lt;/span&gt; &lt;span class="o"&gt;-=&lt;/span&gt; &lt;span class="n"&gt;epsilon_interval&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;epsilon_greedy_frames&lt;/span&gt;
    &lt;span class="n"&gt;epsilon&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;max&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;epsilon&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;epsilon_min&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;epsilon&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h3 id="experience-replay"&gt;Experience Replay&lt;/h3&gt;
&lt;p&gt;They utilise an idea from early RL and neural network experiments, all the way back from 1993, called &lt;strong&gt;Experience Replay Buffers&lt;/strong&gt;, where they store an agents experience's at each timestep, &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;msub&gt;&lt;mi&gt;e&lt;/mi&gt;&lt;mi&gt;t&lt;/mi&gt;&lt;/msub&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mo stretchy="false"&gt;(&lt;/mo&gt;&lt;msub&gt;&lt;mi&gt;s&lt;/mi&gt;&lt;mi&gt;t&lt;/mi&gt;&lt;/msub&gt;&lt;mo separator="true"&gt;,&lt;/mo&gt;&lt;msub&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mi&gt;t&lt;/mi&gt;&lt;/msub&gt;&lt;mo separator="true"&gt;,&lt;/mo&gt;&lt;msub&gt;&lt;mi&gt;r&lt;/mi&gt;&lt;mi&gt;t&lt;/mi&gt;&lt;/msub&gt;&lt;mo separator="true"&gt;,&lt;/mo&gt;&lt;msub&gt;&lt;mi&gt;s&lt;/mi&gt;&lt;mrow&gt;&lt;mi&gt;t&lt;/mi&gt;&lt;mo&gt;+&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/mrow&gt;&lt;/msub&gt;&lt;mo stretchy="false"&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;e_t = (s_t, a_t, r_t, s_{t+1})&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.58056em;vertical-align:-0.15em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;e&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.2805559999999999em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mathdefault mtight"&gt;t&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1em;vertical-align:-0.25em;"&gt;&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;s&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.2805559999999999em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mathdefault mtight"&gt;t&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mpunct"&gt;,&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;a&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.2805559999999999em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mathdefault mtight"&gt;t&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mpunct"&gt;,&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault" style="margin-right:0.02778em;"&gt;r&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.2805559999999999em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:-0.02778em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mathdefault mtight"&gt;t&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mpunct"&gt;,&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;s&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.301108em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathdefault mtight"&gt;t&lt;/span&gt;&lt;span class="mbin mtight"&gt;+&lt;/span&gt;&lt;span class="mord mtight"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.208331em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;we utilise a technique known as experience replay [13] where we store the agent's experiences at each timestep, &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;e&lt;/mi&gt;&lt;mi&gt;t&lt;/mi&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mo stretchy="false"&gt;(&lt;/mo&gt;&lt;mi&gt;s&lt;/mi&gt;&lt;mi&gt;t&lt;/mi&gt;&lt;mo separator="true"&gt;,&lt;/mo&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mi&gt;t&lt;/mi&gt;&lt;mo separator="true"&gt;,&lt;/mo&gt;&lt;mi&gt;r&lt;/mi&gt;&lt;mi&gt;t&lt;/mi&gt;&lt;mo separator="true"&gt;,&lt;/mo&gt;&lt;mi&gt;s&lt;/mi&gt;&lt;mi&gt;t&lt;/mi&gt;&lt;mo&gt;+&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;mo stretchy="false"&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;et = (st, at, rt, st+1)&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.61508em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;e&lt;/span&gt;&lt;span class="mord mathdefault"&gt;t&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1em;vertical-align:-0.25em;"&gt;&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord mathdefault"&gt;s&lt;/span&gt;&lt;span class="mord mathdefault"&gt;t&lt;/span&gt;&lt;span class="mpunct"&gt;,&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;a&lt;/span&gt;&lt;span class="mord mathdefault"&gt;t&lt;/span&gt;&lt;span class="mpunct"&gt;,&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.02778em;"&gt;r&lt;/span&gt;&lt;span class="mord mathdefault"&gt;t&lt;/span&gt;&lt;span class="mpunct"&gt;,&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;s&lt;/span&gt;&lt;span class="mord mathdefault"&gt;t&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;+&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1em;vertical-align:-0.25em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;1&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; in a dataset &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;D&lt;/mi&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mi&gt;e&lt;/mi&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;mo separator="true"&gt;,&lt;/mo&gt;&lt;mi mathvariant="normal"&gt;.&lt;/mi&gt;&lt;mi mathvariant="normal"&gt;.&lt;/mi&gt;&lt;mi mathvariant="normal"&gt;.&lt;/mi&gt;&lt;mo separator="true"&gt;,&lt;/mo&gt;&lt;mi&gt;e&lt;/mi&gt;&lt;mi&gt;N&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;D = e1, ..., eN&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.68333em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.02778em;"&gt;D&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.8777699999999999em;vertical-align:-0.19444em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;e&lt;/span&gt;&lt;span class="mord"&gt;1&lt;/span&gt;&lt;span class="mpunct"&gt;,&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;.&lt;/span&gt;&lt;span class="mord"&gt;.&lt;/span&gt;&lt;span class="mord"&gt;.&lt;/span&gt;&lt;span class="mpunct"&gt;,&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;e&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.10903em;"&gt;N&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;, pooled over many episodes into a replay memory. During the inner loop of the algorithm, we apply Q-learning updates, or minibatch updates, to samples of experience, &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;e&lt;/mi&gt;&lt;mo&gt;∼&lt;/mo&gt;&lt;mi&gt;D&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;e ∼ D&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.43056em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;e&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;∼&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.68333em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.02778em;"&gt;D&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;, drawn at random from the pool of stored samples.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;typing&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;List&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;collections&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;namedtuple&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;pydantic&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;BaseModel&lt;/span&gt;

&lt;span class="n"&gt;Experience&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;namedtuple&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Experience&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;state&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;action&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;reward&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;state_next&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;done&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nc"&gt;ReplayBuffer&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="sd"&gt;&amp;quot;&amp;quot;&amp;quot;Experience replay buffer to store and sample transitions.&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="fm"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;capacity&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;buffer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;deque&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;maxlen&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;capacity&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;experience&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Experience&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;buffer&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;experience&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;sample&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;batch_size&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;List&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Experience&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
        &lt;span class="n"&gt;batch&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;random&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sample&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;buffer&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;batch_size&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;states&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;mx&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;stack&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="n"&gt;exp&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;state&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;exp&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;batch&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
        &lt;span class="n"&gt;actions&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;mx&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;array&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="n"&gt;exp&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;action&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;exp&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;batch&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;dtype&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;mx&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;int32&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;rewards&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;mx&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;array&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="n"&gt;exp&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;reward&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;exp&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;batch&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;dtype&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;mx&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;float32&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;next_states&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;mx&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;stack&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="n"&gt;exp&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;next_state&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;exp&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;batch&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
        &lt;span class="n"&gt;dones&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;mx&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;array&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="nb"&gt;float&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;exp&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;done&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;exp&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;batch&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;dtype&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;mx&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;float32&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;batch&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;states&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;actions&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;reward&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;next_states&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;dones&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="fm"&gt;__len__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;buffer&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;We can go ahead and play it for a while, so we have a bit of a replay buffer:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;env&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;reset&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;32&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="c1"&gt;# Take action in environment&lt;/span&gt;
    &lt;span class="n"&gt;next_state&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;reward&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;terminated&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;truncated&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;env&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;step&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;action&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;next_state&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;preprocess_frame&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;next_state&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;done&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;terminated&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="n"&gt;truncated&lt;/span&gt;

    &lt;span class="c1"&gt;# Store experience in replay buffer&lt;/span&gt;
    &lt;span class="n"&gt;replay_buffer&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Experience&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;action&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;reward&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;next_state&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;done&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="n"&gt;state&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;next_state&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h4 id="train-one-step"&gt;Train one step&lt;/h4&gt;
&lt;p&gt;Assuming a replay buffer, a single train step is to sample from the replay buffer.&lt;/p&gt;
&lt;p&gt;Calculate the ground truth as the actual reward given the state, but here we also include rewards into the future, this is liekly the trickiest part to wrap your head around.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;get_targets&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;next_states&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="c1"&gt;# Compute target Q values&lt;/span&gt;
    &lt;span class="n"&gt;next_q_values&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;target_model&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;next_states&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;max_next_q&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;mx&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;max&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;next_q_values&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;axis&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;targets&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;rewards&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;gamma&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;max_next_q&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;dones&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;targets&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;An interesting point to note here is that we use a target network. The papers mention that:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The parameters from the previous iteration θi−1 are held fixed when optimising the loss function Li (θi)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Basically, keeping a separate copy of the weights it prevents the "moving target" problem where Q-value updates chase a constantly shifting target, which can lead to oscillations or divergence in training. By keeping the target network fixed for many steps, the optimization becomes more stable, similar to how freezing parts of a network helps in transfer learning.&lt;/p&gt;
&lt;p&gt;The loss is &lt;a href="huber-loss.html"&gt;Huber Loss&lt;/a&gt; between the actual rewards, discounted into the future, and the predicted discounted rewards. Huber Loss is specifically chosen over Mean Squared Error (MSE) because it's less sensitive to outlier rewards that can occur in games with large, sparse reward signals. For small errors, Huber Loss behaves like MSE, providing strong gradients, but for large errors, it behaves like Mean Absolute Error, reducing the impact of extreme values that might destabilize training.&lt;/p&gt;
&lt;p&gt;Since only one action is taken in each experience step, we mask out the loss for the other actions.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;compute_loss&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;states&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;actions&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;targets&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="c1"&gt;# Forward pass to get Q-values&lt;/span&gt;
    &lt;span class="n"&gt;q_values&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;states&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="c1"&gt;# Select the Q-values for the actions taken&lt;/span&gt;
    &lt;span class="n"&gt;masks&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;mx&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;eye&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;num_actions&lt;/span&gt;&lt;span class="p"&gt;)[&lt;/span&gt;&lt;span class="n"&gt;actions&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="n"&gt;q_action&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;mx&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;q_values&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;masks&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;axis&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="c1"&gt;# Compute Huber loss&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;nn&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;losses&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;huber_loss&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;q_action&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;targets&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;reduction&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;mean&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;


&lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;loss_and_grad&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;model_params&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;states&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;actions&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;targets&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;update&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;model_params&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;loss&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;compute_loss&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;states&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;actions&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;targets&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;loss&lt;/span&gt;

&lt;span class="n"&gt;grad_fn&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;mx&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;grad&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;loss_and_grad&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;This idea is based on the &lt;a href="bellman-equation.html"&gt;Bellman Equation&lt;/a&gt;, but it is essentially trying to find a policy that always takes the correct answer to maximise rewards but considers rewards given in the future to be less important than immediate rewards.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;train_one_step&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="c1"&gt;# Sample batch from replay buffer&lt;/span&gt;
    &lt;span class="n"&gt;states&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;actions&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;rewards&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;next_states&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;dones&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;replay_buffer&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sample&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;batch_size&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="c1"&gt;# Compute target Q values&lt;/span&gt;
    &lt;span class="n"&gt;next_q_values&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;target_model&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;next_states&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;max_next_q&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;mx&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;max&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;next_q_values&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;axis&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;targets&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;rewards&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;gamma&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;max_next_q&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;dones&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;params&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;trainable_parameters&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

    &lt;span class="c1"&gt;# Compute gradients&lt;/span&gt;
    &lt;span class="n"&gt;grads&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;grad_fn&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;states&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;actions&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;targets&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="c1"&gt;# Update parameters&lt;/span&gt;
    &lt;span class="n"&gt;optimizer&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;update&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;grads&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h3 id="metrics"&gt;Metrics&lt;/h3&gt;
&lt;p&gt;By plotting the average total reward during training, the loss appears to be unstable, but instead plotting the average predicted max Q-value over a fixed batch of states shows an increase in the amount of future reward expected, increasing steadily.&lt;/p&gt;
&lt;h3 id="training-loop"&gt;Training Loop&lt;/h3&gt;
&lt;p&gt;Here is the full training loop.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;train_dqn&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;num_episodes&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;10000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;max_steps_per_episode&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;10000&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="c1"&gt;# Initialize metrics tracking&lt;/span&gt;
    &lt;span class="n"&gt;rewards_history&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
    &lt;span class="n"&gt;loss_history&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
    &lt;span class="n"&gt;q_values_history&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;

    &lt;span class="c1"&gt;# Main training loop&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;episode&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;num_episodes&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;env&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;reset&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="n"&gt;episode_reward&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
        &lt;span class="n"&gt;episode_loss&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;

        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;step&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;max_steps_per_episode&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
            &lt;span class="c1"&gt;# Get action based on epsilon-greedy policy&lt;/span&gt;
            &lt;span class="n"&gt;epsilon&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;anneal_epsilon&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;epsilon&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="n"&gt;action&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;get_next_action&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;epsilon&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

            &lt;span class="c1"&gt;# Take action in environment&lt;/span&gt;
            &lt;span class="n"&gt;next_state&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;reward&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;terminated&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;truncated&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;env&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;step&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;action&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="n"&gt;done&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;terminated&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="n"&gt;truncated&lt;/span&gt;
            &lt;span class="n"&gt;episode_reward&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="n"&gt;reward&lt;/span&gt;

            &lt;span class="c1"&gt;# Store experience in replay buffer&lt;/span&gt;
            &lt;span class="n"&gt;replay_buffer&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Experience&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;action&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;reward&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;next_state&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;done&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
            &lt;span class="n"&gt;state&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;next_state&lt;/span&gt;

            &lt;span class="c1"&gt;# Only train once we have enough samples&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;replay_buffer&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="n"&gt;batch_size&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="n"&gt;loss&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;train_one_step&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
                &lt;span class="n"&gt;episode_loss&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;loss&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

            &lt;span class="c1"&gt;# Update target network periodically&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;step&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="n"&gt;target_update_freq&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="n"&gt;target_model&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;update&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;parameters&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;

            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;done&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="k"&gt;break&lt;/span&gt;

        &lt;span class="c1"&gt;# Record metrics&lt;/span&gt;
        &lt;span class="n"&gt;rewards_history&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;episode_reward&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;episode_loss&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;loss_history&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;episode_loss&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;episode_loss&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

        &lt;span class="c1"&gt;# Track average Q-values on fixed set of states&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;episode&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;q_values&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;mx&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;mean&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mx&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;max&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;evaluation_states&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;axis&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
            &lt;span class="n"&gt;q_values_history&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;q_values&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;

            &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Episode &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;episode&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;, Reward: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;episode_reward&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;, &amp;quot;&lt;/span&gt;
                  &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Loss: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;loss_history&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;episode_loss&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;N/A&amp;#39;&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;, &amp;quot;&lt;/span&gt;
                  &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Avg Q-value: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;q_values&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;, Epsilon: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;epsilon&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;rewards_history&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;loss_history&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;q_values_history&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;I'm running into some memories issues with MLX, so haven't managed to fully reproduce the paper yet. You can checkout the entire code base &lt;a href="https://github.com/lextoumbourou/deep-q-network-mlx"&gt;here&lt;/a&gt;.&lt;/p&gt;</content><category term="reference"/><category term="ReinforcementLearning"/><category term="GamePlayingAI"/></entry><entry><title>Q-Learning</title><link href="http://localhost:8000/q-learning.html" rel="alternate"/><published>2025-04-18T00:00:00+10:00</published><updated>2025-04-21T00:00:00+10:00</updated><author><name>Lex Toumbourou</name></author><id>tag:localhost,2025-04-18:/q-learning.html</id><summary type="html">&lt;p&gt;a reinforcement learning algorithm for finding optimal policies&lt;/p&gt;</summary><content type="html">&lt;p&gt;This article is part of my (WIP) series on &lt;a href="reinforcement-learning.html"&gt;Reinforcement Learning (RL)&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Q-Learning&lt;/strong&gt; is a reinforcement learning algorithm for finding optimal policies in &lt;a href="markov-decision-process.html"&gt;Markov Decision Process (MDP)&lt;/a&gt;. Unlike supervised learning, where we learn from labelled examples, Q-learning learns from interaction with an environment. It can learn the value of actions without requiring a model of the environment (i.e. learning via trial-and-error), hence, it is considered a "model-free" method.&lt;/p&gt;
&lt;p&gt;The algorithm was introduced by Chris Watkins in his 1989 PhD thesis at King's College &lt;sup id="fnref:1"&gt;&lt;a class="footnote-ref" href="#fn:1"&gt;1&lt;/a&gt;&lt;/sup&gt;, with a convergence proof later published by Watkins alongside Peter Dayan &lt;sup id="fnref:2"&gt;&lt;a class="footnote-ref" href="#fn:2"&gt;2&lt;/a&gt;&lt;/sup&gt;. The concept was also developed independently by several others in the early 90s.&lt;/p&gt;
&lt;h2 id="how-it-works"&gt;How It Works&lt;/h2&gt;
&lt;p&gt;Q-Learning is an &lt;strong&gt;iterative optimisation algorithm&lt;/strong&gt;, similar to &lt;a href="gradient-descent.html"&gt;Gradient Descent&lt;/a&gt; in supervised learning. While gradient descent updates model parameters to minimise a loss function, Q-Learning refines value estimates based on environmental interaction. It utilises the &lt;strong&gt;Bellman Equation&lt;/strong&gt; to update its predictions iteratively.&lt;/p&gt;
&lt;p&gt;At the core is a lookup table called a &lt;strong&gt;Q-Table&lt;/strong&gt;, which maps state-action pairs to expected future rewards. The values in the &lt;strong&gt;Q-Table&lt;/strong&gt; are called &lt;strong&gt;Q-Values&lt;/strong&gt;. Conceptually, a Q-value &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;Q&lt;/mi&gt;&lt;mo stretchy="false"&gt;(&lt;/mo&gt;&lt;mi&gt;s&lt;/mi&gt;&lt;mo separator="true"&gt;,&lt;/mo&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mo stretchy="false"&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;Q(s,a)&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1em;vertical-align:-0.25em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;Q&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord mathdefault"&gt;s&lt;/span&gt;&lt;span class="mpunct"&gt;,&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;a&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; represents "how good" it is to take action a when in state s.&lt;/p&gt;
&lt;p&gt;Rewards are discounted over time, meaning immediate rewards are valued more than distant ones – like how businesses value present cash flow over future earnings.&lt;/p&gt;
&lt;p&gt;The algorithm uses three key hyper-parameters:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Learning Rate&lt;/strong&gt; &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;α&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;\alpha&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.43056em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.0037em;"&gt;α&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; (0 to 1) – how quickly the algorithm updates its estimates. Higher values mean faster learning but potentially unstable convergence.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Discount Factor&lt;/strong&gt; &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;γ&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;\gamma&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.625em;vertical-align:-0.19444em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.05556em;"&gt;γ&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; (0 to 1) – how much it values future rewards versus immediate ones. Higher values mean the agent is more forward-thinking.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Exploration Rate&lt;/strong&gt; &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;ϵ&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;\epsilon&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.43056em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;ϵ&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; (0 to 1) – how often it chooses a random action over the current best action. This parameter is typically decreased over time as the agent learns.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;ϵ&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;\epsilon&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.43056em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;ϵ&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; parameter balances the trade-off between &lt;strong&gt;exploration and exploitation&lt;/strong&gt;, managing how much the agent tries new things versus sticking to what it already thinks is best. See also the &lt;a href="exploration-exploitation-dilemma.html"&gt;Exploration-Exploitation Dilemma&lt;/a&gt; in A/B testing.&lt;/p&gt;
&lt;h2 id="q-learning-in-practice-taxi"&gt;Q-Learning in Practice: Taxi&lt;/h2&gt;
&lt;p&gt;We'll use the &lt;code&gt;Taxi-v3&lt;/code&gt; environment from the &lt;code&gt;gymnasium&lt;/code&gt; library (formerly OpenAI Gym). In this environment, the agent (a taxi) must navigate a grid to pick up and drop off passengers at the right location.&lt;/p&gt;
&lt;h3 id="setup-code"&gt;Setup Code&lt;/h3&gt;
&lt;p&gt;You can install Gymnasium with the toy-text dependencies:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;pip&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;gymnasium[toy-text]&amp;quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Then run this code in a Python script:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;gymnasium&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;as&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;gym&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;numpy&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;as&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;np&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;gymnasium.wrappers&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;RecordVideo&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;pathlib&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Path&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;tqdm&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;tqdm&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;matplotlib.pyplot&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;as&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;plt&lt;/span&gt;

&lt;span class="c1"&gt;# Q-learning hyperparameters&lt;/span&gt;
&lt;span class="n"&gt;alpha&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;0.1&lt;/span&gt;      &lt;span class="c1"&gt;# Learning rate&lt;/span&gt;
&lt;span class="n"&gt;gamma&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;0.99&lt;/span&gt;     &lt;span class="c1"&gt;# Discount factor&lt;/span&gt;
&lt;span class="n"&gt;epsilon&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;0.1&lt;/span&gt;    &lt;span class="c1"&gt;# Exploration rate (probability of random action)&lt;/span&gt;

&lt;span class="c1"&gt;# An episode is a start-to-finish exploration of the state space,&lt;/span&gt;
&lt;span class="c1"&gt;# where the finish reaches a goal or a hazard.&lt;/span&gt;
&lt;span class="n"&gt;episodes&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;10_000&lt;/span&gt;

&lt;span class="c1"&gt;# Create the Taxi environment&lt;/span&gt;
&lt;span class="n"&gt;env&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;gym&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;make&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Taxi-v3&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;render_mode&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;human&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Initialize Q-table with zeros&lt;/span&gt;
&lt;span class="n"&gt;n_states&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;n_actions&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;env&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;observation_space&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;env&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;action_space&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;
&lt;span class="n"&gt;Q&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;zeros&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;n_states&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;n_actions&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

&lt;span class="c1"&gt;# Training loop&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;ep&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;tqdm&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;episodes&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;desc&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Training episodes&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;env&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;reset&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;done&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;False&lt;/span&gt;
    &lt;span class="n"&gt;total_reward&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;

    &lt;span class="c1"&gt;# Episode loop&lt;/span&gt;
    &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;done&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="c1"&gt;# Epsilon-greedy action selection&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;random&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;random&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;epsilon&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="c1"&gt;# Explore: random action&lt;/span&gt;
            &lt;span class="n"&gt;action&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;env&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;action_space&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sample&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="c1"&gt;# Exploit: best known action&lt;/span&gt;
            &lt;span class="n"&gt;action&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;argmax&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Q&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;

        &lt;span class="c1"&gt;# Take action and observe new state and reward&lt;/span&gt;
        &lt;span class="n"&gt;next_state&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;reward&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;terminated&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;truncated&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;env&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;step&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;action&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;done&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;terminated&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="n"&gt;truncated&lt;/span&gt;
        &lt;span class="n"&gt;total_reward&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="n"&gt;reward&lt;/span&gt;

        &lt;span class="c1"&gt;# Q-learning update using Bellman Equation&lt;/span&gt;
        &lt;span class="c1"&gt;# The temporal difference (TD) error represents how surprised we are by the outcome&lt;/span&gt;
        &lt;span class="n"&gt;td_error&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;reward&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;gamma&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;max&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Q&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;next_state&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;Q&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;action&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
        &lt;span class="n"&gt;Q&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;action&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="n"&gt;alpha&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;td_error&lt;/span&gt;

        &lt;span class="c1"&gt;# Move to next state&lt;/span&gt;
        &lt;span class="n"&gt;state&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;next_state&lt;/span&gt;

&lt;span class="n"&gt;env&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;close&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;The code above will show a visual representation of the agent exploring and slowly updating its policy. Early episodes often show random-looking behaviour:&lt;/p&gt;
&lt;video controls loop&gt;&lt;source src="../_media/taxi_q_learning-episode-0.mp4" type="video/mp4"&gt;&lt;/video&gt;

&lt;p&gt;After training is completed, the final episodes demonstrate much more efficient behaviour:&lt;/p&gt;
&lt;video controls loop&gt;&lt;source src="../_media/taxi_q_learning-episode-9999.mp4" type="video/mp4"&gt;&lt;/video&gt;

&lt;p&gt;As you can see, the taxi can pick the passengers up and drop them off at the destination directly.&lt;/p&gt;
&lt;h3 id="testing-the-trained-policy"&gt;Testing the Trained Policy&lt;/h3&gt;
&lt;p&gt;With a trained policy, we can use &lt;code&gt;argmax&lt;/code&gt; to pick the highest reward action at every step, effectively using the policy without any more exploration:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="c1"&gt;# Test the learned policy&lt;/span&gt;
&lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;env&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;reset&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;env&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;render&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;done&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;False&lt;/span&gt;
&lt;span class="n"&gt;total_reward&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;

&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Testing trained policy...&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;done&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="c1"&gt;# Always choose the best action according to Q-table&lt;/span&gt;
    &lt;span class="n"&gt;action&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;argmax&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Q&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
    &lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;reward&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;terminated&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;truncated&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;env&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;step&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;action&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;total_reward&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="n"&gt;reward&lt;/span&gt;
    &lt;span class="n"&gt;done&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;terminated&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="n"&gt;truncated&lt;/span&gt;
    &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Step reward: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;reward&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;, Total reward: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;total_reward&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;env&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;render&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;

&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Final score: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;total_reward&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2 id="q-learning-update-rule-the-math-behind-it"&gt;Q-Learning Update Rule: The Math Behind It&lt;/h2&gt;
&lt;p&gt;The core of the Q-Learning algorithm is its update rule, which is derived from the &lt;a href="bellman-equation.html"&gt;Bellman Equation&lt;/a&gt;. Let's break it down step by step:&lt;/p&gt;
&lt;p&gt;&lt;span class="katex-display"&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;Q&lt;/mi&gt;&lt;mo stretchy="false"&gt;(&lt;/mo&gt;&lt;mi&gt;s&lt;/mi&gt;&lt;mo separator="true"&gt;,&lt;/mo&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mo stretchy="false"&gt;)&lt;/mo&gt;&lt;mo&gt;←&lt;/mo&gt;&lt;mi&gt;Q&lt;/mi&gt;&lt;mo stretchy="false"&gt;(&lt;/mo&gt;&lt;mi&gt;s&lt;/mi&gt;&lt;mo separator="true"&gt;,&lt;/mo&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mo stretchy="false"&gt;)&lt;/mo&gt;&lt;mo&gt;+&lt;/mo&gt;&lt;mi&gt;α&lt;/mi&gt;&lt;mo fence="false"&gt;[&lt;/mo&gt;&lt;mi&gt;r&lt;/mi&gt;&lt;mo&gt;+&lt;/mo&gt;&lt;mi&gt;γ&lt;/mi&gt;&lt;munder&gt;&lt;mo&gt;&lt;mi&gt;max&lt;/mi&gt;&lt;mo&gt;⁡&lt;/mo&gt;&lt;/mo&gt;&lt;msup&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mo lspace="0em" mathvariant="normal" rspace="0em"&gt;′&lt;/mo&gt;&lt;/msup&gt;&lt;/munder&gt;&lt;mi&gt;Q&lt;/mi&gt;&lt;mo stretchy="false"&gt;(&lt;/mo&gt;&lt;msup&gt;&lt;mi&gt;s&lt;/mi&gt;&lt;mo lspace="0em" mathvariant="normal" rspace="0em"&gt;′&lt;/mo&gt;&lt;/msup&gt;&lt;mo separator="true"&gt;,&lt;/mo&gt;&lt;msup&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mo lspace="0em" mathvariant="normal" rspace="0em"&gt;′&lt;/mo&gt;&lt;/msup&gt;&lt;mo stretchy="false"&gt;)&lt;/mo&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;mi&gt;Q&lt;/mi&gt;&lt;mo stretchy="false"&gt;(&lt;/mo&gt;&lt;mi&gt;s&lt;/mi&gt;&lt;mo separator="true"&gt;,&lt;/mo&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mo stretchy="false"&gt;)&lt;/mo&gt;&lt;mo fence="false"&gt;]&lt;/mo&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;
Q(s,a) \leftarrow Q(s,a) + \alpha \Big[ r + \gamma \max_{a'} Q(s', a') - Q(s,a) \Big]
&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1em;vertical-align:-0.25em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;Q&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord mathdefault"&gt;s&lt;/span&gt;&lt;span class="mpunct"&gt;,&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;a&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;←&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1em;vertical-align:-0.25em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;Q&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord mathdefault"&gt;s&lt;/span&gt;&lt;span class="mpunct"&gt;,&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;a&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;+&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1.80002em;vertical-align:-0.65002em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.0037em;"&gt;α&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="delimsizing size2"&gt;[&lt;/span&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.02778em;"&gt;r&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;+&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1.5458720000000001em;vertical-align:-0.7439800000000001em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.05556em;"&gt;γ&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mop op-limits"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.43055999999999983em;"&gt;&lt;span style="top:-2.35602em;margin-left:0em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathdefault mtight"&gt;a&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.6828285714285715em;"&gt;&lt;span style="top:-2.786em;margin-right:0.07142857142857144em;"&gt;&lt;span class="pstrut" style="height:2.5em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size3 size1 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mtight"&gt;′&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-3em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="mop"&gt;max&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.7439800000000001em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;Q&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;s&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.801892em;"&gt;&lt;span style="top:-3.113em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mtight"&gt;′&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mpunct"&gt;,&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;a&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.801892em;"&gt;&lt;span style="top:-3.113em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mtight"&gt;′&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;−&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1.80002em;vertical-align:-0.65002em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;Q&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord mathdefault"&gt;s&lt;/span&gt;&lt;span class="mpunct"&gt;,&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;a&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="delimsizing size2"&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Where:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;Q&lt;/mi&gt;&lt;mo stretchy="false"&gt;(&lt;/mo&gt;&lt;mi&gt;s&lt;/mi&gt;&lt;mo separator="true"&gt;,&lt;/mo&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mo stretchy="false"&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;Q(s,a)&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1em;vertical-align:-0.25em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;Q&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord mathdefault"&gt;s&lt;/span&gt;&lt;span class="mpunct"&gt;,&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;a&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;: Current estimate of value for taking action &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;a&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.43056em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;a&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; in state &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;s&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;s&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.43056em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;s&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;α&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;\alpha&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.43056em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.0037em;"&gt;α&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;: Learning rate (how quickly we update our estimates)&lt;/li&gt;
&lt;li&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;r&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;r&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.43056em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.02778em;"&gt;r&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;: Immediate reward received after taking the action&lt;/li&gt;
&lt;li&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;γ&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;\gamma&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.625em;vertical-align:-0.19444em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.05556em;"&gt;γ&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;: Discount factor (importance of future rewards)&lt;/li&gt;
&lt;li&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;msup&gt;&lt;mi&gt;s&lt;/mi&gt;&lt;mo lspace="0em" mathvariant="normal" rspace="0em"&gt;′&lt;/mo&gt;&lt;/msup&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;s'&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.751892em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;s&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.751892em;"&gt;&lt;span style="top:-3.063em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mtight"&gt;′&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;: The next state we arrive at&lt;/li&gt;
&lt;li&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;msub&gt;&lt;mo&gt;&lt;mi&gt;max&lt;/mi&gt;&lt;mo&gt;⁡&lt;/mo&gt;&lt;/mo&gt;&lt;msup&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mo lspace="0em" mathvariant="normal" rspace="0em"&gt;′&lt;/mo&gt;&lt;/msup&gt;&lt;/msub&gt;&lt;mi&gt;Q&lt;/mi&gt;&lt;mo stretchy="false"&gt;(&lt;/mo&gt;&lt;msup&gt;&lt;mi&gt;s&lt;/mi&gt;&lt;mo lspace="0em" mathvariant="normal" rspace="0em"&gt;′&lt;/mo&gt;&lt;/msup&gt;&lt;mo separator="true"&gt;,&lt;/mo&gt;&lt;msup&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mo lspace="0em" mathvariant="normal" rspace="0em"&gt;′&lt;/mo&gt;&lt;/msup&gt;&lt;mo stretchy="false"&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;\max_{a'} Q(s', a')&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1.001892em;vertical-align:-0.25em;"&gt;&lt;/span&gt;&lt;span class="mop"&gt;&lt;span class="mop"&gt;max&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.32797999999999994em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathdefault mtight"&gt;a&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.6828285714285715em;"&gt;&lt;span style="top:-2.786em;margin-right:0.07142857142857144em;"&gt;&lt;span class="pstrut" style="height:2.5em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size3 size1 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mtight"&gt;′&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;Q&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;s&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.751892em;"&gt;&lt;span style="top:-3.063em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mtight"&gt;′&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mpunct"&gt;,&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;a&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.751892em;"&gt;&lt;span style="top:-3.063em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mtight"&gt;′&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;: Value of the best possible action in the next state&lt;/li&gt;
&lt;li&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mo fence="false"&gt;[&lt;/mo&gt;&lt;mi&gt;r&lt;/mi&gt;&lt;mo&gt;+&lt;/mo&gt;&lt;mi&gt;γ&lt;/mi&gt;&lt;msub&gt;&lt;mo&gt;&lt;mi&gt;max&lt;/mi&gt;&lt;mo&gt;⁡&lt;/mo&gt;&lt;/mo&gt;&lt;msup&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mo lspace="0em" mathvariant="normal" rspace="0em"&gt;′&lt;/mo&gt;&lt;/msup&gt;&lt;/msub&gt;&lt;mi&gt;Q&lt;/mi&gt;&lt;mo stretchy="false"&gt;(&lt;/mo&gt;&lt;msup&gt;&lt;mi&gt;s&lt;/mi&gt;&lt;mo lspace="0em" mathvariant="normal" rspace="0em"&gt;′&lt;/mo&gt;&lt;/msup&gt;&lt;mo separator="true"&gt;,&lt;/mo&gt;&lt;msup&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mo lspace="0em" mathvariant="normal" rspace="0em"&gt;′&lt;/mo&gt;&lt;/msup&gt;&lt;mo stretchy="false"&gt;)&lt;/mo&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;mi&gt;Q&lt;/mi&gt;&lt;mo stretchy="false"&gt;(&lt;/mo&gt;&lt;mi&gt;s&lt;/mi&gt;&lt;mo separator="true"&gt;,&lt;/mo&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mo stretchy="false"&gt;)&lt;/mo&gt;&lt;mo fence="false"&gt;]&lt;/mo&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;\Big[ r + \gamma \max_{a'} Q(s', a') - Q(s,a) \Big]&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1.80002em;vertical-align:-0.65002em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="delimsizing size2"&gt;[&lt;/span&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.02778em;"&gt;r&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;+&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1.001892em;vertical-align:-0.25em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.05556em;"&gt;γ&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mop"&gt;&lt;span class="mop"&gt;max&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.32797999999999994em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathdefault mtight"&gt;a&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.6828285714285715em;"&gt;&lt;span style="top:-2.786em;margin-right:0.07142857142857144em;"&gt;&lt;span class="pstrut" style="height:2.5em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size3 size1 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mtight"&gt;′&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;Q&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;s&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.751892em;"&gt;&lt;span style="top:-3.063em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mtight"&gt;′&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mpunct"&gt;,&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;a&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.751892em;"&gt;&lt;span style="top:-3.063em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mtight"&gt;′&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;−&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1.80002em;vertical-align:-0.65002em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;Q&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord mathdefault"&gt;s&lt;/span&gt;&lt;span class="mpunct"&gt;,&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;a&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="delimsizing size2"&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;: The temporal difference (TD) error&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In simpler terms:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;We take our current estimate &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;Q&lt;/mi&gt;&lt;mo stretchy="false"&gt;(&lt;/mo&gt;&lt;mi&gt;s&lt;/mi&gt;&lt;mo separator="true"&gt;,&lt;/mo&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mo stretchy="false"&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;Q(s,a)&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1em;vertical-align:-0.25em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;Q&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord mathdefault"&gt;s&lt;/span&gt;&lt;span class="mpunct"&gt;,&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;a&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;Calculate the TD error (difference between ideal and current estimate)&lt;/li&gt;
&lt;li&gt;Update our estimate by moving it slightly (by &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;α&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;\alpha&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.43056em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.0037em;"&gt;α&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;) toward the ideal&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="deep-q-learning"&gt;Deep Q-Learning&lt;/h2&gt;
&lt;p&gt;For complex environments with large state spaces, maintaining a Q-table becomes impractical or impossible. For example, in Atari games, where the state is a raw pixel image, there are millions of possible states.&lt;/p&gt;
&lt;p&gt;In 2013, DeepMind published a landmark paper where they replaced the Q-table with a &lt;a href="neural-network.html"&gt;Neural Network&lt;/a&gt; to approximate the Q-values - a technique known as &lt;a href="deep-q-learning.html"&gt;Deep-Q Learning&lt;/a&gt; or DQN &lt;sup id="fnref:3"&gt;&lt;a class="footnote-ref" href="#fn:3"&gt;3&lt;/a&gt;&lt;/sup&gt;.&lt;/p&gt;
&lt;p&gt;The neural network inputs the state and outputs Q-values for all possible actions, which allows the algorithm to generalise across similar states and handle continuous state spaces.&lt;/p&gt;
&lt;p&gt;See the &lt;a href="deep-q-learning.html"&gt;Deep-Q Learning&lt;/a&gt; article for more.&lt;/p&gt;
&lt;h2 id="summary"&gt;Summary&lt;/h2&gt;
&lt;p&gt;Q-learning provides a fundamental approach to reinforcement learning by learning state-action values through interaction with an environment. Its simplicity and effectiveness make it a cornerstone algorithm in the field, while extensions like Deep Q-Learning enable its application to complex real-world problems.&lt;/p&gt;
&lt;div class="footnote"&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id="fn:1"&gt;
&lt;p&gt;Watkins, C. J. C. H. (1989). &lt;em&gt;Learning from delayed rewards&lt;/em&gt; (Doctoral dissertation). King's College, Cambridge.&amp;#160;&lt;a class="footnote-backref" href="#fnref:1" title="Jump back to footnote 1 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:2"&gt;
&lt;p&gt;Watkins, C. J. C. H., &amp;amp; Dayan, P. (1992). Q-learning. &lt;em&gt;Machine Learning, 8&lt;/em&gt;(3-4), 279–292. https://doi.org/10.1007/BF00992698&amp;#160;&lt;a class="footnote-backref" href="#fnref:2" title="Jump back to footnote 2 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:3"&gt;
&lt;p&gt;Mnih, V., Kavukcuoglu, K., Silver, D., Graves, A., Antonoglou, I., Wierstra, D., &amp;amp; Riedmiller, M. (2013). Playing Atari with deep reinforcement learning. &lt;em&gt;arXiv preprint arXiv:1312.5602&lt;/em&gt;. https://arxiv.org/abs/1312.5602&amp;#160;&lt;a class="footnote-backref" href="#fnref:3" title="Jump back to footnote 3 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</content><category term="permanent"/><category term="ReinforcementLearning"/></entry><entry><title>Markov Decision Process (MDP)</title><link href="http://localhost:8000/markov-decision-process-mdp.html" rel="alternate"/><published>2025-03-29T00:00:00+10:00</published><updated>2025-03-29T00:00:00+10:00</updated><author><name>Lex Toumbourou</name></author><id>tag:localhost,2025-03-29:/markov-decision-process-mdp.html</id><summary type="html">&lt;p&gt;A mathematical framework for modelling decision-making under uncertainty&lt;/p&gt;</summary><content type="html">&lt;p&gt;A &lt;strong&gt;Markov Decision Process (MDP)&lt;/strong&gt; is a mathematical framework for modelling decision-making problems where outcomes are partly random and partly controlled by a decision-maker. The goal is to find an optimal policy that maximizes cumulative reward over time.&lt;/p&gt;
&lt;p&gt;The Frozen Lake environment in the &lt;a href="https://gymnasium.farama.org/"&gt;gymnasium&lt;/a&gt; library provides an excellent visualization of an MDP. In this environment, an agent navigates a frozen lake with slippery surfaces, where taking an action (like moving left) doesn't guarantee the intended movement due to environmental uncertainty.&lt;/p&gt;
&lt;p&gt;MDPs form the theoretical foundation for many &lt;a href="reinforcement-learning.html"&gt;Reinforcement Learning (RL)&lt;/a&gt; algorithms, enabling theoretical understanding and practical implementation of RL solutions.&lt;/p&gt;
&lt;h2 id="core-components"&gt;Core Components&lt;/h2&gt;
&lt;p&gt;MDPs assume the &lt;a href="markov-property.html"&gt;Markov Property&lt;/a&gt;, which states that future states depend only on the current state and action, not on the history:&lt;/p&gt;
&lt;p&gt;&lt;span class="katex-display"&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;P&lt;/mi&gt;&lt;mo stretchy="false"&gt;(&lt;/mo&gt;&lt;msub&gt;&lt;mi&gt;s&lt;/mi&gt;&lt;mrow&gt;&lt;mi&gt;t&lt;/mi&gt;&lt;mo&gt;+&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/mrow&gt;&lt;/msub&gt;&lt;mo&gt;∣&lt;/mo&gt;&lt;msub&gt;&lt;mi&gt;s&lt;/mi&gt;&lt;mi&gt;t&lt;/mi&gt;&lt;/msub&gt;&lt;mo separator="true"&gt;,&lt;/mo&gt;&lt;msub&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mi&gt;t&lt;/mi&gt;&lt;/msub&gt;&lt;mo separator="true"&gt;,&lt;/mo&gt;&lt;msub&gt;&lt;mi&gt;s&lt;/mi&gt;&lt;mrow&gt;&lt;mi&gt;t&lt;/mi&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/mrow&gt;&lt;/msub&gt;&lt;mo separator="true"&gt;,&lt;/mo&gt;&lt;msub&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mrow&gt;&lt;mi&gt;t&lt;/mi&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/mrow&gt;&lt;/msub&gt;&lt;mo separator="true"&gt;,&lt;/mo&gt;&lt;mo&gt;…&lt;/mo&gt;&lt;mo separator="true"&gt;,&lt;/mo&gt;&lt;msub&gt;&lt;mi&gt;s&lt;/mi&gt;&lt;mn&gt;0&lt;/mn&gt;&lt;/msub&gt;&lt;mo separator="true"&gt;,&lt;/mo&gt;&lt;msub&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mn&gt;0&lt;/mn&gt;&lt;/msub&gt;&lt;mo stretchy="false"&gt;)&lt;/mo&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mi&gt;P&lt;/mi&gt;&lt;mo stretchy="false"&gt;(&lt;/mo&gt;&lt;msub&gt;&lt;mi&gt;s&lt;/mi&gt;&lt;mrow&gt;&lt;mi&gt;t&lt;/mi&gt;&lt;mo&gt;+&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/mrow&gt;&lt;/msub&gt;&lt;mo&gt;∣&lt;/mo&gt;&lt;msub&gt;&lt;mi&gt;s&lt;/mi&gt;&lt;mi&gt;t&lt;/mi&gt;&lt;/msub&gt;&lt;mo separator="true"&gt;,&lt;/mo&gt;&lt;msub&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mi&gt;t&lt;/mi&gt;&lt;/msub&gt;&lt;mo stretchy="false"&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;
P(s_{t+1} \mid s_t, a_t, s_{t-1}, a_{t-1}, \dots, s_0, a_0) = P(s_{t+1} \mid s_t, a_t)
&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1em;vertical-align:-0.25em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.13889em;"&gt;P&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;s&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.301108em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathdefault mtight"&gt;t&lt;/span&gt;&lt;span class="mbin mtight"&gt;+&lt;/span&gt;&lt;span class="mord mtight"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.208331em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;∣&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1em;vertical-align:-0.25em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;s&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.2805559999999999em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mathdefault mtight"&gt;t&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mpunct"&gt;,&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;a&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.2805559999999999em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mathdefault mtight"&gt;t&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mpunct"&gt;,&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;s&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.301108em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathdefault mtight"&gt;t&lt;/span&gt;&lt;span class="mbin mtight"&gt;−&lt;/span&gt;&lt;span class="mord mtight"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.208331em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mpunct"&gt;,&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;a&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.301108em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathdefault mtight"&gt;t&lt;/span&gt;&lt;span class="mbin mtight"&gt;−&lt;/span&gt;&lt;span class="mord mtight"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.208331em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mpunct"&gt;,&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="minner"&gt;…&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mpunct"&gt;,&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;s&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.30110799999999993em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;0&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mpunct"&gt;,&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;a&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.30110799999999993em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;0&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1em;vertical-align:-0.25em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.13889em;"&gt;P&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;s&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.301108em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathdefault mtight"&gt;t&lt;/span&gt;&lt;span class="mbin mtight"&gt;+&lt;/span&gt;&lt;span class="mord mtight"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.208331em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;∣&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1em;vertical-align:-0.25em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;s&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.2805559999999999em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mathdefault mtight"&gt;t&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mpunct"&gt;,&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;a&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.2805559999999999em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mathdefault mtight"&gt;t&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;A Markov Decision Process consists of 4 main components:&lt;/p&gt;
&lt;h3 id="state-space"&gt;State Space&lt;/h3&gt;
&lt;p&gt;The &lt;strong&gt;state space&lt;/strong&gt; (or &lt;strong&gt;observation space&lt;/strong&gt;) encompasses all possible states a system can occupy. The agent observes the current state before deciding on an action.&lt;/p&gt;
&lt;p&gt;Frozen Lake has 16 possible states in the standard 4×4 grid. You can access the observation space via &lt;code&gt;env.observation_space&lt;/code&gt; in the gymnasium.&lt;/p&gt;
&lt;p&gt;&lt;img alt="frozenlake_state_screenshots_4x4.png" src="../_media/frozenlake_state_screenshots_4x4.png"&gt;&lt;/p&gt;
&lt;h3 id="actions"&gt;Actions&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Actions&lt;/strong&gt; represent the set of all possible moves available to the agent. In the Frozen Lake example, each state has four possible actions:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;0: Move left&lt;/li&gt;
&lt;li&gt;1: Move down&lt;/li&gt;
&lt;li&gt;2: Move right&lt;/li&gt;
&lt;li&gt;3: Move up&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img alt="action-frozen-lake.png" src="../_media/action-frozen-lake.png"&gt;&lt;/p&gt;
&lt;p&gt;You can access the available actions in the gymnasium via &lt;code&gt;env.action_space&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id="transition-probabilities"&gt;Transition Probabilities&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Transition probabilities&lt;/strong&gt; define the likelihood of moving to a new state &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;msup&gt;&lt;mi&gt;s&lt;/mi&gt;&lt;mo lspace="0em" mathvariant="normal" rspace="0em"&gt;′&lt;/mo&gt;&lt;/msup&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;s'&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.751892em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;s&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.751892em;"&gt;&lt;span style="top:-3.063em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mtight"&gt;′&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; given that the agent takes action &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;a&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.43056em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;a&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; in state &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;s&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;s&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.43056em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;s&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;. This is denoted as:&lt;/p&gt;
&lt;p&gt;&lt;span class="katex-display"&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;P&lt;/mi&gt;&lt;mo stretchy="false"&gt;(&lt;/mo&gt;&lt;msup&gt;&lt;mi&gt;s&lt;/mi&gt;&lt;mo lspace="0em" mathvariant="normal" rspace="0em"&gt;′&lt;/mo&gt;&lt;/msup&gt;&lt;mo&gt;∣&lt;/mo&gt;&lt;mi&gt;s&lt;/mi&gt;&lt;mo separator="true"&gt;,&lt;/mo&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mo stretchy="false"&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;
P(s' \mid s, a)
&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1.051892em;vertical-align:-0.25em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.13889em;"&gt;P&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;s&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.801892em;"&gt;&lt;span style="top:-3.113em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mtight"&gt;′&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;∣&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1em;vertical-align:-0.25em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;s&lt;/span&gt;&lt;span class="mpunct"&gt;,&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;a&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;In Frozen Lake, transitions can be stochastic (slippery) or deterministic, depending on the environment configuration. In the default slippery version, actions have probabilistic outcomes. For example, choosing to move right may result in:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;1/3 probability of moving right (intended direction)&lt;/li&gt;
&lt;li&gt;1/3 probability of moving up&lt;/li&gt;
&lt;li&gt;1/3 probability of moving down&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This stochasticity models the uncertainty of moving on a slippery surface.&lt;/p&gt;
&lt;h3 id="reward-function"&gt;Reward Function&lt;/h3&gt;
&lt;p&gt;The &lt;strong&gt;reward function&lt;/strong&gt; &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;R&lt;/mi&gt;&lt;mo stretchy="false"&gt;(&lt;/mo&gt;&lt;mi&gt;s&lt;/mi&gt;&lt;mo separator="true"&gt;,&lt;/mo&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mo separator="true"&gt;,&lt;/mo&gt;&lt;msup&gt;&lt;mi&gt;s&lt;/mi&gt;&lt;mo lspace="0em" mathvariant="normal" rspace="0em"&gt;′&lt;/mo&gt;&lt;/msup&gt;&lt;mo stretchy="false"&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;R(s, a, s')&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1.001892em;vertical-align:-0.25em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.00773em;"&gt;R&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord mathdefault"&gt;s&lt;/span&gt;&lt;span class="mpunct"&gt;,&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;a&lt;/span&gt;&lt;span class="mpunct"&gt;,&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;s&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.751892em;"&gt;&lt;span style="top:-3.063em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mtight"&gt;′&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; provides a numeric reward upon transitioning from state &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;s&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;s&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.43056em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;s&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; to state &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;msup&gt;&lt;mi&gt;s&lt;/mi&gt;&lt;mo lspace="0em" mathvariant="normal" rspace="0em"&gt;′&lt;/mo&gt;&lt;/msup&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;s'&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.751892em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;s&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.751892em;"&gt;&lt;span style="top:-3.063em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mtight"&gt;′&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; after taking action &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;a&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.43056em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;a&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;.&lt;/p&gt;
&lt;p&gt;In Frozen Lake, the reward structure is:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Reach goal: +1&lt;/li&gt;
&lt;li&gt;Reach hole: 0&lt;/li&gt;
&lt;li&gt;Reach frozen tile: 0&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The rewards are sparse in this environment, with the agent only receiving a positive reward (+1) upon reaching the goal. This sparsity makes learning more challenging and reflects many real-world problems with limited feedback.&lt;/p&gt;
&lt;h2 id="solving-mdps"&gt;Solving MDPs&lt;/h2&gt;
&lt;p&gt;To solve an MDP, we need two additional concepts:&lt;/p&gt;
&lt;h3 id="policy"&gt;Policy&lt;/h3&gt;
&lt;p&gt;A &lt;strong&gt;policy&lt;/strong&gt; ($\pi$) is the agent's strategy for deciding which action to take in each state. It can be:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Deterministic&lt;/strong&gt;: &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;π&lt;/mi&gt;&lt;mo stretchy="false"&gt;(&lt;/mo&gt;&lt;mi&gt;s&lt;/mi&gt;&lt;mo stretchy="false"&gt;)&lt;/mo&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;\pi(s) = a&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1em;vertical-align:-0.25em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.03588em;"&gt;π&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord mathdefault"&gt;s&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.43056em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;a&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; (maps each state to a specific action)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Stochastic&lt;/strong&gt;: &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;π&lt;/mi&gt;&lt;mo stretchy="false"&gt;(&lt;/mo&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mi mathvariant="normal"&gt;∣&lt;/mi&gt;&lt;mi&gt;s&lt;/mi&gt;&lt;mo stretchy="false"&gt;)&lt;/mo&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mi&gt;P&lt;/mi&gt;&lt;mo stretchy="false"&gt;(&lt;/mo&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mi mathvariant="normal"&gt;∣&lt;/mi&gt;&lt;mi&gt;s&lt;/mi&gt;&lt;mo stretchy="false"&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;\pi(a|s) = P(a|s)&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1em;vertical-align:-0.25em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.03588em;"&gt;π&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord mathdefault"&gt;a&lt;/span&gt;&lt;span class="mord"&gt;∣&lt;/span&gt;&lt;span class="mord mathdefault"&gt;s&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1em;vertical-align:-0.25em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.13889em;"&gt;P&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord mathdefault"&gt;a&lt;/span&gt;&lt;span class="mord"&gt;∣&lt;/span&gt;&lt;span class="mord mathdefault"&gt;s&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; (maps each state to a probability distribution over actions)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Here's a simple random policy implementation for the Frozen Lake environment:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;gymnasium&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;as&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;gym&lt;/span&gt;

&lt;span class="n"&gt;env&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;gym&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;make&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;FrozenLake-v1&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;random_policy&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;env&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;action_space&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sample&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;info&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;env&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;reset&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;terminated&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;truncated&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;False&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;False&lt;/span&gt;

&lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;terminated&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="n"&gt;truncated&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;action&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;random_policy&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;next_state&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;reward&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;terminated&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;truncated&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;info&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;env&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;step&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;action&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;State: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;, Action: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;action&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;, Reward: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;reward&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;, Next state: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;next_state&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;state&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;next_state&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;An optimal policy maximizes the expected cumulative reward.&lt;/p&gt;
&lt;h3 id="discount-factor"&gt;Discount Factor&lt;/h3&gt;
&lt;p&gt;The &lt;strong&gt;discount factor&lt;/strong&gt; &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;γ&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;\gamma&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.625em;vertical-align:-0.19444em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.05556em;"&gt;γ&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; (gamma) is a parameter between 0 and 1 that determines how much the agent values future rewards relative to immediate ones. It's used in calculating expected returns:&lt;/p&gt;
&lt;p&gt;&lt;span class="katex-display"&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;msub&gt;&lt;mi&gt;G&lt;/mi&gt;&lt;mi&gt;t&lt;/mi&gt;&lt;/msub&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;msub&gt;&lt;mi&gt;R&lt;/mi&gt;&lt;mrow&gt;&lt;mi&gt;t&lt;/mi&gt;&lt;mo&gt;+&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/mrow&gt;&lt;/msub&gt;&lt;mo&gt;+&lt;/mo&gt;&lt;mi&gt;γ&lt;/mi&gt;&lt;msub&gt;&lt;mi&gt;R&lt;/mi&gt;&lt;mrow&gt;&lt;mi&gt;t&lt;/mi&gt;&lt;mo&gt;+&lt;/mo&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;/mrow&gt;&lt;/msub&gt;&lt;mo&gt;+&lt;/mo&gt;&lt;msup&gt;&lt;mi&gt;γ&lt;/mi&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;/msup&gt;&lt;msub&gt;&lt;mi&gt;R&lt;/mi&gt;&lt;mrow&gt;&lt;mi&gt;t&lt;/mi&gt;&lt;mo&gt;+&lt;/mo&gt;&lt;mn&gt;3&lt;/mn&gt;&lt;/mrow&gt;&lt;/msub&gt;&lt;mo&gt;+&lt;/mo&gt;&lt;mo&gt;⋯&lt;/mo&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;munderover&gt;&lt;mo&gt;∑&lt;/mo&gt;&lt;mrow&gt;&lt;mi&gt;k&lt;/mi&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mn&gt;0&lt;/mn&gt;&lt;/mrow&gt;&lt;mi mathvariant="normal"&gt;∞&lt;/mi&gt;&lt;/munderover&gt;&lt;msup&gt;&lt;mi&gt;γ&lt;/mi&gt;&lt;mi&gt;k&lt;/mi&gt;&lt;/msup&gt;&lt;msub&gt;&lt;mi&gt;R&lt;/mi&gt;&lt;mrow&gt;&lt;mi&gt;t&lt;/mi&gt;&lt;mo&gt;+&lt;/mo&gt;&lt;mi&gt;k&lt;/mi&gt;&lt;mo&gt;+&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/mrow&gt;&lt;/msub&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;
G_t = R_{t+1} + \gamma R_{t+2} + \gamma^2 R_{t+3} + \dots = \sum_{k=0}^{\infty} \gamma^k R_{t+k+1}
&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.83333em;vertical-align:-0.15em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;G&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.2805559999999999em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mathdefault mtight"&gt;t&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.891661em;vertical-align:-0.208331em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault" style="margin-right:0.00773em;"&gt;R&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.301108em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:-0.00773em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathdefault mtight"&gt;t&lt;/span&gt;&lt;span class="mbin mtight"&gt;+&lt;/span&gt;&lt;span class="mord mtight"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.208331em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;+&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.891661em;vertical-align:-0.208331em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.05556em;"&gt;γ&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault" style="margin-right:0.00773em;"&gt;R&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.301108em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:-0.00773em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathdefault mtight"&gt;t&lt;/span&gt;&lt;span class="mbin mtight"&gt;+&lt;/span&gt;&lt;span class="mord mtight"&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.208331em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;+&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1.072439em;vertical-align:-0.208331em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault" style="margin-right:0.05556em;"&gt;γ&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.8641079999999999em;"&gt;&lt;span style="top:-3.113em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault" style="margin-right:0.00773em;"&gt;R&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.301108em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:-0.00773em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathdefault mtight"&gt;t&lt;/span&gt;&lt;span class="mbin mtight"&gt;+&lt;/span&gt;&lt;span class="mord mtight"&gt;3&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.208331em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;+&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.36687em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="minner"&gt;⋯&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:2.9535100000000005em;vertical-align:-1.302113em;"&gt;&lt;/span&gt;&lt;span class="mop op-limits"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:1.6513970000000002em;"&gt;&lt;span style="top:-1.8478869999999998em;margin-left:0em;"&gt;&lt;span class="pstrut" style="height:3.05em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathdefault mtight" style="margin-right:0.03148em;"&gt;k&lt;/span&gt;&lt;span class="mrel mtight"&gt;=&lt;/span&gt;&lt;span class="mord mtight"&gt;0&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-3.0500049999999996em;"&gt;&lt;span class="pstrut" style="height:3.05em;"&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="mop op-symbol large-op"&gt;∑&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-4.300005em;margin-left:0em;"&gt;&lt;span class="pstrut" style="height:3.05em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mtight"&gt;∞&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:1.302113em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault" style="margin-right:0.05556em;"&gt;γ&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.8991079999999999em;"&gt;&lt;span style="top:-3.113em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mathdefault mtight" style="margin-right:0.03148em;"&gt;k&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault" style="margin-right:0.00773em;"&gt;R&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.3361079999999999em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:-0.00773em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathdefault mtight"&gt;t&lt;/span&gt;&lt;span class="mbin mtight"&gt;+&lt;/span&gt;&lt;span class="mord mathdefault mtight" style="margin-right:0.03148em;"&gt;k&lt;/span&gt;&lt;span class="mbin mtight"&gt;+&lt;/span&gt;&lt;span class="mord mtight"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.208331em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Where:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;γ&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;\gamma&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.625em;vertical-align:-0.19444em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.05556em;"&gt;γ&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; close to 0 makes the agent myopic (short-sighted), primarily valuing immediate rewards.&lt;/li&gt;
&lt;li&gt;A &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;γ&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;\gamma&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.625em;vertical-align:-0.19444em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.05556em;"&gt;γ&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; close to 1 makes the agent far-sighted, strongly valuing future rewards.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For Frozen Lake, a discount factor of around 0.9 to 0.99 is typically chosen, as reaching the goal requires planning several steps ahead.&lt;/p&gt;
&lt;h2 id="algorithms-to-solve-mdps"&gt;Algorithms to Solve MDPs&lt;/h2&gt;
&lt;p&gt;Various algorithms can solve MDPs by finding the optimal policy or value functions:&lt;/p&gt;
&lt;h3 id="dynamic-programming-methods"&gt;Dynamic Programming Methods&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="value%20iteration.html"&gt;Value Iteration&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;An iterative algorithm that computes the optimal state-value function by repeatedly applying the Bellman optimality equation.&lt;/li&gt;
&lt;li&gt;Converges to the optimal value function, from which an optimal policy can be derived.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Policy Iteration&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Alternates between policy evaluation (computing the value function for the current policy) and policy improvement (making the policy greedy with respect to the current value function).&lt;/li&gt;
&lt;li&gt;Often more efficient than value iteration for certain problems.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="model-free-methods"&gt;Model-Free Methods&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="q-learning.html"&gt;Q-Learning&lt;/a&gt;&lt;/strong&gt;&lt;ul&gt;
&lt;li&gt;A model-free reinforcement learning algorithm that learns the optimal action-value function directly from experience.&lt;/li&gt;
&lt;li&gt;Does not require knowledge of transition probabilities or rewards.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;SARSA (State-Action-Reward-State-Action)&lt;/strong&gt;&lt;ul&gt;
&lt;li&gt;An on-policy learning algorithm that updates Q-values based on the action actually taken rather than the greedy action.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Understanding MDPs provides a solid foundation for more advanced reinforcement learning concepts and applications, from game playing to robotics and autonomous systems.&lt;/p&gt;</content><category term="permanent"/><category term="ReinforcementLearning"/></entry><entry><title>Merkle Tree</title><link href="http://localhost:8000/merkle-tree.html" rel="alternate"/><published>2025-03-15T00:00:00+10:00</published><updated>2025-03-15T00:00:00+10:00</updated><author><name>Lex Toumbourou</name></author><id>tag:localhost,2025-03-15:/merkle-tree.html</id><summary type="html">&lt;p&gt;a data structure where each node contains the hash of its child nodes&lt;/p&gt;</summary><content type="html">&lt;p&gt;&lt;strong&gt;Merkle Tree&lt;/strong&gt; is a data structure where each parent node contains the hash of its child nodes, enabling efficient verification of large datasets, amongst many other useful things.&lt;/p&gt;
&lt;p&gt;&lt;img alt="merkle-tree.png" src="../_media/merkle-tree.png"&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Original illustration by David Göthberg. &lt;a href="https://commons.wikimedia.org/wiki/File:Hash_Tree.svg"&gt;Source&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;To construct a Merkle Tree, data is first hashed at the leaf nodes. These hashes are then paired and hashed again to form parent nodes, continuing recursively until reaching a single hash at the root called the &lt;strong&gt;Merkle Root&lt;/strong&gt;. The leaf nodes contain a hash of the data. This structure makes Merkle Trees "tamper-evident" - any change to data will propagate upward, altering the root hash.&lt;/p&gt;
&lt;p&gt;If there's an odd number of nodes at any level, the last node is typically duplicated (paired with itself) to create an even number for the next level.&lt;/p&gt;
&lt;p&gt;Merkle Proofs, a capability enabled by Merkle Trees, allows us to verify a specific transaction or piece of data is included in a dataset by only checking a small number of hashes rather than the entire set. You only need to hash values from the leaf to the node to verify that a transaction (for example) exists in the ledger.&lt;/p&gt;
&lt;p&gt;In the &lt;a href="bitcoin-a-peer-to-peer-electronic-cash-system.html"&gt;Bitcoin Paper&lt;/a&gt;, Nakamoto described a method to reclaim disk space by hashing transactions into a tree structure with only the Merkle root stored in the block header. The Merkle Root used in Bitcoin also enables "simple payment verification", a feature allowing clients to verify transactions without downloading the entire blockchain.&lt;/p&gt;
&lt;p&gt;&lt;img alt="merkle-tree-in-bitcoin.png" src="../_media/merkle-tree-in-bitcoin.png"&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Diagram from &lt;a href="https://bitcoin.org/bitcoin.pdf"&gt;Bitcoin: A Peer-to-Peer Electronic Cash System&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="git.html"&gt;Git&lt;/a&gt; repositories are a type of Merkle Tree, where each commit is identified by a hash that depends on the entire history of the repository, including the file contents, commit messages, timestamps, and parent commits.&lt;/p&gt;
&lt;p&gt;Beyond Bitcoin and Git, Merkle Trees are used in distributed file systems like IPFS and Certificate Transparency logs used to verify SSL certificates across the web.&lt;/p&gt;</content><category term="permanent"/><category term="DataStructures"/><category term="Cryptography"/></entry><entry><title>RSA</title><link href="http://localhost:8000/rsa.html" rel="alternate"/><published>2025-03-01T00:00:00+10:00</published><updated>2025-03-01T00:00:00+10:00</updated><author><name>Lex Toumbourou</name></author><id>tag:localhost,2025-03-01:/rsa.html</id><summary type="html">&lt;p&gt;a public-key encryption system reliant on the practical difficulty of factorising large numbers&lt;/p&gt;</summary><content type="html">&lt;p&gt;&lt;strong&gt;RSA&lt;/strong&gt; is a public-key encryption system based on the idea that two prime numbers are computationally easy to multiply together but very difficult to factor back into the original primes. Named after its three creators from MIT: Ronald Rivest, Adi Shamir, and Leonard Adleman.&lt;/p&gt;
&lt;p&gt;In RSA and other public-key systems, there is a public key, which can encrypt messages and is freely available, and a private key, which can decrypt messages and is kept secret. We can use the keys to encrypt messages (using the recipient's public key so only they can decrypt) and digital signatures (using the sender's private key to prove authenticity).&lt;/p&gt;
&lt;p&gt;However, RSA is a slow algorithm typically not used for directly encrypting user data; more often, it's used for transmitting shared keys for symmetric key cryptography (like AES), which is much faster for bulk encryption.&lt;/p&gt;
&lt;h3 id="algorithm"&gt;Algorithm&lt;/h3&gt;
&lt;p&gt;To create a private and public key, we use the following steps:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Select two large prime numbers, &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;p&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;p&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.625em;vertical-align:-0.19444em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;p&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; and &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;q&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;q&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.625em;vertical-align:-0.19444em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.03588em;"&gt;q&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;. (In practice, each should be hundreds or thousands of bits long—commonly 2048 bits or more—to ensure security.)&lt;/li&gt;
&lt;li&gt;Calculate &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;N&lt;/mi&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mi&gt;p&lt;/mi&gt;&lt;mo&gt;×&lt;/mo&gt;&lt;mi&gt;q&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;N = p \times q&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.68333em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.10903em;"&gt;N&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.7777700000000001em;vertical-align:-0.19444em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;p&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;×&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.625em;vertical-align:-0.19444em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.03588em;"&gt;q&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; (the modulus).&lt;/li&gt;
&lt;li&gt;Calculate &lt;a href="eulers-totient-function.html"&gt;Euler's Totient Function&lt;/a&gt;: &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;ϕ&lt;/mi&gt;&lt;mo stretchy="false"&gt;(&lt;/mo&gt;&lt;mi&gt;N&lt;/mi&gt;&lt;mo stretchy="false"&gt;)&lt;/mo&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mo stretchy="false"&gt;(&lt;/mo&gt;&lt;mi&gt;p&lt;/mi&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;mo stretchy="false"&gt;)&lt;/mo&gt;&lt;mo stretchy="false"&gt;(&lt;/mo&gt;&lt;mi&gt;q&lt;/mi&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;mo stretchy="false"&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;\phi(N) = (p-1)(q-1)&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1em;vertical-align:-0.25em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;ϕ&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.10903em;"&gt;N&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1em;vertical-align:-0.25em;"&gt;&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord mathdefault"&gt;p&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;−&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1em;vertical-align:-0.25em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;1&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.03588em;"&gt;q&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;−&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1em;vertical-align:-0.25em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;1&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;Choose a public key &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;e&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;e&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.43056em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;e&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; that is relatively prime to &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;ϕ&lt;/mi&gt;&lt;mo stretchy="false"&gt;(&lt;/mo&gt;&lt;mi&gt;N&lt;/mi&gt;&lt;mo stretchy="false"&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;\phi(N)&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1em;vertical-align:-0.25em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;ϕ&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.10903em;"&gt;N&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;. Two numbers are relatively prime when their greatest common divisor (GCD) is 1. (A common choice is &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;e&lt;/mi&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mn&gt;65537&lt;/mn&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;e = 65537&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.43056em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;e&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.64444em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;6&lt;/span&gt;&lt;span class="mord"&gt;5&lt;/span&gt;&lt;span class="mord"&gt;5&lt;/span&gt;&lt;span class="mord"&gt;3&lt;/span&gt;&lt;span class="mord"&gt;7&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;, a &lt;a href="fermat-prime.html"&gt;Fermat Prime&lt;/a&gt;. It has only two 1's in its binary representation, greatly reducing exponentiation time.)&lt;/li&gt;
&lt;li&gt;Compute the private key &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;d&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;d&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.69444em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;d&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; as the modular multiplicative inverse of &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;e&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;e&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.43056em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;e&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; modulo &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;ϕ&lt;/mi&gt;&lt;mo stretchy="false"&gt;(&lt;/mo&gt;&lt;mi&gt;N&lt;/mi&gt;&lt;mo stretchy="false"&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;\phi(N)&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1em;vertical-align:-0.25em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;ϕ&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.10903em;"&gt;N&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;. This means finding a value &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;d&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;d&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.69444em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;d&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; where: &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mo stretchy="false"&gt;(&lt;/mo&gt;&lt;mi&gt;d&lt;/mi&gt;&lt;mo&gt;×&lt;/mo&gt;&lt;mi&gt;e&lt;/mi&gt;&lt;mo stretchy="false"&gt;)&lt;/mo&gt;&lt;mspace&gt;&lt;/mspace&gt;&lt;mspace width="0.6666666666666666em"&gt;&lt;/mspace&gt;&lt;mrow&gt;&lt;mi mathvariant="normal"&gt;m&lt;/mi&gt;&lt;mi mathvariant="normal"&gt;o&lt;/mi&gt;&lt;mi mathvariant="normal"&gt;d&lt;/mi&gt;&lt;/mrow&gt;&lt;mtext&gt; &lt;/mtext&gt;&lt;mtext&gt; &lt;/mtext&gt;&lt;mi&gt;ϕ&lt;/mi&gt;&lt;mo stretchy="false"&gt;(&lt;/mo&gt;&lt;mi&gt;N&lt;/mi&gt;&lt;mo stretchy="false"&gt;)&lt;/mo&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;(d \times e) \mod \phi(N) = 1&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1em;vertical-align:-0.25em;"&gt;&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord mathdefault"&gt;d&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;×&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1em;vertical-align:-0.25em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;e&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;span class="mspace allowbreak"&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.6666666666666666em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1em;vertical-align:-0.25em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;&lt;span class="mord mathrm"&gt;m&lt;/span&gt;&lt;span class="mord mathrm"&gt;o&lt;/span&gt;&lt;span class="mord mathrm"&gt;d&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;ϕ&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.10903em;"&gt;N&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.64444em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;. This can be calculated using the &lt;a href="extended-euclidean-algorithm.html"&gt;Extended Euclidean Algorithm&lt;/a&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;N&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;N&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.68333em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.10903em;"&gt;N&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; and &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;e&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;e&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.43056em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;e&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; are &lt;strong&gt;public key&lt;/strong&gt; components, represented as &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mo stretchy="false"&gt;(&lt;/mo&gt;&lt;mi&gt;N&lt;/mi&gt;&lt;mo separator="true"&gt;,&lt;/mo&gt;&lt;mi&gt;e&lt;/mi&gt;&lt;mo stretchy="false"&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;(N, e)&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1em;vertical-align:-0.25em;"&gt;&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.10903em;"&gt;N&lt;/span&gt;&lt;span class="mpunct"&gt;,&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;e&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;.&lt;/p&gt;
&lt;p&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;p&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;p&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.625em;vertical-align:-0.19444em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;p&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;, &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;q&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;q&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.625em;vertical-align:-0.19444em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.03588em;"&gt;q&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;, and &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;d&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;d&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.69444em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;d&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; are the &lt;strong&gt;private key&lt;/strong&gt; components, although &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;p&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;p&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.625em;vertical-align:-0.19444em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;p&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; and &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;q&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;q&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.625em;vertical-align:-0.19444em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.03588em;"&gt;q&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; are typically discarded, and it's represented as &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mo stretchy="false"&gt;(&lt;/mo&gt;&lt;mi&gt;N&lt;/mi&gt;&lt;mo separator="true"&gt;,&lt;/mo&gt;&lt;mi&gt;d&lt;/mi&gt;&lt;mo stretchy="false"&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;(N, d)&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1em;vertical-align:-0.25em;"&gt;&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.10903em;"&gt;N&lt;/span&gt;&lt;span class="mpunct"&gt;,&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;d&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;.&lt;/p&gt;
&lt;h3 id="encryption-and-decryption"&gt;Encryption and Decryption&lt;/h3&gt;
&lt;p&gt;Given &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;e&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;e&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.43056em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;e&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; and &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;N&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;N&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.68333em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.10903em;"&gt;N&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;, we can encrypt messages: &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;c&lt;/mi&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;msup&gt;&lt;mi&gt;m&lt;/mi&gt;&lt;mi&gt;e&lt;/mi&gt;&lt;/msup&gt;&lt;mspace&gt;&lt;/mspace&gt;&lt;mspace width="0.6666666666666666em"&gt;&lt;/mspace&gt;&lt;mrow&gt;&lt;mi mathvariant="normal"&gt;m&lt;/mi&gt;&lt;mi mathvariant="normal"&gt;o&lt;/mi&gt;&lt;mi mathvariant="normal"&gt;d&lt;/mi&gt;&lt;/mrow&gt;&lt;mtext&gt; &lt;/mtext&gt;&lt;mtext&gt; &lt;/mtext&gt;&lt;mi&gt;N&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;c = m^e \mod N&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.43056em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;c&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.664392em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;m&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.664392em;"&gt;&lt;span style="top:-3.063em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mathdefault mtight"&gt;e&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace allowbreak"&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.6666666666666666em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.69444em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;&lt;span class="mord mathrm"&gt;m&lt;/span&gt;&lt;span class="mord mathrm"&gt;o&lt;/span&gt;&lt;span class="mord mathrm"&gt;d&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.10903em;"&gt;N&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;.
Given &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;d&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;d&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.69444em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;d&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;, we can decrypt messages: &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;m&lt;/mi&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;msup&gt;&lt;mi&gt;c&lt;/mi&gt;&lt;mi&gt;d&lt;/mi&gt;&lt;/msup&gt;&lt;mspace&gt;&lt;/mspace&gt;&lt;mspace width="0.6666666666666666em"&gt;&lt;/mspace&gt;&lt;mrow&gt;&lt;mi mathvariant="normal"&gt;m&lt;/mi&gt;&lt;mi mathvariant="normal"&gt;o&lt;/mi&gt;&lt;mi mathvariant="normal"&gt;d&lt;/mi&gt;&lt;/mrow&gt;&lt;mtext&gt; &lt;/mtext&gt;&lt;mtext&gt; &lt;/mtext&gt;&lt;mi&gt;N&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;m = c^d \mod N&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.43056em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;m&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.849108em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;c&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.849108em;"&gt;&lt;span style="top:-3.063em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mathdefault mtight"&gt;d&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace allowbreak"&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.6666666666666666em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.69444em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;&lt;span class="mord mathrm"&gt;m&lt;/span&gt;&lt;span class="mord mathrm"&gt;o&lt;/span&gt;&lt;span class="mord mathrm"&gt;d&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.10903em;"&gt;N&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;.&lt;/p&gt;
&lt;h3 id="example"&gt;Example&lt;/h3&gt;
&lt;p&gt;For a simple example (using small numbers for clarity):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Choose primes &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;p&lt;/mi&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mn&gt;61&lt;/mn&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;p = 61&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.625em;vertical-align:-0.19444em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;p&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.64444em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;6&lt;/span&gt;&lt;span class="mord"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; and &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;q&lt;/mi&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mn&gt;53&lt;/mn&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;q = 53&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.625em;vertical-align:-0.19444em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.03588em;"&gt;q&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.64444em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;5&lt;/span&gt;&lt;span class="mord"&gt;3&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;Calculate &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;N&lt;/mi&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mn&gt;61&lt;/mn&gt;&lt;mo&gt;×&lt;/mo&gt;&lt;mn&gt;53&lt;/mn&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mn&gt;3233&lt;/mn&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;N = 61 \times 53 = 3233&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.68333em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.10903em;"&gt;N&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.72777em;vertical-align:-0.08333em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;6&lt;/span&gt;&lt;span class="mord"&gt;1&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;×&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.64444em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;5&lt;/span&gt;&lt;span class="mord"&gt;3&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.64444em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;3&lt;/span&gt;&lt;span class="mord"&gt;2&lt;/span&gt;&lt;span class="mord"&gt;3&lt;/span&gt;&lt;span class="mord"&gt;3&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;Calculate &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;ϕ&lt;/mi&gt;&lt;mo stretchy="false"&gt;(&lt;/mo&gt;&lt;mi&gt;N&lt;/mi&gt;&lt;mo stretchy="false"&gt;)&lt;/mo&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mo stretchy="false"&gt;(&lt;/mo&gt;&lt;mn&gt;61&lt;/mn&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;mo stretchy="false"&gt;)&lt;/mo&gt;&lt;mo&gt;×&lt;/mo&gt;&lt;mo stretchy="false"&gt;(&lt;/mo&gt;&lt;mn&gt;53&lt;/mn&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;mo stretchy="false"&gt;)&lt;/mo&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mn&gt;60&lt;/mn&gt;&lt;mo&gt;×&lt;/mo&gt;&lt;mn&gt;52&lt;/mn&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mn&gt;3120&lt;/mn&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;\phi(N) = (61-1) \times (53-1) = 60 \times 52 = 3120&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1em;vertical-align:-0.25em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;ϕ&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.10903em;"&gt;N&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1em;vertical-align:-0.25em;"&gt;&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord"&gt;6&lt;/span&gt;&lt;span class="mord"&gt;1&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;−&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1em;vertical-align:-0.25em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;1&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;×&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1em;vertical-align:-0.25em;"&gt;&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord"&gt;5&lt;/span&gt;&lt;span class="mord"&gt;3&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;−&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1em;vertical-align:-0.25em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;1&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.72777em;vertical-align:-0.08333em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;6&lt;/span&gt;&lt;span class="mord"&gt;0&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;×&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.64444em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;5&lt;/span&gt;&lt;span class="mord"&gt;2&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.64444em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;3&lt;/span&gt;&lt;span class="mord"&gt;1&lt;/span&gt;&lt;span class="mord"&gt;2&lt;/span&gt;&lt;span class="mord"&gt;0&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;Choose &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;e&lt;/mi&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mn&gt;17&lt;/mn&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;e = 17&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.43056em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;e&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.64444em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;1&lt;/span&gt;&lt;span class="mord"&gt;7&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; (relatively prime to 3120)&lt;/li&gt;
&lt;li&gt;Calculate &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;d&lt;/mi&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mn&gt;2753&lt;/mn&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;d = 2753&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.69444em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;d&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.64444em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;2&lt;/span&gt;&lt;span class="mord"&gt;7&lt;/span&gt;&lt;span class="mord"&gt;5&lt;/span&gt;&lt;span class="mord"&gt;3&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; (since &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mn&gt;17&lt;/mn&gt;&lt;mo&gt;×&lt;/mo&gt;&lt;mn&gt;2753&lt;/mn&gt;&lt;mspace&gt;&lt;/mspace&gt;&lt;mspace width="0.6666666666666666em"&gt;&lt;/mspace&gt;&lt;mrow&gt;&lt;mi mathvariant="normal"&gt;m&lt;/mi&gt;&lt;mi mathvariant="normal"&gt;o&lt;/mi&gt;&lt;mi mathvariant="normal"&gt;d&lt;/mi&gt;&lt;/mrow&gt;&lt;mtext&gt; &lt;/mtext&gt;&lt;mtext&gt; &lt;/mtext&gt;&lt;mn&gt;3120&lt;/mn&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;17 \times 2753 \mod 3120 = 1&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.72777em;vertical-align:-0.08333em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;1&lt;/span&gt;&lt;span class="mord"&gt;7&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;×&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.64444em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;2&lt;/span&gt;&lt;span class="mord"&gt;7&lt;/span&gt;&lt;span class="mord"&gt;5&lt;/span&gt;&lt;span class="mord"&gt;3&lt;/span&gt;&lt;span class="mspace allowbreak"&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.6666666666666666em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.69444em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;&lt;span class="mord mathrm"&gt;m&lt;/span&gt;&lt;span class="mord mathrm"&gt;o&lt;/span&gt;&lt;span class="mord mathrm"&gt;d&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;3&lt;/span&gt;&lt;span class="mord"&gt;1&lt;/span&gt;&lt;span class="mord"&gt;2&lt;/span&gt;&lt;span class="mord"&gt;0&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.64444em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Public key: &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mo stretchy="false"&gt;(&lt;/mo&gt;&lt;mi&gt;N&lt;/mi&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mn&gt;3233&lt;/mn&gt;&lt;mo separator="true"&gt;,&lt;/mo&gt;&lt;mi&gt;e&lt;/mi&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mn&gt;17&lt;/mn&gt;&lt;mo stretchy="false"&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;(N=3233, e=17)&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1em;vertical-align:-0.25em;"&gt;&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.10903em;"&gt;N&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.8388800000000001em;vertical-align:-0.19444em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;3&lt;/span&gt;&lt;span class="mord"&gt;2&lt;/span&gt;&lt;span class="mord"&gt;3&lt;/span&gt;&lt;span class="mord"&gt;3&lt;/span&gt;&lt;span class="mpunct"&gt;,&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;e&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1em;vertical-align:-0.25em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;1&lt;/span&gt;&lt;span class="mord"&gt;7&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Private key: &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mo stretchy="false"&gt;(&lt;/mo&gt;&lt;mi&gt;N&lt;/mi&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mn&gt;3233&lt;/mn&gt;&lt;mo separator="true"&gt;,&lt;/mo&gt;&lt;mi&gt;d&lt;/mi&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mn&gt;2753&lt;/mn&gt;&lt;mo stretchy="false"&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;(N=3233, d=2753)&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1em;vertical-align:-0.25em;"&gt;&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.10903em;"&gt;N&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.8888799999999999em;vertical-align:-0.19444em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;3&lt;/span&gt;&lt;span class="mord"&gt;2&lt;/span&gt;&lt;span class="mord"&gt;3&lt;/span&gt;&lt;span class="mord"&gt;3&lt;/span&gt;&lt;span class="mpunct"&gt;,&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;d&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1em;vertical-align:-0.25em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;2&lt;/span&gt;&lt;span class="mord"&gt;7&lt;/span&gt;&lt;span class="mord"&gt;5&lt;/span&gt;&lt;span class="mord"&gt;3&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;To encrypt message &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;m&lt;/mi&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mn&gt;123&lt;/mn&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;m = 123&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.43056em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;m&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.64444em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;1&lt;/span&gt;&lt;span class="mord"&gt;2&lt;/span&gt;&lt;span class="mord"&gt;3&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;: &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;c&lt;/mi&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mn&gt;12&lt;/mn&gt;&lt;msup&gt;&lt;mn&gt;3&lt;/mn&gt;&lt;mn&gt;17&lt;/mn&gt;&lt;/msup&gt;&lt;mspace&gt;&lt;/mspace&gt;&lt;mspace width="0.6666666666666666em"&gt;&lt;/mspace&gt;&lt;mrow&gt;&lt;mi mathvariant="normal"&gt;m&lt;/mi&gt;&lt;mi mathvariant="normal"&gt;o&lt;/mi&gt;&lt;mi mathvariant="normal"&gt;d&lt;/mi&gt;&lt;/mrow&gt;&lt;mtext&gt; &lt;/mtext&gt;&lt;mtext&gt; &lt;/mtext&gt;&lt;mn&gt;3233&lt;/mn&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mn&gt;855&lt;/mn&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;c = 123^{17} \mod 3233 = 855&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.43056em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;c&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.8141079999999999em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;1&lt;/span&gt;&lt;span class="mord"&gt;2&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;3&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.8141079999999999em;"&gt;&lt;span style="top:-3.063em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mtight"&gt;1&lt;/span&gt;&lt;span class="mord mtight"&gt;7&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace allowbreak"&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.6666666666666666em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.69444em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;&lt;span class="mord mathrm"&gt;m&lt;/span&gt;&lt;span class="mord mathrm"&gt;o&lt;/span&gt;&lt;span class="mord mathrm"&gt;d&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;3&lt;/span&gt;&lt;span class="mord"&gt;2&lt;/span&gt;&lt;span class="mord"&gt;3&lt;/span&gt;&lt;span class="mord"&gt;3&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.64444em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;8&lt;/span&gt;&lt;span class="mord"&gt;5&lt;/span&gt;&lt;span class="mord"&gt;5&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;To decrypt ciphertext &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;c&lt;/mi&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mn&gt;855&lt;/mn&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;c = 855&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.43056em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;c&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.64444em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;8&lt;/span&gt;&lt;span class="mord"&gt;5&lt;/span&gt;&lt;span class="mord"&gt;5&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;: &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;m&lt;/mi&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mn&gt;85&lt;/mn&gt;&lt;msup&gt;&lt;mn&gt;5&lt;/mn&gt;&lt;mn&gt;2753&lt;/mn&gt;&lt;/msup&gt;&lt;mspace&gt;&lt;/mspace&gt;&lt;mspace width="0.6666666666666666em"&gt;&lt;/mspace&gt;&lt;mrow&gt;&lt;mi mathvariant="normal"&gt;m&lt;/mi&gt;&lt;mi mathvariant="normal"&gt;o&lt;/mi&gt;&lt;mi mathvariant="normal"&gt;d&lt;/mi&gt;&lt;/mrow&gt;&lt;mtext&gt; &lt;/mtext&gt;&lt;mtext&gt; &lt;/mtext&gt;&lt;mn&gt;3233&lt;/mn&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mn&gt;123&lt;/mn&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;m = 855^{2753} \mod 3233 = 123&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.43056em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;m&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.8141079999999999em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;8&lt;/span&gt;&lt;span class="mord"&gt;5&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;5&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.8141079999999999em;"&gt;&lt;span style="top:-3.063em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mtight"&gt;2&lt;/span&gt;&lt;span class="mord mtight"&gt;7&lt;/span&gt;&lt;span class="mord mtight"&gt;5&lt;/span&gt;&lt;span class="mord mtight"&gt;3&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace allowbreak"&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.6666666666666666em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.69444em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;&lt;span class="mord mathrm"&gt;m&lt;/span&gt;&lt;span class="mord mathrm"&gt;o&lt;/span&gt;&lt;span class="mord mathrm"&gt;d&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;3&lt;/span&gt;&lt;span class="mord"&gt;2&lt;/span&gt;&lt;span class="mord"&gt;3&lt;/span&gt;&lt;span class="mord"&gt;3&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.64444em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;1&lt;/span&gt;&lt;span class="mord"&gt;2&lt;/span&gt;&lt;span class="mord"&gt;3&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h3 id="security-considerations"&gt;Security Considerations&lt;/h3&gt;
&lt;p&gt;If the value of &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;N&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;N&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.68333em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.10903em;"&gt;N&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; is not large enough, an attacker could factorise it, effectively allowing them to solve for &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;d&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;d&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.69444em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;d&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;. Key sizes of at least 2048 bits are recommended for security through 2030.&lt;/p&gt;
&lt;p&gt;Additionally, modern RSA implementations use secure padding schemes (like PKCS#1 OAEP) to protect against various attacks, including chosen-ciphertext attacks.&lt;/p&gt;
&lt;p&gt;Side-channel attacks can leak information about private keys during implementation, requiring additional countermeasures.&lt;/p&gt;
&lt;p&gt;Lastly, RSA's security relies on the computational difficulty of the factoring problem, but quantum computers running Shor's algorithm could break RSA encryption, driving research into post-quantum cryptography alternatives.&lt;/p&gt;</content><category term="permanent"/><category term="Cryptography"/><category term="ComputerSecurity"/></entry><entry><title>Spanning Tree</title><link href="http://localhost:8000/spanning-tree.html" rel="alternate"/><published>2025-02-16T00:00:00+10:00</published><updated>2025-02-16T00:00:00+10:00</updated><author><name>Lex Toumbourou</name></author><id>tag:localhost,2025-02-16:/spanning-tree.html</id><summary type="html">&lt;p&gt;a sub graph of a connected graph that contains all vertices, but no cycles&lt;/p&gt;</summary><content type="html">&lt;p&gt;The &lt;strong&gt;Spanning Tree&lt;/strong&gt; of a connected graph &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;G&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;G&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.68333em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;G&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; is a connected sub graph which contains all vertices of &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;G&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;G&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.68333em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;G&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;, but with no cycles.&lt;/p&gt;
&lt;h2 id="example"&gt;Example&lt;/h2&gt;
&lt;p&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;G&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;G&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.68333em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;G&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; is a connected graph, &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;msub&gt;&lt;mi&gt;T&lt;/mi&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/msub&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;T_1&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.83333em;vertical-align:-0.15em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault" style="margin-right:0.13889em;"&gt;T&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.30110799999999993em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:-0.13889em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;, &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;msub&gt;&lt;mi&gt;T&lt;/mi&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;/msub&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;T_2&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.83333em;vertical-align:-0.15em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault" style="margin-right:0.13889em;"&gt;T&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.30110799999999993em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:-0.13889em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;, &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;msub&gt;&lt;mi&gt;T&lt;/mi&gt;&lt;mn&gt;3&lt;/mn&gt;&lt;/msub&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;T_3&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.83333em;vertical-align:-0.15em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault" style="margin-right:0.13889em;"&gt;T&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.30110799999999993em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:-0.13889em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;3&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; and &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;msub&gt;&lt;mi&gt;T&lt;/mi&gt;&lt;mn&gt;4&lt;/mn&gt;&lt;/msub&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;T_4&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.83333em;vertical-align:-0.15em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault" style="margin-right:0.13889em;"&gt;T&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.30110799999999993em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:-0.13889em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;4&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; are spanning trees.&lt;/p&gt;
&lt;p&gt;&lt;img alt="week-15-spanning-tree.webp" src="../_media/week-15-spanning-tree.webp"&gt;&lt;/p&gt;
&lt;h2 id="minimum-spanning-tree-mst"&gt;Minimum Spanning Tree (MST)&lt;/h2&gt;
&lt;p&gt;The Minimum Spanning Tree (MST) is the lowest cost spanning tree within the graph, where vertices have associated costs.&lt;/p&gt;
&lt;p&gt;Two algorithms for computing the MST:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="prims-algorithm.html"&gt;Prim's Algorithm&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="kruskals-algorithm.html"&gt;Kruskal's Algorithm&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;</content><category term="permanent"/><category term="ComputerScience"/><category term="GraphTheory"/></entry><entry><title>Bucket Sort</title><link href="http://localhost:8000/bucket-sort.html" rel="alternate"/><published>2025-02-15T00:00:00+10:00</published><updated>2025-02-15T00:00:00+10:00</updated><author><name>Lex Toumbourou</name></author><id>tag:localhost,2025-02-15:/bucket-sort.html</id><summary type="html">&lt;p&gt;a distribution-based sorting algorithm that works by dividing elements into buckets&lt;/p&gt;</summary><content type="html">&lt;p&gt;&lt;strong&gt;Bucket Sort&lt;/strong&gt; is a distribution sorting algorithm that works by dividing elements into a finite number of buckets, sorting these buckets (typically with another algorithm), and then concatenating them to produce the final sorted array. It is particularly efficient when input is uniformly distributed over a range, achieving an average case time complexity of &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;O&lt;/mi&gt;&lt;mo stretchy="false"&gt;(&lt;/mo&gt;&lt;mi&gt;n&lt;/mi&gt;&lt;mo&gt;+&lt;/mo&gt;&lt;mi&gt;k&lt;/mi&gt;&lt;mo stretchy="false"&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;O(n + k)&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1em;vertical-align:-0.25em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.02778em;"&gt;O&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord mathdefault"&gt;n&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;+&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1em;vertical-align:-0.25em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.03148em;"&gt;k&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; where &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;k&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;k&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.69444em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.03148em;"&gt;k&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; is the number of buckets.&lt;/p&gt;
&lt;h2 id="algorithm"&gt;Algorithm&lt;/h2&gt;
&lt;p&gt;&lt;span class="katex-display"&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mtable columnalign="right left" columnspacing="0em" rowspacing="0.24999999999999992em"&gt;&lt;mtr&gt;&lt;mtd&gt;&lt;mstyle displaystyle="true" scriptlevel="0"&gt;&lt;mrow&gt;&lt;/mrow&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;mtd&gt;&lt;mstyle displaystyle="true" scriptlevel="0"&gt;&lt;mrow&gt;&lt;mrow&gt;&lt;/mrow&gt;&lt;mtext mathvariant="bold"&gt;BUCKETSORT&lt;/mtext&gt;&lt;mo stretchy="false"&gt;(&lt;/mo&gt;&lt;mi&gt;A&lt;/mi&gt;&lt;mo stretchy="false"&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;/mtr&gt;&lt;mtr&gt;&lt;mtd&gt;&lt;mstyle displaystyle="true" scriptlevel="0"&gt;&lt;mrow&gt;&lt;/mrow&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;mtd&gt;&lt;mstyle displaystyle="true" scriptlevel="0"&gt;&lt;mrow&gt;&lt;mrow&gt;&lt;/mrow&gt;&lt;mspace width="1em"&gt;&lt;/mspace&gt;&lt;mn&gt;1.&lt;/mn&gt;&lt;mspace width="1em"&gt;&lt;/mspace&gt;&lt;mi&gt;n&lt;/mi&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mi&gt;A&lt;/mi&gt;&lt;mi mathvariant="normal"&gt;.&lt;/mi&gt;&lt;mi&gt;l&lt;/mi&gt;&lt;mi&gt;e&lt;/mi&gt;&lt;mi&gt;n&lt;/mi&gt;&lt;mi&gt;g&lt;/mi&gt;&lt;mi&gt;t&lt;/mi&gt;&lt;mi&gt;h&lt;/mi&gt;&lt;/mrow&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;/mtr&gt;&lt;mtr&gt;&lt;mtd&gt;&lt;mstyle displaystyle="true" scriptlevel="0"&gt;&lt;mrow&gt;&lt;/mrow&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;mtd&gt;&lt;mstyle displaystyle="true" scriptlevel="0"&gt;&lt;mrow&gt;&lt;mrow&gt;&lt;/mrow&gt;&lt;mspace width="1em"&gt;&lt;/mspace&gt;&lt;mn&gt;2.&lt;/mn&gt;&lt;mspace width="1em"&gt;&lt;/mspace&gt;&lt;mtext&gt;buckets &lt;/mtext&gt;&lt;mi&gt;B&lt;/mi&gt;&lt;mo stretchy="false"&gt;[&lt;/mo&gt;&lt;mn&gt;0&lt;/mn&gt;&lt;mo&gt;…&lt;/mo&gt;&lt;mi&gt;n&lt;/mi&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;mo stretchy="false"&gt;]&lt;/mo&gt;&lt;/mrow&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;/mtr&gt;&lt;mtr&gt;&lt;mtd&gt;&lt;mstyle displaystyle="true" scriptlevel="0"&gt;&lt;mrow&gt;&lt;/mrow&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;mtd&gt;&lt;mstyle displaystyle="true" scriptlevel="0"&gt;&lt;mrow&gt;&lt;mrow&gt;&lt;/mrow&gt;&lt;mspace width="1em"&gt;&lt;/mspace&gt;&lt;mn&gt;3.&lt;/mn&gt;&lt;mspace width="1em"&gt;&lt;/mspace&gt;&lt;mrow&gt;&lt;mtext mathvariant="bold"&gt;for&lt;/mtext&gt;&lt;mtext&gt; &lt;/mtext&gt;&lt;/mrow&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;mtext&gt; to &lt;/mtext&gt;&lt;mi&gt;n&lt;/mi&gt;&lt;mrow&gt;&lt;mtext&gt; &lt;/mtext&gt;&lt;mtext mathvariant="bold"&gt;do&lt;/mtext&gt;&lt;/mrow&gt;&lt;/mrow&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;/mtr&gt;&lt;mtr&gt;&lt;mtd&gt;&lt;mstyle displaystyle="true" scriptlevel="0"&gt;&lt;mrow&gt;&lt;/mrow&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;mtd&gt;&lt;mstyle displaystyle="true" scriptlevel="0"&gt;&lt;mrow&gt;&lt;mrow&gt;&lt;/mrow&gt;&lt;mspace width="1em"&gt;&lt;/mspace&gt;&lt;mn&gt;4.&lt;/mn&gt;&lt;mspace width="1em"&gt;&lt;/mspace&gt;&lt;mspace width="1em"&gt;&lt;/mspace&gt;&lt;mtext&gt;insert &lt;/mtext&gt;&lt;mi&gt;A&lt;/mi&gt;&lt;mo stretchy="false"&gt;[&lt;/mo&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;mo stretchy="false"&gt;]&lt;/mo&gt;&lt;mtext&gt; into bucket &lt;/mtext&gt;&lt;mi&gt;B&lt;/mi&gt;&lt;mo stretchy="false"&gt;[&lt;/mo&gt;&lt;mtext&gt; &lt;/mtext&gt;&lt;mo stretchy="false"&gt;⌊&lt;/mo&gt;&lt;mtext&gt; &lt;/mtext&gt;&lt;mi&gt;n&lt;/mi&gt;&lt;mo&gt;×&lt;/mo&gt;&lt;mi&gt;A&lt;/mi&gt;&lt;mo stretchy="false"&gt;[&lt;/mo&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;mo stretchy="false"&gt;]&lt;/mo&gt;&lt;mtext&gt; &lt;/mtext&gt;&lt;mo stretchy="false"&gt;⌋&lt;/mo&gt;&lt;mtext&gt; &lt;/mtext&gt;&lt;mo stretchy="false"&gt;]&lt;/mo&gt;&lt;/mrow&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;/mtr&gt;&lt;mtr&gt;&lt;mtd&gt;&lt;mstyle displaystyle="true" scriptlevel="0"&gt;&lt;mrow&gt;&lt;/mrow&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;mtd&gt;&lt;mstyle displaystyle="true" scriptlevel="0"&gt;&lt;mrow&gt;&lt;mrow&gt;&lt;/mrow&gt;&lt;mspace width="1em"&gt;&lt;/mspace&gt;&lt;mn&gt;5.&lt;/mn&gt;&lt;mspace width="1em"&gt;&lt;/mspace&gt;&lt;mtext&gt;sort each bucket&lt;/mtext&gt;&lt;/mrow&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;/mtr&gt;&lt;mtr&gt;&lt;mtd&gt;&lt;mstyle displaystyle="true" scriptlevel="0"&gt;&lt;mrow&gt;&lt;/mrow&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;mtd&gt;&lt;mstyle displaystyle="true" scriptlevel="0"&gt;&lt;mrow&gt;&lt;mrow&gt;&lt;/mrow&gt;&lt;mspace width="1em"&gt;&lt;/mspace&gt;&lt;mn&gt;6.&lt;/mn&gt;&lt;mspace width="1em"&gt;&lt;/mspace&gt;&lt;mtext&gt;concatenate sorted buckets&lt;/mtext&gt;&lt;/mrow&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;/mtr&gt;&lt;/mtable&gt;&lt;annotation encoding="application/x-tex"&gt;
\begin{aligned}
&amp;amp;\textbf{BUCKETSORT}(A) \\
&amp;amp;\quad 1. \quad n = A.length \\
&amp;amp;\quad 2. \quad \text{buckets } B[0 \dots n - 1] \\
&amp;amp;\quad 3. \quad \textbf{for } i = 1 \text{ to } n \textbf{ do} \\
&amp;amp;\quad 4. \quad\quad \text{insert } A[i] \text{ into bucket } B[ \ \lfloor \ n \times A[i] \ \rfloor \ ] \\
&amp;amp;\quad 5. \quad \text{sort each bucket} \\
&amp;amp;\quad 6. \quad \text{concatenate sorted buckets}
\end{aligned}
&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:10.500000000000004em;vertical-align:-5.000000000000002em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mtable"&gt;&lt;span class="col-align-r"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:5.500000000000001em;"&gt;&lt;span style="top:-7.500000000000001em;"&gt;&lt;span class="pstrut" style="height:2.84em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-6em;"&gt;&lt;span class="pstrut" style="height:2.84em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-4.499999999999999em;"&gt;&lt;span class="pstrut" style="height:2.84em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-2.999999999999999em;"&gt;&lt;span class="pstrut" style="height:2.84em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-1.4999999999999991em;"&gt;&lt;span class="pstrut" style="height:2.84em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:1.7763568394002505e-15em;"&gt;&lt;span class="pstrut" style="height:2.84em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:1.5000000000000018em;"&gt;&lt;span class="pstrut" style="height:2.84em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:5.000000000000002em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="col-align-l"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:5.500000000000001em;"&gt;&lt;span style="top:-7.660000000000001em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;&lt;/span&gt;&lt;span class="mord text"&gt;&lt;span class="mord textbf"&gt;BUCKETSORT&lt;/span&gt;&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord mathdefault"&gt;A&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-6.16em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:1em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;1&lt;/span&gt;&lt;span class="mord"&gt;.&lt;/span&gt;&lt;span class="mspace" style="margin-right:1em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;n&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;A&lt;/span&gt;&lt;span class="mord"&gt;.&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.01968em;"&gt;l&lt;/span&gt;&lt;span class="mord mathdefault"&gt;e&lt;/span&gt;&lt;span class="mord mathdefault"&gt;n&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.03588em;"&gt;g&lt;/span&gt;&lt;span class="mord mathdefault"&gt;t&lt;/span&gt;&lt;span class="mord mathdefault"&gt;h&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-4.659999999999999em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:1em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;2&lt;/span&gt;&lt;span class="mord"&gt;.&lt;/span&gt;&lt;span class="mspace" style="margin-right:1em;"&gt;&lt;/span&gt;&lt;span class="mord text"&gt;&lt;span class="mord"&gt;buckets &lt;/span&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.05017em;"&gt;B&lt;/span&gt;&lt;span class="mopen"&gt;[&lt;/span&gt;&lt;span class="mord"&gt;0&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="minner"&gt;…&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;n&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;−&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;1&lt;/span&gt;&lt;span class="mclose"&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-3.1599999999999993em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:1em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;3&lt;/span&gt;&lt;span class="mord"&gt;.&lt;/span&gt;&lt;span class="mspace" style="margin-right:1em;"&gt;&lt;/span&gt;&lt;span class="mord text"&gt;&lt;span class="mord textbf"&gt;for &lt;/span&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;i&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;1&lt;/span&gt;&lt;span class="mord text"&gt;&lt;span class="mord"&gt; to &lt;/span&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;n&lt;/span&gt;&lt;span class="mord text"&gt;&lt;span class="mord textbf"&gt; do&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-1.6599999999999993em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:1em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;4&lt;/span&gt;&lt;span class="mord"&gt;.&lt;/span&gt;&lt;span class="mspace" style="margin-right:1em;"&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:1em;"&gt;&lt;/span&gt;&lt;span class="mord text"&gt;&lt;span class="mord"&gt;insert &lt;/span&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;A&lt;/span&gt;&lt;span class="mopen"&gt;[&lt;/span&gt;&lt;span class="mord mathdefault"&gt;i&lt;/span&gt;&lt;span class="mclose"&gt;]&lt;/span&gt;&lt;span class="mord text"&gt;&lt;span class="mord"&gt; into bucket &lt;/span&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.05017em;"&gt;B&lt;/span&gt;&lt;span class="mopen"&gt;[&lt;/span&gt;&lt;span class="mspace"&gt; &lt;/span&gt;&lt;span class="mopen"&gt;⌊&lt;/span&gt;&lt;span class="mspace"&gt; &lt;/span&gt;&lt;span class="mord mathdefault"&gt;n&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;×&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;A&lt;/span&gt;&lt;span class="mopen"&gt;[&lt;/span&gt;&lt;span class="mord mathdefault"&gt;i&lt;/span&gt;&lt;span class="mclose"&gt;]&lt;/span&gt;&lt;span class="mspace"&gt; &lt;/span&gt;&lt;span class="mclose"&gt;⌋&lt;/span&gt;&lt;span class="mspace"&gt; &lt;/span&gt;&lt;span class="mclose"&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-0.15999999999999837em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:1em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;5&lt;/span&gt;&lt;span class="mord"&gt;.&lt;/span&gt;&lt;span class="mspace" style="margin-right:1em;"&gt;&lt;/span&gt;&lt;span class="mord text"&gt;&lt;span class="mord"&gt;sort each bucket&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:1.3400000000000016em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:1em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;6&lt;/span&gt;&lt;span class="mord"&gt;.&lt;/span&gt;&lt;span class="mspace" style="margin-right:1em;"&gt;&lt;/span&gt;&lt;span class="mord text"&gt;&lt;span class="mord"&gt;concatenate sorted buckets&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:5.000000000000002em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h2 id="code"&gt;Code&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;numpy&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;as&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;np&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;bucket_sort&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;arr&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;num_buckets&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;buckets&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[[]&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;num_buckets&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;

    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;num&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;arr&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;index&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;num_buckets&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;num&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;buckets&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;num&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;bucket&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;buckets&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;bucket&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sort&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

    &lt;span class="n"&gt;sorted_arr&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;num&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;bucket&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;buckets&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;num&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;bucket&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;sorted_arr&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2 id="simple-step-by-step-example"&gt;Simple step-by-step example&lt;/h2&gt;
&lt;p&gt;Given array: &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mo stretchy="false"&gt;[&lt;/mo&gt;&lt;mn&gt;0.78&lt;/mn&gt;&lt;mo separator="true"&gt;,&lt;/mo&gt;&lt;mn&gt;0.17&lt;/mn&gt;&lt;mo separator="true"&gt;,&lt;/mo&gt;&lt;mn&gt;0.39&lt;/mn&gt;&lt;mo separator="true"&gt;,&lt;/mo&gt;&lt;mn&gt;0.26&lt;/mn&gt;&lt;mo separator="true"&gt;,&lt;/mo&gt;&lt;mn&gt;0.72&lt;/mn&gt;&lt;mo stretchy="false"&gt;]&lt;/mo&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;[0.78, 0.17, 0.39, 0.26, 0.72]&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1em;vertical-align:-0.25em;"&gt;&lt;/span&gt;&lt;span class="mopen"&gt;[&lt;/span&gt;&lt;span class="mord"&gt;0&lt;/span&gt;&lt;span class="mord"&gt;.&lt;/span&gt;&lt;span class="mord"&gt;7&lt;/span&gt;&lt;span class="mord"&gt;8&lt;/span&gt;&lt;span class="mpunct"&gt;,&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;0&lt;/span&gt;&lt;span class="mord"&gt;.&lt;/span&gt;&lt;span class="mord"&gt;1&lt;/span&gt;&lt;span class="mord"&gt;7&lt;/span&gt;&lt;span class="mpunct"&gt;,&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;0&lt;/span&gt;&lt;span class="mord"&gt;.&lt;/span&gt;&lt;span class="mord"&gt;3&lt;/span&gt;&lt;span class="mord"&gt;9&lt;/span&gt;&lt;span class="mpunct"&gt;,&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;0&lt;/span&gt;&lt;span class="mord"&gt;.&lt;/span&gt;&lt;span class="mord"&gt;2&lt;/span&gt;&lt;span class="mord"&gt;6&lt;/span&gt;&lt;span class="mpunct"&gt;,&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;0&lt;/span&gt;&lt;span class="mord"&gt;.&lt;/span&gt;&lt;span class="mord"&gt;7&lt;/span&gt;&lt;span class="mord"&gt;2&lt;/span&gt;&lt;span class="mclose"&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;, using 5 buckets.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Create 5 empty buckets&lt;/li&gt;
&lt;li&gt;Place each number in appropriate bucket based on value range:&lt;/li&gt;
&lt;li&gt;Bucket 0 [0.0-0.2]: 0.17&lt;/li&gt;
&lt;li&gt;Bucket 1 [0.2-0.4]: 0.26, 0.39&lt;/li&gt;
&lt;li&gt;Bucket 2 [0.4-0.6]: empty&lt;/li&gt;
&lt;li&gt;Bucket 3 [0.6-0.8]: 0.72, 0.78&lt;/li&gt;
&lt;li&gt;Bucket 4 [0.8-1.0]: empty&lt;/li&gt;
&lt;li&gt;Sort each bucket individually&lt;/li&gt;
&lt;li&gt;Concatenate buckets: &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mo stretchy="false"&gt;[&lt;/mo&gt;&lt;mn&gt;0.17&lt;/mn&gt;&lt;mo separator="true"&gt;,&lt;/mo&gt;&lt;mn&gt;0.26&lt;/mn&gt;&lt;mo separator="true"&gt;,&lt;/mo&gt;&lt;mn&gt;0.39&lt;/mn&gt;&lt;mo separator="true"&gt;,&lt;/mo&gt;&lt;mn&gt;0.72&lt;/mn&gt;&lt;mo separator="true"&gt;,&lt;/mo&gt;&lt;mn&gt;0.78&lt;/mn&gt;&lt;mo stretchy="false"&gt;]&lt;/mo&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;[0.17, 0.26, 0.39, 0.72, 0.78]&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1em;vertical-align:-0.25em;"&gt;&lt;/span&gt;&lt;span class="mopen"&gt;[&lt;/span&gt;&lt;span class="mord"&gt;0&lt;/span&gt;&lt;span class="mord"&gt;.&lt;/span&gt;&lt;span class="mord"&gt;1&lt;/span&gt;&lt;span class="mord"&gt;7&lt;/span&gt;&lt;span class="mpunct"&gt;,&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;0&lt;/span&gt;&lt;span class="mord"&gt;.&lt;/span&gt;&lt;span class="mord"&gt;2&lt;/span&gt;&lt;span class="mord"&gt;6&lt;/span&gt;&lt;span class="mpunct"&gt;,&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;0&lt;/span&gt;&lt;span class="mord"&gt;.&lt;/span&gt;&lt;span class="mord"&gt;3&lt;/span&gt;&lt;span class="mord"&gt;9&lt;/span&gt;&lt;span class="mpunct"&gt;,&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;0&lt;/span&gt;&lt;span class="mord"&gt;.&lt;/span&gt;&lt;span class="mord"&gt;7&lt;/span&gt;&lt;span class="mord"&gt;2&lt;/span&gt;&lt;span class="mpunct"&gt;,&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;0&lt;/span&gt;&lt;span class="mord"&gt;.&lt;/span&gt;&lt;span class="mord"&gt;7&lt;/span&gt;&lt;span class="mord"&gt;8&lt;/span&gt;&lt;span class="mclose"&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="visualisation"&gt;Visualisation&lt;/h2&gt;
&lt;p&gt;&lt;img src="data:image/svg+xml;base64,PHN2ZyBhcmlhLXJvbGVkZXNjcmlwdGlvbj0iZmxvd2NoYXJ0LXYyIiByb2xlPSJncmFwaGljcy1kb2N1bWVudCBkb2N1bWVudCIgdmlld0JveD0iLTggLTggOTU0LjIzNDM3NSAzMDIiIHN0eWxlPSJtYXgtd2lkdGg6IDk1NC4yMzRweDsgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7IiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB3aWR0aD0iMTAwJSIgaWQ9Im15LXN2ZyI+PHN0eWxlPiNteS1zdmd7Zm9udC1mYW1pbHk6InRyZWJ1Y2hldCBtcyIsdmVyZGFuYSxhcmlhbCxzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNnB4O2ZpbGw6IzMzMzt9I215LXN2ZyAuZXJyb3ItaWNvbntmaWxsOiM1NTIyMjI7fSNteS1zdmcgLmVycm9yLXRleHR7ZmlsbDojNTUyMjIyO3N0cm9rZTojNTUyMjIyO30jbXktc3ZnIC5lZGdlLXRoaWNrbmVzcy1ub3JtYWx7c3Ryb2tlLXdpZHRoOjJweDt9I215LXN2ZyAuZWRnZS10aGlja25lc3MtdGhpY2t7c3Ryb2tlLXdpZHRoOjMuNXB4O30jbXktc3ZnIC5lZGdlLXBhdHRlcm4tc29saWR7c3Ryb2tlLWRhc2hhcnJheTowO30jbXktc3ZnIC5lZGdlLXBhdHRlcm4tZGFzaGVke3N0cm9rZS1kYXNoYXJyYXk6Mzt9I215LXN2ZyAuZWRnZS1wYXR0ZXJuLWRvdHRlZHtzdHJva2UtZGFzaGFycmF5OjI7fSNteS1zdmcgLm1hcmtlcntmaWxsOiMzMzMzMzM7c3Ryb2tlOiMzMzMzMzM7fSNteS1zdmcgLm1hcmtlci5jcm9zc3tzdHJva2U6IzMzMzMzMzt9I215LXN2ZyBzdmd7Zm9udC1mYW1pbHk6InRyZWJ1Y2hldCBtcyIsdmVyZGFuYSxhcmlhbCxzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNnB4O30jbXktc3ZnIC5sYWJlbHtmb250LWZhbWlseToidHJlYnVjaGV0IG1zIix2ZXJkYW5hLGFyaWFsLHNhbnMtc2VyaWY7Y29sb3I6IzMzMzt9I215LXN2ZyAuY2x1c3Rlci1sYWJlbCB0ZXh0e2ZpbGw6IzMzMzt9I215LXN2ZyAuY2x1c3Rlci1sYWJlbCBzcGFuLCNteS1zdmcgcHtjb2xvcjojMzMzO30jbXktc3ZnIC5sYWJlbCB0ZXh0LCNteS1zdmcgc3BhbiwjbXktc3ZnIHB7ZmlsbDojMzMzO2NvbG9yOiMzMzM7fSNteS1zdmcgLm5vZGUgcmVjdCwjbXktc3ZnIC5ub2RlIGNpcmNsZSwjbXktc3ZnIC5ub2RlIGVsbGlwc2UsI215LXN2ZyAubm9kZSBwb2x5Z29uLCNteS1zdmcgLm5vZGUgcGF0aHtmaWxsOiNFQ0VDRkY7c3Ryb2tlOiM5MzcwREI7c3Ryb2tlLXdpZHRoOjFweDt9I215LXN2ZyAuZmxvd2NoYXJ0LWxhYmVsIHRleHR7dGV4dC1hbmNob3I6bWlkZGxlO30jbXktc3ZnIC5ub2RlIC5rYXRleCBwYXRoe2ZpbGw6IzAwMDtzdHJva2U6IzAwMDtzdHJva2Utd2lkdGg6MXB4O30jbXktc3ZnIC5ub2RlIC5sYWJlbHt0ZXh0LWFsaWduOmNlbnRlcjt9I215LXN2ZyAubm9kZS5jbGlja2FibGV7Y3Vyc29yOnBvaW50ZXI7fSNteS1zdmcgLmFycm93aGVhZFBhdGh7ZmlsbDojMzMzMzMzO30jbXktc3ZnIC5lZGdlUGF0aCAucGF0aHtzdHJva2U6IzMzMzMzMztzdHJva2Utd2lkdGg6Mi4wcHg7fSNteS1zdmcgLmZsb3djaGFydC1saW5re3N0cm9rZTojMzMzMzMzO2ZpbGw6bm9uZTt9I215LXN2ZyAuZWRnZUxhYmVse2JhY2tncm91bmQtY29sb3I6I2U4ZThlODt0ZXh0LWFsaWduOmNlbnRlcjt9I215LXN2ZyAuZWRnZUxhYmVsIHJlY3R7b3BhY2l0eTowLjU7YmFja2dyb3VuZC1jb2xvcjojZThlOGU4O2ZpbGw6I2U4ZThlODt9I215LXN2ZyAubGFiZWxCa2d7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDIzMiwgMjMyLCAyMzIsIDAuNSk7fSNteS1zdmcgLmNsdXN0ZXIgcmVjdHtmaWxsOiNmZmZmZGU7c3Ryb2tlOiNhYWFhMzM7c3Ryb2tlLXdpZHRoOjFweDt9I215LXN2ZyAuY2x1c3RlciB0ZXh0e2ZpbGw6IzMzMzt9I215LXN2ZyAuY2x1c3RlciBzcGFuLCNteS1zdmcgcHtjb2xvcjojMzMzO30jbXktc3ZnIGRpdi5tZXJtYWlkVG9vbHRpcHtwb3NpdGlvbjphYnNvbHV0ZTt0ZXh0LWFsaWduOmNlbnRlcjttYXgtd2lkdGg6MjAwcHg7cGFkZGluZzoycHg7Zm9udC1mYW1pbHk6InRyZWJ1Y2hldCBtcyIsdmVyZGFuYSxhcmlhbCxzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMnB4O2JhY2tncm91bmQ6aHNsKDgwLCAxMDAlLCA5Ni4yNzQ1MDk4MDM5JSk7Ym9yZGVyOjFweCBzb2xpZCAjYWFhYTMzO2JvcmRlci1yYWRpdXM6MnB4O3BvaW50ZXItZXZlbnRzOm5vbmU7ei1pbmRleDoxMDA7fSNteS1zdmcgLmZsb3djaGFydFRpdGxlVGV4dHt0ZXh0LWFuY2hvcjptaWRkbGU7Zm9udC1zaXplOjE4cHg7ZmlsbDojMzMzO30jbXktc3ZnIDpyb290ey0tbWVybWFpZC1mb250LWZhbWlseToidHJlYnVjaGV0IG1zIix2ZXJkYW5hLGFyaWFsLHNhbnMtc2VyaWY7fTwvc3R5bGU+PGc+PG1hcmtlciBvcmllbnQ9ImF1dG8iIG1hcmtlckhlaWdodD0iMTIiIG1hcmtlcldpZHRoPSIxMiIgbWFya2VyVW5pdHM9InVzZXJTcGFjZU9uVXNlIiByZWZZPSI1IiByZWZYPSI2IiB2aWV3Qm94PSIwIDAgMTAgMTAiIGNsYXNzPSJtYXJrZXIgZmxvd2NoYXJ0IiBpZD0ibXktc3ZnX2Zsb3djaGFydC1wb2ludEVuZCI+PHBhdGggc3R5bGU9InN0cm9rZS13aWR0aDogMTsgc3Ryb2tlLWRhc2hhcnJheTogMSwgMDsiIGNsYXNzPSJhcnJvd01hcmtlclBhdGgiIGQ9Ik0gMCAwIEwgMTAgNSBMIDAgMTAgeiIvPjwvbWFya2VyPjxtYXJrZXIgb3JpZW50PSJhdXRvIiBtYXJrZXJIZWlnaHQ9IjEyIiBtYXJrZXJXaWR0aD0iMTIiIG1hcmtlclVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgcmVmWT0iNSIgcmVmWD0iNC41IiB2aWV3Qm94PSIwIDAgMTAgMTAiIGNsYXNzPSJtYXJrZXIgZmxvd2NoYXJ0IiBpZD0ibXktc3ZnX2Zsb3djaGFydC1wb2ludFN0YXJ0Ij48cGF0aCBzdHlsZT0ic3Ryb2tlLXdpZHRoOiAxOyBzdHJva2UtZGFzaGFycmF5OiAxLCAwOyIgY2xhc3M9ImFycm93TWFya2VyUGF0aCIgZD0iTSAwIDUgTCAxMCAxMCBMIDEwIDAgeiIvPjwvbWFya2VyPjxtYXJrZXIgb3JpZW50PSJhdXRvIiBtYXJrZXJIZWlnaHQ9IjExIiBtYXJrZXJXaWR0aD0iMTEiIG1hcmtlclVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgcmVmWT0iNSIgcmVmWD0iMTEiIHZpZXdCb3g9IjAgMCAxMCAxMCIgY2xhc3M9Im1hcmtlciBmbG93Y2hhcnQiIGlkPSJteS1zdmdfZmxvd2NoYXJ0LWNpcmNsZUVuZCI+PGNpcmNsZSBzdHlsZT0ic3Ryb2tlLXdpZHRoOiAxOyBzdHJva2UtZGFzaGFycmF5OiAxLCAwOyIgY2xhc3M9ImFycm93TWFya2VyUGF0aCIgcj0iNSIgY3k9IjUiIGN4PSI1Ii8+PC9tYXJrZXI+PG1hcmtlciBvcmllbnQ9ImF1dG8iIG1hcmtlckhlaWdodD0iMTEiIG1hcmtlcldpZHRoPSIxMSIgbWFya2VyVW5pdHM9InVzZXJTcGFjZU9uVXNlIiByZWZZPSI1IiByZWZYPSItMSIgdmlld0JveD0iMCAwIDEwIDEwIiBjbGFzcz0ibWFya2VyIGZsb3djaGFydCIgaWQ9Im15LXN2Z19mbG93Y2hhcnQtY2lyY2xlU3RhcnQiPjxjaXJjbGUgc3R5bGU9InN0cm9rZS13aWR0aDogMTsgc3Ryb2tlLWRhc2hhcnJheTogMSwgMDsiIGNsYXNzPSJhcnJvd01hcmtlclBhdGgiIHI9IjUiIGN5PSI1IiBjeD0iNSIvPjwvbWFya2VyPjxtYXJrZXIgb3JpZW50PSJhdXRvIiBtYXJrZXJIZWlnaHQ9IjExIiBtYXJrZXJXaWR0aD0iMTEiIG1hcmtlclVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgcmVmWT0iNS4yIiByZWZYPSIxMiIgdmlld0JveD0iMCAwIDExIDExIiBjbGFzcz0ibWFya2VyIGNyb3NzIGZsb3djaGFydCIgaWQ9Im15LXN2Z19mbG93Y2hhcnQtY3Jvc3NFbmQiPjxwYXRoIHN0eWxlPSJzdHJva2Utd2lkdGg6IDI7IHN0cm9rZS1kYXNoYXJyYXk6IDEsIDA7IiBjbGFzcz0iYXJyb3dNYXJrZXJQYXRoIiBkPSJNIDEsMSBsIDksOSBNIDEwLDEgbCAtOSw5Ii8+PC9tYXJrZXI+PG1hcmtlciBvcmllbnQ9ImF1dG8iIG1hcmtlckhlaWdodD0iMTEiIG1hcmtlcldpZHRoPSIxMSIgbWFya2VyVW5pdHM9InVzZXJTcGFjZU9uVXNlIiByZWZZPSI1LjIiIHJlZlg9Ii0xIiB2aWV3Qm94PSIwIDAgMTEgMTEiIGNsYXNzPSJtYXJrZXIgY3Jvc3MgZmxvd2NoYXJ0IiBpZD0ibXktc3ZnX2Zsb3djaGFydC1jcm9zc1N0YXJ0Ij48cGF0aCBzdHlsZT0ic3Ryb2tlLXdpZHRoOiAyOyBzdHJva2UtZGFzaGFycmF5OiAxLCAwOyIgY2xhc3M9ImFycm93TWFya2VyUGF0aCIgZD0iTSAxLDEgbCA5LDkgTSAxMCwxIGwgLTksOSIvPjwvbWFya2VyPjxnIGNsYXNzPSJyb290Ij48ZyBjbGFzcz0iY2x1c3RlcnMiLz48ZyBjbGFzcz0iZWRnZVBhdGhzIj48cGF0aCBtYXJrZXItZW5kPSJ1cmwoI215LXN2Z19mbG93Y2hhcnQtcG9pbnRFbmQpIiBzdHlsZT0iZmlsbDpub25lOyIgY2xhc3M9ImVkZ2UtdGhpY2tuZXNzLW5vcm1hbCBlZGdlLXBhdHRlcm4tc29saWQgZmxvd2NoYXJ0LWxpbmsgTFMtQSBMRS1CIiBpZD0iTC1BLUItMCIgZD0iTTM2My43ODEsMjkuNDU5TDMxNS4xMTYsMzQuMzgyQzI2Ni40NTEsMzkuMzA2LDE2OS4xMiw0OS4xNTMsMTIwLjQ1NCw1Ny4zNkM3MS43ODksNjUuNTY3LDcxLjc4OSw3Mi4xMzMsNzEuNzg5LDc1LjQxN0w3MS43ODksNzguNyIvPjxwYXRoIG1hcmtlci1lbmQ9InVybCgjbXktc3ZnX2Zsb3djaGFydC1wb2ludEVuZCkiIHN0eWxlPSJmaWxsOm5vbmU7IiBjbGFzcz0iZWRnZS10aGlja25lc3Mtbm9ybWFsIGVkZ2UtcGF0dGVybi1zb2xpZCBmbG93Y2hhcnQtbGluayBMUy1BIExFLUMiIGlkPSJMLUEtQy0wIiBkPSJNNDA2LjUxOCwzNEwzODYuODA5LDM4LjE2N0MzNjcuMTAxLDQyLjMzMywzMjcuNjgzLDUwLjY2NywzMDcuOTc0LDU4LjExN0MyODguMjY2LDY1LjU2NywyODguMjY2LDcyLjEzMywyODguMjY2LDc1LjQxN0wyODguMjY2LDc4LjciLz48cGF0aCBtYXJrZXItZW5kPSJ1cmwoI215LXN2Z19mbG93Y2hhcnQtcG9pbnRFbmQpIiBzdHlsZT0iZmlsbDpub25lOyIgY2xhc3M9ImVkZ2UtdGhpY2tuZXNzLW5vcm1hbCBlZGdlLXBhdHRlcm4tc29saWQgZmxvd2NoYXJ0LWxpbmsgTFMtQSBMRS1EIiBpZD0iTC1BLUQtMCIgZD0iTTQ4Ni45MywzNEw0ODYuOTMsMzguMTY3QzQ4Ni45Myw0Mi4zMzMsNDg2LjkzLDUwLjY2Nyw0ODYuOTMsNTguMTE3QzQ4Ni45Myw2NS41NjcsNDg2LjkzLDcyLjEzMyw0ODYuOTMsNzUuNDE3TDQ4Ni45Myw3OC43Ii8+PHBhdGggbWFya2VyLWVuZD0idXJsKCNteS1zdmdfZmxvd2NoYXJ0LXBvaW50RW5kKSIgc3R5bGU9ImZpbGw6bm9uZTsiIGNsYXNzPSJlZGdlLXRoaWNrbmVzcy1ub3JtYWwgZWRnZS1wYXR0ZXJuLXNvbGlkIGZsb3djaGFydC1saW5rIExTLUEgTEUtRSIgaWQ9IkwtQS1FLTAiIGQ9Ik01NjcuMzQxLDM0TDU4Ny4wNSwzOC4xNjdDNjA2Ljc1OSw0Mi4zMzMsNjQ2LjE3Niw1MC42NjcsNjY1Ljg4NSw1OC4xMTdDNjg1LjU5NCw2NS41NjcsNjg1LjU5NCw3Mi4xMzMsNjg1LjU5NCw3NS40MTdMNjg1LjU5NCw3OC43Ii8+PHBhdGggbWFya2VyLWVuZD0idXJsKCNteS1zdmdfZmxvd2NoYXJ0LXBvaW50RW5kKSIgc3R5bGU9ImZpbGw6bm9uZTsiIGNsYXNzPSJlZGdlLXRoaWNrbmVzcy1ub3JtYWwgZWRnZS1wYXR0ZXJuLXNvbGlkIGZsb3djaGFydC1saW5rIExTLUEgTEUtRiIgaWQ9IkwtQS1GLTAiIGQ9Ik02MTAuMDc4LDMwLjAxOEw2NTUuNzc1LDM0Ljg0OEM3MDEuNDcxLDM5LjY3OCw3OTIuODY1LDQ5LjMzOSw4MzguNTYxLDU3LjQ1M0M4ODQuMjU4LDY1LjU2Nyw4ODQuMjU4LDcyLjEzMyw4ODQuMjU4LDc1LjQxN0w4ODQuMjU4LDc4LjciLz48cGF0aCBtYXJrZXItZW5kPSJ1cmwoI215LXN2Z19mbG93Y2hhcnQtcG9pbnRFbmQpIiBzdHlsZT0iZmlsbDpub25lOyIgY2xhc3M9ImVkZ2UtdGhpY2tuZXNzLW5vcm1hbCBlZGdlLXBhdHRlcm4tc29saWQgZmxvd2NoYXJ0LWxpbmsgTFMtQiBMRS1HIiBpZD0iTC1CLUctMCIgZD0iTTcxLjc4OSwxMThMNzEuNzg5LDEyMi4xNjdDNzEuNzg5LDEyNi4zMzMsNzEuNzg5LDEzNC42NjcsMTI3LjU2MSwxNDQuNDc2QzE4My4zMzMsMTU0LjI4NSwyOTQuODc4LDE2NS41NywzNTAuNjUsMTcxLjIxM0w0MDYuNDIyLDE3Ni44NTUiLz48cGF0aCBtYXJrZXItZW5kPSJ1cmwoI215LXN2Z19mbG93Y2hhcnQtcG9pbnRFbmQpIiBzdHlsZT0iZmlsbDpub25lOyIgY2xhc3M9ImVkZ2UtdGhpY2tuZXNzLW5vcm1hbCBlZGdlLXBhdHRlcm4tc29saWQgZmxvd2NoYXJ0LWxpbmsgTFMtQyBMRS1HIiBpZD0iTC1DLUctMCIgZD0iTTI4OC4yNjYsMTE4TDI4OC4yNjYsMTIyLjE2N0MyODguMjY2LDEyNi4zMzMsMjg4LjI2NiwxMzQuNjY3LDMwNy45NzMsMTQzQzMyNy42OCwxNTEuMzMzLDM2Ny4wOTUsMTU5LjY2NiwzODYuODAzLDE2My44MzJMNDA2LjUxLDE2Ny45OTgiLz48cGF0aCBtYXJrZXItZW5kPSJ1cmwoI215LXN2Z19mbG93Y2hhcnQtcG9pbnRFbmQpIiBzdHlsZT0iZmlsbDpub25lOyIgY2xhc3M9ImVkZ2UtdGhpY2tuZXNzLW5vcm1hbCBlZGdlLXBhdHRlcm4tc29saWQgZmxvd2NoYXJ0LWxpbmsgTFMtRCBMRS1HIiBpZD0iTC1ELUctMCIgZD0iTTQ4Ni45MywxMThMNDg2LjkzLDEyMi4xNjdDNDg2LjkzLDEyNi4zMzMsNDg2LjkzLDEzNC42NjcsNDg2LjkzLDE0Mi4xMTdDNDg2LjkzLDE0OS41NjcsNDg2LjkzLDE1Ni4xMzMsNDg2LjkzLDE1OS40MTdMNDg2LjkzLDE2Mi43Ii8+PHBhdGggbWFya2VyLWVuZD0idXJsKCNteS1zdmdfZmxvd2NoYXJ0LXBvaW50RW5kKSIgc3R5bGU9ImZpbGw6bm9uZTsiIGNsYXNzPSJlZGdlLXRoaWNrbmVzcy1ub3JtYWwgZWRnZS1wYXR0ZXJuLXNvbGlkIGZsb3djaGFydC1saW5rIExTLUUgTEUtRyIgaWQ9IkwtRS1HLTAiIGQ9Ik02ODUuNTk0LDExOEw2ODUuNTk0LDEyMi4xNjdDNjg1LjU5NCwxMjYuMzMzLDY4NS41OTQsMTM0LjY2Nyw2NjUuODg2LDE0M0M2NDYuMTc5LDE1MS4zMzMsNjA2Ljc2NCwxNTkuNjY2LDU4Ny4wNTcsMTYzLjgzMkw1NjcuMzQ5LDE2Ny45OTgiLz48cGF0aCBtYXJrZXItZW5kPSJ1cmwoI215LXN2Z19mbG93Y2hhcnQtcG9pbnRFbmQpIiBzdHlsZT0iZmlsbDpub25lOyIgY2xhc3M9ImVkZ2UtdGhpY2tuZXNzLW5vcm1hbCBlZGdlLXBhdHRlcm4tc29saWQgZmxvd2NoYXJ0LWxpbmsgTFMtRiBMRS1HIiBpZD0iTC1GLUctMCIgZD0iTTg4NC4yNTgsMTE4TDg4NC4yNTgsMTIyLjE2N0M4ODQuMjU4LDEyNi4zMzMsODg0LjI1OCwxMzQuNjY3LDgzMS40NTQsMTQ0LjQxNUM3NzguNjUsMTU0LjE2Myw2NzMuMDQyLDE2NS4zMjcsNjIwLjIzOSwxNzAuOTA4TDU2Ny40MzUsMTc2LjQ5Ii8+PHBhdGggbWFya2VyLWVuZD0idXJsKCNteS1zdmdfZmxvd2NoYXJ0LXBvaW50RW5kKSIgc3R5bGU9ImZpbGw6bm9uZTsiIGNsYXNzPSJlZGdlLXRoaWNrbmVzcy1ub3JtYWwgZWRnZS1wYXR0ZXJuLXNvbGlkIGZsb3djaGFydC1saW5rIExTLUcgTEUtSCIgaWQ9IkwtRy1ILTAiIGQ9Ik00ODYuOTMsMjAyTDQ4Ni45MywyMDYuMTY3QzQ4Ni45MywyMTAuMzMzLDQ4Ni45MywyMTguNjY3LDQ4Ni45MywyMjYuMTE3QzQ4Ni45MywyMzMuNTY3LDQ4Ni45MywyNDAuMTMzLDQ4Ni45MywyNDMuNDE3TDQ4Ni45MywyNDYuNyIvPjwvZz48ZyBjbGFzcz0iZWRnZUxhYmVscyI+PGcgY2xhc3M9ImVkZ2VMYWJlbCI+PGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCwgMCkiIGNsYXNzPSJsYWJlbCI+PGZvcmVpZ25PYmplY3QgaGVpZ2h0PSIwIiB3aWR0aD0iMCI+PGRpdiBzdHlsZT0iZGlzcGxheTogaW5saW5lLWJsb2NrOyB3aGl0ZS1zcGFjZTogbm93cmFwOyIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPjxzcGFuIGNsYXNzPSJlZGdlTGFiZWwiPjwvc3Bhbj48L2Rpdj48L2ZvcmVpZ25PYmplY3Q+PC9nPjwvZz48ZyBjbGFzcz0iZWRnZUxhYmVsIj48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLCAwKSIgY2xhc3M9ImxhYmVsIj48Zm9yZWlnbk9iamVjdCBoZWlnaHQ9IjAiIHdpZHRoPSIwIj48ZGl2IHN0eWxlPSJkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IHdoaXRlLXNwYWNlOiBub3dyYXA7IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+PHNwYW4gY2xhc3M9ImVkZ2VMYWJlbCI+PC9zcGFuPjwvZGl2PjwvZm9yZWlnbk9iamVjdD48L2c+PC9nPjxnIGNsYXNzPSJlZGdlTGFiZWwiPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAsIDApIiBjbGFzcz0ibGFiZWwiPjxmb3JlaWduT2JqZWN0IGhlaWdodD0iMCIgd2lkdGg9IjAiPjxkaXYgc3R5bGU9ImRpc3BsYXk6IGlubGluZS1ibG9jazsgd2hpdGUtc3BhY2U6IG5vd3JhcDsiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj48c3BhbiBjbGFzcz0iZWRnZUxhYmVsIj48L3NwYW4+PC9kaXY+PC9mb3JlaWduT2JqZWN0PjwvZz48L2c+PGcgY2xhc3M9ImVkZ2VMYWJlbCI+PGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCwgMCkiIGNsYXNzPSJsYWJlbCI+PGZvcmVpZ25PYmplY3QgaGVpZ2h0PSIwIiB3aWR0aD0iMCI+PGRpdiBzdHlsZT0iZGlzcGxheTogaW5saW5lLWJsb2NrOyB3aGl0ZS1zcGFjZTogbm93cmFwOyIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPjxzcGFuIGNsYXNzPSJlZGdlTGFiZWwiPjwvc3Bhbj48L2Rpdj48L2ZvcmVpZ25PYmplY3Q+PC9nPjwvZz48ZyBjbGFzcz0iZWRnZUxhYmVsIj48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLCAwKSIgY2xhc3M9ImxhYmVsIj48Zm9yZWlnbk9iamVjdCBoZWlnaHQ9IjAiIHdpZHRoPSIwIj48ZGl2IHN0eWxlPSJkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IHdoaXRlLXNwYWNlOiBub3dyYXA7IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+PHNwYW4gY2xhc3M9ImVkZ2VMYWJlbCI+PC9zcGFuPjwvZGl2PjwvZm9yZWlnbk9iamVjdD48L2c+PC9nPjxnIGNsYXNzPSJlZGdlTGFiZWwiPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAsIDApIiBjbGFzcz0ibGFiZWwiPjxmb3JlaWduT2JqZWN0IGhlaWdodD0iMCIgd2lkdGg9IjAiPjxkaXYgc3R5bGU9ImRpc3BsYXk6IGlubGluZS1ibG9jazsgd2hpdGUtc3BhY2U6IG5vd3JhcDsiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj48c3BhbiBjbGFzcz0iZWRnZUxhYmVsIj48L3NwYW4+PC9kaXY+PC9mb3JlaWduT2JqZWN0PjwvZz48L2c+PGcgY2xhc3M9ImVkZ2VMYWJlbCI+PGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCwgMCkiIGNsYXNzPSJsYWJlbCI+PGZvcmVpZ25PYmplY3QgaGVpZ2h0PSIwIiB3aWR0aD0iMCI+PGRpdiBzdHlsZT0iZGlzcGxheTogaW5saW5lLWJsb2NrOyB3aGl0ZS1zcGFjZTogbm93cmFwOyIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPjxzcGFuIGNsYXNzPSJlZGdlTGFiZWwiPjwvc3Bhbj48L2Rpdj48L2ZvcmVpZ25PYmplY3Q+PC9nPjwvZz48ZyBjbGFzcz0iZWRnZUxhYmVsIj48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLCAwKSIgY2xhc3M9ImxhYmVsIj48Zm9yZWlnbk9iamVjdCBoZWlnaHQ9IjAiIHdpZHRoPSIwIj48ZGl2IHN0eWxlPSJkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IHdoaXRlLXNwYWNlOiBub3dyYXA7IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+PHNwYW4gY2xhc3M9ImVkZ2VMYWJlbCI+PC9zcGFuPjwvZGl2PjwvZm9yZWlnbk9iamVjdD48L2c+PC9nPjxnIGNsYXNzPSJlZGdlTGFiZWwiPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAsIDApIiBjbGFzcz0ibGFiZWwiPjxmb3JlaWduT2JqZWN0IGhlaWdodD0iMCIgd2lkdGg9IjAiPjxkaXYgc3R5bGU9ImRpc3BsYXk6IGlubGluZS1ibG9jazsgd2hpdGUtc3BhY2U6IG5vd3JhcDsiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj48c3BhbiBjbGFzcz0iZWRnZUxhYmVsIj48L3NwYW4+PC9kaXY+PC9mb3JlaWduT2JqZWN0PjwvZz48L2c+PGcgY2xhc3M9ImVkZ2VMYWJlbCI+PGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCwgMCkiIGNsYXNzPSJsYWJlbCI+PGZvcmVpZ25PYmplY3QgaGVpZ2h0PSIwIiB3aWR0aD0iMCI+PGRpdiBzdHlsZT0iZGlzcGxheTogaW5saW5lLWJsb2NrOyB3aGl0ZS1zcGFjZTogbm93cmFwOyIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPjxzcGFuIGNsYXNzPSJlZGdlTGFiZWwiPjwvc3Bhbj48L2Rpdj48L2ZvcmVpZ25PYmplY3Q+PC9nPjwvZz48ZyBjbGFzcz0iZWRnZUxhYmVsIj48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLCAwKSIgY2xhc3M9ImxhYmVsIj48Zm9yZWlnbk9iamVjdCBoZWlnaHQ9IjAiIHdpZHRoPSIwIj48ZGl2IHN0eWxlPSJkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IHdoaXRlLXNwYWNlOiBub3dyYXA7IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+PHNwYW4gY2xhc3M9ImVkZ2VMYWJlbCI+PC9zcGFuPjwvZGl2PjwvZm9yZWlnbk9iamVjdD48L2c+PC9nPjwvZz48ZyBjbGFzcz0ibm9kZXMiPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDQ4Ni45Mjk2ODc1LCAxNykiIGRhdGEtaWQ9IkEiIGRhdGEtbm9kZT0idHJ1ZSIgaWQ9ImZsb3djaGFydC1BLTAiIGNsYXNzPSJub2RlIGRlZmF1bHQgZGVmYXVsdCBmbG93Y2hhcnQtbGFiZWwiPjxyZWN0IGhlaWdodD0iMzQiIHdpZHRoPSIyNDYuMjk2ODc1IiB5PSItMTciIHg9Ii0xMjMuMTQ4NDM3NSIgcnk9IjAiIHJ4PSIwIiBzdHlsZT0iIiBjbGFzcz0iYmFzaWMgbGFiZWwtY29udGFpbmVyIi8+PGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTExNS42NDg0Mzc1LCAtOS41KSIgc3R5bGU9IiIgY2xhc3M9ImxhYmVsIj48cmVjdC8+PGZvcmVpZ25PYmplY3QgaGVpZ2h0PSIxOSIgd2lkdGg9IjIzMS4yOTY4NzUiPjxkaXYgc3R5bGU9ImRpc3BsYXk6IGlubGluZS1ibG9jazsgd2hpdGUtc3BhY2U6IG5vd3JhcDsiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj48c3BhbiBjbGFzcz0ibm9kZUxhYmVsIj5bMC43OCwgMC4xNywgMC4zOSwgMC4yNiwgMC43Ml08L3NwYW4+PC9kaXY+PC9mb3JlaWduT2JqZWN0PjwvZz48L2c+PGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoNzEuNzg5MDYyNSwgMTAxKSIgZGF0YS1pZD0iQiIgZGF0YS1ub2RlPSJ0cnVlIiBpZD0iZmxvd2NoYXJ0LUItMSIgY2xhc3M9Im5vZGUgZGVmYXVsdCBkZWZhdWx0IGZsb3djaGFydC1sYWJlbCI+PHJlY3QgaGVpZ2h0PSIzNCIgd2lkdGg9IjE0My41NzgxMjUiIHk9Ii0xNyIgeD0iLTcxLjc4OTA2MjUiIHJ5PSIwIiByeD0iMCIgc3R5bGU9IiIgY2xhc3M9ImJhc2ljIGxhYmVsLWNvbnRhaW5lciIvPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKC02NC4yODkwNjI1LCAtOS41KSIgc3R5bGU9IiIgY2xhc3M9ImxhYmVsIj48cmVjdC8+PGZvcmVpZ25PYmplY3QgaGVpZ2h0PSIxOSIgd2lkdGg9IjEyOC41NzgxMjUiPjxkaXYgc3R5bGU9ImRpc3BsYXk6IGlubGluZS1ibG9jazsgd2hpdGUtc3BhY2U6IG5vd3JhcDsiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj48c3BhbiBjbGFzcz0ibm9kZUxhYmVsIj5CdWNrZXQgMDogWzAuMTddPC9zcGFuPjwvZGl2PjwvZm9yZWlnbk9iamVjdD48L2c+PC9nPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDI4OC4yNjU2MjUsIDEwMSkiIGRhdGEtaWQ9IkMiIGRhdGEtbm9kZT0idHJ1ZSIgaWQ9ImZsb3djaGFydC1DLTMiIGNsYXNzPSJub2RlIGRlZmF1bHQgZGVmYXVsdCBmbG93Y2hhcnQtbGFiZWwiPjxyZWN0IGhlaWdodD0iMzQiIHdpZHRoPSIxODkuMzc1IiB5PSItMTciIHg9Ii05NC42ODc1IiByeT0iMCIgcng9IjAiIHN0eWxlPSIiIGNsYXNzPSJiYXNpYyBsYWJlbC1jb250YWluZXIiLz48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtODcuMTg3NSwgLTkuNSkiIHN0eWxlPSIiIGNsYXNzPSJsYWJlbCI+PHJlY3QvPjxmb3JlaWduT2JqZWN0IGhlaWdodD0iMTkiIHdpZHRoPSIxNzQuMzc1Ij48ZGl2IHN0eWxlPSJkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IHdoaXRlLXNwYWNlOiBub3dyYXA7IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+PHNwYW4gY2xhc3M9Im5vZGVMYWJlbCI+QnVja2V0IDE6IFswLjI2LCAwLjM5XTwvc3Bhbj48L2Rpdj48L2ZvcmVpZ25PYmplY3Q+PC9nPjwvZz48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSg0ODYuOTI5Njg3NSwgMTAxKSIgZGF0YS1pZD0iRCIgZGF0YS1ub2RlPSJ0cnVlIiBpZD0iZmxvd2NoYXJ0LUQtNSIgY2xhc3M9Im5vZGUgZGVmYXVsdCBkZWZhdWx0IGZsb3djaGFydC1sYWJlbCI+PHJlY3QgaGVpZ2h0PSIzNCIgd2lkdGg9IjEwNy45NTMxMjUiIHk9Ii0xNyIgeD0iLTUzLjk3NjU2MjUiIHJ5PSIwIiByeD0iMCIgc3R5bGU9IiIgY2xhc3M9ImJhc2ljIGxhYmVsLWNvbnRhaW5lciIvPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKC00Ni40NzY1NjI1LCAtOS41KSIgc3R5bGU9IiIgY2xhc3M9ImxhYmVsIj48cmVjdC8+PGZvcmVpZ25PYmplY3QgaGVpZ2h0PSIxOSIgd2lkdGg9IjkyLjk1MzEyNSI+PGRpdiBzdHlsZT0iZGlzcGxheTogaW5saW5lLWJsb2NrOyB3aGl0ZS1zcGFjZTogbm93cmFwOyIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPjxzcGFuIGNsYXNzPSJub2RlTGFiZWwiPkJ1Y2tldCAyOiBbXTwvc3Bhbj48L2Rpdj48L2ZvcmVpZ25PYmplY3Q+PC9nPjwvZz48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSg2ODUuNTkzNzUsIDEwMSkiIGRhdGEtaWQ9IkUiIGRhdGEtbm9kZT0idHJ1ZSIgaWQ9ImZsb3djaGFydC1FLTciIGNsYXNzPSJub2RlIGRlZmF1bHQgZGVmYXVsdCBmbG93Y2hhcnQtbGFiZWwiPjxyZWN0IGhlaWdodD0iMzQiIHdpZHRoPSIxODkuMzc1IiB5PSItMTciIHg9Ii05NC42ODc1IiByeT0iMCIgcng9IjAiIHN0eWxlPSIiIGNsYXNzPSJiYXNpYyBsYWJlbC1jb250YWluZXIiLz48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtODcuMTg3NSwgLTkuNSkiIHN0eWxlPSIiIGNsYXNzPSJsYWJlbCI+PHJlY3QvPjxmb3JlaWduT2JqZWN0IGhlaWdodD0iMTkiIHdpZHRoPSIxNzQuMzc1Ij48ZGl2IHN0eWxlPSJkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IHdoaXRlLXNwYWNlOiBub3dyYXA7IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+PHNwYW4gY2xhc3M9Im5vZGVMYWJlbCI+QnVja2V0IDM6IFswLjcyLCAwLjc4XTwvc3Bhbj48L2Rpdj48L2ZvcmVpZ25PYmplY3Q+PC9nPjwvZz48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSg4ODQuMjU3ODEyNSwgMTAxKSIgZGF0YS1pZD0iRiIgZGF0YS1ub2RlPSJ0cnVlIiBpZD0iZmxvd2NoYXJ0LUYtOSIgY2xhc3M9Im5vZGUgZGVmYXVsdCBkZWZhdWx0IGZsb3djaGFydC1sYWJlbCI+PHJlY3QgaGVpZ2h0PSIzNCIgd2lkdGg9IjEwNy45NTMxMjUiIHk9Ii0xNyIgeD0iLTUzLjk3NjU2MjUiIHJ5PSIwIiByeD0iMCIgc3R5bGU9IiIgY2xhc3M9ImJhc2ljIGxhYmVsLWNvbnRhaW5lciIvPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKC00Ni40NzY1NjI1LCAtOS41KSIgc3R5bGU9IiIgY2xhc3M9ImxhYmVsIj48cmVjdC8+PGZvcmVpZ25PYmplY3QgaGVpZ2h0PSIxOSIgd2lkdGg9IjkyLjk1MzEyNSI+PGRpdiBzdHlsZT0iZGlzcGxheTogaW5saW5lLWJsb2NrOyB3aGl0ZS1zcGFjZTogbm93cmFwOyIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPjxzcGFuIGNsYXNzPSJub2RlTGFiZWwiPkJ1Y2tldCA0OiBbXTwvc3Bhbj48L2Rpdj48L2ZvcmVpZ25PYmplY3Q+PC9nPjwvZz48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSg0ODYuOTI5Njg3NSwgMTg1KSIgZGF0YS1pZD0iRyIgZGF0YS1ub2RlPSJ0cnVlIiBpZD0iZmxvd2NoYXJ0LUctMTEiIGNsYXNzPSJub2RlIGRlZmF1bHQgZGVmYXVsdCBmbG93Y2hhcnQtbGFiZWwiPjxyZWN0IGhlaWdodD0iMzQiIHdpZHRoPSIxNTAuNDY4NzUiIHk9Ii0xNyIgeD0iLTc1LjIzNDM3NSIgcnk9IjAiIHJ4PSIwIiBzdHlsZT0iIiBjbGFzcz0iYmFzaWMgbGFiZWwtY29udGFpbmVyIi8+PGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTY3LjczNDM3NSwgLTkuNSkiIHN0eWxlPSIiIGNsYXNzPSJsYWJlbCI+PHJlY3QvPjxmb3JlaWduT2JqZWN0IGhlaWdodD0iMTkiIHdpZHRoPSIxMzUuNDY4NzUiPjxkaXYgc3R5bGU9ImRpc3BsYXk6IGlubGluZS1ibG9jazsgd2hpdGUtc3BhY2U6IG5vd3JhcDsiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj48c3BhbiBjbGFzcz0ibm9kZUxhYmVsIj5Tb3J0IGVhY2ggYnVja2V0PC9zcGFuPjwvZGl2PjwvZm9yZWlnbk9iamVjdD48L2c+PC9nPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDQ4Ni45Mjk2ODc1LCAyNjkpIiBkYXRhLWlkPSJIIiBkYXRhLW5vZGU9InRydWUiIGlkPSJmbG93Y2hhcnQtSC0yMSIgY2xhc3M9Im5vZGUgZGVmYXVsdCBkZWZhdWx0IGZsb3djaGFydC1sYWJlbCI+PHJlY3QgaGVpZ2h0PSIzNCIgd2lkdGg9IjI0Ni4yOTY4NzUiIHk9Ii0xNyIgeD0iLTEyMy4xNDg0Mzc1IiByeT0iMCIgcng9IjAiIHN0eWxlPSIiIGNsYXNzPSJiYXNpYyBsYWJlbC1jb250YWluZXIiLz48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMTE1LjY0ODQzNzUsIC05LjUpIiBzdHlsZT0iIiBjbGFzcz0ibGFiZWwiPjxyZWN0Lz48Zm9yZWlnbk9iamVjdCBoZWlnaHQ9IjE5IiB3aWR0aD0iMjMxLjI5Njg3NSI+PGRpdiBzdHlsZT0iZGlzcGxheTogaW5saW5lLWJsb2NrOyB3aGl0ZS1zcGFjZTogbm93cmFwOyIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPjxzcGFuIGNsYXNzPSJub2RlTGFiZWwiPlswLjE3LCAwLjI2LCAwLjM5LCAwLjcyLCAwLjc4XTwvc3Bhbj48L2Rpdj48L2ZvcmVpZ25PYmplY3Q+PC9nPjwvZz48L2c+PC9nPjwvZz48L3N2Zz4="&gt;&lt;/p&gt;
&lt;h2 id="runtime-analysis"&gt;Runtime Analysis&lt;/h2&gt;
&lt;p&gt;The time complexity of bucket sort varies depending on several factors:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Average Case: &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;O&lt;/mi&gt;&lt;mo stretchy="false"&gt;(&lt;/mo&gt;&lt;mi&gt;n&lt;/mi&gt;&lt;mo&gt;+&lt;/mo&gt;&lt;mi&gt;k&lt;/mi&gt;&lt;mo stretchy="false"&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;O(n + k)&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1em;vertical-align:-0.25em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.02778em;"&gt;O&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord mathdefault"&gt;n&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;+&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1em;vertical-align:-0.25em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.03148em;"&gt;k&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Distribution of input into buckets: &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;O&lt;/mi&gt;&lt;mo stretchy="false"&gt;(&lt;/mo&gt;&lt;mi&gt;n&lt;/mi&gt;&lt;mo stretchy="false"&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;O(n)&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1em;vertical-align:-0.25em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.02778em;"&gt;O&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord mathdefault"&gt;n&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;Sorting each bucket: When input is uniformly distributed, each bucket contains approximately &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;n&lt;/mi&gt;&lt;mi mathvariant="normal"&gt;/&lt;/mi&gt;&lt;mi&gt;k&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;n/k&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1em;vertical-align:-0.25em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;n&lt;/span&gt;&lt;span class="mord"&gt;/&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.03148em;"&gt;k&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; elements&lt;/li&gt;
&lt;li&gt;With insertion sort for each bucket: &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;O&lt;/mi&gt;&lt;mo stretchy="false"&gt;(&lt;/mo&gt;&lt;mi&gt;k&lt;/mi&gt;&lt;mo&gt;∗&lt;/mo&gt;&lt;mo stretchy="false"&gt;(&lt;/mo&gt;&lt;mi&gt;n&lt;/mi&gt;&lt;mi mathvariant="normal"&gt;/&lt;/mi&gt;&lt;mi&gt;k&lt;/mi&gt;&lt;msup&gt;&lt;mo stretchy="false"&gt;)&lt;/mo&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;/msup&gt;&lt;mo stretchy="false"&gt;)&lt;/mo&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mi&gt;O&lt;/mi&gt;&lt;mo stretchy="false"&gt;(&lt;/mo&gt;&lt;msup&gt;&lt;mi&gt;n&lt;/mi&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;/msup&gt;&lt;mi mathvariant="normal"&gt;/&lt;/mi&gt;&lt;mi&gt;k&lt;/mi&gt;&lt;mo stretchy="false"&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;O(k * (n/k)^2) = O(n^2/k)&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1em;vertical-align:-0.25em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.02778em;"&gt;O&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.03148em;"&gt;k&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;∗&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1.064108em;vertical-align:-0.25em;"&gt;&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord mathdefault"&gt;n&lt;/span&gt;&lt;span class="mord"&gt;/&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.03148em;"&gt;k&lt;/span&gt;&lt;span class="mclose"&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.8141079999999999em;"&gt;&lt;span style="top:-3.063em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1.064108em;vertical-align:-0.25em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.02778em;"&gt;O&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;n&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.8141079999999999em;"&gt;&lt;span style="top:-3.063em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mord"&gt;/&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.03148em;"&gt;k&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;When &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;k&lt;/mi&gt;&lt;mo&gt;≈&lt;/mo&gt;&lt;mi&gt;n&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;k \approx n&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.69444em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.03148em;"&gt;k&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;≈&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.43056em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;n&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;, this reduces to &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;O&lt;/mi&gt;&lt;mo stretchy="false"&gt;(&lt;/mo&gt;&lt;mi&gt;n&lt;/mi&gt;&lt;mo stretchy="false"&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;O(n)&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1em;vertical-align:-0.25em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.02778em;"&gt;O&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord mathdefault"&gt;n&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Worst Case: &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;O&lt;/mi&gt;&lt;mo stretchy="false"&gt;(&lt;/mo&gt;&lt;msup&gt;&lt;mi&gt;n&lt;/mi&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;/msup&gt;&lt;mo stretchy="false"&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;O(n^2)&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1.064108em;vertical-align:-0.25em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.02778em;"&gt;O&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;n&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.8141079999999999em;"&gt;&lt;span style="top:-3.063em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;Occurs when all elements are placed in a single bucket&lt;/li&gt;
&lt;li&gt;The single bucket must then be sorted using insertion sort: &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;O&lt;/mi&gt;&lt;mo stretchy="false"&gt;(&lt;/mo&gt;&lt;msup&gt;&lt;mi&gt;n&lt;/mi&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;/msup&gt;&lt;mo stretchy="false"&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;O(n^2)&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1.064108em;vertical-align:-0.25em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.02778em;"&gt;O&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;n&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.8141079999999999em;"&gt;&lt;span style="top:-3.063em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Additional &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;O&lt;/mi&gt;&lt;mo stretchy="false"&gt;(&lt;/mo&gt;&lt;mi&gt;n&lt;/mi&gt;&lt;mo stretchy="false"&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;O(n)&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1em;vertical-align:-0.25em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.02778em;"&gt;O&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord mathdefault"&gt;n&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; overhead for bucket creation and concatenation&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Best Case: &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;O&lt;/mi&gt;&lt;mo stretchy="false"&gt;(&lt;/mo&gt;&lt;mi&gt;n&lt;/mi&gt;&lt;mo&gt;+&lt;/mo&gt;&lt;mi&gt;k&lt;/mi&gt;&lt;mo stretchy="false"&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;O(n + k)&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1em;vertical-align:-0.25em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.02778em;"&gt;O&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord mathdefault"&gt;n&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;+&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1em;vertical-align:-0.25em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.03148em;"&gt;k&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;When elements are uniformly distributed across buckets&lt;/li&gt;
&lt;li&gt;Each bucket contains approximately &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;n&lt;/mi&gt;&lt;mi mathvariant="normal"&gt;/&lt;/mi&gt;&lt;mi&gt;k&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;n/k&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1em;vertical-align:-0.25em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;n&lt;/span&gt;&lt;span class="mord"&gt;/&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.03148em;"&gt;k&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; elements&lt;/li&gt;
&lt;li&gt;Bucket creation and distribution: &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;O&lt;/mi&gt;&lt;mo stretchy="false"&gt;(&lt;/mo&gt;&lt;mi&gt;n&lt;/mi&gt;&lt;mo stretchy="false"&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;O(n)&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1em;vertical-align:-0.25em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.02778em;"&gt;O&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord mathdefault"&gt;n&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;Sorting small buckets: &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;O&lt;/mi&gt;&lt;mo stretchy="false"&gt;(&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;mo stretchy="false"&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;O(1)&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1em;vertical-align:-0.25em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.02778em;"&gt;O&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord"&gt;1&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; per bucket&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Final concatenation: &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;O&lt;/mi&gt;&lt;mo stretchy="false"&gt;(&lt;/mo&gt;&lt;mi&gt;n&lt;/mi&gt;&lt;mo stretchy="false"&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;O(n)&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1em;vertical-align:-0.25em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.02778em;"&gt;O&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord mathdefault"&gt;n&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Space Complexity: &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;O&lt;/mi&gt;&lt;mo stretchy="false"&gt;(&lt;/mo&gt;&lt;mi&gt;n&lt;/mi&gt;&lt;mo&gt;+&lt;/mo&gt;&lt;mi&gt;k&lt;/mi&gt;&lt;mo stretchy="false"&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;O(n + k)&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1em;vertical-align:-0.25em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.02778em;"&gt;O&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord mathdefault"&gt;n&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;+&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1em;vertical-align:-0.25em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.03148em;"&gt;k&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;Storage for &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;n&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;n&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.43056em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;n&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; elements across &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;k&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;k&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.69444em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.03148em;"&gt;k&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; buckets&lt;/li&gt;
&lt;li&gt;Additional space for bucket array itself&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The efficiency of bucket sort heavily depends on:
* The uniformity of input distribution
* The number of buckets chosen
* The algorithm used for sorting individual buckets&lt;/p&gt;
&lt;p&gt;When the input is known to be uniformly distributed and the number of buckets is chosen appropriately (typically &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;k&lt;/mi&gt;&lt;mo&gt;≈&lt;/mo&gt;&lt;mi&gt;n&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;k \approx n&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.69444em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.03148em;"&gt;k&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;≈&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.43056em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;n&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;), bucket sort can achieve linear time complexity, making it more efficient than comparison-based sorting algorithms which have a lower bound of &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;O&lt;/mi&gt;&lt;mo stretchy="false"&gt;(&lt;/mo&gt;&lt;mi&gt;n&lt;/mi&gt;&lt;mi&gt;log&lt;/mi&gt;&lt;mo&gt;⁡&lt;/mo&gt;&lt;mi&gt;n&lt;/mi&gt;&lt;mo stretchy="false"&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;O(n \log n)&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1em;vertical-align:-0.25em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.02778em;"&gt;O&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord mathdefault"&gt;n&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mop"&gt;lo&lt;span style="margin-right:0.01389em;"&gt;g&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;n&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;.&lt;/p&gt;</content><category term="permanent"/><category term="ComputerScience"/><category term="SortingAlgorithms"/></entry><entry><title>Temperature Scaling</title><link href="http://localhost:8000/temperature-scaling.html" rel="alternate"/><published>2025-01-14T00:00:00+10:00</published><updated>2025-01-15T00:00:00+10:00</updated><author><name>Lex Toumbourou</name></author><id>tag:localhost,2025-01-14:/temperature-scaling.html</id><summary type="html">&lt;p&gt;a parameter that controls how confident Softmax predictions are&lt;/p&gt;</summary><content type="html">&lt;p&gt;Temperature scaling controls how "confident" a model is when making predictions by adjusting the sharpness of probability distributions produced by the &lt;a href="softmax-function.html"&gt;Softmax Function&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Softmax is a function that converts a neural network's raw outputs (logits) into probabilities that sum to 1. For example, in a dog breed classifier, the model might output logits representing its confidence for different breeds, and the Softmax function would convert those into probability-like values:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;logit&lt;/th&gt;
&lt;th&gt;softmax&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Golden Retriever&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;5.23&lt;/td&gt;
&lt;td&gt;0.975007&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Labrador&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;1.54&lt;/td&gt;
&lt;td&gt;0.024348&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Husky&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;-2.37&lt;/td&gt;
&lt;td&gt;0.000488&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;German Shepherd&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;-3.50&lt;/td&gt;
&lt;td&gt;0.000158&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;The basic Softmax formula is:&lt;/p&gt;
&lt;p&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;S&lt;/mi&gt;&lt;mi&gt;o&lt;/mi&gt;&lt;mi&gt;f&lt;/mi&gt;&lt;mi&gt;t&lt;/mi&gt;&lt;mi&gt;m&lt;/mi&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;mo stretchy="false"&gt;(&lt;/mo&gt;&lt;mi&gt;l&lt;/mi&gt;&lt;mi&gt;o&lt;/mi&gt;&lt;mi&gt;g&lt;/mi&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;mi&gt;t&lt;/mi&gt;&lt;mi&gt;s&lt;/mi&gt;&lt;mo stretchy="false"&gt;)&lt;/mo&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mfrac&gt;&lt;mrow&gt;&lt;mi&gt;exp&lt;/mi&gt;&lt;mo&gt;⁡&lt;/mo&gt;&lt;mo stretchy="false"&gt;(&lt;/mo&gt;&lt;mi&gt;l&lt;/mi&gt;&lt;mi&gt;o&lt;/mi&gt;&lt;mi&gt;g&lt;/mi&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;mi&gt;t&lt;/mi&gt;&lt;mi&gt;s&lt;/mi&gt;&lt;mo stretchy="false"&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;mrow&gt;&lt;mi mathvariant="normal"&gt;Σ&lt;/mi&gt;&lt;mi&gt;exp&lt;/mi&gt;&lt;mo&gt;⁡&lt;/mo&gt;&lt;mo stretchy="false"&gt;(&lt;/mo&gt;&lt;mi&gt;l&lt;/mi&gt;&lt;mi&gt;o&lt;/mi&gt;&lt;mi&gt;g&lt;/mi&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;mi&gt;t&lt;/mi&gt;&lt;mi&gt;s&lt;/mi&gt;&lt;mo stretchy="false"&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;/mfrac&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;Softmax(logits) = \frac{\exp(logits)}{\Sigma \exp(logits)}&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1em;vertical-align:-0.25em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.05764em;"&gt;S&lt;/span&gt;&lt;span class="mord mathdefault"&gt;o&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.10764em;"&gt;f&lt;/span&gt;&lt;span class="mord mathdefault"&gt;t&lt;/span&gt;&lt;span class="mord mathdefault"&gt;m&lt;/span&gt;&lt;span class="mord mathdefault"&gt;a&lt;/span&gt;&lt;span class="mord mathdefault"&gt;x&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.01968em;"&gt;l&lt;/span&gt;&lt;span class="mord mathdefault"&gt;o&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.03588em;"&gt;g&lt;/span&gt;&lt;span class="mord mathdefault"&gt;i&lt;/span&gt;&lt;span class="mord mathdefault"&gt;t&lt;/span&gt;&lt;span class="mord mathdefault"&gt;s&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1.53em;vertical-align:-0.52em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mopen nulldelimiter"&gt;&lt;/span&gt;&lt;span class="mfrac"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:1.01em;"&gt;&lt;span style="top:-2.655em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mtight"&gt;Σ&lt;/span&gt;&lt;span class="mspace mtight" style="margin-right:0.19516666666666668em;"&gt;&lt;/span&gt;&lt;span class="mop mtight"&gt;&lt;span class="mtight"&gt;e&lt;/span&gt;&lt;span class="mtight"&gt;x&lt;/span&gt;&lt;span class="mtight"&gt;p&lt;/span&gt;&lt;/span&gt;&lt;span class="mopen mtight"&gt;(&lt;/span&gt;&lt;span class="mord mathdefault mtight" style="margin-right:0.01968em;"&gt;l&lt;/span&gt;&lt;span class="mord mathdefault mtight"&gt;o&lt;/span&gt;&lt;span class="mord mathdefault mtight" style="margin-right:0.03588em;"&gt;g&lt;/span&gt;&lt;span class="mord mathdefault mtight"&gt;i&lt;/span&gt;&lt;span class="mord mathdefault mtight"&gt;t&lt;/span&gt;&lt;span class="mord mathdefault mtight"&gt;s&lt;/span&gt;&lt;span class="mclose mtight"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-3.23em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="frac-line" style="border-bottom-width:0.04em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-3.485em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mop mtight"&gt;&lt;span class="mtight"&gt;e&lt;/span&gt;&lt;span class="mtight"&gt;x&lt;/span&gt;&lt;span class="mtight"&gt;p&lt;/span&gt;&lt;/span&gt;&lt;span class="mopen mtight"&gt;(&lt;/span&gt;&lt;span class="mord mathdefault mtight" style="margin-right:0.01968em;"&gt;l&lt;/span&gt;&lt;span class="mord mathdefault mtight"&gt;o&lt;/span&gt;&lt;span class="mord mathdefault mtight" style="margin-right:0.03588em;"&gt;g&lt;/span&gt;&lt;span class="mord mathdefault mtight"&gt;i&lt;/span&gt;&lt;span class="mord mathdefault mtight"&gt;t&lt;/span&gt;&lt;span class="mord mathdefault mtight"&gt;s&lt;/span&gt;&lt;span class="mclose mtight"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.52em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose nulldelimiter"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;By introducing a temperature parameter &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;T&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;T&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.68333em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.13889em;"&gt;T&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;, we can control how "confident" the model is in its predictions:&lt;/p&gt;
&lt;p&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;S&lt;/mi&gt;&lt;mi&gt;o&lt;/mi&gt;&lt;mi&gt;f&lt;/mi&gt;&lt;mi&gt;t&lt;/mi&gt;&lt;mi&gt;m&lt;/mi&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;mo stretchy="false"&gt;(&lt;/mo&gt;&lt;mi&gt;l&lt;/mi&gt;&lt;mi&gt;o&lt;/mi&gt;&lt;mi&gt;g&lt;/mi&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;mi&gt;t&lt;/mi&gt;&lt;mi&gt;s&lt;/mi&gt;&lt;mo separator="true"&gt;,&lt;/mo&gt;&lt;mi&gt;T&lt;/mi&gt;&lt;mo stretchy="false"&gt;)&lt;/mo&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mfrac&gt;&lt;mrow&gt;&lt;mi&gt;exp&lt;/mi&gt;&lt;mo&gt;⁡&lt;/mo&gt;&lt;mo stretchy="false"&gt;(&lt;/mo&gt;&lt;mi&gt;l&lt;/mi&gt;&lt;mi&gt;o&lt;/mi&gt;&lt;mi&gt;g&lt;/mi&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;mi&gt;t&lt;/mi&gt;&lt;mi&gt;s&lt;/mi&gt;&lt;mi mathvariant="normal"&gt;/&lt;/mi&gt;&lt;mi&gt;T&lt;/mi&gt;&lt;mo stretchy="false"&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;mrow&gt;&lt;mi mathvariant="normal"&gt;Σ&lt;/mi&gt;&lt;mi&gt;exp&lt;/mi&gt;&lt;mo&gt;⁡&lt;/mo&gt;&lt;mo stretchy="false"&gt;(&lt;/mo&gt;&lt;mi&gt;l&lt;/mi&gt;&lt;mi&gt;o&lt;/mi&gt;&lt;mi&gt;g&lt;/mi&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;mi&gt;t&lt;/mi&gt;&lt;mi&gt;s&lt;/mi&gt;&lt;mi mathvariant="normal"&gt;/&lt;/mi&gt;&lt;mi&gt;T&lt;/mi&gt;&lt;mo stretchy="false"&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;/mfrac&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;Softmax(logits, T) = \frac{\exp(logits/T)}{\Sigma \exp(logits/T)}&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1em;vertical-align:-0.25em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.05764em;"&gt;S&lt;/span&gt;&lt;span class="mord mathdefault"&gt;o&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.10764em;"&gt;f&lt;/span&gt;&lt;span class="mord mathdefault"&gt;t&lt;/span&gt;&lt;span class="mord mathdefault"&gt;m&lt;/span&gt;&lt;span class="mord mathdefault"&gt;a&lt;/span&gt;&lt;span class="mord mathdefault"&gt;x&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.01968em;"&gt;l&lt;/span&gt;&lt;span class="mord mathdefault"&gt;o&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.03588em;"&gt;g&lt;/span&gt;&lt;span class="mord mathdefault"&gt;i&lt;/span&gt;&lt;span class="mord mathdefault"&gt;t&lt;/span&gt;&lt;span class="mord mathdefault"&gt;s&lt;/span&gt;&lt;span class="mpunct"&gt;,&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.13889em;"&gt;T&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1.53em;vertical-align:-0.52em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mopen nulldelimiter"&gt;&lt;/span&gt;&lt;span class="mfrac"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:1.01em;"&gt;&lt;span style="top:-2.655em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mtight"&gt;Σ&lt;/span&gt;&lt;span class="mspace mtight" style="margin-right:0.19516666666666668em;"&gt;&lt;/span&gt;&lt;span class="mop mtight"&gt;&lt;span class="mtight"&gt;e&lt;/span&gt;&lt;span class="mtight"&gt;x&lt;/span&gt;&lt;span class="mtight"&gt;p&lt;/span&gt;&lt;/span&gt;&lt;span class="mopen mtight"&gt;(&lt;/span&gt;&lt;span class="mord mathdefault mtight" style="margin-right:0.01968em;"&gt;l&lt;/span&gt;&lt;span class="mord mathdefault mtight"&gt;o&lt;/span&gt;&lt;span class="mord mathdefault mtight" style="margin-right:0.03588em;"&gt;g&lt;/span&gt;&lt;span class="mord mathdefault mtight"&gt;i&lt;/span&gt;&lt;span class="mord mathdefault mtight"&gt;t&lt;/span&gt;&lt;span class="mord mathdefault mtight"&gt;s&lt;/span&gt;&lt;span class="mord mtight"&gt;/&lt;/span&gt;&lt;span class="mord mathdefault mtight" style="margin-right:0.13889em;"&gt;T&lt;/span&gt;&lt;span class="mclose mtight"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-3.23em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="frac-line" style="border-bottom-width:0.04em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-3.485em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mop mtight"&gt;&lt;span class="mtight"&gt;e&lt;/span&gt;&lt;span class="mtight"&gt;x&lt;/span&gt;&lt;span class="mtight"&gt;p&lt;/span&gt;&lt;/span&gt;&lt;span class="mopen mtight"&gt;(&lt;/span&gt;&lt;span class="mord mathdefault mtight" style="margin-right:0.01968em;"&gt;l&lt;/span&gt;&lt;span class="mord mathdefault mtight"&gt;o&lt;/span&gt;&lt;span class="mord mathdefault mtight" style="margin-right:0.03588em;"&gt;g&lt;/span&gt;&lt;span class="mord mathdefault mtight"&gt;i&lt;/span&gt;&lt;span class="mord mathdefault mtight"&gt;t&lt;/span&gt;&lt;span class="mord mathdefault mtight"&gt;s&lt;/span&gt;&lt;span class="mord mtight"&gt;/&lt;/span&gt;&lt;span class="mord mathdefault mtight" style="margin-right:0.13889em;"&gt;T&lt;/span&gt;&lt;span class="mclose mtight"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.52em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose nulldelimiter"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;For numerical stability, we apply temperature scaling to logits before Softmax:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;scaled_softmax&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;logits&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;temperature&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;1.0&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;scaled_logits&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;logits&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;temperature&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;softmax&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;scaled_logits&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;When &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;T&lt;/mi&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;T = 1&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.68333em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.13889em;"&gt;T&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.64444em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;, we have plain old Softmax, which maintains the original relative differences between probabilities.&lt;/p&gt;
&lt;p&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;T&lt;/mi&gt;&lt;mo&gt;&amp;lt;&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;T &amp;lt; 1&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.72243em;vertical-align:-0.0391em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.13889em;"&gt;T&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;&amp;lt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.64444em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; creates a sharper distribution, making the model more confident. The highest probability becomes even higher, and the lower probabilities become even lower. At &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;T&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;T&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.68333em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.13889em;"&gt;T&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; approaching 0, it becomes deterministic (100% confident).&lt;/p&gt;
&lt;p&gt;When &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;T&lt;/mi&gt;&lt;mo&gt;&amp;gt;&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;T &amp;gt; 1&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.72243em;vertical-align:-0.0391em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.13889em;"&gt;T&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;&amp;gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.64444em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;, it creates a flatter distribution, making the model less confident, and the differences between probabilities become smaller; predictions become more evenly distributed.&lt;/p&gt;
&lt;p&gt;Try it for yourself to see how adjusting the temperature setting affects the Softmax probabilities in a dog breed classification problem:&lt;/p&gt;
&lt;html&gt;
&lt;div style="padding: 1rem; border: 1px solid #e2e8f0; border-radius: 0.5rem; background: white; max-width: 800px"&gt;
  &lt;div style="margin-bottom: 1rem;"&gt;
    &lt;label style="display: block; font-size: 0.875rem; font-weight: 500; margin-bottom: 0.5rem;"&gt;
      Temperature: &lt;span id="tempValue"&gt;1.0&lt;/span&gt;
    &lt;/label&gt;
    &lt;input 
      type="range" 
      id="tempSlider"
      min="0.1" 
      max="10" 
      step="0.1" 
      value="1"
      style="width: 100%;"
    /&gt;
  &lt;/div&gt;
  &lt;canvas id="probabilityChart" width="600" height="300"&gt;&lt;/canvas&gt;
&lt;/div&gt;

&lt;script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/3.9.1/chart.min.js"&gt;&lt;/script&gt;
&lt;script&gt;
const logits = [5.23, 1.54, -2.37, -3.50];

function softmax(logits, temperature) {
  const scaled = logits.map(l =&gt; l/temperature);
  const expScaled = scaled.map(Math.exp);
  const sum = expScaled.reduce((a, b) =&gt; a + b, 0);
  return expScaled.map(exp =&gt; exp/sum);
}

function updateChart(temperature) {
  const probs = softmax(logits, temperature);
  const probabilities = probs.map(p =&gt; p * 100);

  if (window.myChart) {
    window.myChart.destroy();
  }

  const ctx = document.getElementById('probabilityChart').getContext('2d');
  window.myChart = new Chart(ctx, {
    type: 'bar',
    data: {
      labels: ['Golden Retriever', 'Labrador', 'Husky', 'German Shepherd'],
      datasets: [{
        label: 'Probability (%)',
        data: probabilities,
        backgroundColor: '#4299e1',
      }]
    },
    options: {
      responsive: true,
      plugins: {
        tooltip: {
          callbacks: {
            label: function(context) {
              const value = context.raw.toFixed(2);
              const logit = logits[context.dataIndex];
              return [`Probability: ${value}%`, `Logit: ${logit}`];
            }
          }
        }
      },
      scales: {
        y: {
          beginAtZero: true,
          title: {
            display: true,
            text: 'Probability (%)'
          }
        }
      }
    }
  });
}

document.addEventListener('DOMContentLoaded', function() {
  const tempSlider = document.getElementById('tempSlider');
  const tempValue = document.getElementById('tempValue');

  updateChart(1.0);

  tempSlider.addEventListener('input', function(e) {
    const temperature = parseFloat(e.target.value);
    tempValue.textContent = temperature.toFixed(1);
    updateChart(temperature);
  });
});
&lt;/script&gt;
&lt;/html&gt;

&lt;h2 id="temperature-scaling-in-language-models"&gt;Temperature Scaling in Language Models&lt;/h2&gt;
&lt;p&gt;In a &lt;a href="language-model.html"&gt;Language Model&lt;/a&gt;, which predicts a token at a time based on the previous tokens in a sequence, each token is predicted by creating a Softmax probability distribution across the vocabulary and then randomly sampling from that distribution.&lt;/p&gt;
&lt;p&gt;The temperature parameter, therefore, affects how much randomness is injected at inference time.&lt;/p&gt;
&lt;p&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;T&lt;/mi&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mn&gt;0&lt;/mn&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;T = 0&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.68333em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.13889em;"&gt;T&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.64444em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;0&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;: Deterministic, always selects the highest probability token. However, in practice, you can only approximate it with a very small temperature (since dividing by zero is undefined). Good for math, coding, and fact-based responses.&lt;/p&gt;
&lt;p&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;T&lt;/mi&gt;&lt;mo&gt;≈&lt;/mo&gt;&lt;mn&gt;0.7&lt;/mn&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;T \approx 0.7&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.68333em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.13889em;"&gt;T&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;≈&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.64444em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;0&lt;/span&gt;&lt;span class="mord"&gt;.&lt;/span&gt;&lt;span class="mord"&gt;7&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;: Balanced between coherence and creativity. Common default for chat models. Maintains context while allowing natural variation&lt;/p&gt;
&lt;p&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;T&lt;/mi&gt;&lt;mo&gt;&amp;gt;&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;T &amp;gt; 1&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.72243em;vertical-align:-0.0391em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.13889em;"&gt;T&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;&amp;gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.64444em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;: Increases randomness. Can generate more creative/diverse outputs. Risk of incoherent or off-topic responses&lt;/p&gt;
&lt;p&gt;Temperature is typically applied during inference only. During training, models use &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;T&lt;/mi&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;T = 1&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.68333em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.13889em;"&gt;T&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.64444em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; to learn the true probability distribution of the data. However, in the paper, &lt;a href="https://arxiv.org/abs/1503.02531"&gt;Distilling the Knowledge in a Neural Network&lt;/a&gt;, they experiment with using higher temperatures during training to help the model distinguish between similar classes of items.&lt;/p&gt;</content><category term="permanent"/><category term="LargeLanguageModels"/><category term="MachineLearning"/></entry><entry><title>Few-Shot Knowledge-Distillation</title><link href="http://localhost:8000/few-shot-knowledge-distillation.html" rel="alternate"/><published>2025-01-12T00:00:00+10:00</published><updated>2025-01-12T00:00:00+10:00</updated><author><name>Lex Toumbourou</name></author><id>tag:localhost,2025-01-12:/few-shot-knowledge-distillation.html</id><summary type="html">&lt;p&gt;Routes LLM tasks to cheaper or more powerful models based on task novelty.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Good idea from this &lt;a href="https://bits.logic.inc/p/getting-gpt-4o-mini-to-perform-like"&gt;blog post by Steve Krenzel&lt;/a&gt;: &lt;strong&gt;Few-Shot Knowledge Distillation (FSKD)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;A retrieval LLM routing idea where we:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Store input/output task embeddings from a high-quality model.&lt;/li&gt;
&lt;li&gt;For new examples, compute a novelty score: measure how similar the new example is to other examples.&lt;/li&gt;
&lt;li&gt;Send novel examples to &lt;code&gt;gpt4o&lt;/code&gt; (or some big, expensive model).&lt;/li&gt;
&lt;li&gt;Send other examples to &lt;code&gt;gpt4o-mini&lt;/code&gt; (or some cheaper, lower performance model), but include similar &lt;code&gt;gpt4o&lt;/code&gt; examples in the prompt (few-shot knowledge distillation).&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The novelty score is determined by:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;And the task embedding (T).&lt;/li&gt;
&lt;li&gt;The similarity threshold (θ) - which defines how similar an entry needs to be to be considered a match&lt;/li&gt;
&lt;li&gt;The matches threshold (m) specifies the number of matches that need to be considered "low novelty."&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;span class="katex-display"&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mtext&gt;noveltyScore&lt;/mtext&gt;&lt;mo stretchy="false"&gt;(&lt;/mo&gt;&lt;mi&gt;T&lt;/mi&gt;&lt;mo separator="true"&gt;,&lt;/mo&gt;&lt;mi&gt;θ&lt;/mi&gt;&lt;mo separator="true"&gt;,&lt;/mo&gt;&lt;mi&gt;m&lt;/mi&gt;&lt;mo stretchy="false"&gt;)&lt;/mo&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mrow&gt;&lt;mo fence="true"&gt;{&lt;/mo&gt;&lt;mtable columnalign="left left" columnspacing="1em" rowspacing="0.3599999999999999em"&gt;&lt;mtr&gt;&lt;mtd&gt;&lt;mstyle displaystyle="false" scriptlevel="0"&gt;&lt;mtext&gt;LOW&lt;/mtext&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;mtd&gt;&lt;mstyle displaystyle="false" scriptlevel="0"&gt;&lt;mrow&gt;&lt;mtext&gt;if &lt;/mtext&gt;&lt;mi mathvariant="normal"&gt;∣&lt;/mi&gt;&lt;mtext&gt;search&lt;/mtext&gt;&lt;mo stretchy="false"&gt;(&lt;/mo&gt;&lt;mi&gt;T&lt;/mi&gt;&lt;mo separator="true"&gt;,&lt;/mo&gt;&lt;mi&gt;θ&lt;/mi&gt;&lt;mo stretchy="false"&gt;)&lt;/mo&gt;&lt;mi mathvariant="normal"&gt;∣&lt;/mi&gt;&lt;mo&gt;≥&lt;/mo&gt;&lt;mi&gt;m&lt;/mi&gt;&lt;/mrow&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;/mtr&gt;&lt;mtr&gt;&lt;mtd&gt;&lt;mstyle displaystyle="false" scriptlevel="0"&gt;&lt;mtext&gt;HIGH&lt;/mtext&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;mtd&gt;&lt;mstyle displaystyle="false" scriptlevel="0"&gt;&lt;mtext&gt;otherwise&lt;/mtext&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;/mtr&gt;&lt;/mtable&gt;&lt;/mrow&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;
\text{noveltyScore}(T, \theta, m) = \begin{cases}
\text{LOW} &amp;amp; \text{if } |\text{search}(T,\theta)| \geq m \\
\text{HIGH} &amp;amp; \text{otherwise}
\end{cases}
&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1em;vertical-align:-0.25em;"&gt;&lt;/span&gt;&lt;span class="mord text"&gt;&lt;span class="mord"&gt;noveltyScore&lt;/span&gt;&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.13889em;"&gt;T&lt;/span&gt;&lt;span class="mpunct"&gt;,&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.02778em;"&gt;θ&lt;/span&gt;&lt;span class="mpunct"&gt;,&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;m&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:3.0000299999999998em;vertical-align:-1.25003em;"&gt;&lt;/span&gt;&lt;span class="minner"&gt;&lt;span class="mopen delimcenter" style="top:0em;"&gt;&lt;span class="delimsizing size4"&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mtable"&gt;&lt;span class="col-align-l"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:1.69em;"&gt;&lt;span style="top:-3.69em;"&gt;&lt;span class="pstrut" style="height:3.008em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord text"&gt;&lt;span class="mord"&gt;LOW&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-2.25em;"&gt;&lt;span class="pstrut" style="height:3.008em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord text"&gt;&lt;span class="mord"&gt;HIGH&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:1.19em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="arraycolsep" style="width:1em;"&gt;&lt;/span&gt;&lt;span class="col-align-l"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:1.69em;"&gt;&lt;span style="top:-3.69em;"&gt;&lt;span class="pstrut" style="height:3.008em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord text"&gt;&lt;span class="mord"&gt;if &lt;/span&gt;&lt;/span&gt;&lt;span class="mord"&gt;∣&lt;/span&gt;&lt;span class="mord text"&gt;&lt;span class="mord"&gt;search&lt;/span&gt;&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.13889em;"&gt;T&lt;/span&gt;&lt;span class="mpunct"&gt;,&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.02778em;"&gt;θ&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;span class="mord"&gt;∣&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;≥&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;m&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-2.25em;"&gt;&lt;span class="pstrut" style="height:3.008em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord text"&gt;&lt;span class="mord"&gt;otherwise&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:1.19em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose nulldelimiter"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;The defaults of &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;θ&lt;/mi&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mn&gt;0.8&lt;/mn&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;\theta = 0.8&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.69444em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.02778em;"&gt;θ&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.64444em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;0&lt;/span&gt;&lt;span class="mord"&gt;.&lt;/span&gt;&lt;span class="mord"&gt;8&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; and m = 3 can be tuned for cost/performance trade-offs.&lt;/p&gt;
&lt;p&gt;It's cool because it's self-adapting - if there's &lt;a href="domain-shift.html"&gt;Domain Shift&lt;/a&gt; new examples are sent to the larger model until it builds up new examples.&lt;/p&gt;
&lt;p&gt;Results on real inventory moderation task:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;63.4% cost reduction&lt;/li&gt;
&lt;li&gt;Slight improvement over a large model: 90.9% accuracy (vs 87.6% for the large model alone)&lt;/li&gt;
&lt;li&gt;~69% of tasks handled by a smaller model&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img alt="Flowchart example of the FSKD system" src="../_media/fskd-visualization-pro.svg"&gt;&lt;/p&gt;</content><category term="permanent"/><category term="LLMPerformance"/><category term="LargeLanguageModels"/></entry><entry><title>Large Language Models are Zero-Shot Reasoners (May 2022)</title><link href="http://localhost:8000/large-language-models-are-zero-shot-reasoners-may-2022.html" rel="alternate"/><published>2025-01-08T00:00:00+10:00</published><updated>2025-01-08T00:00:00+10:00</updated><author><name>Lex Toumbourou</name></author><id>tag:localhost,2025-01-08:/large-language-models-are-zero-shot-reasoners-may-2022.html</id><summary type="html">&lt;p&gt;improve zero-shot prompt performance of LLMs by adding “Let’s think step by step” before each answer&lt;/p&gt;</summary><content type="html">&lt;h2 id="overview"&gt;Overview&lt;/h2&gt;
&lt;p&gt;Language models have shown impressive capabilities in few-shot learning, where they learn from a handful of examples. However, this paper from early 2023 shows that large language models (LLMs) can perform complex reasoning tasks with zero examples - they just need to be asked to &lt;a href="think-step-by-step.html"&gt;Think Step-by-Step&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="background"&gt;Background&lt;/h2&gt;
&lt;p&gt;Traditional approaches to getting LLMs to solve complex reasoning problems involved showing them several examples with step-by-step solutions (called &lt;a href="chain-of-thought-prompting.html"&gt;Chain-of-Thought Prompting&lt;/a&gt; or CoT).&lt;/p&gt;
&lt;p&gt;This new research shows that by simply adding the phrase "Let's think step by step" before asking for an answer, LLMs can break down and solve complex problems without any examples.&lt;/p&gt;
&lt;p&gt;&lt;img alt="large-language-models-are-zero-shot-reasoners-fig-1.png" src="../../_media/large-language-models-are-zero-shot-reasoners-fig-1.png"&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Figure 1: Example inputs and outputs of GPT-3 with different prompting techniques.&lt;/em&gt;&lt;/p&gt;
&lt;div class="callout" data-callout="question"&gt;
&lt;div class="callout-title"&gt;
&lt;div class="callout-icon" data-lucide="help-circle"&gt;&lt;/div&gt;
&lt;div class="callout-title-inner"&gt;What is the key difference between few-shot CoT and zero-shot CoT?&lt;/div&gt;
&lt;/div&gt;
&lt;div class="callout-content"&gt;
&lt;p dir="auto"&gt;a) Zero-shot CoT uses more examples than few-shot CoT&lt;br/&gt;
   b) Few-shot CoT requires no examples while zero-shot CoT needs many&lt;br/&gt;
   c) Zero-shot CoT only needs the prompt "Let's think step by step" while few-shot CoT needs example solutions&lt;br/&gt;
   d) Zero-shot CoT only works on simple problems&lt;/p&gt;
&lt;div class="callout is-collapsible is-collapsed" data-callout="success"&gt;
&lt;div class="callout-title" dir="auto"&gt;
&lt;div class="callout-icon" data-lucide="check"&gt;&lt;/div&gt;
&lt;div class="callout-title-inner"&gt;Answer&lt;/div&gt;
&lt;div class="callout-fold" data-lucide="chevron-right"&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="callout-content"&gt;
&lt;p dir="auto"&gt;c) Zero-shot CoT only needs the prompt "Let's think step by step" while few-shot CoT needs example solutions&lt;br/&gt;
   This is the fundamental innovation of the paper - discovering that complex reasoning could be achieved without examples, just by prompting step-by-step thinking.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="technique-two-staged-approach"&gt;Technique - Two Staged-Approach&lt;/h2&gt;
&lt;p&gt;Let's think step-by-step uses a two-stage prompting process:&lt;/p&gt;
&lt;h3 id="1-reasoning-extraction-first-stage"&gt;1. &lt;strong&gt;Reasoning Extraction (First Stage)&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Input question is formatted as "Q: [Question]. A: Let's think step by step"&lt;/li&gt;
&lt;li&gt;Model generates step-by-step reasoning&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="2-answer-extraction-second-stage"&gt;2. &lt;strong&gt;Answer Extraction (Second Stage)&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Combines original question, generated reasoning, and answer-extraction prompt&lt;/li&gt;
&lt;li&gt;Uses format-specific triggers like "Therefore, the answer is..."&lt;/li&gt;
&lt;li&gt;Extracts final answer in correct format&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img alt="large-language-models-are-zero-shot-reasoners-fig-2.png" src="../../_media/large-language-models-are-zero-shot-reasoners-fig-2.png"&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Figure 2: Full pipeline of Zero-shot-CoT as described in section 3.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;While this approach requires two prompting steps instead of one, it eliminates the need for carefully engineered examples that traditional few-shot methods require. The method can be used with any decoding strategy, though the researchers used greedy decoding for simplicity. The approach's flexibility comes from its ability to adapt to different answer formats while maintaining the same basic reasoning structure, making it truly task-agnostic.&lt;/p&gt;
&lt;div class="callout" data-callout="question"&gt;
&lt;div class="callout-title"&gt;
&lt;div class="callout-icon" data-lucide="help-circle"&gt;&lt;/div&gt;
&lt;div class="callout-title-inner"&gt;Which statement correctly describes Zero-shot-CoT's prompting process?&lt;/div&gt;
&lt;/div&gt;
&lt;div class="callout-content"&gt;
&lt;p dir="auto"&gt;a) It uses a single prompt to generate both reasoning and answer&lt;br/&gt;
   b) It requires examples like traditional chain-of-thought prompting&lt;br/&gt;
   c) It uses two separate prompts - one for reasoning and one for answer extraction&lt;br/&gt;
   d) It only works with numerical answers&lt;br/&gt;
   e) It requires fine-tuning the model for each task type&lt;/p&gt;
&lt;div class="callout is-collapsible is-collapsed" data-callout="success"&gt;
&lt;div class="callout-title" dir="auto"&gt;
&lt;div class="callout-icon" data-lucide="check"&gt;&lt;/div&gt;
&lt;div class="callout-title-inner"&gt;Answer&lt;/div&gt;
&lt;div class="callout-fold" data-lucide="chevron-right"&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="callout-content"&gt;
&lt;p dir="auto"&gt;c) It uses two separate prompts - one for reasoning and one for answer extraction&lt;br/&gt;
   This is correct because Zero-shot-CoT employs a two-stage process:&lt;br/&gt;
   * First stage extracts the reasoning using "Let's think step by step"&lt;br/&gt;
   * Second stage extracts the final answer using a format-specific prompt&lt;br/&gt;
   The other options are incorrect because:&lt;br/&gt;
   * It doesn't use a single prompt&lt;br/&gt;
   * It doesn't need examples&lt;br/&gt;
   * It works with various answer formats&lt;br/&gt;
   * It doesn't require fine-tuning&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="results"&gt;Results&lt;/h2&gt;
&lt;p&gt;The researchers tested this approach on various tasks including:
- Arithmetic reasoning (MultiArith, [[GSM8K]])
- Symbolic reasoning (Last Letter, Coin Flip)
- Commonsense reasoning
- Logical reasoning&lt;/p&gt;
&lt;p&gt;The results were remarkable. For example, on the MultiArith dataset, accuracy increased from 17.7% to 78.7% simply by adding the step-by-step prompt. They showed that CoT helped large models the most.&lt;/p&gt;
&lt;div class="callout" data-callout="question"&gt;
&lt;div class="callout-title"&gt;
&lt;div class="callout-icon" data-lucide="help-circle"&gt;&lt;/div&gt;
&lt;div class="callout-title-inner"&gt;What did the results show about model scaling?&lt;/div&gt;
&lt;/div&gt;
&lt;div class="callout-content"&gt;
&lt;p dir="auto"&gt;a) Smaller models performed better with zero-shot CoT&lt;br/&gt;
   b) Model size had no effect on performance&lt;br/&gt;
   c) Larger models showed significantly better performance with zero-shot CoT&lt;br/&gt;
   d) Zero-shot CoT only worked on medium-sized models&lt;/p&gt;
&lt;div class="callout is-collapsible is-collapsed" data-callout="success"&gt;
&lt;div class="callout-title" dir="auto"&gt;
&lt;div class="callout-icon" data-lucide="check"&gt;&lt;/div&gt;
&lt;div class="callout-title-inner"&gt;Answer&lt;/div&gt;
&lt;div class="callout-fold" data-lucide="chevron-right"&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="callout-content"&gt;
&lt;p dir="auto"&gt;c) Larger models showed significantly better performance with zero-shot CoT&lt;br/&gt;
   The paper demonstrated that the effectiveness of zero-shot CoT increased dramatically with model size, suggesting that this capability emerges more strongly in larger models.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="why-this-matters"&gt;Why This Matters&lt;/h2&gt;
&lt;p&gt;This discovery has several important implications for &lt;a href="large-language-models.html"&gt;Large Language Models&lt;/a&gt;.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;It suggests that LLMs have inherent reasoning capabilities that can be accessed with the right prompting&lt;/li&gt;
&lt;li&gt;It provides a simpler alternative to few-shot learning for complex tasks&lt;/li&gt;
&lt;li&gt;It hints at broader cognitive capabilities in LLMs that we might not have fully explored&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="callout" data-callout="question"&gt;
&lt;div class="callout-title"&gt;
&lt;div class="callout-icon" data-lucide="help-circle"&gt;&lt;/div&gt;
&lt;div class="callout-title-inner"&gt;Which of these is NOT a key implication of this research?&lt;/div&gt;
&lt;/div&gt;
&lt;div class="callout-content"&gt;
&lt;p dir="auto"&gt;a) LLMs have untapped reasoning capabilities&lt;br/&gt;
   b) Complex prompting with examples might be unnecessary&lt;br/&gt;
   c) LLMs need to be retrained to achieve better reasoning&lt;br/&gt;
   d) Simple prompts can unlock sophisticated behaviors&lt;/p&gt;
&lt;div class="callout is-collapsible is-collapsed" data-callout="success"&gt;
&lt;div class="callout-title" dir="auto"&gt;
&lt;div class="callout-icon" data-lucide="check"&gt;&lt;/div&gt;
&lt;div class="callout-title-inner"&gt;Answer&lt;/div&gt;
&lt;div class="callout-fold" data-lucide="chevron-right"&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="callout-content"&gt;
&lt;p dir="auto"&gt;c) LLMs need to be retrained to achieve better reasoning&lt;br/&gt;
   This is incorrect because the paper shows that existing LLMs already have these capabilities without retraining - they just need the right prompt to access them.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The research suggests that before investing in creating complex few-shot examples or fine-tuning datasets, we should first explore what capabilities already exist within these models through simple prompting strategies.&lt;/p&gt;
&lt;p&gt;This work sets a new baseline for evaluating language models' reasoning capabilities and opens up exciting possibilities for making AI systems more capable through clever prompting rather than just increasing model size or training data.&lt;/p&gt;</content><category term="reference"/><category term="LargeLanguageModels"/><category term="PromptingTechniques"/></entry><entry><title>Neural Machine Translation by Jointly Learning to Align and Translate (Sep 2014)</title><link href="http://localhost:8000/neural-machine-translation-by-jointly-learning-to-align-and-translate-sep-2014.html" rel="alternate"/><published>2024-10-28T00:00:00+10:00</published><updated>2024-10-28T00:00:00+10:00</updated><author><name>Lex Toumbourou</name></author><id>tag:localhost,2024-10-28:/neural-machine-translation-by-jointly-learning-to-align-and-translate-sep-2014.html</id><summary type="html">&lt;p&gt;improve the Encoder/Decoder alignment with an Attention Mechanism&lt;/p&gt;</summary><content type="html">&lt;p&gt;&lt;em&gt;These are my notes from the paper &lt;a href="https://arxiv.org/abs/1409.0473"&gt;Neural Machine Translation by Jointly Learning to Align and Translate&lt;/a&gt; (2014) by Dzmitry Bahdanau, Kyunghyun Cho, Yoshua Bengio.&lt;/em&gt;&lt;/p&gt;
&lt;h2 id="overview"&gt;Overview&lt;/h2&gt;
&lt;p&gt;This paper proposed an improvement to the &lt;a href="rnn-encoder-decoder.html"&gt;RNN Encoder-Decoder&lt;/a&gt; &lt;sup id="fnref:1"&gt;&lt;a class="footnote-ref" href="#fn:1"&gt;1&lt;/a&gt;&lt;/sup&gt; network architecture, introducing an "attention mechanism" to the decoder, which significantly improved performance over longer sentences. The concept of attention went on to become extremely influential in Machine Learning.&lt;/p&gt;
&lt;p&gt;At the time, neural networks had emerged as a promising approach to machine translation, where researchers were aiming for an end-to-end translation model, in contrast to the state-of-the-art statistical phrase-based translation methods, which involved many individually trained components. The RNN Encoder-Decoder approach would encode an input sentence into a fixed-length context vector; a decoder would then output a translation using the context vector. The encoder and decoder are jointly trained on a dataset of text pairs, where the goal is to maximise the probability of the target given the input.&lt;/p&gt;
&lt;p&gt;&lt;img alt="RNN Encoder-Decoder" src="../../_media/rnn-encoder-decoder.png"&gt;&lt;/p&gt;
&lt;p&gt;However, this approach struggles with longer sentences, as the encoder has to drop information to compress it into a fixed-length context vector.&lt;/p&gt;
&lt;p&gt;The authors proposed modifying the encoder to output a sequence with one hidden representation per input word, then adding a search mechanism to the decoder, allowing it to find the most relevant information in the input sequence to predict each word in the output sequence.&lt;/p&gt;
&lt;p&gt;&lt;img alt="" src="../../_media/rnn-encoder-decoder-with-attention.png"&gt;&lt;/p&gt;
&lt;p&gt;They likened the modification to the human notion of "attention", calling it an &lt;a href="attention-mechanism.html"&gt;Attention Mechanism&lt;/a&gt;. Though not the first Machine Learning paper to propose applying human-like attention to model architectures &lt;sup id="fnref:2"&gt;&lt;a class="footnote-ref" href="#fn:2"&gt;2&lt;/a&gt;&lt;/sup&gt;, this approach was very influential in NLP, leading to a lot of research eventually converging on an entirely attention-based architecture called the &lt;a href="transformer.html"&gt;Transformer&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="architecture-details"&gt;Architecture Details&lt;/h2&gt;
&lt;p&gt;The authors propose an &lt;a href="rnnsearch.html"&gt;RNNSearch&lt;/a&gt; model: an Encoder / Decoder model with an attention mechanism. For comparison, they train &lt;strong&gt;RNNencdec&lt;/strong&gt;, which follows the standard RNN Encoder / Decoder architecture &lt;sup id="fnref2:2"&gt;&lt;a class="footnote-ref" href="#fn:2"&gt;2&lt;/a&gt;&lt;/sup&gt; with the encoder returning a fixed-length context vector.&lt;/p&gt;
&lt;p&gt;To demonstrate the ability to handle longer sequences, they train each model twice:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;First, with sentences of length up to 30 words: &lt;code&gt;RNNencdec-30&lt;/code&gt;, &lt;code&gt;RNNsearch-30&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Next, with sentences of size up to 50 words: &lt;code&gt;RNNencdec-50&lt;/code&gt;, &lt;code&gt;RNNsearch-50&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="encoder"&gt;Encoder&lt;/h3&gt;
&lt;p&gt;For the RNN, they use a Bidirectional RNN: a &lt;a href="gated-recurrent-unit.html"&gt;Gated Recurrent Unit&lt;/a&gt; (GRU).&lt;/p&gt;
&lt;p&gt;Each input token is fed into an embedding layer, &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;msub&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;/msub&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;x_i&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.58056em;vertical-align:-0.15em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;x&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.31166399999999994em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mathdefault mtight"&gt;i&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;, and then a GRU encodes into a forward and backward "annotation" per token, concatenated to make a single representation, &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;msub&gt;&lt;mi&gt;h&lt;/mi&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;/msub&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;h_i&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.84444em;vertical-align:-0.15em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;h&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.31166399999999994em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mathdefault mtight"&gt;i&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;.&lt;/p&gt;
&lt;p&gt;The idea is to allow each annotation to summarise the preceding and the following words, providing the most possible representation for the attention mechanism.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Figure 1 from paper" src="../../_media/neural-machine-translation-by-jointly-learning-to-align-and-translate-sep-2014-fig-1.png"&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Figure 1: The graphical illustration of the proposed model trying to generate the t-th target word &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;msub&gt;&lt;mi&gt;y&lt;/mi&gt;&lt;mi&gt;t&lt;/mi&gt;&lt;/msub&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;y_t&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.625em;vertical-align:-0.19444em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault" style="margin-right:0.03588em;"&gt;y&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.2805559999999999em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:-0.03588em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mathdefault mtight"&gt;t&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; given a source sentence&lt;/em&gt; ( &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;msub&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/msub&gt;&lt;mo separator="true"&gt;,&lt;/mo&gt;&lt;msub&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;/msub&gt;&lt;mo separator="true"&gt;,&lt;/mo&gt;&lt;mo&gt;…&lt;/mo&gt;&lt;mo separator="true"&gt;,&lt;/mo&gt;&lt;msub&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;mi&gt;T&lt;/mi&gt;&lt;/msub&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;x_1, x_2, \ldots, x_T&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.625em;vertical-align:-0.19444em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;x&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.30110799999999993em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mpunct"&gt;,&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;x&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.30110799999999993em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mpunct"&gt;,&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="minner"&gt;…&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mpunct"&gt;,&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;x&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.32833099999999993em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mathdefault mtight" style="margin-right:0.13889em;"&gt;T&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; )&lt;/p&gt;
&lt;h3 id="decoder"&gt;Decoder&lt;/h3&gt;
&lt;p&gt;For the decoder, they use a uni-directional &lt;a href="gated-recurrent-unit.html"&gt;Gated Recurrent Unit&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The initial hidden state &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;msub&gt;&lt;mi&gt;s&lt;/mi&gt;&lt;mn&gt;0&lt;/mn&gt;&lt;/msub&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;s_0&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.58056em;vertical-align:-0.15em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;s&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.30110799999999993em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;0&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; is computed as an initialisation layer, which comprises a linear layer followed by a &lt;code&gt;tanh&lt;/code&gt; activation function.&lt;/p&gt;
&lt;p&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;msub&gt;&lt;mi&gt;s&lt;/mi&gt;&lt;mn&gt;0&lt;/mn&gt;&lt;/msub&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mi&gt;tanh&lt;/mi&gt;&lt;mo&gt;⁡&lt;/mo&gt;&lt;mrow&gt;&lt;mo fence="true"&gt;(&lt;/mo&gt;&lt;msub&gt;&lt;mi&gt;W&lt;/mi&gt;&lt;mi&gt;s&lt;/mi&gt;&lt;/msub&gt;&lt;msub&gt;&lt;mover accent="true"&gt;&lt;mi&gt;h&lt;/mi&gt;&lt;mo stretchy="true"&gt;←&lt;/mo&gt;&lt;/mover&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/msub&gt;&lt;mo fence="true"&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;s_0 = \tanh \left( W_s \overleftarrow{h}_1 \right)&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.58056em;vertical-align:-0.15em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;s&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.30110799999999993em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;0&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1.86646em;vertical-align:-0.65002em;"&gt;&lt;/span&gt;&lt;span class="mop"&gt;tanh&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="minner"&gt;&lt;span class="mopen delimcenter" style="top:0em;"&gt;&lt;span class="delimsizing size2"&gt;(&lt;/span&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault" style="margin-right:0.13889em;"&gt;W&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.151392em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:-0.13889em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mathdefault mtight"&gt;s&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord accent"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:1.21644em;"&gt;&lt;span style="top:-3em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;h&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="svg-align" style="top:-3.69444em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="hide-tail" style="height:0.522em;min-width:0.888em;"&gt;&lt;svg height="0.522em" preserveAspectRatio="xMinYMin slice" viewBox="0 0 400000 522" width="400em"&gt;&lt;path d="M400000 241H110l3-3c68.7-52.7 113.7-120  135-202 4-14.7 6-23 6-25 0-7.3-7-11-21-11-8 0-13.2.8-15.5 2.5-2.3 1.7-4.2 5.8 -5.5 12.5-1.3 4.7-2.7 10.3-4 17-12 48.7-34.8 92-68.5 130S65.3 228.3 18 247 c-10 4-16 7.7-18 11 0 8.7 6 14.3 18 17 47.3 18.7 87.8 47 121.5 85S196 441.3 208  490c.7 2 1.3 5 2 9s1.2 6.7 1.5 8c.3 1.3 1 3.3 2 6s2.2 4.5 3.5 5.5c1.3 1 3.3  1.8 6 2.5s6 1 10 1c14 0 21-3.7 21-11 0-2-2-10.3-6-25-20-79.3-65-146.7-135-202  l-3-3h399890zM100 241v40h399900v-40z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.30110799999999993em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose delimcenter" style="top:0em;"&gt;&lt;span class="delimsizing size2"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; where &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;msub&gt;&lt;mi&gt;W&lt;/mi&gt;&lt;mi&gt;s&lt;/mi&gt;&lt;/msub&gt;&lt;mo&gt;∈&lt;/mo&gt;&lt;msup&gt;&lt;mi mathvariant="double-struck"&gt;R&lt;/mi&gt;&lt;mrow&gt;&lt;mi&gt;n&lt;/mi&gt;&lt;mo&gt;×&lt;/mo&gt;&lt;mi&gt;n&lt;/mi&gt;&lt;/mrow&gt;&lt;/msup&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;W_s \in \mathbb{R}^{n \times n}&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.83333em;vertical-align:-0.15em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault" style="margin-right:0.13889em;"&gt;W&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.151392em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:-0.13889em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mathdefault mtight"&gt;s&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;∈&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.771331em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;&lt;span class="mord mathbb"&gt;R&lt;/span&gt;&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.771331em;"&gt;&lt;span style="top:-3.063em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathdefault mtight"&gt;n&lt;/span&gt;&lt;span class="mbin mtight"&gt;×&lt;/span&gt;&lt;span class="mord mathdefault mtight"&gt;n&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;.&lt;/p&gt;
&lt;p&gt;For each prediction step, they calculate the word probability as:&lt;/p&gt;
&lt;p&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;p&lt;/mi&gt;&lt;mo stretchy="false"&gt;(&lt;/mo&gt;&lt;msub&gt;&lt;mi&gt;y&lt;/mi&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;/msub&gt;&lt;mi mathvariant="normal"&gt;∣&lt;/mi&gt;&lt;msub&gt;&lt;mi&gt;y&lt;/mi&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/msub&gt;&lt;mo separator="true"&gt;,&lt;/mo&gt;&lt;mo&gt;…&lt;/mo&gt;&lt;mo separator="true"&gt;,&lt;/mo&gt;&lt;msub&gt;&lt;mi&gt;y&lt;/mi&gt;&lt;mrow&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/mrow&gt;&lt;/msub&gt;&lt;mo separator="true"&gt;,&lt;/mo&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;mo stretchy="false"&gt;)&lt;/mo&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mi&gt;g&lt;/mi&gt;&lt;mo stretchy="false"&gt;(&lt;/mo&gt;&lt;msub&gt;&lt;mi&gt;y&lt;/mi&gt;&lt;mrow&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/mrow&gt;&lt;/msub&gt;&lt;mo separator="true"&gt;,&lt;/mo&gt;&lt;msub&gt;&lt;mi&gt;s&lt;/mi&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;/msub&gt;&lt;mo separator="true"&gt;,&lt;/mo&gt;&lt;msub&gt;&lt;mi&gt;c&lt;/mi&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;/msub&gt;&lt;mo stretchy="false"&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;p(y_i|y_1, \ldots, y_{i-1}, x) = g(y_{i-1}, s_i, c_i)&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1em;vertical-align:-0.25em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;p&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault" style="margin-right:0.03588em;"&gt;y&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.31166399999999994em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:-0.03588em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mathdefault mtight"&gt;i&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mord"&gt;∣&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault" style="margin-right:0.03588em;"&gt;y&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.30110799999999993em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:-0.03588em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mpunct"&gt;,&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="minner"&gt;…&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mpunct"&gt;,&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault" style="margin-right:0.03588em;"&gt;y&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.311664em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:-0.03588em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathdefault mtight"&gt;i&lt;/span&gt;&lt;span class="mbin mtight"&gt;−&lt;/span&gt;&lt;span class="mord mtight"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.208331em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mpunct"&gt;,&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;x&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1em;vertical-align:-0.25em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.03588em;"&gt;g&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault" style="margin-right:0.03588em;"&gt;y&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.311664em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:-0.03588em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathdefault mtight"&gt;i&lt;/span&gt;&lt;span class="mbin mtight"&gt;−&lt;/span&gt;&lt;span class="mord mtight"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.208331em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mpunct"&gt;,&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;s&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.31166399999999994em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mathdefault mtight"&gt;i&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mpunct"&gt;,&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;c&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.31166399999999994em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mathdefault mtight"&gt;i&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Where&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;msub&gt;&lt;mi&gt;y&lt;/mi&gt;&lt;mrow&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/mrow&gt;&lt;/msub&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;y_{i-1}&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.638891em;vertical-align:-0.208331em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault" style="margin-right:0.03588em;"&gt;y&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.311664em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:-0.03588em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathdefault mtight"&gt;i&lt;/span&gt;&lt;span class="mbin mtight"&gt;−&lt;/span&gt;&lt;span class="mord mtight"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.208331em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; is the embedding of the token from the previous step.&lt;/li&gt;
&lt;li&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;msub&gt;&lt;mi&gt;s&lt;/mi&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;/msub&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;s_i&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.58056em;vertical-align:-0.15em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;s&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.31166399999999994em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mathdefault mtight"&gt;i&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; is the hidden state output from the previous layer.&lt;/li&gt;
&lt;li&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;msub&gt;&lt;mi&gt;c&lt;/mi&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;/msub&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;c_i&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.58056em;vertical-align:-0.15em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;c&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.31166399999999994em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mathdefault mtight"&gt;i&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; is the context vector.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The context vector, &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;msub&gt;&lt;mi&gt;c&lt;/mi&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;/msub&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;c_i&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.58056em;vertical-align:-0.15em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;c&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.31166399999999994em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mathdefault mtight"&gt;i&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; is calculated at each step as follows:&lt;/p&gt;
&lt;p&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;msub&gt;&lt;mi&gt;c&lt;/mi&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;/msub&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;msubsup&gt;&lt;mo&gt;∑&lt;/mo&gt;&lt;mrow&gt;&lt;mi&gt;j&lt;/mi&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/mrow&gt;&lt;msub&gt;&lt;mi&gt;T&lt;/mi&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;/msub&gt;&lt;/msubsup&gt;&lt;msub&gt;&lt;mi&gt;α&lt;/mi&gt;&lt;mrow&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;mi&gt;j&lt;/mi&gt;&lt;/mrow&gt;&lt;/msub&gt;&lt;msub&gt;&lt;mi&gt;h&lt;/mi&gt;&lt;mi&gt;j&lt;/mi&gt;&lt;/msub&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;c_i = \sum\limits_{j=1}^{T_x}\alpha_{ij}h_j&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.58056em;vertical-align:-0.15em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;c&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.31166399999999994em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mathdefault mtight"&gt;i&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:2.653213em;vertical-align:-1.113777em;"&gt;&lt;/span&gt;&lt;span class="mop op-limits"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:1.5394360000000002em;"&gt;&lt;span style="top:-2.122331em;margin-left:0em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathdefault mtight" style="margin-right:0.05724em;"&gt;j&lt;/span&gt;&lt;span class="mrel mtight"&gt;=&lt;/span&gt;&lt;span class="mord mtight"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-3.0000050000000003em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="mop op-symbol small-op"&gt;∑&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-3.961105em;margin-left:0em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathdefault mtight" style="margin-right:0.13889em;"&gt;T&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.16454285714285719em;"&gt;&lt;span style="top:-2.357em;margin-left:-0.13889em;margin-right:0.07142857142857144em;"&gt;&lt;span class="pstrut" style="height:2.5em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size3 size1 mtight"&gt;&lt;span class="mord mathdefault mtight"&gt;x&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.143em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:1.113777em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault" style="margin-right:0.0037em;"&gt;α&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.311664em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:-0.0037em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathdefault mtight"&gt;i&lt;/span&gt;&lt;span class="mord mathdefault mtight" style="margin-right:0.05724em;"&gt;j&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.286108em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;h&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.311664em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mathdefault mtight" style="margin-right:0.05724em;"&gt;j&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.286108em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;The weights, &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;msub&gt;&lt;mi&gt;α&lt;/mi&gt;&lt;mrow&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;mi&gt;j&lt;/mi&gt;&lt;/mrow&gt;&lt;/msub&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;\alpha_{ij}&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.716668em;vertical-align:-0.286108em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault" style="margin-right:0.0037em;"&gt;α&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.311664em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:-0.0037em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathdefault mtight"&gt;i&lt;/span&gt;&lt;span class="mord mathdefault mtight" style="margin-right:0.05724em;"&gt;j&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.286108em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;, are calculated by the alignment (Attention) model.&lt;/p&gt;
&lt;h4 id="alignment-model-attention"&gt;Alignment Model (Attention)&lt;/h4&gt;
&lt;p&gt;The &lt;strong&gt;alignment scores&lt;/strong&gt; are calculated by combining a projection of the decoder's previous state and a projection of the encoder output, then applying &lt;code&gt;tanh&lt;/code&gt; activation followed by a linear combination with another weight vector.&lt;/p&gt;
&lt;p&gt;&lt;span class="katex-display"&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;msub&gt;&lt;mi&gt;e&lt;/mi&gt;&lt;mrow&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;mi&gt;j&lt;/mi&gt;&lt;/mrow&gt;&lt;/msub&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;msubsup&gt;&lt;mi&gt;v&lt;/mi&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mi&gt;T&lt;/mi&gt;&lt;/msubsup&gt;&lt;mi&gt;tanh&lt;/mi&gt;&lt;mo&gt;⁡&lt;/mo&gt;&lt;mo stretchy="false"&gt;(&lt;/mo&gt;&lt;msub&gt;&lt;mi&gt;W&lt;/mi&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;/msub&gt;&lt;msub&gt;&lt;mi&gt;s&lt;/mi&gt;&lt;mrow&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/mrow&gt;&lt;/msub&gt;&lt;mo&gt;+&lt;/mo&gt;&lt;msub&gt;&lt;mi&gt;U&lt;/mi&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;/msub&gt;&lt;msub&gt;&lt;mi&gt;h&lt;/mi&gt;&lt;mi&gt;j&lt;/mi&gt;&lt;/msub&gt;&lt;mo stretchy="false"&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;
e_{ij} = v_a^{T} \tanh(W_as_{i-1} + U_{a}h_{j})
&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.716668em;vertical-align:-0.286108em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;e&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.311664em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathdefault mtight"&gt;i&lt;/span&gt;&lt;span class="mord mathdefault mtight" style="margin-right:0.05724em;"&gt;j&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.286108em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1.1413309999999999em;vertical-align:-0.25em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault" style="margin-right:0.03588em;"&gt;v&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.8913309999999999em;"&gt;&lt;span style="top:-2.4530000000000003em;margin-left:-0.03588em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mathdefault mtight"&gt;a&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-3.113em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathdefault mtight" style="margin-right:0.13889em;"&gt;T&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.247em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mop"&gt;tanh&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault" style="margin-right:0.13889em;"&gt;W&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.151392em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:-0.13889em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mathdefault mtight"&gt;a&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;s&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.311664em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathdefault mtight"&gt;i&lt;/span&gt;&lt;span class="mbin mtight"&gt;−&lt;/span&gt;&lt;span class="mord mtight"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.208331em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;+&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1.036108em;vertical-align:-0.286108em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault" style="margin-right:0.10903em;"&gt;U&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.151392em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:-0.10903em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathdefault mtight"&gt;a&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;h&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.311664em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathdefault mtight" style="margin-right:0.05724em;"&gt;j&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.286108em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;This function gives us an output score for each token in the input sequence. Finally, we can perform a Softmax calculation to convert the weights to probability distribution:&lt;/p&gt;
&lt;p&gt;&lt;span class="katex-display"&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;msub&gt;&lt;mi&gt;σ&lt;/mi&gt;&lt;mrow&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;mi&gt;j&lt;/mi&gt;&lt;/mrow&gt;&lt;/msub&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mfrac&gt;&lt;mrow&gt;&lt;mi&gt;exp&lt;/mi&gt;&lt;mo&gt;⁡&lt;/mo&gt;&lt;mo stretchy="false"&gt;(&lt;/mo&gt;&lt;msub&gt;&lt;mi&gt;e&lt;/mi&gt;&lt;mrow&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;mi&gt;j&lt;/mi&gt;&lt;/mrow&gt;&lt;/msub&gt;&lt;mo stretchy="false"&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;mrow&gt;&lt;munderover&gt;&lt;mo&gt;∑&lt;/mo&gt;&lt;mrow&gt;&lt;mi&gt;k&lt;/mi&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/mrow&gt;&lt;msub&gt;&lt;mi&gt;T&lt;/mi&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;/msub&gt;&lt;/munderover&gt;&lt;mi&gt;exp&lt;/mi&gt;&lt;mo&gt;⁡&lt;/mo&gt;&lt;mo stretchy="false"&gt;(&lt;/mo&gt;&lt;msub&gt;&lt;mi&gt;e&lt;/mi&gt;&lt;mrow&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;mi&gt;j&lt;/mi&gt;&lt;/mrow&gt;&lt;/msub&gt;&lt;mo stretchy="false"&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;/mfrac&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;
\sigma_{ij} = \frac{\exp(e_{ij})}{\sum_{k=1}^{T_x}\exp(e_{ij})}
&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.716668em;vertical-align:-0.286108em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault" style="margin-right:0.03588em;"&gt;σ&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.311664em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:-0.03588em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathdefault mtight"&gt;i&lt;/span&gt;&lt;span class="mord mathdefault mtight" style="margin-right:0.05724em;"&gt;j&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.286108em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:2.597941em;vertical-align:-1.170941em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mopen nulldelimiter"&gt;&lt;/span&gt;&lt;span class="mfrac"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:1.427em;"&gt;&lt;span style="top:-2.128769em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mop"&gt;&lt;span class="mop op-symbol small-op" style="position:relative;top:-0.0000050000000000050004em;"&gt;∑&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.981231em;"&gt;&lt;span style="top:-2.40029em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathdefault mtight" style="margin-right:0.03148em;"&gt;k&lt;/span&gt;&lt;span class="mrel mtight"&gt;=&lt;/span&gt;&lt;span class="mord mtight"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-3.2029em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathdefault mtight" style="margin-right:0.13889em;"&gt;T&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.16454285714285719em;"&gt;&lt;span style="top:-2.357em;margin-left:-0.13889em;margin-right:0.07142857142857144em;"&gt;&lt;span class="pstrut" style="height:2.5em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size3 size1 mtight"&gt;&lt;span class="mord mathdefault mtight"&gt;x&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.143em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.29971000000000003em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mop"&gt;exp&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;e&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.311664em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathdefault mtight"&gt;i&lt;/span&gt;&lt;span class="mord mathdefault mtight" style="margin-right:0.05724em;"&gt;j&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.286108em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-3.23em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="frac-line" style="border-bottom-width:0.04em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-3.677em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mop"&gt;exp&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;e&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.311664em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathdefault mtight"&gt;i&lt;/span&gt;&lt;span class="mord mathdefault mtight" style="margin-right:0.05724em;"&gt;j&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.286108em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:1.170941em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose nulldelimiter"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h3 id="maxout"&gt;Maxout&lt;/h3&gt;
&lt;p&gt;The final layer, which returns the probabilities for each word, uses a &lt;a href="maxout.html"&gt;Maxout&lt;/a&gt; layer to generate the final probabilities. A Maxout layer acts as a form of regularisation. It projects the input vector onto multiple "buckets" and selects the maximum value from each bucket. This process introduces non-linearity and helps prevent overfitting, akin to dropout.&lt;/p&gt;
&lt;h2 id="training-params"&gt;Training Params&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Algorithm&lt;/strong&gt;: &lt;a href="stochasic-gradient-descent.html"&gt;Stochasic Gradient Descent&lt;/a&gt; (SGD)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Optimiser&lt;/strong&gt;: Adadelta (Zeiler, 2012)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Batch Size&lt;/strong&gt;: 80 sentences&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Training Duration&lt;/strong&gt;: Approximately 5 days per model&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Inference method&lt;/strong&gt;: Beam search&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Task&lt;/strong&gt;: English-to-French translation&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Dataset&lt;/strong&gt;: bilingual, parallel corpora provided by ACL WMT 14.&lt;ul&gt;
&lt;li&gt;Word count: 850 (reduced to 348M)&lt;/li&gt;
&lt;li&gt;Components:&lt;ul&gt;
&lt;li&gt;Europarl (61M words)&lt;/li&gt;
&lt;li&gt;News Commentary (5.5M)&lt;/li&gt;
&lt;li&gt;UN (421M)&lt;/li&gt;
&lt;li&gt;two crawled corpora of 90M and 272.5M words, respectively&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Metric&lt;/strong&gt;: &lt;a href="bleu-score.html"&gt;BLEU Score&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Tokeniser&lt;/strong&gt;: from open-source machine translation package Moses. They shortlist the most frequent 30k words and map everything else to &lt;code&gt;[UNK]&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Comparisons&lt;/strong&gt;: They compare RNNsearch with a standard RNN Encoder-Decoder, RNNenc and Moses, the state-of-the-art translation package.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Test Set&lt;/strong&gt;: For the test set, they evaluate &lt;code&gt;news-test-2014&lt;/code&gt; from WMT'14, which contains 3003 sentences not in training&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Valid Set&lt;/strong&gt;: They concat &lt;code&gt;news-test-2012&lt;/code&gt; and &lt;code&gt;news-test-2013&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Initialisation&lt;/strong&gt;: Orthogonal for recurrent weights, Gaussian ($0, 0.01^2$) for feed-forward weights, zeros for biases.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="results"&gt;Results&lt;/h2&gt;
&lt;p&gt;They record results on all test data with only examples that don't contain unknown tokens.&lt;/p&gt;
&lt;p&gt;The RNNsearch-50 model achieved a BLEU score of 34.16 on sentences with unknown tokens excluded, significantly outperforming the RNNencdec-50 model, which scored 26.71 and training RNNsearch-50 to convergence beat the state-of-the-art Moses. However, when unknown tokens are included, the model performs considerably worse.&lt;/p&gt;
&lt;p&gt;RNNsearch was much better at longer sentences than RNNenc.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Figure 2" src="../../_media/neural-machine-translation-by-jointly-learning-to-align-and-translate-sep-2014-fig-2.png"&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Figure 2: The BLEU scores of the generated translations on the test set with respect to the lengths of the sentences.&lt;/em&gt;&lt;/p&gt;
&lt;table class="table-border"&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Model&lt;/th&gt;
      &lt;th&gt;All&lt;/th&gt;
      &lt;th&gt;No UNK&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;RNNencdec-30&lt;/td&gt;
      &lt;td&gt;13.93&lt;/td&gt;
      &lt;td&gt;24.19&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;RNNsearch-30&lt;/td&gt;
      &lt;td&gt;21.50&lt;/td&gt;
      &lt;td&gt;31.44&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;RNNencdec-50&lt;/td&gt;
      &lt;td&gt;17.82&lt;/td&gt;
      &lt;td&gt;26.71&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;RNNsearch-50&lt;/td&gt;
      &lt;td&gt;26.75&lt;/td&gt;
      &lt;td&gt;34.16&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;RNNsearch-50*&lt;/td&gt;
      &lt;td&gt;28.45&lt;/td&gt;
      &lt;td&gt;36.15&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Moses&lt;/td&gt;
      &lt;td&gt;33.30&lt;/td&gt;
      &lt;td&gt;35.63&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;*Note: RNNsearch-50* was trained much longer until the performance on the development set stopped improving.&lt;/p&gt;
&lt;h2 id="interpreting-attention"&gt;Interpreting Attention&lt;/h2&gt;
&lt;p&gt;One benefit of calculating attention weights for each output word is that they are interpretable, allowing us to visualise word alignments.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Figure 3. Four sample alignments found by RNNsearch-50" src="../../_media/neural-machine-translation-by-jointly-learning-to-align-and-translate-sep-2014-fig-3.png"&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Figure 3. Four sample alignments that were found by RNNsearch-50.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;As we can see, typically, words are aligned to similarly positioned words in a sentence, but not always.&lt;/p&gt;
&lt;div class="footnote"&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id="fn:1"&gt;
&lt;p&gt;Cho, K., van Merrienboer, B., Gulcehre, C., Bahdanau, D., Bougares, F., Schwenk, H., &amp;amp; Bengio, Y. (2014). Learning phrase representations using RNN encoder-decoder for statistical machine translation. arXiv. https://arxiv.org/abs/1406.1078&amp;#160;&lt;a class="footnote-backref" href="#fnref:1" title="Jump back to footnote 1 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:2"&gt;
&lt;p&gt;Brauwers, G., &amp;amp; Frasincar, F. (2023). A general survey on attention mechanisms in deep learning. IEEE Transactions on Knowledge and Data Engineering, 35(4), 3279–3298. https://doi.org/10.1109/tkde.2021.3126456&amp;#160;&lt;a class="footnote-backref" href="#fnref:2" title="Jump back to footnote 2 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;a class="footnote-backref" href="#fnref2:2" title="Jump back to footnote 2 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</content><category term="reference"/><category term="AttentionMechanism"/></entry><entry><title>Thinking LLMs: General Instruction Following with Thought Generation (Oct 2024)</title><link href="http://localhost:8000/thinking-llms-general-instruction-following-with-thought-generation-oct-2024.html" rel="alternate"/><published>2024-10-16T00:00:00+10:00</published><updated>2024-10-16T10:00:00+10:00</updated><author><name>Lex Toumbourou</name></author><id>tag:localhost,2024-10-16:/thinking-llms-general-instruction-following-with-thought-generation-oct-2024.html</id><summary type="html">&lt;p&gt;a prompting and fine-tuning method that enables LLMs to engage in a &amp;quot;thinking&amp;quot; process before generating responses&lt;/p&gt;</summary><content type="html">&lt;p&gt;&lt;em&gt;These are my notes from the paper &lt;a href="https://arxiv.org/abs/2410.10630"&gt;Thinking LLMs: General Instruction Following with Thought Generation&lt;/a&gt; (Oct 2024) by Tianhao Wu, Janice Lan, Weizhe Yuan, Jiantao Jiao, Jason Weston and Sainbayar Sukhbaatar.&lt;/em&gt;&lt;/p&gt;
&lt;h2 id="overview"&gt;Overview&lt;/h2&gt;
&lt;p&gt;This paper introduces &lt;a href="thought-prompting.html"&gt;Thought Prompting&lt;/a&gt;, a prompting method that enables LLMs to engage in a "thinking" process before generating responses. Within the &lt;a href="agentic-reasoning.html"&gt;Agentic Reasoning&lt;/a&gt; framework, it would be considered a &lt;a href="planning.html"&gt;Planning&lt;/a&gt; technique.&lt;/p&gt;
&lt;p&gt;Unlike Chain-of-Thought prompting, which mainly benefits math and logic tasks, Thought Prompting improves results across many tasks.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Figure 4 - showing evaluation as win rate of TPO against baseline of GPT4" src="../../_media/thinking-llms-general-instruction-following-with-thought-generation-fig-4.png"&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Fig 4: Fine-grained evaluation on unseen instructions from UltraFeedback, broken down by category. They measure the win rate of TPO against the direct baseline as judged by GPT4.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;The method separates the thought process from the final answer, enabling developers to choose whether to display the thought process for interpretability or keep it hidden. For example, in Fig 6, you can see the response is separate from the thoughts using the &lt;code&gt;&amp;lt;R&amp;gt;&lt;/code&gt;; this works similarly to o1-preview, which also hides its internal thought process.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Fig 6: Example of TPO answer a question" src="../../_media/thinking-llms-general-instruction-following-with-thought-generation-fig-6.png"&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Fig 6: Example of TPO answering a simple factoid question. This model is trained with the specific thought prompt, so it writes a draft and evaluates it in the thought part.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Unlike &lt;a href="think-step-by-step.html"&gt;Think Step-by-Step&lt;/a&gt;, it relies on fine-tuning - it doesn't benefit "thoughtless" models. As shown in Fig 3, adding Thought Prompting to an untrained model worsens results.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Figure 3" src="../../_media/thinking-llms-general-instruction-following-with-thought-generation-fig-3.png"&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Fig 3: Training iterations on AlpacaEval and Arena-Hard, comparing their TPO method to direct baseline starting from the seed.&lt;/em&gt;*&lt;/p&gt;
&lt;h3 id="thought-prompt-optimisation"&gt;Thought Prompt Optimisation&lt;/h3&gt;
&lt;p&gt;The paper introduces &lt;a href="thought-policy-optimisation.html"&gt;Thought Policy Optimisation&lt;/a&gt; (TPO), a fine-tuning technique based on Direct Preference Optimisation (DPO). TPO uses a Judge model to evaluate model outputs based solely on the responses, without access to the thought process; this lets the model learn and refine its "thinking" abilities without relying on supervised thought data, asshowne in the diagram below.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Fig 1" src="../../_media/thinking-llms-general-instruction-following-with-thought-generation-fig-1.png"&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Figure 1: Thought Preference Optimisation: they start by prompting the LLM to generate thoughts before its response. After sampling different outputs, we feed the response parts to the judge model which determines the best and worst ones. Then, they use the corresponding full outputs as chosen and rejected pairs for DPO optimisation. They perform multiple iterations of this training.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Gets top 3 in AlpacaEval (52.5%) and performs on par with GPT4 in Arena-Hard (37.3%)&lt;/p&gt;</content><category term="reference"/><category term="AgenticReasoning"/><category term="System2Prompting"/></entry><entry><title>Mixtral of Experts (Jan 2024)</title><link href="http://localhost:8000/mixtral-of-experts-jan-2024.html" rel="alternate"/><published>2024-10-15T00:00:00+10:00</published><updated>2024-10-15T00:00:00+10:00</updated><author><name>Lex Toumbourou</name></author><id>tag:localhost,2024-10-15:/mixtral-of-experts-jan-2024.html</id><summary type="html">&lt;p&gt;a Sparse Mixture of Experts (SMoE) language model&lt;/p&gt;</summary><content type="html">&lt;p&gt;&lt;em&gt;These are my notes for paper &lt;a href="https://arxiv.org/abs/2401.04088"&gt;Mixtral of Experts&lt;/a&gt; (8 Jan 2024) by Albert Q. Jiang, Alexandre Sablayrolles, Antoine Roux, Arthur Mensch, Blanche Savary, Chris Bamford, Devendra Singh Chaplot, Diego de las Casas, Emma Bou Hanna, Florian Bressand, Gianna Lengyel, Guillaume Bour, Guillaume Lample, Lélio Renard Lavaud, Lucile Saulnier, Marie-Anne Lachaux, Pierre Stock, Sandeep Subramanian, Sophia Yang, Szymon Antoniak, Teven Le Scao, Théophile Gervet, Thibaut Lavril, Thomas Wang, Timothée Lacroix, William El Sayed.&lt;/em&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;This paper introduces &lt;a href="mixtral-8x7b.html"&gt;Mixtral 8x7B&lt;/a&gt;, a &lt;a href="sparse-mixture-of-experts-model.html"&gt;Sparse Mixture of Experts Model&lt;/a&gt; (SMoE) language model.&lt;/p&gt;
&lt;p&gt;The model uses an SMoE approach where each layer comprises eight "experts", and a router network selects two experts to process each token. Thanks to this, despite having 47B parameters, it only uses 13B active parameters during inference, which makes it more computationally efficient than other models (although it doesn't save any memory).&lt;/p&gt;
&lt;p&gt;It outperforms Llama 2 70B and GPT-3.5 on many benchmarks, particularly in mathematics, code generation, and multilingual tasks.&lt;/p&gt;
&lt;p&gt;They also present &lt;a href="mixtral-8x7b-instruct.html"&gt;Mixtral 8x7B – Instruct&lt;/a&gt;, a chat model fine-tuned to follow instructions, which outperforms other chat models like GPT-3.5 Turbo and Llama 2 70B – chat.&lt;/p&gt;
&lt;p&gt;The base and instruct models are released under the Apache 2.0 license, making them freely available for academic and commercial use.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Architecture&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Mixtral is based on a &lt;a href="transformer.html"&gt;Transformer&lt;/a&gt; architecture. It uses the same modifications as Mistral 7b, except each layer comprises 8 Mixture-of-Expert layers, which replace typical feedforward blocks.&lt;/p&gt;
&lt;p&gt;At each layer, a router selects two experts for every token to process the request.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Figure 1" src="../../_media/mixtral-of-experts-fig-1.png"&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Figure 1: Mixture of Experts Layers. Each input vector is assigned to 2 of the 8 experts by a router. The layer's output is the weighted sum of the outputs of the two selected experts (using Softmax weights). In Mixtral, an expert is a standard feedforward block as in a vanilla transformer architecture&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;In code:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;moe_layer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Wg&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;  &lt;span class="c1"&gt;# x: input token, Wg: gating network weights&lt;/span&gt;
  &lt;span class="n"&gt;top2_logits&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;top_k&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;@&lt;/span&gt; &lt;span class="n"&gt;Wg&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# Get top 2 expert activations&lt;/span&gt;
  &lt;span class="n"&gt;gating_weights&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;softmax&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;top2_logits&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# Weights for each expert&lt;/span&gt;
  &lt;span class="n"&gt;expert_outputs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;expert_i&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;expert_i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;experts&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;  &lt;span class="c1"&gt;# Run chosen experts&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;gating_weights&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;expert_outputs&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

&lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;moe_layer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Wg&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Mixtral supports a fully dense context length of 32k tokens.&lt;/p&gt;
&lt;p&gt;Architecture details&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Parameter&lt;/th&gt;
&lt;th&gt;Value&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;dim&lt;/td&gt;
&lt;td&gt;4096&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;n_layers&lt;/td&gt;
&lt;td&gt;32&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;head_dim&lt;/td&gt;
&lt;td&gt;128&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;hidden_dim&lt;/td&gt;
&lt;td&gt;14336&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;n_heads&lt;/td&gt;
&lt;td&gt;32&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;n_kv_heads&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;context_len&lt;/td&gt;
&lt;td&gt;32768&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;vocab_size&lt;/td&gt;
&lt;td&gt;32000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;num_experts&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;top_k_experts&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;Routing Analysis&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Surprisingly, the experts don't specialise in particular domains or topics based on different datasets.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Figure 7" src="../../_media/mixtral-of-experts-fig7.png"&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Figure 7: Proportion of tokens assigned to each expert on different domains from The Pile dataset for layers 0, 15, and 31. The gray dashed vertical line marks 1/8, i.e. the proportion expected with uniform sampling..&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Also, the router exhibits temporal locality - it's more likely to assign the same experts to consecutive tokens - the router is recognising and leveraging the sequential nature of language.&lt;/p&gt;
&lt;h2 id="evaluation"&gt;Evaluation&lt;/h2&gt;
&lt;p&gt;Mixtral outperforms or matches Llama 2 70B on a wide range of benchmarks, including commonsense reasoning, word knowledge, reading comprehension, math, and code generation.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Figure 2" src="../../_media/mixtral-of-experts-fig2.png"&gt;
Mixtral is particularly strong in mathematical and coding tasks, significantly surpassing Llama 2 70B.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;MMLU and MT Bench&lt;/strong&gt;: Mixtral performs similarly or better than GPT-3.5 on MMLU and MT Bench despite its smaller size. Although some differences in evaluation protocols between Mixtral and Llama 2 may affect direct comparisons.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Multilingual Proficiency&lt;/strong&gt;: Mixtral significantly outperforms Llama 2 70B in French, German, Spanish, and Italian, demonstrating its strong multilingual capabilities.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Long Context Handling&lt;/strong&gt;: Mixtral can effectively process long sequences, achieving 100% accuracy on the passkey retrieval task regardless of context length or passkey position.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Bias Mitigation&lt;/strong&gt;: Compared to Llama 2, Mixtral exhibits less bias on the BBQ and BOLD benchmarks, indicating improved fairness and reduced bias in its responses.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Positive Sentiment&lt;/strong&gt;: Mixtral consistently displays more positive sentiments than Llama 2, suggesting a more optimistic and encouraging tone in its generated text.&lt;/p&gt;</content><category term="reference"/></entry><entry><title>Evaluation of OpenAI o1: Opportunities and Challenges of AGI</title><link href="http://localhost:8000/evaluation-of-openai-o1-opportunities-and-challenges-of-agi.html" rel="alternate"/><published>2024-10-14T00:00:00+10:00</published><updated>2024-10-14T00:00:00+10:00</updated><author><name>Lex Toumbourou</name></author><id>tag:localhost,2024-10-14:/evaluation-of-openai-o1-opportunities-and-challenges-of-agi.html</id><summary type="html">&lt;p&gt;a comprehensive evaluation of o1-preview across many tasks and domains.&lt;/p&gt;</summary><content type="html">&lt;p&gt;This report comprehensively analyses the o1-preview across many tasks and domains. In short, o1-preview significantly improves over gpt4 in all areas, albeit at the cost of inference performance. There are some areas where it continues to struggle, particularly advanced reasoning, creativity and understanding nuanced human-language, however, it is clearly a leap forward, and there's a lot of evidence to suggest it will continue to improve.&lt;/p&gt;
&lt;p&gt;A recent paper &lt;a href="gsm-symbolic-understanding-the-limitations-of-mathematical-reasoning-in-large-language-models.html"&gt;GSM-Symbolic: Understanding the Limitations of Mathematical Reasoning in Large Language Models&lt;/a&gt; has found that by modifying the GSM test set, i.e. by adding distracting information, or modifying the numbers used in the equation, they see a considerable drop in performance in all LLM models, which people have suggest means that LLMS "can't reason". However, notably o1-preview is the most robust to these perturbations in the test set.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Figure 8." src="../../_media/evaluation-of-openai-o1-opportunities-and-challenges-of-agi-fig8.png"&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Figure 8. from &lt;a href="gsm-symbolic-understanding-the-limitations-of-mathematical-reasoning-in-large-language-models.html"&gt;GSM-Symbolic: Understanding the Limitations of Mathematical Reasoning in Large Language Models&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;h2 id="categories-tested"&gt;Categories tested&lt;/h2&gt;
&lt;p&gt;Note that I haven't included all the areas tested in the paper, just a few of interest.&lt;/p&gt;
&lt;h3 id="high-school-level-math"&gt;High School Level Math&lt;/h3&gt;
&lt;p&gt;o1-preview achieves 100% accuracy in high school-level mathematical reasoning tasks (although these are likely in the training set according to &lt;a href="gsm-symbolic-understanding-the-limitations-of-mathematical-reasoning-in-large-language-models.html"&gt;GSM-Symbolic: Understanding the Limitations of Mathematical Reasoning in Large Language Models&lt;/a&gt;).&lt;/p&gt;
&lt;h3 id="college-level-math"&gt;College Level Math&lt;/h3&gt;
&lt;p&gt;o1-preview answers 7 out of 12 questions right. Mostly had difficulty with advanced discrete mathematics problems and proof-writing.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Table 5." src="../../_media/evaluation-of-openai-o1-opportunities-and-challenges-of-agi-table-5.png"&gt;&lt;/p&gt;
&lt;h3 id="logical-reasoning"&gt;Logical Reasoning&lt;/h3&gt;
&lt;p&gt;o1-preview consistently excels in logical reasoning tasks, successfully solving mathematical puzzles, deducing sequences, and evaluating arguments. The authors note that although the final answer is not always accurate, the analysis and reasoning process is "truly convincing".&lt;/p&gt;
&lt;h3 id="natural-language-inference"&gt;Natural Language Inference&lt;/h3&gt;
&lt;p&gt;Across diverse NLI datasets, o1-preview demonstrated high accuracy, successfully analysing complex logical relationships between sentences, signifying advanced reasoning capabilities and a strong grasp of domain-specific knowledge.&lt;/p&gt;
&lt;h3 id="quantitative-investing"&gt;Quantitative Investing&lt;/h3&gt;
&lt;p&gt;o1-preview exhibits a strong understanding of financial knowledge and statistical modelling techniques, enabling it to perform well in quantitative investing tasks. The model demonstrates a comprehensive knowledge and clear explanations of complex concepts like mean reversion, ARIMA models, and stochastic oscillators.&lt;/p&gt;
&lt;h3 id="educational-qa"&gt;Educational Q&amp;amp;A&lt;/h3&gt;
&lt;p&gt;o1-preview excels in answering educational questions, highlighting its potential as a valuable tool in academic settings. Its ability to accurately select the correct answer from a set of options reflects a robust comprehension of scientific concepts and the capacity to navigate misleading distractors.&lt;/p&gt;
&lt;h3 id="medical-genetics-and-genomics-reasoning"&gt;Medical Genetics and Genomics Reasoning&lt;/h3&gt;
&lt;p&gt;o1-preview consistently demonstrates strong reasoning abilities in genomics and medical genetics. It can generate reliable conclusions and provide detailed, step-by-step explanations when gene and disease descriptions are provided. The model employs a chain-of-thought process based on factual information to make decisions.&lt;/p&gt;
&lt;h3 id="medical-knowledge-question-answer"&gt;Medical Knowledge Question Answer&lt;/h3&gt;
&lt;p&gt;o1-preview displays impressive accuracy in answering medical knowledge questions, particularly those found in real-world medical exams. It effectively retrieves key information from the questions, providing accurate answers and offering detailed explanations. While occasional gaps in information or illogical reasoning may occur, the overall reasoning process aligns with factual data. It may choose the correct option but miss key conditions while evaluating incorrect options.&lt;/p&gt;
&lt;h3 id="chip-design"&gt;Chip Design&lt;/h3&gt;
&lt;p&gt;In chip design, o1-preview consistently outperforms ChipNeMo, a specialised model designed for this domain. o1-preview exhibits superior problem-solving capabilities, a deeper level of analysis, and practical relevance across tasks such as Engineering Assistant Chatbot, EDA Script Generation, and Bug Summary and Analysis. The model's ability to optimise code, handle intricate netlist structures, and offer insightful suggestions for power optimisation and task prioritisation demonstrates its advanced reasoning and potential to significantly benefit chip design automation.&lt;/p&gt;
&lt;h3 id="student-writing"&gt;Student Writing&lt;/h3&gt;
&lt;p&gt;While proficient in student writing, o1-preview tends to generate responses that adhere to a rigid, machine-like template, lacking citations; this could encourage students to adopt such structures passively, potentially hindering their writing's creativity and effectiveness.&lt;/p&gt;
&lt;h3 id="social-media-analysis"&gt;Social Media Analysis&lt;/h3&gt;
&lt;p&gt;Although o1-preview demonstrates strong overall performance in social media analysis, it sometimes makes errors in sentiment analysis and emotion recognition. It might misinterpret neutral sentiment as negative or struggle to differentiate between positive and negative sentiment when both are present. The sources attribute these errors to the model's difficulty understanding subtle emotional cues, such as sarcasm and tone.&lt;/p&gt;
&lt;h3 id="code-generation"&gt;Code Generation&lt;/h3&gt;
&lt;p&gt;While o1-preview performs well in code generation, optimising solutions for more complex problems is difficult, especially under time constraints. It got 10 out of 12 correct. It's still good.&lt;/p&gt;
&lt;h3 id="radiology-report-generation"&gt;Radiology Report Generation&lt;/h3&gt;
&lt;p&gt;Although o1-preview achieves high ROUGE scores in Radiology report generation, indicating good performance, it also has the longest average generation time compared to other models.&lt;/p&gt;</content><category term="reference"/><category term="AgenticReasoning"/><category term="LargeLanguageModels"/></entry><entry><title>AI Meets the Classroom: When Does ChatGPT Harm Learning?</title><link href="http://localhost:8000/ai-meets-the-classroom-when-does-chatgpt-harm-learning.html" rel="alternate"/><published>2024-10-13T00:00:00+10:00</published><updated>2026-05-06T00:00:00+10:00</updated><author><name>Lex Toumbourou</name></author><id>tag:localhost,2024-10-13:/ai-meets-the-classroom-when-does-chatgpt-harm-learning.html</id><summary type="html">&lt;p&gt;LLMs can help and also hinder learning outcomes&lt;/p&gt;</summary><content type="html">&lt;p&gt;&lt;em&gt;My notes from the paper &lt;a href="https://arxiv.org/abs/2409.09047"&gt;AI Meets the Classroom: When Does ChatGPT Harm Learning?&lt;/a&gt; by Matthias Lehmann, Philipp B. Cornelius, Fabian J. Sting.&lt;/em&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="summary"&gt;Summary&lt;/h2&gt;
&lt;p&gt;This paper covers one observational and two experimental studies on the effects of LLM access on students learning to code.&lt;/p&gt;
&lt;p&gt;Key findings:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Using LLMs as personal tutors by asking them for explanations improves topic understanding, though not overall learning outcomes (likely because it reduces the volume of topics covered).&lt;/li&gt;
&lt;li&gt;Asking LLMs to generate solutions impairs understanding. The use of copy-and-paste encourages this behaviour, tripling solution requests without increasing explanation requests.&lt;/li&gt;
&lt;li&gt;Students with stronger prior knowledge benefit more from LLM usage. Students with weaker foundations learned &lt;em&gt;less&lt;/em&gt; with AI access.&lt;/li&gt;
&lt;li&gt;LLM access increases students' perceived learning beyond their actual learning outcome, i.e. students think it's a lot more helpful than it is.&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;p&gt;In the field study (Study 1), they compare students' work with a number of solutions generated by ChatGPT as a proxy for the use of LLMs. They call this &lt;a href="chatgpt-similarity.html"&gt;ChatGPT Similarity&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;To calculate this, they generate 50 ChatGPT solutions and then take the maximum similarity with a student's code:&lt;/p&gt;
&lt;p&gt;&lt;span class="katex-display"&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;msub&gt;&lt;mtext&gt;ChatGPT Similarity&lt;/mtext&gt;&lt;mrow&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;mi&gt;q&lt;/mi&gt;&lt;/mrow&gt;&lt;/msub&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mi&gt;max&lt;/mi&gt;&lt;mo&gt;⁡&lt;/mo&gt;&lt;mrow&gt;&lt;mo fence="true"&gt;(&lt;/mo&gt;&lt;mtext&gt;sim&lt;/mtext&gt;&lt;mo stretchy="false"&gt;(&lt;/mo&gt;&lt;msub&gt;&lt;mtext&gt;Code&lt;/mtext&gt;&lt;mrow&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;mi&gt;q&lt;/mi&gt;&lt;/mrow&gt;&lt;/msub&gt;&lt;mo separator="true"&gt;,&lt;/mo&gt;&lt;msubsup&gt;&lt;mtext&gt;Code&lt;/mtext&gt;&lt;mrow&gt;&lt;mi&gt;j&lt;/mi&gt;&lt;mi&gt;q&lt;/mi&gt;&lt;/mrow&gt;&lt;mrow&gt;&lt;mi&gt;L&lt;/mi&gt;&lt;mi&gt;L&lt;/mi&gt;&lt;mi&gt;M&lt;/mi&gt;&lt;/mrow&gt;&lt;/msubsup&gt;&lt;mo stretchy="false"&gt;)&lt;/mo&gt;&lt;mo&gt;∣&lt;/mo&gt;&lt;mi&gt;j&lt;/mi&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;mo separator="true"&gt;,&lt;/mo&gt;&lt;mo&gt;…&lt;/mo&gt;&lt;mo separator="true"&gt;,&lt;/mo&gt;&lt;mn&gt;50&lt;/mn&gt;&lt;mo fence="true"&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;
\text{ChatGPT Similarity}_{iq} = \max \left( \text{sim}( \text{Code}_{iq}, \text{Code}^{LLM}_{jq} ) \mid j = 1, \dots, 50 \right)
&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1.0746879999999999em;vertical-align:-0.380248em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord text"&gt;&lt;span class="mord"&gt;ChatGPT Similarity&lt;/span&gt;&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.217524em;"&gt;&lt;span style="top:-2.4558600000000004em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathdefault mtight"&gt;i&lt;/span&gt;&lt;span class="mord mathdefault mtight" style="margin-right:0.03588em;"&gt;q&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.380248em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1.80002em;vertical-align:-0.65002em;"&gt;&lt;/span&gt;&lt;span class="mop"&gt;max&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="minner"&gt;&lt;span class="mopen delimcenter" style="top:0em;"&gt;&lt;span class="delimsizing size2"&gt;(&lt;/span&gt;&lt;/span&gt;&lt;span class="mord text"&gt;&lt;span class="mord"&gt;sim&lt;/span&gt;&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord text"&gt;&lt;span class="mord"&gt;Code&lt;/span&gt;&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.311664em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathdefault mtight"&gt;i&lt;/span&gt;&lt;span class="mord mathdefault mtight" style="margin-right:0.03588em;"&gt;q&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.286108em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mpunct"&gt;,&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord text"&gt;&lt;span class="mord"&gt;Code&lt;/span&gt;&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.9256709999999999em;"&gt;&lt;span style="top:-2.4530000000000003em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathdefault mtight" style="margin-right:0.05724em;"&gt;j&lt;/span&gt;&lt;span class="mord mathdefault mtight" style="margin-right:0.03588em;"&gt;q&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-3.1473400000000002em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathdefault mtight"&gt;L&lt;/span&gt;&lt;span class="mord mathdefault mtight"&gt;L&lt;/span&gt;&lt;span class="mord mathdefault mtight" style="margin-right:0.10903em;"&gt;M&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.383108em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;∣&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.05724em;"&gt;j&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;1&lt;/span&gt;&lt;span class="mpunct"&gt;,&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="minner"&gt;…&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mpunct"&gt;,&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;5&lt;/span&gt;&lt;span class="mord"&gt;0&lt;/span&gt;&lt;span class="mclose delimcenter" style="top:0em;"&gt;&lt;span class="delimsizing size2"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;for student &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;i&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.65952em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;i&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; and question &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;q&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;q&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.625em;vertical-align:-0.19444em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.03588em;"&gt;q&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;, where &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;msub&gt;&lt;mtext&gt;Code&lt;/mtext&gt;&lt;mrow&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;mi&gt;q&lt;/mi&gt;&lt;/mrow&gt;&lt;/msub&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;\text{Code}_{iq}&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.980548em;vertical-align:-0.286108em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord text"&gt;&lt;span class="mord"&gt;Code&lt;/span&gt;&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.311664em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathdefault mtight"&gt;i&lt;/span&gt;&lt;span class="mord mathdefault mtight" style="margin-right:0.03588em;"&gt;q&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.286108em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; is the final student code, &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;msubsup&gt;&lt;mtext&gt;Code&lt;/mtext&gt;&lt;mrow&gt;&lt;mi&gt;j&lt;/mi&gt;&lt;mi&gt;q&lt;/mi&gt;&lt;/mrow&gt;&lt;mrow&gt;&lt;mi&gt;L&lt;/mi&gt;&lt;mi&gt;L&lt;/mi&gt;&lt;mi&gt;M&lt;/mi&gt;&lt;/mrow&gt;&lt;/msubsup&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;\text{Code}^{LLM}_{jq}&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1.308779em;vertical-align:-0.383108em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord text"&gt;&lt;span class="mord"&gt;Code&lt;/span&gt;&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.9256709999999999em;"&gt;&lt;span style="top:-2.4530000000000003em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathdefault mtight" style="margin-right:0.05724em;"&gt;j&lt;/span&gt;&lt;span class="mord mathdefault mtight" style="margin-right:0.03588em;"&gt;q&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-3.1473400000000002em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathdefault mtight"&gt;L&lt;/span&gt;&lt;span class="mord mathdefault mtight"&gt;L&lt;/span&gt;&lt;span class="mord mathdefault mtight" style="margin-right:0.10903em;"&gt;M&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.383108em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; is one of the 50 ChatGPT generated solutions, &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;j&lt;/mi&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;mo separator="true"&gt;,&lt;/mo&gt;&lt;mo&gt;…&lt;/mo&gt;&lt;mo separator="true"&gt;,&lt;/mo&gt;&lt;mn&gt;50&lt;/mn&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;j = 1, \dots, 50&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.85396em;vertical-align:-0.19444em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.05724em;"&gt;j&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.8388800000000001em;vertical-align:-0.19444em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;1&lt;/span&gt;&lt;span class="mpunct"&gt;,&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="minner"&gt;…&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mpunct"&gt;,&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;5&lt;/span&gt;&lt;span class="mord"&gt;0&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;, and &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mtext&gt;sim&lt;/mtext&gt;&lt;mo stretchy="false"&gt;(&lt;/mo&gt;&lt;mo&gt;⋅&lt;/mo&gt;&lt;mo separator="true"&gt;,&lt;/mo&gt;&lt;mo&gt;⋅&lt;/mo&gt;&lt;mo stretchy="false"&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;\text{sim}(\cdot, \cdot)&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1em;vertical-align:-0.25em;"&gt;&lt;/span&gt;&lt;span class="mord text"&gt;&lt;span class="mord"&gt;sim&lt;/span&gt;&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord"&gt;⋅&lt;/span&gt;&lt;span class="mpunct"&gt;,&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;⋅&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; is &lt;a href="damerau-levenshtein.html"&gt;Damerau Levenshtein&lt;/a&gt; similarity.&lt;/p&gt;
&lt;p&gt;The lab experiments (Studies 2 and 3) instead directly randomised LLM access, comparing treatment (with LLM) and control (without) conditions with pre- and post-tests.&lt;/p&gt;</content><category term="reference"/><category term="LearningWithAI"/><category term="LearningandTeaching"/></entry><entry><title>System 2 Thinking</title><link href="http://localhost:8000/system-2-thinking.html" rel="alternate"/><published>2024-10-13T00:00:00+10:00</published><updated>2024-10-13T00:00:00+10:00</updated><author><name>Lex Toumbourou</name></author><id>tag:localhost,2024-10-13:/system-2-thinking.html</id><summary type="html">&lt;p&gt;System 2 thinking is characterised by slow, deliberate, and logical reasoning, requiring conscious effort and attention to solve complex problems. Unlike the intuitive nature of …&lt;/p&gt;</summary><content type="html">&lt;p&gt;System 2 thinking is characterised by slow, deliberate, and logical reasoning, requiring conscious effort and attention to solve complex problems. Unlike the intuitive nature of &lt;a href="system-1-thinking.html"&gt;System 1 Thinking&lt;/a&gt;, System 2 is responsible for critical thinking, reasoning, and decision-making in unfamiliar or challenging situations &lt;sup id="fnref:1"&gt;&lt;a class="footnote-ref" href="#fn:1"&gt;1&lt;/a&gt;&lt;/sup&gt;.&lt;/p&gt;
&lt;div class="footnote"&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id="fn:1"&gt;
&lt;p&gt;Kahneman, D. (2011). Thinking, Fast and Slow. Farrar, Straus and Giroux&amp;#160;&lt;a class="footnote-backref" href="#fnref:1" title="Jump back to footnote 1 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</content><category term="permanent"/></entry><entry><title>No 'Zero-Shot' Without Exponential Data: Pretraining Concept Frequency Determines Multimodal Model Performance</title><link href="http://localhost:8000/no-zero-shot-without-exponential-data-pretraining-concept-frequency-determines-multimodal-model-performance.html" rel="alternate"/><published>2024-10-03T00:00:00+10:00</published><updated>2024-10-03T00:00:00+10:00</updated><author><name>Lex Toumbourou</name></author><id>tag:localhost,2024-10-03:/no-zero-shot-without-exponential-data-pretraining-concept-frequency-determines-multimodal-model-performance.html</id><summary type="html">&lt;p&gt;a paper that shows a model needs to see a concept exponentially more times to achieve linear improvements&lt;/p&gt;</summary><content type="html">&lt;h1 id="data"&gt;Data&lt;/h1&gt;
&lt;p&gt;Notes from paper &lt;a href="https://arxiv.org/abs/2404.04125"&gt;No "Zero-Shot" Without Exponential Data: Pretraining Concept Frequency Determines Multimodal Model Performance&lt;/a&gt; by Vishaal Udandarao, Ameya Prabhu, Adhiraj Ghosh, Yash Sharma, Philip H.S. Torr, Adel Bibi, Samuel Albanie and Matthias Bethge.&lt;/p&gt;
&lt;h2 id="overview"&gt;Overview&lt;/h2&gt;
&lt;p&gt;The authors analyse 30GB of data from multimodal datasets (CC-3M, CC-12M, YFCC-15M, LAION-400M, LAION-Aesthetics) used to train models like &lt;a href="contrastive-language-image-pretraining.html"&gt;CLIP&lt;/a&gt; and Stable-Diffusion and build a pipeline to extract "concepts" (nouns like "man", "hat", "fish").&lt;/p&gt;
&lt;p&gt;&lt;img alt="Figure 1." src="../../_media/no-zero-shot-without-exponential-data-pretraining-concept-frequency-determines-multimodal-model-performance-fig-1.png"&gt;&lt;/p&gt;
&lt;p&gt;They determine a log-linear relationship between concept frequency and zero-shot performance: The model needs to see exponentially more examples in training to achieve a linear zero-shot performance increase for a concept.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Figure 2." src="../../_media/no-zero-shot-without-exponential-data-pretraining-concept-frequency-determines-multimodal-model-performance-fig-2.png"&gt;&lt;/p&gt;
&lt;p&gt;They also find some interesting discoveries in these web-scraped datasets:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Concept Distribution: Across all pre-training datasets, concepts are long-tailed: a large fraction of concepts are rare, and the rare concepts are not properly learned during multimodal pretraining.&lt;/li&gt;
&lt;li&gt;Concept Correlation across Pre-training Datasets: The distribution of concepts across different pretraining datasets is strongly correlated, suggesting different web crawl datasets mostly contain the same stuff and share similar problems.&lt;/li&gt;
&lt;li&gt;Image-Text Misalignment between Concepts in Pre-training Data: They identify a wide-scale misalignment problem between pairs where concepts can appear in one modality but not the other. In some cases, up to 36% of pairs are misaligned in publicly available datasets.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;They curate a dataset called &lt;a href="let-it-wag.html"&gt;Let It Wag&lt;/a&gt; that identifies the least frequent concepts across the web scrapes (examples: A310 aircraft, a worm snake, and a tropical kingbird). It was found that performance across classification models and image generation tasks is considerably worse (as compared to ImageNet) on this dataset.&lt;/p&gt;</content><category term="reference"/><category term="DatasetConcepts"/></entry><entry><title>Agentic Reasoning</title><link href="http://localhost:8000/agentic-reasoning.html" rel="alternate"/><published>2024-08-25T00:00:00+10:00</published><updated>2024-08-25T00:00:00+10:00</updated><author><name>Lex Toumbourou</name></author><id>tag:localhost,2024-08-25:/agentic-reasoning.html</id><summary type="html">&lt;p&gt;an approach to utilising LLMs that involve multi-state interactions.&lt;/p&gt;</summary><content type="html">&lt;p&gt;&lt;strong&gt;Agentic Reasoning&lt;/strong&gt; refers to strategies in which &lt;a href="large-language-models.html"&gt;Large Language Models&lt;/a&gt; can route between states like planning, reflecting, observing, and utilising tools, allowing them to take actions and handle much more complex tasks. Unlike traditional LLM approaches focusing on single-turn responses, agentic reasoning involves multi-step interactions, enabling the model to dynamically adjust its behaviour based on context and goals.&lt;/p&gt;
&lt;p&gt;LLMs are called &lt;a href="ai-agents.html"&gt;AI Agents&lt;/a&gt; within this framework. Agents can take on different roles or states, like planning actions, using tools, reflecting on their own outputs, and storing information for long-term use. In &lt;a href="multi-agent-systems.html"&gt;Multi-Agent Systems&lt;/a&gt;, an agent can collaborate with other agents.&lt;/p&gt;
&lt;p&gt;&lt;img alt="agentic-reasoning-overview.png" src="../_media/agentic-reasoning-overview.png"&gt;&lt;/p&gt;
&lt;p&gt;In contrast, non-agentic workflows include direct methods like &lt;a href="zero-shot-prompting.html"&gt;Zero-Shot Prompting&lt;/a&gt;, where the LLM returns the result based on a single prompt. Some techniques from agentic reasoning are also used in zero-shot prompting, so the line between agentic and non-agentic is not always clear.&lt;/p&gt;
&lt;p&gt;However, there are a series of &lt;a href="https://www.deeplearning.ai/the-batch/how-agents-can-improve-llm-performance"&gt;"design patterns"&lt;/a&gt; that are indicative of an agentic system.&lt;/p&gt;
&lt;h3 id="tool-use"&gt;&lt;a href="tool-use.html"&gt;Tool Use&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;The clearest example of when an LLM becomes an AI Agent is when it calls another tool to do a job—for instance, booking a flight via an API or sending an email. This interaction allows the LLM to extend beyond text generation and perform meaningful actions in the real world.&lt;/p&gt;
&lt;p&gt;Typically, approaches to tool use allow the model to generate command sequences that get translated into API commands, such as &lt;a href="atomic-actions.html"&gt;Atomic Actions&lt;/a&gt;, which are LLM outputs that can be mapped into API commands. Alternatively, the LLM may generate code used to call a tool. Recent papers like &lt;a href="toolgen-unified-tool-retrieval-and-calling-via-generation.html"&gt;ToolGen: Unified Tool Retrieval and Calling via Generation&lt;/a&gt; explore embedding tool commands directly into the model's vocabulary.&lt;/p&gt;
&lt;p&gt;Other examples include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="gorilla-large-language-model-connected-with-massive-apis.html"&gt;Gorilla Large Language Model Connected with Massive APIs&lt;/a&gt; - they fine-tune a model that can perform tasks by retrieving API documents and calling functions. They use test-time modifications to ensure that the model can handle changes to APIs and is not limited to information in pre-training.&lt;/li&gt;
&lt;li&gt;&lt;a href="mm-react-prompting-chatgpt-for-multimodal-reasoning-and-action.html"&gt;MM-REACT Prompting ChatGPT for Multimodal Reasoning and Action&lt;/a&gt; - they use prompting techniques to allow ChatGPT to call vision models and other models to answer questions.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="memory"&gt;&lt;a href="memory.html"&gt;Memory&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Incorporating long-term memory allows LLMs to store and recall information over extended interactions Recent papers have introduced a paradigm of long-term memory, such as &lt;a href="raise.html"&gt;RAISE&lt;/a&gt; and &lt;a href="reflexion.html"&gt;Reflexion&lt;/a&gt; allowing models to remember past actions and outcomes, enhancing future performance.&lt;/p&gt;
&lt;h3 id="planning"&gt;&lt;a href="planning.html"&gt;Planning&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Planning involves decomposing tasks into smaller, manageable steps. Techniques like &lt;a href="chain-of-thought-prompting.html"&gt;Chain-of-Thought Prompting&lt;/a&gt; encourage models to generate intermediate reasoning steps, significantly improving their ability to solve complex problems.&lt;/p&gt;
&lt;p&gt;Systems may employ:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="open-loop-planning.html"&gt;Open-loop Planning&lt;/a&gt;: Creating and executing an entire plan without adjustments.&lt;/li&gt;
&lt;li&gt;&lt;a href="closed-loop-planning.html"&gt;Closed-loop Planning&lt;/a&gt;: Planning an action, executing it, observing the outcome, and then planning the next step based on the new state.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="acting-observing"&gt;Acting / Observing&lt;/h3&gt;
&lt;p&gt;In agentic systems, the model performs actions and then observes the results, updating its plans based on feedback. This iterative process allows the agent to adapt to new information and refine its strategies accordingly.&lt;/p&gt;
&lt;h3 id="reflection"&gt;&lt;a href="reflection.html"&gt;Reflection&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Reflection enables an agent to analyse its outputs and reasoning processes. Methods like &lt;a href="self-refine.html"&gt;Self-Refine&lt;/a&gt; allow an LLM to critique and improve its responses iteratively, enhancing the quality and accuracy of its outputs.&lt;/p&gt;</content><category term="permanent"/><category term="LargeLanguageModels"/><category term="AgenticReasoning"/></entry><entry><title>Waffle Chart</title><link href="http://localhost:8000/waffle-chart.html" rel="alternate"/><published>2024-07-24T00:00:00+10:00</published><updated>2024-07-24T00:00:00+10:00</updated><author><name>Lex Toumbourou</name></author><id>tag:localhost,2024-07-24:/waffle-chart.html</id><summary type="html">&lt;p&gt;A data visualization that uses squares along a 2D grid for representing proportion.&lt;/p&gt;</summary><content type="html">&lt;p&gt;A &lt;strong&gt;Waffle Chart&lt;/strong&gt; is a &lt;a href="data-visualisation.html"&gt;Data Visualisation&lt;/a&gt; where data points are represented as squares on a 2D grid. It's used for displaying the proportion or count of each category, for example, showing voting results across a population.&lt;/p&gt;
&lt;p&gt;For example, this Waffle Chart shows the 2020 Presidential Election Electoral College Results, highlighting the closeness of the contest and giving a sense of proportion.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Example Waffle Chart showing the Presidential Electoral College Results" src="../_media/waffle_example_2020_pres.png"&gt;&lt;/p&gt;
&lt;p&gt;Waffle Charts are particularly effective when you need to show parts of a whole, and can often be more visually engaging than a &lt;a href="pie-chart.html"&gt;Pie Chart&lt;/a&gt;.&lt;/p&gt;</content><category term="permanent"/><category term="DataVisualisation"/></entry><entry><title>Scaled-Dot Product Attention</title><link href="http://localhost:8000/scaled-dot-product-attention.html" rel="alternate"/><published>2024-03-13T00:00:00+10:00</published><updated>2024-03-13T00:00:00+10:00</updated><author><name>Lex Toumbourou</name></author><id>tag:localhost,2024-03-13:/scaled-dot-product-attention.html</id><summary type="html">&lt;p&gt;a method of computing a token representation that includes the context of surrounding tokens.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Scaled-Dot Product Attention is a method of computing a token representation to include the context of surrounding tokens. It was described in the paper &lt;a href="attention-is-all-you-need.html"&gt;Attention Is All You Need&lt;/a&gt; and is used in the &lt;a href="transformer.html"&gt;Transformer&lt;/a&gt; architecture.&lt;/p&gt;
&lt;p&gt;In a seq-to-seq architecture, we typically convert tokens (words) into a sequence of embeddings. However, some token embeddings will be ambiguous without the surrounding context.&lt;/p&gt;
&lt;p&gt;Consider the word "minute" in these two sentences:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;"It took one &lt;strong&gt;minute&lt;/strong&gt;."&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;and&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;"The size was &lt;strong&gt;minute&lt;/strong&gt;."&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The token representing &lt;strong&gt;minute&lt;/strong&gt; will mean very different things in each sentence, even though they will use the same embedding representation. The words "took" and "size" indicate whether the word relates to time or size, respectively. We want a way to represent each token with information about important surrounding tokens.&lt;/p&gt;
&lt;p&gt;We could use a simple average to achieve this. However, in the &lt;strong&gt;minute&lt;/strong&gt; cases, some words are more important to defining the context than others. Could we also use a neural network to compute the weights for each other tokens in sequence to have the most useful average representation? That's exactly what Scaled-Dot Product Attention is.&lt;/p&gt;
&lt;p&gt;Scaled-Dot Product Attention uses two matrix projections to compute the scores of other tokens in the sequence, then a softmax to convert to weights. Then, a final projection is to create the final weighted representation. All the weights in the attention module are learned alongside the rest of the network.&lt;/p&gt;
&lt;p&gt;Let's see how to compute it step-by-step.&lt;/p&gt;
&lt;h2 id="scaled-dot-product-attention-step-by-step"&gt;Scaled-Dot Product Attention Step-by-step&lt;/h2&gt;
&lt;h3 id="0-prepare-input"&gt;0. Prepare Input&lt;/h3&gt;
&lt;p&gt;Though this step is technically not part of Scaled-Dot Product Attention, we represent input tokens in the Transformer architecture using a standard token embedding: &lt;code&gt;nn.Embedding&lt;/code&gt; and a &lt;a href="positional-encoding.html"&gt;Positional Encoding&lt;/a&gt;, which we combine to create a final representation.&lt;/p&gt;
&lt;p&gt;The positional embedding represents each token's position in the sequence, as this information would otherwise be lost.&lt;/p&gt;
&lt;p&gt;The dimensions of this input are batch, time, and embedding size. For example, with a batch size of 8, four input words (assuming word-level tokenisation) and an embedding dimension of 1024, the embeddings would have a shape of: &lt;code&gt;(8, 4, 1024)&lt;/code&gt;&lt;/p&gt;
&lt;h3 id="1-create-projections-used-for-computing-scores"&gt;1. Create projections used for computing scores&lt;/h3&gt;
&lt;p&gt;Transform input embeddings into three matrices called &lt;em&gt;query&lt;/em&gt;, &lt;em&gt;key&lt;/em&gt;, and &lt;em&gt;values&lt;/em&gt;. However, those names aren't particularly useful; they could also be called &lt;em&gt;proj1&lt;/em&gt;, &lt;em&gt;proj2&lt;/em&gt;, and &lt;em&gt;proj_final&lt;/em&gt;. Many other articles on the web relate these values to the retrieval system, although I think it's unnecessary confusion.&lt;/p&gt;
&lt;p&gt;All you need to know is that our goal is to compute a table of scores with a row per token. This paper chooses this particular method of accomplishing it, but there are alternatives.&lt;/p&gt;
&lt;p&gt;We can do this in 6 lines of code:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="c1"&gt;# __init__&lt;/span&gt;
&lt;span class="n"&gt;query_proj&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;nn&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Linear&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;embedding_dim&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;attention_dim&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;bias&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;False&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;key_proj&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;nn&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Linear&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;embedding_dim&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;attention_dim&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;bias&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;False&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;value_proj&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;nn&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Linear&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;embedding_dim&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;attention_dim&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;bias&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;False&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# forward&lt;/span&gt;
&lt;span class="n"&gt;query&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;query_proj&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;X&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;key&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;key_proj&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;X&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;value_proj&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;X&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Like any typically linear layer, the projection weights are learned throughout training.&lt;/p&gt;
&lt;h3 id="2-compute-scores-as-the-dot-product-of-query-and-key"&gt;2. Compute scores as the dot product of query and key&lt;/h3&gt;
&lt;p&gt;Compute the scores as the dot product of each query and key. However, for efficiency, we compute the dot products for the entire sequence by performing a matrix product of query and the transposed key matrix: &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mtext&gt;scores&lt;/mtext&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mi&gt;Q&lt;/mi&gt;&lt;mi mathvariant="normal"&gt;@&lt;/mi&gt;&lt;msup&gt;&lt;mi&gt;K&lt;/mi&gt;&lt;mi&gt;T&lt;/mi&gt;&lt;/msup&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;\text{scores} = Q @ K^{T}&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.43056em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord text"&gt;&lt;span class="mord"&gt;scores&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1.035771em;vertical-align:-0.19444em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;Q&lt;/span&gt;&lt;span class="mord"&gt;@&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault" style="margin-right:0.07153em;"&gt;K&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.8413309999999999em;"&gt;&lt;span style="top:-3.063em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathdefault mtight" style="margin-right:0.13889em;"&gt;T&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;scores&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;query&lt;/span&gt; &lt;span class="o"&gt;@&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;transpose&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h3 id="3-scale-the-score-values-using-the-square-root-of-the-attention-dimension"&gt;3. Scale the score values using the square root of the attention dimension&lt;/h3&gt;
&lt;p&gt;As the size of the attention dimensions increases, the dot products computed to get the attention scores generally grow larger in magnitude as more terms are summed in the dot product calculation. Larger values passed into the Softmax function can lead to small gradients, making learning slow and ineffective. So, they scale the scores by dividing the square root of the attention dimension, which doesn't change their relative scores since the same factor scales all scores but keeps their absolute magnitude in a stable range.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;scores&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;scores&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;sqrt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;attention_dim&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Scaled-Dot Product Attention is simply Dot-Product attention with this additional step.&lt;/p&gt;
&lt;h3 id="4-decoder-only-mask-out-any-future-tokens"&gt;4. (Decoder only) Mask out any future tokens&lt;/h3&gt;
&lt;p&gt;In the Decoder part of the Transformer, we need to ensure that the model cannot "see" future tokens when making predictions, as the decoder should only rely on previously generated tokens to predict the next token in the sequence. To achieve this, we apply a mask to the attention scores before applying the softmax function. The mask sets the scores for future tokens to negative infinity (-inf), which results in zeros applying the softmax function, effectively blocking any information flow from future tokens.&lt;/p&gt;
&lt;p&gt;We can use the &lt;a href="https://pytorch.org/docs/stable/generated/torch.tril.html"&gt;tril&lt;/a&gt; function to create a diagonal mask where the value &lt;code&gt;True&lt;/code&gt; represents positions to be masked, then &lt;a href="https://pytorch.org/docs/stable/generated/torch.Tensor.masked_fill_.html#torch.Tensor.masked_fill_"&gt;masked_fill&lt;/a&gt; will replace any masked positions with &lt;code&gt;float("-inf")&lt;/code&gt;. After performing the Softmax operation, any -inf values will be converted into a weight of 0.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="c1"&gt;# Compute a mask and set all future values to -inf, which ensures a score of 0 after softmax.&lt;/span&gt;
&lt;span class="n"&gt;attn_mask&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;torch&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tril&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;torch&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ones&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;scores&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;shape&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
&lt;span class="n"&gt;scores&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;torch&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;masked_fill&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;scores&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;attn_mask&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;float&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;-inf&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h3 id="5-compute-softmax-to-convert-scores-into-probability-distributions"&gt;5. Compute Softmax to convert scores into probability distributions&lt;/h3&gt;
&lt;p&gt;Next, we ensure the scores are between 0 and 1 and all the scores equal 1.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;scores&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;softmax&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;scores&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;dim&lt;/span&gt;&lt;span class="o"&gt;=-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h3 id="6-calculate-the-final-representations-as-the-dot-product-of-scores-and-values"&gt;6. Calculate the final representations as the dot product of scores and values&lt;/h3&gt;
&lt;p&gt;Finally, we use the value matrix to create a final output using the calculated weights.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;out&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;scores&lt;/span&gt; &lt;span class="o"&gt;@&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Here's the full PyTorch module:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;math&lt;/span&gt;

&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;torch&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;torch&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;nn&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;torch.nn.functional&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;softmax&lt;/span&gt;


&lt;span class="k"&gt;class&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nc"&gt;SingleHeadAttention&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;nn&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Module&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="fm"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;embedding_dim&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;attention_dim&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="nb"&gt;super&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="fm"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="n"&gt;torch&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;manual_seed&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;attention_dim&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;attention_dim&lt;/span&gt;

        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;key_proj&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;nn&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Linear&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;embedding_dim&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;attention_dim&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;bias&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;False&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;query_proj&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;nn&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Linear&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;embedding_dim&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;attention_dim&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;bias&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;False&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;value_proj&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;nn&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Linear&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;embedding_dim&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;attention_dim&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;bias&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;False&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;forward&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;X&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;key&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;key_proj&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;X&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;query&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;query_proj&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;X&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;value_proj&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;X&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="n"&gt;scores&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;query&lt;/span&gt; &lt;span class="o"&gt;@&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;transpose&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="c1"&gt;# Scale scores by sqrt of attention dim&lt;/span&gt;
        &lt;span class="n"&gt;scores&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;scores&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;math&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sqrt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;attention_dim&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="c1"&gt;# Compute a mask and set all future values to -inf, which ensures a score of 0 after softmax.&lt;/span&gt;
        &lt;span class="n"&gt;attn_mask&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;torch&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tril&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;torch&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ones&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;scores&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;shape&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
        &lt;span class="n"&gt;scores&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;torch&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;masked_fill&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;scores&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;attn_mask&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;float&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;-inf&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

        &lt;span class="c1"&gt;# Compute softmax of scores.&lt;/span&gt;
        &lt;span class="n"&gt;scores&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;softmax&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;scores&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;dim&lt;/span&gt;&lt;span class="o"&gt;=-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="c1"&gt;# Now, do the final projection with values.&lt;/span&gt;
        &lt;span class="n"&gt;out&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;scores&lt;/span&gt; &lt;span class="o"&gt;@&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt;

        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;out&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;In the Transformer architecture, we combine multiple Self-Attention modules by concatenating their outputs into one final representation, passed through a final feed-forward layer. These multiple Self-Attention layers together are called &lt;a href="multi-head-attention.html"&gt;Multi-head Attention&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Multi-Head Attention diagram" src="../_media/scaled-dot-product-attention-multi-head.png"&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Multi-Head Attention diagram from paper Attention Is All Your Need&lt;/em&gt;&lt;/p&gt;</content><category term="permanent"/><category term="MachineLearning"/><category term="LargeLanguageModels"/></entry><entry><title>Queue</title><link href="http://localhost:8000/queue.html" rel="alternate"/><published>2024-02-18T00:00:00+10:00</published><updated>2024-02-18T01:00:00+10:00</updated><author><name>Lex Toumbourou</name></author><id>tag:localhost,2024-02-18:/queue.html</id><summary type="html">&lt;p&gt;a sequential data structure where we can add an element to the tail, or remove an element from the head.&lt;/p&gt;</summary><content type="html">&lt;p&gt;A queue is a simple data structure based on First In, First Out (FIFO) principle, where the longer an item has waited, the sooner it will be available.&lt;/p&gt;
&lt;p&gt;It is based around the fundamental queue paradigm that we're familiar with: front of the line goes first.&lt;/p&gt;
&lt;p&gt;A queue has a &lt;strong&gt;head&lt;/strong&gt; and a &lt;strong&gt;tail&lt;/strong&gt;. We &lt;strong&gt;dequeue&lt;/strong&gt; by removing an element from the head of the queue and &lt;strong&gt;enqueue&lt;/strong&gt; by adding an element to the tail.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Diagram of a Queue" src="../_media/queue.png"&gt;&lt;/p&gt;
&lt;p&gt;A queue supports the following operations in its typical form:&lt;/p&gt;
&lt;table class="table-border"&gt;
    &lt;tr&gt;
        &lt;th&gt;Operation&lt;/th&gt;
        &lt;th&gt;Pseudocode&lt;/th&gt;
        &lt;th&gt;Description&lt;/th&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td&gt;head&lt;/td&gt;
        &lt;td&gt;&lt;code&gt;HEAD(q)&lt;/code&gt;&lt;/td&gt;
        &lt;td&gt;Return element at the head of queue &lt;code&gt;q&lt;/code&gt;.&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td&gt;dequeue&lt;/td&gt;
        &lt;td&gt;&lt;code&gt;DEQUEUE(q)&lt;/code&gt;&lt;/td&gt;
        &lt;td&gt;Remove and return element at the &lt;strong&gt;head&lt;/strong&gt; of the queue.&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td&gt;enqueue&lt;/td&gt;
        &lt;td&gt;&lt;code&gt;ENQUEUE(o, q)&lt;/code&gt;&lt;/td&gt;
        &lt;td&gt;Adds element &lt;code&gt;o&lt;/code&gt; to the tail of the queue.&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td&gt;isEmpty?&lt;/td&gt;
        &lt;td&gt;&lt;code&gt;EMPTY(s)&lt;/code&gt;&lt;/td&gt;
        &lt;td&gt;Return boolean result of is empty check.&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td&gt;new empty queue&lt;/td&gt;
        &lt;td&gt;&lt;code&gt;new QUEUE q&lt;/code&gt;&lt;/td&gt;
        &lt;td&gt;Create a new, empty queue.&lt;/td&gt;
    &lt;/tr&gt;
&lt;/table&gt;

&lt;hr&gt;
&lt;h2 id="recommended-reading"&gt;Recommended Reading&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://amzn.to/3HyDauB"&gt;Introduction to Algorithms, Third Edition&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="Intro to Algorithms cover" src="../_media/intro-to-algorithms-3rd.png"&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Chapter 10&lt;/strong&gt; covers Elementary Data Structures like a &lt;a href="stack.html"&gt;Stack&lt;/a&gt; or &lt;a href="queue.html"&gt;Queue&lt;/a&gt;.&lt;/p&gt;</content><category term="permanent"/><category term="DataStructures"/><category term="ComputerScience"/></entry><entry><title>Stack</title><link href="http://localhost:8000/stack.html" rel="alternate"/><published>2024-02-18T00:00:00+10:00</published><updated>2024-02-18T00:00:00+10:00</updated><author><name>Lex Toumbourou</name></author><id>tag:localhost,2024-02-18:/stack.html</id><summary type="html">&lt;p&gt;a data structure where only the top element is accessible&lt;/p&gt;</summary><content type="html">&lt;p&gt;A &lt;strong&gt;stack&lt;/strong&gt; is a simple data structure based on the Last In, First Out (LIFO) principle, where only the &lt;strong&gt;Top&lt;/strong&gt; element is accessible.&lt;/p&gt;
&lt;p&gt;Think of a stack of plates - you can only add or retrieve from the top.&lt;/p&gt;
&lt;p&gt;When we add an item to a stack, we call that operation &lt;strong&gt;push&lt;/strong&gt;. When you take an item off the stack, we call it &lt;strong&gt;pop&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Diagram of a Stack" src="../_media/stack-diagram.png"&gt;&lt;/p&gt;
&lt;p&gt;A stack &lt;code&gt;S&lt;/code&gt; can be implemented easily with a fixed-length array. We can track which element is at the top with &lt;code&gt;S.top&lt;/code&gt;. The size of the array is the maximum size of the stack.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Stack array" src="../_media/stack-array.png"&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Example of array-based stack implementation - From Introduction to Algorithms, Third Edition&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;If we attempt to add to a stack beyond its max size, &lt;a href="stack-overflow.html"&gt;Stack Overflow&lt;/a&gt; error. If we try to pop from an empty stack, we get the &lt;strong&gt;Stack Underflow&lt;/strong&gt; error.&lt;/p&gt;
&lt;p&gt;Programming languages use a stack called a &lt;a href="call-stack.html"&gt;Call Stack&lt;/a&gt; to keep track of functions running.&lt;/p&gt;
&lt;p&gt;A stack supports the following operations in its typical form:&lt;/p&gt;
&lt;table class="table-border"&gt;
    &lt;tr&gt;
        &lt;th&gt;Operation&lt;/th&gt;
        &lt;th&gt;Pseudocode&lt;/th&gt;
        &lt;th&gt;Description&lt;/th&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td&gt;push&lt;/td&gt;
        &lt;td&gt;&lt;code&gt;PUSH(o, s)&lt;/code&gt;&lt;/td&gt;
        &lt;td&gt;Place &lt;code&gt;o&lt;/code&gt; on top of stack.&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td&gt;top&lt;/td&gt;
        &lt;td&gt;&lt;code&gt;TOP(s)&lt;/code&gt;&lt;/td&gt;
        &lt;td&gt;Show the element at the top of the stack.&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td&gt;pop&lt;/td&gt;
        &lt;td&gt;&lt;code&gt;POP(s)&lt;/code&gt;&lt;/td&gt;
        &lt;td&gt;Remove and return the element at the top of the stack.&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td&gt;isEmpty?&lt;/td&gt;
        &lt;td&gt;&lt;code&gt;EMPTY(s)&lt;/code&gt;&lt;/td&gt;
        &lt;td&gt;Return True or False if empty.&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td&gt;new empty stack&lt;/td&gt;
        &lt;td&gt;&lt;code&gt;new STACK s&lt;/code&gt;&lt;/td&gt;
        &lt;td&gt;Create a new, empty stack.&lt;/td&gt;
    &lt;/tr&gt;
&lt;/table&gt;

&lt;hr&gt;
&lt;h2 id="recommended-reading"&gt;Recommended Reading&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://amzn.to/3HyDauB"&gt;Introduction to Algorithms, Third Edition&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="Intro to Algorithms cover" src="../_media/intro-to-algorithms-3rd.png"&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Chapter 10&lt;/strong&gt; covers Elementary Data Structures like a &lt;a href="stack.html"&gt;Stack&lt;/a&gt; or &lt;a href="queue.html"&gt;Queue&lt;/a&gt;.&lt;/p&gt;</content><category term="permanent"/><category term="ComputerScience"/><category term="DataStructures"/></entry><entry><title>Gale-Shapley Algorithm</title><link href="http://localhost:8000/gale-shapley-algorithm.html" rel="alternate"/><published>2024-02-08T00:00:00+10:00</published><updated>2024-02-08T00:00:00+10:00</updated><author><name>Lex Toumbourou</name></author><id>tag:localhost,2024-02-08:/gale-shapley-algorithm.html</id><summary type="html">&lt;p&gt;an algorithm that matches 2-equally sizes groups based on preferences.&lt;/p&gt;</summary><content type="html">&lt;p&gt;The Gale-Shapley algorithm (also known as &lt;strong&gt;Deferred Acceptance&lt;/strong&gt;) solves the &lt;strong&gt;stable matching problem&lt;/strong&gt;, where the goal is to match members of two equally sized groups based on their preferences. Gale-Shapley guarantees that all pairs are &lt;em&gt;stable&lt;/em&gt;; no two pairs would prefer another compared to their assigned match.&lt;/p&gt;
&lt;p&gt;Consider a speed dating event; for simplicity of explanation, I'll assume all participants are heterosexual.&lt;/p&gt;
&lt;p&gt;At the end of a series of conversations, each man and woman writes their preferences in order.&lt;/p&gt;
&lt;p&gt;We want an algorithm that ensures no woman is paired with a man but prefers another man who also prefers her. This pairing is considered &lt;strong&gt;unstable&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Unstable Pairs" src="../_media/unstable-pairs.png"&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Gale-Shapely guarantees no unstable pairs.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The algorithms orchestrate a series of &lt;em&gt;proposals&lt;/em&gt;. Each woman proposes to their top-choice man. If a man receives multiple proposals, they accept the ones highest on their preference list and reject others. If a woman is rejected, she proposes to her next choice.&lt;/p&gt;
&lt;p&gt;The process continues iteratively until all women are matched with partners. It's worst case &lt;a href="time-complexity.html"&gt;Time Complexity&lt;/a&gt; is &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;O&lt;/mi&gt;&lt;mo stretchy="false"&gt;(&lt;/mo&gt;&lt;msup&gt;&lt;mi&gt;n&lt;/mi&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;/msup&gt;&lt;mo stretchy="false"&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;O(n^2)&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1.064108em;vertical-align:-0.25em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.02778em;"&gt;O&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;n&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.8141079999999999em;"&gt;&lt;span style="top:-3.063em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Here, the algorithm is written in Python code. It's commonly executed with a while loop that continues to find proposals until no unmatched pairs exist.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;men_preferences&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="s2"&gt;&amp;quot;John&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Sally&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Jill&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Doris&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="s2"&gt;&amp;quot;Jacob&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Sally&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Jill&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Doris&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="s2"&gt;&amp;quot;Bob&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Sally&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Doris&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Jill&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="n"&gt;womens_preferences&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="s2"&gt;&amp;quot;Sally&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;John&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Jacob&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Bob&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="s2"&gt;&amp;quot;Jill&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Jacob&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;John&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Bob&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="s2"&gt;&amp;quot;Doris&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;John&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Bob&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Jacob&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;woman_prefers&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;new_man&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;current_man&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;woman_prefs&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;woman_prefs&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;new_man&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;woman_prefs&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;current_man&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;gale_shapley&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;men_preferences&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;women_preferences&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="c1"&gt;# Initial setup&lt;/span&gt;
    &lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;men_preferences&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;free_men&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;men_preferences&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;keys&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
    &lt;span class="n"&gt;engaged&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
    &lt;span class="n"&gt;proposed&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;man&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;man&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;men_preferences&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="n"&gt;free_men&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;man&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;free_men&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
        &lt;span class="n"&gt;man_prefs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;men_preferences&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;man&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
        &lt;span class="n"&gt;woman&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;next&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;w&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;w&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;man_prefs&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;w&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;proposed&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;man&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
        &lt;span class="n"&gt;proposed&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;man&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;woman&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;woman&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;engaged&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="c1"&gt;# Woman is free&lt;/span&gt;
            &lt;span class="n"&gt;engaged&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;woman&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;man&lt;/span&gt;
            &lt;span class="n"&gt;free_men&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;remove&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;man&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="c1"&gt;# Woman is engaged, check if she prefers this new man&lt;/span&gt;
            &lt;span class="n"&gt;current_man&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;engaged&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;woman&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;woman_prefers&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;man&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;current_man&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;women_preferences&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;woman&lt;/span&gt;&lt;span class="p"&gt;]):&lt;/span&gt;
                &lt;span class="c1"&gt;# Woman prefers new man&lt;/span&gt;
                &lt;span class="n"&gt;engaged&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;woman&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;man&lt;/span&gt;
                &lt;span class="n"&gt;free_men&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;remove&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;man&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                &lt;span class="n"&gt;free_men&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;current_man&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="c1"&gt;# Otherwise, do nothing&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;engaged&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;In the real world, the algorithm is used in dating to match medical graduates to residency problems, job/employer matching, and many other places.&lt;/p&gt;</content><category term="permanent"/></entry><entry><title>Merge Sort</title><link href="http://localhost:8000/merge-sort.html" rel="alternate"/><published>2024-02-04T00:00:00+10:00</published><updated>2024-02-04T00:00:00+10:00</updated><author><name>Lex Toumbourou</name></author><id>tag:localhost,2024-02-04:/merge-sort.html</id><summary type="html">&lt;p&gt;a popular divide-and-conquer sorting algorithm&lt;/p&gt;</summary><content type="html">&lt;p&gt;&lt;strong&gt;Merge Sort&lt;/strong&gt; is a &lt;a href="divide-and-conquer.html"&gt;Divide-and-Conquer&lt;/a&gt; sorting algorithm, which sorts a list recursively by dividing it into halves until a single --element or empty list is created; it then merges these sublists of create a software list.&lt;/p&gt;
&lt;p&gt;Merge Sort is one of the faster and most stable sorting algorithms, with an &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;O&lt;/mi&gt;&lt;mo stretchy="false"&gt;(&lt;/mo&gt;&lt;mi&gt;n&lt;/mi&gt;&lt;mi&gt;log&lt;/mi&gt;&lt;mo&gt;⁡&lt;/mo&gt;&lt;mi&gt;n&lt;/mi&gt;&lt;mo stretchy="false"&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;O(n \log n)&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1em;vertical-align:-0.25em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.02778em;"&gt;O&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord mathdefault"&gt;n&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mop"&gt;lo&lt;span style="margin-right:0.01389em;"&gt;g&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;n&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; time complexity in the average and worst case.&lt;/p&gt;
&lt;h2 id="algorithm"&gt;Algorithm&lt;/h2&gt;
&lt;p&gt;&lt;span class="katex-display"&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mtable columnalign="right left" columnspacing="0em" rowspacing="0.24999999999999992em"&gt;&lt;mtr&gt;&lt;mtd&gt;&lt;mstyle displaystyle="true" scriptlevel="0"&gt;&lt;mrow&gt;&lt;/mrow&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;mtd&gt;&lt;mstyle displaystyle="true" scriptlevel="0"&gt;&lt;mrow&gt;&lt;mrow&gt;&lt;/mrow&gt;&lt;mtext mathvariant="bold"&gt;MERGESORT&lt;/mtext&gt;&lt;mo stretchy="false"&gt;(&lt;/mo&gt;&lt;mi&gt;A&lt;/mi&gt;&lt;mo separator="true"&gt;,&lt;/mo&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mo separator="true"&gt;,&lt;/mo&gt;&lt;mi&gt;b&lt;/mi&gt;&lt;mo stretchy="false"&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;/mtr&gt;&lt;mtr&gt;&lt;mtd&gt;&lt;mstyle displaystyle="true" scriptlevel="0"&gt;&lt;mrow&gt;&lt;/mrow&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;mtd&gt;&lt;mstyle displaystyle="true" scriptlevel="0"&gt;&lt;mrow&gt;&lt;mrow&gt;&lt;/mrow&gt;&lt;mspace width="1em"&gt;&lt;/mspace&gt;&lt;mtext&gt;if &lt;/mtext&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mo&gt;&amp;lt;&lt;/mo&gt;&lt;mi&gt;b&lt;/mi&gt;&lt;mtext&gt; then&lt;/mtext&gt;&lt;/mrow&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;/mtr&gt;&lt;mtr&gt;&lt;mtd&gt;&lt;mstyle displaystyle="true" scriptlevel="0"&gt;&lt;mrow&gt;&lt;/mrow&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;mtd&gt;&lt;mstyle displaystyle="true" scriptlevel="0"&gt;&lt;mrow&gt;&lt;mrow&gt;&lt;/mrow&gt;&lt;mspace width="1em"&gt;&lt;/mspace&gt;&lt;mspace width="1em"&gt;&lt;/mspace&gt;&lt;mi&gt;m&lt;/mi&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mrow&gt;&lt;mo fence="true"&gt;⌊&lt;/mo&gt;&lt;mfrac&gt;&lt;mrow&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mo&gt;+&lt;/mo&gt;&lt;mi&gt;b&lt;/mi&gt;&lt;/mrow&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;/mfrac&gt;&lt;mo fence="true"&gt;⌋&lt;/mo&gt;&lt;/mrow&gt;&lt;/mrow&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;/mtr&gt;&lt;mtr&gt;&lt;mtd&gt;&lt;mstyle displaystyle="true" scriptlevel="0"&gt;&lt;mrow&gt;&lt;/mrow&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;mtd&gt;&lt;mstyle displaystyle="true" scriptlevel="0"&gt;&lt;mrow&gt;&lt;mrow&gt;&lt;/mrow&gt;&lt;mspace width="1em"&gt;&lt;/mspace&gt;&lt;mspace width="1em"&gt;&lt;/mspace&gt;&lt;mtext mathvariant="bold"&gt;MERGESORT&lt;/mtext&gt;&lt;mo stretchy="false"&gt;(&lt;/mo&gt;&lt;mi&gt;A&lt;/mi&gt;&lt;mo separator="true"&gt;,&lt;/mo&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mo separator="true"&gt;,&lt;/mo&gt;&lt;mi&gt;m&lt;/mi&gt;&lt;mo stretchy="false"&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;/mtr&gt;&lt;mtr&gt;&lt;mtd&gt;&lt;mstyle displaystyle="true" scriptlevel="0"&gt;&lt;mrow&gt;&lt;/mrow&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;mtd&gt;&lt;mstyle displaystyle="true" scriptlevel="0"&gt;&lt;mrow&gt;&lt;mrow&gt;&lt;/mrow&gt;&lt;mspace width="1em"&gt;&lt;/mspace&gt;&lt;mspace width="1em"&gt;&lt;/mspace&gt;&lt;mtext mathvariant="bold"&gt;MERGESORT&lt;/mtext&gt;&lt;mo stretchy="false"&gt;(&lt;/mo&gt;&lt;mi&gt;A&lt;/mi&gt;&lt;mo separator="true"&gt;,&lt;/mo&gt;&lt;mi&gt;m&lt;/mi&gt;&lt;mo&gt;+&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;mo separator="true"&gt;,&lt;/mo&gt;&lt;mi&gt;b&lt;/mi&gt;&lt;mo stretchy="false"&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;/mtr&gt;&lt;mtr&gt;&lt;mtd&gt;&lt;mstyle displaystyle="true" scriptlevel="0"&gt;&lt;mrow&gt;&lt;/mrow&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;mtd&gt;&lt;mstyle displaystyle="true" scriptlevel="0"&gt;&lt;mrow&gt;&lt;mrow&gt;&lt;/mrow&gt;&lt;mspace width="1em"&gt;&lt;/mspace&gt;&lt;mspace width="1em"&gt;&lt;/mspace&gt;&lt;mtext mathvariant="bold"&gt;MERGE&lt;/mtext&gt;&lt;mo stretchy="false"&gt;(&lt;/mo&gt;&lt;mi&gt;A&lt;/mi&gt;&lt;mo separator="true"&gt;,&lt;/mo&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mo separator="true"&gt;,&lt;/mo&gt;&lt;mi&gt;m&lt;/mi&gt;&lt;mo separator="true"&gt;,&lt;/mo&gt;&lt;mi&gt;b&lt;/mi&gt;&lt;mo stretchy="false"&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;/mtr&gt;&lt;/mtable&gt;&lt;annotation encoding="application/x-tex"&gt;
\begin{aligned}
&amp;amp;\textbf{MERGESORT}(A, a, b) \\
&amp;amp;\quad \text{if } a &amp;lt; b \text{ then} \\
&amp;amp;\quad\quad m = \left\lfloor \frac{a + b}{2} \right\rfloor \\
&amp;amp;\quad\quad \textbf{MERGESORT}(A, a, m) \\
&amp;amp;\quad\quad \textbf{MERGESORT}(A, m + 1, b) \\
&amp;amp;\quad\quad \textbf{MERGE}(A, a, m, b)
\end{aligned}
&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:10.200030000000002em;vertical-align:-4.850015000000001em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mtable"&gt;&lt;span class="col-align-r"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:5.350015em;"&gt;&lt;span style="top:-7.960015em;"&gt;&lt;span class="pstrut" style="height:3.45em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-6.460014999999999em;"&gt;&lt;span class="pstrut" style="height:3.45em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-4.350014999999999em;"&gt;&lt;span class="pstrut" style="height:3.45em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-2.2599849999999995em;"&gt;&lt;span class="pstrut" style="height:3.45em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-0.7599849999999995em;"&gt;&lt;span class="pstrut" style="height:3.45em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:0.7400150000000005em;"&gt;&lt;span class="pstrut" style="height:3.45em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:4.850015000000001em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="col-align-l"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:5.350015em;"&gt;&lt;span style="top:-7.960015em;"&gt;&lt;span class="pstrut" style="height:3.45em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;&lt;/span&gt;&lt;span class="mord text"&gt;&lt;span class="mord textbf"&gt;MERGESORT&lt;/span&gt;&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord mathdefault"&gt;A&lt;/span&gt;&lt;span class="mpunct"&gt;,&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;a&lt;/span&gt;&lt;span class="mpunct"&gt;,&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;b&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-6.460014999999999em;"&gt;&lt;span class="pstrut" style="height:3.45em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:1em;"&gt;&lt;/span&gt;&lt;span class="mord text"&gt;&lt;span class="mord"&gt;if &lt;/span&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;a&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;&amp;lt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;b&lt;/span&gt;&lt;span class="mord text"&gt;&lt;span class="mord"&gt; then&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-4.350014999999999em;"&gt;&lt;span class="pstrut" style="height:3.45em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:1em;"&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:1em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;m&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="minner"&gt;&lt;span class="mopen delimcenter" style="top:0em;"&gt;&lt;span class="delimsizing size3"&gt;⌊&lt;/span&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mopen nulldelimiter"&gt;&lt;/span&gt;&lt;span class="mfrac"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:1.37144em;"&gt;&lt;span style="top:-2.314em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-3.23em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="frac-line" style="border-bottom-width:0.04em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-3.677em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;a&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;+&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;b&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.686em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose nulldelimiter"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose delimcenter" style="top:0em;"&gt;&lt;span class="delimsizing size3"&gt;⌋&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-2.2599849999999995em;"&gt;&lt;span class="pstrut" style="height:3.45em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:1em;"&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:1em;"&gt;&lt;/span&gt;&lt;span class="mord text"&gt;&lt;span class="mord textbf"&gt;MERGESORT&lt;/span&gt;&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord mathdefault"&gt;A&lt;/span&gt;&lt;span class="mpunct"&gt;,&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;a&lt;/span&gt;&lt;span class="mpunct"&gt;,&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;m&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-0.7599849999999995em;"&gt;&lt;span class="pstrut" style="height:3.45em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:1em;"&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:1em;"&gt;&lt;/span&gt;&lt;span class="mord text"&gt;&lt;span class="mord textbf"&gt;MERGESORT&lt;/span&gt;&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord mathdefault"&gt;A&lt;/span&gt;&lt;span class="mpunct"&gt;,&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;m&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;+&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;1&lt;/span&gt;&lt;span class="mpunct"&gt;,&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;b&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:0.7400150000000005em;"&gt;&lt;span class="pstrut" style="height:3.45em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:1em;"&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:1em;"&gt;&lt;/span&gt;&lt;span class="mord text"&gt;&lt;span class="mord textbf"&gt;MERGE&lt;/span&gt;&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord mathdefault"&gt;A&lt;/span&gt;&lt;span class="mpunct"&gt;,&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;a&lt;/span&gt;&lt;span class="mpunct"&gt;,&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;m&lt;/span&gt;&lt;span class="mpunct"&gt;,&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;b&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:4.850015000000001em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h2 id="simple-step-by-step-example"&gt;Simple step-by-step example&lt;/h2&gt;
&lt;p&gt;Given array: &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mo stretchy="false"&gt;[&lt;/mo&gt;&lt;mn&gt;3&lt;/mn&gt;&lt;mo separator="true"&gt;,&lt;/mo&gt;&lt;mn&gt;4&lt;/mn&gt;&lt;mo separator="true"&gt;,&lt;/mo&gt;&lt;mn&gt;6&lt;/mn&gt;&lt;mo separator="true"&gt;,&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;mo separator="true"&gt;,&lt;/mo&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;mo stretchy="false"&gt;]&lt;/mo&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;[3, 4, 6, 1, 2]&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1em;vertical-align:-0.25em;"&gt;&lt;/span&gt;&lt;span class="mopen"&gt;[&lt;/span&gt;&lt;span class="mord"&gt;3&lt;/span&gt;&lt;span class="mpunct"&gt;,&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;4&lt;/span&gt;&lt;span class="mpunct"&gt;,&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;6&lt;/span&gt;&lt;span class="mpunct"&gt;,&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;1&lt;/span&gt;&lt;span class="mpunct"&gt;,&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;2&lt;/span&gt;&lt;span class="mclose"&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;, a=1 and b=5 for the initial call.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;After the first recursive call, we would have sorted the first half (a=1, m=3), so the array would become &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mo stretchy="false"&gt;[&lt;/mo&gt;&lt;mn&gt;3&lt;/mn&gt;&lt;mo separator="true"&gt;,&lt;/mo&gt;&lt;mn&gt;4&lt;/mn&gt;&lt;mo separator="true"&gt;,&lt;/mo&gt;&lt;mn&gt;6&lt;/mn&gt;&lt;mo separator="true"&gt;,&lt;/mo&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;mo separator="true"&gt;,&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;mo stretchy="false"&gt;]&lt;/mo&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;[3, 4, 6, 2, 1]&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1em;vertical-align:-0.25em;"&gt;&lt;/span&gt;&lt;span class="mopen"&gt;[&lt;/span&gt;&lt;span class="mord"&gt;3&lt;/span&gt;&lt;span class="mpunct"&gt;,&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;4&lt;/span&gt;&lt;span class="mpunct"&gt;,&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;6&lt;/span&gt;&lt;span class="mpunct"&gt;,&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;2&lt;/span&gt;&lt;span class="mpunct"&gt;,&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;1&lt;/span&gt;&lt;span class="mclose"&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;After the 2nd recursive call, we would have sorted the 2nd half (a=4, b=5), so the array would become &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mo stretchy="false"&gt;[&lt;/mo&gt;&lt;mn&gt;3&lt;/mn&gt;&lt;mo separator="true"&gt;,&lt;/mo&gt;&lt;mn&gt;4&lt;/mn&gt;&lt;mo separator="true"&gt;,&lt;/mo&gt;&lt;mn&gt;6&lt;/mn&gt;&lt;mo separator="true"&gt;,&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;mo separator="true"&gt;,&lt;/mo&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;mo stretchy="false"&gt;]&lt;/mo&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;[3, 4, 6, 1, 2]&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1em;vertical-align:-0.25em;"&gt;&lt;/span&gt;&lt;span class="mopen"&gt;[&lt;/span&gt;&lt;span class="mord"&gt;3&lt;/span&gt;&lt;span class="mpunct"&gt;,&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;4&lt;/span&gt;&lt;span class="mpunct"&gt;,&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;6&lt;/span&gt;&lt;span class="mpunct"&gt;,&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;1&lt;/span&gt;&lt;span class="mpunct"&gt;,&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;2&lt;/span&gt;&lt;span class="mclose"&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;Then the final merge would merge both sides, resulting in &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mo stretchy="false"&gt;[&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;mo separator="true"&gt;,&lt;/mo&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;mo separator="true"&gt;,&lt;/mo&gt;&lt;mn&gt;3&lt;/mn&gt;&lt;mo separator="true"&gt;,&lt;/mo&gt;&lt;mn&gt;4&lt;/mn&gt;&lt;mo separator="true"&gt;,&lt;/mo&gt;&lt;mn&gt;6&lt;/mn&gt;&lt;mo stretchy="false"&gt;]&lt;/mo&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;[1, 2, 3, 4, 6]&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1em;vertical-align:-0.25em;"&gt;&lt;/span&gt;&lt;span class="mopen"&gt;[&lt;/span&gt;&lt;span class="mord"&gt;1&lt;/span&gt;&lt;span class="mpunct"&gt;,&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;2&lt;/span&gt;&lt;span class="mpunct"&gt;,&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;3&lt;/span&gt;&lt;span class="mpunct"&gt;,&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;4&lt;/span&gt;&lt;span class="mpunct"&gt;,&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;6&lt;/span&gt;&lt;span class="mclose"&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="visualisation"&gt;Visualisation&lt;/h2&gt;
&lt;p&gt;&lt;img src="data:image/svg+xml;base64,PHN2ZyBhcmlhLXJvbGVkZXNjcmlwdGlvbj0iZmxvd2NoYXJ0LXYyIiByb2xlPSJncmFwaGljcy1kb2N1bWVudCBkb2N1bWVudCIgdmlld0JveD0iLTggLTggMzkyLjUyNzM0Mzc1IDU1NCIgc3R5bGU9Im1heC13aWR0aDogMzkyLjUyN3B4OyBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTsiIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMDAlIiBpZD0ibXktc3ZnIj48c3R5bGU+I215LXN2Z3tmb250LWZhbWlseToidHJlYnVjaGV0IG1zIix2ZXJkYW5hLGFyaWFsLHNhbnMtc2VyaWY7Zm9udC1zaXplOjE2cHg7ZmlsbDojMzMzO30jbXktc3ZnIC5lcnJvci1pY29ue2ZpbGw6IzU1MjIyMjt9I215LXN2ZyAuZXJyb3ItdGV4dHtmaWxsOiM1NTIyMjI7c3Ryb2tlOiM1NTIyMjI7fSNteS1zdmcgLmVkZ2UtdGhpY2tuZXNzLW5vcm1hbHtzdHJva2Utd2lkdGg6MnB4O30jbXktc3ZnIC5lZGdlLXRoaWNrbmVzcy10aGlja3tzdHJva2Utd2lkdGg6My41cHg7fSNteS1zdmcgLmVkZ2UtcGF0dGVybi1zb2xpZHtzdHJva2UtZGFzaGFycmF5OjA7fSNteS1zdmcgLmVkZ2UtcGF0dGVybi1kYXNoZWR7c3Ryb2tlLWRhc2hhcnJheTozO30jbXktc3ZnIC5lZGdlLXBhdHRlcm4tZG90dGVke3N0cm9rZS1kYXNoYXJyYXk6Mjt9I215LXN2ZyAubWFya2Vye2ZpbGw6IzMzMzMzMztzdHJva2U6IzMzMzMzMzt9I215LXN2ZyAubWFya2VyLmNyb3Nze3N0cm9rZTojMzMzMzMzO30jbXktc3ZnIHN2Z3tmb250LWZhbWlseToidHJlYnVjaGV0IG1zIix2ZXJkYW5hLGFyaWFsLHNhbnMtc2VyaWY7Zm9udC1zaXplOjE2cHg7fSNteS1zdmcgLmxhYmVse2ZvbnQtZmFtaWx5OiJ0cmVidWNoZXQgbXMiLHZlcmRhbmEsYXJpYWwsc2Fucy1zZXJpZjtjb2xvcjojMzMzO30jbXktc3ZnIC5jbHVzdGVyLWxhYmVsIHRleHR7ZmlsbDojMzMzO30jbXktc3ZnIC5jbHVzdGVyLWxhYmVsIHNwYW4sI215LXN2ZyBwe2NvbG9yOiMzMzM7fSNteS1zdmcgLmxhYmVsIHRleHQsI215LXN2ZyBzcGFuLCNteS1zdmcgcHtmaWxsOiMzMzM7Y29sb3I6IzMzMzt9I215LXN2ZyAubm9kZSByZWN0LCNteS1zdmcgLm5vZGUgY2lyY2xlLCNteS1zdmcgLm5vZGUgZWxsaXBzZSwjbXktc3ZnIC5ub2RlIHBvbHlnb24sI215LXN2ZyAubm9kZSBwYXRoe2ZpbGw6I0VDRUNGRjtzdHJva2U6IzkzNzBEQjtzdHJva2Utd2lkdGg6MXB4O30jbXktc3ZnIC5mbG93Y2hhcnQtbGFiZWwgdGV4dHt0ZXh0LWFuY2hvcjptaWRkbGU7fSNteS1zdmcgLm5vZGUgLmthdGV4IHBhdGh7ZmlsbDojMDAwO3N0cm9rZTojMDAwO3N0cm9rZS13aWR0aDoxcHg7fSNteS1zdmcgLm5vZGUgLmxhYmVse3RleHQtYWxpZ246Y2VudGVyO30jbXktc3ZnIC5ub2RlLmNsaWNrYWJsZXtjdXJzb3I6cG9pbnRlcjt9I215LXN2ZyAuYXJyb3doZWFkUGF0aHtmaWxsOiMzMzMzMzM7fSNteS1zdmcgLmVkZ2VQYXRoIC5wYXRoe3N0cm9rZTojMzMzMzMzO3N0cm9rZS13aWR0aDoyLjBweDt9I215LXN2ZyAuZmxvd2NoYXJ0LWxpbmt7c3Ryb2tlOiMzMzMzMzM7ZmlsbDpub25lO30jbXktc3ZnIC5lZGdlTGFiZWx7YmFja2dyb3VuZC1jb2xvcjojZThlOGU4O3RleHQtYWxpZ246Y2VudGVyO30jbXktc3ZnIC5lZGdlTGFiZWwgcmVjdHtvcGFjaXR5OjAuNTtiYWNrZ3JvdW5kLWNvbG9yOiNlOGU4ZTg7ZmlsbDojZThlOGU4O30jbXktc3ZnIC5sYWJlbEJrZ3tiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjMyLCAyMzIsIDIzMiwgMC41KTt9I215LXN2ZyAuY2x1c3RlciByZWN0e2ZpbGw6I2ZmZmZkZTtzdHJva2U6I2FhYWEzMztzdHJva2Utd2lkdGg6MXB4O30jbXktc3ZnIC5jbHVzdGVyIHRleHR7ZmlsbDojMzMzO30jbXktc3ZnIC5jbHVzdGVyIHNwYW4sI215LXN2ZyBwe2NvbG9yOiMzMzM7fSNteS1zdmcgZGl2Lm1lcm1haWRUb29sdGlwe3Bvc2l0aW9uOmFic29sdXRlO3RleHQtYWxpZ246Y2VudGVyO21heC13aWR0aDoyMDBweDtwYWRkaW5nOjJweDtmb250LWZhbWlseToidHJlYnVjaGV0IG1zIix2ZXJkYW5hLGFyaWFsLHNhbnMtc2VyaWY7Zm9udC1zaXplOjEycHg7YmFja2dyb3VuZDpoc2woODAsIDEwMCUsIDk2LjI3NDUwOTgwMzklKTtib3JkZXI6MXB4IHNvbGlkICNhYWFhMzM7Ym9yZGVyLXJhZGl1czoycHg7cG9pbnRlci1ldmVudHM6bm9uZTt6LWluZGV4OjEwMDt9I215LXN2ZyAuZmxvd2NoYXJ0VGl0bGVUZXh0e3RleHQtYW5jaG9yOm1pZGRsZTtmb250LXNpemU6MThweDtmaWxsOiMzMzM7fSNteS1zdmcgOnJvb3R7LS1tZXJtYWlkLWZvbnQtZmFtaWx5OiJ0cmVidWNoZXQgbXMiLHZlcmRhbmEsYXJpYWwsc2Fucy1zZXJpZjt9PC9zdHlsZT48Zz48bWFya2VyIG9yaWVudD0iYXV0byIgbWFya2VySGVpZ2h0PSIxMiIgbWFya2VyV2lkdGg9IjEyIiBtYXJrZXJVbml0cz0idXNlclNwYWNlT25Vc2UiIHJlZlk9IjUiIHJlZlg9IjYiIHZpZXdCb3g9IjAgMCAxMCAxMCIgY2xhc3M9Im1hcmtlciBmbG93Y2hhcnQiIGlkPSJteS1zdmdfZmxvd2NoYXJ0LXBvaW50RW5kIj48cGF0aCBzdHlsZT0ic3Ryb2tlLXdpZHRoOiAxOyBzdHJva2UtZGFzaGFycmF5OiAxLCAwOyIgY2xhc3M9ImFycm93TWFya2VyUGF0aCIgZD0iTSAwIDAgTCAxMCA1IEwgMCAxMCB6Ii8+PC9tYXJrZXI+PG1hcmtlciBvcmllbnQ9ImF1dG8iIG1hcmtlckhlaWdodD0iMTIiIG1hcmtlcldpZHRoPSIxMiIgbWFya2VyVW5pdHM9InVzZXJTcGFjZU9uVXNlIiByZWZZPSI1IiByZWZYPSI0LjUiIHZpZXdCb3g9IjAgMCAxMCAxMCIgY2xhc3M9Im1hcmtlciBmbG93Y2hhcnQiIGlkPSJteS1zdmdfZmxvd2NoYXJ0LXBvaW50U3RhcnQiPjxwYXRoIHN0eWxlPSJzdHJva2Utd2lkdGg6IDE7IHN0cm9rZS1kYXNoYXJyYXk6IDEsIDA7IiBjbGFzcz0iYXJyb3dNYXJrZXJQYXRoIiBkPSJNIDAgNSBMIDEwIDEwIEwgMTAgMCB6Ii8+PC9tYXJrZXI+PG1hcmtlciBvcmllbnQ9ImF1dG8iIG1hcmtlckhlaWdodD0iMTEiIG1hcmtlcldpZHRoPSIxMSIgbWFya2VyVW5pdHM9InVzZXJTcGFjZU9uVXNlIiByZWZZPSI1IiByZWZYPSIxMSIgdmlld0JveD0iMCAwIDEwIDEwIiBjbGFzcz0ibWFya2VyIGZsb3djaGFydCIgaWQ9Im15LXN2Z19mbG93Y2hhcnQtY2lyY2xlRW5kIj48Y2lyY2xlIHN0eWxlPSJzdHJva2Utd2lkdGg6IDE7IHN0cm9rZS1kYXNoYXJyYXk6IDEsIDA7IiBjbGFzcz0iYXJyb3dNYXJrZXJQYXRoIiByPSI1IiBjeT0iNSIgY3g9IjUiLz48L21hcmtlcj48bWFya2VyIG9yaWVudD0iYXV0byIgbWFya2VySGVpZ2h0PSIxMSIgbWFya2VyV2lkdGg9IjExIiBtYXJrZXJVbml0cz0idXNlclNwYWNlT25Vc2UiIHJlZlk9IjUiIHJlZlg9Ii0xIiB2aWV3Qm94PSIwIDAgMTAgMTAiIGNsYXNzPSJtYXJrZXIgZmxvd2NoYXJ0IiBpZD0ibXktc3ZnX2Zsb3djaGFydC1jaXJjbGVTdGFydCI+PGNpcmNsZSBzdHlsZT0ic3Ryb2tlLXdpZHRoOiAxOyBzdHJva2UtZGFzaGFycmF5OiAxLCAwOyIgY2xhc3M9ImFycm93TWFya2VyUGF0aCIgcj0iNSIgY3k9IjUiIGN4PSI1Ii8+PC9tYXJrZXI+PG1hcmtlciBvcmllbnQ9ImF1dG8iIG1hcmtlckhlaWdodD0iMTEiIG1hcmtlcldpZHRoPSIxMSIgbWFya2VyVW5pdHM9InVzZXJTcGFjZU9uVXNlIiByZWZZPSI1LjIiIHJlZlg9IjEyIiB2aWV3Qm94PSIwIDAgMTEgMTEiIGNsYXNzPSJtYXJrZXIgY3Jvc3MgZmxvd2NoYXJ0IiBpZD0ibXktc3ZnX2Zsb3djaGFydC1jcm9zc0VuZCI+PHBhdGggc3R5bGU9InN0cm9rZS13aWR0aDogMjsgc3Ryb2tlLWRhc2hhcnJheTogMSwgMDsiIGNsYXNzPSJhcnJvd01hcmtlclBhdGgiIGQ9Ik0gMSwxIGwgOSw5IE0gMTAsMSBsIC05LDkiLz48L21hcmtlcj48bWFya2VyIG9yaWVudD0iYXV0byIgbWFya2VySGVpZ2h0PSIxMSIgbWFya2VyV2lkdGg9IjExIiBtYXJrZXJVbml0cz0idXNlclNwYWNlT25Vc2UiIHJlZlk9IjUuMiIgcmVmWD0iLTEiIHZpZXdCb3g9IjAgMCAxMSAxMSIgY2xhc3M9Im1hcmtlciBjcm9zcyBmbG93Y2hhcnQiIGlkPSJteS1zdmdfZmxvd2NoYXJ0LWNyb3NzU3RhcnQiPjxwYXRoIHN0eWxlPSJzdHJva2Utd2lkdGg6IDI7IHN0cm9rZS1kYXNoYXJyYXk6IDEsIDA7IiBjbGFzcz0iYXJyb3dNYXJrZXJQYXRoIiBkPSJNIDEsMSBsIDksOSBNIDEwLDEgbCAtOSw5Ii8+PC9tYXJrZXI+PGcgY2xhc3M9InJvb3QiPjxnIGNsYXNzPSJjbHVzdGVycyIvPjxnIGNsYXNzPSJlZGdlUGF0aHMiPjxwYXRoIG1hcmtlci1lbmQ9InVybCgjbXktc3ZnX2Zsb3djaGFydC1wb2ludEVuZCkiIHN0eWxlPSJmaWxsOm5vbmU7IiBjbGFzcz0iZWRnZS10aGlja25lc3Mtbm9ybWFsIGVkZ2UtcGF0dGVybi1zb2xpZCBmbG93Y2hhcnQtbGluayBMUy1BIExFLUIiIGlkPSJMLUEtQi0wIiBkPSJNMTYzLjc3OSwzNEwxNTUuMDgyLDM4LjE2N0MxNDYuMzg0LDQyLjMzMywxMjguOTg5LDUwLjY2NywxMjAuMjkxLDU4LjExN0MxMTEuNTk0LDY1LjU2NywxMTEuNTk0LDcyLjEzMywxMTEuNTk0LDc1LjQxN0wxMTEuNTk0LDc4LjciLz48cGF0aCBtYXJrZXItZW5kPSJ1cmwoI215LXN2Z19mbG93Y2hhcnQtcG9pbnRFbmQpIiBzdHlsZT0iZmlsbDpub25lOyIgY2xhc3M9ImVkZ2UtdGhpY2tuZXNzLW5vcm1hbCBlZGdlLXBhdHRlcm4tc29saWQgZmxvd2NoYXJ0LWxpbmsgTFMtQSBMRS1DIiBpZD0iTC1BLUMtMCIgZD0iTTI0NS42NDcsMzRMMjU3LjAxNSwzOC4xNjdDMjY4LjM4Myw0Mi4zMzMsMjkxLjExOSw1MC42NjcsMzAyLjQ4Nyw2MS44MzNDMzEzLjg1NSw3MywzMTMuODU1LDg3LDMxMy44NTUsMTAxQzMxMy44NTUsMTE1LDMxMy44NTUsMTI5LDMxMy44NTUsMTQzQzMxMy44NTUsMTU3LDMxMy44NTUsMTcxLDMxMy44NTUsMTg1QzMxMy44NTUsMTk5LDMxMy44NTUsMjEzLDMxMy44NTUsMjIzLjI4M0MzMTMuODU1LDIzMy41NjcsMzEzLjg1NSwyNDAuMTMzLDMxMy44NTUsMjQzLjQxN0wzMTMuODU1LDI0Ni43Ii8+PHBhdGggbWFya2VyLWVuZD0idXJsKCNteS1zdmdfZmxvd2NoYXJ0LXBvaW50RW5kKSIgc3R5bGU9ImZpbGw6bm9uZTsiIGNsYXNzPSJlZGdlLXRoaWNrbmVzcy1ub3JtYWwgZWRnZS1wYXR0ZXJuLXNvbGlkIGZsb3djaGFydC1saW5rIExTLUIgTEUtRCIgaWQ9IkwtQi1ELTAiIGQ9Ik03NC4wNDksMTE4TDY0Ljg0NywxMjIuMTY3QzU1LjY0NSwxMjYuMzMzLDM3LjI0LDEzNC42NjcsMjguMDM4LDE0NS44MzNDMTguODM2LDE1NywxOC44MzYsMTcxLDE4LjgzNiwxODVDMTguODM2LDE5OSwxOC44MzYsMjEzLDE4LjgzNiwyMjMuMjgzQzE4LjgzNiwyMzMuNTY3LDE4LjgzNiwyNDAuMTMzLDE4LjgzNiwyNDMuNDE3TDE4LjgzNiwyNDYuNyIvPjxwYXRoIG1hcmtlci1lbmQ9InVybCgjbXktc3ZnX2Zsb3djaGFydC1wb2ludEVuZCkiIHN0eWxlPSJmaWxsOm5vbmU7IiBjbGFzcz0iZWRnZS10aGlja25lc3Mtbm9ybWFsIGVkZ2UtcGF0dGVybi1zb2xpZCBmbG93Y2hhcnQtbGluayBMUy1CIExFLUUiIGlkPSJMLUItRS0wIiBkPSJNMTI5LjMzNywxMThMMTMzLjY4NiwxMjIuMTY3QzEzOC4wMzQsMTI2LjMzMywxNDYuNzMyLDEzNC42NjcsMTUxLjA4MSwxNDIuMTE3QzE1NS40MywxNDkuNTY3LDE1NS40MywxNTYuMTMzLDE1NS40MywxNTkuNDE3TDE1NS40MywxNjIuNyIvPjxwYXRoIG1hcmtlci1lbmQ9InVybCgjbXktc3ZnX2Zsb3djaGFydC1wb2ludEVuZCkiIHN0eWxlPSJmaWxsOm5vbmU7IiBjbGFzcz0iZWRnZS10aGlja25lc3Mtbm9ybWFsIGVkZ2UtcGF0dGVybi1zb2xpZCBmbG93Y2hhcnQtbGluayBMUy1FIExFLUYiIGlkPSJMLUUtRi0wIiBkPSJNMTM1LjYyOCwyMDJMMTMwLjc3NSwyMDYuMTY3QzEyNS45MjEsMjEwLjMzMywxMTYuMjE1LDIxOC42NjcsMTExLjM2MSwyMjYuMTE3QzEwNi41MDgsMjMzLjU2NywxMDYuNTA4LDI0MC4xMzMsMTA2LjUwOCwyNDMuNDE3TDEwNi41MDgsMjQ2LjciLz48cGF0aCBtYXJrZXItZW5kPSJ1cmwoI215LXN2Z19mbG93Y2hhcnQtcG9pbnRFbmQpIiBzdHlsZT0iZmlsbDpub25lOyIgY2xhc3M9ImVkZ2UtdGhpY2tuZXNzLW5vcm1hbCBlZGdlLXBhdHRlcm4tc29saWQgZmxvd2NoYXJ0LWxpbmsgTFMtRSBMRS1HIiBpZD0iTC1FLUctMCIgZD0iTTE2Ni4zMjUsMjAyTDE2OC45OTUsMjA2LjE2N0MxNzEuNjY2LDIxMC4zMzMsMTc3LjAwNywyMTguNjY3LDE3OS42NzcsMjI5LjgzM0MxODIuMzQ4LDI0MSwxODIuMzQ4LDI1NSwxODIuMzQ4LDI2OUMxODIuMzQ4LDI4MywxODIuMzQ4LDI5NywxODIuMzQ4LDMwNy4yODNDMTgyLjM0OCwzMTcuNTY3LDE4Mi4zNDgsMzI0LjEzMywxODIuMzQ4LDMyNy40MTdMMTgyLjM0OCwzMzAuNyIvPjxwYXRoIG1hcmtlci1lbmQ9InVybCgjbXktc3ZnX2Zsb3djaGFydC1wb2ludEVuZCkiIHN0eWxlPSJmaWxsOm5vbmU7IiBjbGFzcz0iZWRnZS10aGlja25lc3Mtbm9ybWFsIGVkZ2UtcGF0dGVybi1zb2xpZCBmbG93Y2hhcnQtbGluayBMUy1DIExFLUgiIGlkPSJMLUMtSC0wIiBkPSJNMjk2LjExMiwyODZMMjkxLjc2NCwyOTAuMTY3QzI4Ny40MTUsMjk0LjMzMywyNzguNzE3LDMwMi42NjcsMjc0LjM2OCwzMTAuMTE3QzI3MC4wMiwzMTcuNTY3LDI3MC4wMiwzMjQuMTMzLDI3MC4wMiwzMjcuNDE3TDI3MC4wMiwzMzAuNyIvPjxwYXRoIG1hcmtlci1lbmQ9InVybCgjbXktc3ZnX2Zsb3djaGFydC1wb2ludEVuZCkiIHN0eWxlPSJmaWxsOm5vbmU7IiBjbGFzcz0iZWRnZS10aGlja25lc3Mtbm9ybWFsIGVkZ2UtcGF0dGVybi1zb2xpZCBmbG93Y2hhcnQtbGluayBMUy1DIExFLUkiIGlkPSJMLUMtSS0wIiBkPSJNMzMxLjU5OSwyODZMMzM1Ljk0NywyOTAuMTY3QzM0MC4yOTYsMjk0LjMzMywzNDguOTk0LDMwMi42NjcsMzUzLjM0MywzMTAuMTE3QzM1Ny42OTEsMzE3LjU2NywzNTcuNjkxLDMyNC4xMzMsMzU3LjY5MSwzMjcuNDE3TDM1Ny42OTEsMzMwLjciLz48cGF0aCBtYXJrZXItZW5kPSJ1cmwoI215LXN2Z19mbG93Y2hhcnQtcG9pbnRFbmQpIiBzdHlsZT0iZmlsbDpub25lOyIgY2xhc3M9ImVkZ2UtdGhpY2tuZXNzLW5vcm1hbCBlZGdlLXBhdHRlcm4tc29saWQgZmxvd2NoYXJ0LWxpbmsgTFMtRCBMRS1KIiBpZD0iTC1ELUotMCIgZD0iTTE4LjgzNiwyODZMMTguODM2LDI5MC4xNjdDMTguODM2LDI5NC4zMzMsMTguODM2LDMwMi42NjcsMjIuNTQ3LDMxMC4zODlDMjYuMjU4LDMxOC4xMTEsMzMuNjgsMzI1LjIyMiwzNy4zOTEsMzI4Ljc3OEw0MS4xMDIsMzMyLjMzMyIvPjxwYXRoIG1hcmtlci1lbmQ9InVybCgjbXktc3ZnX2Zsb3djaGFydC1wb2ludEVuZCkiIHN0eWxlPSJmaWxsOm5vbmU7IiBjbGFzcz0iZWRnZS10aGlja25lc3Mtbm9ybWFsIGVkZ2UtcGF0dGVybi1zb2xpZCBmbG93Y2hhcnQtbGluayBMUy1GIExFLUoiIGlkPSJMLUYtSi0wIiBkPSJNMTA2LjUwOCwyODZMMTA2LjUwOCwyOTAuMTY3QzEwNi41MDgsMjk0LjMzMywxMDYuNTA4LDMwMi42NjcsMTAyLjc5NywzMTAuMzg5Qzk5LjA4NiwzMTguMTExLDkxLjY2NCwzMjUuMjIyLDg3Ljk1MywzMjguNzc4TDg0LjI0MiwzMzIuMzMzIi8+PHBhdGggbWFya2VyLWVuZD0idXJsKCNteS1zdmdfZmxvd2NoYXJ0LXBvaW50RW5kKSIgc3R5bGU9ImZpbGw6bm9uZTsiIGNsYXNzPSJlZGdlLXRoaWNrbmVzcy1ub3JtYWwgZWRnZS1wYXR0ZXJuLXNvbGlkIGZsb3djaGFydC1saW5rIExTLUcgTEUtSyIgaWQ9IkwtRy1LLTAiIGQ9Ik0xODIuMzQ4LDM3MEwxODIuMzQ4LDM3NC4xNjdDMTgyLjM0OCwzNzguMzMzLDE4Mi4zNDgsMzg2LjY2NywxNzYuMDg4LDM5NC41NDlDMTY5LjgyOCw0MDIuNDMyLDE1Ny4zMDksNDA5Ljg2MywxNTEuMDQ5LDQxMy41NzlMMTQ0Ljc5LDQxNy4yOTUiLz48cGF0aCBtYXJrZXItZW5kPSJ1cmwoI215LXN2Z19mbG93Y2hhcnQtcG9pbnRFbmQpIiBzdHlsZT0iZmlsbDpub25lOyIgY2xhc3M9ImVkZ2UtdGhpY2tuZXNzLW5vcm1hbCBlZGdlLXBhdHRlcm4tc29saWQgZmxvd2NoYXJ0LWxpbmsgTFMtSiBMRS1LIiBpZD0iTC1KLUstMCIgZD0iTTYyLjY3MiwzNzBMNjIuNjcyLDM3NC4xNjdDNjIuNjcyLDM3OC4zMzMsNjIuNjcyLDM4Ni42NjcsNjYuODU1LDM5NC40MjVDNzEuMDM4LDQwMi4xODMsNzkuNDA0LDQwOS4zNjUsODMuNTg4LDQxMi45NTZMODcuNzcxLDQxNi41NDgiLz48cGF0aCBtYXJrZXItZW5kPSJ1cmwoI215LXN2Z19mbG93Y2hhcnQtcG9pbnRFbmQpIiBzdHlsZT0iZmlsbDpub25lOyIgY2xhc3M9ImVkZ2UtdGhpY2tuZXNzLW5vcm1hbCBlZGdlLXBhdHRlcm4tc29saWQgZmxvd2NoYXJ0LWxpbmsgTFMtSCBMRS1MIiBpZD0iTC1ILUwtMCIgZD0iTTI3MC4wMiwzNzBMMjcwLjAyLDM3NC4xNjdDMjcwLjAyLDM3OC4zMzMsMjcwLjAyLDM4Ni42NjcsMjczLjczMSwzOTQuMzg5QzI3Ny40NDEsNDAyLjExMSwyODQuODYzLDQwOS4yMjIsMjg4LjU3NCw0MTIuNzc4TDI5Mi4yODUsNDE2LjMzMyIvPjxwYXRoIG1hcmtlci1lbmQ9InVybCgjbXktc3ZnX2Zsb3djaGFydC1wb2ludEVuZCkiIHN0eWxlPSJmaWxsOm5vbmU7IiBjbGFzcz0iZWRnZS10aGlja25lc3Mtbm9ybWFsIGVkZ2UtcGF0dGVybi1zb2xpZCBmbG93Y2hhcnQtbGluayBMUy1JIExFLUwiIGlkPSJMLUktTC0wIiBkPSJNMzU3LjY5MSwzNzBMMzU3LjY5MSwzNzQuMTY3QzM1Ny42OTEsMzc4LjMzMywzNTcuNjkxLDM4Ni42NjcsMzUzLjk4LDM5NC4zODlDMzUwLjI2OSw0MDIuMTExLDM0Mi44NDcsNDA5LjIyMiwzMzkuMTM3LDQxMi43NzhMMzM1LjQyNiw0MTYuMzMzIi8+PHBhdGggbWFya2VyLWVuZD0idXJsKCNteS1zdmdfZmxvd2NoYXJ0LXBvaW50RW5kKSIgc3R5bGU9ImZpbGw6bm9uZTsiIGNsYXNzPSJlZGdlLXRoaWNrbmVzcy1ub3JtYWwgZWRnZS1wYXR0ZXJuLXNvbGlkIGZsb3djaGFydC1saW5rIExTLUsgTEUtTSIgaWQ9IkwtSy1NLTAiIGQ9Ik0xMTEuNTk0LDQ1NEwxMTEuNTk0LDQ1OC4xNjdDMTExLjU5NCw0NjIuMzMzLDExMS41OTQsNDcwLjY2NywxMTkuNDk1LDQ3OC42MThDMTI3LjM5Niw0ODYuNTcsMTQzLjE5OCw0OTQuMTQsMTUxLjA5OSw0OTcuOTI1TDE1OSw1MDEuNzEiLz48cGF0aCBtYXJrZXItZW5kPSJ1cmwoI215LXN2Z19mbG93Y2hhcnQtcG9pbnRFbmQpIiBzdHlsZT0iZmlsbDpub25lOyIgY2xhc3M9ImVkZ2UtdGhpY2tuZXNzLW5vcm1hbCBlZGdlLXBhdHRlcm4tc29saWQgZmxvd2NoYXJ0LWxpbmsgTFMtTCBMRS1NIiBpZD0iTC1MLU0tMCIgZD0iTTMxMy44NTUsNDU0TDMxMy44NTUsNDU4LjE2N0MzMTMuODU1LDQ2Mi4zMzMsMzEzLjg1NSw0NzAuNjY3LDMwMy4zMTcsNDc4LjY5NkMyOTIuNzc4LDQ4Ni43MjUsMjcxLjcwMSw0OTQuNDUxLDI2MS4xNjIsNDk4LjMxM0wyNTAuNjI0LDUwMi4xNzYiLz48L2c+PGcgY2xhc3M9ImVkZ2VMYWJlbHMiPjxnIGNsYXNzPSJlZGdlTGFiZWwiPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAsIDApIiBjbGFzcz0ibGFiZWwiPjxmb3JlaWduT2JqZWN0IGhlaWdodD0iMCIgd2lkdGg9IjAiPjxkaXYgc3R5bGU9ImRpc3BsYXk6IGlubGluZS1ibG9jazsgd2hpdGUtc3BhY2U6IG5vd3JhcDsiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj48c3BhbiBjbGFzcz0iZWRnZUxhYmVsIj48L3NwYW4+PC9kaXY+PC9mb3JlaWduT2JqZWN0PjwvZz48L2c+PGcgY2xhc3M9ImVkZ2VMYWJlbCI+PGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCwgMCkiIGNsYXNzPSJsYWJlbCI+PGZvcmVpZ25PYmplY3QgaGVpZ2h0PSIwIiB3aWR0aD0iMCI+PGRpdiBzdHlsZT0iZGlzcGxheTogaW5saW5lLWJsb2NrOyB3aGl0ZS1zcGFjZTogbm93cmFwOyIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPjxzcGFuIGNsYXNzPSJlZGdlTGFiZWwiPjwvc3Bhbj48L2Rpdj48L2ZvcmVpZ25PYmplY3Q+PC9nPjwvZz48ZyBjbGFzcz0iZWRnZUxhYmVsIj48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLCAwKSIgY2xhc3M9ImxhYmVsIj48Zm9yZWlnbk9iamVjdCBoZWlnaHQ9IjAiIHdpZHRoPSIwIj48ZGl2IHN0eWxlPSJkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IHdoaXRlLXNwYWNlOiBub3dyYXA7IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+PHNwYW4gY2xhc3M9ImVkZ2VMYWJlbCI+PC9zcGFuPjwvZGl2PjwvZm9yZWlnbk9iamVjdD48L2c+PC9nPjxnIGNsYXNzPSJlZGdlTGFiZWwiPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAsIDApIiBjbGFzcz0ibGFiZWwiPjxmb3JlaWduT2JqZWN0IGhlaWdodD0iMCIgd2lkdGg9IjAiPjxkaXYgc3R5bGU9ImRpc3BsYXk6IGlubGluZS1ibG9jazsgd2hpdGUtc3BhY2U6IG5vd3JhcDsiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj48c3BhbiBjbGFzcz0iZWRnZUxhYmVsIj48L3NwYW4+PC9kaXY+PC9mb3JlaWduT2JqZWN0PjwvZz48L2c+PGcgY2xhc3M9ImVkZ2VMYWJlbCI+PGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCwgMCkiIGNsYXNzPSJsYWJlbCI+PGZvcmVpZ25PYmplY3QgaGVpZ2h0PSIwIiB3aWR0aD0iMCI+PGRpdiBzdHlsZT0iZGlzcGxheTogaW5saW5lLWJsb2NrOyB3aGl0ZS1zcGFjZTogbm93cmFwOyIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPjxzcGFuIGNsYXNzPSJlZGdlTGFiZWwiPjwvc3Bhbj48L2Rpdj48L2ZvcmVpZ25PYmplY3Q+PC9nPjwvZz48ZyBjbGFzcz0iZWRnZUxhYmVsIj48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLCAwKSIgY2xhc3M9ImxhYmVsIj48Zm9yZWlnbk9iamVjdCBoZWlnaHQ9IjAiIHdpZHRoPSIwIj48ZGl2IHN0eWxlPSJkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IHdoaXRlLXNwYWNlOiBub3dyYXA7IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+PHNwYW4gY2xhc3M9ImVkZ2VMYWJlbCI+PC9zcGFuPjwvZGl2PjwvZm9yZWlnbk9iamVjdD48L2c+PC9nPjxnIGNsYXNzPSJlZGdlTGFiZWwiPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAsIDApIiBjbGFzcz0ibGFiZWwiPjxmb3JlaWduT2JqZWN0IGhlaWdodD0iMCIgd2lkdGg9IjAiPjxkaXYgc3R5bGU9ImRpc3BsYXk6IGlubGluZS1ibG9jazsgd2hpdGUtc3BhY2U6IG5vd3JhcDsiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj48c3BhbiBjbGFzcz0iZWRnZUxhYmVsIj48L3NwYW4+PC9kaXY+PC9mb3JlaWduT2JqZWN0PjwvZz48L2c+PGcgY2xhc3M9ImVkZ2VMYWJlbCI+PGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCwgMCkiIGNsYXNzPSJsYWJlbCI+PGZvcmVpZ25PYmplY3QgaGVpZ2h0PSIwIiB3aWR0aD0iMCI+PGRpdiBzdHlsZT0iZGlzcGxheTogaW5saW5lLWJsb2NrOyB3aGl0ZS1zcGFjZTogbm93cmFwOyIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPjxzcGFuIGNsYXNzPSJlZGdlTGFiZWwiPjwvc3Bhbj48L2Rpdj48L2ZvcmVpZ25PYmplY3Q+PC9nPjwvZz48ZyBjbGFzcz0iZWRnZUxhYmVsIj48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLCAwKSIgY2xhc3M9ImxhYmVsIj48Zm9yZWlnbk9iamVjdCBoZWlnaHQ9IjAiIHdpZHRoPSIwIj48ZGl2IHN0eWxlPSJkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IHdoaXRlLXNwYWNlOiBub3dyYXA7IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+PHNwYW4gY2xhc3M9ImVkZ2VMYWJlbCI+PC9zcGFuPjwvZGl2PjwvZm9yZWlnbk9iamVjdD48L2c+PC9nPjxnIGNsYXNzPSJlZGdlTGFiZWwiPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAsIDApIiBjbGFzcz0ibGFiZWwiPjxmb3JlaWduT2JqZWN0IGhlaWdodD0iMCIgd2lkdGg9IjAiPjxkaXYgc3R5bGU9ImRpc3BsYXk6IGlubGluZS1ibG9jazsgd2hpdGUtc3BhY2U6IG5vd3JhcDsiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj48c3BhbiBjbGFzcz0iZWRnZUxhYmVsIj48L3NwYW4+PC9kaXY+PC9mb3JlaWduT2JqZWN0PjwvZz48L2c+PGcgY2xhc3M9ImVkZ2VMYWJlbCI+PGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCwgMCkiIGNsYXNzPSJsYWJlbCI+PGZvcmVpZ25PYmplY3QgaGVpZ2h0PSIwIiB3aWR0aD0iMCI+PGRpdiBzdHlsZT0iZGlzcGxheTogaW5saW5lLWJsb2NrOyB3aGl0ZS1zcGFjZTogbm93cmFwOyIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPjxzcGFuIGNsYXNzPSJlZGdlTGFiZWwiPjwvc3Bhbj48L2Rpdj48L2ZvcmVpZ25PYmplY3Q+PC9nPjwvZz48ZyBjbGFzcz0iZWRnZUxhYmVsIj48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLCAwKSIgY2xhc3M9ImxhYmVsIj48Zm9yZWlnbk9iamVjdCBoZWlnaHQ9IjAiIHdpZHRoPSIwIj48ZGl2IHN0eWxlPSJkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IHdoaXRlLXNwYWNlOiBub3dyYXA7IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+PHNwYW4gY2xhc3M9ImVkZ2VMYWJlbCI+PC9zcGFuPjwvZGl2PjwvZm9yZWlnbk9iamVjdD48L2c+PC9nPjxnIGNsYXNzPSJlZGdlTGFiZWwiPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAsIDApIiBjbGFzcz0ibGFiZWwiPjxmb3JlaWduT2JqZWN0IGhlaWdodD0iMCIgd2lkdGg9IjAiPjxkaXYgc3R5bGU9ImRpc3BsYXk6IGlubGluZS1ibG9jazsgd2hpdGUtc3BhY2U6IG5vd3JhcDsiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj48c3BhbiBjbGFzcz0iZWRnZUxhYmVsIj48L3NwYW4+PC9kaXY+PC9mb3JlaWduT2JqZWN0PjwvZz48L2c+PGcgY2xhc3M9ImVkZ2VMYWJlbCI+PGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCwgMCkiIGNsYXNzPSJsYWJlbCI+PGZvcmVpZ25PYmplY3QgaGVpZ2h0PSIwIiB3aWR0aD0iMCI+PGRpdiBzdHlsZT0iZGlzcGxheTogaW5saW5lLWJsb2NrOyB3aGl0ZS1zcGFjZTogbm93cmFwOyIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPjxzcGFuIGNsYXNzPSJlZGdlTGFiZWwiPjwvc3Bhbj48L2Rpdj48L2ZvcmVpZ25PYmplY3Q+PC9nPjwvZz48ZyBjbGFzcz0iZWRnZUxhYmVsIj48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLCAwKSIgY2xhc3M9ImxhYmVsIj48Zm9yZWlnbk9iamVjdCBoZWlnaHQ9IjAiIHdpZHRoPSIwIj48ZGl2IHN0eWxlPSJkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IHdoaXRlLXNwYWNlOiBub3dyYXA7IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+PHNwYW4gY2xhc3M9ImVkZ2VMYWJlbCI+PC9zcGFuPjwvZGl2PjwvZm9yZWlnbk9iamVjdD48L2c+PC9nPjxnIGNsYXNzPSJlZGdlTGFiZWwiPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAsIDApIiBjbGFzcz0ibGFiZWwiPjxmb3JlaWduT2JqZWN0IGhlaWdodD0iMCIgd2lkdGg9IjAiPjxkaXYgc3R5bGU9ImRpc3BsYXk6IGlubGluZS1ibG9jazsgd2hpdGUtc3BhY2U6IG5vd3JhcDsiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj48c3BhbiBjbGFzcz0iZWRnZUxhYmVsIj48L3NwYW4+PC9kaXY+PC9mb3JlaWduT2JqZWN0PjwvZz48L2c+PC9nPjxnIGNsYXNzPSJub2RlcyI+PGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMTk5LjI2NTYyNSwgMTcpIiBkYXRhLWlkPSJBIiBkYXRhLW5vZGU9InRydWUiIGlkPSJmbG93Y2hhcnQtQS0wIiBjbGFzcz0ibm9kZSBkZWZhdWx0IGRlZmF1bHQgZmxvd2NoYXJ0LWxhYmVsIj48cmVjdCBoZWlnaHQ9IjM0IiB3aWR0aD0iMTE5LjA3ODEyNSIgeT0iLTE3IiB4PSItNTkuNTM5MDYyNSIgcnk9IjAiIHJ4PSIwIiBzdHlsZT0iIiBjbGFzcz0iYmFzaWMgbGFiZWwtY29udGFpbmVyIi8+PGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTUyLjAzOTA2MjUsIC05LjUpIiBzdHlsZT0iIiBjbGFzcz0ibGFiZWwiPjxyZWN0Lz48Zm9yZWlnbk9iamVjdCBoZWlnaHQ9IjE5IiB3aWR0aD0iMTA0LjA3ODEyNSI+PGRpdiBzdHlsZT0iZGlzcGxheTogaW5saW5lLWJsb2NrOyB3aGl0ZS1zcGFjZTogbm93cmFwOyIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPjxzcGFuIGNsYXNzPSJub2RlTGFiZWwiPlszLCA0LCA2LCAxLCAyXTwvc3Bhbj48L2Rpdj48L2ZvcmVpZ25PYmplY3Q+PC9nPjwvZz48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxMTEuNTkzNzUsIDEwMSkiIGRhdGEtaWQ9IkIiIGRhdGEtbm9kZT0idHJ1ZSIgaWQ9ImZsb3djaGFydC1CLTEiIGNsYXNzPSJub2RlIGRlZmF1bHQgZGVmYXVsdCBmbG93Y2hhcnQtbGFiZWwiPjxyZWN0IGhlaWdodD0iMzQiIHdpZHRoPSI3OC4zNzUiIHk9Ii0xNyIgeD0iLTM5LjE4NzUiIHJ5PSIwIiByeD0iMCIgc3R5bGU9IiIgY2xhc3M9ImJhc2ljIGxhYmVsLWNvbnRhaW5lciIvPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0zMS42ODc1LCAtOS41KSIgc3R5bGU9IiIgY2xhc3M9ImxhYmVsIj48cmVjdC8+PGZvcmVpZ25PYmplY3QgaGVpZ2h0PSIxOSIgd2lkdGg9IjYzLjM3NSI+PGRpdiBzdHlsZT0iZGlzcGxheTogaW5saW5lLWJsb2NrOyB3aGl0ZS1zcGFjZTogbm93cmFwOyIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPjxzcGFuIGNsYXNzPSJub2RlTGFiZWwiPlszLCA0LCA2XTwvc3Bhbj48L2Rpdj48L2ZvcmVpZ25PYmplY3Q+PC9nPjwvZz48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgzMTMuODU1NDY4NzUsIDI2OSkiIGRhdGEtaWQ9IkMiIGRhdGEtbm9kZT0idHJ1ZSIgaWQ9ImZsb3djaGFydC1DLTMiIGNsYXNzPSJub2RlIGRlZmF1bHQgZGVmYXVsdCBmbG93Y2hhcnQtbGFiZWwiPjxyZWN0IGhlaWdodD0iMzQiIHdpZHRoPSI1OC4wMTU2MjUiIHk9Ii0xNyIgeD0iLTI5LjAwNzgxMjUiIHJ5PSIwIiByeD0iMCIgc3R5bGU9IiIgY2xhc3M9ImJhc2ljIGxhYmVsLWNvbnRhaW5lciIvPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yMS41MDc4MTI1LCAtOS41KSIgc3R5bGU9IiIgY2xhc3M9ImxhYmVsIj48cmVjdC8+PGZvcmVpZ25PYmplY3QgaGVpZ2h0PSIxOSIgd2lkdGg9IjQzLjAxNTYyNSI+PGRpdiBzdHlsZT0iZGlzcGxheTogaW5saW5lLWJsb2NrOyB3aGl0ZS1zcGFjZTogbm93cmFwOyIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPjxzcGFuIGNsYXNzPSJub2RlTGFiZWwiPlsxLCAyXTwvc3Bhbj48L2Rpdj48L2ZvcmVpZ25PYmplY3Q+PC9nPjwvZz48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxOC44MzU5Mzc1LCAyNjkpIiBkYXRhLWlkPSJEIiBkYXRhLW5vZGU9InRydWUiIGlkPSJmbG93Y2hhcnQtRC01IiBjbGFzcz0ibm9kZSBkZWZhdWx0IGRlZmF1bHQgZmxvd2NoYXJ0LWxhYmVsIj48cmVjdCBoZWlnaHQ9IjM0IiB3aWR0aD0iMzcuNjcxODc1IiB5PSItMTciIHg9Ii0xOC44MzU5Mzc1IiByeT0iMCIgcng9IjAiIHN0eWxlPSIiIGNsYXNzPSJiYXNpYyBsYWJlbC1jb250YWluZXIiLz48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMTEuMzM1OTM3NSwgLTkuNSkiIHN0eWxlPSIiIGNsYXNzPSJsYWJlbCI+PHJlY3QvPjxmb3JlaWduT2JqZWN0IGhlaWdodD0iMTkiIHdpZHRoPSIyMi42NzE4NzUiPjxkaXYgc3R5bGU9ImRpc3BsYXk6IGlubGluZS1ibG9jazsgd2hpdGUtc3BhY2U6IG5vd3JhcDsiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj48c3BhbiBjbGFzcz0ibm9kZUxhYmVsIj5bM108L3NwYW4+PC9kaXY+PC9mb3JlaWduT2JqZWN0PjwvZz48L2c+PGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMTU1LjQyOTY4NzUsIDE4NSkiIGRhdGEtaWQ9IkUiIGRhdGEtbm9kZT0idHJ1ZSIgaWQ9ImZsb3djaGFydC1FLTciIGNsYXNzPSJub2RlIGRlZmF1bHQgZGVmYXVsdCBmbG93Y2hhcnQtbGFiZWwiPjxyZWN0IGhlaWdodD0iMzQiIHdpZHRoPSI1OC4wMTU2MjUiIHk9Ii0xNyIgeD0iLTI5LjAwNzgxMjUiIHJ5PSIwIiByeD0iMCIgc3R5bGU9IiIgY2xhc3M9ImJhc2ljIGxhYmVsLWNvbnRhaW5lciIvPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yMS41MDc4MTI1LCAtOS41KSIgc3R5bGU9IiIgY2xhc3M9ImxhYmVsIj48cmVjdC8+PGZvcmVpZ25PYmplY3QgaGVpZ2h0PSIxOSIgd2lkdGg9IjQzLjAxNTYyNSI+PGRpdiBzdHlsZT0iZGlzcGxheTogaW5saW5lLWJsb2NrOyB3aGl0ZS1zcGFjZTogbm93cmFwOyIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPjxzcGFuIGNsYXNzPSJub2RlTGFiZWwiPls0LCA2XTwvc3Bhbj48L2Rpdj48L2ZvcmVpZ25PYmplY3Q+PC9nPjwvZz48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxMDYuNTA3ODEyNSwgMjY5KSIgZGF0YS1pZD0iRiIgZGF0YS1ub2RlPSJ0cnVlIiBpZD0iZmxvd2NoYXJ0LUYtOSIgY2xhc3M9Im5vZGUgZGVmYXVsdCBkZWZhdWx0IGZsb3djaGFydC1sYWJlbCI+PHJlY3QgaGVpZ2h0PSIzNCIgd2lkdGg9IjM3LjY3MTg3NSIgeT0iLTE3IiB4PSItMTguODM1OTM3NSIgcnk9IjAiIHJ4PSIwIiBzdHlsZT0iIiBjbGFzcz0iYmFzaWMgbGFiZWwtY29udGFpbmVyIi8+PGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTExLjMzNTkzNzUsIC05LjUpIiBzdHlsZT0iIiBjbGFzcz0ibGFiZWwiPjxyZWN0Lz48Zm9yZWlnbk9iamVjdCBoZWlnaHQ9IjE5IiB3aWR0aD0iMjIuNjcxODc1Ij48ZGl2IHN0eWxlPSJkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IHdoaXRlLXNwYWNlOiBub3dyYXA7IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+PHNwYW4gY2xhc3M9Im5vZGVMYWJlbCI+WzRdPC9zcGFuPjwvZGl2PjwvZm9yZWlnbk9iamVjdD48L2c+PC9nPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDE4Mi4zNDc2NTYyNSwgMzUzKSIgZGF0YS1pZD0iRyIgZGF0YS1ub2RlPSJ0cnVlIiBpZD0iZmxvd2NoYXJ0LUctMTEiIGNsYXNzPSJub2RlIGRlZmF1bHQgZGVmYXVsdCBmbG93Y2hhcnQtbGFiZWwiPjxyZWN0IGhlaWdodD0iMzQiIHdpZHRoPSIzNy42NzE4NzUiIHk9Ii0xNyIgeD0iLTE4LjgzNTkzNzUiIHJ5PSIwIiByeD0iMCIgc3R5bGU9IiIgY2xhc3M9ImJhc2ljIGxhYmVsLWNvbnRhaW5lciIvPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0xMS4zMzU5Mzc1LCAtOS41KSIgc3R5bGU9IiIgY2xhc3M9ImxhYmVsIj48cmVjdC8+PGZvcmVpZ25PYmplY3QgaGVpZ2h0PSIxOSIgd2lkdGg9IjIyLjY3MTg3NSI+PGRpdiBzdHlsZT0iZGlzcGxheTogaW5saW5lLWJsb2NrOyB3aGl0ZS1zcGFjZTogbm93cmFwOyIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPjxzcGFuIGNsYXNzPSJub2RlTGFiZWwiPls2XTwvc3Bhbj48L2Rpdj48L2ZvcmVpZ25PYmplY3Q+PC9nPjwvZz48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgyNzAuMDE5NTMxMjUsIDM1MykiIGRhdGEtaWQ9IkgiIGRhdGEtbm9kZT0idHJ1ZSIgaWQ9ImZsb3djaGFydC1ILTEzIiBjbGFzcz0ibm9kZSBkZWZhdWx0IGRlZmF1bHQgZmxvd2NoYXJ0LWxhYmVsIj48cmVjdCBoZWlnaHQ9IjM0IiB3aWR0aD0iMzcuNjcxODc1IiB5PSItMTciIHg9Ii0xOC44MzU5Mzc1IiByeT0iMCIgcng9IjAiIHN0eWxlPSIiIGNsYXNzPSJiYXNpYyBsYWJlbC1jb250YWluZXIiLz48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMTEuMzM1OTM3NSwgLTkuNSkiIHN0eWxlPSIiIGNsYXNzPSJsYWJlbCI+PHJlY3QvPjxmb3JlaWduT2JqZWN0IGhlaWdodD0iMTkiIHdpZHRoPSIyMi42NzE4NzUiPjxkaXYgc3R5bGU9ImRpc3BsYXk6IGlubGluZS1ibG9jazsgd2hpdGUtc3BhY2U6IG5vd3JhcDsiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj48c3BhbiBjbGFzcz0ibm9kZUxhYmVsIj5bMV08L3NwYW4+PC9kaXY+PC9mb3JlaWduT2JqZWN0PjwvZz48L2c+PGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMzU3LjY5MTQwNjI1LCAzNTMpIiBkYXRhLWlkPSJJIiBkYXRhLW5vZGU9InRydWUiIGlkPSJmbG93Y2hhcnQtSS0xNSIgY2xhc3M9Im5vZGUgZGVmYXVsdCBkZWZhdWx0IGZsb3djaGFydC1sYWJlbCI+PHJlY3QgaGVpZ2h0PSIzNCIgd2lkdGg9IjM3LjY3MTg3NSIgeT0iLTE3IiB4PSItMTguODM1OTM3NSIgcnk9IjAiIHJ4PSIwIiBzdHlsZT0iIiBjbGFzcz0iYmFzaWMgbGFiZWwtY29udGFpbmVyIi8+PGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTExLjMzNTkzNzUsIC05LjUpIiBzdHlsZT0iIiBjbGFzcz0ibGFiZWwiPjxyZWN0Lz48Zm9yZWlnbk9iamVjdCBoZWlnaHQ9IjE5IiB3aWR0aD0iMjIuNjcxODc1Ij48ZGl2IHN0eWxlPSJkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IHdoaXRlLXNwYWNlOiBub3dyYXA7IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+PHNwYW4gY2xhc3M9Im5vZGVMYWJlbCI+WzJdPC9zcGFuPjwvZGl2PjwvZm9yZWlnbk9iamVjdD48L2c+PC9nPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDYyLjY3MTg3NSwgMzUzKSIgZGF0YS1pZD0iSiIgZGF0YS1ub2RlPSJ0cnVlIiBpZD0iZmxvd2NoYXJ0LUotMTciIGNsYXNzPSJub2RlIGRlZmF1bHQgZGVmYXVsdCBmbG93Y2hhcnQtbGFiZWwiPjxyZWN0IGhlaWdodD0iMzQiIHdpZHRoPSI1OC4wMTU2MjUiIHk9Ii0xNyIgeD0iLTI5LjAwNzgxMjUiIHJ5PSIwIiByeD0iMCIgc3R5bGU9IiIgY2xhc3M9ImJhc2ljIGxhYmVsLWNvbnRhaW5lciIvPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yMS41MDc4MTI1LCAtOS41KSIgc3R5bGU9IiIgY2xhc3M9ImxhYmVsIj48cmVjdC8+PGZvcmVpZ25PYmplY3QgaGVpZ2h0PSIxOSIgd2lkdGg9IjQzLjAxNTYyNSI+PGRpdiBzdHlsZT0iZGlzcGxheTogaW5saW5lLWJsb2NrOyB3aGl0ZS1zcGFjZTogbm93cmFwOyIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPjxzcGFuIGNsYXNzPSJub2RlTGFiZWwiPlszLCA0XTwvc3Bhbj48L2Rpdj48L2ZvcmVpZ25PYmplY3Q+PC9nPjwvZz48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxMTEuNTkzNzUsIDQzNykiIGRhdGEtaWQ9IksiIGRhdGEtbm9kZT0idHJ1ZSIgaWQ9ImZsb3djaGFydC1LLTIxIiBjbGFzcz0ibm9kZSBkZWZhdWx0IGRlZmF1bHQgZmxvd2NoYXJ0LWxhYmVsIj48cmVjdCBoZWlnaHQ9IjM0IiB3aWR0aD0iNzguMzc1IiB5PSItMTciIHg9Ii0zOS4xODc1IiByeT0iMCIgcng9IjAiIHN0eWxlPSIiIGNsYXNzPSJiYXNpYyBsYWJlbC1jb250YWluZXIiLz48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMzEuNjg3NSwgLTkuNSkiIHN0eWxlPSIiIGNsYXNzPSJsYWJlbCI+PHJlY3QvPjxmb3JlaWduT2JqZWN0IGhlaWdodD0iMTkiIHdpZHRoPSI2My4zNzUiPjxkaXYgc3R5bGU9ImRpc3BsYXk6IGlubGluZS1ibG9jazsgd2hpdGUtc3BhY2U6IG5vd3JhcDsiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj48c3BhbiBjbGFzcz0ibm9kZUxhYmVsIj5bMywgNCwgNl08L3NwYW4+PC9kaXY+PC9mb3JlaWduT2JqZWN0PjwvZz48L2c+PGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMzEzLjg1NTQ2ODc1LCA0MzcpIiBkYXRhLWlkPSJMIiBkYXRhLW5vZGU9InRydWUiIGlkPSJmbG93Y2hhcnQtTC0yNSIgY2xhc3M9Im5vZGUgZGVmYXVsdCBkZWZhdWx0IGZsb3djaGFydC1sYWJlbCI+PHJlY3QgaGVpZ2h0PSIzNCIgd2lkdGg9IjU4LjAxNTYyNSIgeT0iLTE3IiB4PSItMjkuMDA3ODEyNSIgcnk9IjAiIHJ4PSIwIiBzdHlsZT0iIiBjbGFzcz0iYmFzaWMgbGFiZWwtY29udGFpbmVyIi8+PGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTIxLjUwNzgxMjUsIC05LjUpIiBzdHlsZT0iIiBjbGFzcz0ibGFiZWwiPjxyZWN0Lz48Zm9yZWlnbk9iamVjdCBoZWlnaHQ9IjE5IiB3aWR0aD0iNDMuMDE1NjI1Ij48ZGl2IHN0eWxlPSJkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IHdoaXRlLXNwYWNlOiBub3dyYXA7IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+PHNwYW4gY2xhc3M9Im5vZGVMYWJlbCI+WzEsIDJdPC9zcGFuPjwvZGl2PjwvZm9yZWlnbk9iamVjdD48L2c+PC9nPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDE5OS4yNjU2MjUsIDUyMSkiIGRhdGEtaWQ9Ik0iIGRhdGEtbm9kZT0idHJ1ZSIgaWQ9ImZsb3djaGFydC1NLTI5IiBjbGFzcz0ibm9kZSBkZWZhdWx0IGRlZmF1bHQgZmxvd2NoYXJ0LWxhYmVsIj48cmVjdCBoZWlnaHQ9IjM0IiB3aWR0aD0iMTE5LjA3ODEyNSIgeT0iLTE3IiB4PSItNTkuNTM5MDYyNSIgcnk9IjAiIHJ4PSIwIiBzdHlsZT0iIiBjbGFzcz0iYmFzaWMgbGFiZWwtY29udGFpbmVyIi8+PGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTUyLjAzOTA2MjUsIC05LjUpIiBzdHlsZT0iIiBjbGFzcz0ibGFiZWwiPjxyZWN0Lz48Zm9yZWlnbk9iamVjdCBoZWlnaHQ9IjE5IiB3aWR0aD0iMTA0LjA3ODEyNSI+PGRpdiBzdHlsZT0iZGlzcGxheTogaW5saW5lLWJsb2NrOyB3aGl0ZS1zcGFjZTogbm93cmFwOyIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPjxzcGFuIGNsYXNzPSJub2RlTGFiZWwiPlsxLCAyLCAzLCA0LCA2XTwvc3Bhbj48L2Rpdj48L2ZvcmVpZ25PYmplY3Q+PC9nPjwvZz48L2c+PC9nPjwvZz48L3N2Zz4="&gt;
&lt;/p&gt;</content><category term="permanent"/><category term="ComputerScience"/><category term="SortingAlgorithms"/></entry><entry><title>Neural Codec Language Models are Zero-Shot Text-to-Speech Synthesizers</title><link href="http://localhost:8000/neural-codec-language-models-are-zero-shot-text-to-speech-synthesizers.html" rel="alternate"/><published>2024-01-31T00:00:00+10:00</published><updated>2024-01-31T00:00:00+10:00</updated><author><name>Lex Toumbourou</name></author><id>tag:localhost,2024-01-31:/neural-codec-language-models-are-zero-shot-text-to-speech-synthesizers.html</id><summary type="html">&lt;p&gt;VALL-E can generate speech in anyone's voice with only a 3-second sample of the speaker and some text&lt;/p&gt;</summary><content type="html">&lt;p&gt;&lt;em&gt;These are my notes from the paper &lt;a href="https://arxiv.org/abs/2301.02111"&gt;Neural Codec Language Models are Zero-Shot Text to Speech Synthesizers&lt;/a&gt; by Chengyi Wang, Sanyuan Chen, Yu Wu, Ziqiang Zhang, Long Zhou, Shujie Liu, Zhuo Chen, Yanqing Liu, Huaming Wang, Jinyu Li, Lei He, Sheng Zhao, Furu Wei&lt;/em&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="overview"&gt;Overview&lt;/h2&gt;
&lt;p&gt;This paper describes a state-of-the-art (Jan 2023) text-to-speech (TTS) language model called &lt;a href="vall-e.html"&gt;VALL-E&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;VALL-E can generate speech in anyone's voice with only a 3-second sample of the speaker and some text - this capability is known as zero-shot TTS. It is the speech equivalent of GPT's &lt;em&gt;in-context learning&lt;/em&gt; capability.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Diagram of VALL-E" src="../../_media/neural-codec-language-models-are-zero-shot-text-to-speech-synthesizers-fig-1.png"&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Fig 1. from Neural Codec Language Models are Zero-Shot Text-to-Speech Synthesizers&lt;/em&gt;&lt;/p&gt;
&lt;h2 id="key-details"&gt;Key Details&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Use RVQ tokens as an intermediate representation of speech&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;VALL-E uses an intermediate representation of speech instead of modelling audio directly, which makes it a &lt;em&gt;cascading TTS system&lt;/em&gt;. The key insight in this paper, as was the theme of many audio papers in 2023, is utilising a &lt;a href="residual-vector-quantisation.html"&gt;RVQ&lt;/a&gt; audio codec, which compresses audio into discrete &lt;em&gt;"acoustic"&lt;/em&gt; tokens (they use the &lt;a href="https://github.com/facebookresearch/encodec"&gt;Encodec&lt;/a&gt; RVQ implementation).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;TTS as a language model problem&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Thanks to the discrete representation, they can take advantage of a &lt;a href="language-model.html"&gt;Language Model&lt;/a&gt; - a first for a TTS problem.&lt;/p&gt;
&lt;p&gt;These first two details are where the paper gets its name: &lt;font color= "blue"&gt;Neural Codec&lt;/font&gt; &lt;font color= "dark-yellow"&gt;Language Models&lt;/font&gt; are &lt;font color= "orange"&gt;Zero-Shot&lt;/font&gt; &lt;font color= "green"&gt;Text-to-Speech Synthesizes&lt;/font&gt;.&lt;/p&gt;
&lt;p&gt;By treating TTS as a language model problem, they can take advantage of large, noisy datasets, which is a step toward reliable zero-shot TTS.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Train on 60k hours of unannotated speech from the Libri-Light dataset&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The &lt;a href="https://github.com/facebookresearch/libri-light"&gt;Libri-Light&lt;/a&gt; dataset has over 60k hours of unannotated speech, hundreds of times more than existing TTS papers. Since most of Libri-Light is unannotated, they train a speech recognition model to generate textual annotations (HDNN-HMM) for the raw speech.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Model tokens hierarchically&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The authors note that the quantising approach in RVQ has a hierarchical structure: tokens from the first quantiser can recover acoustic properties like speaker identification, whereas the later quantiser learns fine acoustic details.&lt;/p&gt;
&lt;p&gt;They exploit this insight by splitting the language model into two parts:&lt;/p&gt;
&lt;p&gt;1. An &lt;em&gt;autoregressive&lt;/em&gt; Transformer that is used to predict codes for the first codebook.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Diagram of autoregression token modelling" src="../../_media/neural-codec-language-models-are-zero-shot-text-to-speech-synthesizers-ar.png"&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Partial of Figure 3 from Neural Codec Language Models are Zero-Shot Text to Speech Synthesisers&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;2. A &lt;em&gt;non-autoregressive&lt;/em&gt; Transformer that predicts the subsequent codes from the first code.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Diagram of non-autoregression token modelling" src="../../_media/neural-codec-language-models-are-zero-shot-text-to-speech-synthesizers-nar.png"&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Partial of Figure 3 from Neural Codec Language Models are Zero-Shot Text to Speech Synthesisers&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Proposing VALL-E as a &lt;a href="hierarchical-model.html"&gt;Hierarchical Model&lt;/a&gt; provides a good trade-off between flexibility with the length of returned speech and inference performance, as the NAR can operate at &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;O&lt;/mi&gt;&lt;mo stretchy="false"&gt;(&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;mo stretchy="false"&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;O(1)&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1em;vertical-align:-0.25em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.02778em;"&gt;O&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord"&gt;1&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; instead of &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;O&lt;/mi&gt;&lt;mo stretchy="false"&gt;(&lt;/mo&gt;&lt;mi&gt;T&lt;/mi&gt;&lt;mo stretchy="false"&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;O(T)&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1em;vertical-align:-0.25em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.02778em;"&gt;O&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.13889em;"&gt;T&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; where &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;T&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;T&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.68333em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.13889em;"&gt;T&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; is the sequence length of the tokenised audio.&lt;/p&gt;
&lt;h2 id="comparison-to-previous-work"&gt;Comparison to Previous Work&lt;/h2&gt;
&lt;p&gt;In the past, a &lt;a href="mel-spectrogram.html"&gt;Mel Spectrogram&lt;/a&gt; has been commonly used as the intermediary representation for TTS, relying on a Vocoder (like &lt;a href="https://arxiv.org/abs/2010.05646"&gt;HiFi-GAN&lt;/a&gt;) to the decoder. There have also been some successful end-to-end TTS approaches. However, all these problems are typically formulated as continuous signal regression problems, which so far have needed high-quality, clean audio to train on - not data scraped from the internet. Without the larger datasets, reliable zero-shot TTS on unseen speakers is very difficult. The capacity for &lt;em&gt;in-context&lt;/em&gt; learning enjoyed by GPT is a powerful capability and is now available for &lt;a href="speech-synthesis.html"&gt;Speech Synthesis&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Table 1 summarises the difference between VALL-E and previous TTS systems.&lt;/p&gt;
&lt;table class="table-border"&gt;
    &lt;tr&gt;
        &lt;th&gt;&lt;/th&gt;
        &lt;th&gt;Current Systems&lt;/th&gt;
        &lt;th&gt;VALL-E&lt;/th&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td&gt;&lt;strong&gt;Intermediate representation&lt;/strong&gt;&lt;/td&gt;
        &lt;td&gt;Mel Spectrogram&lt;/td&gt;
        &lt;td&gt;Audio Codec Code&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td&gt;&lt;strong&gt;Objective function&lt;/strong&gt;&lt;/td&gt;
        &lt;td&gt;Continuous Signal Regression&lt;/td&gt;
        &lt;td&gt;Language Model&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td&gt;&lt;strong&gt;Training Data&lt;/strong&gt;&lt;/td&gt;
        &lt;td&gt;&amp;le; 600 hours&lt;/td&gt;
        &lt;td&gt;60k hours&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td&gt;&lt;strong&gt;In-Context Learning&lt;/strong&gt;&lt;/td&gt;
        &lt;td&gt;&amp;#10008;&lt;/td&gt; &lt;!-- Represents a cross mark --&gt;
        &lt;td&gt;&amp;#10004;&lt;/td&gt; &lt;!-- Represents a check mark --&gt;
    &lt;/tr&gt;
&lt;/table&gt;

&lt;p&gt;&lt;em&gt;Table 1 from Neural Codec Language Models are Zero-Shot Text to Speech Synthesisers&lt;/em&gt;&lt;/p&gt;
&lt;h2 id="architecture"&gt;Architecture&lt;/h2&gt;
&lt;h3 id="ar-nar-models"&gt;AR / NAR Models&lt;/h3&gt;
&lt;p&gt;Both the AR model and the NAR model have the same &lt;a href="transformer.html"&gt;Transformer&lt;/a&gt; architecture, which contains:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;12 layers&lt;/li&gt;
&lt;li&gt;16 attention heads&lt;/li&gt;
&lt;li&gt;an embedding dimension of 1024&lt;/li&gt;
&lt;li&gt;a feed-forward layer dimension of 4096&lt;/li&gt;
&lt;li&gt;dropout of 0.1.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Both the AR and NAR models received the phoneme sequence as a prompt.&lt;/p&gt;
&lt;h3 id="encodec"&gt;Encodec&lt;/h3&gt;
&lt;p&gt;They use eight codebooks, each with 1024 code dimensionality. The encoder produces an embedding sequence at 75 Hz for input waveforms at 24 kHz. So, For a 10-second audio waveform, the discrete representation would be &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mn&gt;750&lt;/mn&gt;&lt;mo&gt;×&lt;/mo&gt;&lt;mn&gt;8&lt;/mn&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;750 \times 8&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.72777em;vertical-align:-0.08333em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;7&lt;/span&gt;&lt;span class="mord"&gt;5&lt;/span&gt;&lt;span class="mord"&gt;0&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;×&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.64444em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;8&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; ( &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mn&gt;750&lt;/mn&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mfrac&gt;&lt;mrow&gt;&lt;mn&gt;24000&lt;/mn&gt;&lt;mo&gt;×&lt;/mo&gt;&lt;mn&gt;10&lt;/mn&gt;&lt;/mrow&gt;&lt;mn&gt;320&lt;/mn&gt;&lt;/mfrac&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;750 = \frac{24000 \times 10}{320}&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.64444em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;7&lt;/span&gt;&lt;span class="mord"&gt;5&lt;/span&gt;&lt;span class="mord"&gt;0&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1.190108em;vertical-align:-0.345em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mopen nulldelimiter"&gt;&lt;/span&gt;&lt;span class="mfrac"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.845108em;"&gt;&lt;span style="top:-2.6550000000000002em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mtight"&gt;3&lt;/span&gt;&lt;span class="mord mtight"&gt;2&lt;/span&gt;&lt;span class="mord mtight"&gt;0&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-3.23em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="frac-line" style="border-bottom-width:0.04em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-3.394em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mtight"&gt;2&lt;/span&gt;&lt;span class="mord mtight"&gt;4&lt;/span&gt;&lt;span class="mord mtight"&gt;0&lt;/span&gt;&lt;span class="mord mtight"&gt;0&lt;/span&gt;&lt;span class="mord mtight"&gt;0&lt;/span&gt;&lt;span class="mbin mtight"&gt;×&lt;/span&gt;&lt;span class="mord mtight"&gt;1&lt;/span&gt;&lt;span class="mord mtight"&gt;0&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.345em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose nulldelimiter"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; ).&lt;/p&gt;
&lt;p&gt;&lt;img alt="Encodec Diagram" src="../../_media/neural-codec-language-models-are-zero-shot-text-to-speech-synthesizers-fig-2.png"&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Figure 2 from Neural Codec Language Models are Zero-Shot Text to Speech Synthesizers&lt;/em&gt;&lt;/p&gt;
&lt;h3 id="attention"&gt;Attention&lt;/h3&gt;
&lt;p&gt;The AR model can attend to all previous tokens in the sequence, whereas the NAR model can attend to all previously predicted tokens.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Attention used by AR and NAR models in VALL-E" src="../../_media/neural-codec-language-models-are-zero-shot-text-to-speech-synthesizers-fig-3-attention.png"&gt;&lt;/p&gt;
&lt;h3 id="embeddings-and-decoding"&gt;Embeddings and decoding&lt;/h3&gt;
&lt;p&gt;They use a sinuous position embedding for the prompt and input tokens and share the output projection layer parameters with acoustic embedding parameters.&lt;/p&gt;
&lt;h3 id="decoding"&gt;Decoding&lt;/h3&gt;
&lt;p&gt;For the AR model, they found beam-search could lead the model to an infinite loop, so they used sampling-based decoding conditioned on the prompts. For the NAR model, they use greedy decoding to choose the token with the highest
probability.&lt;/p&gt;
&lt;h2 id="training-settings"&gt;Training Settings&lt;/h2&gt;
&lt;p&gt;
&lt;table class="table-border"&gt;
  &lt;tr&gt;
    &lt;td&gt;&lt;strong&gt;GPU&lt;/strong&gt;&lt;/td&gt;
    &lt;td&gt;16 NVIDIA TESLA V100 32GB GPUs&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;&lt;strong&gt;Batch size&lt;/strong&gt;&lt;/td&gt;
    &lt;td&gt;6k acoustic tokens per GPU&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;&lt;strong&gt;Steps&lt;/strong&gt;&lt;/td&gt;
    &lt;td&gt;800k&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;&lt;strong&gt;Optimiser&lt;/strong&gt;&lt;/td&gt;
    &lt;td&gt;AdamW Optimizer&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;&lt;strong&gt;Learning rate&lt;/strong&gt;&lt;/td&gt;
    &lt;td&gt;Warm up for the first 32k, peak at 5 x 10-4, then linear decay&lt;/td&gt;
  &lt;/tr&gt;
&lt;tr&gt;
    &lt;td&gt;&lt;strong&gt;Data preprocessing&lt;/strong&gt;&lt;/td&gt;
    &lt;td&gt;Randomly crop the waveform to a random length between 10 secs and 20 secs.&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/p&gt;

&lt;h2 id="evaluation"&gt;Evaluation&lt;/h2&gt;
&lt;h3 id="baseline-models"&gt;Baseline Models&lt;/h3&gt;
&lt;h4 id="tts"&gt;TTS&lt;/h4&gt;
&lt;p&gt;&lt;a href="https://github.com/Edresson/YourTTS"&gt;YourTTS&lt;/a&gt;,&lt;/p&gt;
&lt;p&gt;SOTA zero-shot TTS model trained on VCTK, LibriTTS, TS-Portuguese.&lt;/p&gt;
&lt;h4 id="speaker-to-speaker"&gt;Speaker to Speaker&lt;/h4&gt;
&lt;p&gt;&lt;a href="https://arxiv.org/abs/2102.01192"&gt;GSLM&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;GSLM HuBERT codes as input and reconstructs the waveform with the Tacotron2 model and the WaveGlow vocoder. HuBERT codes discard speaker identity, so it tends to achieve a poor speaker score.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://arxiv.org/abs/2209.03143"&gt;AudioLM&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;An audio-to-audio model that also uses RVQ codes. They use the word error score reported in their paper, which a Conformer Transducer model obtained.&lt;/p&gt;
&lt;h3 id="datasets"&gt;Datasets&lt;/h3&gt;
&lt;p&gt;&lt;a href="https://www.openslr.org/12"&gt;LibriSpeech&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Since there's no overlap between LibriLight and LibriSpeech, they can use it for Zero-Shot TTS evaluation.&lt;/p&gt;
&lt;p&gt;They use the samples from LibriSpeech test-clean with lengths between 4 and 10 seconds, resulting in a 2.2-hour subset.&lt;/p&gt;
&lt;p&gt;For each sample synthesis, they randomly chose another utterance of the same speaker and cropped a 3-second speech segment as the enrolled speech, giving them 40 test cases. Each experiment runs three times, and the average score is reported.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://paperswithcode.com/dataset/vctk"&gt;VCTK&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;VCTK consists of 108 speakers, none in the training set. VCTK is more challenging than LibriSpeech as it contains speakers with various accents.&lt;/p&gt;
&lt;p&gt;YourTTS has seen 97 speakers in VCTK as training. So, they evaluate YourTTS performance on the full 107 speakers and 11 unseen speakers, respectively.&lt;/p&gt;
&lt;p&gt;For each speaker, they randomly selected three utterances of 3s/5s/10s as the prompts and the text of another utterance as the text prompt.&lt;/p&gt;
&lt;h3 id="metrics"&gt;Metrics&lt;/h3&gt;
&lt;h4 id="automated"&gt;Automated&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;Speaker Similarity&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;They use a SOTA speaker verification model, WaLM-TDNN, to check the speaker similarity between audio prompt and synthesised speech.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Word Error Rate&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;They run speech recognition on the generated audio and calculate the &lt;a href="word-error-rate.html"&gt;Word Error Rate (WER)&lt;/a&gt; concerning the original transcriptions (using the HuBERT-Large model fine-tuned on LibriSpeech 960h as the ASR model)&lt;/p&gt;
&lt;h4 id="human-evaluation"&gt;Human evaluation&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;CMOS&lt;/strong&gt; is an indicator of speech naturalness.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;SMOS&lt;/strong&gt; measures where speech is similar to the original speaker's voice.&lt;/p&gt;
&lt;p&gt;They also use crowd-sourcing to calculate the comparative mean option score (CMOS) and similarity mean option score (SMOS) by inviting 12 and 6 native speakers as CMOS and SMOS contributors.&lt;/p&gt;
&lt;p&gt;The scale of SMOS is from 1 to 5 with 0.5-point increments.&lt;/p&gt;
&lt;p&gt;CMOS ranges from -3 to 3 with intervals of 1.&lt;/p&gt;
&lt;h3 id="results"&gt;Results&lt;/h3&gt;
&lt;p&gt;Table 2 shows the objective evaluation results on the automatic metrics. VALL-E does much better than YourTTS at speaker similarity and robustness. For GSLM, since the HuBERT codes discard the speaker identity, it achieves a poor speaker score. There is no open-source implementation of AudioLM, so they use the results from the paper.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Automatic Metric results (Table 2)&lt;/strong&gt;&lt;/p&gt;
&lt;table class="table-border"&gt;
  &lt;tr&gt;
    &lt;th&gt;Model&lt;/th&gt;
    &lt;th&gt;Word Error Rate&lt;/th&gt;
    &lt;th&gt;Speaker Identity&lt;/th&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;GroundTruth&lt;/td&gt;
    &lt;td&gt;2.2&lt;/td&gt;
    &lt;td&gt;0.754&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;GSLM&lt;/td&gt;
    &lt;td&gt;12.4&lt;/td&gt;
    &lt;td&gt;0.126&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;AudioLM (model is not open source)&lt;/td&gt;
    &lt;td&gt;6&lt;/td&gt;
    &lt;td&gt;&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;YourTTS&lt;/td&gt;
    &lt;td&gt;7.7&lt;/td&gt;
    &lt;td&gt;0.337&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;VALL-E&lt;/td&gt;
    &lt;td&gt;5.9&lt;/td&gt;
    &lt;td&gt;0.580&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;VALL-E continual&lt;/td&gt;
    &lt;td&gt;3.8&lt;/td&gt;
    &lt;td&gt;0.508&lt;/td&gt;
  &lt;/tr&gt;
&lt;/table&gt;

&lt;hr&gt;
&lt;p&gt;VALL-E is very close to ground truth regarding SMOS, indicating the synthesised speech is similar to the given unseen
speaker in testing. It significantly outperforms the baseline with +0.93 SMOS, demonstrating the effectiveness of VALL-E in zero-shot scenarios. Regarding naturalness, VALL-E beats the baseline with +0.12 CMOS, indicating the proposed method could synthesise more natural and realistic speech against baselines.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Human evaluations (Table 3)&lt;/strong&gt;&lt;/p&gt;
&lt;table class="table-border"&gt;
  &lt;tr&gt;
    &lt;th&gt;Model&lt;/th&gt;
    &lt;th&gt;SMOS&lt;/th&gt;
    &lt;th&gt;CMOS (vs VALL-E)&lt;/th&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;YourTTS&lt;/td&gt;
    &lt;td&gt;3.45&lt;/td&gt;
    &lt;td&gt;-0.12&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;VALL-E&lt;/td&gt;
    &lt;td&gt;4.38&lt;/td&gt;
    &lt;td&gt;0.0&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;GroundTruth&lt;/td&gt;
    &lt;td&gt;4.5&lt;/td&gt;
    &lt;td&gt;+0.17&lt;/td&gt;
  &lt;/tr&gt;
&lt;/table&gt;

&lt;hr&gt;
&lt;p&gt;Table 6 shows the results for the VCTK dataset. VALL-E outperforms the baseline even though it has seen 97 speakers in training. The performance gap becomes larger compared to the baseline in a fair setting (11 speakers).&lt;/p&gt;
&lt;p&gt;**Table 6: Automatic evaluation of speaker similarity with 108 speakers on VCTK. **&lt;/p&gt;
&lt;p&gt;&lt;em&gt;97 speakers in VCTK as training&lt;/em&gt;&lt;/p&gt;
&lt;table class="table-border"&gt;
  &lt;tr&gt;
    &lt;th&gt;&lt;/th&gt;
    &lt;th&gt;3s prompt&lt;/th&gt;
    &lt;th&gt;5s prompt&lt;/th&gt;
    &lt;th&gt;10s prompt&lt;/th&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;YourTTS&lt;/td&gt;
    &lt;td&gt;0.357&lt;/td&gt;
    &lt;td&gt;0.337&lt;/td&gt;
    &lt;td&gt;0.394&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;VALL-E&lt;/td&gt;
    &lt;td&gt;0.382&lt;/td&gt;
    &lt;td&gt;0.423&lt;/td&gt;
    &lt;td&gt;0.484&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;GroundTruth&lt;/td&gt;
    &lt;td&gt;0.546&lt;/td&gt;
    &lt;td&gt;0.591&lt;/td&gt;
    &lt;td&gt;0.620&lt;/td&gt;
  &lt;/tr&gt;
&lt;/table&gt;

&lt;p&gt;&lt;em&gt;11 unseen speakers&lt;/em&gt;&lt;/p&gt;
&lt;table class="table-border"&gt;
  &lt;tr&gt;
    &lt;th&gt;&lt;/th&gt;
    &lt;th&gt;3s prompt&lt;/th&gt;
    &lt;th&gt;5s prompt&lt;/th&gt;
    &lt;th&gt;10s prompt&lt;/th&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;YourTTS&lt;/td&gt;
    &lt;td&gt;0.331&lt;/td&gt;
    &lt;td&gt;0.337&lt;/td&gt;
    &lt;td&gt;0.334&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;VALL-E&lt;/td&gt;
    &lt;td&gt;0.389&lt;/td&gt;
    &lt;td&gt;0.380&lt;/td&gt;
    &lt;td&gt;0.414&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;GroundTruth&lt;/td&gt;
    &lt;td&gt;0.528&lt;/td&gt;
    &lt;td&gt;0.556&lt;/td&gt;
    &lt;td&gt;0.586&lt;/td&gt;
  &lt;/tr&gt;
&lt;/table&gt;

&lt;hr&gt;
&lt;p&gt;Table 7 shows a comparison of their method against baseline and ground truth. VALL-E has better speaker similarity than the baseline, even if the baseline has seen some speakers in training. The side-by-side CMOS evaluation shows that VALL-E is +0.23 over YourTTS, indicating a significantly better performance speaking of naturalness. VALL-E also achieves +0.04 CMOS over ground truth, demonstrating no statistically significant difference from human recordings.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Table 7: Human evaluation with 60 speakers on VCTK with a 3-second enrolled recording for each.&lt;/strong&gt;&lt;/p&gt;
&lt;table class="table-border"&gt;
  &lt;tr&gt;
    &lt;th&gt;&lt;/th&gt;
    &lt;th&gt;SMOS&lt;/th&gt;
    &lt;th&gt;CMOS (v.s. VALL-E)&lt;/th&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;YourTTS&lt;/td&gt;
    &lt;td&gt;3.70 (+0.09)&lt;/td&gt;
    &lt;td&gt;0.23&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;VALL-E&lt;/td&gt;
    &lt;td&gt;3.81 (+0.09)&lt;/td&gt;
    &lt;td&gt;0.00&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;GroundTruth&lt;/td&gt;
    &lt;td&gt;4.29 (+0.09)&lt;/td&gt;
    &lt;td&gt;-0.04&lt;/td&gt;
  &lt;/tr&gt;
&lt;/table&gt;

&lt;h3 id="ablation"&gt;Ablation&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;NAR Ablation&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;They train three NAR models with different numbers of prompts:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;NAR-no prompt&lt;/strong&gt; - trained without any prompts.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;NAR-phn prompt&lt;/strong&gt; - trained with only phoneme sequence as prompt&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;NAR-2 prompts&lt;/strong&gt; - uses phoneme prompt and acoustic token prompt as conditions&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;They use ground-truth first-level acoustic tokens as the model input and compute the WER and speaker similarity scores.&lt;/p&gt;
&lt;p&gt;Results:
The model, without any prompts, performs poorly on both ASR and speaker similarity evaluations, even though the acoustic input token is ground truth.
When adding the phoneme prompt, the WER is reduced by a large margin from 19.6 to 3.0.
It shows the phoneme prompt mainly contributes to the content of the generation.&lt;/p&gt;
&lt;p&gt;In the NAR-2 prompts, the model can learn speaker information from the acoustic token prompt and thus improve the speaker evaluation quality.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Ablation study of the NAR model. The inputs of the NAR models are the ground truth for the ablation study. (Table 4)&lt;/strong&gt;&lt;/p&gt;
&lt;table class="table-border"&gt;
  &lt;tr&gt;
    &lt;th&gt;&lt;/th&gt;
    &lt;th&gt;NAR-no prompt&lt;/th&gt;
    &lt;th&gt;NAR-phn prompt&lt;/th&gt;
    &lt;th&gt;NAR-2 prompts&lt;/th&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;WER&lt;/td&gt;
    &lt;td&gt;19.6&lt;/td&gt;
    &lt;td&gt;3.0&lt;/td&gt;
    &lt;td&gt;2.8&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;SPK&lt;/td&gt;
    &lt;td&gt;0.518&lt;/td&gt;
    &lt;td&gt;0.541&lt;/td&gt;
    &lt;td&gt;0.732&lt;/td&gt;
  &lt;/tr&gt;
&lt;/table&gt;

&lt;p&gt;&lt;strong&gt;AR Ablation&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;They always use the NAR-2 prompts setting in these experiments as the NAR model.&lt;/p&gt;
&lt;p&gt;They try removing the acoustic prompt (&lt;strong&gt;w/o acoustic prompt&lt;/strong&gt;). After that, it can only obtain a speaker similarity score of 0.236, showing the prompt is extremely crucial for speaker identity. Even if the NAR model could see the prompt, the prompt for the AR model also contributes a lot to speaker similarity.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Ablation study of the AR model (Table 5)&lt;/strong&gt;&lt;/p&gt;
&lt;table class="table-border"&gt;
  &lt;tr&gt;
    &lt;th&gt;&lt;/th&gt;
    &lt;th&gt;WER&lt;/th&gt;
    &lt;th&gt;SPK&lt;/th&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;VALL-E&lt;/td&gt;
    &lt;td&gt;5.9&lt;/td&gt;
    &lt;td&gt;0.585&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;w/o acoustic prompt&lt;/td&gt;
    &lt;td&gt;5.9&lt;/td&gt;
    &lt;td&gt;0.236&lt;/td&gt;
  &lt;/tr&gt;
&lt;/table&gt;

&lt;h2 id="qualitative-analysis"&gt;Qualitative Analysis&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Diversity&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Previous TTS systems had a strong one-to-one mapping between input text and output waveform because mel spectrogram generation was based on reconstruction for each step without randomness. On the other hand, VALL-E uses the sampling-based method to generate discrete tokens so that the output can be diverse for the same input text.&lt;/p&gt;
&lt;p&gt;Given a sentence and an enrolled recording, they run the inference process twice and visualise its waveform.&lt;/p&gt;
&lt;p&gt;They observed the two samples having different lengths and phrase durations, where the first has a faster speech rate.&lt;/p&gt;
&lt;p&gt;They observe that the accents of the two samples are different. The second output emphasises the word "must" with a larger amplitude, whereas the first does not.&lt;/p&gt;
&lt;p&gt;The diversity may be useful for downstream scenarios, particularly generating pseudo-data for speech recognition.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Diversity analysis" src="../../_media/neural-codec-language-models-are-zero-shot-text-to-speech-synthesizers-diversity-analysis.png"&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Partial Figure 4. from Neural Codec Language Models are Zero-Shot Text to Speech Synthesisers&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Acoustic environment maintenance&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;They find acoustic environment consistency between the acoustic prompt and the generation. VALL-E could also synthesise speech with reverberation when the acoustic prompt reverberates, whereas the baseline outputs clean speech.&lt;/p&gt;
&lt;p&gt;They explain that VALL-E is trained on a large-scale dataset consisting of more acoustic conditions than the data used by the baseline.&lt;/p&gt;
&lt;p&gt;VALL-E could learn acoustic consistency instead of a clean environment only during training.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Speaker's emotion maintenance&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Emotional TTS is a classic subtopic of speech synthesis, synthesising speech with a required emotion.&lt;/p&gt;
&lt;p&gt;Traditional methods always train a model on a supervised emotional TTS dataset, where the speech corresponds to a transcription and an emotion label.&lt;/p&gt;
&lt;p&gt;They find that VALL-E can preserve the emotion in the prompt at a zero-shot setting.&lt;/p&gt;
&lt;p&gt;They select acoustic prompts from EmoV-DB, a dataset containing speech with five emotions; VALL-E can keep the same emotion of the prompt in speech synthesis, even if the model is not fine-tuned on an emotional TTS dataset.&lt;/p&gt;
&lt;h2 id="future-work"&gt;Future Work&lt;/h2&gt;
&lt;p&gt;The authors note four future directions for this research.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;1. Improve synthesis robustness&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The pronunciation isn't always clear, and occasional words are duplicated. They think it's mainly due to the phoneme-to-acoustic being an autoregression model, where disordered attention alignments exist with no constraints. They could modify the attention mechanism or apply more non-autoregression models to solve.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2. Data coverage&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Due to dataset limitations, VALL-E does not work for everyone's voice, especially those with accents. More data scale-up is likely the answer to improve this.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;3. Model structure&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;One possible direction is to predict codes with a large universal model. Using NAR models to speed up inference is another.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;4. Risk mitigation&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Since a zero-shot TTS model like this carries a large potential for misuse, they want to consider building a model to detect where AI-synthesised audio.&lt;/p&gt;</content><category term="reference"/><category term="MachineLearning"/><category term="AudioEngineering"/><category term="SpeechSynthesis"/></entry><entry><title>Software Development is a Trade</title><link href="http://localhost:8000/software-development-is-a-trade.html" rel="alternate"/><published>2024-01-27T00:00:00+10:00</published><updated>2024-01-27T00:00:00+10:00</updated><author><name>Lex Toumbourou</name></author><id>tag:localhost,2024-01-27:/software-development-is-a-trade.html</id><summary type="html">&lt;p&gt;we should educate developers accordingly&lt;/p&gt;</summary><content type="html">&lt;p&gt;Despite their occasional ridicule within the industry, the software boot camp model works - the top boot camps tend to have a higher success rate at landing people in jobs than computer science departments at top universities &lt;sup id="fnref:1"&gt;&lt;a class="footnote-ref" href="#fn:1"&gt;1&lt;/a&gt;&lt;/sup&gt; &lt;sup id="fnref:2"&gt;&lt;a class="footnote-ref" href="#fn:2"&gt;2&lt;/a&gt;&lt;/sup&gt;.&lt;/p&gt;
&lt;p&gt;Anecdotally, I've hired many devs who came straight out of boot camps, and they all rocked and are in the industry to this day - most of them have become seniors.&lt;/p&gt;
&lt;p&gt;From day 1, they came to work knowing Git, how to use their IDE (shortcuts, etc.), the basics of typical Agile-like practices and had practical experience building web applications.&lt;/p&gt;
&lt;p&gt;Yes, a &lt;a href="survivorship-bias.html"&gt;Survivorship Bias&lt;/a&gt; is at play here - not everyone "made it". However, their fellow students who found that software wasn't for them only took 3-6 months of their lives learning it instead of 3-10 years to get a degree.&lt;/p&gt;
&lt;p&gt;On the flip side, for a typical Computer Science degree, the engineering content is often unaligned with the expectations of a junior developer &lt;sup id="fnref:3"&gt;&lt;a class="footnote-ref" href="#fn:3"&gt;3&lt;/a&gt;&lt;/sup&gt;. In the field, you're going to spend a lot less time concerned with the complexity of search algorithms or building abstract syntax trees, and a lot more time creating CI pipelines, dealing with merge conflicts, and investigating complex customer issues, which, in my experience, are usually a tiny part of one engineering module, if covered at all, in a CompSci degree.&lt;/p&gt;
&lt;p&gt;The fundamentals are useful and typically must be in place to progress into senior roles, and they can't be taught in depth at a short boot camp. However, I argue that &lt;strong&gt;fundamentals are much more efficiently learned alongside a career as a practising software engineer&lt;/strong&gt;. Instead of learning them all up front, they'd be much more effectively taught after an engineer has some practice building products with software. For example, learning about worst-case complexity and Big O notation is much easier when you have already blown up prod, thanks to a nested loop in your code.&lt;/p&gt;
&lt;p&gt;And that's much closer to how an apprenticeship works: some study, followed by lots of hands-on experience, followed by more study, and so on until you're a professional.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Like a trade, writing software can only be mastered by practising it - a lot, and we should educate developers accordingly.&lt;/strong&gt;&lt;/p&gt;
&lt;div class="footnote"&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id="fn:1"&gt;
&lt;p&gt;Burning Glass Technologies via &lt;a href="https://www.linkedin.com/pulse/new-data-shows-which-bootcamps-have-higher-tech-employment-"&gt;this article by Optimal&lt;/a&gt; reports on boot camp vs college, job placement success rate. The data is from 2021 and needs updating in 2022-2023 conditions.&amp;#160;&lt;a class="footnote-backref" href="#fnref:1" title="Jump back to footnote 1 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:2"&gt;
&lt;p&gt;Council on Integrity in Results Reporting (CIRR) via &lt;a href="https://www.forbes.com/advisor/education/bootcamps-job-guarantee/#:~:text=Yes%2C%20it's%20realistic%20to%20get,placement%20and%20career%20outcomes%20data."&gt;a Forbes article&lt;/a&gt; reports ~71% success rate of tech placements from boot camps.&amp;#160;&lt;a class="footnote-backref" href="#fnref:2" title="Jump back to footnote 2 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:3"&gt;
&lt;p&gt;Garousi, V., Giray, G., Tüzün, E., Catal, C., &amp;amp; Felderer, M. (2020). &lt;em&gt;Closing the gap between software engineering education and industrial needs&lt;/em&gt;. &lt;em&gt;IEEE Software, 37&lt;/em&gt;(2), 68–77. https://doi.org/10.1109/MS.2018.2880823&amp;#160;&lt;a class="footnote-backref" href="#fnref:3" title="Jump back to footnote 3 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</content><category term="permanent"/><category term="SoftwareEngineering"/></entry><entry><title>Convex Hull</title><link href="http://localhost:8000/convex-hull.html" rel="alternate"/><published>2024-01-26T00:00:00+10:00</published><updated>2024-01-26T00:00:00+10:00</updated><author><name>Lex Toumbourou</name></author><id>tag:localhost,2024-01-26:/convex-hull.html</id><summary type="html">&lt;p&gt;the smallest polygon that contains a set of points&lt;/p&gt;</summary><content type="html">&lt;p&gt;The &lt;strong&gt;Convex Hull&lt;/strong&gt; is the smallest polygon that contains a set of points.&lt;/p&gt;
&lt;p&gt;Think of some nails poking out of a board. If you place a rubber band around all nails, the polygon shape the rubber band makes is the convex hull.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Example of a convex hull" src="../_media/convex-hull.png"&gt;&lt;/p&gt;
&lt;p&gt;One real-world application in game programming is &lt;strong&gt;Collision Detection&lt;/strong&gt;. Since computing collisions can be expensive, a convex hull is calculated around the 3d model of an object to provide an approximate collision region, reducing the number of computations required.&lt;/p&gt;
&lt;p&gt;This example from the Roblox docs shows the collision region for a 3d model with the &lt;code&gt;Hull&lt;/code&gt; collision option.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Original Mesh&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Hull Collision Region&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;img alt="A 3d mesh" src="../_media/3d-model-no-hull.png"&gt;&lt;/td&gt;
&lt;td&gt;&lt;img alt="Convex Hull collision" src="../_media/3d-model-convex-hull.png"&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;em&gt;This example of a 3d model to its hull collision model comes from the &lt;a href="https://create.roblox.com/docs/workspace/collisions#mesh-and-solid-model-collisions"&gt;Roblox docs&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="recommended-reading"&gt;Recommended Reading&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://amzn.to/3HyDauB"&gt;Introduction to Algorithms, Third Edition&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="Intro to Algorithms cover" src="../_media/intro-to-algorithms-3rd.png"&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Chapter 1&lt;/strong&gt; has an introduction to Convex Hull. &lt;strong&gt;Chapter 33&lt;/strong&gt; details some algorithms for computing Convex Hulls&lt;/p&gt;</content><category term="permanent"/><category term="ComputerScience"/><category term="Algorithms"/></entry><entry><title>Insertion Sort</title><link href="http://localhost:8000/insertion-sort.html" rel="alternate"/><published>2024-01-25T00:00:00+10:00</published><updated>2024-01-25T00:00:00+10:00</updated><author><name>Lex Toumbourou</name></author><id>tag:localhost,2024-01-25:/insertion-sort.html</id><summary type="html">&lt;p&gt;a widely-known iterate sorting algorithm&lt;/p&gt;</summary><content type="html">&lt;p&gt;&lt;strong&gt;Insertion Sort&lt;/strong&gt; is one of the most widely known sorting &lt;a href="algorithm.html"&gt;Algorithm&lt;/a&gt;. The algorithm iteratively compares each element with its left neighbours, shifting them one position to the right if they are greater. It has an average and worst-case run time of &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;O&lt;/mi&gt;&lt;mo stretchy="false"&gt;(&lt;/mo&gt;&lt;msup&gt;&lt;mi&gt;n&lt;/mi&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;/msup&gt;&lt;mo stretchy="false"&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;O(n^2)&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1.064108em;vertical-align:-0.25em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.02778em;"&gt;O&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;n&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.8141079999999999em;"&gt;&lt;span style="top:-3.063em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;, so it is one of the slowest algorithms for large input sizes; however, if the list is mostly sorted, it can be one of the best-performing options.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Insertion sort animated gif from Wikimedia commons" src="../_media/Sorting_insertion_sort_anim.gif"&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Image via &lt;a href="https://commons.wikimedia.org/wiki/File:Sorting_insertion_sort_anim.gif"&gt;Wikimedia commons&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;iframe width="560" height="315" src="https://www.youtube.com/embed/Q1JdRUh1_98?si=7ZwTitcOrNLhU7wZ" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen&gt;&lt;/iframe&gt;
&lt;p&gt;&lt;br&gt;&lt;/p&gt;
&lt;h2 id="python-code"&gt;Python code&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;insertion_sort&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;j&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;

    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;)):&lt;/span&gt;
        &lt;span class="n"&gt;key&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
        &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;j&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
        &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
            &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
        &lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;
        &lt;span class="n"&gt;j&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;j&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2 id="time-complexity"&gt;Time Complexity&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Worst case run-time: &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;O&lt;/mi&gt;&lt;mo stretchy="false"&gt;(&lt;/mo&gt;&lt;msup&gt;&lt;mi&gt;n&lt;/mi&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;/msup&gt;&lt;mo stretchy="false"&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;O(n^2)&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1.064108em;vertical-align:-0.25em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.02778em;"&gt;O&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;n&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.8141079999999999em;"&gt;&lt;span style="top:-3.063em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;Avg run-time: &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;O&lt;/mi&gt;&lt;mo stretchy="false"&gt;(&lt;/mo&gt;&lt;msup&gt;&lt;mi&gt;n&lt;/mi&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;/msup&gt;&lt;mo stretchy="false"&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;O(n^2)&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1.064108em;vertical-align:-0.25em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.02778em;"&gt;O&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;n&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.8141079999999999em;"&gt;&lt;span style="top:-3.063em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;Best case run-time: &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;O&lt;/mi&gt;&lt;mo stretchy="false"&gt;(&lt;/mo&gt;&lt;mi&gt;n&lt;/mi&gt;&lt;mo stretchy="false"&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;O(n)&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1em;vertical-align:-0.25em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.02778em;"&gt;O&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord mathdefault"&gt;n&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; (when the array is already sorted)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="space-complexity"&gt;Space Complexity&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;O&lt;/mi&gt;&lt;mo stretchy="false"&gt;(&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;mo stretchy="false"&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;O(1)&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1em;vertical-align:-0.25em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.02778em;"&gt;O&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord"&gt;1&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; (in-place sorting algorithm)&lt;/li&gt;
&lt;/ul&gt;</content><category term="permanent"/><category term="SortingAlgorithm"/></entry><entry><title>Overfit First</title><link href="http://localhost:8000/overfit-first.html" rel="alternate"/><published>2024-01-21T00:00:00+10:00</published><updated>2024-01-21T00:00:00+10:00</updated><author><name>Lex Toumbourou</name></author><id>tag:localhost,2024-01-21:/overfit-first.html</id><summary type="html">&lt;p&gt;the first step to training a neural network successfully&lt;/p&gt;</summary><content type="html">&lt;p&gt;In a &lt;a href="https://twitter.com/karpathy/status/1013244313327681536?lang=en"&gt;Tweet by Karpathy from 2019&lt;/a&gt;, he describes his #1 neural network training mistake: &lt;em&gt;"You didn't try to overfit a single batch first"&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Jeremy Howard shares a similar sentiment in his &lt;a href="https://www.youtube.com/watch?v=4u8FxNEDUeg&amp;amp;t=1267s"&gt;Three Steps to Training a Good Model&lt;/a&gt; from the same year, where he lists the &lt;em&gt;Overfit&lt;/em&gt; as the #1 step:&lt;/p&gt;
&lt;p&gt;&lt;img alt="Three Steps to Training a Good Model by Jeremy Howard" src="../_media/overfit-first-3-steps.png"&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;A slide from &lt;a href="https://www.youtube.com/watch?v=4u8FxNEDUeg&amp;amp;t=1267s0"&gt;fastai - Lesson 8 (2019) - Deep Learning from the Foundations&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;In my experience, failing to check that the model can overfit to a small amount of data is one of the surest ways to waste time in machine learning. If the model cannot learn to perform the task perfectly on a small set of in-domain data, then what hope do you have generalising with a larger dataset?&lt;/p&gt;
&lt;p&gt;Also, by starting with the overfitting, you allow the data collection and model construction to happen in parallel, which is much closer to the &lt;a href="iterative-development.html"&gt;Iterative Development&lt;/a&gt; goals of the Agile software methodology. Instead of spending time collecting data upfront, it can be done alongside the model development, allowing for parallel progress streams throughout the project. It also means each step can inform each other: model results can be used to assess the data most pertinent for modelling the problem, and available data can tell what model architectures make the most sense for the project.&lt;/p&gt;
&lt;p&gt;Always start a neural network training endeavour by overfitting on a small amount of data first.&lt;/p&gt;</content><category term="permanent"/><category term="MachineLearning"/><category term="SoftwareEngineering"/></entry><entry><title>Residual Vector Quantisation</title><link href="http://localhost:8000/residual-vector-quantisation.html" rel="alternate"/><published>2024-01-13T00:00:00+10:00</published><updated>2024-01-13T00:00:00+10:00</updated><author><name>Lex Toumbourou</name></author><id>tag:localhost,2024-01-13:/residual-vector-quantisation.html</id><summary type="html">&lt;p&gt;A tokeniser for audio&lt;/p&gt;</summary><content type="html">&lt;p&gt;&lt;strong&gt;Residual Vector Quantisation (RVQ)&lt;/strong&gt; is a technique for encoding audio into discrete tokens called &lt;em&gt;codes&lt;/em&gt;. It's like a tokeniser for audio. Not only does that allow us to compress audio into absurdly small sizes - up to a 90x compression rate, but we can also use the tokens to model audio using the same architectures that work so well for text, like Transformers. Now we can build language models for audio, speech or music, and that's precisely what recent models like Google's &lt;a href="https://google-research.github.io/seanet/audiolm/examples/"&gt;AudioLM&lt;/a&gt;, Microsoft's &lt;a href="vall-e.html"&gt;VALL-E&lt;/a&gt; and Meta's &lt;a href="https://audiocraft.metademolab.com/musicgen.html"&gt;MusicGen&lt;/a&gt; are.&lt;/p&gt;
&lt;p&gt;RVQ was first applied to audio in the &lt;a href="https://blog.research.google/2021/08/soundstream-end-to-end-neural-audio.html"&gt;Soundstream&lt;/a&gt; paper by Google Researchers and has since been used in popular neural audio compression architectures like &lt;a href="https://github.com/facebookresearch/encodec"&gt;Encodec&lt;/a&gt; and &lt;a href="https://github.com/descriptinc/descript-audio-codec"&gt;DAC&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;To understand RVQ, let's start by ignoring the R part of RVQ to focus on &lt;a href="vector-quantisation.html"&gt;Vector Quantisation&lt;/a&gt; (VQ).&lt;/p&gt;
&lt;h2 id="vector-quantisation"&gt;Vector Quantisation&lt;/h2&gt;
&lt;p&gt;Quantisation is the process of converting continuous infinite values into discrete finite values.&lt;/p&gt;
&lt;p&gt;In VQ, we encode a signal into a series of &lt;a href="vector.html"&gt;Vector&lt;/a&gt;, then query each vector to find the closest neighbour in a lookup table called a &lt;strong&gt;codebook&lt;/strong&gt;. Now, we can represent an entire chunk or &lt;em&gt;"frame"&lt;/em&gt; of a signal with a single &lt;strong&gt;code&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Vector Quantisation" src="../_media/vq.png"&gt;&lt;/p&gt;
&lt;p&gt;The codebook table is nothing more than an embedding table, where the table size is the codebook size, and the vector size is the codebook dimensions: &lt;code&gt;codebook = nn.Embedding(codebook_size, codebook_dim)&lt;/code&gt;. Like an embedding table, the weights are learned alongside the rest of the network during training.&lt;/p&gt;
&lt;p&gt;Vector quantisation comes originally from &lt;a href="https://en.wikipedia.org/wiki/Vector_quantization"&gt;signal processing&lt;/a&gt; and has been exploited throughout image modelling architectures like &lt;a href="https://arxiv.org/abs/1711.00937"&gt;VQ-VAE&lt;/a&gt; and &lt;a href="https://compvis.github.io/taming-transformers/"&gt;VQGAN&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="vector-quantisation-for-audio"&gt;Vector Quantisation for Audio&lt;/h2&gt;
&lt;p&gt;The direct VQ approach to encoding audio might look like this:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Audio Input&lt;/strong&gt;: an audio signal is represented as a multidimensional array of numbers with a known &lt;a href="sample-rate.html"&gt;Sample Rate&lt;/a&gt; (usually 44.1kHz). A mono signal has one channel; stereo and others can have more.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Encoder&lt;/strong&gt;: An encoder converts the signal into a sequence of vectors, one per "frame". The frame rate will be dependent on the model architecture and sample rate.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Quantise&lt;/strong&gt;: Find each vector's nearest neighbour in the codebook table. Again, the codebook table is learned alongside the encoder and decoder during training.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Output&lt;/strong&gt;: The index of the lookup vector in the matrix is the "code" and is all we need to reconstruct the audio, given a Decoder. Though not pictured in the diagram, the decoder is learned alongside the encoder and codebook table.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img alt="Vector Quantisation for Audio" src="../_media/vq-for-audio.png"&gt;&lt;/p&gt;
&lt;p&gt;Note that for upstream modelling tasks, we will want to use the vector representation of each code.&lt;/p&gt;
&lt;p&gt;One clear limitation of this approach is that representing audio with a single code per frame will never allow us to accurately reconstruct audio from these codes unless we have an infinitely large codebook.&lt;/p&gt;
&lt;p&gt;A clever technique to mitigate this is to take the difference between the encoded vector and the codebook vector for each encoded vector, which we call the &lt;strong&gt;Residual&lt;/strong&gt; vector. We can look up the residual vector in a subsequent codebook table. And we can repeat this process, each time adding a high capability for accurate reconstruction at the cost of compression size.&lt;/p&gt;
&lt;h2 id="residual-vq"&gt;Residual VQ&lt;/h2&gt;
&lt;p&gt;For Residual Vector Quantisation, we add these steps to the VQ operation:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Residual&lt;/strong&gt; - calculate a difference vector called the Residual for each codebook and input vector. Use that to look at a subsequent codebook.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Repeat&lt;/strong&gt; - repeat this for &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;N&lt;/mi&gt;&lt;mi&gt;q&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;Nq&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.8777699999999999em;vertical-align:-0.19444em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.10903em;"&gt;N&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.03588em;"&gt;q&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; codebook tables.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Output&lt;/strong&gt; - at the end, we will have &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;N&lt;/mi&gt;&lt;mi&gt;q&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;Nq&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.8777699999999999em;vertical-align:-0.19444em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.10903em;"&gt;N&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.03588em;"&gt;q&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; sequences of codes for modelling.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img alt="Residual Vector Quantisation" src="../_media/rvq.png"&gt;&lt;/p&gt;
&lt;p&gt;So now we have: &lt;span style="color: red;"&gt;&lt;strong&gt;Residual&lt;/strong&gt;&lt;/span&gt; &lt;span style="color: blue;"&gt;&lt;strong&gt;Vector Quantization&lt;/strong&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="training"&gt;Training&lt;/h2&gt;
&lt;p&gt;We can train a model like this by performing the encode and decode audio during training and calculating various forms of reconstruction loss, including a GAN-style discriminator. This example is the architecture described in the &lt;a href="soundstream.html"&gt;SoundStream&lt;/a&gt; paper:&lt;/p&gt;
&lt;p&gt;&lt;img alt="SoundStream architecture" src="../_media/residual-vector-quantization-fig-2%201.png"&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;This note was heavily inspired by &lt;a href="https://www.assemblyai.com/blog/what-is-residual-vector-quantization"&gt;What is Residual Vector Quanitzation&lt;/a&gt; by AssemblyAI.&lt;/p&gt;</content><category term="permanent"/><category term="MachineLearning"/><category term="AudioEngineering"/></entry><entry><title>Snake Activation Function</title><link href="http://localhost:8000/snake-activation-function.html" rel="alternate"/><published>2024-01-04T00:00:00+10:00</published><updated>2024-01-04T00:00:00+10:00</updated><author><name>Lex Toumbourou</name></author><id>tag:localhost,2024-01-04:/snake-activation-function.html</id><summary type="html">&lt;p&gt;An activation function for modelling data with periodicity (repeating patterns)&lt;/p&gt;</summary><content type="html">&lt;p&gt;Snake is a neural network activation function useful for modelling problems with a "periodic induction bias" - in other words, problems with regular, repeating patterns - for example, time-series data, audio signals and so on. It was described in the paper &lt;a href="https://arxiv.org/abs/2006.08195"&gt;Neural networks fail to learn periodic functions and how to fix it&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;In the DAC paper, &lt;a href="high-fidelity-audio-compression-with-improved-rvqgan.html"&gt;High-Fidelity Audio Compression with Improved RVQGAN&lt;/a&gt;, they replace &lt;a href="leaky-relu.html"&gt;Leaky ReLU&lt;/a&gt; with Snake and significantly improve the reconstructed audio quality.&lt;/p&gt;
&lt;p&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mtext&gt;snake&lt;/mtext&gt;&lt;mo stretchy="false"&gt;(&lt;/mo&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;mo stretchy="false"&gt;)&lt;/mo&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;mo&gt;+&lt;/mo&gt;&lt;mfrac&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;mi&gt;α&lt;/mi&gt;&lt;/mfrac&gt;&lt;msup&gt;&lt;mo&gt;&lt;mi&gt;sin&lt;/mi&gt;&lt;mo&gt;⁡&lt;/mo&gt;&lt;/mo&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;/msup&gt;&lt;mo stretchy="false"&gt;(&lt;/mo&gt;&lt;mi&gt;α&lt;/mi&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;mo stretchy="false"&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;\text{snake}(x) = x + \frac{1}{\alpha} \sin^2(\alpha x)&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1em;vertical-align:-0.25em;"&gt;&lt;/span&gt;&lt;span class="mord text"&gt;&lt;span class="mord"&gt;snake&lt;/span&gt;&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord mathdefault"&gt;x&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.66666em;vertical-align:-0.08333em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;x&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;+&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1.2168679999999998em;vertical-align:-0.345em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mopen nulldelimiter"&gt;&lt;/span&gt;&lt;span class="mfrac"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.845108em;"&gt;&lt;span style="top:-2.6550000000000002em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathdefault mtight" style="margin-right:0.0037em;"&gt;α&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-3.23em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="frac-line" style="border-bottom-width:0.04em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-3.394em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mtight"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.345em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose nulldelimiter"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mop"&gt;&lt;span class="mop"&gt;sin&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.871868em;"&gt;&lt;span style="top:-3.12076em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.0037em;"&gt;α&lt;/span&gt;&lt;span class="mord mathdefault"&gt;x&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;The &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;α&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;\alpha&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.43056em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.0037em;"&gt;α&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; is a parameter that controls the frequency of the periodic component of the signal.&lt;/p&gt;
&lt;p&gt;In code:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;numpy&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;as&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;np&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;snake_activation&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;alpha&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;alpha&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sin&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;alpha&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Plot:&lt;/p&gt;
&lt;p&gt;&lt;img alt="Snake Activation Function diagram" src="../_media/snake-activate-examples.png"&gt;&lt;/p&gt;</content><category term="permanent"/><category term="MachineLearning"/><category term="AudioEngineering"/></entry><entry><title>Leaky ReLU</title><link href="http://localhost:8000/leaky-relu.html" rel="alternate"/><published>2024-01-03T00:00:00+10:00</published><updated>2024-01-03T00:00:00+10:00</updated><author><name>Lex Toumbourou</name></author><id>tag:localhost,2024-01-03:/leaky-relu.html</id><summary type="html">&lt;p&gt;An activation function that outputs a small value for negative numbers&lt;/p&gt;</summary><content type="html">&lt;p&gt;&lt;strong&gt;Leaky ReLU&lt;/strong&gt; (Rectified Linear Unit) is a modification of the &lt;a href="relu.html"&gt;ReLU&lt;/a&gt; activation function, which outputs a small value for negative numbers instead of 0.&lt;/p&gt;
&lt;p&gt;The small value is generated by multiplying x with a hardcoded value like 0.1.&lt;/p&gt;
&lt;p&gt;&lt;span class="katex-display"&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;α&lt;/mi&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mn&gt;0.1&lt;/mn&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;
\alpha = 0.1
&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.43056em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.0037em;"&gt;α&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.64444em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;0&lt;/span&gt;&lt;span class="mord"&gt;.&lt;/span&gt;&lt;span class="mord"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span class="katex-display"&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;f&lt;/mi&gt;&lt;mo stretchy="false"&gt;(&lt;/mo&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;mo stretchy="false"&gt;)&lt;/mo&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mrow&gt;&lt;mo fence="true"&gt;{&lt;/mo&gt;&lt;mtable columnalign="left left" columnspacing="1em" rowspacing="0.3599999999999999em"&gt;&lt;mtr&gt;&lt;mtd&gt;&lt;mstyle displaystyle="false" scriptlevel="0"&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;mtd&gt;&lt;mstyle displaystyle="false" scriptlevel="0"&gt;&lt;mrow&gt;&lt;mtext&gt;if &lt;/mtext&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;mo&gt;&amp;gt;&lt;/mo&gt;&lt;mn&gt;0&lt;/mn&gt;&lt;/mrow&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;/mtr&gt;&lt;mtr&gt;&lt;mtd&gt;&lt;mstyle displaystyle="false" scriptlevel="0"&gt;&lt;mrow&gt;&lt;mi&gt;α&lt;/mi&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;/mrow&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;mtd&gt;&lt;mstyle displaystyle="false" scriptlevel="0"&gt;&lt;mrow&gt;&lt;mtext&gt;if &lt;/mtext&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;mo&gt;≤&lt;/mo&gt;&lt;mn&gt;0&lt;/mn&gt;&lt;/mrow&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;/mtr&gt;&lt;/mtable&gt;&lt;/mrow&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;
f(x) = \begin{cases} 
    x &amp;amp; \text{if } x &amp;gt; 0 \\
    \alpha x &amp;amp; \text{if } x \leq 0 
\end{cases}
&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1em;vertical-align:-0.25em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.10764em;"&gt;f&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord mathdefault"&gt;x&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:3.0000299999999998em;vertical-align:-1.25003em;"&gt;&lt;/span&gt;&lt;span class="minner"&gt;&lt;span class="mopen delimcenter" style="top:0em;"&gt;&lt;span class="delimsizing size4"&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mtable"&gt;&lt;span class="col-align-l"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:1.69em;"&gt;&lt;span style="top:-3.69em;"&gt;&lt;span class="pstrut" style="height:3.008em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;x&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-2.25em;"&gt;&lt;span class="pstrut" style="height:3.008em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault" style="margin-right:0.0037em;"&gt;α&lt;/span&gt;&lt;span class="mord mathdefault"&gt;x&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:1.19em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="arraycolsep" style="width:1em;"&gt;&lt;/span&gt;&lt;span class="col-align-l"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:1.69em;"&gt;&lt;span style="top:-3.69em;"&gt;&lt;span class="pstrut" style="height:3.008em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord text"&gt;&lt;span class="mord"&gt;if &lt;/span&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;x&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;&amp;gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;0&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-2.25em;"&gt;&lt;span class="pstrut" style="height:3.008em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord text"&gt;&lt;span class="mord"&gt;if &lt;/span&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;x&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;≤&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;0&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:1.19em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose nulldelimiter"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;In code:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;numpy&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;as&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;np&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;leaky_relu&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;alpha&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.1&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;where&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;alpha&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;It's commonly used for training generative adversarial networks or any networks with sparse gradients. By introducing a non-zero gradient for negative values, Leaky ReLU allows the model to learn from data that standard ReLU might disregard, but at the cost of adding a hyperparameter. At &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;α&lt;/mi&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mn&gt;0&lt;/mn&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;\alpha = 0&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.43056em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.0037em;"&gt;α&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.64444em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;0&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; Leaky ReLU is simply ReLU.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Leaky ReLU plot" src="../_media/leaky-relu-activate-examples.png"&gt;&lt;/p&gt;</content><category term="permanent"/><category term="MachineLearning"/></entry><entry><title>ReLU</title><link href="http://localhost:8000/relu.html" rel="alternate"/><published>2024-01-02T00:00:00+10:00</published><updated>2024-01-02T00:00:00+10:00</updated><author><name>Lex Toumbourou</name></author><id>tag:localhost,2024-01-02:/relu.html</id><summary type="html">&lt;p&gt;An activation function that replaces negative values with zero&lt;/p&gt;</summary><content type="html">&lt;p&gt;&lt;strong&gt;Rectified Linear Unit (ReLU)&lt;/strong&gt; is the most common activation function in deep learning: it converts negative values to 0. ReLU is one of the simplest conceivable ways to add non-linearity to a neural network. And it works!&lt;/p&gt;
&lt;p&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;f&lt;/mi&gt;&lt;mo stretchy="false"&gt;(&lt;/mo&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;mo stretchy="false"&gt;)&lt;/mo&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mi&gt;max&lt;/mi&gt;&lt;mo&gt;⁡&lt;/mo&gt;&lt;mo stretchy="false"&gt;(&lt;/mo&gt;&lt;mn&gt;0&lt;/mn&gt;&lt;mo separator="true"&gt;,&lt;/mo&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;mo stretchy="false"&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;f(x)= \max(0,x)&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1em;vertical-align:-0.25em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.10764em;"&gt;f&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord mathdefault"&gt;x&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1em;vertical-align:-0.25em;"&gt;&lt;/span&gt;&lt;span class="mop"&gt;max&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord"&gt;0&lt;/span&gt;&lt;span class="mpunct"&gt;,&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;x&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Code:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;numpy&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;as&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;np&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;relu&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;maximum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;The paper &lt;a href="https://www.cs.toronto.edu/~fritz/absps/reluICML.pdf"&gt;Rectified Linear Units Improve Restricted Boltzmann Machines&lt;/a&gt; is commonly cited as the first usage of the ReLU activation function, though the first usage of the function dates back to the 1975 paper &lt;a href="https://link.springer.com/article/10.1007/BF00342633"&gt;Cognitron: A self-organizing multilayered neural network&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;ReLU helped to overcome the vanishing gradient problem prevalent in traditional activation functions like &lt;a href="sigmoid-function.html"&gt;Sigmoid Function&lt;/a&gt; or tanh. In these functions, gradients can become extremely small, stopping the network from learning further.&lt;/p&gt;
&lt;p&gt;However, since the function outputs zero for any negative input, neurons can sometimes become inactive and stop contributing to the learning process, referred to as &lt;em&gt;"dying ReLU"&lt;/em&gt;, especially if the network is not properly initialized or the learning rate is too high.&lt;/p&gt;
&lt;p&gt;Variations like &lt;a href="leaky-relu.html"&gt;Leaky ReLU&lt;/a&gt; and Parametric ReLU mitigate this by replacing 0 with a small value when the unit is inactive, providing a way to keep the neurons alive during the training process.&lt;/p&gt;
&lt;p&gt;&lt;img alt="ReLU plot" src="../_media/relu-activation-plot.png"&gt;&lt;/p&gt;
&lt;h2 id="recommended-reading"&gt;Recommended Reading&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://amzn.to/3Svowuu"&gt;Deep Learning for Coders with Fastai and PyTorch: AI Applications Without a PhD&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="Deep Learning for Coders with fastai &amp;amp; PyTorch" src="../_media/deep-learning-for-coders-book-cover.png"&gt;&lt;/p&gt;
&lt;p&gt;To learn more about loss functions and the fundamentals of neural networks in general, I recommend &lt;a href="https://amzn.to/3Svowuu"&gt;Deep Learning for Coders with Fastai and PyTorch: AI Applications Without a PhD&lt;/a&gt;—an approachable yet complete top-down guide to Deep Learning.&lt;/p&gt;</content><category term="permanent"/><category term="MachineLearning"/></entry><entry><title>Module Coupling</title><link href="http://localhost:8000/module-coupling.html" rel="alternate"/><published>2023-12-31T00:00:00+10:00</published><updated>2023-12-31T00:00:00+10:00</updated><author><name>Lex Toumbourou</name></author><id>tag:localhost,2023-12-31:/module-coupling.html</id><summary type="html">&lt;p&gt;A measure of the interdependence between software modules&lt;/p&gt;</summary><content type="html">&lt;p&gt;Module coupling concerns the interdependence between software &lt;a href="module.html"&gt;Module&lt;/a&gt;: how much do a group of modules rely on each other?&lt;/p&gt;
&lt;p&gt;Coupling is certainly not a bad thing on its own; it's necessary to develop a sufficiently complex system. However, some types of coupling are preferred over others.&lt;/p&gt;
&lt;p&gt;Similar to &lt;a href="module-cohesion.html"&gt;Module Cohesion&lt;/a&gt;, the &lt;a href="https://www.iso.org/obp/ui/#iso:std:iso-iec-ieee:24765:en"&gt;ISO/IEEE Systems and Software Engineering Vocabulary&lt;/a&gt; recognises six key types of module coupling.&lt;/p&gt;
&lt;p&gt;Having names for these different coupling types is quite useful for identifying problem points in a code base and strategies for refactoring.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="content-coupling"&gt;&lt;a href="content-coupling.html"&gt;Content Coupling&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Content Coupling&lt;/strong&gt; is when a module is contained within another module.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Diagram to represent Content Coupling" src="../_media/content-coupling.png"&gt;&lt;/p&gt;
&lt;p&gt;Consider an &lt;code&gt;Image&lt;/code&gt; module that contains various image type loading implementations: &lt;code&gt;JpegImage&lt;/code&gt;, &lt;code&gt;PngImage&lt;/code&gt;, &lt;code&gt;GifImage&lt;/code&gt;, etc.&lt;/p&gt;
&lt;p&gt;Given an image, a user doesn't need to know which submodule to call for their specific image type; they request to load an image, and the main module calls the required submodules.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;image&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Image&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;load&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;cat.jpg&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Content Coupling is universally considered a good idea and property of Khorikov's &lt;a href="well-designed-api.html"&gt;Well-Designed API&lt;/a&gt;.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="data-coupling"&gt;&lt;a href="data-coupling.html"&gt;Data Coupling&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Data Coupling&lt;/strong&gt;, also known as &lt;em&gt;input-output coupling&lt;/em&gt;, is a type of coupling in which output from one software module is input to another.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Diagram to represent Data Coupling" src="../_media/data-coupling.png"&gt;&lt;/p&gt;
&lt;p&gt;For example, a data module that prepares data before running a transformation.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;data&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;transform&lt;/span&gt;

&lt;span class="n"&gt;my_data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;prepare_data&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;output&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;transform&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;transform_data&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;my_data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Data coupling is also considered a good thing.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="common-environment-coupling"&gt;&lt;a href="common-environment-coupling.html"&gt;Common-Environment Coupling&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Common-environment coupling&lt;/strong&gt; is when multiple modules share the same global data.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Diagram to represent Common-Environment Coupling" src="../_media/common-environment-coupling.png"&gt;&lt;/p&gt;
&lt;p&gt;Common environment refers to global variables, singleton state objects, system environment variables, etc.&lt;/p&gt;
&lt;p&gt;It is not necessarily a bad thing. However, using a mutable global state can lead to hard-to-find bugs.&lt;/p&gt;
&lt;p&gt;Sometimes, a better idea is to use sub-environments: global states within specific classes or modules, name-spaced environment variables, etc.&lt;/p&gt;
&lt;p&gt;If you must use a global environment, ideally, it would be immutable.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="control-coupling"&gt;&lt;a href="control-coupling.html"&gt;Control Coupling&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Control Coupling&lt;/strong&gt; is when a module communicates information, perhaps via flags, to another to influence its execution.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Diagram to represent Control Coupling" src="../_media/control-coupling%20(1).png"&gt;&lt;/p&gt;
&lt;p&gt;For example, if &lt;strong&gt;Module A&lt;/strong&gt; passes flags to &lt;strong&gt;Module B&lt;/strong&gt; to change the mathematical operations that &lt;strong&gt;Module B&lt;/strong&gt; performs.&lt;/p&gt;
&lt;p&gt;Control coupling is mostly considered bad; in the example above, &lt;strong&gt;Module B&lt;/strong&gt; is hard to test and verify since it's dependent on control information from &lt;strong&gt;Module A&lt;/strong&gt;, which can lead to complex and hard-to-reason designs.&lt;/p&gt;
&lt;p&gt;Data coupling is preferred over control coupling.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="hybrid-coupling"&gt;&lt;a href="hybrid-coupling.html"&gt;Hybrid Coupling&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Hybrid Coupling&lt;/strong&gt; occurs when different subsets of the range of values of a data item are used for separate and unrelated purposes.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Diagram to represent Hybrid Coupling" src="../_media/hybrid-coupling%20(1).png"&gt;&lt;/p&gt;
&lt;p&gt;It is a rare type of coupling but sometimes the only option, especially in limited memory environments (microcontrollers). You should avoid it unless you know what you're doing.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="pathological-coupling"&gt;&lt;a href="pathological-coupling.html"&gt;Pathological Coupling&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Pathological Coupling&lt;/strong&gt; occurs when one module is used to change the behaviour of another module.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Diagram to represent Pathological Coupling" src="../_media/pathological-coupling.png"&gt;&lt;/p&gt;
&lt;p&gt;I'm thinking of ideas like monkey patching or modifying private variables.&lt;/p&gt;
&lt;p&gt;It's mostly a bad thing. Usually, it occurs when a module is repurposed to support functionality it wasn't originally intended for, and it often calls for a refactor.&lt;/p&gt;</content><category term="permanent"/><category term="SoftwareEngineering"/></entry><entry><title>Module</title><link href="http://localhost:8000/module.html" rel="alternate"/><published>2023-12-29T00:00:00+10:00</published><updated>2023-12-29T00:00:00+10:00</updated><author><name>Lex Toumbourou</name></author><id>tag:localhost,2023-12-29:/module.html</id><summary type="html">&lt;p&gt;A distinct and identifiable unit of code&lt;/p&gt;</summary><content type="html">&lt;p&gt;A module is a distinct and identifiable unit of code designed to be part of a larger application.&lt;/p&gt;
&lt;p&gt;The specific definition of a module varies amongst programming languages and developers.&lt;/p&gt;
&lt;p&gt;In Python and similar languages, a module is clearly defined as a file with a .py extension containing code that can be imported and utilised by other modules. In others, a module could refer to a class definition and its associated methods.&lt;/p&gt;
&lt;p&gt;The key idea of modularity is to promote code reusability and organisational clarity.&lt;/p&gt;
&lt;p&gt;&lt;a href="module-cohesion.html"&gt;Module Cohesion&lt;/a&gt; refers to the degree of relation between module elements. &lt;a href="module-coupling.html"&gt;Module Coupling&lt;/a&gt; is the degree of interdependence between software modules.&lt;/p&gt;</content><category term="permanent"/><category term="SoftwareEngineering"/></entry><entry><title>Module Cohesion</title><link href="http://localhost:8000/module-cohesion.html" rel="alternate"/><published>2023-12-29T00:00:00+10:00</published><updated>2023-12-29T10:00:00+10:00</updated><author><name>Lex Toumbourou</name></author><id>tag:localhost,2023-12-29:/module-cohesion.html</id><summary type="html">&lt;p&gt;How elements of a module relate to each other&lt;/p&gt;</summary><content type="html">&lt;p&gt;In software engineering, module cohesion refers to the degree to which the elements of a &lt;a href="module.html"&gt;Module&lt;/a&gt; are related. For example, functions that manage the same type of data or contribute to a singular, unified piece of capability.&lt;/p&gt;
&lt;p&gt;Some forms of cohesion are considered good, while others are not.&lt;/p&gt;
&lt;p&gt;Like &lt;a href="module-coupling.html"&gt;Module Coupling&lt;/a&gt;, the &lt;a href="https://www.iso.org/obp/ui/#iso:std:iso-iec-ieee:24765:en"&gt;ISO/IEEE Systems and Software Engineering Vocabulary&lt;/a&gt; recognises seven types of module cohesion.&lt;/p&gt;
&lt;h2 id="functional-cohesion"&gt;&lt;a href="functional-cohesion.html"&gt;Functional Cohesion&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Functional cohesion refers to when elements of a module are grouped because they contribute to the same purpose.&lt;/p&gt;
&lt;p&gt;For example, a module called &lt;code&gt;file_operations&lt;/code&gt; has a set of functions like &lt;code&gt;read_file()&lt;/code&gt;, &lt;code&gt;write_file()&lt;/code&gt; and &lt;code&gt;delete_file()&lt;/code&gt;. Each function contributes to the overarching file-handling capability of the program.&lt;/p&gt;
&lt;p&gt;Functional cohesion is the ideal type and is universally considered good.&lt;/p&gt;
&lt;h2 id="communicational-cohesion"&gt;&lt;a href="communicational-cohesion.html"&gt;Communicational Cohesion&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Communicational cohesion occurs when code is grouped because it operates on the same data type.&lt;/p&gt;
&lt;p&gt;For example, an &lt;code&gt;Invoice&lt;/code&gt; class might contain methods for adding items, calculating the total, applying discounts, etc. Each method operates on the same data structure, the items in an invoice.&lt;/p&gt;
&lt;p&gt;As the foundation of object-oriented programming, communicational cohesion is generally considered good. However, consider a complex &lt;code&gt;Customer&lt;/code&gt; class, where we have methods for adding customers, updating details, generating customer-specific reports, etc. Though the module operates on the same data type, the functionality is quite different, and refactoring it into multiple modules might be better.&lt;/p&gt;
&lt;h2 id="logical-cohesion"&gt;&lt;a href="logical-cohesion.html"&gt;Logical Cohesion&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Logical cohesion is when things are grouped because they relate in some way but don't necessarily have interdependence or a relationship to a single task.&lt;/p&gt;
&lt;p&gt;For example, a math module includes functions like &lt;code&gt;math.square_root&lt;/code&gt;, &lt;code&gt;math.log&lt;/code&gt;, &lt;code&gt;math.sine&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Sometimes considered a bad practice - while they may be related logically, they don't share a relationship that warrants putting them in a single module.&lt;/p&gt;
&lt;h2 id="procedural-cohesion"&gt;&lt;a href="procedural-cohesion.html"&gt;Procedural Cohesion&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Procedural cohesion is when things are grouped because they happen in sequence.&lt;/p&gt;
&lt;p&gt;For example, a process class contains a method for user authentication, followed by a technique to log the authentication, and finally, a method to redirect the user based on their role. These methods are part of a sequence (login process) but are quite different in functionality.&lt;/p&gt;
&lt;p&gt;Generally considered bad. Just because things happen sequentially doesn't mean they should be logically grouped.&lt;/p&gt;
&lt;h2 id="sequential-cohesion"&gt;&lt;a href="sequential-cohesion.html"&gt;Sequential Cohesion&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Sequential cohesion is where the output of one task performed by a software module serves as input to another task performed by the module.&lt;/p&gt;
&lt;p&gt;For example, in a data processing module, one function takes raw data and formats it, the following function performs some calculations on this formatted data, and a third function logs the results. Here, the output of one function becomes the input for the next.&lt;/p&gt;
&lt;p&gt;Similar to procedural cohesion, it's considered bad.&lt;/p&gt;
&lt;h2 id="temporal-cohesion"&gt;&lt;a href="temporal-cohesion.html"&gt;Temporal Cohesion&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Temporal cohesion refers to grouping based on things that happen at a similar time or a particular program execution phase.&lt;/p&gt;
&lt;p&gt;An example is a startup module that initialises various components of an application - like setting up database connections, loading configuration files, and initialising logging. These tasks are all required during the startup phase but aren't functionally related, indicating temporal cohesion.&lt;/p&gt;
&lt;p&gt;Mostly considered bad: just because things happen simultaneously doesn't mean they should be related.&lt;/p&gt;
&lt;h2 id="coincidental-cohesion"&gt;&lt;a href="coincidental-cohesion.html"&gt;Coincidental Cohesion&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Coincidental cohesion is where elements of a module share no functional relationship.&lt;/p&gt;
&lt;p&gt;For example, a module contains miscellaneous functions like &lt;code&gt;calculate_age&lt;/code&gt;, &lt;code&gt;generate_random_number&lt;/code&gt;, &lt;code&gt;format_date&lt;/code&gt; etc. Here, these tasks have no functional relationship to each other and are grouped by coincidence, not because they logically belong together.&lt;/p&gt;
&lt;p&gt;Coincidental cohesion is universally considered bad.&lt;/p&gt;</content><category term="permanent"/><category term="SoftwareEngineering"/></entry><entry><title>Large-scale Contrastive Language-Audio Pre-training with Feature Fusion and Keyword-to-Caption Augmentation</title><link href="http://localhost:8000/large-scale-contrastive-language-audio-pre-training-with-feature-fusion-and-keyword-to-caption-augmentation.html" rel="alternate"/><published>2023-12-13T00:00:00+10:00</published><updated>2023-12-13T00:00:00+10:00</updated><author><name>Lex Toumbourou</name></author><id>tag:localhost,2023-12-13:/large-scale-contrastive-language-audio-pre-training-with-feature-fusion-and-keyword-to-caption-augmentation.html</id><summary type="html">&lt;p&gt;Notes from paper &lt;a href="https://arxiv.org/abs/2211.06687"&gt;Large-scale Contrastive Language-Audio Pre-training with Feature Fusion and Keyword-to-Caption Augmentation&lt;/a&gt; by Yusong Wu, Ke Chen, Tianyu Zhang, Yuchen Hui, Taylor Berg-Kirkpatrick, Shlomo Dubnov&lt;/p&gt;</summary><content type="html">&lt;p&gt;These are my notes from the paper &lt;a href="https://arxiv.org/abs/2211.06687"&gt;Large-scale Contrastive Language-Audio Pre-training with Feature Fusion and Keyword-to-Caption Augmentation&lt;/a&gt; by Yusong Wu, Ke Chen, Tianyu Zhang, Yuchen Hui, Taylor Berg-Kirkpatrick, Shlomo Dubnov&lt;/p&gt;
&lt;h2 id="overview"&gt;Overview&lt;/h2&gt;
&lt;p&gt;This paper uses contrastive learning to learn a shared text/audio latent space. Like &lt;a href="https://openai.com/research/clip"&gt;CLIP&lt;/a&gt; for audio. It has four main contributions:&lt;/p&gt;
&lt;h3 id="1-contrastive-language-audio-pre-training-clap"&gt;1. Contrastive Language-Audio Pre-training (CLAP)&lt;/h3&gt;
&lt;p&gt;CLAP is a pre-training system for learning a shared text/audio latent space from pairs of examples. From this, we can learn representations that allow us to query audio using text or vice versa.&lt;/p&gt;
&lt;p&gt;It is trained using &lt;a href="contrastive-loss.html"&gt;Contrastive Loss&lt;/a&gt;. Hence: &lt;span style="color: red;"&gt;Contrastive&lt;/span&gt; &lt;span style="color: blue;"&gt;Language-Audio&lt;/span&gt; &lt;span style="color: green;"&gt;Pre-training&lt;/span&gt;.&lt;/p&gt;
&lt;p&gt;The authors use a text-encoder and audio-encoder to generate respective representations, then feed into an MLP layer to learn a shared latent space. For the text-encoder, they use &lt;a href="https://arxiv.org/abs/1907.11692"&gt;RoBERTa&lt;/a&gt;, and for the audio-encoder, they use &lt;a href="https://arxiv.org/abs/2202.00874"&gt;HTS-AT&lt;/a&gt;. The authors also compared several alternatives.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Overall of the whole system" src="../../_media/paper-large-scale-contrastive-language-audio-retraining-with-feature-fusion-clap-overview.png"&gt;&lt;/p&gt;
&lt;p&gt;They released the architecture, training code and series of weights trained on different subsets of their datasets &lt;a href="https://github.com/LAION-AI/CLAP"&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id="2-feature-fusion"&gt;2. &lt;a href="feature-fusion.html"&gt;Feature-Fusion&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;A technique for dealing with variable-length, long audio (&amp;gt; 10 secs). It combines the entire audio downsampled, alongside 10-second clips taken randomly throughout the audio. They pass through several layers to get the final representation.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Feature-fusion" src="../../_media/paper-large-scale-contrastive-language-audio-retraining-with-feature-fusion-feature-fusion.png"&gt;&lt;/p&gt;
&lt;p&gt;More information is below.&lt;/p&gt;
&lt;h3 id="3-keyword-to-caption-augmentation"&gt;3. &lt;a href="keyword-to-caption-augmentation.html"&gt;Keyword-to-Caption Augmentation&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Since the &lt;a href="https://research.google.com/audioset/"&gt;Audioset&lt;/a&gt; dataset only has keywords and labels paired with audio, they use a T5 model provided by the &lt;a href="https://github.com/gagan3012/keytotext"&gt;keytotext&lt;/a&gt; library to create captions from these keywords.&lt;/p&gt;
&lt;p&gt;They also add a de-biasing step to convert references to "woman" or "man" to "person".&lt;/p&gt;
&lt;p&gt;Here are some examples of the keywords and the generated captions, followed by their debiased versions.&lt;/p&gt;
&lt;p&gt;&lt;img alt="" src="../../_media/large-scale-contrastive-language-audio-pre-training-with-feature-fusion-and-keyword-to-caption-augmentation-captions-debias.png"&gt;&lt;/p&gt;
&lt;h3 id="4-laion-audio-630k"&gt;4. &lt;a href="laion-audio-630k.html"&gt;Laion Audio 630K&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Finally, Laion Audio 630k was released: a large text/audio dataset scraped from the internet. They collect 633 526 text/audio pairs, amounting to 4,325.39 hours of audio.&lt;/p&gt;
&lt;p&gt;Contains:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;human activities&lt;/li&gt;
&lt;li&gt;natural sounds&lt;/li&gt;
&lt;li&gt;audio effects&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="examples"&gt;Examples&lt;/h4&gt;
&lt;h5 id="the-sound-of-a-siren"&gt;"The sound of a siren"&lt;/h5&gt;
&lt;p&gt;&lt;audio controls&gt;
  &lt;source src="/_media/the-sound-of-a-siren.mov" type="audio/mpeg"&gt;
&lt;/audio&gt;&lt;/p&gt;
&lt;h5 id="the-sounds-of-wrestling-crowd-mezzanine-level-huge-crowd-pa-and-loop"&gt;"The sounds of wrestling crowd, mezzanine level, huge crowd, p.a., and loop."&lt;/h5&gt;
&lt;p&gt;&lt;audio controls&gt;
  &lt;source src="/_media/sound-of-wrestling-crowd.mov" type="audio/mpeg"&gt;
&lt;/audio&gt;&lt;/p&gt;
&lt;h2 id="related-work"&gt;Related work&lt;/h2&gt;
&lt;p&gt;&lt;a href="contrastive-language-image-pretraining.html"&gt;CLIP&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Demonstrated how contrastive loss can be used to learn the relationship between text and image by projecting into a shared latent space&lt;/li&gt;
&lt;li&gt;trained on a large-scale internet scrape&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Other attempts to use contrastive pre-training on language-audio:&lt;/p&gt;
&lt;p&gt;&lt;a href="https://dcase.community/documents/challenge2022/technical_reports/DCASE2022_Wu_100_t6b.pdf"&gt;Text-to-audio retrieval via large-scale contrastive learning&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Pre-trained Audio Neural Network (PANN) as the audio encoder.&lt;/li&gt;
&lt;li&gt;BERT as text encoder.&lt;/li&gt;
&lt;li&gt;Various loss functions to evaluate text-to-audio retrieval.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href="https://arxiv.org/abs/2209.14275"&gt;Audio Retrieval with WavText5K and CLAP Training&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Also adds &lt;a href="https://arxiv.org/abs/2202.00874"&gt;HTS-AT&lt;/a&gt; and &lt;a href="https://arxiv.org/abs/1907.11692"&gt;RoBERTa&lt;/a&gt; into encoder list to enhance performance.&lt;/li&gt;
&lt;li&gt;Uses representation in the downstream task of audio classification.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Other studies extending CLIP for audio:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://arxiv.org/abs/2106.13043"&gt;AudioCLIP: Extending CLIP to Image, Text and Audio&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://arxiv.org/abs/2110.11499"&gt;Wav2CLIP: Learning Robust Audio Representations From CLIP&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;However, they all share limitations:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Datasets "relatively small."&lt;/li&gt;
&lt;li&gt;Prior work has yet to investigate selections and hyper-parameters thoroughly.&lt;/li&gt;
&lt;li&gt;Can't accommodate varied audio lengths, particularly with &lt;a href="transformer.html"&gt;Transformer&lt;/a&gt;-based audio encoder.&lt;/li&gt;
&lt;li&gt;No analysis of representation in the downstream task.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="training-dataset"&gt;Training Dataset&lt;/h2&gt;
&lt;p&gt;&lt;a href="laion-audio-630k.html"&gt;Laion Audio 630K&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;630K+ audio-text pairs.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href="https://audiocaps.github.io/"&gt;AudioCaps&lt;/a&gt; + &lt;a href="https://zenodo.org/records/3490684"&gt;Clotho&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;55k audio-text pairs.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href="https://research.google.com/audioset/"&gt;Audioset&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;1.9 million audio samples with only labels available for each sample.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;They exclude overlapping data in evaluation sets, resulting in 2.5 million audio samples.&lt;/p&gt;
&lt;h3 id="dataset-format-and-preprocessing"&gt;Dataset Format and Preprocessing&lt;/h3&gt;
&lt;p&gt;All audio is converted to mono.&lt;/p&gt;
&lt;p&gt;48kHz in FLAC format.&lt;/p&gt;
&lt;p&gt;Expand data with only tags or labels using the template: &lt;em&gt;"the sound of &lt;code&gt;label-1&lt;/code&gt;, &lt;code&gt;label-2&lt;/code&gt;, ..., and &lt;code&gt;label-n&lt;/code&gt;"&lt;/em&gt;&lt;/p&gt;
&lt;h2 id="model-architecture"&gt;Model Architecture&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;msubsup&gt;&lt;mi&gt;X&lt;/mi&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;/msubsup&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;X^{a}_i&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.941994em;vertical-align:-0.258664em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault" style="margin-right:0.07847em;"&gt;X&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.664392em;"&gt;&lt;span style="top:-2.441336em;margin-left:-0.07847em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mathdefault mtight"&gt;i&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-3.063em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathdefault mtight"&gt;a&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.258664em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; = audio example i&lt;/li&gt;
&lt;li&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;msubsup&gt;&lt;mi&gt;X&lt;/mi&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;mi&gt;t&lt;/mi&gt;&lt;/msubsup&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;X^{t}_{i}&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1.05222em;vertical-align:-0.258664em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault" style="margin-right:0.07847em;"&gt;X&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.7935559999999999em;"&gt;&lt;span style="top:-2.441336em;margin-left:-0.07847em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathdefault mtight"&gt;i&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-3.063em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathdefault mtight"&gt;t&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.258664em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; = text example i&lt;/li&gt;
&lt;li&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;msubsup&gt;&lt;mi&gt;X&lt;/mi&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;/msubsup&gt;&lt;mo separator="true"&gt;,&lt;/mo&gt;&lt;msubsup&gt;&lt;mi&gt;X&lt;/mi&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;mi&gt;t&lt;/mi&gt;&lt;/msubsup&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;X^{a}_{i}, X^{t}_{i}&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1.05222em;vertical-align:-0.258664em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault" style="margin-right:0.07847em;"&gt;X&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.664392em;"&gt;&lt;span style="top:-2.441336em;margin-left:-0.07847em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathdefault mtight"&gt;i&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-3.063em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathdefault mtight"&gt;a&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.258664em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mpunct"&gt;,&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault" style="margin-right:0.07847em;"&gt;X&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.7935559999999999em;"&gt;&lt;span style="top:-2.441336em;margin-left:-0.07847em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathdefault mtight"&gt;i&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-3.063em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathdefault mtight"&gt;t&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.258664em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; = audio-text pair &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;i&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.65952em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;i&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;.&lt;/li&gt;
&lt;li&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mtext&gt;faudio&lt;/mtext&gt;&lt;mo stretchy="false"&gt;(&lt;/mo&gt;&lt;msubsup&gt;&lt;mi&gt;X&lt;/mi&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;/msubsup&gt;&lt;mo stretchy="false"&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;\text{faudio}(X^{a}_{i})&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1.008664em;vertical-align:-0.258664em;"&gt;&lt;/span&gt;&lt;span class="mord text"&gt;&lt;span class="mord"&gt;faudio&lt;/span&gt;&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault" style="margin-right:0.07847em;"&gt;X&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.664392em;"&gt;&lt;span style="top:-2.441336em;margin-left:-0.07847em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathdefault mtight"&gt;i&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-3.063em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathdefault mtight"&gt;a&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.258664em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; = audio encodings.&lt;/li&gt;
&lt;li&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mtext&gt;ftext&lt;/mtext&gt;&lt;mo stretchy="false"&gt;(&lt;/mo&gt;&lt;msubsup&gt;&lt;mi&gt;X&lt;/mi&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;mi&gt;t&lt;/mi&gt;&lt;/msubsup&gt;&lt;mo stretchy="false"&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;\text{ftext}(X^{t}_{i})&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1.05222em;vertical-align:-0.258664em;"&gt;&lt;/span&gt;&lt;span class="mord text"&gt;&lt;span class="mord"&gt;ftext&lt;/span&gt;&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault" style="margin-right:0.07847em;"&gt;X&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.7935559999999999em;"&gt;&lt;span style="top:-2.441336em;margin-left:-0.07847em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathdefault mtight"&gt;i&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-3.063em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathdefault mtight"&gt;t&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.258664em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; = text encodings&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Pass the audio and text encodings into another neural network layer to get 512-dimension embeddings.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;msubsup&gt;&lt;mi&gt;E&lt;/mi&gt;&lt;mi&gt;t&lt;/mi&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;/msubsup&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mtext&gt;MLPaudio&lt;/mtext&gt;&lt;mo stretchy="false"&gt;(&lt;/mo&gt;&lt;mtext&gt;faudio&lt;/mtext&gt;&lt;mo stretchy="false"&gt;(&lt;/mo&gt;&lt;msubsup&gt;&lt;mi&gt;X&lt;/mi&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;/msubsup&gt;&lt;mo stretchy="false"&gt;)&lt;/mo&gt;&lt;mo stretchy="false"&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;E^{a}_{t} = \text{MLPaudio}(\text{faudio}(X^{a}_{i}))&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.93033em;vertical-align:-0.247em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault" style="margin-right:0.05764em;"&gt;E&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.664392em;"&gt;&lt;span style="top:-2.4530000000000003em;margin-left:-0.05764em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathdefault mtight"&gt;t&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-3.063em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathdefault mtight"&gt;a&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.247em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1.008664em;vertical-align:-0.258664em;"&gt;&lt;/span&gt;&lt;span class="mord text"&gt;&lt;span class="mord"&gt;MLPaudio&lt;/span&gt;&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord text"&gt;&lt;span class="mord"&gt;faudio&lt;/span&gt;&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault" style="margin-right:0.07847em;"&gt;X&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.664392em;"&gt;&lt;span style="top:-2.441336em;margin-left:-0.07847em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathdefault mtight"&gt;i&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-3.063em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathdefault mtight"&gt;a&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.258664em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;msubsup&gt;&lt;mi&gt;E&lt;/mi&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;mi&gt;t&lt;/mi&gt;&lt;/msubsup&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mtext&gt;MLPtext&lt;/mtext&gt;&lt;mo stretchy="false"&gt;(&lt;/mo&gt;&lt;mtext&gt;ftext&lt;/mtext&gt;&lt;mo stretchy="false"&gt;(&lt;/mo&gt;&lt;msubsup&gt;&lt;mi&gt;X&lt;/mi&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;mi&gt;t&lt;/mi&gt;&lt;/msubsup&gt;&lt;mo stretchy="false"&gt;)&lt;/mo&gt;&lt;mo stretchy="false"&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;E^{t}_{i} = \text{MLPtext}(\text{ftext}(X^{t}_{i}))&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1.05222em;vertical-align:-0.258664em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault" style="margin-right:0.05764em;"&gt;E&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.7935559999999999em;"&gt;&lt;span style="top:-2.441336em;margin-left:-0.05764em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathdefault mtight"&gt;i&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-3.063em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathdefault mtight"&gt;t&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.258664em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1.05222em;vertical-align:-0.258664em;"&gt;&lt;/span&gt;&lt;span class="mord text"&gt;&lt;span class="mord"&gt;MLPtext&lt;/span&gt;&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord text"&gt;&lt;span class="mord"&gt;ftext&lt;/span&gt;&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault" style="margin-right:0.07847em;"&gt;X&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.7935559999999999em;"&gt;&lt;span style="top:-2.441336em;margin-left:-0.07847em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathdefault mtight"&gt;i&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-3.063em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathdefault mtight"&gt;t&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.258664em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Now, you can use the contrastive learning loss function to compare pairs and negative pairs in each batch.&lt;/p&gt;
&lt;p&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;L&lt;/mi&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mfrac&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;mrow&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;mi&gt;N&lt;/mi&gt;&lt;/mrow&gt;&lt;/mfrac&gt;&lt;msubsup&gt;&lt;mi mathvariant="normal"&gt;Σ&lt;/mi&gt;&lt;mrow&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/mrow&gt;&lt;mi&gt;N&lt;/mi&gt;&lt;/msubsup&gt;&lt;mtext&gt; &lt;/mtext&gt;&lt;mo stretchy="false"&gt;(&lt;/mo&gt;&lt;mi&gt;log&lt;/mi&gt;&lt;mo&gt;⁡&lt;/mo&gt;&lt;mfrac&gt;&lt;mrow&gt;&lt;mi&gt;exp&lt;/mi&gt;&lt;mo&gt;⁡&lt;/mo&gt;&lt;mrow&gt;&lt;msubsup&gt;&lt;mi&gt;E&lt;/mi&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;/msubsup&gt;&lt;mo&gt;⋅&lt;/mo&gt;&lt;msubsup&gt;&lt;mi&gt;E&lt;/mi&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;mi&gt;t&lt;/mi&gt;&lt;/msubsup&gt;&lt;mi mathvariant="normal"&gt;/&lt;/mi&gt;&lt;mi&gt;r&lt;/mi&gt;&lt;/mrow&gt;&lt;/mrow&gt;&lt;mrow&gt;&lt;msubsup&gt;&lt;mi mathvariant="normal"&gt;Σ&lt;/mi&gt;&lt;mrow&gt;&lt;mi&gt;j&lt;/mi&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/mrow&gt;&lt;mi&gt;N&lt;/mi&gt;&lt;/msubsup&gt;&lt;mi&gt;exp&lt;/mi&gt;&lt;mo&gt;⁡&lt;/mo&gt;&lt;mo stretchy="false"&gt;(&lt;/mo&gt;&lt;msubsup&gt;&lt;mi&gt;E&lt;/mi&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;/msubsup&gt;&lt;mo&gt;⋅&lt;/mo&gt;&lt;msubsup&gt;&lt;mi&gt;E&lt;/mi&gt;&lt;mi&gt;j&lt;/mi&gt;&lt;mi&gt;t&lt;/mi&gt;&lt;/msubsup&gt;&lt;mi mathvariant="normal"&gt;/&lt;/mi&gt;&lt;mi&gt;r&lt;/mi&gt;&lt;mo stretchy="false"&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;/mfrac&gt;&lt;mo&gt;+&lt;/mo&gt;&lt;mi&gt;log&lt;/mi&gt;&lt;mo&gt;⁡&lt;/mo&gt;&lt;mfrac&gt;&lt;mrow&gt;&lt;mi&gt;exp&lt;/mi&gt;&lt;mo&gt;⁡&lt;/mo&gt;&lt;mrow&gt;&lt;msubsup&gt;&lt;mi&gt;E&lt;/mi&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;mi&gt;t&lt;/mi&gt;&lt;/msubsup&gt;&lt;mo&gt;⋅&lt;/mo&gt;&lt;msubsup&gt;&lt;mi&gt;E&lt;/mi&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;/msubsup&gt;&lt;mi mathvariant="normal"&gt;/&lt;/mi&gt;&lt;mi&gt;r&lt;/mi&gt;&lt;/mrow&gt;&lt;/mrow&gt;&lt;mrow&gt;&lt;msubsup&gt;&lt;mi mathvariant="normal"&gt;Σ&lt;/mi&gt;&lt;mrow&gt;&lt;mi&gt;j&lt;/mi&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/mrow&gt;&lt;mi&gt;N&lt;/mi&gt;&lt;/msubsup&gt;&lt;mi&gt;exp&lt;/mi&gt;&lt;mo&gt;⁡&lt;/mo&gt;&lt;mo stretchy="false"&gt;(&lt;/mo&gt;&lt;msubsup&gt;&lt;mi&gt;E&lt;/mi&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;mi&gt;t&lt;/mi&gt;&lt;/msubsup&gt;&lt;mo&gt;⋅&lt;/mo&gt;&lt;msubsup&gt;&lt;mi&gt;E&lt;/mi&gt;&lt;mi&gt;j&lt;/mi&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;/msubsup&gt;&lt;mi mathvariant="normal"&gt;/&lt;/mi&gt;&lt;mi&gt;r&lt;/mi&gt;&lt;mo stretchy="false"&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;/mfrac&gt;&lt;mo stretchy="false"&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;L = \frac{1}{2N} \Sigma^{N}_{i=1} \ ( \log  \frac{\exp{E^{a}_{i} \cdot E^{t}_{i} / r}}{\Sigma^{N}_{j=1} \exp(E^{a}_{i} \cdot E^{t}_{j} / r)} + \log \frac{\exp{E^{t}_{i} \cdot E^{a}_{i} / r}}{\Sigma^{N}_{j=1} \exp(E^{t}_{i} \cdot E^{a}_{j} / r)} )&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.68333em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;L&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1.8352849999999996em;vertical-align:-0.7158449999999998em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mopen nulldelimiter"&gt;&lt;/span&gt;&lt;span class="mfrac"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.845108em;"&gt;&lt;span style="top:-2.6550000000000002em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mtight"&gt;2&lt;/span&gt;&lt;span class="mord mathdefault mtight" style="margin-right:0.10903em;"&gt;N&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-3.23em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="frac-line" style="border-bottom-width:0.04em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-3.394em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mtight"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.345em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose nulldelimiter"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;Σ&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.8413309999999999em;"&gt;&lt;span style="top:-2.441336em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathdefault mtight"&gt;i&lt;/span&gt;&lt;span class="mrel mtight"&gt;=&lt;/span&gt;&lt;span class="mord mtight"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-3.063em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathdefault mtight" style="margin-right:0.10903em;"&gt;N&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.258664em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace"&gt; &lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mop"&gt;lo&lt;span style="margin-right:0.01389em;"&gt;g&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mopen nulldelimiter"&gt;&lt;/span&gt;&lt;span class="mfrac"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:1.1194399999999998em;"&gt;&lt;span style="top:-2.6069750000000003em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mtight"&gt;Σ&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.8328928571428571em;"&gt;&lt;span style="top:-2.177714285714286em;margin-left:0em;margin-right:0.07142857142857144em;"&gt;&lt;span class="pstrut" style="height:2.5em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size3 size1 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathdefault mtight" style="margin-right:0.05724em;"&gt;j&lt;/span&gt;&lt;span class="mrel mtight"&gt;=&lt;/span&gt;&lt;span class="mord mtight"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-2.8448em;margin-right:0.07142857142857144em;"&gt;&lt;span class="pstrut" style="height:2.5em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size3 size1 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathdefault mtight" style="margin-right:0.10903em;"&gt;N&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.46117142857142857em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace mtight" style="margin-right:0.19516666666666668em;"&gt;&lt;/span&gt;&lt;span class="mop mtight"&gt;&lt;span class="mtight"&gt;e&lt;/span&gt;&lt;span class="mtight"&gt;x&lt;/span&gt;&lt;span class="mtight"&gt;p&lt;/span&gt;&lt;/span&gt;&lt;span class="mopen mtight"&gt;(&lt;/span&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathdefault mtight" style="margin-right:0.05764em;"&gt;E&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.6523428571428571em;"&gt;&lt;span style="top:-2.177714285714286em;margin-left:-0.05764em;margin-right:0.07142857142857144em;"&gt;&lt;span class="pstrut" style="height:2.5em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size3 size1 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathdefault mtight"&gt;i&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-2.8448em;margin-right:0.07142857142857144em;"&gt;&lt;span class="pstrut" style="height:2.5em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size3 size1 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathdefault mtight"&gt;a&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.3222857142857143em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mbin mtight"&gt;⋅&lt;/span&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathdefault mtight" style="margin-right:0.05764em;"&gt;E&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.7841428571428571em;"&gt;&lt;span style="top:-2.177714285714286em;margin-left:-0.05764em;margin-right:0.07142857142857144em;"&gt;&lt;span class="pstrut" style="height:2.5em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size3 size1 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathdefault mtight" style="margin-right:0.05724em;"&gt;j&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-2.8448em;margin-right:0.07142857142857144em;"&gt;&lt;span class="pstrut" style="height:2.5em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size3 size1 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathdefault mtight"&gt;t&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.46117142857142857em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mord mtight"&gt;/&lt;/span&gt;&lt;span class="mord mathdefault mtight" style="margin-right:0.02778em;"&gt;r&lt;/span&gt;&lt;span class="mclose mtight"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-3.23em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="frac-line" style="border-bottom-width:0.04em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-3.5102em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mop mtight"&gt;&lt;span class="mtight"&gt;e&lt;/span&gt;&lt;span class="mtight"&gt;x&lt;/span&gt;&lt;span class="mtight"&gt;p&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace mtight" style="margin-right:0.19516666666666668em;"&gt;&lt;/span&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathdefault mtight" style="margin-right:0.05764em;"&gt;E&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.7385428571428572em;"&gt;&lt;span style="top:-2.214em;margin-left:-0.05764em;margin-right:0.07142857142857144em;"&gt;&lt;span class="pstrut" style="height:2.5em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size3 size1 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathdefault mtight"&gt;i&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-2.931em;margin-right:0.07142857142857144em;"&gt;&lt;span class="pstrut" style="height:2.5em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size3 size1 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathdefault mtight"&gt;a&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.286em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mbin mtight"&gt;⋅&lt;/span&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathdefault mtight" style="margin-right:0.05764em;"&gt;E&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.8703428571428571em;"&gt;&lt;span style="top:-2.214em;margin-left:-0.05764em;margin-right:0.07142857142857144em;"&gt;&lt;span class="pstrut" style="height:2.5em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size3 size1 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathdefault mtight"&gt;i&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-2.931em;margin-right:0.07142857142857144em;"&gt;&lt;span class="pstrut" style="height:2.5em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size3 size1 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathdefault mtight"&gt;t&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.286em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mord mtight"&gt;/&lt;/span&gt;&lt;span class="mord mathdefault mtight" style="margin-right:0.02778em;"&gt;r&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.7158449999999998em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose nulldelimiter"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;+&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1.8352849999999996em;vertical-align:-0.7158449999999998em;"&gt;&lt;/span&gt;&lt;span class="mop"&gt;lo&lt;span style="margin-right:0.01389em;"&gt;g&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mopen nulldelimiter"&gt;&lt;/span&gt;&lt;span class="mfrac"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:1.1194399999999998em;"&gt;&lt;span style="top:-2.6069750000000003em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mtight"&gt;Σ&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.8328928571428571em;"&gt;&lt;span style="top:-2.177714285714286em;margin-left:0em;margin-right:0.07142857142857144em;"&gt;&lt;span class="pstrut" style="height:2.5em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size3 size1 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathdefault mtight" style="margin-right:0.05724em;"&gt;j&lt;/span&gt;&lt;span class="mrel mtight"&gt;=&lt;/span&gt;&lt;span class="mord mtight"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-2.8448em;margin-right:0.07142857142857144em;"&gt;&lt;span class="pstrut" style="height:2.5em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size3 size1 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathdefault mtight" style="margin-right:0.10903em;"&gt;N&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.46117142857142857em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace mtight" style="margin-right:0.19516666666666668em;"&gt;&lt;/span&gt;&lt;span class="mop mtight"&gt;&lt;span class="mtight"&gt;e&lt;/span&gt;&lt;span class="mtight"&gt;x&lt;/span&gt;&lt;span class="mtight"&gt;p&lt;/span&gt;&lt;/span&gt;&lt;span class="mopen mtight"&gt;(&lt;/span&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathdefault mtight" style="margin-right:0.05764em;"&gt;E&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.7841428571428571em;"&gt;&lt;span style="top:-2.177714285714286em;margin-left:-0.05764em;margin-right:0.07142857142857144em;"&gt;&lt;span class="pstrut" style="height:2.5em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size3 size1 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathdefault mtight"&gt;i&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-2.8448em;margin-right:0.07142857142857144em;"&gt;&lt;span class="pstrut" style="height:2.5em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size3 size1 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathdefault mtight"&gt;t&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.3222857142857143em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mbin mtight"&gt;⋅&lt;/span&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathdefault mtight" style="margin-right:0.05764em;"&gt;E&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.6523428571428571em;"&gt;&lt;span style="top:-2.177714285714286em;margin-left:-0.05764em;margin-right:0.07142857142857144em;"&gt;&lt;span class="pstrut" style="height:2.5em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size3 size1 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathdefault mtight" style="margin-right:0.05724em;"&gt;j&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-2.8448em;margin-right:0.07142857142857144em;"&gt;&lt;span class="pstrut" style="height:2.5em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size3 size1 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathdefault mtight"&gt;a&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.46117142857142857em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mord mtight"&gt;/&lt;/span&gt;&lt;span class="mord mathdefault mtight" style="margin-right:0.02778em;"&gt;r&lt;/span&gt;&lt;span class="mclose mtight"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-3.23em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="frac-line" style="border-bottom-width:0.04em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-3.5102em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mop mtight"&gt;&lt;span class="mtight"&gt;e&lt;/span&gt;&lt;span class="mtight"&gt;x&lt;/span&gt;&lt;span class="mtight"&gt;p&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace mtight" style="margin-right:0.19516666666666668em;"&gt;&lt;/span&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathdefault mtight" style="margin-right:0.05764em;"&gt;E&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.8703428571428571em;"&gt;&lt;span style="top:-2.214em;margin-left:-0.05764em;margin-right:0.07142857142857144em;"&gt;&lt;span class="pstrut" style="height:2.5em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size3 size1 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathdefault mtight"&gt;i&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-2.931em;margin-right:0.07142857142857144em;"&gt;&lt;span class="pstrut" style="height:2.5em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size3 size1 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathdefault mtight"&gt;t&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.286em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mbin mtight"&gt;⋅&lt;/span&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathdefault mtight" style="margin-right:0.05764em;"&gt;E&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.7385428571428572em;"&gt;&lt;span style="top:-2.214em;margin-left:-0.05764em;margin-right:0.07142857142857144em;"&gt;&lt;span class="pstrut" style="height:2.5em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size3 size1 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathdefault mtight"&gt;i&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-2.931em;margin-right:0.07142857142857144em;"&gt;&lt;span class="pstrut" style="height:2.5em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size3 size1 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathdefault mtight"&gt;a&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.286em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mord mtight"&gt;/&lt;/span&gt;&lt;span class="mord mathdefault mtight" style="margin-right:0.02778em;"&gt;r&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.7158449999999998em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose nulldelimiter"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Where:
* &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;r&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;r&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.43056em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.02778em;"&gt;r&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; is a learnable temperature parameter for scaling the loss
* N is the batch size.&lt;/p&gt;
&lt;p&gt;Note: the two logarithmic terms consider audio-to-text or text-to-audio logits in each bath.&lt;/p&gt;
&lt;p&gt;After training, embeddings are then used for upstream tasks:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Text-to-Audio Retrieval&lt;/strong&gt;: given text, find the closest audio (or vice versa).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Zero-shot audio classification&lt;/strong&gt;: construct text like: &lt;em&gt;"the sound of &lt;code&gt;class name&lt;/code&gt;"&lt;/em&gt;, and use to query your audio. This classification style is useful because it allows you to use any category, provided it is in the training data.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Supervised Audio Classification&lt;/strong&gt;: take audio embeddings and fine-tune them on a classification task.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="audio-encoders-and-text-encoders"&gt;Audio Encoders and Text Encoders&lt;/h3&gt;
&lt;p&gt;They experiment with two models for audio encoders:&lt;/p&gt;
&lt;p&gt;&lt;a href="panns.html"&gt;PANNs&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;a CNN-based audio classification model with seven downsampling CNN blocks and seven upsampling blocks.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href="hts-at.html"&gt;HTS-AT&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;a transformer-based model with four Swintransformer blocks, achieving SOTAs on three audio classification datasets.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For both, they use the 2nd last layer's output. For PANNs, it's a 2048-sized embedding, and for HTSAT, it's a 768-sized embedding.&lt;/p&gt;
&lt;p&gt;For text encoder, they experiment with:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;CLIP transformer (output dimension 512)&lt;/li&gt;
&lt;li&gt;BERT (output dimension 768)&lt;/li&gt;
&lt;li&gt;Roberta (output dimension 768)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="feature-fusion-for-variable-length-audio"&gt;Feature Fusion for Variable-Length Audio&lt;/h3&gt;
&lt;p&gt;Audio is a natural variable length, unlike image data, which we can resize to "unified resolution" (i.e. 224x224).&lt;/p&gt;
&lt;p&gt;A common approach is to average per-frame or per-chunk audio embeddings as output. However, this is not computationally efficient on long audio.&lt;/p&gt;
&lt;p&gt;Enter &lt;a href="feature-fusion.html"&gt;Feature-Fusion&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;It allows them to train on different lengths of audio inputs in constant computation time by combining coarsely global and randomly sampled local information.&lt;/p&gt;
&lt;p&gt;For an audio in T seconds and a fixed chunk duration d = 10 seconds:&lt;/p&gt;
&lt;p&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;T&lt;/mi&gt;&lt;mo&gt;&amp;lt;&lt;/mo&gt;&lt;mi&gt;d&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;T &amp;lt; d&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.72243em;vertical-align:-0.0391em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.13889em;"&gt;T&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;&amp;lt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.69444em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;d&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;repeat the input, then pad with zero values. For example, 3-second input will be repeated 3 x 3 = 9 seconds and padded with 1-second zero values.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;T&lt;/mi&gt;&lt;mo&gt;&amp;gt;&lt;/mo&gt;&lt;mi&gt;d&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;T &amp;gt; d&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.72243em;vertical-align:-0.0391em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.13889em;"&gt;T&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;&amp;gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.69444em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;d&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;First, downsample the input from T to d-second (10 seconds) as global input. These are the global inputs.&lt;/li&gt;
&lt;li&gt;Then, randomly slice three d-second clips: in front 1/3, then middle 1/3 and back 1/3 of the input. These are the local inputs.&lt;/li&gt;
&lt;li&gt;Send these &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mn&gt;4&lt;/mn&gt;&lt;mtext&gt; &lt;/mtext&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;mtext&gt; &lt;/mtext&gt;&lt;mi&gt;d&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;4 \ x \ d&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.69444em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;4&lt;/span&gt;&lt;span class="mspace"&gt; &lt;/span&gt;&lt;span class="mord mathdefault"&gt;x&lt;/span&gt;&lt;span class="mspace"&gt; &lt;/span&gt;&lt;span class="mord mathdefault"&gt;d&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; inputs to the mel encoder to get the initial features.&lt;/li&gt;
&lt;li&gt;send the three local inputs to the 2D Conv layer with a 3-stride in the time axis to convert to one feature.&lt;/li&gt;
&lt;li&gt;Now fuse the local feature &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;msubsup&gt;&lt;mi&gt;X&lt;/mi&gt;&lt;mrow&gt;&lt;mi&gt;l&lt;/mi&gt;&lt;mi&gt;o&lt;/mi&gt;&lt;mi&gt;c&lt;/mi&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mi&gt;l&lt;/mi&gt;&lt;/mrow&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;/msubsup&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;X^{a}_{local}&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.9664379999999999em;vertical-align:-0.2831079999999999em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault" style="margin-right:0.07847em;"&gt;X&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.664392em;"&gt;&lt;span style="top:-2.4168920000000003em;margin-left:-0.07847em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathdefault mtight" style="margin-right:0.01968em;"&gt;l&lt;/span&gt;&lt;span class="mord mathdefault mtight"&gt;o&lt;/span&gt;&lt;span class="mord mathdefault mtight"&gt;c&lt;/span&gt;&lt;span class="mord mathdefault mtight"&gt;a&lt;/span&gt;&lt;span class="mord mathdefault mtight" style="margin-right:0.01968em;"&gt;l&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-3.063em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathdefault mtight"&gt;a&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.2831079999999999em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; and the global feature &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;msubsup&gt;&lt;mi&gt;X&lt;/mi&gt;&lt;mrow&gt;&lt;mi&gt;g&lt;/mi&gt;&lt;mi&gt;l&lt;/mi&gt;&lt;mi&gt;o&lt;/mi&gt;&lt;mi&gt;b&lt;/mi&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mi&gt;l&lt;/mi&gt;&lt;/mrow&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;/msubsup&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;X^{a}_{global}&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1.1025459999999998em;vertical-align:-0.4192159999999999em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault" style="margin-right:0.07847em;"&gt;X&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.664392em;"&gt;&lt;span style="top:-2.4168920000000003em;margin-left:-0.07847em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathdefault mtight" style="margin-right:0.03588em;"&gt;g&lt;/span&gt;&lt;span class="mord mathdefault mtight" style="margin-right:0.01968em;"&gt;l&lt;/span&gt;&lt;span class="mord mathdefault mtight"&gt;o&lt;/span&gt;&lt;span class="mord mathdefault mtight"&gt;b&lt;/span&gt;&lt;span class="mord mathdefault mtight"&gt;a&lt;/span&gt;&lt;span class="mord mathdefault mtight" style="margin-right:0.01968em;"&gt;l&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-3.063em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathdefault mtight"&gt;a&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.4192159999999999em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;: &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;msubsup&gt;&lt;mi&gt;X&lt;/mi&gt;&lt;mrow&gt;&lt;mi&gt;f&lt;/mi&gt;&lt;mi&gt;u&lt;/mi&gt;&lt;mi&gt;s&lt;/mi&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;mi&gt;o&lt;/mi&gt;&lt;mi&gt;n&lt;/mi&gt;&lt;/mrow&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;/msubsup&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mi&gt;λ&lt;/mi&gt;&lt;msubsup&gt;&lt;mi&gt;X&lt;/mi&gt;&lt;mrow&gt;&lt;mi&gt;g&lt;/mi&gt;&lt;mi&gt;l&lt;/mi&gt;&lt;mi&gt;o&lt;/mi&gt;&lt;mi&gt;b&lt;/mi&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mi&gt;l&lt;/mi&gt;&lt;/mrow&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;/msubsup&gt;&lt;mi mathvariant="normal"&gt;.&lt;/mi&gt;&lt;mo&gt;+&lt;/mo&gt;&lt;mo stretchy="false"&gt;(&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;mi&gt;α&lt;/mi&gt;&lt;mo stretchy="false"&gt;)&lt;/mo&gt;&lt;msubsup&gt;&lt;mi&gt;X&lt;/mi&gt;&lt;mrow&gt;&lt;mi&gt;l&lt;/mi&gt;&lt;mi&gt;o&lt;/mi&gt;&lt;mi&gt;c&lt;/mi&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mi&gt;l&lt;/mi&gt;&lt;/mrow&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;/msubsup&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;X^{x}_{fusion} = \lambda X^{a}_{global}.+ (1 - \alpha)X^{a}_{local}&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1.1025459999999998em;vertical-align:-0.4192159999999999em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault" style="margin-right:0.07847em;"&gt;X&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.664392em;"&gt;&lt;span style="top:-2.4168920000000003em;margin-left:-0.07847em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathdefault mtight" style="margin-right:0.10764em;"&gt;f&lt;/span&gt;&lt;span class="mord mathdefault mtight"&gt;u&lt;/span&gt;&lt;span class="mord mathdefault mtight"&gt;s&lt;/span&gt;&lt;span class="mord mathdefault mtight"&gt;i&lt;/span&gt;&lt;span class="mord mathdefault mtight"&gt;o&lt;/span&gt;&lt;span class="mord mathdefault mtight"&gt;n&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-3.063em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathdefault mtight"&gt;x&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.4192159999999999em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1.1136559999999998em;vertical-align:-0.4192159999999999em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;λ&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault" style="margin-right:0.07847em;"&gt;X&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.664392em;"&gt;&lt;span style="top:-2.4168920000000003em;margin-left:-0.07847em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathdefault mtight" style="margin-right:0.03588em;"&gt;g&lt;/span&gt;&lt;span class="mord mathdefault mtight" style="margin-right:0.01968em;"&gt;l&lt;/span&gt;&lt;span class="mord mathdefault mtight"&gt;o&lt;/span&gt;&lt;span class="mord mathdefault mtight"&gt;b&lt;/span&gt;&lt;span class="mord mathdefault mtight"&gt;a&lt;/span&gt;&lt;span class="mord mathdefault mtight" style="margin-right:0.01968em;"&gt;l&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-3.063em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathdefault mtight"&gt;a&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.4192159999999999em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mord"&gt;.&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;+&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1em;vertical-align:-0.25em;"&gt;&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord"&gt;1&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;−&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1.033108em;vertical-align:-0.2831079999999999em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.0037em;"&gt;α&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault" style="margin-right:0.07847em;"&gt;X&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.664392em;"&gt;&lt;span style="top:-2.4168920000000003em;margin-left:-0.07847em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathdefault mtight" style="margin-right:0.01968em;"&gt;l&lt;/span&gt;&lt;span class="mord mathdefault mtight"&gt;o&lt;/span&gt;&lt;span class="mord mathdefault mtight"&gt;c&lt;/span&gt;&lt;span class="mord mathdefault mtight"&gt;a&lt;/span&gt;&lt;span class="mord mathdefault mtight" style="margin-right:0.01968em;"&gt;l&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-3.063em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathdefault mtight"&gt;a&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.2831079999999999em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;, where &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;α&lt;/mi&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mi&gt;f&lt;/mi&gt;&lt;mi&gt;A&lt;/mi&gt;&lt;mi&gt;F&lt;/mi&gt;&lt;mi&gt;F&lt;/mi&gt;&lt;mo stretchy="false"&gt;(&lt;/mo&gt;&lt;msubsup&gt;&lt;mi&gt;X&lt;/mi&gt;&lt;mrow&gt;&lt;mi&gt;g&lt;/mi&gt;&lt;mi&gt;l&lt;/mi&gt;&lt;mi&gt;o&lt;/mi&gt;&lt;mi&gt;b&lt;/mi&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mi&gt;l&lt;/mi&gt;&lt;/mrow&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;/msubsup&gt;&lt;mo separator="true"&gt;,&lt;/mo&gt;&lt;msubsup&gt;&lt;mi&gt;X&lt;/mi&gt;&lt;mrow&gt;&lt;mi&gt;l&lt;/mi&gt;&lt;mi&gt;o&lt;/mi&gt;&lt;mi&gt;c&lt;/mi&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mi&gt;l&lt;/mi&gt;&lt;/mrow&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;/msubsup&gt;&lt;mo stretchy="false"&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;α = fAF F (X^{a}_{global}, X^a_{local})&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.43056em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.0037em;"&gt;α&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1.169216em;vertical-align:-0.4192159999999999em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.10764em;"&gt;f&lt;/span&gt;&lt;span class="mord mathdefault"&gt;A&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.13889em;"&gt;F&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.13889em;"&gt;F&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault" style="margin-right:0.07847em;"&gt;X&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.664392em;"&gt;&lt;span style="top:-2.4168920000000003em;margin-left:-0.07847em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathdefault mtight" style="margin-right:0.03588em;"&gt;g&lt;/span&gt;&lt;span class="mord mathdefault mtight" style="margin-right:0.01968em;"&gt;l&lt;/span&gt;&lt;span class="mord mathdefault mtight"&gt;o&lt;/span&gt;&lt;span class="mord mathdefault mtight"&gt;b&lt;/span&gt;&lt;span class="mord mathdefault mtight"&gt;a&lt;/span&gt;&lt;span class="mord mathdefault mtight" style="margin-right:0.01968em;"&gt;l&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-3.063em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathdefault mtight"&gt;a&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.4192159999999999em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mpunct"&gt;,&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault" style="margin-right:0.07847em;"&gt;X&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.664392em;"&gt;&lt;span style="top:-2.4168920000000003em;margin-left:-0.07847em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathdefault mtight" style="margin-right:0.01968em;"&gt;l&lt;/span&gt;&lt;span class="mord mathdefault mtight"&gt;o&lt;/span&gt;&lt;span class="mord mathdefault mtight"&gt;c&lt;/span&gt;&lt;span class="mord mathdefault mtight"&gt;a&lt;/span&gt;&lt;span class="mord mathdefault mtight" style="margin-right:0.01968em;"&gt;l&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-3.063em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mathdefault mtight"&gt;a&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.2831079999999999em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; is a factor obtained by &lt;a href="https://arxiv.org/abs/2009.14082"&gt;Attention Feature Fusion&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Code from the repo:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;mel&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;get_mel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;audio_data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;audio_cfg&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;ranges&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;array_split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;total_frames&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;chunk_frames&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)),&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ranges&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="c1"&gt;# if the audio is too short, we use the first chunk&lt;/span&gt;
    &lt;span class="n"&gt;ranges&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ranges&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="c1"&gt;# If the audio is too short, we use the first chunk&lt;/span&gt;
    &lt;span class="n"&gt;ranges&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="c1"&gt;# randomly choose index for each part&lt;/span&gt;
&lt;span class="n"&gt;idx_front&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;random&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;choice&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ranges&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="n"&gt;idx_middle&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;random&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;choice&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ranges&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="n"&gt;idx_back&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;random&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;choice&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ranges&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;

&lt;span class="c1"&gt;# select mel parts for local inputs&lt;/span&gt;
&lt;span class="n"&gt;mel_chunk_front&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;mel&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;idx_front&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;idx_front&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;chunk_frames&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;:]&lt;/span&gt;
&lt;span class="n"&gt;mel_chunk_middle&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;mel&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;idx_middle&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;idx_middle&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;chunk_frames&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;:]&lt;/span&gt;
&lt;span class="n"&gt;mel_chunk_back&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;mel&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;idx_back&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;idx_back&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;chunk_frames&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;:]&lt;/span&gt;

&lt;span class="c1"&gt;# shrink the mel to create global inputs&lt;/span&gt;
&lt;span class="n"&gt;mel_shrink&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;torchvision&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;transforms&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Resize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;chunk_frames&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;audio_cfg&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;mel_bins&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]])(&lt;/span&gt;&lt;span class="n"&gt;mel&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;])[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="c1"&gt;# stack&lt;/span&gt;
&lt;span class="n"&gt;mel_fusion&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;torch&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;stack&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="n"&gt;mel_shrink&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;mel_chunk_front&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;mel_chunk_middle&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;mel_chunk_back&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;dim&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Compared with the "slice &amp;amp; vote" method, the feature fusion saves training time as we only process audio slices in the first few layers.&lt;/p&gt;
&lt;h3 id="keyword-to-caption-augmentation"&gt;Keyword-to-Caption Augmentation&lt;/h3&gt;
&lt;p&gt;See the Main Contributions section.&lt;/p&gt;
&lt;h2 id="experiments"&gt;Experiments&lt;/h2&gt;
&lt;p&gt;They evaluated two initial tasks using recall and mean average precision (mAP) on audio-to-text and text-to-audio:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Experiment with different audio and text encoders to get the best baseline model.&lt;/li&gt;
&lt;li&gt;Experiment with various dataset sizes, using feature fusion and keyword-to-caption augmentation to verify the efficacy of the proposed methods.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Then, they do zero-shot and supervised audio classification experiments to evaluate the generalisation ability of the downstream tasks.&lt;/p&gt;
&lt;h3 id="hyper-parameters"&gt;Hyper-parameters&lt;/h3&gt;
&lt;h4 id="audio-settings"&gt;Audio settings&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;10-second input length&lt;/li&gt;
&lt;li&gt;480 hop size&lt;/li&gt;
&lt;li&gt;1024 window size&lt;/li&gt;
&lt;li&gt;64 mel-bins to compute STFTs and mel-spectrograms&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So, each input sent to the audio encoder is of the shape &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mo stretchy="false"&gt;(&lt;/mo&gt;&lt;mi&gt;T&lt;/mi&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mn&gt;1024&lt;/mn&gt;&lt;mo separator="true"&gt;,&lt;/mo&gt;&lt;mi&gt;F&lt;/mi&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mn&gt;64&lt;/mn&gt;&lt;mo stretchy="false"&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;(T = 1024, F = 64)&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1em;vertical-align:-0.25em;"&gt;&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.13889em;"&gt;T&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.8777699999999999em;vertical-align:-0.19444em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;1&lt;/span&gt;&lt;span class="mord"&gt;0&lt;/span&gt;&lt;span class="mord"&gt;2&lt;/span&gt;&lt;span class="mord"&gt;4&lt;/span&gt;&lt;span class="mpunct"&gt;,&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.13889em;"&gt;F&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1em;vertical-align:-0.25em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;6&lt;/span&gt;&lt;span class="mord"&gt;4&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;When training the model without the feature fusion, the audio longer than 10 seconds will be randomly chunked into a 10-second segment.&lt;/p&gt;
&lt;h4 id="text-settings"&gt;Text settings&lt;/h4&gt;
&lt;p&gt;Tokenise the text with a maximum token length of 77&lt;/p&gt;
&lt;h4 id="optimiser"&gt;Optimiser&lt;/h4&gt;
&lt;p&gt;Use the &lt;a href="adam.html"&gt;Adam&lt;/a&gt; optimiser with β1 = 0.99, β2 = 0.9 with a warm-up and cosine learning rate decay at a basic learning rate of 10-4.&lt;/p&gt;
&lt;h4 id="batch-sizes"&gt;Batch sizes&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Batch size of 768 on the AudioCaps + Clotho dataset&lt;/li&gt;
&lt;li&gt;2304 on the training dataset containing LAION-Audio-630K&lt;/li&gt;
&lt;li&gt;4608 on the training dataset containing the AudioSet&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="epochs"&gt;Epochs&lt;/h4&gt;
&lt;p&gt;We train the model for 45 epochs.&lt;/p&gt;
&lt;h3 id="text-to-audio-retrieval"&gt;Text-to-Audio Retrieval&lt;/h3&gt;
&lt;p&gt;They experiment to find the best audio and text encoder for retrieval tasks.&lt;/p&gt;
&lt;p&gt;Combine two audio encoders with three text encoders loaded from pre-trained checkpoints.&lt;/p&gt;
&lt;p&gt;In this experiment, train on &lt;a href="https://audiocaps.github.io/"&gt;AudioCaps&lt;/a&gt; and &lt;a href="https://zenodo.org/records/3490684"&gt;Clotho&lt;/a&gt; datasets, and report the best mAP@10 on audio-to-text (A→T) and text-to-audio (T→A) perspectives&lt;/p&gt;
&lt;p&gt;Results:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Audio encoder: &lt;a href="https://arxiv.org/abs/2202.00874"&gt;HTS-AT&lt;/a&gt; better than &lt;a href="https://arxiv.org/abs/1912.10211"&gt;PANNs&lt;/a&gt; combined with RoBERTa or BERT.&lt;/li&gt;
&lt;li&gt;Text encoder: RoBERTa beats BERT. CLIP transformer worst.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img alt="" src="../../_media/large-scale-contrastive-language-audio-retraining-with-feature-fusion-table-2.png"&gt;&lt;/p&gt;
&lt;h4 id="dataset-scale"&gt;Dataset Scale&lt;/h4&gt;
&lt;p&gt;Now, they use the HTSAT-RoBERTa model to perform text-to-audio retrieval experiments across the datasets.&lt;/p&gt;
&lt;p&gt;This task uses the same metrics to compute recall scores at different ranks.&lt;/p&gt;
&lt;p&gt;In the training set, they gradually increase the scale of the dataset.&lt;/p&gt;
&lt;p&gt;They find that scaling up the dataset from "AudioCaps + Clotho" to "LA." does not improve the result on the AudioCaps evaluation set but gets better performance on the Clotho evaluation set.&lt;/p&gt;
&lt;p&gt;One reason is that AudioCaps contains audio similar to AudioSet, on which the audio encoder's loaded checkpoint is pre-trained.&lt;/p&gt;
&lt;p&gt;When the model receives more data from other sources, it increases its generalisation but moves the distribution out of AudioSet data.&lt;/p&gt;
&lt;p&gt;Therefore, the performance on AudioCaps drops, but that on Clotho increases a lot, demonstrating a trade-off of the model to keep the performance among different types of audio.&lt;/p&gt;
&lt;h4 id="keyword-to-caption-and-feature-fusion"&gt;Keyword-to-Caption and Feature Fusion&lt;/h4&gt;
&lt;p&gt;They observe performance improvements when adding the feature fusion mechanism and keyword-to-caption augmentation to the model.&lt;/p&gt;
&lt;p&gt;Feature fusion is effective, especially in the Clotho dataset, because it contains longer audio data (&amp;gt; 10 seconds).&lt;/p&gt;
&lt;p&gt;When they add AudioSet into the training set with either template prompting or keyword-to-caption augmentation, we can see the performance increases again on AudioCaps while decreasing on Clotho.&lt;/p&gt;
&lt;p&gt;This result further confirms the trade-off performance between AudioCaps and Clotho datasets mentioned above.&lt;/p&gt;
&lt;p&gt;Also, keyword-to-caption augmentation works better than the template text prompting method on most metrics.&lt;/p&gt;
&lt;p&gt;As a result, our best model outperforms previous methods on most metrics (mainly R@1=36.7% on AudioCaps and R@1=18.2% on Clotho) in the text-to-audio retrieval tasks.&lt;/p&gt;
&lt;p&gt;We show that training on large-scale datasets (LAION-Audio-630K and AudioSet with keyword-to-caption augmentation) and feature fusion can improve model performance.&lt;/p&gt;
&lt;p&gt;&lt;img alt="" src="../../_media/large-scale-contrastive-language-audio-pre-training-with-feature-fusion-and-keyword-to-caption-augmentation-table-3.png"&gt;&lt;/p&gt;
&lt;h3 id="zero-shot-audio-classification"&gt;Zero-shot Audio Classification&lt;/h3&gt;
&lt;p&gt;To study the model generalisation and robustness, they conducted zero-shot audio classification experiments on three top-performing models in previous experiments.&lt;/p&gt;
&lt;p&gt;They evaluate models on three audio classification datasets: &lt;a href="https://www.cs.cmu.edu/~alnu/tlwled/esc50.htm"&gt;ESC50&lt;/a&gt;, &lt;a href="https://arxiv.org/abs/2004.14368"&gt;VGGSound&lt;/a&gt;, and &lt;a href="https://urbansounddataset.weebly.com/urbansound8k.html"&gt;Urbansound8K&lt;/a&gt;. They use top-1 accuracy as the metric.&lt;/p&gt;
&lt;p&gt;They classify audio by performing audio-to-text retrieval with each text corresponding to the text prompt converted from class label via "This a sound of the &lt;em&gt;label&lt;/em&gt;.".&lt;/p&gt;
&lt;p&gt;There's some dataset overlap between the training data and the zero-shot dataset. They excluded all the overlap samples and performed a zero-shot evaluation on the remaining dataset.&lt;/p&gt;
&lt;p&gt;&lt;img alt="" src="../../_media/large-scale-contrastive-language-audio-pre-training-with-feature-fusion-and-keyword-to-caption-augmentation-zeroshot.png"&gt;&lt;/p&gt;
&lt;p&gt;As shown in Table 4, the models achieve new SoTAs of zero-shot audio classification across all three datasets.&lt;/p&gt;
&lt;p&gt;Keyword-to-caption augmentation increases the performance of VGGsound and US8K by adding more text captions to "enrich" the text embedding space.&lt;/p&gt;
&lt;p&gt;&lt;img alt="" src="../../_media/large-scale-contrastive-language-audio-pre-training-with-feature-fusion-and-keyword-to-caption-augmentation-table-4.png"&gt;&lt;/p&gt;
&lt;h3 id="supervised-audio-classification"&gt;Supervised Audio Classification&lt;/h3&gt;
&lt;p&gt;They perform supervised audio classification by fine-tuning the audio encoder on &lt;a href="https://paperswithcode.com/dataset/fsd50k"&gt;FSD50K&lt;/a&gt; and &lt;a href="https://arxiv.org/abs/2004.14368"&gt;VGGSound&lt;/a&gt; datasets. They do not run experiments on &lt;a href="https://github.com/karolpiczak/ESC-50"&gt;ESC50&lt;/a&gt; or &lt;a href="https://urbansounddataset.weebly.com/urbansound8k.html"&gt;Urbansound8K&lt;/a&gt; due to data leakage concerns. mAP is used as an evaluation metric.&lt;/p&gt;
&lt;p&gt;Feature-fusion enables the model to handle variable-length input and performs better than previous models.&lt;/p&gt;
&lt;p&gt;They outperform the current state-of-the-art on the VGGSound dataset, close to the state-of-the-art on the FSD50K dataset.&lt;/p&gt;
&lt;p&gt;&lt;img alt="" src="../../_media/large-scale-contrastive-language-audio-pre-training-with-feature-fusion-and-keyword-to-caption-augmentation-supervised.png"&gt;&lt;/p&gt;
&lt;h2 id="future-work"&gt;Future Work&lt;/h2&gt;
&lt;p&gt;They want to collect an even larger dataset.&lt;/p&gt;
&lt;p&gt;Apply representations to other downstream tasks like audio synthesis and separation.&lt;/p&gt;</content><category term="reference"/><category term="MachineLearning"/><category term="AudioEngineering"/></entry><entry><title>CLIP</title><link href="http://localhost:8000/clip.html" rel="alternate"/><published>2023-12-06T00:00:00+10:00</published><updated>2023-12-06T00:00:00+10:00</updated><author><name>Lex Toumbourou</name></author><id>tag:localhost,2023-12-06:/clip.html</id><summary type="html">&lt;p&gt;a model that can associate textual representations with images.&lt;/p&gt;</summary><content type="html">&lt;p&gt;&lt;strong&gt;Contrastive Language-Image Pretraining&lt;/strong&gt; or &lt;strong&gt;CLIP&lt;/strong&gt; is an approach to training a model to associate images with their textual representations using &lt;a href="contrastive-loss.html"&gt;Contrastive Loss&lt;/a&gt;. This allows for high-performing &lt;a href="zero-shot-learning.html"&gt;Zero-Shot Learning&lt;/a&gt; i.e. the model can generalise to new tasks without fine-tuning.&lt;/p&gt;
&lt;p&gt;The architecture is a "simplified version of &lt;a href="convirt.html"&gt;ConVIRT&lt;/a&gt;" &lt;sup id="fnref:1"&gt;&lt;a class="footnote-ref" href="#fn:1"&gt;1&lt;/a&gt;&lt;/sup&gt; trained from scratch.&lt;/p&gt;
&lt;p&gt;From paper &lt;a href="learning-transferable-visual-models-from-natural-language-supervision.html"&gt;Learning Transferable Visual Models From Natural Language Supervision&lt;/a&gt;&lt;/p&gt;
&lt;div class="footnote"&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id="fn:1"&gt;
&lt;p&gt;Radford, A., Kim, J. W., Hallacy, C., Ramesh, A., Goh, G., Agarwal, S., Sastry, G., Askell, A., Mishkin, P., Clark, J., Krueger, G., &amp;amp; Sutskever, I. (2021). Learning transferable visual models from natural language supervision. arXiv preprint arXiv:2103.00020. https://arxiv.org/abs/2103.00020&amp;#160;&lt;a class="footnote-backref" href="#fnref:1" title="Jump back to footnote 1 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</content><category term="permanent"/></entry><entry><title>Predicate Logic</title><link href="http://localhost:8000/predicate-logic.html" rel="alternate"/><published>2023-10-13T00:00:00+10:00</published><updated>2023-10-13T00:00:00+10:00</updated><author><name>Lex Toumbourou</name></author><id>tag:localhost,2023-10-13:/predicate-logic.html</id><summary type="html">&lt;p&gt;An extension of propositional logic that involves variables and quantifiers.&lt;/p&gt;</summary><content type="html">&lt;p&gt;An extension of &lt;a href="propositional-logic.html"&gt;Propositional Logic&lt;/a&gt; that uses variables and quantifiers to represent and analyse &lt;a href="logical-statement.html"&gt;Statement&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="predicate"&gt;&lt;a href="predicate.html"&gt;Predicate&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Is a &lt;a href="logical-statement.html"&gt;Statement&lt;/a&gt; that includes a variable.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;P&lt;/mi&gt;&lt;mo stretchy="false"&gt;(&lt;/mo&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;mo stretchy="false"&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;P(x)&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1em;vertical-align:-0.25em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.13889em;"&gt;P&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord mathdefault"&gt;x&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;: "x is a prime number"&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;A predicate becomes a proposition when the variable are substituted for values.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;P&lt;/mi&gt;&lt;mo stretchy="false"&gt;(&lt;/mo&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;mo stretchy="false"&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;P(2)&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1em;vertical-align:-0.25em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.13889em;"&gt;P&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord"&gt;2&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;: "2 is a prime number" (True)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="quantifiers"&gt;&lt;a href="logical-quantifiers.html"&gt;Quantifiers&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Quantifiers describe how many of a thing there are.&lt;/p&gt;
&lt;h3 id="universal-quantifier"&gt;&lt;a href="universal-quantifier.html"&gt;Universal Quantifier&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Symbol: &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi mathvariant="normal"&gt;∀&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;\forall&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.69444em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;∀&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Means "For all" or "Every".&lt;/p&gt;
&lt;p&gt;Example:&lt;/p&gt;
&lt;p&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi mathvariant="normal"&gt;∀&lt;/mi&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;mo separator="true"&gt;,&lt;/mo&gt;&lt;mi&gt;P&lt;/mi&gt;&lt;mo stretchy="false"&gt;(&lt;/mo&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;mo stretchy="false"&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;\forall x, P(x)&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1em;vertical-align:-0.25em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;∀&lt;/span&gt;&lt;span class="mord mathdefault"&gt;x&lt;/span&gt;&lt;span class="mpunct"&gt;,&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.13889em;"&gt;P&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord mathdefault"&gt;x&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;: "For every x, x is a prime number"&lt;/p&gt;
&lt;h3 id="existential-quantifier"&gt;&lt;a href="existential-quantifier.html"&gt;Existential Quantifier&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Symbol: &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi mathvariant="normal"&gt;∃&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;\exists&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.69444em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;∃&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Means "There exists" or "Some".&lt;/p&gt;
&lt;p&gt;Example:&lt;/p&gt;
&lt;p&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi mathvariant="normal"&gt;∃&lt;/mi&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;mo separator="true"&gt;,&lt;/mo&gt;&lt;mi&gt;P&lt;/mi&gt;&lt;mo stretchy="false"&gt;(&lt;/mo&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;mo stretchy="false"&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;\exists x, P(x)&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1em;vertical-align:-0.25em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;∃&lt;/span&gt;&lt;span class="mord mathdefault"&gt;x&lt;/span&gt;&lt;span class="mpunct"&gt;,&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.13889em;"&gt;P&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord mathdefault"&gt;x&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;: "There exists an x such that x is a prime number"&lt;/p&gt;
&lt;h2 id="demorgans-laws-for-negating-quantifiers"&gt;DeMorgan's Laws for negating quantifiers&lt;/h2&gt;
&lt;h3 id="first-law"&gt;First law&lt;/h3&gt;
&lt;p&gt;The negation of "for all x, P(x)" is equivalent to "there exists an x such that not P(x)"&lt;/p&gt;
&lt;p&gt;&lt;span class="katex-display"&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mo&gt;∼&lt;/mo&gt;&lt;mo stretchy="false"&gt;[&lt;/mo&gt;&lt;mo stretchy="false"&gt;(&lt;/mo&gt;&lt;mi mathvariant="normal"&gt;∀&lt;/mi&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;mo stretchy="false"&gt;)&lt;/mo&gt;&lt;mi&gt;P&lt;/mi&gt;&lt;mo stretchy="false"&gt;(&lt;/mo&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;mo stretchy="false"&gt;)&lt;/mo&gt;&lt;mo stretchy="false"&gt;]&lt;/mo&gt;&lt;mo&gt;≡&lt;/mo&gt;&lt;mo stretchy="false"&gt;(&lt;/mo&gt;&lt;mi mathvariant="normal"&gt;∃&lt;/mi&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;mo stretchy="false"&gt;)&lt;/mo&gt;&lt;mo stretchy="false"&gt;[&lt;/mo&gt;&lt;mo&gt;∼&lt;/mo&gt;&lt;mi&gt;P&lt;/mi&gt;&lt;mo stretchy="false"&gt;(&lt;/mo&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;mo stretchy="false"&gt;)&lt;/mo&gt;&lt;mo stretchy="false"&gt;]&lt;/mo&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;
\sim[(\forall x)P(x)] \equiv (\exists x)[\sim P(x)]
&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.36687em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;∼&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1em;vertical-align:-0.25em;"&gt;&lt;/span&gt;&lt;span class="mopen"&gt;[&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord"&gt;∀&lt;/span&gt;&lt;span class="mord mathdefault"&gt;x&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.13889em;"&gt;P&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord mathdefault"&gt;x&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;span class="mclose"&gt;]&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;≡&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1em;vertical-align:-0.25em;"&gt;&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord"&gt;∃&lt;/span&gt;&lt;span class="mord mathdefault"&gt;x&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;span class="mopen"&gt;[&lt;/span&gt;&lt;span class="mrel"&gt;∼&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1em;vertical-align:-0.25em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.13889em;"&gt;P&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord mathdefault"&gt;x&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;span class="mclose"&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h2 id="second-law"&gt;Second law&lt;/h2&gt;
&lt;p&gt;The negation of "there exists an x such that P(x)" is equivalent to "for all x, not P(x)"&lt;/p&gt;
&lt;p&gt;&lt;span class="katex-display"&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mo&gt;∼&lt;/mo&gt;&lt;mo stretchy="false"&gt;[&lt;/mo&gt;&lt;mo stretchy="false"&gt;(&lt;/mo&gt;&lt;mi mathvariant="normal"&gt;∃&lt;/mi&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;mo stretchy="false"&gt;)&lt;/mo&gt;&lt;mi&gt;P&lt;/mi&gt;&lt;mo stretchy="false"&gt;(&lt;/mo&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;mo stretchy="false"&gt;)&lt;/mo&gt;&lt;mo stretchy="false"&gt;]&lt;/mo&gt;&lt;mo&gt;≡&lt;/mo&gt;&lt;mo stretchy="false"&gt;(&lt;/mo&gt;&lt;mi mathvariant="normal"&gt;∀&lt;/mi&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;mo stretchy="false"&gt;)&lt;/mo&gt;&lt;mo stretchy="false"&gt;[&lt;/mo&gt;&lt;mo&gt;∼&lt;/mo&gt;&lt;mi&gt;P&lt;/mi&gt;&lt;mo stretchy="false"&gt;(&lt;/mo&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;mo stretchy="false"&gt;)&lt;/mo&gt;&lt;mo stretchy="false"&gt;]&lt;/mo&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;
\sim[(\exists x)P(x)] \equiv (\forall x)[\sim P(x)]
&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.36687em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;∼&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1em;vertical-align:-0.25em;"&gt;&lt;/span&gt;&lt;span class="mopen"&gt;[&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord"&gt;∃&lt;/span&gt;&lt;span class="mord mathdefault"&gt;x&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.13889em;"&gt;P&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord mathdefault"&gt;x&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;span class="mclose"&gt;]&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;≡&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1em;vertical-align:-0.25em;"&gt;&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord"&gt;∀&lt;/span&gt;&lt;span class="mord mathdefault"&gt;x&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;span class="mopen"&gt;[&lt;/span&gt;&lt;span class="mrel"&gt;∼&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1em;vertical-align:-0.25em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.13889em;"&gt;P&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord mathdefault"&gt;x&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;span class="mclose"&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;</content><category term="permanent"/><category term="DiscreteMath"/><category term="MathematicalLogic"/></entry><entry><title>Propositional Logic</title><link href="http://localhost:8000/propositional-logic.html" rel="alternate"/><published>2023-10-12T00:00:00+10:00</published><updated>2023-10-12T00:00:00+10:00</updated><author><name>Lex Toumbourou</name></author><id>tag:localhost,2023-10-12:/propositional-logic.html</id><summary type="html">&lt;p&gt;A system that deals with statements that are either true or false&lt;/p&gt;</summary><content type="html">&lt;p&gt;&lt;strong&gt;Propositional Logic&lt;/strong&gt; is a system that deals with &lt;a href="propositions.html"&gt;Propositions&lt;/a&gt; (statements).&lt;/p&gt;
&lt;p&gt;The truthfulness or falsity of a proposition is called its &lt;a href="truth-value.html"&gt;Truth Value&lt;/a&gt;. Denoted by &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;T&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;T&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.68333em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.13889em;"&gt;T&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; or &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;F&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;F&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.68333em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.13889em;"&gt;F&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;, or 1 and 0 in computer science.&lt;/p&gt;
&lt;p&gt;We can use connectives to change or combine the meaning of propositions. For example, &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi mathvariant="normal"&gt;¬&lt;/mi&gt;&lt;mi&gt;p&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;\neg p&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.625em;vertical-align:-0.19444em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;¬&lt;/span&gt;&lt;span class="mord mathdefault"&gt;p&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; negates the value of p. If it's true, it becomes false and vice versa.&lt;/p&gt;
&lt;h2 id="truth-table"&gt;&lt;a href="truth-table.html"&gt;Truth Table&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;A truth table allows us to consider all possible combinations of proposition logic systems.&lt;/p&gt;
&lt;p&gt;For example, consider &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi mathvariant="normal"&gt;¬&lt;/mi&gt;&lt;mi&gt;p&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;\neg p&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.625em;vertical-align:-0.19444em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;¬&lt;/span&gt;&lt;span class="mord mathdefault"&gt;p&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;p&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;p&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.625em;vertical-align:-0.19444em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;p&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/th&gt;
&lt;th&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi mathvariant="normal"&gt;¬&lt;/mi&gt;&lt;mi&gt;p&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;\neg p&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.625em;vertical-align:-0.19444em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;¬&lt;/span&gt;&lt;span class="mord mathdefault"&gt;p&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;We can use truth tables to help us understand the truth values of other connectives within propositional logic.&lt;/p&gt;
&lt;h2 id="connective"&gt;&lt;a href="logical-connective.html"&gt;Connective&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id="negation-not"&gt;&lt;a href="logical-negation.html"&gt;Negation&lt;/a&gt; (NOT)&lt;/h3&gt;
&lt;p&gt;Symbol: &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi mathvariant="normal"&gt;¬&lt;/mi&gt;&lt;mi&gt;p&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;\neg p&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.625em;vertical-align:-0.19444em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;¬&lt;/span&gt;&lt;span class="mord mathdefault"&gt;p&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;An operator that negates a proposition.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;p&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;p&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.625em;vertical-align:-0.19444em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;p&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; = I will pass my exam.&lt;/li&gt;
&lt;li&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi mathvariant="normal"&gt;¬&lt;/mi&gt;&lt;mtext&gt; &lt;/mtext&gt;&lt;mi&gt;p&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;\neg \ p&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.625em;vertical-align:-0.19444em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;¬&lt;/span&gt;&lt;span class="mspace"&gt; &lt;/span&gt;&lt;span class="mord mathdefault"&gt;p&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; = I will NOT pass my exam.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In &lt;a href="Boolean%20Algebra"&gt;Boolean Algebra&lt;/a&gt;, it's equivalent to &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;mi&gt;T&lt;/mi&gt;&lt;mo stretchy="false"&gt;(&lt;/mo&gt;&lt;mi&gt;p&lt;/mi&gt;&lt;mo stretchy="false"&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;1 - T(p)&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.72777em;vertical-align:-0.08333em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;1&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;−&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1em;vertical-align:-0.25em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.13889em;"&gt;T&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord mathdefault"&gt;p&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Truth table&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;p&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;p&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.625em;vertical-align:-0.19444em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;p&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/th&gt;
&lt;th&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi mathvariant="normal"&gt;¬&lt;/mi&gt;&lt;mi&gt;p&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;\neg p&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.625em;vertical-align:-0.19444em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;¬&lt;/span&gt;&lt;span class="mord mathdefault"&gt;p&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="disjunction-or"&gt;&lt;a href="logical-disjunction.html"&gt;Disjunction&lt;/a&gt; (OR)&lt;/h2&gt;
&lt;p&gt;Symbol: &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;p&lt;/mi&gt;&lt;mo&gt;∨&lt;/mo&gt;&lt;mi&gt;q&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;p \lor q&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.75em;vertical-align:-0.19444em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;p&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;∨&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.625em;vertical-align:-0.19444em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.03588em;"&gt;q&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;True when p OR q is true.&lt;/p&gt;
&lt;p&gt;Truth table&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;p&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;p&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.625em;vertical-align:-0.19444em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;p&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/th&gt;
&lt;th&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;q&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;q&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.625em;vertical-align:-0.19444em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.03588em;"&gt;q&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/th&gt;
&lt;th&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;p&lt;/mi&gt;&lt;mo&gt;∨&lt;/mo&gt;&lt;mi&gt;q&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;p \lor q&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.75em;vertical-align:-0.19444em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;p&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;∨&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.625em;vertical-align:-0.19444em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.03588em;"&gt;q&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Equivalent to &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;max&lt;/mi&gt;&lt;mo&gt;⁡&lt;/mo&gt;&lt;mo stretchy="false"&gt;(&lt;/mo&gt;&lt;mi&gt;T&lt;/mi&gt;&lt;mo stretchy="false"&gt;(&lt;/mo&gt;&lt;mi&gt;p&lt;/mi&gt;&lt;mo stretchy="false"&gt;)&lt;/mo&gt;&lt;mo separator="true"&gt;,&lt;/mo&gt;&lt;mi&gt;T&lt;/mi&gt;&lt;mo stretchy="false"&gt;(&lt;/mo&gt;&lt;mi&gt;q&lt;/mi&gt;&lt;mo stretchy="false"&gt;)&lt;/mo&gt;&lt;mo stretchy="false"&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;\max(T(p), T(q))&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1em;vertical-align:-0.25em;"&gt;&lt;/span&gt;&lt;span class="mop"&gt;max&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.13889em;"&gt;T&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord mathdefault"&gt;p&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;span class="mpunct"&gt;,&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.13889em;"&gt;T&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.03588em;"&gt;q&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h2 id="conjunction-and"&gt;&lt;a href="conjunction.html"&gt;Conjunction&lt;/a&gt; (AND)&lt;/h2&gt;
&lt;p&gt;Symbol: &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;p&lt;/mi&gt;&lt;mo&gt;∧&lt;/mo&gt;&lt;mi&gt;q&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;p \land q&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.75em;vertical-align:-0.19444em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;p&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;∧&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.625em;vertical-align:-0.19444em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.03588em;"&gt;q&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;True only when p AND q is true.&lt;/p&gt;
&lt;p&gt;Truth table:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;p&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;p&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.625em;vertical-align:-0.19444em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;p&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/th&gt;
&lt;th&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;q&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;q&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.625em;vertical-align:-0.19444em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.03588em;"&gt;q&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/th&gt;
&lt;th&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;p&lt;/mi&gt;&lt;mo&gt;∧&lt;/mo&gt;&lt;mi&gt;q&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;p \land q&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.75em;vertical-align:-0.19444em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;p&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;∧&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.625em;vertical-align:-0.19444em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.03588em;"&gt;q&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Equivalent to multiplication &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;T&lt;/mi&gt;&lt;mo stretchy="false"&gt;(&lt;/mo&gt;&lt;mi&gt;p&lt;/mi&gt;&lt;mo stretchy="false"&gt;)&lt;/mo&gt;&lt;mo&gt;×&lt;/mo&gt;&lt;mi&gt;T&lt;/mi&gt;&lt;mo stretchy="false"&gt;(&lt;/mo&gt;&lt;mi&gt;q&lt;/mi&gt;&lt;mo stretchy="false"&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;T(p) \times T(q)&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1em;vertical-align:-0.25em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.13889em;"&gt;T&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord mathdefault"&gt;p&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;×&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1em;vertical-align:-0.25em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.13889em;"&gt;T&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.03588em;"&gt;q&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h2 id="implication-ifthen"&gt;&lt;a href="logical-implication.html"&gt;Implication&lt;/a&gt; (If...Then)&lt;/h2&gt;
&lt;p&gt;Symbol: &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;p&lt;/mi&gt;&lt;mo&gt;→&lt;/mo&gt;&lt;mi&gt;q&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;p \rightarrow q&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.625em;vertical-align:-0.19444em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;p&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;→&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.625em;vertical-align:-0.19444em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.03588em;"&gt;q&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;If p is true, then q is true.&lt;/p&gt;
&lt;p&gt;Truth table&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;p&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;p&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.625em;vertical-align:-0.19444em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;p&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/th&gt;
&lt;th&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;q&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;q&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.625em;vertical-align:-0.19444em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.03588em;"&gt;q&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/th&gt;
&lt;th&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;p&lt;/mi&gt;&lt;mo&gt;→&lt;/mo&gt;&lt;mi&gt;q&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;p \rightarrow q&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.625em;vertical-align:-0.19444em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;p&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;→&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.625em;vertical-align:-0.19444em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.03588em;"&gt;q&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Think of it as a promise. Only false when promise is broken.&lt;/p&gt;
&lt;h2 id="bi-conditional-leftrightarrow"&gt;&lt;a href="logical-biconditional.html"&gt;Bi-conditional&lt;/a&gt;: &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mo&gt;↔&lt;/mo&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;\leftrightarrow&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.36687em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;↔&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;Symbol: &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;p&lt;/mi&gt;&lt;mo&gt;↔&lt;/mo&gt;&lt;mi&gt;q&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;p \leftrightarrow q&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.625em;vertical-align:-0.19444em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;p&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;↔&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.625em;vertical-align:-0.19444em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.03588em;"&gt;q&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Truth table&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;p&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;p&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.625em;vertical-align:-0.19444em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;p&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/th&gt;
&lt;th&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;q&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;q&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.625em;vertical-align:-0.19444em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.03588em;"&gt;q&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/th&gt;
&lt;th&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;p&lt;/mi&gt;&lt;mo&gt;↔&lt;/mo&gt;&lt;mi&gt;q&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;p \leftrightarrow q&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.625em;vertical-align:-0.19444em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;p&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;↔&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.625em;vertical-align:-0.19444em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.03588em;"&gt;q&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Equivalent to equality check: &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;T&lt;/mi&gt;&lt;mo stretchy="false"&gt;(&lt;/mo&gt;&lt;mi&gt;p&lt;/mi&gt;&lt;mo stretchy="false"&gt;)&lt;/mo&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mi&gt;T&lt;/mi&gt;&lt;mo stretchy="false"&gt;(&lt;/mo&gt;&lt;mi&gt;q&lt;/mi&gt;&lt;mo stretchy="false"&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;T(p) = T(q)&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1em;vertical-align:-0.25em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.13889em;"&gt;T&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord mathdefault"&gt;p&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1em;vertical-align:-0.25em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.13889em;"&gt;T&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.03588em;"&gt;q&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h2 id="exclusive-or"&gt;&lt;a href="logical-xor.html"&gt;Exclusive-Or&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Symbol: &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;p&lt;/mi&gt;&lt;mo&gt;⊕&lt;/mo&gt;&lt;mi&gt;q&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;p \oplus q&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.7777700000000001em;vertical-align:-0.19444em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;p&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;⊕&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.625em;vertical-align:-0.19444em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.03588em;"&gt;q&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;p or q but not both.&lt;/p&gt;
&lt;p&gt;Also called XOR.&lt;/p&gt;
&lt;p&gt;Truth Table&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;p&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;p&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.625em;vertical-align:-0.19444em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;p&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/th&gt;
&lt;th&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;q&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;q&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.625em;vertical-align:-0.19444em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.03588em;"&gt;q&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/th&gt;
&lt;th&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;p&lt;/mi&gt;&lt;mo&gt;⊕&lt;/mo&gt;&lt;mi&gt;q&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;p \oplus q&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.7777700000000001em;vertical-align:-0.19444em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;p&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;⊕&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.625em;vertical-align:-0.19444em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.03588em;"&gt;q&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Truth table is opposite of bi-conditional.&lt;/p&gt;
&lt;h2 id="operator-precendence"&gt;Operator Precendence&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi mathvariant="normal"&gt;¬&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;\neg&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.43056em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;¬&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mo&gt;∧&lt;/mo&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;\land&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.55556em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;∧&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mo&gt;∨&lt;/mo&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;\lor&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.55556em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;∨&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mo&gt;→&lt;/mo&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;\rightarrow&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.36687em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;→&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mo&gt;↔&lt;/mo&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;\leftrightarrow&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.36687em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;↔&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="tautology"&gt;Tautology&lt;/h2&gt;
&lt;p&gt;A statement that is always true.&lt;/p&gt;
&lt;p&gt;For example: &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;p&lt;/mi&gt;&lt;mo&gt;∨&lt;/mo&gt;&lt;mi mathvariant="normal"&gt;¬&lt;/mi&gt;&lt;mi&gt;p&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;p \lor \neg p&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.75em;vertical-align:-0.19444em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;p&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;∨&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.625em;vertical-align:-0.19444em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;¬&lt;/span&gt;&lt;span class="mord mathdefault"&gt;p&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; is always true.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;p&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;p&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.625em;vertical-align:-0.19444em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;p&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/th&gt;
&lt;th&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi mathvariant="normal"&gt;¬&lt;/mi&gt;&lt;mi&gt;p&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;\neg p&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.625em;vertical-align:-0.19444em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;¬&lt;/span&gt;&lt;span class="mord mathdefault"&gt;p&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/th&gt;
&lt;th&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;p&lt;/mi&gt;&lt;mo&gt;∨&lt;/mo&gt;&lt;mi mathvariant="normal"&gt;¬&lt;/mi&gt;&lt;mi&gt;p&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;p \lor \neg p&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.75em;vertical-align:-0.19444em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;p&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;∨&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.625em;vertical-align:-0.19444em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;¬&lt;/span&gt;&lt;span class="mord mathdefault"&gt;p&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="consistent"&gt;&lt;a href="logical-consistent.html"&gt;Consistent&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;A formula that is true in at least one scenario.&lt;/p&gt;
&lt;h2 id="contradiction"&gt;&lt;a href="logical-contradiction.html"&gt;Contradiction&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;A formula that is never true.&lt;/p&gt;
&lt;p&gt;For example: &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;p&lt;/mi&gt;&lt;mo&gt;∧&lt;/mo&gt;&lt;mi mathvariant="normal"&gt;¬&lt;/mi&gt;&lt;mi&gt;p&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;p \land \neg p&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.75em;vertical-align:-0.19444em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;p&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;∧&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.625em;vertical-align:-0.19444em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;¬&lt;/span&gt;&lt;span class="mord mathdefault"&gt;p&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;p&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;p&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.625em;vertical-align:-0.19444em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;p&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/th&gt;
&lt;th&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi mathvariant="normal"&gt;¬&lt;/mi&gt;&lt;mi&gt;p&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;\neg p&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.625em;vertical-align:-0.19444em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;¬&lt;/span&gt;&lt;span class="mord mathdefault"&gt;p&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/th&gt;
&lt;th&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;p&lt;/mi&gt;&lt;mo&gt;∧&lt;/mo&gt;&lt;mi mathvariant="normal"&gt;¬&lt;/mi&gt;&lt;mi&gt;p&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;p \land \neg p&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.75em;vertical-align:-0.19444em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;p&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;∧&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.625em;vertical-align:-0.19444em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;¬&lt;/span&gt;&lt;span class="mord mathdefault"&gt;p&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Also called "inconsistent".&lt;/p&gt;
&lt;h2 id="equivalence"&gt;Equivalence&lt;/h2&gt;
&lt;p&gt;If two formula are equivalent if they have identical truth tables.&lt;/p&gt;
&lt;p&gt;Denoted by: &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mo&gt;≡&lt;/mo&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;\equiv&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.46375em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;≡&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;A&lt;/mi&gt;&lt;mo&gt;≡&lt;/mo&gt;&lt;mi&gt;B&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;A \equiv B&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.68333em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;A&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;≡&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.68333em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.05017em;"&gt;B&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; means A and B have the same &lt;a href="truth-table.html"&gt;Truth Table&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Note: equivalence is relation, not connective.&lt;/p&gt;
&lt;p&gt;Can prove &lt;a href="de-morgans-laws.html"&gt;De Morgan's Laws&lt;/a&gt; using a truth table.&lt;/p&gt;
&lt;p&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi mathvariant="normal"&gt;¬&lt;/mi&gt;&lt;mo stretchy="false"&gt;(&lt;/mo&gt;&lt;mi&gt;p&lt;/mi&gt;&lt;mo&gt;∧&lt;/mo&gt;&lt;mi&gt;q&lt;/mi&gt;&lt;mo stretchy="false"&gt;)&lt;/mo&gt;&lt;mo&gt;≡&lt;/mo&gt;&lt;mi mathvariant="normal"&gt;¬&lt;/mi&gt;&lt;mi&gt;p&lt;/mi&gt;&lt;mo&gt;∨&lt;/mo&gt;&lt;mi mathvariant="normal"&gt;¬&lt;/mi&gt;&lt;mi&gt;q&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;\neg (p \land q) \equiv \neg p \lor \neg q&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1em;vertical-align:-0.25em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;¬&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord mathdefault"&gt;p&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;∧&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1em;vertical-align:-0.25em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.03588em;"&gt;q&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;≡&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.75em;vertical-align:-0.19444em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;¬&lt;/span&gt;&lt;span class="mord mathdefault"&gt;p&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;∨&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.625em;vertical-align:-0.19444em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;¬&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.03588em;"&gt;q&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;p&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;p&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.625em;vertical-align:-0.19444em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;p&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/th&gt;
&lt;th&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;q&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;q&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.625em;vertical-align:-0.19444em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.03588em;"&gt;q&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/th&gt;
&lt;th&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi mathvariant="normal"&gt;¬&lt;/mi&gt;&lt;mo stretchy="false"&gt;(&lt;/mo&gt;&lt;mi&gt;p&lt;/mi&gt;&lt;mo&gt;∧&lt;/mo&gt;&lt;mi&gt;q&lt;/mi&gt;&lt;mo stretchy="false"&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;\neg (p \land q)&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1em;vertical-align:-0.25em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;¬&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord mathdefault"&gt;p&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;∧&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1em;vertical-align:-0.25em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.03588em;"&gt;q&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/th&gt;
&lt;th&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi mathvariant="normal"&gt;¬&lt;/mi&gt;&lt;mi&gt;p&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;\neg p&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.625em;vertical-align:-0.19444em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;¬&lt;/span&gt;&lt;span class="mord mathdefault"&gt;p&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/th&gt;
&lt;th&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi mathvariant="normal"&gt;¬&lt;/mi&gt;&lt;mi&gt;q&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;\neg q&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.625em;vertical-align:-0.19444em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;¬&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.03588em;"&gt;q&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/th&gt;
&lt;th&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi mathvariant="normal"&gt;¬&lt;/mi&gt;&lt;mi&gt;p&lt;/mi&gt;&lt;mo&gt;∨&lt;/mo&gt;&lt;mi mathvariant="normal"&gt;¬&lt;/mi&gt;&lt;mi&gt;q&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;\neg p \lor \neg q&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.75em;vertical-align:-0.19444em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;¬&lt;/span&gt;&lt;span class="mord mathdefault"&gt;p&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;∨&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.625em;vertical-align:-0.19444em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;¬&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.03588em;"&gt;q&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mo stretchy="false"&gt;(&lt;/mo&gt;&lt;mi&gt;p&lt;/mi&gt;&lt;mo&gt;→&lt;/mo&gt;&lt;mi&gt;q&lt;/mi&gt;&lt;mo stretchy="false"&gt;)&lt;/mo&gt;&lt;mo&gt;≡&lt;/mo&gt;&lt;mo stretchy="false"&gt;(&lt;/mo&gt;&lt;mi mathvariant="normal"&gt;¬&lt;/mi&gt;&lt;mi&gt;p&lt;/mi&gt;&lt;mo&gt;∧&lt;/mo&gt;&lt;mi&gt;q&lt;/mi&gt;&lt;mo stretchy="false"&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;(p \rightarrow q) \equiv (\neg p \land q)&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1em;vertical-align:-0.25em;"&gt;&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord mathdefault"&gt;p&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;→&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1em;vertical-align:-0.25em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.03588em;"&gt;q&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;≡&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1em;vertical-align:-0.25em;"&gt;&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord"&gt;¬&lt;/span&gt;&lt;span class="mord mathdefault"&gt;p&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;∧&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1em;vertical-align:-0.25em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.03588em;"&gt;q&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h2 id="laws-of-logic"&gt;Laws of logic&lt;/h2&gt;
&lt;p&gt;See &lt;a href="laws-of-logic.html"&gt;Laws of Logic&lt;/a&gt;.&lt;/p&gt;</content><category term="permanent"/><category term="DiscreteMath"/><category term="MathematicalLogic"/></entry><entry><title>Propositions</title><link href="http://localhost:8000/propositions.html" rel="alternate"/><published>2023-10-11T00:00:00+10:00</published><updated>2025-01-01T00:00:00+10:00</updated><author><name>Lex Toumbourou</name></author><id>tag:localhost,2023-10-11:/propositions.html</id><summary type="html">&lt;p&gt;Declarative sentences that are either true or false (but not both)&lt;/p&gt;</summary><content type="html">&lt;p&gt;A &lt;strong&gt;proposition&lt;/strong&gt; (also called a &lt;strong&gt;statement&lt;/strong&gt;) is a declarative sentence with a truth value of either &lt;strong&gt;true&lt;/strong&gt; or &lt;strong&gt;false&lt;/strong&gt;, but not both.&lt;/p&gt;
&lt;p&gt;Every proposition must be:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;A complete sentence that makes a claim&lt;/li&gt;
&lt;li&gt;Either true or false (but not both)&lt;/li&gt;
&lt;li&gt;Definite in its truth value&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;For example, these are valid propositions:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;"I wrote this article on Thursday" (true)&lt;/li&gt;
&lt;li&gt;"I am 14 years old" (false)&lt;/li&gt;
&lt;li&gt;"1 + 1 = 3" (false)&lt;/li&gt;
&lt;li&gt;"Water boils at 100°C at standard atmospheric pressure" (true)&lt;/li&gt;
&lt;li&gt;"Every even integer is divisible by 2" (true)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These are not propositions:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;"What time is it?" - Questions aren't propositions as they don't make claims&lt;/li&gt;
&lt;li&gt;"Close the door" - Commands don't have truth values&lt;/li&gt;
&lt;li&gt;"What a beautiful day!" - Exclamations and opinions without clear criteria aren't propositions&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Also, expressions with variables, where the value of the variable would affect the truth value, aren't propositions:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;mo&gt;+&lt;/mo&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mn&gt;5&lt;/mn&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;x + 2 = 5&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.66666em;vertical-align:-0.08333em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;x&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;+&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.64444em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;2&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.64444em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;5&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;  - Not a proposition, as its truth value depends on the value of &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;x&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.43056em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;x&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;When a statement contains a variable whose truth value depends on that variable's value, it's called a &lt;a href="predicate.html"&gt;Predicate&lt;/a&gt;. &lt;/p&gt;
&lt;p&gt;For example:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;"I am &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;X&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;X&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.68333em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.07847em;"&gt;X&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; years old"&lt;/li&gt;
&lt;li&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;Y&lt;/mi&gt;&lt;mo&gt;+&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mn&gt;5&lt;/mn&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;Y + 1 = 5&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.76666em;vertical-align:-0.08333em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.22222em;"&gt;Y&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;+&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.64444em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;1&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.64444em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;5&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;"The speed of light in a vacuum is approximately &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;Z&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;Z&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.68333em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.07153em;"&gt;Z&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; meters per second."&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="callout" data-callout="question"&gt;
&lt;div class="callout-title"&gt;
&lt;div class="callout-icon" data-lucide="help-circle"&gt;&lt;/div&gt;
&lt;div class="callout-title-inner"&gt;Which of these is a valid &lt;strong&gt;proposition&lt;/strong&gt;?&lt;/div&gt;
&lt;/div&gt;
&lt;div class="callout-content"&gt;
&lt;p dir="auto"&gt;a) I live in Australia.&lt;br/&gt;
   b) Z &amp;gt; 2&lt;br/&gt;
   c) Please don't do that anymore&lt;br/&gt;
   d) &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;mo&gt;+&lt;/mo&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;1 + 2&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.72777em;vertical-align:-0.08333em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;1&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;+&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.64444em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br/&gt;
   e) &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mn&gt;11&lt;/mn&gt;&lt;mo&gt;×&lt;/mo&gt;&lt;mn&gt;11&lt;/mn&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;11 \times 11 = -1&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.72777em;vertical-align:-0.08333em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;1&lt;/span&gt;&lt;span class="mord"&gt;1&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;×&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.64444em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;1&lt;/span&gt;&lt;span class="mord"&gt;1&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.72777em;vertical-align:-0.08333em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;−&lt;/span&gt;&lt;span class="mord"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;div class="callout is-collapsible is-collapsed" data-callout="success"&gt;
&lt;div class="callout-title" dir="auto"&gt;
&lt;div class="callout-icon" data-lucide="check"&gt;&lt;/div&gt;
&lt;div class="callout-title-inner"&gt;Answer&lt;/div&gt;
&lt;div class="callout-fold" data-lucide="chevron-right"&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="callout-content"&gt;
&lt;p dir="auto"&gt;a) I live in Australia.&lt;br/&gt;
   e) &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mn&gt;11&lt;/mn&gt;&lt;mo&gt;×&lt;/mo&gt;&lt;mn&gt;11&lt;/mn&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;11 \times 11 = -1&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.72777em;vertical-align:-0.08333em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;1&lt;/span&gt;&lt;span class="mord"&gt;1&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;×&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.64444em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;1&lt;/span&gt;&lt;span class="mord"&gt;1&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.72777em;vertical-align:-0.08333em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;−&lt;/span&gt;&lt;span class="mord"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br/&gt;
   Only (a) and (e) are valid propositions because:&lt;br/&gt;
   * "I live in Australia" is a declarative statement that is either true or false&lt;br/&gt;
   * &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mn&gt;11&lt;/mn&gt;&lt;mo&gt;×&lt;/mo&gt;&lt;mn&gt;11&lt;/mn&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;11 \times 11 = -1&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.72777em;vertical-align:-0.08333em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;1&lt;/span&gt;&lt;span class="mord"&gt;1&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;×&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.64444em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;1&lt;/span&gt;&lt;span class="mord"&gt;1&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.72777em;vertical-align:-0.08333em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;−&lt;/span&gt;&lt;span class="mord"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; is a mathematical statement that is definitely false&lt;br/&gt;
   * (b) contains a variable, making it a predicate&lt;br/&gt;
   * (c) is a command&lt;br/&gt;
   * (d) is an expression, not a statement&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;In propositional logic, we often assign propositions to variables, typically using lowercase letters &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;p&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;p&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.625em;vertical-align:-0.19444em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;p&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;, &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;q&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;q&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.625em;vertical-align:-0.19444em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.03588em;"&gt;q&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;, &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;r&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;r&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.43056em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.02778em;"&gt;r&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;, &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;s&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;s&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.43056em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;s&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;, or &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;t&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;t&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.61508em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;t&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Let &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;p&lt;/mi&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mtext&gt;"It rained yesterday"&lt;/mtext&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;p = \text{"It rained yesterday"}&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.625em;vertical-align:-0.19444em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;p&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.8888799999999999em;vertical-align:-0.19444em;"&gt;&lt;/span&gt;&lt;span class="mord text"&gt;&lt;span class="mord"&gt;"It rained yesterday"&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;Let &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;q&lt;/mi&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mtext&gt;"I am happy"&lt;/mtext&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;q = \text{"I am happy"}&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.625em;vertical-align:-0.19444em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.03588em;"&gt;q&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.8888799999999999em;vertical-align:-0.19444em;"&gt;&lt;/span&gt;&lt;span class="mord text"&gt;&lt;span class="mord"&gt;"I am happy"&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These variable assignments allow us to manipulate and analyse propositions using &lt;a href="propositional-logic.html"&gt;Propositional Logic&lt;/a&gt;, where we can combine simple propositions to form more complex ones.&lt;/p&gt;</content><category term="permanent"/><category term="DiscreteMath"/><category term="MathematicalLogic"/><category term="LogicalReasoning"/></entry><entry><title>Mel Spectrogram</title><link href="http://localhost:8000/mel-spectrogram.html" rel="alternate"/><published>2023-10-09T00:00:00+10:00</published><updated>2023-10-09T00:00:00+10:00</updated><author><name>Lex Toumbourou</name></author><id>tag:localhost,2023-10-09:/mel-spectrogram.html</id><summary type="html">&lt;p&gt;A sound wave visualisation of frequency over time&lt;/p&gt;</summary><content type="html">&lt;p&gt;Mel Spectrogram is a graphic representation of a &lt;a href="sound-wave.html"&gt;Sound Wave&lt;/a&gt;, visualising frequency over time. The difference between a Mel Spectogram and a &lt;a href="spectrogram.html"&gt;Spectrogram&lt;/a&gt;, is the frequency y-axis is represented using the &lt;a href="mel-scale.html"&gt;Mel Scale&lt;/a&gt; in the former.&lt;/p&gt;
&lt;p&gt;Here is a Mel Spectrogram of the audio of a Trumpet&lt;/p&gt;
&lt;p&gt;&lt;img alt="Melspectrogram example of a Trumpet" src="../_media/melspectrogram-example.png"&gt;&lt;/p&gt;
&lt;p&gt;&lt;audio controls&gt;
  &lt;source src="_media/trumpet_example.mp3" type="audio/mpeg"&gt;
&lt;/audio&gt;&lt;/p&gt;
&lt;p&gt;The process of generating a Mel Spectrogram works like this:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Break the audio signal down into short frames&lt;/li&gt;
&lt;li&gt;Convert time signal into the frequency domain using a &lt;a href="fourier-transform.html"&gt;Fourier Transform&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Convert frequencies into Mel scale, to more closely align with our intuition of frequencies. This operation is called &lt;a href="mel-filter-bank.html"&gt;Mel Filter Bank&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Plot the Mel values over time.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="mel-scale"&gt;Mel Scale&lt;/h2&gt;
&lt;p&gt;The Mel Scale is a &lt;em&gt;perceptual scale&lt;/em&gt; of audio frequencies. In other words, it represents our perceived distance of the frequencies from others.&lt;/p&gt;
&lt;p&gt;The Mel scale is a logarithmic formula where 1000Mel = 1kHz. You can convert Hz to Mel using this formula:&lt;/p&gt;
&lt;p&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;M&lt;/mi&gt;&lt;mi&gt;e&lt;/mi&gt;&lt;mi&gt;l&lt;/mi&gt;&lt;mo stretchy="false"&gt;(&lt;/mo&gt;&lt;mi&gt;f&lt;/mi&gt;&lt;mo stretchy="false"&gt;)&lt;/mo&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mn&gt;2595&lt;/mn&gt;&lt;msub&gt;&lt;mo&gt;&lt;mi&gt;log&lt;/mi&gt;&lt;mo&gt;⁡&lt;/mo&gt;&lt;/mo&gt;&lt;mn&gt;10&lt;/mn&gt;&lt;/msub&gt;&lt;mo stretchy="false"&gt;(&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;mo&gt;+&lt;/mo&gt;&lt;mfrac&gt;&lt;mi&gt;f&lt;/mi&gt;&lt;mn&gt;100&lt;/mn&gt;&lt;/mfrac&gt;&lt;mo stretchy="false"&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;Mel(f) = 2595 \log_{10} (1 + \frac{f}{100})&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1em;vertical-align:-0.25em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.10903em;"&gt;M&lt;/span&gt;&lt;span class="mord mathdefault"&gt;e&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.01968em;"&gt;l&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.10764em;"&gt;f&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1em;vertical-align:-0.25em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;2&lt;/span&gt;&lt;span class="mord"&gt;5&lt;/span&gt;&lt;span class="mord"&gt;9&lt;/span&gt;&lt;span class="mord"&gt;5&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mop"&gt;&lt;span class="mop"&gt;lo&lt;span style="margin-right:0.01389em;"&gt;g&lt;/span&gt;&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.20696799999999996em;"&gt;&lt;span style="top:-2.4558600000000004em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mtight"&gt;1&lt;/span&gt;&lt;span class="mord mtight"&gt;0&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.24414em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord"&gt;1&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;+&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1.277216em;vertical-align:-0.345em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mopen nulldelimiter"&gt;&lt;/span&gt;&lt;span class="mfrac"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.9322159999999999em;"&gt;&lt;span style="top:-2.6550000000000002em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mtight"&gt;1&lt;/span&gt;&lt;span class="mord mtight"&gt;0&lt;/span&gt;&lt;span class="mord mtight"&gt;0&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-3.23em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="frac-line" style="border-bottom-width:0.04em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-3.446108em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathdefault mtight" style="margin-right:0.10764em;"&gt;f&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.345em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose nulldelimiter"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="Frequency vs Mel Scale plot" src="../_media/mel-scale-plot.png"&gt;&lt;/p&gt;</content><category term="permanent"/><category term="AudioEngineering"/></entry><entry><title>Sample Rate</title><link href="http://localhost:8000/sample-rate.html" rel="alternate"/><published>2023-10-08T00:00:00+10:00</published><updated>2023-10-08T00:00:00+10:00</updated><author><name>Lex Toumbourou</name></author><id>tag:localhost,2023-10-08:/sample-rate.html</id><summary type="html">&lt;p&gt;A measure of how accurately the source signal was digitally represented&lt;/p&gt;</summary><content type="html">&lt;p&gt;Sample rate measures how accurately a sound wave is digitally represented.&lt;/p&gt;
&lt;p&gt;To create a digital audio recording of a &lt;a href="sound-wave.html"&gt;Sound Wave&lt;/a&gt;, we capture the signal's amplitude many times a second and store it as an array of numbers. Each of these numbers is called a sample. We measure audio quality by number of samples per second or &lt;a href="https://en.wikipedia.org/wiki/Hertz"&gt;hertz&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The number is generally stored as an int or float, whose range or precision is defined by the &lt;a href="bit-depth.html"&gt;Bit Depth&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Together, they are the two critical details that define the quality of a digital audio recording.&lt;/p&gt;
&lt;p&gt;If we zoom into an audio file in Audacity to the higher resolutions, we can visualise our waveform at the sample level:&lt;/p&gt;
&lt;p&gt;&lt;img alt="Example of zoomed in audio file in Audacity to show how sampling works" src="../_media/sample-rate-1.png"&gt;&lt;/p&gt;
&lt;p&gt;The number of elements in the array is &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mtext&gt; audio time (secs) &lt;/mtext&gt;&lt;mo&gt;×&lt;/mo&gt;&lt;mtext&gt; sample rate &lt;/mtext&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;\text{ audio time (secs) } \times \text{ sample rate }&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1em;vertical-align:-0.25em;"&gt;&lt;/span&gt;&lt;span class="mord text"&gt;&lt;span class="mord"&gt; audio time (secs) &lt;/span&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;×&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.8888799999999999em;vertical-align:-0.19444em;"&gt;&lt;/span&gt;&lt;span class="mord text"&gt;&lt;span class="mord"&gt; sample rate &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;. Therefore, higher sample rates will require more storage space. We will have an array per channel for stereo and other multichannel audio.&lt;/p&gt;
&lt;p&gt;In Python, the sound is typically represented using a Numpy multidimensional array. Here we can see an example of loading an audio file using the &lt;a href="https://scipy.org/"&gt;scipy&lt;/a&gt; library:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;scipy.io&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;wavfile&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;sample_rate&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;audio_array&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;wavfile&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;read&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;../../_media/4s-silence.wav&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;audio_array&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;shape&lt;/span&gt;
&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;176400&lt;/span&gt;&lt;span class="p"&gt;,)&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;audio_length&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;audio_array&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;sample_rate&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;audio_length&lt;/span&gt;
&lt;span class="mf"&gt;4.0&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;As you can see, we can find the length of audio represented as a Numpy array by dividing the number of samples by the sample rate.&lt;/p&gt;
&lt;p&gt;A higher sample rate means that we can store higher frequencies, since higher frequency sound waves have shorter cycles, and therefore need more samples to capture.&lt;/p&gt;
&lt;p&gt;How do we determine the optimal sample rate?&lt;/p&gt;
&lt;h2 id="nyquist-shannon-sampling-theorem"&gt;Nyquist-Shannon sampling theorem&lt;/h2&gt;
&lt;p&gt;According to the &lt;a href="nyquist-shannon-sampling-theorem.html"&gt;Nyquist-Shannon Sampling Theorem&lt;/a&gt; the frequency of sampling of a wave must be greater than twice the highest frequency in a wave. Since the highest frequency the human ear can hear is around 20 kHz, anything about 40 kHz should perfectly reproduce what the human ear can perceive.&lt;/p&gt;
&lt;p&gt;The sample rate for CD audio is 44.1kHz, which is two times 22.05 kHz - that gives a bit of extra buffer for very high frequencies.&lt;/p&gt;
&lt;p&gt;44.1kHz continues to be a standard sample rate for high-quality audio, although 48kHz is also a common choice.&lt;/p&gt;
&lt;p&gt;However, there are other standard sample rates for different types of audio.&lt;/p&gt;
&lt;h2 id="common-sample-rates"&gt;Common Sample Rates&lt;/h2&gt;
&lt;h3 id="441-khz"&gt;44.1 kHz&lt;/h3&gt;
&lt;p&gt;The most commonly found sample rate, as it has been the standard for CD quality since inception.&lt;/p&gt;
&lt;h3 id="48-khz"&gt;48 kHz&lt;/h3&gt;
&lt;p&gt;For audio and some film and video, as it divides evenly for film/video rates.&lt;/p&gt;
&lt;h3 id="882-khz-and-96-khz"&gt;88.2 kHz and 96 kHz&lt;/h3&gt;
&lt;p&gt;For higher-resolution audio formats&lt;/p&gt;
&lt;h3 id="192-khz"&gt;192 kHz&lt;/h3&gt;
&lt;p&gt;For some ultra-high-definition recordings.&lt;/p&gt;
&lt;h2 id="aliasing"&gt;Aliasing&lt;/h2&gt;
&lt;p&gt;Since the true sound wave has to be inferred from digital samples, the sound will only be accurately captured if the rate is higher. In particular, the higher frequencies will be folded into lower frequencies, causing distortion - this issue of under-sampling is referred to as aliasing.&lt;/p&gt;
&lt;p&gt;The figure below shows an example of a 15Hz sine wave over a minute. As you can see, we can only accurately reconstruct the original sine wave if we sample enough points. However, after a certain number of samples, we can rebuild the sound wave perfectly; more samples do not help.&lt;/p&gt;
&lt;p&gt;&lt;img alt="" src="../_media/sample-rate-examples.png"&gt;&lt;/p&gt;
&lt;p&gt;Real sound waves are more complex than simple sine waves, so more samples are needed to capture that complexity. However, the important detail is that more samples are not necessarily better. We can accurately represent all audio we perceive at any sample rate above 40kHz.&lt;/p&gt;
&lt;h2 id="bit-rate"&gt;Bit Rate&lt;/h2&gt;
&lt;p&gt;&lt;a href="bit-rate.html"&gt;Bit Rate&lt;/a&gt; is the number of bits per second required to store or transport the audio signal. For uncompressed audio, that is simply the number of bits per sample x sample rate. For mono audio with a bit depth of 16, and a sample rate of 44,100Hz, we could calculate it as: 16 bits x 44,100Hz = 705,600 bits/s.&lt;/p&gt;</content><category term="permanent"/><category term="AudioEngineering"/></entry><entry><title>Sound Wave</title><link href="http://localhost:8000/sound-wave.html" rel="alternate"/><published>2023-10-06T00:00:00+10:00</published><updated>2023-10-06T00:00:00+10:00</updated><author><name>Lex Toumbourou</name></author><id>tag:localhost,2023-10-06:/sound-wave.html</id><summary type="html">&lt;p&gt;Wave of pressure which our ears can perceive&lt;/p&gt;</summary><content type="html">&lt;p&gt;A sound wave is a wave of pressure that travels through the air (or another medium like water or solids) that our ears can perceive.&lt;/p&gt;
&lt;p&gt;Sound waves are produced when when a vibrating object exerts force or pressure, setting the molecules to oscillate around their equilibrium position.&lt;/p&gt;
&lt;p&gt;The rate of oscillation of these molecules is what determines the frequency of the sound, while the maximum distance they move away from their equilibrium position defines the amplitude.&lt;/p&gt;
&lt;p&gt;These characteristics give a specific sound its unique pitch and loudness.&lt;/p&gt;
&lt;p&gt;We measure the frequency of sound in cycles per second, known as hertz (Hz). For instance, 440 Hz indicates 440 cycles per second.&lt;/p&gt;
&lt;p&gt;The amplitude of a sound is gauged by the maximum displacement of the medium's molecules.&lt;/p&gt;
&lt;p&gt;This displacement results in pressure fluctuations within the medium, which we express in units known as the decibel sound pressure level (dB SPL).&lt;/p&gt;
&lt;p&gt;The amplitude largely determines the loudness of a sound.&lt;/p&gt;
&lt;p&gt;Individuals with typical hearing can perceive sounds as soft as 0 dB SPL and generally tolerate up to around 120 dB SPL.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Sound wave diagram" src="../_media/sound-wave-diagram.png"&gt;&lt;/p&gt;
&lt;p&gt;Recommended videos:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=XLfQpv2ZRPU"&gt;Understanding Sound Waves&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=Gd_mhBf_FJA"&gt;The Science of Sound&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content><category term="permanent"/><category term="AudioEngineering"/></entry><entry><title>Law of Sines</title><link href="http://localhost:8000/law-of-sines.html" rel="alternate"/><published>2023-08-05T00:00:00+10:00</published><updated>2023-08-05T00:00:00+10:00</updated><author><name>Lex Toumbourou</name></author><id>tag:localhost,2023-08-05:/law-of-sines.html</id><summary type="html">&lt;p&gt;Tells us the ratio between the sine of an angle and the side opposite it will be constant for all angles in a triangle&lt;/p&gt;</summary><content type="html">&lt;p&gt;The Law of Sines tells us that the ratio between the sine of an angle and the side opposite will be constant for any angle in a triangle.&lt;/p&gt;
&lt;p&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mfrac&gt;&lt;mrow&gt;&lt;mi&gt;sin&lt;/mi&gt;&lt;mo&gt;⁡&lt;/mo&gt;&lt;mi&gt;A&lt;/mi&gt;&lt;/mrow&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;/mfrac&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mfrac&gt;&lt;mrow&gt;&lt;mi&gt;sin&lt;/mi&gt;&lt;mo&gt;⁡&lt;/mo&gt;&lt;mi&gt;B&lt;/mi&gt;&lt;/mrow&gt;&lt;mi&gt;b&lt;/mi&gt;&lt;/mfrac&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mfrac&gt;&lt;mrow&gt;&lt;mi&gt;sin&lt;/mi&gt;&lt;mo&gt;⁡&lt;/mo&gt;&lt;mi&gt;C&lt;/mi&gt;&lt;/mrow&gt;&lt;mi&gt;c&lt;/mi&gt;&lt;/mfrac&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;\frac{\sin A}{a} = \frac{\sin B}{b} = \frac{\sin C}{c}&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1.217331em;vertical-align:-0.345em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mopen nulldelimiter"&gt;&lt;/span&gt;&lt;span class="mfrac"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.872331em;"&gt;&lt;span style="top:-2.6550000000000002em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathdefault mtight"&gt;a&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-3.23em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="frac-line" style="border-bottom-width:0.04em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-3.394em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mop mtight"&gt;&lt;span class="mtight"&gt;s&lt;/span&gt;&lt;span class="mtight"&gt;i&lt;/span&gt;&lt;span class="mtight"&gt;n&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace mtight" style="margin-right:0.19516666666666668em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault mtight"&gt;A&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.345em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose nulldelimiter"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1.217331em;vertical-align:-0.345em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mopen nulldelimiter"&gt;&lt;/span&gt;&lt;span class="mfrac"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.872331em;"&gt;&lt;span style="top:-2.6550000000000002em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathdefault mtight"&gt;b&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-3.23em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="frac-line" style="border-bottom-width:0.04em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-3.394em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mop mtight"&gt;&lt;span class="mtight"&gt;s&lt;/span&gt;&lt;span class="mtight"&gt;i&lt;/span&gt;&lt;span class="mtight"&gt;n&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace mtight" style="margin-right:0.19516666666666668em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault mtight" style="margin-right:0.05017em;"&gt;B&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.345em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose nulldelimiter"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1.217331em;vertical-align:-0.345em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mopen nulldelimiter"&gt;&lt;/span&gt;&lt;span class="mfrac"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.872331em;"&gt;&lt;span style="top:-2.6550000000000002em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathdefault mtight"&gt;c&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-3.23em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="frac-line" style="border-bottom-width:0.04em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-3.394em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mop mtight"&gt;&lt;span class="mtight"&gt;s&lt;/span&gt;&lt;span class="mtight"&gt;i&lt;/span&gt;&lt;span class="mtight"&gt;n&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace mtight" style="margin-right:0.19516666666666668em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault mtight" style="margin-right:0.07153em;"&gt;C&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.345em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose nulldelimiter"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;If we have at least two sides and an angle or two angles and a side, we can use it to find the missing values.&lt;/p&gt;
&lt;h2 id="example"&gt;Example&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Question&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Consider a triangle with angles &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;A&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;A&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.68333em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;A&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;, &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;B&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;B&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.68333em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.05017em;"&gt;B&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; and &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;C&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;C&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.68333em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.07153em;"&gt;C&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; and sides &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;a&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.43056em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;a&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;, &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;b&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;b&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.69444em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;b&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; and &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;c&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;c&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.43056em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;c&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;, where &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;a&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.43056em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;a&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; is the side opposite &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;A&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;A&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.68333em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;A&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;, &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;b&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;b&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.69444em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;b&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; opposite &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;B&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;B&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.68333em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.05017em;"&gt;B&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; and &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;c&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;c&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.43056em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;c&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; opposite &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;C&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;C&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.68333em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.07153em;"&gt;C&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;.&lt;/p&gt;
&lt;p&gt;If &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;C&lt;/mi&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mn&gt;42&lt;/mn&gt;&lt;mi mathvariant="normal"&gt;°&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;C = 42°&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.68333em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.07153em;"&gt;C&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.69444em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;4&lt;/span&gt;&lt;span class="mord"&gt;2&lt;/span&gt;&lt;span class="mord"&gt;°&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;, &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;c&lt;/mi&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mn&gt;15&lt;/mn&gt;&lt;mi&gt;c&lt;/mi&gt;&lt;mi&gt;m&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;c = 15cm&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.43056em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;c&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.64444em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;1&lt;/span&gt;&lt;span class="mord"&gt;5&lt;/span&gt;&lt;span class="mord mathdefault"&gt;c&lt;/span&gt;&lt;span class="mord mathdefault"&gt;m&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; and &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;b&lt;/mi&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;mi&gt;c&lt;/mi&gt;&lt;mi&gt;m&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;b = 1cm&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.69444em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;b&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.64444em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;1&lt;/span&gt;&lt;span class="mord mathdefault"&gt;c&lt;/span&gt;&lt;span class="mord mathdefault"&gt;m&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;, solve the triangle.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Working&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;We can start by finding &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;B&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;B&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.68333em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.05017em;"&gt;B&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; using the Law of Sines:&lt;/p&gt;
&lt;p&gt;Since we know that &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mfrac&gt;&lt;mrow&gt;&lt;mi&gt;sin&lt;/mi&gt;&lt;mo&gt;⁡&lt;/mo&gt;&lt;mn&gt;42&lt;/mn&gt;&lt;mi mathvariant="normal"&gt;°&lt;/mi&gt;&lt;/mrow&gt;&lt;mrow&gt;&lt;mn&gt;15&lt;/mn&gt;&lt;mi&gt;c&lt;/mi&gt;&lt;mi&gt;m&lt;/mi&gt;&lt;/mrow&gt;&lt;/mfrac&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mfrac&gt;&lt;mrow&gt;&lt;mi&gt;sin&lt;/mi&gt;&lt;mo&gt;⁡&lt;/mo&gt;&lt;mi&gt;B&lt;/mi&gt;&lt;/mrow&gt;&lt;mrow&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;mi&gt;c&lt;/mi&gt;&lt;mi&gt;m&lt;/mi&gt;&lt;/mrow&gt;&lt;/mfrac&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;\frac{\sin 42°}{15cm} = \frac{\sin B}{1cm}&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1.2251079999999999em;vertical-align:-0.345em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mopen nulldelimiter"&gt;&lt;/span&gt;&lt;span class="mfrac"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.8801079999999999em;"&gt;&lt;span style="top:-2.6550000000000002em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mtight"&gt;1&lt;/span&gt;&lt;span class="mord mtight"&gt;5&lt;/span&gt;&lt;span class="mord mathdefault mtight"&gt;c&lt;/span&gt;&lt;span class="mord mathdefault mtight"&gt;m&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-3.23em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="frac-line" style="border-bottom-width:0.04em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-3.394em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mop mtight"&gt;&lt;span class="mtight"&gt;s&lt;/span&gt;&lt;span class="mtight"&gt;i&lt;/span&gt;&lt;span class="mtight"&gt;n&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace mtight" style="margin-right:0.19516666666666668em;"&gt;&lt;/span&gt;&lt;span class="mord mtight"&gt;4&lt;/span&gt;&lt;span class="mord mtight"&gt;2&lt;/span&gt;&lt;span class="mord mtight"&gt;°&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.345em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose nulldelimiter"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1.217331em;vertical-align:-0.345em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mopen nulldelimiter"&gt;&lt;/span&gt;&lt;span class="mfrac"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.872331em;"&gt;&lt;span style="top:-2.6550000000000002em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mtight"&gt;1&lt;/span&gt;&lt;span class="mord mathdefault mtight"&gt;c&lt;/span&gt;&lt;span class="mord mathdefault mtight"&gt;m&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-3.23em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="frac-line" style="border-bottom-width:0.04em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-3.394em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mop mtight"&gt;&lt;span class="mtight"&gt;s&lt;/span&gt;&lt;span class="mtight"&gt;i&lt;/span&gt;&lt;span class="mtight"&gt;n&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace mtight" style="margin-right:0.19516666666666668em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault mtight" style="margin-right:0.05017em;"&gt;B&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.345em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose nulldelimiter"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;We can calculate &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mfrac&gt;&lt;mrow&gt;&lt;mi&gt;sin&lt;/mi&gt;&lt;mo&gt;⁡&lt;/mo&gt;&lt;mn&gt;42&lt;/mn&gt;&lt;mi mathvariant="normal"&gt;°&lt;/mi&gt;&lt;/mrow&gt;&lt;mn&gt;15&lt;/mn&gt;&lt;/mfrac&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mn&gt;0.0446&lt;/mn&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;\frac{\sin 42°}{15} = 0.0446&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1.2251079999999999em;vertical-align:-0.345em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mopen nulldelimiter"&gt;&lt;/span&gt;&lt;span class="mfrac"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.8801079999999999em;"&gt;&lt;span style="top:-2.6550000000000002em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mtight"&gt;1&lt;/span&gt;&lt;span class="mord mtight"&gt;5&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-3.23em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="frac-line" style="border-bottom-width:0.04em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-3.394em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mop mtight"&gt;&lt;span class="mtight"&gt;s&lt;/span&gt;&lt;span class="mtight"&gt;i&lt;/span&gt;&lt;span class="mtight"&gt;n&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace mtight" style="margin-right:0.19516666666666668em;"&gt;&lt;/span&gt;&lt;span class="mord mtight"&gt;4&lt;/span&gt;&lt;span class="mord mtight"&gt;2&lt;/span&gt;&lt;span class="mord mtight"&gt;°&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.345em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose nulldelimiter"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.64444em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;0&lt;/span&gt;&lt;span class="mord"&gt;.&lt;/span&gt;&lt;span class="mord"&gt;0&lt;/span&gt;&lt;span class="mord"&gt;4&lt;/span&gt;&lt;span class="mord"&gt;4&lt;/span&gt;&lt;span class="mord"&gt;6&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mfrac&gt;&lt;mrow&gt;&lt;mi&gt;sin&lt;/mi&gt;&lt;mo&gt;⁡&lt;/mo&gt;&lt;mi&gt;B&lt;/mi&gt;&lt;/mrow&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/mfrac&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mn&gt;0.0446&lt;/mn&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;\frac{\sin B}{1} = 0.0446&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1.217331em;vertical-align:-0.345em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mopen nulldelimiter"&gt;&lt;/span&gt;&lt;span class="mfrac"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.872331em;"&gt;&lt;span style="top:-2.6550000000000002em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mtight"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-3.23em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="frac-line" style="border-bottom-width:0.04em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-3.394em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mop mtight"&gt;&lt;span class="mtight"&gt;s&lt;/span&gt;&lt;span class="mtight"&gt;i&lt;/span&gt;&lt;span class="mtight"&gt;n&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace mtight" style="margin-right:0.19516666666666668em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault mtight" style="margin-right:0.05017em;"&gt;B&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.345em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose nulldelimiter"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.64444em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;0&lt;/span&gt;&lt;span class="mord"&gt;.&lt;/span&gt;&lt;span class="mord"&gt;0&lt;/span&gt;&lt;span class="mord"&gt;4&lt;/span&gt;&lt;span class="mord"&gt;4&lt;/span&gt;&lt;span class="mord"&gt;6&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Since dividing by 1 equals the numerator, we know:&lt;/p&gt;
&lt;p&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;sin&lt;/mi&gt;&lt;mo&gt;⁡&lt;/mo&gt;&lt;mi&gt;B&lt;/mi&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mn&gt;0.0446&lt;/mn&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;\sin B = 0.0446&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.68333em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mop"&gt;sin&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.05017em;"&gt;B&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.64444em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;0&lt;/span&gt;&lt;span class="mord"&gt;.&lt;/span&gt;&lt;span class="mord"&gt;0&lt;/span&gt;&lt;span class="mord"&gt;4&lt;/span&gt;&lt;span class="mord"&gt;4&lt;/span&gt;&lt;span class="mord"&gt;6&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Then use &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;arcsin&lt;/mi&gt;&lt;mo&gt;⁡&lt;/mo&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;\arcsin&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.66786em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mop"&gt;arcsin&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; to find &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;B&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;B&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.68333em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.05017em;"&gt;B&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;B&lt;/mi&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mi&gt;r&lt;/mi&gt;&lt;mi&gt;c&lt;/mi&gt;&lt;mi&gt;s&lt;/mi&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;mi&gt;n&lt;/mi&gt;&lt;mo stretchy="false"&gt;(&lt;/mo&gt;&lt;mn&gt;0.0446&lt;/mn&gt;&lt;mo stretchy="false"&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;B = arcsin(0.0446)&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.68333em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.05017em;"&gt;B&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1em;vertical-align:-0.25em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;a&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.02778em;"&gt;r&lt;/span&gt;&lt;span class="mord mathdefault"&gt;c&lt;/span&gt;&lt;span class="mord mathdefault"&gt;s&lt;/span&gt;&lt;span class="mord mathdefault"&gt;i&lt;/span&gt;&lt;span class="mord mathdefault"&gt;n&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord"&gt;0&lt;/span&gt;&lt;span class="mord"&gt;.&lt;/span&gt;&lt;span class="mord"&gt;0&lt;/span&gt;&lt;span class="mord"&gt;4&lt;/span&gt;&lt;span class="mord"&gt;4&lt;/span&gt;&lt;span class="mord"&gt;6&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;B&lt;/mi&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mn&gt;2.557&lt;/mn&gt;&lt;mi mathvariant="normal"&gt;°&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;B = 2.557°&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.68333em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.05017em;"&gt;B&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.69444em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;2&lt;/span&gt;&lt;span class="mord"&gt;.&lt;/span&gt;&lt;span class="mord"&gt;5&lt;/span&gt;&lt;span class="mord"&gt;5&lt;/span&gt;&lt;span class="mord"&gt;7&lt;/span&gt;&lt;span class="mord"&gt;°&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;We can now find &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;A&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;A&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.68333em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;A&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; since we know that all the angles in a triangle add up to &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mn&gt;180&lt;/mn&gt;&lt;mi mathvariant="normal"&gt;°&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;180°&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.69444em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;1&lt;/span&gt;&lt;span class="mord"&gt;8&lt;/span&gt;&lt;span class="mord"&gt;0&lt;/span&gt;&lt;span class="mord"&gt;°&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;A&lt;/mi&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mn&gt;180&lt;/mn&gt;&lt;mi mathvariant="normal"&gt;°&lt;/mi&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;mn&gt;42&lt;/mn&gt;&lt;mi mathvariant="normal"&gt;°&lt;/mi&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;mn&gt;2.56&lt;/mn&gt;&lt;mi mathvariant="normal"&gt;°&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;A = 180° - 42° - 2.56°&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.68333em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;A&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.77777em;vertical-align:-0.08333em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;1&lt;/span&gt;&lt;span class="mord"&gt;8&lt;/span&gt;&lt;span class="mord"&gt;0&lt;/span&gt;&lt;span class="mord"&gt;°&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;−&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.77777em;vertical-align:-0.08333em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;4&lt;/span&gt;&lt;span class="mord"&gt;2&lt;/span&gt;&lt;span class="mord"&gt;°&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;−&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.69444em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;2&lt;/span&gt;&lt;span class="mord"&gt;.&lt;/span&gt;&lt;span class="mord"&gt;5&lt;/span&gt;&lt;span class="mord"&gt;6&lt;/span&gt;&lt;span class="mord"&gt;°&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;A&lt;/mi&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mn&gt;135.44&lt;/mn&gt;&lt;mi mathvariant="normal"&gt;°&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;A = 135.44°&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.68333em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;A&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.69444em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;1&lt;/span&gt;&lt;span class="mord"&gt;3&lt;/span&gt;&lt;span class="mord"&gt;5&lt;/span&gt;&lt;span class="mord"&gt;.&lt;/span&gt;&lt;span class="mord"&gt;4&lt;/span&gt;&lt;span class="mord"&gt;4&lt;/span&gt;&lt;span class="mord"&gt;°&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Now to find &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;a&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.43056em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;a&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;, we can use the Law of Sines again:&lt;/p&gt;
&lt;p&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mfrac&gt;&lt;mrow&gt;&lt;mi&gt;sin&lt;/mi&gt;&lt;mo&gt;⁡&lt;/mo&gt;&lt;mn&gt;42&lt;/mn&gt;&lt;mi mathvariant="normal"&gt;°&lt;/mi&gt;&lt;/mrow&gt;&lt;mrow&gt;&lt;mn&gt;15&lt;/mn&gt;&lt;mi&gt;c&lt;/mi&gt;&lt;mi&gt;m&lt;/mi&gt;&lt;/mrow&gt;&lt;/mfrac&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mfrac&gt;&lt;mrow&gt;&lt;mi&gt;sin&lt;/mi&gt;&lt;mo&gt;⁡&lt;/mo&gt;&lt;mo stretchy="false"&gt;(&lt;/mo&gt;&lt;mn&gt;135.44&lt;/mn&gt;&lt;mo stretchy="false"&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;/mfrac&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;\frac{\sin 42°}{15cm} = \frac{\sin(135.44)}{a}&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1.2251079999999999em;vertical-align:-0.345em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mopen nulldelimiter"&gt;&lt;/span&gt;&lt;span class="mfrac"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.8801079999999999em;"&gt;&lt;span style="top:-2.6550000000000002em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mtight"&gt;1&lt;/span&gt;&lt;span class="mord mtight"&gt;5&lt;/span&gt;&lt;span class="mord mathdefault mtight"&gt;c&lt;/span&gt;&lt;span class="mord mathdefault mtight"&gt;m&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-3.23em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="frac-line" style="border-bottom-width:0.04em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-3.394em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mop mtight"&gt;&lt;span class="mtight"&gt;s&lt;/span&gt;&lt;span class="mtight"&gt;i&lt;/span&gt;&lt;span class="mtight"&gt;n&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace mtight" style="margin-right:0.19516666666666668em;"&gt;&lt;/span&gt;&lt;span class="mord mtight"&gt;4&lt;/span&gt;&lt;span class="mord mtight"&gt;2&lt;/span&gt;&lt;span class="mord mtight"&gt;°&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.345em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose nulldelimiter"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1.355em;vertical-align:-0.345em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mopen nulldelimiter"&gt;&lt;/span&gt;&lt;span class="mfrac"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:1.01em;"&gt;&lt;span style="top:-2.6550000000000002em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathdefault mtight"&gt;a&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-3.23em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="frac-line" style="border-bottom-width:0.04em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-3.485em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mop mtight"&gt;&lt;span class="mtight"&gt;s&lt;/span&gt;&lt;span class="mtight"&gt;i&lt;/span&gt;&lt;span class="mtight"&gt;n&lt;/span&gt;&lt;/span&gt;&lt;span class="mopen mtight"&gt;(&lt;/span&gt;&lt;span class="mord mtight"&gt;1&lt;/span&gt;&lt;span class="mord mtight"&gt;3&lt;/span&gt;&lt;span class="mord mtight"&gt;5&lt;/span&gt;&lt;span class="mord mtight"&gt;.&lt;/span&gt;&lt;span class="mord mtight"&gt;4&lt;/span&gt;&lt;span class="mord mtight"&gt;4&lt;/span&gt;&lt;span class="mclose mtight"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.345em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose nulldelimiter"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Calculate the known values:&lt;/p&gt;
&lt;p&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mn&gt;0.0446&lt;/mn&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mn&gt;0.702&lt;/mn&gt;&lt;mi mathvariant="normal"&gt;/&lt;/mi&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;0.0446 = 0.702 / a&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.64444em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;0&lt;/span&gt;&lt;span class="mord"&gt;.&lt;/span&gt;&lt;span class="mord"&gt;0&lt;/span&gt;&lt;span class="mord"&gt;4&lt;/span&gt;&lt;span class="mord"&gt;4&lt;/span&gt;&lt;span class="mord"&gt;6&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1em;vertical-align:-0.25em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;0&lt;/span&gt;&lt;span class="mord"&gt;.&lt;/span&gt;&lt;span class="mord"&gt;7&lt;/span&gt;&lt;span class="mord"&gt;0&lt;/span&gt;&lt;span class="mord"&gt;2&lt;/span&gt;&lt;span class="mord"&gt;/&lt;/span&gt;&lt;span class="mord mathdefault"&gt;a&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Multiply both sides by A:&lt;/p&gt;
&lt;p&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mo&gt;×&lt;/mo&gt;&lt;mn&gt;0.0446&lt;/mn&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mn&gt;0.702&lt;/mn&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;a \times 0.0446 = 0.702&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.66666em;vertical-align:-0.08333em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;a&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;×&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.64444em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;0&lt;/span&gt;&lt;span class="mord"&gt;.&lt;/span&gt;&lt;span class="mord"&gt;0&lt;/span&gt;&lt;span class="mord"&gt;4&lt;/span&gt;&lt;span class="mord"&gt;4&lt;/span&gt;&lt;span class="mord"&gt;6&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.64444em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;0&lt;/span&gt;&lt;span class="mord"&gt;.&lt;/span&gt;&lt;span class="mord"&gt;7&lt;/span&gt;&lt;span class="mord"&gt;0&lt;/span&gt;&lt;span class="mord"&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mfrac&gt;&lt;mn&gt;0.702&lt;/mn&gt;&lt;mn&gt;0.0446&lt;/mn&gt;&lt;/mfrac&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mn&gt;15.74&lt;/mn&gt;&lt;mi&gt;c&lt;/mi&gt;&lt;mi&gt;m&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;a = \frac{0.702}{0.0446} = 15.74cm&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.43056em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;a&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1.190108em;vertical-align:-0.345em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mopen nulldelimiter"&gt;&lt;/span&gt;&lt;span class="mfrac"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.845108em;"&gt;&lt;span style="top:-2.6550000000000002em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mtight"&gt;0&lt;/span&gt;&lt;span class="mord mtight"&gt;.&lt;/span&gt;&lt;span class="mord mtight"&gt;0&lt;/span&gt;&lt;span class="mord mtight"&gt;4&lt;/span&gt;&lt;span class="mord mtight"&gt;4&lt;/span&gt;&lt;span class="mord mtight"&gt;6&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-3.23em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="frac-line" style="border-bottom-width:0.04em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-3.394em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mtight"&gt;0&lt;/span&gt;&lt;span class="mord mtight"&gt;.&lt;/span&gt;&lt;span class="mord mtight"&gt;7&lt;/span&gt;&lt;span class="mord mtight"&gt;0&lt;/span&gt;&lt;span class="mord mtight"&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.345em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose nulldelimiter"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.64444em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;1&lt;/span&gt;&lt;span class="mord"&gt;5&lt;/span&gt;&lt;span class="mord"&gt;.&lt;/span&gt;&lt;span class="mord"&gt;7&lt;/span&gt;&lt;span class="mord"&gt;4&lt;/span&gt;&lt;span class="mord mathdefault"&gt;c&lt;/span&gt;&lt;span class="mord mathdefault"&gt;m&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Now that we have the missing values, we can use the Law of Sines to check that all ratios are equal:&lt;/p&gt;
&lt;p&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mfrac&gt;&lt;mrow&gt;&lt;mi&gt;s&lt;/mi&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;mi&gt;n&lt;/mi&gt;&lt;mo stretchy="false"&gt;(&lt;/mo&gt;&lt;mn&gt;135.44&lt;/mn&gt;&lt;mi mathvariant="normal"&gt;°&lt;/mi&gt;&lt;mo stretchy="false"&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;mn&gt;15.74&lt;/mn&gt;&lt;/mfrac&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mn&gt;0.045&lt;/mn&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;\frac{sin(135.44°)}{15.74} = 0.045&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1.355em;vertical-align:-0.345em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mopen nulldelimiter"&gt;&lt;/span&gt;&lt;span class="mfrac"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:1.01em;"&gt;&lt;span style="top:-2.6550000000000002em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mtight"&gt;1&lt;/span&gt;&lt;span class="mord mtight"&gt;5&lt;/span&gt;&lt;span class="mord mtight"&gt;.&lt;/span&gt;&lt;span class="mord mtight"&gt;7&lt;/span&gt;&lt;span class="mord mtight"&gt;4&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-3.23em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="frac-line" style="border-bottom-width:0.04em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-3.485em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathdefault mtight"&gt;s&lt;/span&gt;&lt;span class="mord mathdefault mtight"&gt;i&lt;/span&gt;&lt;span class="mord mathdefault mtight"&gt;n&lt;/span&gt;&lt;span class="mopen mtight"&gt;(&lt;/span&gt;&lt;span class="mord mtight"&gt;1&lt;/span&gt;&lt;span class="mord mtight"&gt;3&lt;/span&gt;&lt;span class="mord mtight"&gt;5&lt;/span&gt;&lt;span class="mord mtight"&gt;.&lt;/span&gt;&lt;span class="mord mtight"&gt;4&lt;/span&gt;&lt;span class="mord mtight"&gt;4&lt;/span&gt;&lt;span class="mord mtight"&gt;°&lt;/span&gt;&lt;span class="mclose mtight"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.345em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose nulldelimiter"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.64444em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;0&lt;/span&gt;&lt;span class="mord"&gt;.&lt;/span&gt;&lt;span class="mord"&gt;0&lt;/span&gt;&lt;span class="mord"&gt;4&lt;/span&gt;&lt;span class="mord"&gt;5&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mfrac&gt;&lt;mrow&gt;&lt;mi&gt;s&lt;/mi&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;mi&gt;n&lt;/mi&gt;&lt;mo stretchy="false"&gt;(&lt;/mo&gt;&lt;mn&gt;2.56&lt;/mn&gt;&lt;mi mathvariant="normal"&gt;°&lt;/mi&gt;&lt;mo stretchy="false"&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/mfrac&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mn&gt;0.045&lt;/mn&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;\frac{sin(2.56°)}{1} = 0.045&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1.355em;vertical-align:-0.345em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mopen nulldelimiter"&gt;&lt;/span&gt;&lt;span class="mfrac"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:1.01em;"&gt;&lt;span style="top:-2.6550000000000002em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mtight"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-3.23em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="frac-line" style="border-bottom-width:0.04em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-3.485em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathdefault mtight"&gt;s&lt;/span&gt;&lt;span class="mord mathdefault mtight"&gt;i&lt;/span&gt;&lt;span class="mord mathdefault mtight"&gt;n&lt;/span&gt;&lt;span class="mopen mtight"&gt;(&lt;/span&gt;&lt;span class="mord mtight"&gt;2&lt;/span&gt;&lt;span class="mord mtight"&gt;.&lt;/span&gt;&lt;span class="mord mtight"&gt;5&lt;/span&gt;&lt;span class="mord mtight"&gt;6&lt;/span&gt;&lt;span class="mord mtight"&gt;°&lt;/span&gt;&lt;span class="mclose mtight"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.345em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose nulldelimiter"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.64444em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;0&lt;/span&gt;&lt;span class="mord"&gt;.&lt;/span&gt;&lt;span class="mord"&gt;0&lt;/span&gt;&lt;span class="mord"&gt;4&lt;/span&gt;&lt;span class="mord"&gt;5&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mfrac&gt;&lt;mrow&gt;&lt;mi&gt;s&lt;/mi&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;mi&gt;n&lt;/mi&gt;&lt;mo stretchy="false"&gt;(&lt;/mo&gt;&lt;mn&gt;42&lt;/mn&gt;&lt;mi mathvariant="normal"&gt;°&lt;/mi&gt;&lt;mo stretchy="false"&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;mn&gt;15&lt;/mn&gt;&lt;/mfrac&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mn&gt;0.045&lt;/mn&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;\frac{sin(42°)}{15} = 0.045&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1.355em;vertical-align:-0.345em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mopen nulldelimiter"&gt;&lt;/span&gt;&lt;span class="mfrac"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:1.01em;"&gt;&lt;span style="top:-2.6550000000000002em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mtight"&gt;1&lt;/span&gt;&lt;span class="mord mtight"&gt;5&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-3.23em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="frac-line" style="border-bottom-width:0.04em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-3.485em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathdefault mtight"&gt;s&lt;/span&gt;&lt;span class="mord mathdefault mtight"&gt;i&lt;/span&gt;&lt;span class="mord mathdefault mtight"&gt;n&lt;/span&gt;&lt;span class="mopen mtight"&gt;(&lt;/span&gt;&lt;span class="mord mtight"&gt;4&lt;/span&gt;&lt;span class="mord mtight"&gt;2&lt;/span&gt;&lt;span class="mord mtight"&gt;°&lt;/span&gt;&lt;span class="mclose mtight"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.345em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose nulldelimiter"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.64444em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;0&lt;/span&gt;&lt;span class="mord"&gt;.&lt;/span&gt;&lt;span class="mord"&gt;0&lt;/span&gt;&lt;span class="mord"&gt;4&lt;/span&gt;&lt;span class="mord"&gt;5&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Answer&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;A&lt;/mi&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mn&gt;135.44&lt;/mn&gt;&lt;mi mathvariant="normal"&gt;°&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;A = 135.44°&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.68333em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;A&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.69444em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;1&lt;/span&gt;&lt;span class="mord"&gt;3&lt;/span&gt;&lt;span class="mord"&gt;5&lt;/span&gt;&lt;span class="mord"&gt;.&lt;/span&gt;&lt;span class="mord"&gt;4&lt;/span&gt;&lt;span class="mord"&gt;4&lt;/span&gt;&lt;span class="mord"&gt;°&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;B&lt;/mi&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mn&gt;2.56&lt;/mn&gt;&lt;mi mathvariant="normal"&gt;°&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;B = 2.56°&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.68333em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.05017em;"&gt;B&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.69444em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;2&lt;/span&gt;&lt;span class="mord"&gt;.&lt;/span&gt;&lt;span class="mord"&gt;5&lt;/span&gt;&lt;span class="mord"&gt;6&lt;/span&gt;&lt;span class="mord"&gt;°&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;C&lt;/mi&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mn&gt;42&lt;/mn&gt;&lt;mi mathvariant="normal"&gt;°&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;C = 42°&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.68333em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.07153em;"&gt;C&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.69444em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;4&lt;/span&gt;&lt;span class="mord"&gt;2&lt;/span&gt;&lt;span class="mord"&gt;°&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mn&gt;15.74&lt;/mn&gt;&lt;mi&gt;c&lt;/mi&gt;&lt;mi&gt;m&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;a = 15.74cm&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.43056em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;a&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.64444em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;1&lt;/span&gt;&lt;span class="mord"&gt;5&lt;/span&gt;&lt;span class="mord"&gt;.&lt;/span&gt;&lt;span class="mord"&gt;7&lt;/span&gt;&lt;span class="mord"&gt;4&lt;/span&gt;&lt;span class="mord mathdefault"&gt;c&lt;/span&gt;&lt;span class="mord mathdefault"&gt;m&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;b&lt;/mi&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;mi&gt;c&lt;/mi&gt;&lt;mi&gt;m&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;b = 1cm&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.69444em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;b&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.64444em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;1&lt;/span&gt;&lt;span class="mord mathdefault"&gt;c&lt;/span&gt;&lt;span class="mord mathdefault"&gt;m&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;c&lt;/mi&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mn&gt;15&lt;/mn&gt;&lt;mi&gt;c&lt;/mi&gt;&lt;mi&gt;m&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;c = 15cm&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.43056em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;c&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.64444em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;1&lt;/span&gt;&lt;span class="mord"&gt;5&lt;/span&gt;&lt;span class="mord mathdefault"&gt;c&lt;/span&gt;&lt;span class="mord mathdefault"&gt;m&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;See also &lt;a href="law-of-cosines.html"&gt;Law Of Cosines&lt;/a&gt;.&lt;/p&gt;</content><category term="permanent"/><category term="Maths"/><category term="Trigonometry"/><category term="PreLinearAlgebra"/></entry><entry><title>Making Song Covers With My AI Voice</title><link href="http://localhost:8000/making-song-covers-with-my-ai-voice.html" rel="alternate"/><published>2023-05-07T00:00:00+10:00</published><updated>2023-05-07T00:00:00+10:00</updated><author><name>Lex Toumbourou</name></author><id>tag:localhost,2023-05-07:/making-song-covers-with-my-ai-voice.html</id><summary type="html">&lt;p&gt;Training a singing voice conversion model on my voice&lt;/p&gt;</summary><content type="html">&lt;p&gt;Recently, there has been a lot of talk about so-called &lt;a href="https://www.npr.org/2023/04/21/1171032649/ai-music-heart-on-my-sleeve-drake-the-weeknd"&gt;AI music&lt;/a&gt;, which in May 2023, likely refers to taking a song made by a person and applying a voice conversion effect to the vocals to make it sound like Kanye, Drake, or any other artist singing the lyrics. Though if you're reading this in the future, AI music might mean something entirely different.&lt;/p&gt;
&lt;p&gt;This weekend I wanted to play with this voice conversion technology to make AI covers of my own. But, instead of taking a song's vocals and making them sound like Drake, I wanted to take some tunes and hear me singing them.&lt;/p&gt;
&lt;p&gt;The results were amazing! I created a decent model with less than 20 minutes of voice data that sounded like I could sing with perfect pitch across multiple languages. I have no natural singing talent &lt;em&gt;at all&lt;/em&gt;, as you can listen to in the example later in the article.&lt;/p&gt;
&lt;p&gt;If you are eager to get straight to the point: &lt;a href="https://www.youtube.com/watch?v=KES3UPP6pqg&amp;amp;list=PLYwKkLiwYbByrr1Mj4wpfMVrnTH9XeylO&amp;amp;index=1"&gt;this&lt;/a&gt; is the finished product and &lt;a href="https://github.com/svc-develop-team/so-vits-svc"&gt;SoVITS&lt;/a&gt; is the tool I used.&lt;/p&gt;
&lt;p&gt;This article aims to give a high-level look at SoVITS and shows how I trained my voice model.&lt;/p&gt;
&lt;p&gt;I want to share some thoughts about the implications for the music industry and society.&lt;/p&gt;
&lt;h2 id="singing-voice-conversion-svc"&gt;Singing Voice Conversion (SVC)&lt;/h2&gt;
&lt;p&gt;The study of &lt;a href="voice-conversion.html"&gt;Voice Conversion&lt;/a&gt; aims to modify speech audio to make it sound like a different person is speaking. It has legitimate applications in speech therapy, accessibility, entertainment and many other domains. It also has massive potential for misuse, like identity theft, fraud, and starting world wars.&lt;/p&gt;
&lt;p&gt;As the name suggests, singing voice conversion, or SVC, is about taking vocals and making them sound like a different singer. It's just voice conversion + pitch.&lt;/p&gt;
&lt;p&gt;The popularity of SVC has taken off in recent months, with Discord channels forming to allow people to share artist models and datasets, as well as tips for training models and inference. Social networks are full of AI covers, like &lt;a href="https://www.youtube.com/watch?v=IFb5DQHP05I"&gt;Biggie rapping the song N.Y. State of Mind&lt;/a&gt; and &lt;a href="https://www.youtube.com/watch?v=JSSSa62LZZY"&gt;new bangers by Drake&lt;/a&gt;, which he has no involvement in and are sure to be taken down.&lt;/p&gt;
&lt;p&gt;The most widely used implementation of SVC is from a repository called &lt;a href="https://github.com/svc-develop-team/so-vits-svc"&gt;so-vits-svc&lt;/a&gt;, whose name is a blend of &lt;a href="https://github.com/bshall/soft-vc"&gt;SoftVC&lt;/a&gt; and &lt;a href="https://github.com/jaywalnut310/vits"&gt;VITS&lt;/a&gt;. Some alternative implements like &lt;a href="readme.en.html"&gt;RVC&lt;/a&gt; exist, which improves training speed and requires less training data.&lt;/p&gt;
&lt;p&gt;The core idea of the system at training time is to learn a representation of the singer's voice, called an embedding, which captures details of the voice's characteristics. Then at inference time, combine an embedding representation of the source speaker with the target embedding and decode it into a mel spectrogram (a kind of image for sound) before &lt;a href="https://en.wikipedia.org/wiki/Vocoder"&gt;vocoding&lt;/a&gt; into audio.&lt;/p&gt;
&lt;p&gt;Though the original &lt;a href="https://github.com/svc-develop-team/so-vits-svc"&gt;so-vits-svc&lt;/a&gt; project is now archived, many &lt;a href="https://github.com/voicepaw/so-vits-svc-fork"&gt;forks&lt;/a&gt; have sprung up that add various functionality and simplify training and inference.&lt;/p&gt;
&lt;h2 id="creating-a-dataset"&gt;Creating a dataset&lt;/h2&gt;
&lt;p&gt;Creating the dataset is the first step to training an SVC model on a new target voice.&lt;/p&gt;
&lt;p&gt;You can train a new voice with around 100 clips of the target speaker's voice, each between 5-15 seconds (people commonly recommend making them ~10 seconds). You should trim excessive silence and ensure the vocals have minimal audio layers and processing.&lt;/p&gt;
&lt;p&gt;I recorded myself singing six songs across different genres, including rap. I picked songs whose lyrics I know very well. In future, I would choose additional pieces that capture a range of timbres and pitches to improve the model. I used an app called &lt;a href="https://resonantcavity.com/"&gt;Voloco&lt;/a&gt; to record the vocals on my phone, which provides some tools for pitch correction and vocal cleaning. I recorded the songs in my closest facing towards my clothes to minimise unwanted noise (ChatGPT said it would help).&lt;/p&gt;
&lt;p&gt;&lt;img alt="Example of recording the audio in my closet" src="../_media/svc-lex-closet.png"&gt;&lt;/p&gt;
&lt;p&gt;You can listen to the audio clips &lt;a href="https://soundcloud.com/5-footnothing/sets/lex-ai-training-set?si=1ff35fef8db747b4ac5c50113ecbfcb9"&gt;here&lt;/a&gt;, though a warning, I am a terrible singer with an annoying, nasally voice.&lt;/p&gt;
&lt;p&gt;Next, I loaded each wav into Audacity and normalised them via the &lt;strong&gt;Effects&lt;/strong&gt; menu &amp;gt; &lt;strong&gt;Normalise&lt;/strong&gt;, as the recording was quiet.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Normalise audio in Audacity. I got to this from Effects &amp;gt; Normalise" src="../_media/svc-normalise-audio.png"&gt;&lt;/p&gt;
&lt;p&gt;Then, create and extract ~10-second clips around silence. You can highlight a region in Audacity and press Cmd + b (Ctrl + b on PC) to create a label. You don't need to add any text.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Creating labels in Audacity" src="../_media/svc-audacity-labels-example.png"&gt;&lt;/p&gt;
&lt;p&gt;Then you can export each label as an audio clip via &lt;strong&gt;File&lt;/strong&gt; &amp;gt; &lt;strong&gt;Export&lt;/strong&gt; &amp;gt; &lt;strong&gt;Export Multiple&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Export Multiple in Audacity" src="../_media/svc-export-multiple.png"&gt;&lt;/p&gt;
&lt;p&gt;I have a folder with about 113 clips and about 14 minutes of clean audio.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;lex&lt;/span&gt;&lt;span class="nv"&gt;@lex&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;macbook&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nl"&gt;m1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;~/&lt;/span&gt;&lt;span class="n"&gt;datasets&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lex&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ls&lt;/span&gt;
&lt;span class="n"&gt;LEX_ALLBLACK&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;01.&lt;/span&gt;&lt;span class="n"&gt;wav&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="n"&gt;LEX_CHILDRENS_STORY&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;14.&lt;/span&gt;&lt;span class="n"&gt;wav&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;LEX_LITHIUM&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;21.&lt;/span&gt;&lt;span class="n"&gt;wav&lt;/span&gt;
&lt;span class="n"&gt;LEX_ALLBLACK&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;02.&lt;/span&gt;&lt;span class="n"&gt;wav&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="n"&gt;LEX_CHILDRENS_STORY&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;15.&lt;/span&gt;&lt;span class="n"&gt;wav&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;LEX_LITHIUM&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;22.&lt;/span&gt;&lt;span class="n"&gt;wav&lt;/span&gt;
&lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;...&lt;/span&gt;
&lt;span class="n"&gt;lex&lt;/span&gt;&lt;span class="nv"&gt;@lex&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;macbook&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nl"&gt;m1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;~/&lt;/span&gt;&lt;span class="n"&gt;datasets&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lex&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ls&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;l&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;wc&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;l&lt;/span&gt;
&lt;span class="mi"&gt;113&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2 id="training-the-model"&gt;Training the model&lt;/h2&gt;
&lt;p&gt;The authors of the &lt;a href="https://github.com/voicepaw/so-vits-svc-fork"&gt;so-vits-svc forks&lt;/a&gt; have made the training process easy. In &lt;a href="https://colab.research.google.com/github/34j/so-vits-svc-fork/blob/main/notebooks/so-vits-svc-fork-4.0.ipynb"&gt;this Colab notebook&lt;/a&gt;, you merely upload your dataset to your Google Drive and run all the cells and end up with a trained model.&lt;/p&gt;
&lt;p&gt;Here's a breakdown of what's going on in the notebook.&lt;/p&gt;
&lt;p&gt;1. Mount your Google Drive to access your training set.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;from&lt;span class="w"&gt; &lt;/span&gt;google.colab&lt;span class="w"&gt; &lt;/span&gt;import&lt;span class="w"&gt; &lt;/span&gt;drive
drive.mount&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;/content/drive&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;2. Unzip the dataset to a folder called &lt;code&gt;dataset_raw&lt;/code&gt;.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;!mkdir&lt;span class="w"&gt; &lt;/span&gt;-p&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;dataset_raw&amp;quot;&lt;/span&gt;
!unzip&lt;span class="w"&gt; &lt;/span&gt;/content/drive/MyDrive/svc/LexDataset.zip&lt;span class="w"&gt; &lt;/span&gt;-d&lt;span class="w"&gt; &lt;/span&gt;dataset_raw/lex
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;3. Run the preprocessing scripts. These resample the audio to 44khz, normalise the audio and prepare the data for training.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;svc&lt;span class="w"&gt; &lt;/span&gt;pre-resample
svc&lt;span class="w"&gt; &lt;/span&gt;pre-config
svc&lt;span class="w"&gt; &lt;/span&gt;pre-hubert&lt;span class="w"&gt; &lt;/span&gt;-fm&lt;span class="w"&gt; &lt;/span&gt;dio
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;4. Train the model. You specify a path on Google Drive to dump the checkpoints for easy resume ability.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;svc&lt;span class="w"&gt; &lt;/span&gt;train&lt;span class="w"&gt; &lt;/span&gt;--model-path&lt;span class="w"&gt; &lt;/span&gt;drive/MyDrive/svc/lex-20230506/logs/44k
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;I trained it for a few hours to about 2k epochs, then downloaded the weights to my local machine to perform inference.&lt;/p&gt;
&lt;h2 id="transfer-vocals-to-other-songs"&gt;Transfer vocals to other songs&lt;/h2&gt;
&lt;p&gt;This idea of an AI cover is possible thanks to SVC and Meta's magical source separator tool called &lt;a href="https://github.com/facebookresearch/demucs"&gt;Demucs&lt;/a&gt;. It separates songs into their stems: drums, bass, other instruments and vocals. It works unbelievably well.&lt;/p&gt;
&lt;p&gt;In this inference example, I took a cover of Fleetwood Mac's Dreams from YouTube by a singer called &lt;a href="https://www.youtube.com/watch?v=V1LhC1zGouc"&gt;Lanie Gardney&lt;/a&gt;. The reason to use a cover version over the original is that the vocals have less layering and processing, but it still worked okay with the original song.&lt;/p&gt;
&lt;p&gt;I split the stems using the &lt;code&gt;htdemucs_ft&lt;/code&gt; model:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;demucs&lt;span class="w"&gt; &lt;/span&gt;--device&lt;span class="w"&gt; &lt;/span&gt;cpu&lt;span class="w"&gt; &lt;/span&gt;--name&lt;span class="w"&gt; &lt;/span&gt;htdemucs_ft&lt;span class="w"&gt; &lt;/span&gt;songs/Dreams.wav
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;It is slow on a CPU but okay on a GPU. The &lt;code&gt;htdemucs&lt;/code&gt; split stems about 4x faster than &lt;code&gt;htdemucs_ft&lt;/code&gt;, so that's another option for a slight quality penalty.&lt;/p&gt;
&lt;p&gt;And now I have a folder that contains the song stems:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;ls&lt;span class="w"&gt; &lt;/span&gt;separated/htdemucs_ft/Dreams/
bass.wav&lt;span class="w"&gt;    &lt;/span&gt;drums.wav&lt;span class="w"&gt;   &lt;/span&gt;other.wav&lt;span class="w"&gt;   &lt;/span&gt;vocals.wav
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;And can use the &lt;code&gt;svc infer&lt;/code&gt; command to run inference using my voice model:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;svc&lt;span class="w"&gt; &lt;/span&gt;infer&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
--model-path&lt;span class="w"&gt; &lt;/span&gt;models/lex/G_2057.pth&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
--config-path&lt;span class="w"&gt; &lt;/span&gt;models/lex/config.json&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
--transpose&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
--cluster-model-path&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;models/lex/means.pt&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
--cluster-infer-ratio&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;.5&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
--wav_format&lt;span class="w"&gt; &lt;/span&gt;wav&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
separated/htdemucs_ft/Dreams/vocals.wav
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;The inference script takes in a few parameters that are worth paying attention to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;--model-path&lt;/code&gt; - the path to the trained weights (a &lt;code&gt;G_*.pth&lt;/code&gt; file).&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--config-path&lt;/code&gt;: the config used for training&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--transpose&lt;/code&gt; allows you to transpose the source voice before inference. Usually, you would transpose &lt;code&gt;-12&lt;/code&gt; for female-to-male or &lt;code&gt;+12&lt;/code&gt; for male-to-female. Although, it is incredible to hear my voice in the range of Stevie Nicks.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--auto-predict-f0&lt;/code&gt; is an alternative to &lt;code&gt;--transpose&lt;/code&gt;, automatically adjusting the pitch to match the target speaker. It works amazingly for rap, but for singing, it can alter the pitch and make the vocals out of the key.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--cluster-model-path&lt;/code&gt; and &lt;code&gt;--cluster-infer-ratio&lt;/code&gt; can choose an optional clustering scheme to make the trained sound more like the target's timbre. But it makes the results less clear sounding. A fusion method can control the balance between timbre and clarity, allowing an appropriate trade-off point to be manually adjusted. 0.5 is a good starting point.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Now I have my converted vocals in the &lt;code&gt;results&lt;/code&gt; folder.&lt;/p&gt;
&lt;p&gt;Here's how they sound side-by-side against the source.&lt;/p&gt;
&lt;p&gt;Original:&lt;/p&gt;
&lt;p&gt;&lt;audio controls&gt;
  &lt;source src="/_media/lanie-gardner-dreams-part.mp3" type="audio/mpeg"&gt;
&lt;/audio&gt;&lt;/p&gt;
&lt;p&gt;Transferred vocals with transpose 0 (singing in Larie's/Stevie's pitch):&lt;/p&gt;
&lt;p&gt;&lt;audio controls&gt;
  &lt;source src="/_media/lex-dreams-transpose0.mp3" type="audio/mpeg"&gt;
&lt;/audio&gt;&lt;/p&gt;
&lt;p&gt;Transferred vocals with transpose -12 (probably closer to my range if I could sing):&lt;/p&gt;
&lt;p&gt;&lt;audio controls&gt;
  &lt;source src="/_media/lex-dreams-transpose-12.mp3" type="audio/mpeg"&gt;
&lt;/audio&gt;&lt;/p&gt;
&lt;p&gt;And just for good measure, here's me trying to sing it without any autotune (warning: it is bad. I swear I did my best here):&lt;/p&gt;
&lt;p&gt;&lt;audio controls&gt;
  &lt;source src="/_media/lex-singing-dreams-no-ai.mp3" type="audio/mpeg"&gt;
&lt;/audio&gt;&lt;/p&gt;
&lt;p&gt;Then I added the stems and my new vocals into a Logic Pro project and applied these effects:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;a noise gate to clean out some artefacts.&lt;/li&gt;
&lt;li&gt;eq to reduce some noisy parts and remove sub rumble.&lt;/li&gt;
&lt;li&gt;compressor to flatten the peaks&lt;/li&gt;
&lt;li&gt;reverb and delay, which masks imperfections.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;And here's the &lt;a href="https://www.youtube.com/watch?v=KES3UPP6pqg"&gt;finished song on YouTube&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I also tried my voice on my wife's favourite Taiwanese band, Mayday, and &lt;a href="https://www.youtube.com/watch?v=MrNbKMLbZ4E"&gt;it worked well&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I tried transferring to rap, and it had mixed results. I thought &lt;a href="https://www.youtube.com/watch?v=QBj_feKDG-0"&gt;Regulate&lt;/a&gt; worked pretty well.&lt;/p&gt;
&lt;p&gt;In future, I'm planning to run some additional experiments:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;experiment with smaller/larger datasets.&lt;/li&gt;
&lt;li&gt;experiment with just speaking training data transferring to rap and singing.&lt;/li&gt;
&lt;li&gt;trying non-human voices. I'm keen to hear how my dog sounds singing the classics.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="the-implications-for-the-music-industry"&gt;The implications for the music industry&lt;/h2&gt;
&lt;p&gt;Will this effectively destroy the music industry as we know it? Probably not.&lt;/p&gt;
&lt;p&gt;Most uploaded AI covers are already tagged and monetised as per any streaming platform, so it's just more streaming engagement for labels.&lt;/p&gt;
&lt;p&gt;The songs made by unknown producers, using a famous voice like Drake's to get publicity, will likely get taken down for now as they a) violate the artist &lt;a href="https://www.tiktok.com/@lawyerdrummer/video/7223492225462783238"&gt;right to publicity&lt;/a&gt; and b) trained on a corpus such that it violates &lt;a href="https://edition.cnn.com/2023/04/18/tech/universal-music-group-artificial-intelligence/index.html"&gt;copyright law&lt;/a&gt;. Eventually, I think social networks will automatically classify SVC vocals and offer to remove the offending material or compensate the label, and the labels will go back to the BAU monetisation system for working with streaming services.&lt;/p&gt;
&lt;p&gt;Some artists are already starting to monetise their voice models. &lt;a href="https://www.musicradar.com/news/grimes-ai-voice-model"&gt;Grimes already set up a tool&lt;/a&gt; to use her AI voice in exchange for a 50% proceeds split.&lt;/p&gt;
&lt;p&gt;The reality is that people will likely get sick of the deep fake music, and I imagine the fad will die off as attention shifts to the next phase of AI music, whatever that is.&lt;/p&gt;
&lt;p&gt;The next question is: if anyone can sing in perfect pitch, does that invalidate natural talent?&lt;/p&gt;
&lt;p&gt;Again, probably not. There's more to music than the audio file; people want to connect to a person with a story. Humans will always have a role to play in making music for other humans.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://qz.com/work/1329974/jobs-and-ai-if-you-are-worried-about-human-obsolescence-consider-chess"&gt;Chess is more popular than ever&lt;/a&gt;, even though AI mastered it in the 80s.&lt;/p&gt;
&lt;h2 id="the-implications-of-deep-fakes-in-society"&gt;The implications of deep fakes in society&lt;/h2&gt;
&lt;p&gt;The true implication of this tech, and deep fakes in general, is that we can only trust voice (and video) recordings with sufficient verification of authenticity.&lt;/p&gt;
&lt;p&gt;If you have a bank using &lt;em&gt;only&lt;/em&gt; a voice recognition service to authorise you, I recommend turning off this feature immediately or changing banks if you cannot.&lt;/p&gt;
&lt;p&gt;Voice conversion isn't a future technology; it works exceptionally well in the present. As you can see from the simplicity of training a model, it's a tool available to everyone, regardless of technical capability.&lt;/p&gt;
&lt;p&gt;Perhaps, we should be wary of how much of our audio we publicly release to the world.&lt;/p&gt;
&lt;p&gt;Now that we know the potential for misuse and danger, we must educate our family and friends about the potential for fakers to scam us.&lt;/p&gt;
&lt;p&gt;Verify and check everything you hear.&lt;/p&gt;
&lt;h2 id="conclusion"&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;I created a decent model with minimal effort that sounded like I could sing across languages with perfect pitch. This technology is super easy to use and will only get easier. The music industry will be fine - they will likely cash in on it, and the demand for human-made music will continue. Still, deep fakes will be an increasingly significant problem for society, and we should be aware of how capable the tools are right now.&lt;/p&gt;</content><category term="permanent"/></entry><entry><title>Recursion</title><link href="http://localhost:8000/recursion.html" rel="alternate"/><published>2023-04-15T00:00:00+10:00</published><updated>2023-04-15T00:00:00+10:00</updated><author><name>Lex Toumbourou</name></author><id>tag:localhost,2023-04-15:/recursion.html</id><summary type="html">&lt;p&gt;a method of solving a problem where a function calls itself&lt;/p&gt;</summary><content type="html">&lt;p&gt;&lt;strong&gt;Recursion&lt;/strong&gt; is a problem-solving method where a &lt;a href="function.html"&gt;Function&lt;/a&gt; calls itself with a smaller instance of the problem. A &lt;a href="base-case.html"&gt;Base Case&lt;/a&gt; is required to ensure the calls eventually terminate.&lt;/p&gt;
&lt;p&gt;All recursive problems can be solved using iteration; however, some algorithms, particularly a &lt;a href="divide-and-conquer.html"&gt;Divide-and-Conquer&lt;/a&gt; algorithm, can be solved much more elegantly with recursion.&lt;/p&gt;
&lt;h2 id="fibonacci-numbers-example"&gt;Fibonacci numbers example&lt;/h2&gt;
&lt;p&gt;The canonical example of a recursive solution is the Fibonacci number sequence. The sequence is the sum of the previous two numbers:&lt;/p&gt;
&lt;p&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mn&gt;0&lt;/mn&gt;&lt;mo separator="true"&gt;,&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;mo separator="true"&gt;,&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;mo separator="true"&gt;,&lt;/mo&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;mo separator="true"&gt;,&lt;/mo&gt;&lt;mn&gt;3&lt;/mn&gt;&lt;mo separator="true"&gt;,&lt;/mo&gt;&lt;mn&gt;5&lt;/mn&gt;&lt;mo separator="true"&gt;,&lt;/mo&gt;&lt;mn&gt;8&lt;/mn&gt;&lt;mo separator="true"&gt;,&lt;/mo&gt;&lt;mn&gt;13&lt;/mn&gt;&lt;mo separator="true"&gt;,&lt;/mo&gt;&lt;mi mathvariant="normal"&gt;.&lt;/mi&gt;&lt;mi mathvariant="normal"&gt;.&lt;/mi&gt;&lt;mi mathvariant="normal"&gt;.&lt;/mi&gt;&lt;mo separator="true"&gt;,&lt;/mo&gt;&lt;mi&gt;n&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;0, 1, 1, 2, 3, 5, 8, 13, ..., n&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.8388800000000001em;vertical-align:-0.19444em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;0&lt;/span&gt;&lt;span class="mpunct"&gt;,&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;1&lt;/span&gt;&lt;span class="mpunct"&gt;,&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;1&lt;/span&gt;&lt;span class="mpunct"&gt;,&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;2&lt;/span&gt;&lt;span class="mpunct"&gt;,&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;3&lt;/span&gt;&lt;span class="mpunct"&gt;,&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;5&lt;/span&gt;&lt;span class="mpunct"&gt;,&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;8&lt;/span&gt;&lt;span class="mpunct"&gt;,&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;1&lt;/span&gt;&lt;span class="mord"&gt;3&lt;/span&gt;&lt;span class="mpunct"&gt;,&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;.&lt;/span&gt;&lt;span class="mord"&gt;.&lt;/span&gt;&lt;span class="mord"&gt;.&lt;/span&gt;&lt;span class="mpunct"&gt;,&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;n&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;It can be expressed recursively as: &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;msub&gt;&lt;mi&gt;F&lt;/mi&gt;&lt;mi&gt;n&lt;/mi&gt;&lt;/msub&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;msub&gt;&lt;mi&gt;F&lt;/mi&gt;&lt;mrow&gt;&lt;mi&gt;n&lt;/mi&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/mrow&gt;&lt;/msub&gt;&lt;mo&gt;+&lt;/mo&gt;&lt;msub&gt;&lt;mi&gt;F&lt;/mi&gt;&lt;mrow&gt;&lt;mi&gt;n&lt;/mi&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;/mrow&gt;&lt;/msub&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;F_n = F_{n - 1} + F_{n - 2}&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.83333em;vertical-align:-0.15em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault" style="margin-right:0.13889em;"&gt;F&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.151392em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:-0.13889em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mathdefault mtight"&gt;n&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.891661em;vertical-align:-0.208331em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault" style="margin-right:0.13889em;"&gt;F&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.301108em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:-0.13889em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathdefault mtight"&gt;n&lt;/span&gt;&lt;span class="mbin mtight"&gt;−&lt;/span&gt;&lt;span class="mord mtight"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.208331em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;+&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.891661em;vertical-align:-0.208331em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault" style="margin-right:0.13889em;"&gt;F&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.301108em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:-0.13889em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathdefault mtight"&gt;n&lt;/span&gt;&lt;span class="mbin mtight"&gt;−&lt;/span&gt;&lt;span class="mord mtight"&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.208331em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;The base cases are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mtext&gt;Fibonacci&lt;/mtext&gt;&lt;mo stretchy="false"&gt;(&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;mo stretchy="false"&gt;)&lt;/mo&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;\text{Fibonacci}(1) = 1&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1em;vertical-align:-0.25em;"&gt;&lt;/span&gt;&lt;span class="mord text"&gt;&lt;span class="mord"&gt;Fibonacci&lt;/span&gt;&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord"&gt;1&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.64444em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mtext&gt;Fibonacci&lt;/mtext&gt;&lt;mo stretchy="false"&gt;(&lt;/mo&gt;&lt;mn&gt;0&lt;/mn&gt;&lt;mo stretchy="false"&gt;)&lt;/mo&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mn&gt;0&lt;/mn&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;\text{Fibonacci}(0) = 0&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1em;vertical-align:-0.25em;"&gt;&lt;/span&gt;&lt;span class="mord text"&gt;&lt;span class="mord"&gt;Fibonacci&lt;/span&gt;&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord"&gt;0&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.64444em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;0&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;We visualise a call to &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mtext&gt;Fibonacci&lt;/mtext&gt;&lt;mo stretchy="false"&gt;(&lt;/mo&gt;&lt;mn&gt;5&lt;/mn&gt;&lt;mo stretchy="false"&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;\text{Fibonacci}(5)&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1em;vertical-align:-0.25em;"&gt;&lt;/span&gt;&lt;span class="mord text"&gt;&lt;span class="mord"&gt;Fibonacci&lt;/span&gt;&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord"&gt;5&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; by representing the call stack as a tree, like this:&lt;/p&gt;
&lt;p&gt;&lt;img alt="Recursion Tree" src="../_media/recursion-tree.png"&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;a href="http://faculty.ycp.edu/~dhovemey/fall2005/cs102/lecture/fib5.png"&gt;Source dhovemey at ycp&lt;/a&gt; (page now unavailable)&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;As you can see, each branch opens two new branches until we finally reach the bottom of the tree (the base case) and can finally propagate the answers back to the top.&lt;/p&gt;
&lt;p&gt;In pseudocode:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Fibonacci&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;n&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="nx"&gt;assert&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;n&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;0&lt;/span&gt;

&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;n&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;2&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;then&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;n&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nx"&gt;end&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;

&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Fibonacci&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;n&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Fibonacci&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;n&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nx"&gt;end&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;function&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2 id="factorial-example"&gt;Factorial example&lt;/h2&gt;
&lt;p&gt;The Factorial algorithm is:&lt;/p&gt;
&lt;p&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;n&lt;/mi&gt;&lt;mo stretchy="false"&gt;!&lt;/mo&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mi&gt;n&lt;/mi&gt;&lt;mo&gt;×&lt;/mo&gt;&lt;mo stretchy="false"&gt;(&lt;/mo&gt;&lt;mi&gt;n&lt;/mi&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;mo stretchy="false"&gt;)&lt;/mo&gt;&lt;mo&gt;×&lt;/mo&gt;&lt;mo stretchy="false"&gt;(&lt;/mo&gt;&lt;mi&gt;n&lt;/mi&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;mo stretchy="false"&gt;)&lt;/mo&gt;&lt;mo&gt;×&lt;/mo&gt;&lt;mi mathvariant="normal"&gt;.&lt;/mi&gt;&lt;mi mathvariant="normal"&gt;.&lt;/mi&gt;&lt;mi mathvariant="normal"&gt;.&lt;/mi&gt;&lt;mo&gt;×&lt;/mo&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;mo&gt;×&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;n! = n \times (n - 1) \times (n - 2) \times ... \times 2 \times 1&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.69444em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;n&lt;/span&gt;&lt;span class="mclose"&gt;!&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.66666em;vertical-align:-0.08333em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;n&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;×&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1em;vertical-align:-0.25em;"&gt;&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord mathdefault"&gt;n&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;−&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1em;vertical-align:-0.25em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;1&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;×&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1em;vertical-align:-0.25em;"&gt;&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord mathdefault"&gt;n&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;−&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1em;vertical-align:-0.25em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;2&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;×&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.66666em;vertical-align:-0.08333em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;.&lt;/span&gt;&lt;span class="mord"&gt;.&lt;/span&gt;&lt;span class="mord"&gt;.&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;×&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.72777em;vertical-align:-0.08333em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;2&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;×&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.64444em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Which can be expressed recursively simply as:&lt;/p&gt;
&lt;p&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;n&lt;/mi&gt;&lt;mo stretchy="false"&gt;!&lt;/mo&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mi&gt;n&lt;/mi&gt;&lt;mo&gt;×&lt;/mo&gt;&lt;mo stretchy="false"&gt;(&lt;/mo&gt;&lt;mi&gt;n&lt;/mi&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;mo stretchy="false"&gt;)&lt;/mo&gt;&lt;mo stretchy="false"&gt;!&lt;/mo&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;n! = n \times (n - 1)!&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.69444em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;n&lt;/span&gt;&lt;span class="mclose"&gt;!&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.66666em;vertical-align:-0.08333em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;n&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;×&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1em;vertical-align:-0.25em;"&gt;&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord mathdefault"&gt;n&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;−&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1em;vertical-align:-0.25em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;1&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;span class="mclose"&gt;!&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;The base case for Factorial comes at &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mn&gt;0&lt;/mn&gt;&lt;mo stretchy="false"&gt;!&lt;/mo&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;0! = 1&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.69444em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;0&lt;/span&gt;&lt;span class="mclose"&gt;!&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.64444em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;We can rewrite the function in pseudocode as follows:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Factorial&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;n&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;n&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;0&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;then&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;1&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nx"&gt;end&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;

&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;n&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;x&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Factorial&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;n&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nx"&gt;end&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;function&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</content><category term="permanent"/><category term="ComputerScience"/></entry><entry><title>Function</title><link href="http://localhost:8000/function.html" rel="alternate"/><published>2023-04-09T00:00:00+10:00</published><updated>2023-04-14T00:00:00+10:00</updated><author><name>Lex Toumbourou</name></author><id>tag:localhost,2023-04-09:/function.html</id><summary type="html">&lt;p&gt;A rule that matches inputs with outputs.&lt;/p&gt;</summary><content type="html">&lt;p&gt;A function is a rule that associates inputs with outputs.&lt;/p&gt;
&lt;p&gt;They form the core of many aspects of mathematics and numerous programming languages.&lt;/p&gt;
&lt;p&gt;The fundamental explanation of functions comes from &lt;a href="set-theory.html"&gt;Set Theory&lt;/a&gt;, in which a function is regarded as the mapping from one set, &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;A&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;A&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.68333em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;A&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;, to another set, &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;B&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;B&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.68333em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.05017em;"&gt;B&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;, expressed as:&lt;/p&gt;
&lt;p&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;f&lt;/mi&gt;&lt;mo&gt;:&lt;/mo&gt;&lt;mi&gt;A&lt;/mi&gt;&lt;mo&gt;→&lt;/mo&gt;&lt;mi&gt;B&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;f : A \rightarrow B&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.8888799999999999em;vertical-align:-0.19444em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.10764em;"&gt;f&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;:&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.68333em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;A&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;→&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.68333em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.05017em;"&gt;B&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Functions are commonly denoted using the letters &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;f&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;f&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.8888799999999999em;vertical-align:-0.19444em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.10764em;"&gt;f&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;, &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;g&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;g&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.625em;vertical-align:-0.19444em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.03588em;"&gt;g&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;, &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;i&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.65952em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;i&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;, or &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;j&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;j&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.85396em;vertical-align:-0.19444em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.05724em;"&gt;j&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;.&lt;/p&gt;
&lt;p&gt;Consider a function, &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;f&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;f&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.8888799999999999em;vertical-align:-0.19444em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.10764em;"&gt;f&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;, that maps a set of people's names to their ages:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;A&lt;/mi&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mo stretchy="false"&gt;{&lt;/mo&gt;&lt;mtext&gt;Sarah&lt;/mtext&gt;&lt;mo separator="true"&gt;,&lt;/mo&gt;&lt;mtext&gt;Geoff&lt;/mtext&gt;&lt;mo separator="true"&gt;,&lt;/mo&gt;&lt;mtext&gt;Clyde&lt;/mtext&gt;&lt;mo separator="true"&gt;,&lt;/mo&gt;&lt;mtext&gt;Betty&lt;/mtext&gt;&lt;mo stretchy="false"&gt;}&lt;/mo&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;A = \{\text{Sarah}, \text{Geoff}, \text{Clyde}, \text{Betty}\}&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.68333em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;A&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1em;vertical-align:-0.25em;"&gt;&lt;/span&gt;&lt;span class="mopen"&gt;{&lt;/span&gt;&lt;span class="mord text"&gt;&lt;span class="mord"&gt;Sarah&lt;/span&gt;&lt;/span&gt;&lt;span class="mpunct"&gt;,&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mord text"&gt;&lt;span class="mord"&gt;Geoff&lt;/span&gt;&lt;/span&gt;&lt;span class="mpunct"&gt;,&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mord text"&gt;&lt;span class="mord"&gt;Clyde&lt;/span&gt;&lt;/span&gt;&lt;span class="mpunct"&gt;,&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mord text"&gt;&lt;span class="mord"&gt;Betty&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;B&lt;/mi&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mo stretchy="false"&gt;{&lt;/mo&gt;&lt;mn&gt;0&lt;/mn&gt;&lt;mo separator="true"&gt;,&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;mo separator="true"&gt;,&lt;/mo&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;mo separator="true"&gt;,&lt;/mo&gt;&lt;mo&gt;⋯&lt;/mo&gt;&lt;mtext&gt; &lt;/mtext&gt;&lt;mo separator="true"&gt;,&lt;/mo&gt;&lt;mn&gt;120&lt;/mn&gt;&lt;mo stretchy="false"&gt;}&lt;/mo&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;B = \{0, 1, 2, \cdots, 120 \}&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.68333em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.05017em;"&gt;B&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1em;vertical-align:-0.25em;"&gt;&lt;/span&gt;&lt;span class="mopen"&gt;{&lt;/span&gt;&lt;span class="mord"&gt;0&lt;/span&gt;&lt;span class="mpunct"&gt;,&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;1&lt;/span&gt;&lt;span class="mpunct"&gt;,&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;2&lt;/span&gt;&lt;span class="mpunct"&gt;,&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="minner"&gt;⋯&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mpunct"&gt;,&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;1&lt;/span&gt;&lt;span class="mord"&gt;2&lt;/span&gt;&lt;span class="mord"&gt;0&lt;/span&gt;&lt;span class="mclose"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;f&lt;/mi&gt;&lt;mo&gt;:&lt;/mo&gt;&lt;mi&gt;A&lt;/mi&gt;&lt;mo&gt;→&lt;/mo&gt;&lt;mi&gt;B&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;f : A \rightarrow B&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.8888799999999999em;vertical-align:-0.19444em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.10764em;"&gt;f&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;:&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.68333em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;A&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;→&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.68333em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.05017em;"&gt;B&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img alt="An example of the above mapping" src="../_media/function-diagram.png"&gt;&lt;/p&gt;
&lt;p&gt;The set of possible inputs is called the &lt;a href="function-domain.html"&gt;Domain of a Function&lt;/a&gt; or &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;msub&gt;&lt;mi&gt;D&lt;/mi&gt;&lt;mi&gt;f&lt;/mi&gt;&lt;/msub&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;D_f&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.969438em;vertical-align:-0.286108em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault" style="margin-right:0.02778em;"&gt;D&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.3361079999999999em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:-0.02778em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mathdefault mtight" style="margin-right:0.10764em;"&gt;f&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.286108em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;:&lt;/p&gt;
&lt;p&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mstyle mathcolor="lightblue"&gt;&lt;msub&gt;&lt;mi&gt;D&lt;/mi&gt;&lt;mi&gt;f&lt;/mi&gt;&lt;/msub&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mi&gt;A&lt;/mi&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mo stretchy="false"&gt;{&lt;/mo&gt;&lt;mi&gt;C&lt;/mi&gt;&lt;mi&gt;l&lt;/mi&gt;&lt;mi&gt;y&lt;/mi&gt;&lt;mi&gt;d&lt;/mi&gt;&lt;mi&gt;e&lt;/mi&gt;&lt;mo separator="true"&gt;,&lt;/mo&gt;&lt;mi&gt;S&lt;/mi&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mi&gt;r&lt;/mi&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mi&gt;h&lt;/mi&gt;&lt;mo separator="true"&gt;,&lt;/mo&gt;&lt;mi&gt;G&lt;/mi&gt;&lt;mi&gt;e&lt;/mi&gt;&lt;mi&gt;o&lt;/mi&gt;&lt;mi&gt;f&lt;/mi&gt;&lt;mi&gt;f&lt;/mi&gt;&lt;mo separator="true"&gt;,&lt;/mo&gt;&lt;mi&gt;B&lt;/mi&gt;&lt;mi&gt;e&lt;/mi&gt;&lt;mi&gt;t&lt;/mi&gt;&lt;mi&gt;t&lt;/mi&gt;&lt;mi&gt;y&lt;/mi&gt;&lt;mo stretchy="false"&gt;}&lt;/mo&gt;&lt;/mstyle&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;\color{lightblue}D_f = A = \{Clyde, Sarah, Geoff, Betty\}&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.969438em;vertical-align:-0.286108em;"&gt;&lt;/span&gt;&lt;span class="mord" style="color:lightblue;"&gt;&lt;span class="mord mathdefault" style="margin-right:0.02778em;color:lightblue;"&gt;D&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.3361079999999999em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:-0.02778em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight" style="color:lightblue;"&gt;&lt;span class="mord mathdefault mtight" style="margin-right:0.10764em;color:lightblue;"&gt;f&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.286108em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel" style="color:lightblue;"&gt;=&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.68333em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="color:lightblue;"&gt;A&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel" style="color:lightblue;"&gt;=&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1em;vertical-align:-0.25em;"&gt;&lt;/span&gt;&lt;span class="mopen" style="color:lightblue;"&gt;{&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.07153em;color:lightblue;"&gt;C&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.01968em;color:lightblue;"&gt;l&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.03588em;color:lightblue;"&gt;y&lt;/span&gt;&lt;span class="mord mathdefault" style="color:lightblue;"&gt;d&lt;/span&gt;&lt;span class="mord mathdefault" style="color:lightblue;"&gt;e&lt;/span&gt;&lt;span class="mpunct" style="color:lightblue;"&gt;,&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.05764em;color:lightblue;"&gt;S&lt;/span&gt;&lt;span class="mord mathdefault" style="color:lightblue;"&gt;a&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.02778em;color:lightblue;"&gt;r&lt;/span&gt;&lt;span class="mord mathdefault" style="color:lightblue;"&gt;a&lt;/span&gt;&lt;span class="mord mathdefault" style="color:lightblue;"&gt;h&lt;/span&gt;&lt;span class="mpunct" style="color:lightblue;"&gt;,&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="color:lightblue;"&gt;G&lt;/span&gt;&lt;span class="mord mathdefault" style="color:lightblue;"&gt;e&lt;/span&gt;&lt;span class="mord mathdefault" style="color:lightblue;"&gt;o&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.10764em;color:lightblue;"&gt;f&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.10764em;color:lightblue;"&gt;f&lt;/span&gt;&lt;span class="mpunct" style="color:lightblue;"&gt;,&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.05017em;color:lightblue;"&gt;B&lt;/span&gt;&lt;span class="mord mathdefault" style="color:lightblue;"&gt;e&lt;/span&gt;&lt;span class="mord mathdefault" style="color:lightblue;"&gt;t&lt;/span&gt;&lt;span class="mord mathdefault" style="color:lightblue;"&gt;t&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.03588em;color:lightblue;"&gt;y&lt;/span&gt;&lt;span class="mclose" style="color:lightblue;"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;The set of possible outputs is the &lt;font color="orange"&gt;&lt;b&gt; co-domain &lt;/b&gt;&lt;/font&gt; or &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;c&lt;/mi&gt;&lt;mi&gt;o&lt;/mi&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;msub&gt;&lt;mi&gt;D&lt;/mi&gt;&lt;mi&gt;f&lt;/mi&gt;&lt;/msub&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;co-D_f&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.66666em;vertical-align:-0.08333em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;c&lt;/span&gt;&lt;span class="mord mathdefault"&gt;o&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;−&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.969438em;vertical-align:-0.286108em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault" style="margin-right:0.02778em;"&gt;D&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.3361079999999999em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:-0.02778em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mathdefault mtight" style="margin-right:0.10764em;"&gt;f&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.286108em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; of the function.&lt;/p&gt;
&lt;p&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mstyle mathcolor="orange"&gt;&lt;mi&gt;c&lt;/mi&gt;&lt;mi&gt;o&lt;/mi&gt;&lt;msub&gt;&lt;mi&gt;D&lt;/mi&gt;&lt;mi&gt;f&lt;/mi&gt;&lt;/msub&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mi&gt;B&lt;/mi&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mo stretchy="false"&gt;{&lt;/mo&gt;&lt;mn&gt;0&lt;/mn&gt;&lt;mo separator="true"&gt;,&lt;/mo&gt;&lt;mn&gt;1...120&lt;/mn&gt;&lt;mo stretchy="false"&gt;}&lt;/mo&gt;&lt;/mstyle&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;\color{orange}coD_f = B = \{0, 1 ... 120\}&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.969438em;vertical-align:-0.286108em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="color:orange;"&gt;c&lt;/span&gt;&lt;span class="mord mathdefault" style="color:orange;"&gt;o&lt;/span&gt;&lt;span class="mord" style="color:orange;"&gt;&lt;span class="mord mathdefault" style="margin-right:0.02778em;color:orange;"&gt;D&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.3361079999999999em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:-0.02778em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight" style="color:orange;"&gt;&lt;span class="mord mathdefault mtight" style="margin-right:0.10764em;color:orange;"&gt;f&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.286108em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel" style="color:orange;"&gt;=&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.68333em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.05017em;color:orange;"&gt;B&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel" style="color:orange;"&gt;=&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1em;vertical-align:-0.25em;"&gt;&lt;/span&gt;&lt;span class="mopen" style="color:orange;"&gt;{&lt;/span&gt;&lt;span class="mord" style="color:orange;"&gt;0&lt;/span&gt;&lt;span class="mpunct" style="color:orange;"&gt;,&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mord" style="color:orange;"&gt;1&lt;/span&gt;&lt;span class="mord" style="color:orange;"&gt;.&lt;/span&gt;&lt;span class="mord" style="color:orange;"&gt;.&lt;/span&gt;&lt;span class="mord" style="color:orange;"&gt;.&lt;/span&gt;&lt;span class="mord" style="color:orange;"&gt;1&lt;/span&gt;&lt;span class="mord" style="color:orange;"&gt;2&lt;/span&gt;&lt;span class="mord" style="color:orange;"&gt;0&lt;/span&gt;&lt;span class="mclose" style="color:orange;"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;In this case, the co-domain includes all plausible human ages.&lt;/p&gt;
&lt;p&gt;Given the input set &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;A&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;A&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.68333em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;A&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;, the set of possible outputs is &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mo stretchy="false"&gt;{&lt;/mo&gt;&lt;mn&gt;11&lt;/mn&gt;&lt;mo separator="true"&gt;,&lt;/mo&gt;&lt;mn&gt;34&lt;/mn&gt;&lt;mo separator="true"&gt;,&lt;/mo&gt;&lt;mn&gt;98&lt;/mn&gt;&lt;mo stretchy="false"&gt;}&lt;/mo&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;\{11, 34, 98\}&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1em;vertical-align:-0.25em;"&gt;&lt;/span&gt;&lt;span class="mopen"&gt;{&lt;/span&gt;&lt;span class="mord"&gt;1&lt;/span&gt;&lt;span class="mord"&gt;1&lt;/span&gt;&lt;span class="mpunct"&gt;,&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;3&lt;/span&gt;&lt;span class="mord"&gt;4&lt;/span&gt;&lt;span class="mpunct"&gt;,&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;9&lt;/span&gt;&lt;span class="mord"&gt;8&lt;/span&gt;&lt;span class="mclose"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;. This set is known as the &lt;font style="color: darkred"&gt;&lt;b&gt;range&lt;/b&gt;&lt;/font&gt; of the function ( &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;R&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;R&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.68333em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.00773em;"&gt;R&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; ).&lt;/p&gt;
&lt;p&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mstyle mathcolor="darkred"&gt;&lt;mi&gt;R&lt;/mi&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mo stretchy="false"&gt;{&lt;/mo&gt;&lt;mn&gt;11&lt;/mn&gt;&lt;mo separator="true"&gt;,&lt;/mo&gt;&lt;mn&gt;34&lt;/mn&gt;&lt;mo separator="true"&gt;,&lt;/mo&gt;&lt;mn&gt;98&lt;/mn&gt;&lt;mo stretchy="false"&gt;}&lt;/mo&gt;&lt;/mstyle&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;\color{darkred}R = \{11, 34, 98\}&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.68333em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.00773em;color:darkred;"&gt;R&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel" style="color:darkred;"&gt;=&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1em;vertical-align:-0.25em;"&gt;&lt;/span&gt;&lt;span class="mopen" style="color:darkred;"&gt;{&lt;/span&gt;&lt;span class="mord" style="color:darkred;"&gt;1&lt;/span&gt;&lt;span class="mord" style="color:darkred;"&gt;1&lt;/span&gt;&lt;span class="mpunct" style="color:darkred;"&gt;,&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mord" style="color:darkred;"&gt;3&lt;/span&gt;&lt;span class="mord" style="color:darkred;"&gt;4&lt;/span&gt;&lt;span class="mpunct" style="color:darkred;"&gt;,&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mord" style="color:darkred;"&gt;9&lt;/span&gt;&lt;span class="mord" style="color:darkred;"&gt;8&lt;/span&gt;&lt;span class="mclose" style="color:darkred;"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;To show a single input-output relationship, we could write:&lt;/p&gt;
&lt;p&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;f&lt;/mi&gt;&lt;mo stretchy="false"&gt;(&lt;/mo&gt;&lt;mi&gt;S&lt;/mi&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mi&gt;r&lt;/mi&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mi&gt;h&lt;/mi&gt;&lt;mo stretchy="false"&gt;)&lt;/mo&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mn&gt;34&lt;/mn&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;f(Sarah) = 34&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1em;vertical-align:-0.25em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.10764em;"&gt;f&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.05764em;"&gt;S&lt;/span&gt;&lt;span class="mord mathdefault"&gt;a&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.02778em;"&gt;r&lt;/span&gt;&lt;span class="mord mathdefault"&gt;a&lt;/span&gt;&lt;span class="mord mathdefault"&gt;h&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.64444em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;3&lt;/span&gt;&lt;span class="mord"&gt;4&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;The output 34 is the function's &lt;strong&gt;image&lt;/strong&gt;, and the corresponding input, &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;S&lt;/mi&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mi&gt;r&lt;/mi&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mi&gt;h&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;Sarah&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.69444em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.05764em;"&gt;S&lt;/span&gt;&lt;span class="mord mathdefault"&gt;a&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.02778em;"&gt;r&lt;/span&gt;&lt;span class="mord mathdefault"&gt;a&lt;/span&gt;&lt;span class="mord mathdefault"&gt;h&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;, is the &lt;strong&gt;pre-image&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Functions are considered a "well-behaved relation". That means that for each input, there must be exactly one output. This example qualifies as a function because each person has a unique, valid age.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;We can express functions as the relationship between an input variable and its output. For example, the function to convert temperature in Fahrenheit to Celsius is as follows:&lt;/p&gt;
&lt;p&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;f&lt;/mi&gt;&lt;mo stretchy="false"&gt;(&lt;/mo&gt;&lt;mtext&gt;x&lt;/mtext&gt;&lt;mo stretchy="false"&gt;)&lt;/mo&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mo stretchy="false"&gt;(&lt;/mo&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;mn&gt;32&lt;/mn&gt;&lt;mo stretchy="false"&gt;)&lt;/mo&gt;&lt;mo&gt;×&lt;/mo&gt;&lt;mfrac&gt;&lt;mn&gt;5&lt;/mn&gt;&lt;mn&gt;9&lt;/mn&gt;&lt;/mfrac&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;{f(\text{x}) = (x - 32) \times \frac{5}{9}}&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1.190108em;vertical-align:-0.345em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault" style="margin-right:0.10764em;"&gt;f&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord text"&gt;&lt;span class="mord"&gt;x&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord mathdefault"&gt;x&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;−&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;3&lt;/span&gt;&lt;span class="mord"&gt;2&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;×&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mopen nulldelimiter"&gt;&lt;/span&gt;&lt;span class="mfrac"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.845108em;"&gt;&lt;span style="top:-2.6550000000000002em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mtight"&gt;9&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-3.23em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="frac-line" style="border-bottom-width:0.04em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-3.394em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mtight"&gt;5&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.345em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose nulldelimiter"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;The complete definition of a function should include its &lt;strong&gt;domain&lt;/strong&gt; and &lt;strong&gt;co-domain&lt;/strong&gt;. Since Fahrenheit and Celsius are real numbers, so we would define the function using the &lt;a href="special-infinite-sets.html"&gt;Special Infinite Set&lt;/a&gt; &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi mathvariant="double-struck"&gt;R&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;\mathbb{R}&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.68889em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathbb"&gt;R&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;.&lt;/p&gt;
&lt;p&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;f&lt;/mi&gt;&lt;mo&gt;:&lt;/mo&gt;&lt;mi mathvariant="double-struck"&gt;R&lt;/mi&gt;&lt;mo&gt;→&lt;/mo&gt;&lt;mi mathvariant="double-struck"&gt;R&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;f : \mathbb{R} \rightarrow \mathbb{R}&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.8888799999999999em;vertical-align:-0.19444em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.10764em;"&gt;f&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;:&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.68889em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathbb"&gt;R&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;→&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.68889em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathbb"&gt;R&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;The two parts combined give the complete definition of the function:&lt;/p&gt;
&lt;p&gt;Let &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;f&lt;/mi&gt;&lt;mo&gt;:&lt;/mo&gt;&lt;mi mathvariant="double-struck"&gt;R&lt;/mi&gt;&lt;mo&gt;→&lt;/mo&gt;&lt;mi mathvariant="double-struck"&gt;R&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;f: \mathbb{R} \to \mathbb{R}&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.8888799999999999em;vertical-align:-0.19444em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.10764em;"&gt;f&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;:&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.68889em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathbb"&gt;R&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;→&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.68889em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathbb"&gt;R&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;, &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;f&lt;/mi&gt;&lt;mo stretchy="false"&gt;(&lt;/mo&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;mo stretchy="false"&gt;)&lt;/mo&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mo stretchy="false"&gt;(&lt;/mo&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;mn&gt;32&lt;/mn&gt;&lt;mo stretchy="false"&gt;)&lt;/mo&gt;&lt;mo&gt;×&lt;/mo&gt;&lt;mfrac&gt;&lt;mn&gt;5&lt;/mn&gt;&lt;mn&gt;9&lt;/mn&gt;&lt;/mfrac&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;f(x) = (x - 32) \times \frac{5}{9}&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1em;vertical-align:-0.25em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.10764em;"&gt;f&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord mathdefault"&gt;x&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1em;vertical-align:-0.25em;"&gt;&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord mathdefault"&gt;x&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;−&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1em;vertical-align:-0.25em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;3&lt;/span&gt;&lt;span class="mord"&gt;2&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;×&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1.190108em;vertical-align:-0.345em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mopen nulldelimiter"&gt;&lt;/span&gt;&lt;span class="mfrac"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.845108em;"&gt;&lt;span style="top:-2.6550000000000002em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mtight"&gt;9&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-3.23em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="frac-line" style="border-bottom-width:0.04em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-3.394em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mtight"&gt;5&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.345em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose nulldelimiter"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;In programming languages, mixing the type declaration with the implementation is common. Below is an example of the function &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;f&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;f&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.8888799999999999em;vertical-align:-0.19444em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.10764em;"&gt;f&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; in Python. It takes an input &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;x&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.43056em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;x&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; as a &lt;code&gt;float&lt;/code&gt; and returns a &lt;code&gt;float&lt;/code&gt;, described using the notation &lt;code&gt;-&amp;gt; float&lt;/code&gt;.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;f&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;float&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;float&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;  &lt;span class="mi"&gt;32&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2 id="plotting-functions"&gt;Plotting Functions&lt;/h2&gt;
&lt;p&gt;We can create a set of input values and their corresponding outputs, then visualise them geometrically by drawing the inputs and outputs on the x-axis and y-axis, respectively. This visualisation is called a &lt;strong&gt;graph of a function&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Here is a plot of the Fahrenheit to Celsius function earlier, plotted across a range of inputs: from -100 to 100.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Fahrenheit to celsisus function plot" src="../_media/fahrenheit-to-celsius.png"&gt;&lt;/p&gt;
&lt;p&gt;When the graph is a straight line like this, it's called a &lt;a href="linear-function.html"&gt;Linear Function&lt;/a&gt;. There are other names for common function types:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="linear-function.html"&gt;Linear Function&lt;/a&gt;: A function where the output is proportional to the input.&lt;/li&gt;
&lt;li&gt;&lt;a href="quadratic-function.html"&gt;Quadratic Function&lt;/a&gt;: A function where the output is proportional to the square of the input.&lt;/li&gt;
&lt;li&gt;Exponential Function: A function where the output is proportional to a fixed base raised to the power of the input.&lt;/li&gt;
&lt;li&gt;Polynomial Function: A function that we represent as a sum of terms, each consisting of a constant multiplied by a variable raised to a non-negative integer power. Linear and quadratic functions are specific types of polynomial functions.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;p&gt;There are some other important properties of functions:&lt;/p&gt;
&lt;h2 id="one-to-one-injective"&gt;One-to-one / Injective&lt;/h2&gt;
&lt;p&gt;We consider a function "one-to-one" or "injective" if each output is associated with exactly one input and no two different inputs have the same image.&lt;/p&gt;
&lt;h2 id="onto-surjective"&gt;Onto / Surjective&lt;/h2&gt;
&lt;p&gt;A function is "onto" or "surjective" if every element in the &lt;strong&gt;co-domain&lt;/strong&gt; is output for at least one input in the &lt;strong&gt;domain&lt;/strong&gt;.&lt;/p&gt;
&lt;h2 id="bijective"&gt;Bijective&lt;/h2&gt;
&lt;p&gt;We call a function Bijective if it is both injective and surjective.&lt;/p&gt;
&lt;h2 id="continuity"&gt;Continuity&lt;/h2&gt;
&lt;p&gt;A function is continuous at a point x = c under the following conditions:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;f(c) is defined.&lt;/li&gt;
&lt;li&gt;The limit of f(x) as x approaches c exists.&lt;/li&gt;
&lt;li&gt;The limit of f(x) as x approaches c is equal to f(c).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That is, &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;msub&gt;&lt;mo&gt;&lt;mi&gt;lim&lt;/mi&gt;&lt;mo&gt;⁡&lt;/mo&gt;&lt;/mo&gt;&lt;mrow&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;mo&gt;→&lt;/mo&gt;&lt;mi&gt;c&lt;/mi&gt;&lt;/mrow&gt;&lt;/msub&gt;&lt;mi&gt;f&lt;/mi&gt;&lt;mo stretchy="false"&gt;(&lt;/mo&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;mo stretchy="false"&gt;)&lt;/mo&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mi&gt;f&lt;/mi&gt;&lt;mo stretchy="false"&gt;(&lt;/mo&gt;&lt;mi&gt;c&lt;/mi&gt;&lt;mo stretchy="false"&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;\lim_{x \rightarrow c} f(x) = f(c)&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1em;vertical-align:-0.25em;"&gt;&lt;/span&gt;&lt;span class="mop"&gt;&lt;span class="mop"&gt;lim&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.151392em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathdefault mtight"&gt;x&lt;/span&gt;&lt;span class="mrel mtight"&gt;→&lt;/span&gt;&lt;span class="mord mathdefault mtight"&gt;c&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.10764em;"&gt;f&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord mathdefault"&gt;x&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1em;vertical-align:-0.25em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.10764em;"&gt;f&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord mathdefault"&gt;c&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;A function is discontinuous at a point x = c if any of the above conditions are not met.&lt;/p&gt;
&lt;p&gt;A function might only have discontinuatities specific internals&lt;/p&gt;
&lt;p&gt;Some special cases apply:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Polynomials are always continuous.&lt;/li&gt;
&lt;li&gt;Rational functions: Continuous when the denominator is not zeo.&lt;/li&gt;
&lt;li&gt;Trig functions: continuous on their domain.&lt;/li&gt;
&lt;li&gt;Exponential and log functions: continuous when defined.&lt;/li&gt;
&lt;/ul&gt;</content><category term="permanent"/><category term="DiscreteMath"/></entry><entry><title>Graph</title><link href="http://localhost:8000/graph.html" rel="alternate"/><published>2023-04-09T00:00:00+10:00</published><updated>2025-02-22T00:00:00+10:00</updated><author><name>Lex Toumbourou</name></author><id>tag:localhost,2023-04-09:/graph.html</id><summary type="html">&lt;p&gt;the study of graphs&lt;/p&gt;</summary><content type="html">&lt;p&gt;A &lt;a href="graph-theory.html"&gt;Graph Theory&lt;/a&gt; is a visual representation of interconnected systems using circles and lines. Circles represent nodes or vertices. Lines represent links or edges. Graphs are used to analyze and solve problems in various interconnected systems.&lt;/p&gt;
&lt;p&gt;&lt;img src="data:image/svg+xml;base64,PHN2ZyBhcmlhLXJvbGVkZXNjcmlwdGlvbj0iZmxvd2NoYXJ0LXYyIiByb2xlPSJncmFwaGljcy1kb2N1bWVudCBkb2N1bWVudCIgdmlld0JveD0iLTggLTggNDU4LjgxMjUgMTYwLjM4MjgxMjUiIHN0eWxlPSJtYXgtd2lkdGg6IDQ1OC44MTJweDsgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7IiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB3aWR0aD0iMTAwJSIgaWQ9Im15LXN2ZyI+PHN0eWxlPiNteS1zdmd7Zm9udC1mYW1pbHk6InRyZWJ1Y2hldCBtcyIsdmVyZGFuYSxhcmlhbCxzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNnB4O2ZpbGw6IzMzMzt9I215LXN2ZyAuZXJyb3ItaWNvbntmaWxsOiM1NTIyMjI7fSNteS1zdmcgLmVycm9yLXRleHR7ZmlsbDojNTUyMjIyO3N0cm9rZTojNTUyMjIyO30jbXktc3ZnIC5lZGdlLXRoaWNrbmVzcy1ub3JtYWx7c3Ryb2tlLXdpZHRoOjJweDt9I215LXN2ZyAuZWRnZS10aGlja25lc3MtdGhpY2t7c3Ryb2tlLXdpZHRoOjMuNXB4O30jbXktc3ZnIC5lZGdlLXBhdHRlcm4tc29saWR7c3Ryb2tlLWRhc2hhcnJheTowO30jbXktc3ZnIC5lZGdlLXBhdHRlcm4tZGFzaGVke3N0cm9rZS1kYXNoYXJyYXk6Mzt9I215LXN2ZyAuZWRnZS1wYXR0ZXJuLWRvdHRlZHtzdHJva2UtZGFzaGFycmF5OjI7fSNteS1zdmcgLm1hcmtlcntmaWxsOiMzMzMzMzM7c3Ryb2tlOiMzMzMzMzM7fSNteS1zdmcgLm1hcmtlci5jcm9zc3tzdHJva2U6IzMzMzMzMzt9I215LXN2ZyBzdmd7Zm9udC1mYW1pbHk6InRyZWJ1Y2hldCBtcyIsdmVyZGFuYSxhcmlhbCxzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNnB4O30jbXktc3ZnIC5sYWJlbHtmb250LWZhbWlseToidHJlYnVjaGV0IG1zIix2ZXJkYW5hLGFyaWFsLHNhbnMtc2VyaWY7Y29sb3I6IzMzMzt9I215LXN2ZyAuY2x1c3Rlci1sYWJlbCB0ZXh0e2ZpbGw6IzMzMzt9I215LXN2ZyAuY2x1c3Rlci1sYWJlbCBzcGFuLCNteS1zdmcgcHtjb2xvcjojMzMzO30jbXktc3ZnIC5sYWJlbCB0ZXh0LCNteS1zdmcgc3BhbiwjbXktc3ZnIHB7ZmlsbDojMzMzO2NvbG9yOiMzMzM7fSNteS1zdmcgLm5vZGUgcmVjdCwjbXktc3ZnIC5ub2RlIGNpcmNsZSwjbXktc3ZnIC5ub2RlIGVsbGlwc2UsI215LXN2ZyAubm9kZSBwb2x5Z29uLCNteS1zdmcgLm5vZGUgcGF0aHtmaWxsOiNFQ0VDRkY7c3Ryb2tlOiM5MzcwREI7c3Ryb2tlLXdpZHRoOjFweDt9I215LXN2ZyAuZmxvd2NoYXJ0LWxhYmVsIHRleHR7dGV4dC1hbmNob3I6bWlkZGxlO30jbXktc3ZnIC5ub2RlIC5rYXRleCBwYXRoe2ZpbGw6IzAwMDtzdHJva2U6IzAwMDtzdHJva2Utd2lkdGg6MXB4O30jbXktc3ZnIC5ub2RlIC5sYWJlbHt0ZXh0LWFsaWduOmNlbnRlcjt9I215LXN2ZyAubm9kZS5jbGlja2FibGV7Y3Vyc29yOnBvaW50ZXI7fSNteS1zdmcgLmFycm93aGVhZFBhdGh7ZmlsbDojMzMzMzMzO30jbXktc3ZnIC5lZGdlUGF0aCAucGF0aHtzdHJva2U6IzMzMzMzMztzdHJva2Utd2lkdGg6Mi4wcHg7fSNteS1zdmcgLmZsb3djaGFydC1saW5re3N0cm9rZTojMzMzMzMzO2ZpbGw6bm9uZTt9I215LXN2ZyAuZWRnZUxhYmVse2JhY2tncm91bmQtY29sb3I6I2U4ZThlODt0ZXh0LWFsaWduOmNlbnRlcjt9I215LXN2ZyAuZWRnZUxhYmVsIHJlY3R7b3BhY2l0eTowLjU7YmFja2dyb3VuZC1jb2xvcjojZThlOGU4O2ZpbGw6I2U4ZThlODt9I215LXN2ZyAubGFiZWxCa2d7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDIzMiwgMjMyLCAyMzIsIDAuNSk7fSNteS1zdmcgLmNsdXN0ZXIgcmVjdHtmaWxsOiNmZmZmZGU7c3Ryb2tlOiNhYWFhMzM7c3Ryb2tlLXdpZHRoOjFweDt9I215LXN2ZyAuY2x1c3RlciB0ZXh0e2ZpbGw6IzMzMzt9I215LXN2ZyAuY2x1c3RlciBzcGFuLCNteS1zdmcgcHtjb2xvcjojMzMzO30jbXktc3ZnIGRpdi5tZXJtYWlkVG9vbHRpcHtwb3NpdGlvbjphYnNvbHV0ZTt0ZXh0LWFsaWduOmNlbnRlcjttYXgtd2lkdGg6MjAwcHg7cGFkZGluZzoycHg7Zm9udC1mYW1pbHk6InRyZWJ1Y2hldCBtcyIsdmVyZGFuYSxhcmlhbCxzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMnB4O2JhY2tncm91bmQ6aHNsKDgwLCAxMDAlLCA5Ni4yNzQ1MDk4MDM5JSk7Ym9yZGVyOjFweCBzb2xpZCAjYWFhYTMzO2JvcmRlci1yYWRpdXM6MnB4O3BvaW50ZXItZXZlbnRzOm5vbmU7ei1pbmRleDoxMDA7fSNteS1zdmcgLmZsb3djaGFydFRpdGxlVGV4dHt0ZXh0LWFuY2hvcjptaWRkbGU7Zm9udC1zaXplOjE4cHg7ZmlsbDojMzMzO30jbXktc3ZnIDpyb290ey0tbWVybWFpZC1mb250LWZhbWlseToidHJlYnVjaGV0IG1zIix2ZXJkYW5hLGFyaWFsLHNhbnMtc2VyaWY7fSNteS1zdmcgLm5vZGUxJmd0Oyp7ZmlsbDojYjliMjhiIWltcG9ydGFudDtzdHJva2U6IzFCM0QyRiFpbXBvcnRhbnQ7c3Ryb2tlLXdpZHRoOjJweCFpbXBvcnRhbnQ7fSNteS1zdmcgLm5vZGUxIHNwYW57ZmlsbDojYjliMjhiIWltcG9ydGFudDtzdHJva2U6IzFCM0QyRiFpbXBvcnRhbnQ7c3Ryb2tlLXdpZHRoOjJweCFpbXBvcnRhbnQ7fSNteS1zdmcgLm5vZGUyJmd0Oyp7ZmlsbDojOGJhN2I5IWltcG9ydGFudDtzdHJva2U6IzFCM0QyRiFpbXBvcnRhbnQ7c3Ryb2tlLXdpZHRoOjJweCFpbXBvcnRhbnQ7fSNteS1zdmcgLm5vZGUyIHNwYW57ZmlsbDojOGJhN2I5IWltcG9ydGFudDtzdHJva2U6IzFCM0QyRiFpbXBvcnRhbnQ7c3Ryb2tlLXdpZHRoOjJweCFpbXBvcnRhbnQ7fSNteS1zdmcgLm5vZGUzJmd0Oyp7ZmlsbDojYjk4Yjk5IWltcG9ydGFudDtzdHJva2U6IzFCM0QyRiFpbXBvcnRhbnQ7c3Ryb2tlLXdpZHRoOjJweCFpbXBvcnRhbnQ7fSNteS1zdmcgLm5vZGUzIHNwYW57ZmlsbDojYjk4Yjk5IWltcG9ydGFudDtzdHJva2U6IzFCM0QyRiFpbXBvcnRhbnQ7c3Ryb2tlLXdpZHRoOjJweCFpbXBvcnRhbnQ7fSNteS1zdmcgLm5vZGU0Jmd0Oyp7ZmlsbDojN0E5NzZCIWltcG9ydGFudDtzdHJva2U6IzFCM0QyRiFpbXBvcnRhbnQ7c3Ryb2tlLXdpZHRoOjJweCFpbXBvcnRhbnQ7fSNteS1zdmcgLm5vZGU0IHNwYW57ZmlsbDojN0E5NzZCIWltcG9ydGFudDtzdHJva2U6IzFCM0QyRiFpbXBvcnRhbnQ7c3Ryb2tlLXdpZHRoOjJweCFpbXBvcnRhbnQ7fTwvc3R5bGU+PGc+PG1hcmtlciBvcmllbnQ9ImF1dG8iIG1hcmtlckhlaWdodD0iMTIiIG1hcmtlcldpZHRoPSIxMiIgbWFya2VyVW5pdHM9InVzZXJTcGFjZU9uVXNlIiByZWZZPSI1IiByZWZYPSI2IiB2aWV3Qm94PSIwIDAgMTAgMTAiIGNsYXNzPSJtYXJrZXIgZmxvd2NoYXJ0IiBpZD0ibXktc3ZnX2Zsb3djaGFydC1wb2ludEVuZCI+PHBhdGggc3R5bGU9InN0cm9rZS13aWR0aDogMTsgc3Ryb2tlLWRhc2hhcnJheTogMSwgMDsiIGNsYXNzPSJhcnJvd01hcmtlclBhdGgiIGQ9Ik0gMCAwIEwgMTAgNSBMIDAgMTAgeiIvPjwvbWFya2VyPjxtYXJrZXIgb3JpZW50PSJhdXRvIiBtYXJrZXJIZWlnaHQ9IjEyIiBtYXJrZXJXaWR0aD0iMTIiIG1hcmtlclVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgcmVmWT0iNSIgcmVmWD0iNC41IiB2aWV3Qm94PSIwIDAgMTAgMTAiIGNsYXNzPSJtYXJrZXIgZmxvd2NoYXJ0IiBpZD0ibXktc3ZnX2Zsb3djaGFydC1wb2ludFN0YXJ0Ij48cGF0aCBzdHlsZT0ic3Ryb2tlLXdpZHRoOiAxOyBzdHJva2UtZGFzaGFycmF5OiAxLCAwOyIgY2xhc3M9ImFycm93TWFya2VyUGF0aCIgZD0iTSAwIDUgTCAxMCAxMCBMIDEwIDAgeiIvPjwvbWFya2VyPjxtYXJrZXIgb3JpZW50PSJhdXRvIiBtYXJrZXJIZWlnaHQ9IjExIiBtYXJrZXJXaWR0aD0iMTEiIG1hcmtlclVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgcmVmWT0iNSIgcmVmWD0iMTEiIHZpZXdCb3g9IjAgMCAxMCAxMCIgY2xhc3M9Im1hcmtlciBmbG93Y2hhcnQiIGlkPSJteS1zdmdfZmxvd2NoYXJ0LWNpcmNsZUVuZCI+PGNpcmNsZSBzdHlsZT0ic3Ryb2tlLXdpZHRoOiAxOyBzdHJva2UtZGFzaGFycmF5OiAxLCAwOyIgY2xhc3M9ImFycm93TWFya2VyUGF0aCIgcj0iNSIgY3k9IjUiIGN4PSI1Ii8+PC9tYXJrZXI+PG1hcmtlciBvcmllbnQ9ImF1dG8iIG1hcmtlckhlaWdodD0iMTEiIG1hcmtlcldpZHRoPSIxMSIgbWFya2VyVW5pdHM9InVzZXJTcGFjZU9uVXNlIiByZWZZPSI1IiByZWZYPSItMSIgdmlld0JveD0iMCAwIDEwIDEwIiBjbGFzcz0ibWFya2VyIGZsb3djaGFydCIgaWQ9Im15LXN2Z19mbG93Y2hhcnQtY2lyY2xlU3RhcnQiPjxjaXJjbGUgc3R5bGU9InN0cm9rZS13aWR0aDogMTsgc3Ryb2tlLWRhc2hhcnJheTogMSwgMDsiIGNsYXNzPSJhcnJvd01hcmtlclBhdGgiIHI9IjUiIGN5PSI1IiBjeD0iNSIvPjwvbWFya2VyPjxtYXJrZXIgb3JpZW50PSJhdXRvIiBtYXJrZXJIZWlnaHQ9IjExIiBtYXJrZXJXaWR0aD0iMTEiIG1hcmtlclVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgcmVmWT0iNS4yIiByZWZYPSIxMiIgdmlld0JveD0iMCAwIDExIDExIiBjbGFzcz0ibWFya2VyIGNyb3NzIGZsb3djaGFydCIgaWQ9Im15LXN2Z19mbG93Y2hhcnQtY3Jvc3NFbmQiPjxwYXRoIHN0eWxlPSJzdHJva2Utd2lkdGg6IDI7IHN0cm9rZS1kYXNoYXJyYXk6IDEsIDA7IiBjbGFzcz0iYXJyb3dNYXJrZXJQYXRoIiBkPSJNIDEsMSBsIDksOSBNIDEwLDEgbCAtOSw5Ii8+PC9tYXJrZXI+PG1hcmtlciBvcmllbnQ9ImF1dG8iIG1hcmtlckhlaWdodD0iMTEiIG1hcmtlcldpZHRoPSIxMSIgbWFya2VyVW5pdHM9InVzZXJTcGFjZU9uVXNlIiByZWZZPSI1LjIiIHJlZlg9Ii0xIiB2aWV3Qm94PSIwIDAgMTEgMTEiIGNsYXNzPSJtYXJrZXIgY3Jvc3MgZmxvd2NoYXJ0IiBpZD0ibXktc3ZnX2Zsb3djaGFydC1jcm9zc1N0YXJ0Ij48cGF0aCBzdHlsZT0ic3Ryb2tlLXdpZHRoOiAyOyBzdHJva2UtZGFzaGFycmF5OiAxLCAwOyIgY2xhc3M9ImFycm93TWFya2VyUGF0aCIgZD0iTSAxLDEgbCA5LDkgTSAxMCwxIGwgLTksOSIvPjwvbWFya2VyPjxnIGNsYXNzPSJyb290Ij48ZyBjbGFzcz0iY2x1c3RlcnMiLz48ZyBjbGFzcz0iZWRnZVBhdGhzIj48cGF0aCBzdHlsZT0iZmlsbDpub25lOyIgY2xhc3M9ImVkZ2UtdGhpY2tuZXNzLW5vcm1hbCBlZGdlLXBhdHRlcm4tc29saWQgZmxvd2NoYXJ0LWxpbmsgTFMtQSBMRS1CIiBpZD0iTC1BLUItMCIgZD0iTTY3Ljg2Myw1My44MjNMNzIuODUyLDUwLjkyMUM3Ny44NDEsNDguMDIsODcuODE5LDQyLjIxNyw5Ni45NzUsMzkuMzE1QzEwNi4xMywzNi40MTQsMTE0LjQ2NCwzNi40MTQsMTE4LjYzLDM2LjQxNEwxMjIuNzk3LDM2LjQxNCIvPjxwYXRoIHN0eWxlPSJmaWxsOm5vbmU7IiBjbGFzcz0iZWRnZS10aGlja25lc3Mtbm9ybWFsIGVkZ2UtcGF0dGVybi1zb2xpZCBmbG93Y2hhcnQtbGluayBMUy1BIExFLUMiIGlkPSJMLUEtQy0wIiBkPSJNNjUuNTg0LDkzLjg3TDcwLjk1Myw5Ny44NzFDNzYuMzIyLDEwMS44NzIsODcuMDU5LDEwOS44NzMsMTAyLjY2NCwxMTMuODc0QzExOC4yNjgsMTE3Ljg3NSwxMzguNzQsMTE3Ljg3NSwxNTkuMjExLDExNy44NzVDMTc5LjY4MiwxMTcuODc1LDIwMC4xNTQsMTE3Ljg3NSwyMTQuNjM1LDExNy4xODVDMjI5LjExNiwxMTYuNDk1LDIzNy42MDcsMTE1LjExNCwyNDEuODUzLDExNC40MjRMMjQ2LjA5OCwxMTMuNzM0Ii8+PHBhdGggc3R5bGU9ImZpbGw6bm9uZTsiIGNsYXNzPSJlZGdlLXRoaWNrbmVzcy1ub3JtYWwgZWRnZS1wYXR0ZXJuLXNvbGlkIGZsb3djaGFydC1saW5rIExTLUIgTEUtRCIgaWQ9IkwtQi1ELTAiIGQ9Ik0xOTUuMTUyLDMwLjU2MkwxOTkuMzk3LDI5Ljg3MUMyMDMuNjQzLDI5LjE3OSwyMTIuMTM0LDI3Ljc5NywyMjYuNjMxLDI3LjEwNUMyNDEuMTI4LDI2LjQxNCwyNjEuNjMsMjYuNDE0LDI4Mi4xMzMsMjYuNDE0QzMwMi42MzUsMjYuNDE0LDMyMy4xMzgsMjYuNDE0LDMzOC43NTksMzAuMzY3QzM1NC4zODEsMzQuMzIxLDM2NS4xMjEsNDIuMjI4LDM3MC40OTEsNDYuMTgxTDM3NS44NjEsNTAuMTM0Ii8+PHBhdGggc3R5bGU9ImZpbGw6bm9uZTsiIGNsYXNzPSJlZGdlLXRoaWNrbmVzcy1ub3JtYWwgZWRnZS1wYXR0ZXJuLXNvbGlkIGZsb3djaGFydC1saW5rIExTLUMgTEUtRCIgaWQ9IkwtQy1ELTAiIGQ9Ik0zMTguNjQxLDEwNy44NzVMMzIyLjgwNywxMDcuODc1QzMyNi45NzQsMTA3Ljg3NSwzMzUuMzA3LDEwNy44NzUsMzQ0LjQ2NSwxMDUuMDAxQzM1My42MjMsMTAyLjEyNiwzNjMuNjA2LDk2LjM3NywzNjguNTk3LDkzLjUwM0wzNzMuNTg5LDkwLjYyOSIvPjxwYXRoIHN0eWxlPSJmaWxsOm5vbmU7IiBjbGFzcz0iZWRnZS10aGlja25lc3Mtbm9ybWFsIGVkZ2UtcGF0dGVybi1zb2xpZCBmbG93Y2hhcnQtbGluayBMUy1CIExFLUMiIGlkPSJMLUItQy0wIiBkPSJNMTkwLjY4LDU0LjczNUwxOTUuNjcxLDU3LjY0QzIwMC42NjIsNjAuNTQ2LDIxMC42NDMsNjYuMzU3LDIyMC42MjMsNzIuMTU5QzIzMC42MDMsNzcuOTYxLDI0MC41ODEsODMuNzUzLDI0NS41NzEsODYuNjVMMjUwLjU2LDg5LjU0NiIvPjwvZz48ZyBjbGFzcz0iZWRnZUxhYmVscyI+PGcgY2xhc3M9ImVkZ2VMYWJlbCI+PGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCwgMCkiIGNsYXNzPSJsYWJlbCI+PGZvcmVpZ25PYmplY3QgaGVpZ2h0PSIwIiB3aWR0aD0iMCI+PGRpdiBzdHlsZT0iZGlzcGxheTogaW5saW5lLWJsb2NrOyB3aGl0ZS1zcGFjZTogbm93cmFwOyIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPjxzcGFuIGNsYXNzPSJlZGdlTGFiZWwiPjwvc3Bhbj48L2Rpdj48L2ZvcmVpZ25PYmplY3Q+PC9nPjwvZz48ZyBjbGFzcz0iZWRnZUxhYmVsIj48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLCAwKSIgY2xhc3M9ImxhYmVsIj48Zm9yZWlnbk9iamVjdCBoZWlnaHQ9IjAiIHdpZHRoPSIwIj48ZGl2IHN0eWxlPSJkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IHdoaXRlLXNwYWNlOiBub3dyYXA7IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+PHNwYW4gY2xhc3M9ImVkZ2VMYWJlbCI+PC9zcGFuPjwvZGl2PjwvZm9yZWlnbk9iamVjdD48L2c+PC9nPjxnIGNsYXNzPSJlZGdlTGFiZWwiPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAsIDApIiBjbGFzcz0ibGFiZWwiPjxmb3JlaWduT2JqZWN0IGhlaWdodD0iMCIgd2lkdGg9IjAiPjxkaXYgc3R5bGU9ImRpc3BsYXk6IGlubGluZS1ibG9jazsgd2hpdGUtc3BhY2U6IG5vd3JhcDsiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj48c3BhbiBjbGFzcz0iZWRnZUxhYmVsIj48L3NwYW4+PC9kaXY+PC9mb3JlaWduT2JqZWN0PjwvZz48L2c+PGcgY2xhc3M9ImVkZ2VMYWJlbCI+PGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCwgMCkiIGNsYXNzPSJsYWJlbCI+PGZvcmVpZ25PYmplY3QgaGVpZ2h0PSIwIiB3aWR0aD0iMCI+PGRpdiBzdHlsZT0iZGlzcGxheTogaW5saW5lLWJsb2NrOyB3aGl0ZS1zcGFjZTogbm93cmFwOyIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPjxzcGFuIGNsYXNzPSJlZGdlTGFiZWwiPjwvc3Bhbj48L2Rpdj48L2ZvcmVpZ25PYmplY3Q+PC9nPjwvZz48ZyBjbGFzcz0iZWRnZUxhYmVsIj48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLCAwKSIgY2xhc3M9ImxhYmVsIj48Zm9yZWlnbk9iamVjdCBoZWlnaHQ9IjAiIHdpZHRoPSIwIj48ZGl2IHN0eWxlPSJkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IHdoaXRlLXNwYWNlOiBub3dyYXA7IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+PHNwYW4gY2xhc3M9ImVkZ2VMYWJlbCI+PC9zcGFuPjwvZGl2PjwvZm9yZWlnbk9iamVjdD48L2c+PC9nPjwvZz48ZyBjbGFzcz0ibm9kZXMiPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDM2LjM5ODQzNzUsIDcyLjEyMTA5Mzc1KSIgZGF0YS1pZD0iQSIgZGF0YS1ub2RlPSJ0cnVlIiBpZD0iZmxvd2NoYXJ0LUEtMCIgY2xhc3M9Im5vZGUgZGVmYXVsdCBub2RlMSBmbG93Y2hhcnQtbGFiZWwiPjxjaXJjbGUgaGVpZ2h0PSIzNCIgd2lkdGg9IjcyLjc5Njg3NSIgcj0iMzYuMzk4NDM3NSIgcnk9IjAiIHJ4PSIwIiBzdHlsZT0iIi8+PGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTI4Ljg5ODQzNzUsIC05LjUpIiBzdHlsZT0iIiBjbGFzcz0ibGFiZWwiPjxyZWN0Lz48Zm9yZWlnbk9iamVjdCBoZWlnaHQ9IjE5IiB3aWR0aD0iNTcuNzk2ODc1Ij48ZGl2IHN0eWxlPSJkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IHdoaXRlLXNwYWNlOiBub3dyYXA7IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+PHNwYW4gY2xhc3M9Im5vZGVMYWJlbCI+Tm9kZSBBPC9zcGFuPjwvZGl2PjwvZm9yZWlnbk9iamVjdD48L2c+PC9nPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDE1OS4yMTA5Mzc1LCAzNi40MTQwNjI1KSIgZGF0YS1pZD0iQiIgZGF0YS1ub2RlPSJ0cnVlIiBpZD0iZmxvd2NoYXJ0LUItMSIgY2xhc3M9Im5vZGUgZGVmYXVsdCBub2RlMiBmbG93Y2hhcnQtbGFiZWwiPjxjaXJjbGUgaGVpZ2h0PSIzNCIgd2lkdGg9IjcyLjgyODEyNSIgcj0iMzYuNDE0MDYyNSIgcnk9IjAiIHJ4PSIwIiBzdHlsZT0iIi8+PGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTI4LjkxNDA2MjUsIC05LjUpIiBzdHlsZT0iIiBjbGFzcz0ibGFiZWwiPjxyZWN0Lz48Zm9yZWlnbk9iamVjdCBoZWlnaHQ9IjE5IiB3aWR0aD0iNTcuODI4MTI1Ij48ZGl2IHN0eWxlPSJkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IHdoaXRlLXNwYWNlOiBub3dyYXA7IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+PHNwYW4gY2xhc3M9Im5vZGVMYWJlbCI+Tm9kZSBCPC9zcGFuPjwvZGl2PjwvZm9yZWlnbk9iamVjdD48L2c+PC9nPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDI4Mi4xMzI4MTI1LCAxMDcuODc1KSIgZGF0YS1pZD0iQyIgZGF0YS1ub2RlPSJ0cnVlIiBpZD0iZmxvd2NoYXJ0LUMtMyIgY2xhc3M9Im5vZGUgZGVmYXVsdCBub2RlMyBmbG93Y2hhcnQtbGFiZWwiPjxjaXJjbGUgaGVpZ2h0PSIzNCIgd2lkdGg9IjczLjAxNTYyNSIgcj0iMzYuNTA3ODEyNSIgcnk9IjAiIHJ4PSIwIiBzdHlsZT0iIi8+PGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTI5LjAwNzgxMjUsIC05LjUpIiBzdHlsZT0iIiBjbGFzcz0ibGFiZWwiPjxyZWN0Lz48Zm9yZWlnbk9iamVjdCBoZWlnaHQ9IjE5IiB3aWR0aD0iNTguMDE1NjI1Ij48ZGl2IHN0eWxlPSJkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IHdoaXRlLXNwYWNlOiBub3dyYXA7IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+PHNwYW4gY2xhc3M9Im5vZGVMYWJlbCI+Tm9kZSBDPC9zcGFuPjwvZGl2PjwvZm9yZWlnbk9iamVjdD48L2c+PC9nPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDQwNS43MjY1NjI1LCA3Mi4xMjEwOTM3NSkiIGRhdGEtaWQ9IkQiIGRhdGEtbm9kZT0idHJ1ZSIgaWQ9ImZsb3djaGFydC1ELTUiIGNsYXNzPSJub2RlIGRlZmF1bHQgbm9kZTQgZmxvd2NoYXJ0LWxhYmVsIj48Y2lyY2xlIGhlaWdodD0iMzQiIHdpZHRoPSI3NC4xNzE4NzUiIHI9IjM3LjA4NTkzNzUiIHJ5PSIwIiByeD0iMCIgc3R5bGU9IiIvPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yOS41ODU5Mzc1LCAtOS41KSIgc3R5bGU9IiIgY2xhc3M9ImxhYmVsIj48cmVjdC8+PGZvcmVpZ25PYmplY3QgaGVpZ2h0PSIxOSIgd2lkdGg9IjU5LjE3MTg3NSI+PGRpdiBzdHlsZT0iZGlzcGxheTogaW5saW5lLWJsb2NrOyB3aGl0ZS1zcGFjZTogbm93cmFwOyIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPjxzcGFuIGNsYXNzPSJub2RlTGFiZWwiPk5vZGUgRDwvc3Bhbj48L2Rpdj48L2ZvcmVpZ25PYmplY3Q+PC9nPjwvZz48L2c+PC9nPjwvZz48L3N2Zz4="&gt;&lt;/p&gt;
&lt;h2 id="historical-origin-the-seven-bridges-of-konigsberg"&gt;Historical Origin: The &lt;a href="seven-bridges-of-knigsberg.html"&gt;Seven Bridges of Königsberg&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;img alt="konigsberg-bridges.png" src="../_media/konigsberg-bridges.png"&gt;&lt;/p&gt;
&lt;p&gt;Graph theory originated from a famous mathematical problem in the 18th century in Königsberg (now Kaliningrad, Russia). The city had seven bridges connecting four land areas separated by the Pregel River. The puzzle asked whether it was possible to walk through the city crossing each bridge exactly once.&lt;/p&gt;
&lt;p&gt;In 1735, mathematician Leonhard Euler proved this was impossible by abstracting the problem. He represented land masses as points (A, B, C, D) and bridges as lines connecting them, creating what would become the foundation of graph theory.&lt;/p&gt;
&lt;p&gt;&lt;img src="data:image/svg+xml;base64,PHN2ZyBhcmlhLXJvbGVkZXNjcmlwdGlvbj0iZmxvd2NoYXJ0LXYyIiByb2xlPSJncmFwaGljcy1kb2N1bWVudCBkb2N1bWVudCIgdmlld0JveD0iLTQyLjMyNzk5OTExNDk5MDIzNCAtOCAyNDEuMzU5MjUyOTI5Njg3NSAzMjcuNzUiIHN0eWxlPSJtYXgtd2lkdGg6IDI0MS4zNTlweDsgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7IiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB3aWR0aD0iMTAwJSIgaWQ9Im15LXN2ZyI+PHN0eWxlPiNteS1zdmd7Zm9udC1mYW1pbHk6InRyZWJ1Y2hldCBtcyIsdmVyZGFuYSxhcmlhbCxzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNnB4O2ZpbGw6IzMzMzt9I215LXN2ZyAuZXJyb3ItaWNvbntmaWxsOiM1NTIyMjI7fSNteS1zdmcgLmVycm9yLXRleHR7ZmlsbDojNTUyMjIyO3N0cm9rZTojNTUyMjIyO30jbXktc3ZnIC5lZGdlLXRoaWNrbmVzcy1ub3JtYWx7c3Ryb2tlLXdpZHRoOjJweDt9I215LXN2ZyAuZWRnZS10aGlja25lc3MtdGhpY2t7c3Ryb2tlLXdpZHRoOjMuNXB4O30jbXktc3ZnIC5lZGdlLXBhdHRlcm4tc29saWR7c3Ryb2tlLWRhc2hhcnJheTowO30jbXktc3ZnIC5lZGdlLXBhdHRlcm4tZGFzaGVke3N0cm9rZS1kYXNoYXJyYXk6Mzt9I215LXN2ZyAuZWRnZS1wYXR0ZXJuLWRvdHRlZHtzdHJva2UtZGFzaGFycmF5OjI7fSNteS1zdmcgLm1hcmtlcntmaWxsOiMzMzMzMzM7c3Ryb2tlOiMzMzMzMzM7fSNteS1zdmcgLm1hcmtlci5jcm9zc3tzdHJva2U6IzMzMzMzMzt9I215LXN2ZyBzdmd7Zm9udC1mYW1pbHk6InRyZWJ1Y2hldCBtcyIsdmVyZGFuYSxhcmlhbCxzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNnB4O30jbXktc3ZnIC5sYWJlbHtmb250LWZhbWlseToidHJlYnVjaGV0IG1zIix2ZXJkYW5hLGFyaWFsLHNhbnMtc2VyaWY7Y29sb3I6IzMzMzt9I215LXN2ZyAuY2x1c3Rlci1sYWJlbCB0ZXh0e2ZpbGw6IzMzMzt9I215LXN2ZyAuY2x1c3Rlci1sYWJlbCBzcGFuLCNteS1zdmcgcHtjb2xvcjojMzMzO30jbXktc3ZnIC5sYWJlbCB0ZXh0LCNteS1zdmcgc3BhbiwjbXktc3ZnIHB7ZmlsbDojMzMzO2NvbG9yOiMzMzM7fSNteS1zdmcgLm5vZGUgcmVjdCwjbXktc3ZnIC5ub2RlIGNpcmNsZSwjbXktc3ZnIC5ub2RlIGVsbGlwc2UsI215LXN2ZyAubm9kZSBwb2x5Z29uLCNteS1zdmcgLm5vZGUgcGF0aHtmaWxsOiNFQ0VDRkY7c3Ryb2tlOiM5MzcwREI7c3Ryb2tlLXdpZHRoOjFweDt9I215LXN2ZyAuZmxvd2NoYXJ0LWxhYmVsIHRleHR7dGV4dC1hbmNob3I6bWlkZGxlO30jbXktc3ZnIC5ub2RlIC5rYXRleCBwYXRoe2ZpbGw6IzAwMDtzdHJva2U6IzAwMDtzdHJva2Utd2lkdGg6MXB4O30jbXktc3ZnIC5ub2RlIC5sYWJlbHt0ZXh0LWFsaWduOmNlbnRlcjt9I215LXN2ZyAubm9kZS5jbGlja2FibGV7Y3Vyc29yOnBvaW50ZXI7fSNteS1zdmcgLmFycm93aGVhZFBhdGh7ZmlsbDojMzMzMzMzO30jbXktc3ZnIC5lZGdlUGF0aCAucGF0aHtzdHJva2U6IzMzMzMzMztzdHJva2Utd2lkdGg6Mi4wcHg7fSNteS1zdmcgLmZsb3djaGFydC1saW5re3N0cm9rZTojMzMzMzMzO2ZpbGw6bm9uZTt9I215LXN2ZyAuZWRnZUxhYmVse2JhY2tncm91bmQtY29sb3I6I2U4ZThlODt0ZXh0LWFsaWduOmNlbnRlcjt9I215LXN2ZyAuZWRnZUxhYmVsIHJlY3R7b3BhY2l0eTowLjU7YmFja2dyb3VuZC1jb2xvcjojZThlOGU4O2ZpbGw6I2U4ZThlODt9I215LXN2ZyAubGFiZWxCa2d7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDIzMiwgMjMyLCAyMzIsIDAuNSk7fSNteS1zdmcgLmNsdXN0ZXIgcmVjdHtmaWxsOiNmZmZmZGU7c3Ryb2tlOiNhYWFhMzM7c3Ryb2tlLXdpZHRoOjFweDt9I215LXN2ZyAuY2x1c3RlciB0ZXh0e2ZpbGw6IzMzMzt9I215LXN2ZyAuY2x1c3RlciBzcGFuLCNteS1zdmcgcHtjb2xvcjojMzMzO30jbXktc3ZnIGRpdi5tZXJtYWlkVG9vbHRpcHtwb3NpdGlvbjphYnNvbHV0ZTt0ZXh0LWFsaWduOmNlbnRlcjttYXgtd2lkdGg6MjAwcHg7cGFkZGluZzoycHg7Zm9udC1mYW1pbHk6InRyZWJ1Y2hldCBtcyIsdmVyZGFuYSxhcmlhbCxzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMnB4O2JhY2tncm91bmQ6aHNsKDgwLCAxMDAlLCA5Ni4yNzQ1MDk4MDM5JSk7Ym9yZGVyOjFweCBzb2xpZCAjYWFhYTMzO2JvcmRlci1yYWRpdXM6MnB4O3BvaW50ZXItZXZlbnRzOm5vbmU7ei1pbmRleDoxMDA7fSNteS1zdmcgLmZsb3djaGFydFRpdGxlVGV4dHt0ZXh0LWFuY2hvcjptaWRkbGU7Zm9udC1zaXplOjE4cHg7ZmlsbDojMzMzO30jbXktc3ZnIDpyb290ey0tbWVybWFpZC1mb250LWZhbWlseToidHJlYnVjaGV0IG1zIix2ZXJkYW5hLGFyaWFsLHNhbnMtc2VyaWY7fSNteS1zdmcgLmxhbmRtYXNzJmd0Oyp7ZmlsbDojOGJhN2I5IWltcG9ydGFudDtzdHJva2U6IzFCM0QyRiFpbXBvcnRhbnQ7c3Ryb2tlLXdpZHRoOjJweCFpbXBvcnRhbnQ7fSNteS1zdmcgLmxhbmRtYXNzIHNwYW57ZmlsbDojOGJhN2I5IWltcG9ydGFudDtzdHJva2U6IzFCM0QyRiFpbXBvcnRhbnQ7c3Ryb2tlLXdpZHRoOjJweCFpbXBvcnRhbnQ7fTwvc3R5bGU+PGc+PG1hcmtlciBvcmllbnQ9ImF1dG8iIG1hcmtlckhlaWdodD0iMTIiIG1hcmtlcldpZHRoPSIxMiIgbWFya2VyVW5pdHM9InVzZXJTcGFjZU9uVXNlIiByZWZZPSI1IiByZWZYPSI2IiB2aWV3Qm94PSIwIDAgMTAgMTAiIGNsYXNzPSJtYXJrZXIgZmxvd2NoYXJ0IiBpZD0ibXktc3ZnX2Zsb3djaGFydC1wb2ludEVuZCI+PHBhdGggc3R5bGU9InN0cm9rZS13aWR0aDogMTsgc3Ryb2tlLWRhc2hhcnJheTogMSwgMDsiIGNsYXNzPSJhcnJvd01hcmtlclBhdGgiIGQ9Ik0gMCAwIEwgMTAgNSBMIDAgMTAgeiIvPjwvbWFya2VyPjxtYXJrZXIgb3JpZW50PSJhdXRvIiBtYXJrZXJIZWlnaHQ9IjEyIiBtYXJrZXJXaWR0aD0iMTIiIG1hcmtlclVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgcmVmWT0iNSIgcmVmWD0iNC41IiB2aWV3Qm94PSIwIDAgMTAgMTAiIGNsYXNzPSJtYXJrZXIgZmxvd2NoYXJ0IiBpZD0ibXktc3ZnX2Zsb3djaGFydC1wb2ludFN0YXJ0Ij48cGF0aCBzdHlsZT0ic3Ryb2tlLXdpZHRoOiAxOyBzdHJva2UtZGFzaGFycmF5OiAxLCAwOyIgY2xhc3M9ImFycm93TWFya2VyUGF0aCIgZD0iTSAwIDUgTCAxMCAxMCBMIDEwIDAgeiIvPjwvbWFya2VyPjxtYXJrZXIgb3JpZW50PSJhdXRvIiBtYXJrZXJIZWlnaHQ9IjExIiBtYXJrZXJXaWR0aD0iMTEiIG1hcmtlclVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgcmVmWT0iNSIgcmVmWD0iMTEiIHZpZXdCb3g9IjAgMCAxMCAxMCIgY2xhc3M9Im1hcmtlciBmbG93Y2hhcnQiIGlkPSJteS1zdmdfZmxvd2NoYXJ0LWNpcmNsZUVuZCI+PGNpcmNsZSBzdHlsZT0ic3Ryb2tlLXdpZHRoOiAxOyBzdHJva2UtZGFzaGFycmF5OiAxLCAwOyIgY2xhc3M9ImFycm93TWFya2VyUGF0aCIgcj0iNSIgY3k9IjUiIGN4PSI1Ii8+PC9tYXJrZXI+PG1hcmtlciBvcmllbnQ9ImF1dG8iIG1hcmtlckhlaWdodD0iMTEiIG1hcmtlcldpZHRoPSIxMSIgbWFya2VyVW5pdHM9InVzZXJTcGFjZU9uVXNlIiByZWZZPSI1IiByZWZYPSItMSIgdmlld0JveD0iMCAwIDEwIDEwIiBjbGFzcz0ibWFya2VyIGZsb3djaGFydCIgaWQ9Im15LXN2Z19mbG93Y2hhcnQtY2lyY2xlU3RhcnQiPjxjaXJjbGUgc3R5bGU9InN0cm9rZS13aWR0aDogMTsgc3Ryb2tlLWRhc2hhcnJheTogMSwgMDsiIGNsYXNzPSJhcnJvd01hcmtlclBhdGgiIHI9IjUiIGN5PSI1IiBjeD0iNSIvPjwvbWFya2VyPjxtYXJrZXIgb3JpZW50PSJhdXRvIiBtYXJrZXJIZWlnaHQ9IjExIiBtYXJrZXJXaWR0aD0iMTEiIG1hcmtlclVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgcmVmWT0iNS4yIiByZWZYPSIxMiIgdmlld0JveD0iMCAwIDExIDExIiBjbGFzcz0ibWFya2VyIGNyb3NzIGZsb3djaGFydCIgaWQ9Im15LXN2Z19mbG93Y2hhcnQtY3Jvc3NFbmQiPjxwYXRoIHN0eWxlPSJzdHJva2Utd2lkdGg6IDI7IHN0cm9rZS1kYXNoYXJyYXk6IDEsIDA7IiBjbGFzcz0iYXJyb3dNYXJrZXJQYXRoIiBkPSJNIDEsMSBsIDksOSBNIDEwLDEgbCAtOSw5Ii8+PC9tYXJrZXI+PG1hcmtlciBvcmllbnQ9ImF1dG8iIG1hcmtlckhlaWdodD0iMTEiIG1hcmtlcldpZHRoPSIxMSIgbWFya2VyVW5pdHM9InVzZXJTcGFjZU9uVXNlIiByZWZZPSI1LjIiIHJlZlg9Ii0xIiB2aWV3Qm94PSIwIDAgMTEgMTEiIGNsYXNzPSJtYXJrZXIgY3Jvc3MgZmxvd2NoYXJ0IiBpZD0ibXktc3ZnX2Zsb3djaGFydC1jcm9zc1N0YXJ0Ij48cGF0aCBzdHlsZT0ic3Ryb2tlLXdpZHRoOiAyOyBzdHJva2UtZGFzaGFycmF5OiAxLCAwOyIgY2xhc3M9ImFycm93TWFya2VyUGF0aCIgZD0iTSAxLDEgbCA5LDkgTSAxMCwxIGwgLTksOSIvPjwvbWFya2VyPjxnIGNsYXNzPSJyb290Ij48ZyBjbGFzcz0iY2x1c3RlcnMiLz48ZyBjbGFzcz0iZWRnZVBhdGhzIj48cGF0aCBzdHlsZT0iZmlsbDpub25lOyIgY2xhc3M9ImVkZ2UtdGhpY2tuZXNzLW5vcm1hbCBlZGdlLXBhdHRlcm4tc29saWQgZmxvd2NoYXJ0LWxpbmsgTFMtQSBMRS1CIiBpZD0iTC1BLUItMCIgZD0iTTIyLjIzNiw2Ny4zNTFMMjAuMzEyLDcxLjk2N0MxOC4zODgsNzYuNTgzLDE0LjU0LDg1LjgxNSwxNC41NDIsOTUuMDYyQzE0LjU0NSwxMDQuMzEsMTguMzk5LDExMy41NzMsMjAuMzI1LDExOC4yMDVMMjIuMjUyLDEyMi44MzYiLz48cGF0aCBzdHlsZT0iZmlsbDpub25lOyIgY2xhc3M9ImVkZ2UtdGhpY2tuZXNzLW5vcm1hbCBlZGdlLXBhdHRlcm4tc29saWQgZmxvd2NoYXJ0LWxpbmsgTFMtQSBMRS1CIiBpZD0iTC1BLUItMSIgZD0iTTU4LjE1MSw2MS45MTRMNjIuNzU5LDY3LjQzNkM2Ny4zNjgsNzIuOTU4LDc2LjU4NCw4NC4wMDIsNzYuNTgyLDk1LjA2MUM3Ni41NzksMTA2LjExOSw2Ny4zNTcsMTE3LjE5MSw2Mi43NDYsMTIyLjcyOEw1OC4xMzUsMTI4LjI2NCIvPjxwYXRoIHN0eWxlPSJmaWxsOm5vbmU7IiBjbGFzcz0iZWRnZS10aGlja25lc3Mtbm9ybWFsIGVkZ2UtcGF0dGVybi1zb2xpZCBmbG93Y2hhcnQtbGluayBMUy1BIExFLUMiIGlkPSJMLUEtQy0wIiBkPSJNNjcuMDQ0LDUwLjY3M0w4MS44NTIsNTguMDY4Qzk2LjY1OSw2NS40NjQsMTI2LjI3NSw4MC4yNTUsMTQxLjA4Myw5MS44MThDMTU1Ljg5MSwxMDMuMzgsMTU1Ljg5MSwxMTEuNzE0LDE1NS44OTEsMTE1Ljg4TDE1NS44OTEsMTIwLjA0NyIvPjxwYXRoIHN0eWxlPSJmaWxsOm5vbmU7IiBjbGFzcz0iZWRnZS10aGlja25lc3Mtbm9ybWFsIGVkZ2UtcGF0dGVybi1zb2xpZCBmbG93Y2hhcnQtbGluayBMUy1BIExFLUQiIGlkPSJMLUEtRC0wIiBkPSJNOS4xMTcsNTcuODE0TDEuODc2LDY0LjAyQy01LjM2NSw3MC4yMjUsLTE5Ljg0Niw4Mi42MzYsLTI3LjA4Nyw5OC44NjVDLTM0LjMyOCwxMTUuMDk0LC0zNC4zMjgsMTM1LjE0MSwtMzQuMzI4LDE1NS4xODhDLTM0LjMyOCwxNzUuMjM0LC0zNC4zMjgsMTk1LjI4MSwtMjcuMTUyLDIxMS41MjVDLTE5Ljk3NywyMjcuNzY4LC01LjYyNSwyNDAuMjA4LDEuNTUxLDI0Ni40MjlMOC43MjcsMjUyLjY0OSIvPjxwYXRoIHN0eWxlPSJmaWxsOm5vbmU7IiBjbGFzcz0iZWRnZS10aGlja25lc3Mtbm9ybWFsIGVkZ2UtcGF0dGVybi1zb2xpZCBmbG93Y2hhcnQtbGluayBMUy1CIExFLUQiIGlkPSJMLUItRC0wIiBkPSJNMzUuNzExLDE5MC4yMjdMMzUuNzExLDE5NC40MUMzNS43MTEsMTk4LjU5NCwzNS43MTEsMjA2Ljk2MSwzNS43MTEsMjE1LjMxMUMzNS43MTEsMjIzLjY2MSwzNS43MTEsMjMxLjk5NSwzNS43MTEsMjM2LjE2MUwzNS43MTEsMjQwLjMyOCIvPjxwYXRoIHN0eWxlPSJmaWxsOm5vbmU7IiBjbGFzcz0iZWRnZS10aGlja25lc3Mtbm9ybWFsIGVkZ2UtcGF0dGVybi1zb2xpZCBmbG93Y2hhcnQtbGluayBMUy1DIExFLUQiIGlkPSJMLUMtRC0wIiBkPSJNMTU1Ljg5MSwxOTAuMzI4TDE1NS44OTEsMTk0LjQ5NUMxNTUuODkxLDE5OC42NjEsMTU1Ljg5MSwyMDYuOTk1LDE0MS4xNzMsMjE4LjU5NkMxMjYuNDU2LDIzMC4xOTgsOTcuMDIxLDI0NS4wNjcsODIuMzAzLDI1Mi41MDJMNjcuNTg2LDI1OS45MzciLz48L2c+PGcgY2xhc3M9ImVkZ2VMYWJlbHMiPjxnIGNsYXNzPSJlZGdlTGFiZWwiPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAsIDApIiBjbGFzcz0ibGFiZWwiPjxmb3JlaWduT2JqZWN0IGhlaWdodD0iMCIgd2lkdGg9IjAiPjxkaXYgc3R5bGU9ImRpc3BsYXk6IGlubGluZS1ibG9jazsgd2hpdGUtc3BhY2U6IG5vd3JhcDsiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj48c3BhbiBjbGFzcz0iZWRnZUxhYmVsIj48L3NwYW4+PC9kaXY+PC9mb3JlaWduT2JqZWN0PjwvZz48L2c+PGcgY2xhc3M9ImVkZ2VMYWJlbCI+PGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCwgMCkiIGNsYXNzPSJsYWJlbCI+PGZvcmVpZ25PYmplY3QgaGVpZ2h0PSIwIiB3aWR0aD0iMCI+PGRpdiBzdHlsZT0iZGlzcGxheTogaW5saW5lLWJsb2NrOyB3aGl0ZS1zcGFjZTogbm93cmFwOyIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPjxzcGFuIGNsYXNzPSJlZGdlTGFiZWwiPjwvc3Bhbj48L2Rpdj48L2ZvcmVpZ25PYmplY3Q+PC9nPjwvZz48ZyBjbGFzcz0iZWRnZUxhYmVsIj48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLCAwKSIgY2xhc3M9ImxhYmVsIj48Zm9yZWlnbk9iamVjdCBoZWlnaHQ9IjAiIHdpZHRoPSIwIj48ZGl2IHN0eWxlPSJkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IHdoaXRlLXNwYWNlOiBub3dyYXA7IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+PHNwYW4gY2xhc3M9ImVkZ2VMYWJlbCI+PC9zcGFuPjwvZGl2PjwvZm9yZWlnbk9iamVjdD48L2c+PC9nPjxnIGNsYXNzPSJlZGdlTGFiZWwiPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAsIDApIiBjbGFzcz0ibGFiZWwiPjxmb3JlaWduT2JqZWN0IGhlaWdodD0iMCIgd2lkdGg9IjAiPjxkaXYgc3R5bGU9ImRpc3BsYXk6IGlubGluZS1ibG9jazsgd2hpdGUtc3BhY2U6IG5vd3JhcDsiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj48c3BhbiBjbGFzcz0iZWRnZUxhYmVsIj48L3NwYW4+PC9kaXY+PC9mb3JlaWduT2JqZWN0PjwvZz48L2c+PGcgY2xhc3M9ImVkZ2VMYWJlbCI+PGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCwgMCkiIGNsYXNzPSJsYWJlbCI+PGZvcmVpZ25PYmplY3QgaGVpZ2h0PSIwIiB3aWR0aD0iMCI+PGRpdiBzdHlsZT0iZGlzcGxheTogaW5saW5lLWJsb2NrOyB3aGl0ZS1zcGFjZTogbm93cmFwOyIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPjxzcGFuIGNsYXNzPSJlZGdlTGFiZWwiPjwvc3Bhbj48L2Rpdj48L2ZvcmVpZ25PYmplY3Q+PC9nPjwvZz48ZyBjbGFzcz0iZWRnZUxhYmVsIj48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLCAwKSIgY2xhc3M9ImxhYmVsIj48Zm9yZWlnbk9iamVjdCBoZWlnaHQ9IjAiIHdpZHRoPSIwIj48ZGl2IHN0eWxlPSJkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IHdoaXRlLXNwYWNlOiBub3dyYXA7IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+PHNwYW4gY2xhc3M9ImVkZ2VMYWJlbCI+PC9zcGFuPjwvZGl2PjwvZm9yZWlnbk9iamVjdD48L2c+PC9nPjwvZz48ZyBjbGFzcz0ibm9kZXMiPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDM1LjcxMDkzNzUsIDM1LjAyMzQzNzUpIiBkYXRhLWlkPSJBIiBkYXRhLW5vZGU9InRydWUiIGlkPSJmbG93Y2hhcnQtQS0wIiBjbGFzcz0ibm9kZSBkZWZhdWx0IGxhbmRtYXNzIGZsb3djaGFydC1sYWJlbCI+PGNpcmNsZSBoZWlnaHQ9IjM0IiB3aWR0aD0iNzAuMDQ2ODc1IiByPSIzNS4wMjM0Mzc1IiByeT0iMCIgcng9IjAiIHN0eWxlPSIiLz48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMjcuNTIzNDM3NSwgLTkuNSkiIHN0eWxlPSIiIGNsYXNzPSJsYWJlbCI+PHJlY3QvPjxmb3JlaWduT2JqZWN0IGhlaWdodD0iMTkiIHdpZHRoPSI1NS4wNDY4NzUiPjxkaXYgc3R5bGU9ImRpc3BsYXk6IGlubGluZS1ibG9jazsgd2hpdGUtc3BhY2U6IG5vd3JhcDsiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj48c3BhbiBjbGFzcz0ibm9kZUxhYmVsIj5MYW5kIEE8L3NwYW4+PC9kaXY+PC9mb3JlaWduT2JqZWN0PjwvZz48L2c+PGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMzUuNzEwOTM3NSwgMTU1LjE4NzUpIiBkYXRhLWlkPSJCIiBkYXRhLW5vZGU9InRydWUiIGlkPSJmbG93Y2hhcnQtQi0xIiBjbGFzcz0ibm9kZSBkZWZhdWx0IGxhbmRtYXNzIGZsb3djaGFydC1sYWJlbCI+PGNpcmNsZSBoZWlnaHQ9IjM0IiB3aWR0aD0iNzAuMDc4MTI1IiByPSIzNS4wMzkwNjI1IiByeT0iMCIgcng9IjAiIHN0eWxlPSIiLz48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMjcuNTM5MDYyNSwgLTkuNSkiIHN0eWxlPSIiIGNsYXNzPSJsYWJlbCI+PHJlY3QvPjxmb3JlaWduT2JqZWN0IGhlaWdodD0iMTkiIHdpZHRoPSI1NS4wNzgxMjUiPjxkaXYgc3R5bGU9ImRpc3BsYXk6IGlubGluZS1ibG9jazsgd2hpdGUtc3BhY2U6IG5vd3JhcDsiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj48c3BhbiBjbGFzcz0ibm9kZUxhYmVsIj5MYW5kIEI8L3NwYW4+PC9kaXY+PC9mb3JlaWduT2JqZWN0PjwvZz48L2c+PGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMTU1Ljg5MDYyNSwgMTU1LjE4NzUpIiBkYXRhLWlkPSJDIiBkYXRhLW5vZGU9InRydWUiIGlkPSJmbG93Y2hhcnQtQy01IiBjbGFzcz0ibm9kZSBkZWZhdWx0IGxhbmRtYXNzIGZsb3djaGFydC1sYWJlbCI+PGNpcmNsZSBoZWlnaHQ9IjM0IiB3aWR0aD0iNzAuMjgxMjUiIHI9IjM1LjE0MDYyNSIgcnk9IjAiIHJ4PSIwIiBzdHlsZT0iIi8+PGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTI3LjY0MDYyNSwgLTkuNSkiIHN0eWxlPSIiIGNsYXNzPSJsYWJlbCI+PHJlY3QvPjxmb3JlaWduT2JqZWN0IGhlaWdodD0iMTkiIHdpZHRoPSI1NS4yODEyNSI+PGRpdiBzdHlsZT0iZGlzcGxheTogaW5saW5lLWJsb2NrOyB3aGl0ZS1zcGFjZTogbm93cmFwOyIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPjxzcGFuIGNsYXNzPSJub2RlTGFiZWwiPkxhbmQgQzwvc3Bhbj48L2Rpdj48L2ZvcmVpZ25PYmplY3Q+PC9nPjwvZz48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgzNS43MTA5Mzc1LCAyNzYuMDM5MDYyNSkiIGRhdGEtaWQ9IkQiIGRhdGEtbm9kZT0idHJ1ZSIgaWQ9ImZsb3djaGFydC1ELTciIGNsYXNzPSJub2RlIGRlZmF1bHQgbGFuZG1hc3MgZmxvd2NoYXJ0LWxhYmVsIj48Y2lyY2xlIGhlaWdodD0iMzQiIHdpZHRoPSI3MS40MjE4NzUiIHI9IjM1LjcxMDkzNzUiIHJ5PSIwIiByeD0iMCIgc3R5bGU9IiIvPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yOC4yMTA5Mzc1LCAtOS41KSIgc3R5bGU9IiIgY2xhc3M9ImxhYmVsIj48cmVjdC8+PGZvcmVpZ25PYmplY3QgaGVpZ2h0PSIxOSIgd2lkdGg9IjU2LjQyMTg3NSI+PGRpdiBzdHlsZT0iZGlzcGxheTogaW5saW5lLWJsb2NrOyB3aGl0ZS1zcGFjZTogbm93cmFwOyIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPjxzcGFuIGNsYXNzPSJub2RlTGFiZWwiPkxhbmQgRDwvc3Bhbj48L2Rpdj48L2ZvcmVpZ25PYmplY3Q+PC9nPjwvZz48L2c+PC9nPjwvZz48L3N2Zz4="&gt;&lt;/p&gt;
&lt;p&gt;Euler's insight was that for a complete path to exist (crossing each bridge exactly once), each land mass except for the starting and ending points must have an even number of bridges connected to it. Since all four land areas in Königsberg had an odd number of bridges, such a path was impossible.&lt;/p&gt;
&lt;h2 id="graph-classifications"&gt;Graph Classifications&lt;/h2&gt;
&lt;p&gt;Graphs can be classified in several ways based on their properties:&lt;/p&gt;
&lt;h3 id="directed-vs-undirected"&gt;Directed vs. Undirected&lt;/h3&gt;
&lt;h4 id="directed-graphs"&gt;&lt;a href="directed-graphs.html"&gt;Directed Graphs&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;In directed graphs, edges have a specific direction indicated by arrows. These represent one-way relationships.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Examples&lt;/strong&gt;: Twitter following relationships, one-way streets in a city map, workflow diagrams&lt;/p&gt;
&lt;p&gt;&lt;img src="data:image/svg+xml;base64,PHN2ZyBhcmlhLXJvbGVkZXNjcmlwdGlvbj0iZmxvd2NoYXJ0LXYyIiByb2xlPSJncmFwaGljcy1kb2N1bWVudCBkb2N1bWVudCIgdmlld0JveD0iLTggLTggNjA0LjIzNDM3NSAxMzcuNTMxMjUiIHN0eWxlPSJtYXgtd2lkdGg6IDYwNC4yMzRweDsgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7IiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB3aWR0aD0iMTAwJSIgaWQ9Im15LXN2ZyI+PHN0eWxlPiNteS1zdmd7Zm9udC1mYW1pbHk6InRyZWJ1Y2hldCBtcyIsdmVyZGFuYSxhcmlhbCxzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNnB4O2ZpbGw6IzMzMzt9I215LXN2ZyAuZXJyb3ItaWNvbntmaWxsOiM1NTIyMjI7fSNteS1zdmcgLmVycm9yLXRleHR7ZmlsbDojNTUyMjIyO3N0cm9rZTojNTUyMjIyO30jbXktc3ZnIC5lZGdlLXRoaWNrbmVzcy1ub3JtYWx7c3Ryb2tlLXdpZHRoOjJweDt9I215LXN2ZyAuZWRnZS10aGlja25lc3MtdGhpY2t7c3Ryb2tlLXdpZHRoOjMuNXB4O30jbXktc3ZnIC5lZGdlLXBhdHRlcm4tc29saWR7c3Ryb2tlLWRhc2hhcnJheTowO30jbXktc3ZnIC5lZGdlLXBhdHRlcm4tZGFzaGVke3N0cm9rZS1kYXNoYXJyYXk6Mzt9I215LXN2ZyAuZWRnZS1wYXR0ZXJuLWRvdHRlZHtzdHJva2UtZGFzaGFycmF5OjI7fSNteS1zdmcgLm1hcmtlcntmaWxsOiMzMzMzMzM7c3Ryb2tlOiMzMzMzMzM7fSNteS1zdmcgLm1hcmtlci5jcm9zc3tzdHJva2U6IzMzMzMzMzt9I215LXN2ZyBzdmd7Zm9udC1mYW1pbHk6InRyZWJ1Y2hldCBtcyIsdmVyZGFuYSxhcmlhbCxzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNnB4O30jbXktc3ZnIC5sYWJlbHtmb250LWZhbWlseToidHJlYnVjaGV0IG1zIix2ZXJkYW5hLGFyaWFsLHNhbnMtc2VyaWY7Y29sb3I6IzMzMzt9I215LXN2ZyAuY2x1c3Rlci1sYWJlbCB0ZXh0e2ZpbGw6IzMzMzt9I215LXN2ZyAuY2x1c3Rlci1sYWJlbCBzcGFuLCNteS1zdmcgcHtjb2xvcjojMzMzO30jbXktc3ZnIC5sYWJlbCB0ZXh0LCNteS1zdmcgc3BhbiwjbXktc3ZnIHB7ZmlsbDojMzMzO2NvbG9yOiMzMzM7fSNteS1zdmcgLm5vZGUgcmVjdCwjbXktc3ZnIC5ub2RlIGNpcmNsZSwjbXktc3ZnIC5ub2RlIGVsbGlwc2UsI215LXN2ZyAubm9kZSBwb2x5Z29uLCNteS1zdmcgLm5vZGUgcGF0aHtmaWxsOiNFQ0VDRkY7c3Ryb2tlOiM5MzcwREI7c3Ryb2tlLXdpZHRoOjFweDt9I215LXN2ZyAuZmxvd2NoYXJ0LWxhYmVsIHRleHR7dGV4dC1hbmNob3I6bWlkZGxlO30jbXktc3ZnIC5ub2RlIC5rYXRleCBwYXRoe2ZpbGw6IzAwMDtzdHJva2U6IzAwMDtzdHJva2Utd2lkdGg6MXB4O30jbXktc3ZnIC5ub2RlIC5sYWJlbHt0ZXh0LWFsaWduOmNlbnRlcjt9I215LXN2ZyAubm9kZS5jbGlja2FibGV7Y3Vyc29yOnBvaW50ZXI7fSNteS1zdmcgLmFycm93aGVhZFBhdGh7ZmlsbDojMzMzMzMzO30jbXktc3ZnIC5lZGdlUGF0aCAucGF0aHtzdHJva2U6IzMzMzMzMztzdHJva2Utd2lkdGg6Mi4wcHg7fSNteS1zdmcgLmZsb3djaGFydC1saW5re3N0cm9rZTojMzMzMzMzO2ZpbGw6bm9uZTt9I215LXN2ZyAuZWRnZUxhYmVse2JhY2tncm91bmQtY29sb3I6I2U4ZThlODt0ZXh0LWFsaWduOmNlbnRlcjt9I215LXN2ZyAuZWRnZUxhYmVsIHJlY3R7b3BhY2l0eTowLjU7YmFja2dyb3VuZC1jb2xvcjojZThlOGU4O2ZpbGw6I2U4ZThlODt9I215LXN2ZyAubGFiZWxCa2d7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDIzMiwgMjMyLCAyMzIsIDAuNSk7fSNteS1zdmcgLmNsdXN0ZXIgcmVjdHtmaWxsOiNmZmZmZGU7c3Ryb2tlOiNhYWFhMzM7c3Ryb2tlLXdpZHRoOjFweDt9I215LXN2ZyAuY2x1c3RlciB0ZXh0e2ZpbGw6IzMzMzt9I215LXN2ZyAuY2x1c3RlciBzcGFuLCNteS1zdmcgcHtjb2xvcjojMzMzO30jbXktc3ZnIGRpdi5tZXJtYWlkVG9vbHRpcHtwb3NpdGlvbjphYnNvbHV0ZTt0ZXh0LWFsaWduOmNlbnRlcjttYXgtd2lkdGg6MjAwcHg7cGFkZGluZzoycHg7Zm9udC1mYW1pbHk6InRyZWJ1Y2hldCBtcyIsdmVyZGFuYSxhcmlhbCxzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMnB4O2JhY2tncm91bmQ6aHNsKDgwLCAxMDAlLCA5Ni4yNzQ1MDk4MDM5JSk7Ym9yZGVyOjFweCBzb2xpZCAjYWFhYTMzO2JvcmRlci1yYWRpdXM6MnB4O3BvaW50ZXItZXZlbnRzOm5vbmU7ei1pbmRleDoxMDA7fSNteS1zdmcgLmZsb3djaGFydFRpdGxlVGV4dHt0ZXh0LWFuY2hvcjptaWRkbGU7Zm9udC1zaXplOjE4cHg7ZmlsbDojMzMzO30jbXktc3ZnIDpyb290ey0tbWVybWFpZC1mb250LWZhbWlseToidHJlYnVjaGV0IG1zIix2ZXJkYW5hLGFyaWFsLHNhbnMtc2VyaWY7fSNteS1zdmcgLnVzZXImZ3Q7KntmaWxsOiNiOWIyOGIhaW1wb3J0YW50O3N0cm9rZTojMUIzRDJGIWltcG9ydGFudDtzdHJva2Utd2lkdGg6MnB4IWltcG9ydGFudDt9I215LXN2ZyAudXNlciBzcGFue2ZpbGw6I2I5YjI4YiFpbXBvcnRhbnQ7c3Ryb2tlOiMxQjNEMkYhaW1wb3J0YW50O3N0cm9rZS13aWR0aDoycHghaW1wb3J0YW50O308L3N0eWxlPjxnPjxtYXJrZXIgb3JpZW50PSJhdXRvIiBtYXJrZXJIZWlnaHQ9IjEyIiBtYXJrZXJXaWR0aD0iMTIiIG1hcmtlclVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgcmVmWT0iNSIgcmVmWD0iNiIgdmlld0JveD0iMCAwIDEwIDEwIiBjbGFzcz0ibWFya2VyIGZsb3djaGFydCIgaWQ9Im15LXN2Z19mbG93Y2hhcnQtcG9pbnRFbmQiPjxwYXRoIHN0eWxlPSJzdHJva2Utd2lkdGg6IDE7IHN0cm9rZS1kYXNoYXJyYXk6IDEsIDA7IiBjbGFzcz0iYXJyb3dNYXJrZXJQYXRoIiBkPSJNIDAgMCBMIDEwIDUgTCAwIDEwIHoiLz48L21hcmtlcj48bWFya2VyIG9yaWVudD0iYXV0byIgbWFya2VySGVpZ2h0PSIxMiIgbWFya2VyV2lkdGg9IjEyIiBtYXJrZXJVbml0cz0idXNlclNwYWNlT25Vc2UiIHJlZlk9IjUiIHJlZlg9IjQuNSIgdmlld0JveD0iMCAwIDEwIDEwIiBjbGFzcz0ibWFya2VyIGZsb3djaGFydCIgaWQ9Im15LXN2Z19mbG93Y2hhcnQtcG9pbnRTdGFydCI+PHBhdGggc3R5bGU9InN0cm9rZS13aWR0aDogMTsgc3Ryb2tlLWRhc2hhcnJheTogMSwgMDsiIGNsYXNzPSJhcnJvd01hcmtlclBhdGgiIGQ9Ik0gMCA1IEwgMTAgMTAgTCAxMCAwIHoiLz48L21hcmtlcj48bWFya2VyIG9yaWVudD0iYXV0byIgbWFya2VySGVpZ2h0PSIxMSIgbWFya2VyV2lkdGg9IjExIiBtYXJrZXJVbml0cz0idXNlclNwYWNlT25Vc2UiIHJlZlk9IjUiIHJlZlg9IjExIiB2aWV3Qm94PSIwIDAgMTAgMTAiIGNsYXNzPSJtYXJrZXIgZmxvd2NoYXJ0IiBpZD0ibXktc3ZnX2Zsb3djaGFydC1jaXJjbGVFbmQiPjxjaXJjbGUgc3R5bGU9InN0cm9rZS13aWR0aDogMTsgc3Ryb2tlLWRhc2hhcnJheTogMSwgMDsiIGNsYXNzPSJhcnJvd01hcmtlclBhdGgiIHI9IjUiIGN5PSI1IiBjeD0iNSIvPjwvbWFya2VyPjxtYXJrZXIgb3JpZW50PSJhdXRvIiBtYXJrZXJIZWlnaHQ9IjExIiBtYXJrZXJXaWR0aD0iMTEiIG1hcmtlclVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgcmVmWT0iNSIgcmVmWD0iLTEiIHZpZXdCb3g9IjAgMCAxMCAxMCIgY2xhc3M9Im1hcmtlciBmbG93Y2hhcnQiIGlkPSJteS1zdmdfZmxvd2NoYXJ0LWNpcmNsZVN0YXJ0Ij48Y2lyY2xlIHN0eWxlPSJzdHJva2Utd2lkdGg6IDE7IHN0cm9rZS1kYXNoYXJyYXk6IDEsIDA7IiBjbGFzcz0iYXJyb3dNYXJrZXJQYXRoIiByPSI1IiBjeT0iNSIgY3g9IjUiLz48L21hcmtlcj48bWFya2VyIG9yaWVudD0iYXV0byIgbWFya2VySGVpZ2h0PSIxMSIgbWFya2VyV2lkdGg9IjExIiBtYXJrZXJVbml0cz0idXNlclNwYWNlT25Vc2UiIHJlZlk9IjUuMiIgcmVmWD0iMTIiIHZpZXdCb3g9IjAgMCAxMSAxMSIgY2xhc3M9Im1hcmtlciBjcm9zcyBmbG93Y2hhcnQiIGlkPSJteS1zdmdfZmxvd2NoYXJ0LWNyb3NzRW5kIj48cGF0aCBzdHlsZT0ic3Ryb2tlLXdpZHRoOiAyOyBzdHJva2UtZGFzaGFycmF5OiAxLCAwOyIgY2xhc3M9ImFycm93TWFya2VyUGF0aCIgZD0iTSAxLDEgbCA5LDkgTSAxMCwxIGwgLTksOSIvPjwvbWFya2VyPjxtYXJrZXIgb3JpZW50PSJhdXRvIiBtYXJrZXJIZWlnaHQ9IjExIiBtYXJrZXJXaWR0aD0iMTEiIG1hcmtlclVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgcmVmWT0iNS4yIiByZWZYPSItMSIgdmlld0JveD0iMCAwIDExIDExIiBjbGFzcz0ibWFya2VyIGNyb3NzIGZsb3djaGFydCIgaWQ9Im15LXN2Z19mbG93Y2hhcnQtY3Jvc3NTdGFydCI+PHBhdGggc3R5bGU9InN0cm9rZS13aWR0aDogMjsgc3Ryb2tlLWRhc2hhcnJheTogMSwgMDsiIGNsYXNzPSJhcnJvd01hcmtlclBhdGgiIGQ9Ik0gMSwxIGwgOSw5IE0gMTAsMSBsIC05LDkiLz48L21hcmtlcj48ZyBjbGFzcz0icm9vdCI+PGcgY2xhc3M9ImNsdXN0ZXJzIi8+PGcgY2xhc3M9ImVkZ2VQYXRocyI+PHBhdGggbWFya2VyLWVuZD0idXJsKCNteS1zdmdfZmxvd2NoYXJ0LXBvaW50RW5kKSIgc3R5bGU9ImZpbGw6bm9uZTsiIGNsYXNzPSJlZGdlLXRoaWNrbmVzcy1ub3JtYWwgZWRnZS1wYXR0ZXJuLXNvbGlkIGZsb3djaGFydC1saW5rIExTLUEgTEUtQiIgaWQ9IkwtQS1CLTAiIGQ9Ik0yMzguOTA3LDU4Ljk4OUwyNDguMjAxLDU0Ljc4NUMyNTcuNDk1LDUwLjU4MSwyNzYuMDg0LDQyLjE3NCwyOTMuMjg5LDM3Ljk3QzMxMC40OTQsMzMuNzY2LDMyNi4zMTYsMzMuNzY2LDMzNC4yMjcsMzMuNzY2TDM0Mi4xMzgsMzMuNzY2Ii8+PHBhdGggbWFya2VyLWVuZD0idXJsKCNteS1zdmdfZmxvd2NoYXJ0LXBvaW50RW5kKSIgc3R5bGU9ImZpbGw6bm9uZTsiIGNsYXNzPSJlZGdlLXRoaWNrbmVzcy1ub3JtYWwgZWRnZS1wYXR0ZXJuLXNvbGlkIGZsb3djaGFydC1saW5rIExTLUIgTEUtQyIgaWQ9IkwtQi1DLTAiIGQ9Ik00MTQuOTY5LDMzLjc2Nkw0MjMuNzYzLDMzLjc2NkM0MzIuNTU3LDMzLjc2Niw0NTAuMTQ2LDMzLjc2Niw0NjcuNDMsMzcuNjAxQzQ4NC43MTQsNDEuNDM1LDUwMS42OTMsNDkuMTA1LDUxMC4xODMsNTIuOTRMNTE4LjY3Myw1Ni43NzUiLz48cGF0aCBtYXJrZXItZW5kPSJ1cmwoI215LXN2Z19mbG93Y2hhcnQtcG9pbnRFbmQpIiBzdHlsZT0iZmlsbDpub25lOyIgY2xhc3M9ImVkZ2UtdGhpY2tuZXNzLW5vcm1hbCBlZGdlLXBhdHRlcm4tc29saWQgZmxvd2NoYXJ0LWxpbmsgTFMtQSBMRS1DIiBpZD0iTC1BLUMtMCIgZD0iTTIzOC45MDcsODYuODA4TDI0OC4yMDEsOTEuMDEyQzI1Ny40OTUsOTUuMjE1LDI3Ni4wODQsMTAzLjYyMywyOTkuOCwxMDcuODI3QzMyMy41MTYsMTEyLjAzMSwzNTIuMzU5LDExMi4wMzEsMzgxLjIwMywxMTIuMDMxQzQxMC4wNDcsMTEyLjAzMSw0MzguODkxLDExMi4wMzEsNDYxLjgwMiwxMDguMTk2QzQ4NC43MTQsMTA0LjM2MSw1MDEuNjkzLDk2LjY5Miw1MTAuMTgzLDkyLjg1N0w1MTguNjczLDg5LjAyMiIvPjxwYXRoIG1hcmtlci1lbmQ9InVybCgjbXktc3ZnX2Zsb3djaGFydC1wb2ludEVuZCkiIHN0eWxlPSJmaWxsOm5vbmU7IiBjbGFzcz0iZWRnZS10aGlja25lc3Mtbm9ybWFsIGVkZ2UtcGF0dGVybi1zb2xpZCBmbG93Y2hhcnQtbGluayBMUy1EIExFLUEiIGlkPSJMLUQtQS0wIiBkPSJNNjguODc1LDcyLjg5OEw3Ny42NjksNzIuODk4Qzg2LjQ2NCw3Mi44OTgsMTA0LjA1Miw3Mi44OTgsMTIwLjc1Nyw3Mi44OThDMTM3LjQ2Myw3Mi44OTgsMTUzLjI4NCw3Mi44OTgsMTYxLjE5NSw3Mi44OThMMTY5LjEwNiw3Mi44OTgiLz48L2c+PGcgY2xhc3M9ImVkZ2VMYWJlbHMiPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDI5NC42NzE4NzUsIDMzLjc2NTYyNSkiIGNsYXNzPSJlZGdlTGFiZWwiPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yNy43NjU2MjUsIC05LjUpIiBjbGFzcz0ibGFiZWwiPjxmb3JlaWduT2JqZWN0IGhlaWdodD0iMTkiIHdpZHRoPSI1NS41MzEyNSI+PGRpdiBzdHlsZT0iZGlzcGxheTogaW5saW5lLWJsb2NrOyB3aGl0ZS1zcGFjZTogbm93cmFwOyIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPjxzcGFuIGNsYXNzPSJlZGdlTGFiZWwiPmZvbGxvd3M8L3NwYW4+PC9kaXY+PC9mb3JlaWduT2JqZWN0PjwvZz48L2c+PGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoNDY3LjczNDM3NSwgMzMuNzY1NjI1KSIgY2xhc3M9ImVkZ2VMYWJlbCI+PGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTI3Ljc2NTYyNSwgLTkuNSkiIGNsYXNzPSJsYWJlbCI+PGZvcmVpZ25PYmplY3QgaGVpZ2h0PSIxOSIgd2lkdGg9IjU1LjUzMTI1Ij48ZGl2IHN0eWxlPSJkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IHdoaXRlLXNwYWNlOiBub3dyYXA7IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+PHNwYW4gY2xhc3M9ImVkZ2VMYWJlbCI+Zm9sbG93czwvc3Bhbj48L2Rpdj48L2ZvcmVpZ25PYmplY3Q+PC9nPjwvZz48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgzODEuMjAzMTI1LCAxMTIuMDMxMjUpIiBjbGFzcz0iZWRnZUxhYmVsIj48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMjcuNzY1NjI1LCAtOS41KSIgY2xhc3M9ImxhYmVsIj48Zm9yZWlnbk9iamVjdCBoZWlnaHQ9IjE5IiB3aWR0aD0iNTUuNTMxMjUiPjxkaXYgc3R5bGU9ImRpc3BsYXk6IGlubGluZS1ibG9jazsgd2hpdGUtc3BhY2U6IG5vd3JhcDsiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj48c3BhbiBjbGFzcz0iZWRnZUxhYmVsIj5mb2xsb3dzPC9zcGFuPjwvZGl2PjwvZm9yZWlnbk9iamVjdD48L2c+PC9nPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDEyMS42NDA2MjUsIDcyLjg5ODQzNzUpIiBjbGFzcz0iZWRnZUxhYmVsIj48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMjcuNzY1NjI1LCAtOS41KSIgY2xhc3M9ImxhYmVsIj48Zm9yZWlnbk9iamVjdCBoZWlnaHQ9IjE5IiB3aWR0aD0iNTUuNTMxMjUiPjxkaXYgc3R5bGU9ImRpc3BsYXk6IGlubGluZS1ibG9jazsgd2hpdGUtc3BhY2U6IG5vd3JhcDsiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj48c3BhbiBjbGFzcz0iZWRnZUxhYmVsIj5mb2xsb3dzPC9zcGFuPjwvZGl2PjwvZm9yZWlnbk9iamVjdD48L2c+PC9nPjwvZz48ZyBjbGFzcz0ibm9kZXMiPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDIwOC4xNTYyNSwgNzIuODk4NDM3NSkiIGRhdGEtaWQ9IkEiIGRhdGEtbm9kZT0idHJ1ZSIgaWQ9ImZsb3djaGFydC1BLTAiIGNsYXNzPSJub2RlIGRlZmF1bHQgdXNlciBmbG93Y2hhcnQtbGFiZWwiPjxjaXJjbGUgaGVpZ2h0PSIzNCIgd2lkdGg9IjY3LjUiIHI9IjMzLjc1IiByeT0iMCIgcng9IjAiIHN0eWxlPSIiLz48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMjYuMjUsIC05LjUpIiBzdHlsZT0iIiBjbGFzcz0ibGFiZWwiPjxyZWN0Lz48Zm9yZWlnbk9iamVjdCBoZWlnaHQ9IjE5IiB3aWR0aD0iNTIuNSI+PGRpdiBzdHlsZT0iZGlzcGxheTogaW5saW5lLWJsb2NrOyB3aGl0ZS1zcGFjZTogbm93cmFwOyIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPjxzcGFuIGNsYXNzPSJub2RlTGFiZWwiPlVzZXIgQTwvc3Bhbj48L2Rpdj48L2ZvcmVpZ25PYmplY3Q+PC9nPjwvZz48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgzODEuMjAzMTI1LCAzMy43NjU2MjUpIiBkYXRhLWlkPSJCIiBkYXRhLW5vZGU9InRydWUiIGlkPSJmbG93Y2hhcnQtQi0xIiBjbGFzcz0ibm9kZSBkZWZhdWx0IHVzZXIgZmxvd2NoYXJ0LWxhYmVsIj48Y2lyY2xlIGhlaWdodD0iMzQiIHdpZHRoPSI2Ny41MzEyNSIgcj0iMzMuNzY1NjI1IiByeT0iMCIgcng9IjAiIHN0eWxlPSIiLz48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMjYuMjY1NjI1LCAtOS41KSIgc3R5bGU9IiIgY2xhc3M9ImxhYmVsIj48cmVjdC8+PGZvcmVpZ25PYmplY3QgaGVpZ2h0PSIxOSIgd2lkdGg9IjUyLjUzMTI1Ij48ZGl2IHN0eWxlPSJkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IHdoaXRlLXNwYWNlOiBub3dyYXA7IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+PHNwYW4gY2xhc3M9Im5vZGVMYWJlbCI+VXNlciBCPC9zcGFuPjwvZGl2PjwvZm9yZWlnbk9iamVjdD48L2c+PC9nPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDU1NC4zNjcxODc1LCA3Mi44OTg0Mzc1KSIgZGF0YS1pZD0iQyIgZGF0YS1ub2RlPSJ0cnVlIiBpZD0iZmxvd2NoYXJ0LUMtMyIgY2xhc3M9Im5vZGUgZGVmYXVsdCB1c2VyIGZsb3djaGFydC1sYWJlbCI+PGNpcmNsZSBoZWlnaHQ9IjM0IiB3aWR0aD0iNjcuNzM0Mzc1IiByPSIzMy44NjcxODc1IiByeT0iMCIgcng9IjAiIHN0eWxlPSIiLz48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMjYuMzY3MTg3NSwgLTkuNSkiIHN0eWxlPSIiIGNsYXNzPSJsYWJlbCI+PHJlY3QvPjxmb3JlaWduT2JqZWN0IGhlaWdodD0iMTkiIHdpZHRoPSI1Mi43MzQzNzUiPjxkaXYgc3R5bGU9ImRpc3BsYXk6IGlubGluZS1ibG9jazsgd2hpdGUtc3BhY2U6IG5vd3JhcDsiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj48c3BhbiBjbGFzcz0ibm9kZUxhYmVsIj5Vc2VyIEM8L3NwYW4+PC9kaXY+PC9mb3JlaWduT2JqZWN0PjwvZz48L2c+PGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMzQuNDM3NSwgNzIuODk4NDM3NSkiIGRhdGEtaWQ9IkQiIGRhdGEtbm9kZT0idHJ1ZSIgaWQ9ImZsb3djaGFydC1ELTYiIGNsYXNzPSJub2RlIGRlZmF1bHQgdXNlciBmbG93Y2hhcnQtbGFiZWwiPjxjaXJjbGUgaGVpZ2h0PSIzNCIgd2lkdGg9IjY4Ljg3NSIgcj0iMzQuNDM3NSIgcnk9IjAiIHJ4PSIwIiBzdHlsZT0iIi8+PGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTI2LjkzNzUsIC05LjUpIiBzdHlsZT0iIiBjbGFzcz0ibGFiZWwiPjxyZWN0Lz48Zm9yZWlnbk9iamVjdCBoZWlnaHQ9IjE5IiB3aWR0aD0iNTMuODc1Ij48ZGl2IHN0eWxlPSJkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IHdoaXRlLXNwYWNlOiBub3dyYXA7IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+PHNwYW4gY2xhc3M9Im5vZGVMYWJlbCI+VXNlciBEPC9zcGFuPjwvZGl2PjwvZm9yZWlnbk9iamVjdD48L2c+PC9nPjwvZz48L2c+PC9nPjwvc3ZnPg=="&gt;&lt;/p&gt;
&lt;h4 id="undirected-graphs"&gt;&lt;a href="undirected-graphs.html"&gt;Undirected Graphs&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;In undirected graphs, edges have no direction and represent symmetrical relationships.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Examples&lt;/strong&gt;: Facebook friendships, telecommunication networks, chemical bonds&lt;/p&gt;
&lt;p&gt;&lt;img src="data:image/svg+xml;base64,PHN2ZyBhcmlhLXJvbGVkZXNjcmlwdGlvbj0iZmxvd2NoYXJ0LXYyIiByb2xlPSJncmFwaGljcy1kb2N1bWVudCBkb2N1bWVudCIgdmlld0JveD0iLTggLTggNTA2LjgyODEyNSAxODQuNTg1OTk4NTM1MTU2MjUiIHN0eWxlPSJtYXgtd2lkdGg6IDUwNi44MjhweDsgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7IiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB3aWR0aD0iMTAwJSIgaWQ9Im15LXN2ZyI+PHN0eWxlPiNteS1zdmd7Zm9udC1mYW1pbHk6InRyZWJ1Y2hldCBtcyIsdmVyZGFuYSxhcmlhbCxzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNnB4O2ZpbGw6IzMzMzt9I215LXN2ZyAuZXJyb3ItaWNvbntmaWxsOiM1NTIyMjI7fSNteS1zdmcgLmVycm9yLXRleHR7ZmlsbDojNTUyMjIyO3N0cm9rZTojNTUyMjIyO30jbXktc3ZnIC5lZGdlLXRoaWNrbmVzcy1ub3JtYWx7c3Ryb2tlLXdpZHRoOjJweDt9I215LXN2ZyAuZWRnZS10aGlja25lc3MtdGhpY2t7c3Ryb2tlLXdpZHRoOjMuNXB4O30jbXktc3ZnIC5lZGdlLXBhdHRlcm4tc29saWR7c3Ryb2tlLWRhc2hhcnJheTowO30jbXktc3ZnIC5lZGdlLXBhdHRlcm4tZGFzaGVke3N0cm9rZS1kYXNoYXJyYXk6Mzt9I215LXN2ZyAuZWRnZS1wYXR0ZXJuLWRvdHRlZHtzdHJva2UtZGFzaGFycmF5OjI7fSNteS1zdmcgLm1hcmtlcntmaWxsOiMzMzMzMzM7c3Ryb2tlOiMzMzMzMzM7fSNteS1zdmcgLm1hcmtlci5jcm9zc3tzdHJva2U6IzMzMzMzMzt9I215LXN2ZyBzdmd7Zm9udC1mYW1pbHk6InRyZWJ1Y2hldCBtcyIsdmVyZGFuYSxhcmlhbCxzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNnB4O30jbXktc3ZnIC5sYWJlbHtmb250LWZhbWlseToidHJlYnVjaGV0IG1zIix2ZXJkYW5hLGFyaWFsLHNhbnMtc2VyaWY7Y29sb3I6IzMzMzt9I215LXN2ZyAuY2x1c3Rlci1sYWJlbCB0ZXh0e2ZpbGw6IzMzMzt9I215LXN2ZyAuY2x1c3Rlci1sYWJlbCBzcGFuLCNteS1zdmcgcHtjb2xvcjojMzMzO30jbXktc3ZnIC5sYWJlbCB0ZXh0LCNteS1zdmcgc3BhbiwjbXktc3ZnIHB7ZmlsbDojMzMzO2NvbG9yOiMzMzM7fSNteS1zdmcgLm5vZGUgcmVjdCwjbXktc3ZnIC5ub2RlIGNpcmNsZSwjbXktc3ZnIC5ub2RlIGVsbGlwc2UsI215LXN2ZyAubm9kZSBwb2x5Z29uLCNteS1zdmcgLm5vZGUgcGF0aHtmaWxsOiNFQ0VDRkY7c3Ryb2tlOiM5MzcwREI7c3Ryb2tlLXdpZHRoOjFweDt9I215LXN2ZyAuZmxvd2NoYXJ0LWxhYmVsIHRleHR7dGV4dC1hbmNob3I6bWlkZGxlO30jbXktc3ZnIC5ub2RlIC5rYXRleCBwYXRoe2ZpbGw6IzAwMDtzdHJva2U6IzAwMDtzdHJva2Utd2lkdGg6MXB4O30jbXktc3ZnIC5ub2RlIC5sYWJlbHt0ZXh0LWFsaWduOmNlbnRlcjt9I215LXN2ZyAubm9kZS5jbGlja2FibGV7Y3Vyc29yOnBvaW50ZXI7fSNteS1zdmcgLmFycm93aGVhZFBhdGh7ZmlsbDojMzMzMzMzO30jbXktc3ZnIC5lZGdlUGF0aCAucGF0aHtzdHJva2U6IzMzMzMzMztzdHJva2Utd2lkdGg6Mi4wcHg7fSNteS1zdmcgLmZsb3djaGFydC1saW5re3N0cm9rZTojMzMzMzMzO2ZpbGw6bm9uZTt9I215LXN2ZyAuZWRnZUxhYmVse2JhY2tncm91bmQtY29sb3I6I2U4ZThlODt0ZXh0LWFsaWduOmNlbnRlcjt9I215LXN2ZyAuZWRnZUxhYmVsIHJlY3R7b3BhY2l0eTowLjU7YmFja2dyb3VuZC1jb2xvcjojZThlOGU4O2ZpbGw6I2U4ZThlODt9I215LXN2ZyAubGFiZWxCa2d7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDIzMiwgMjMyLCAyMzIsIDAuNSk7fSNteS1zdmcgLmNsdXN0ZXIgcmVjdHtmaWxsOiNmZmZmZGU7c3Ryb2tlOiNhYWFhMzM7c3Ryb2tlLXdpZHRoOjFweDt9I215LXN2ZyAuY2x1c3RlciB0ZXh0e2ZpbGw6IzMzMzt9I215LXN2ZyAuY2x1c3RlciBzcGFuLCNteS1zdmcgcHtjb2xvcjojMzMzO30jbXktc3ZnIGRpdi5tZXJtYWlkVG9vbHRpcHtwb3NpdGlvbjphYnNvbHV0ZTt0ZXh0LWFsaWduOmNlbnRlcjttYXgtd2lkdGg6MjAwcHg7cGFkZGluZzoycHg7Zm9udC1mYW1pbHk6InRyZWJ1Y2hldCBtcyIsdmVyZGFuYSxhcmlhbCxzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMnB4O2JhY2tncm91bmQ6aHNsKDgwLCAxMDAlLCA5Ni4yNzQ1MDk4MDM5JSk7Ym9yZGVyOjFweCBzb2xpZCAjYWFhYTMzO2JvcmRlci1yYWRpdXM6MnB4O3BvaW50ZXItZXZlbnRzOm5vbmU7ei1pbmRleDoxMDA7fSNteS1zdmcgLmZsb3djaGFydFRpdGxlVGV4dHt0ZXh0LWFuY2hvcjptaWRkbGU7Zm9udC1zaXplOjE4cHg7ZmlsbDojMzMzO30jbXktc3ZnIDpyb290ey0tbWVybWFpZC1mb250LWZhbWlseToidHJlYnVjaGV0IG1zIix2ZXJkYW5hLGFyaWFsLHNhbnMtc2VyaWY7fSNteS1zdmcgLnBlcnNvbiZndDsqe2ZpbGw6IzhiYTdiOSFpbXBvcnRhbnQ7c3Ryb2tlOiMxQjNEMkYhaW1wb3J0YW50O3N0cm9rZS13aWR0aDoycHghaW1wb3J0YW50O30jbXktc3ZnIC5wZXJzb24gc3BhbntmaWxsOiM4YmE3YjkhaW1wb3J0YW50O3N0cm9rZTojMUIzRDJGIWltcG9ydGFudDtzdHJva2Utd2lkdGg6MnB4IWltcG9ydGFudDt9PC9zdHlsZT48Zz48bWFya2VyIG9yaWVudD0iYXV0byIgbWFya2VySGVpZ2h0PSIxMiIgbWFya2VyV2lkdGg9IjEyIiBtYXJrZXJVbml0cz0idXNlclNwYWNlT25Vc2UiIHJlZlk9IjUiIHJlZlg9IjYiIHZpZXdCb3g9IjAgMCAxMCAxMCIgY2xhc3M9Im1hcmtlciBmbG93Y2hhcnQiIGlkPSJteS1zdmdfZmxvd2NoYXJ0LXBvaW50RW5kIj48cGF0aCBzdHlsZT0ic3Ryb2tlLXdpZHRoOiAxOyBzdHJva2UtZGFzaGFycmF5OiAxLCAwOyIgY2xhc3M9ImFycm93TWFya2VyUGF0aCIgZD0iTSAwIDAgTCAxMCA1IEwgMCAxMCB6Ii8+PC9tYXJrZXI+PG1hcmtlciBvcmllbnQ9ImF1dG8iIG1hcmtlckhlaWdodD0iMTIiIG1hcmtlcldpZHRoPSIxMiIgbWFya2VyVW5pdHM9InVzZXJTcGFjZU9uVXNlIiByZWZZPSI1IiByZWZYPSI0LjUiIHZpZXdCb3g9IjAgMCAxMCAxMCIgY2xhc3M9Im1hcmtlciBmbG93Y2hhcnQiIGlkPSJteS1zdmdfZmxvd2NoYXJ0LXBvaW50U3RhcnQiPjxwYXRoIHN0eWxlPSJzdHJva2Utd2lkdGg6IDE7IHN0cm9rZS1kYXNoYXJyYXk6IDEsIDA7IiBjbGFzcz0iYXJyb3dNYXJrZXJQYXRoIiBkPSJNIDAgNSBMIDEwIDEwIEwgMTAgMCB6Ii8+PC9tYXJrZXI+PG1hcmtlciBvcmllbnQ9ImF1dG8iIG1hcmtlckhlaWdodD0iMTEiIG1hcmtlcldpZHRoPSIxMSIgbWFya2VyVW5pdHM9InVzZXJTcGFjZU9uVXNlIiByZWZZPSI1IiByZWZYPSIxMSIgdmlld0JveD0iMCAwIDEwIDEwIiBjbGFzcz0ibWFya2VyIGZsb3djaGFydCIgaWQ9Im15LXN2Z19mbG93Y2hhcnQtY2lyY2xlRW5kIj48Y2lyY2xlIHN0eWxlPSJzdHJva2Utd2lkdGg6IDE7IHN0cm9rZS1kYXNoYXJyYXk6IDEsIDA7IiBjbGFzcz0iYXJyb3dNYXJrZXJQYXRoIiByPSI1IiBjeT0iNSIgY3g9IjUiLz48L21hcmtlcj48bWFya2VyIG9yaWVudD0iYXV0byIgbWFya2VySGVpZ2h0PSIxMSIgbWFya2VyV2lkdGg9IjExIiBtYXJrZXJVbml0cz0idXNlclNwYWNlT25Vc2UiIHJlZlk9IjUiIHJlZlg9Ii0xIiB2aWV3Qm94PSIwIDAgMTAgMTAiIGNsYXNzPSJtYXJrZXIgZmxvd2NoYXJ0IiBpZD0ibXktc3ZnX2Zsb3djaGFydC1jaXJjbGVTdGFydCI+PGNpcmNsZSBzdHlsZT0ic3Ryb2tlLXdpZHRoOiAxOyBzdHJva2UtZGFzaGFycmF5OiAxLCAwOyIgY2xhc3M9ImFycm93TWFya2VyUGF0aCIgcj0iNSIgY3k9IjUiIGN4PSI1Ii8+PC9tYXJrZXI+PG1hcmtlciBvcmllbnQ9ImF1dG8iIG1hcmtlckhlaWdodD0iMTEiIG1hcmtlcldpZHRoPSIxMSIgbWFya2VyVW5pdHM9InVzZXJTcGFjZU9uVXNlIiByZWZZPSI1LjIiIHJlZlg9IjEyIiB2aWV3Qm94PSIwIDAgMTEgMTEiIGNsYXNzPSJtYXJrZXIgY3Jvc3MgZmxvd2NoYXJ0IiBpZD0ibXktc3ZnX2Zsb3djaGFydC1jcm9zc0VuZCI+PHBhdGggc3R5bGU9InN0cm9rZS13aWR0aDogMjsgc3Ryb2tlLWRhc2hhcnJheTogMSwgMDsiIGNsYXNzPSJhcnJvd01hcmtlclBhdGgiIGQ9Ik0gMSwxIGwgOSw5IE0gMTAsMSBsIC05LDkiLz48L21hcmtlcj48bWFya2VyIG9yaWVudD0iYXV0byIgbWFya2VySGVpZ2h0PSIxMSIgbWFya2VyV2lkdGg9IjExIiBtYXJrZXJVbml0cz0idXNlclNwYWNlT25Vc2UiIHJlZlk9IjUuMiIgcmVmWD0iLTEiIHZpZXdCb3g9IjAgMCAxMSAxMSIgY2xhc3M9Im1hcmtlciBjcm9zcyBmbG93Y2hhcnQiIGlkPSJteS1zdmdfZmxvd2NoYXJ0LWNyb3NzU3RhcnQiPjxwYXRoIHN0eWxlPSJzdHJva2Utd2lkdGg6IDI7IHN0cm9rZS1kYXNoYXJyYXk6IDEsIDA7IiBjbGFzcz0iYXJyb3dNYXJrZXJQYXRoIiBkPSJNIDEsMSBsIDksOSBNIDEwLDEgbCAtOSw5Ii8+PC9tYXJrZXI+PGcgY2xhc3M9InJvb3QiPjxnIGNsYXNzPSJjbHVzdGVycyIvPjxnIGNsYXNzPSJlZGdlUGF0aHMiPjxwYXRoIHN0eWxlPSJmaWxsOm5vbmU7IiBjbGFzcz0iZWRnZS10aGlja25lc3Mtbm9ybWFsIGVkZ2UtcGF0dGVybi1zb2xpZCBmbG93Y2hhcnQtbGluayBMUy1BIExFLUIiIGlkPSJMLUEtQi0wIiBkPSJNNzAuMjM5LDg3Ljg1MUw3Ni44MzIsODAuMjc4QzgzLjQyNSw3Mi43MDUsOTYuNjExLDU3LjU2LDEwNy4zNzEsNDkuOTg3QzExOC4xMyw0Mi40MTQsMTI2LjQ2NCw0Mi40MTQsMTMwLjYzLDQyLjQxNEwxMzQuNzk3LDQyLjQxNCIvPjxwYXRoIHN0eWxlPSJmaWxsOm5vbmU7IiBjbGFzcz0iZWRnZS10aGlja25lc3Mtbm9ybWFsIGVkZ2UtcGF0dGVybi1zb2xpZCBmbG93Y2hhcnQtbGluayBMUy1CIExFLUMiIGlkPSJMLUItQy0wIiBkPSJNMjE5LjYyNSw0Mi40MTRMMjIzLjc5Miw0Mi40MTRDMjI3Ljk1OCw0Mi40MTQsMjM2LjI5Miw0Mi40MTQsMjQ1LjU2NCw0NS4zNDFDMjU0LjgzNiw0OC4yNjgsMjY1LjA0Niw1NC4xMjIsMjcwLjE1MSw1Ny4wNDhMMjc1LjI1Nyw1OS45NzUiLz48cGF0aCBzdHlsZT0iZmlsbDpub25lOyIgY2xhc3M9ImVkZ2UtdGhpY2tuZXNzLW5vcm1hbCBlZGdlLXBhdHRlcm4tc29saWQgZmxvd2NoYXJ0LWxpbmsgTFMtQyBMRS1EIiBpZD0iTC1DLUQtMCIgZD0iTTM1NC42NTYsODEuMTIxTDM1OC44MjMsODEuMTIxQzM2Mi45OSw4MS4xMjEsMzcxLjMyMyw4MS4xMjEsMzgwLjU5Nyw4NC4wMjhDMzg5Ljg3LDg2LjkzNSw0MDAuMDg0LDkyLjc1LDQwNS4xOTEsOTUuNjU3TDQxMC4yOTgsOTguNTY0Ii8+PHBhdGggc3R5bGU9ImZpbGw6bm9uZTsiIGNsYXNzPSJlZGdlLXRoaWNrbmVzcy1ub3JtYWwgZWRnZS1wYXR0ZXJuLXNvbGlkIGZsb3djaGFydC1saW5rIExTLUEgTEUtRCIgaWQ9IkwtQS1ELTAiIGQ9Ik03Ni43NSwxNDQuNjc5TDgyLjI1OCwxNDguNjY0Qzg3Ljc2NiwxNTIuNjQ4LDk4Ljc4MSwxNjAuNjE3LDExNS41MjUsMTY0LjYwMUMxMzIuMjY4LDE2OC41ODYsMTU0Ljc0LDE2OC41ODYsMTc3LjIxMSwxNjguNTg2QzE5OS42ODIsMTY4LjU4NiwyMjIuMTU0LDE2OC41ODYsMjQ0LjY0MiwxNjguNTg2QzI2Ny4xMywxNjguNTg2LDI4OS42MzUsMTY4LjU4NiwzMTIuMTQxLDE2OC41ODZDMzM0LjY0NiwxNjguNTg2LDM1Ny4xNTEsMTY4LjU4NiwzNzMuOTExLDE2NC42NDZDMzkwLjY3MSwxNjAuNzA2LDQwMS42ODUsMTUyLjgyNyw0MDcuMTkzLDE0OC44ODdMNDEyLjcsMTQ0Ljk0NyIvPjxwYXRoIHN0eWxlPSJmaWxsOm5vbmU7IiBjbGFzcz0iZWRnZS10aGlja25lc3Mtbm9ybWFsIGVkZ2UtcGF0dGVybi1zb2xpZCBmbG93Y2hhcnQtbGluayBMUy1BIExFLUMiIGlkPSJMLUEtQy0wIiBkPSJNODQuNzk3LDExOS44MjhMODguOTY0LDExOS44MjhDOTMuMTMsMTE5LjgyOCwxMDEuNDY0LDExOS44MjgsMTE2Ljg2NiwxMTkuODI4QzEzMi4yNjgsMTE5LjgyOCwxNTQuNzQsMTE5LjgyOCwxNzcuMjExLDExOS44MjhDMTk5LjY4MiwxMTkuODI4LDIyMi4xNTQsMTE5LjgyOCwyMzguNDk1LDExNi45MDFDMjU0LjgzNiwxMTMuOTc0LDI2NS4wNDYsMTA4LjEyMSwyNzAuMTUxLDEwNS4xOTRMMjc1LjI1NywxMDIuMjY3Ii8+PC9nPjxnIGNsYXNzPSJlZGdlTGFiZWxzIj48ZyBjbGFzcz0iZWRnZUxhYmVsIj48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLCAwKSIgY2xhc3M9ImxhYmVsIj48Zm9yZWlnbk9iamVjdCBoZWlnaHQ9IjAiIHdpZHRoPSIwIj48ZGl2IHN0eWxlPSJkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IHdoaXRlLXNwYWNlOiBub3dyYXA7IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+PHNwYW4gY2xhc3M9ImVkZ2VMYWJlbCI+PC9zcGFuPjwvZGl2PjwvZm9yZWlnbk9iamVjdD48L2c+PC9nPjxnIGNsYXNzPSJlZGdlTGFiZWwiPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAsIDApIiBjbGFzcz0ibGFiZWwiPjxmb3JlaWduT2JqZWN0IGhlaWdodD0iMCIgd2lkdGg9IjAiPjxkaXYgc3R5bGU9ImRpc3BsYXk6IGlubGluZS1ibG9jazsgd2hpdGUtc3BhY2U6IG5vd3JhcDsiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj48c3BhbiBjbGFzcz0iZWRnZUxhYmVsIj48L3NwYW4+PC9kaXY+PC9mb3JlaWduT2JqZWN0PjwvZz48L2c+PGcgY2xhc3M9ImVkZ2VMYWJlbCI+PGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCwgMCkiIGNsYXNzPSJsYWJlbCI+PGZvcmVpZ25PYmplY3QgaGVpZ2h0PSIwIiB3aWR0aD0iMCI+PGRpdiBzdHlsZT0iZGlzcGxheTogaW5saW5lLWJsb2NrOyB3aGl0ZS1zcGFjZTogbm93cmFwOyIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPjxzcGFuIGNsYXNzPSJlZGdlTGFiZWwiPjwvc3Bhbj48L2Rpdj48L2ZvcmVpZ25PYmplY3Q+PC9nPjwvZz48ZyBjbGFzcz0iZWRnZUxhYmVsIj48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLCAwKSIgY2xhc3M9ImxhYmVsIj48Zm9yZWlnbk9iamVjdCBoZWlnaHQ9IjAiIHdpZHRoPSIwIj48ZGl2IHN0eWxlPSJkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IHdoaXRlLXNwYWNlOiBub3dyYXA7IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+PHNwYW4gY2xhc3M9ImVkZ2VMYWJlbCI+PC9zcGFuPjwvZGl2PjwvZm9yZWlnbk9iamVjdD48L2c+PC9nPjxnIGNsYXNzPSJlZGdlTGFiZWwiPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAsIDApIiBjbGFzcz0ibGFiZWwiPjxmb3JlaWduT2JqZWN0IGhlaWdodD0iMCIgd2lkdGg9IjAiPjxkaXYgc3R5bGU9ImRpc3BsYXk6IGlubGluZS1ibG9jazsgd2hpdGUtc3BhY2U6IG5vd3JhcDsiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj48c3BhbiBjbGFzcz0iZWRnZUxhYmVsIj48L3NwYW4+PC9kaXY+PC9mb3JlaWduT2JqZWN0PjwvZz48L2c+PC9nPjxnIGNsYXNzPSJub2RlcyI+PGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoNDIuMzk4NDM3NSwgMTE5LjgyODEyNSkiIGRhdGEtaWQ9IkEiIGRhdGEtbm9kZT0idHJ1ZSIgaWQ9ImZsb3djaGFydC1BLTAiIGNsYXNzPSJub2RlIGRlZmF1bHQgcGVyc29uIGZsb3djaGFydC1sYWJlbCI+PGNpcmNsZSBoZWlnaHQ9IjM0IiB3aWR0aD0iODQuNzk2ODc1IiByPSI0Mi4zOTg0Mzc1IiByeT0iMCIgcng9IjAiIHN0eWxlPSIiLz48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMzQuODk4NDM3NSwgLTkuNSkiIHN0eWxlPSIiIGNsYXNzPSJsYWJlbCI+PHJlY3QvPjxmb3JlaWduT2JqZWN0IGhlaWdodD0iMTkiIHdpZHRoPSI2OS43OTY4NzUiPjxkaXYgc3R5bGU9ImRpc3BsYXk6IGlubGluZS1ibG9jazsgd2hpdGUtc3BhY2U6IG5vd3JhcDsiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj48c3BhbiBjbGFzcz0ibm9kZUxhYmVsIj5QZXJzb24gQTwvc3Bhbj48L2Rpdj48L2ZvcmVpZ25PYmplY3Q+PC9nPjwvZz48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxNzcuMjEwOTM3NSwgNDIuNDE0MDYyNSkiIGRhdGEtaWQ9IkIiIGRhdGEtbm9kZT0idHJ1ZSIgaWQ9ImZsb3djaGFydC1CLTEiIGNsYXNzPSJub2RlIGRlZmF1bHQgcGVyc29uIGZsb3djaGFydC1sYWJlbCI+PGNpcmNsZSBoZWlnaHQ9IjM0IiB3aWR0aD0iODQuODI4MTI1IiByPSI0Mi40MTQwNjI1IiByeT0iMCIgcng9IjAiIHN0eWxlPSIiLz48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMzQuOTE0MDYyNSwgLTkuNSkiIHN0eWxlPSIiIGNsYXNzPSJsYWJlbCI+PHJlY3QvPjxmb3JlaWduT2JqZWN0IGhlaWdodD0iMTkiIHdpZHRoPSI2OS44MjgxMjUiPjxkaXYgc3R5bGU9ImRpc3BsYXk6IGlubGluZS1ibG9jazsgd2hpdGUtc3BhY2U6IG5vd3JhcDsiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj48c3BhbiBjbGFzcz0ibm9kZUxhYmVsIj5QZXJzb24gQjwvc3Bhbj48L2Rpdj48L2ZvcmVpZ25PYmplY3Q+PC9nPjwvZz48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgzMTIuMTQwNjI1LCA4MS4xMjEwOTM3NSkiIGRhdGEtaWQ9IkMiIGRhdGEtbm9kZT0idHJ1ZSIgaWQ9ImZsb3djaGFydC1DLTMiIGNsYXNzPSJub2RlIGRlZmF1bHQgcGVyc29uIGZsb3djaGFydC1sYWJlbCI+PGNpcmNsZSBoZWlnaHQ9IjM0IiB3aWR0aD0iODUuMDMxMjUiIHI9IjQyLjUxNTYyNSIgcnk9IjAiIHJ4PSIwIiBzdHlsZT0iIi8+PGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTM1LjAxNTYyNSwgLTkuNSkiIHN0eWxlPSIiIGNsYXNzPSJsYWJlbCI+PHJlY3QvPjxmb3JlaWduT2JqZWN0IGhlaWdodD0iMTkiIHdpZHRoPSI3MC4wMzEyNSI+PGRpdiBzdHlsZT0iZGlzcGxheTogaW5saW5lLWJsb2NrOyB3aGl0ZS1zcGFjZTogbm93cmFwOyIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPjxzcGFuIGNsYXNzPSJub2RlTGFiZWwiPlBlcnNvbiBDPC9zcGFuPjwvZGl2PjwvZm9yZWlnbk9iamVjdD48L2c+PC9nPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDQ0Ny43NDIxODc1LCAxMTkuODc4OTA2MjUpIiBkYXRhLWlkPSJEIiBkYXRhLW5vZGU9InRydWUiIGlkPSJmbG93Y2hhcnQtRC01IiBjbGFzcz0ibm9kZSBkZWZhdWx0IHBlcnNvbiBmbG93Y2hhcnQtbGFiZWwiPjxjaXJjbGUgaGVpZ2h0PSIzNCIgd2lkdGg9Ijg2LjE3MTg3NSIgcj0iNDMuMDg1OTM3NSIgcnk9IjAiIHJ4PSIwIiBzdHlsZT0iIi8+PGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTM1LjU4NTkzNzUsIC05LjUpIiBzdHlsZT0iIiBjbGFzcz0ibGFiZWwiPjxyZWN0Lz48Zm9yZWlnbk9iamVjdCBoZWlnaHQ9IjE5IiB3aWR0aD0iNzEuMTcxODc1Ij48ZGl2IHN0eWxlPSJkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IHdoaXRlLXNwYWNlOiBub3dyYXA7IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+PHNwYW4gY2xhc3M9Im5vZGVMYWJlbCI+UGVyc29uIEQ8L3NwYW4+PC9kaXY+PC9mb3JlaWduT2JqZWN0PjwvZz48L2c+PC9nPjwvZz48L2c+PC9zdmc+"&gt;&lt;/p&gt;
&lt;h3 id="weighted-vs-unweighted"&gt;Weighted vs. Unweighted&lt;/h3&gt;
&lt;h4 id="weighted-graphs"&gt;&lt;a href="weighted-graphs.html"&gt;Weighted Graphs&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;In weighted graphs, edges have different values or importance attached to them.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Examples&lt;/strong&gt;: Road networks where weights represent distances, communication networks where weights represent bandwidth&lt;/p&gt;
&lt;p&gt;&lt;img src="data:image/svg+xml;base64,PHN2ZyBhcmlhLXJvbGVkZXNjcmlwdGlvbj0iZmxvd2NoYXJ0LXYyIiByb2xlPSJncmFwaGljcy1kb2N1bWVudCBkb2N1bWVudCIgdmlld0JveD0iLTggLTggNTc4LjI4MTI1IDEzMi40MjE4NzUiIHN0eWxlPSJtYXgtd2lkdGg6IDU3OC4yODFweDsgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7IiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB3aWR0aD0iMTAwJSIgaWQ9Im15LXN2ZyI+PHN0eWxlPiNteS1zdmd7Zm9udC1mYW1pbHk6InRyZWJ1Y2hldCBtcyIsdmVyZGFuYSxhcmlhbCxzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNnB4O2ZpbGw6IzMzMzt9I215LXN2ZyAuZXJyb3ItaWNvbntmaWxsOiM1NTIyMjI7fSNteS1zdmcgLmVycm9yLXRleHR7ZmlsbDojNTUyMjIyO3N0cm9rZTojNTUyMjIyO30jbXktc3ZnIC5lZGdlLXRoaWNrbmVzcy1ub3JtYWx7c3Ryb2tlLXdpZHRoOjJweDt9I215LXN2ZyAuZWRnZS10aGlja25lc3MtdGhpY2t7c3Ryb2tlLXdpZHRoOjMuNXB4O30jbXktc3ZnIC5lZGdlLXBhdHRlcm4tc29saWR7c3Ryb2tlLWRhc2hhcnJheTowO30jbXktc3ZnIC5lZGdlLXBhdHRlcm4tZGFzaGVke3N0cm9rZS1kYXNoYXJyYXk6Mzt9I215LXN2ZyAuZWRnZS1wYXR0ZXJuLWRvdHRlZHtzdHJva2UtZGFzaGFycmF5OjI7fSNteS1zdmcgLm1hcmtlcntmaWxsOiMzMzMzMzM7c3Ryb2tlOiMzMzMzMzM7fSNteS1zdmcgLm1hcmtlci5jcm9zc3tzdHJva2U6IzMzMzMzMzt9I215LXN2ZyBzdmd7Zm9udC1mYW1pbHk6InRyZWJ1Y2hldCBtcyIsdmVyZGFuYSxhcmlhbCxzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNnB4O30jbXktc3ZnIC5sYWJlbHtmb250LWZhbWlseToidHJlYnVjaGV0IG1zIix2ZXJkYW5hLGFyaWFsLHNhbnMtc2VyaWY7Y29sb3I6IzMzMzt9I215LXN2ZyAuY2x1c3Rlci1sYWJlbCB0ZXh0e2ZpbGw6IzMzMzt9I215LXN2ZyAuY2x1c3Rlci1sYWJlbCBzcGFuLCNteS1zdmcgcHtjb2xvcjojMzMzO30jbXktc3ZnIC5sYWJlbCB0ZXh0LCNteS1zdmcgc3BhbiwjbXktc3ZnIHB7ZmlsbDojMzMzO2NvbG9yOiMzMzM7fSNteS1zdmcgLm5vZGUgcmVjdCwjbXktc3ZnIC5ub2RlIGNpcmNsZSwjbXktc3ZnIC5ub2RlIGVsbGlwc2UsI215LXN2ZyAubm9kZSBwb2x5Z29uLCNteS1zdmcgLm5vZGUgcGF0aHtmaWxsOiNFQ0VDRkY7c3Ryb2tlOiM5MzcwREI7c3Ryb2tlLXdpZHRoOjFweDt9I215LXN2ZyAuZmxvd2NoYXJ0LWxhYmVsIHRleHR7dGV4dC1hbmNob3I6bWlkZGxlO30jbXktc3ZnIC5ub2RlIC5rYXRleCBwYXRoe2ZpbGw6IzAwMDtzdHJva2U6IzAwMDtzdHJva2Utd2lkdGg6MXB4O30jbXktc3ZnIC5ub2RlIC5sYWJlbHt0ZXh0LWFsaWduOmNlbnRlcjt9I215LXN2ZyAubm9kZS5jbGlja2FibGV7Y3Vyc29yOnBvaW50ZXI7fSNteS1zdmcgLmFycm93aGVhZFBhdGh7ZmlsbDojMzMzMzMzO30jbXktc3ZnIC5lZGdlUGF0aCAucGF0aHtzdHJva2U6IzMzMzMzMztzdHJva2Utd2lkdGg6Mi4wcHg7fSNteS1zdmcgLmZsb3djaGFydC1saW5re3N0cm9rZTojMzMzMzMzO2ZpbGw6bm9uZTt9I215LXN2ZyAuZWRnZUxhYmVse2JhY2tncm91bmQtY29sb3I6I2U4ZThlODt0ZXh0LWFsaWduOmNlbnRlcjt9I215LXN2ZyAuZWRnZUxhYmVsIHJlY3R7b3BhY2l0eTowLjU7YmFja2dyb3VuZC1jb2xvcjojZThlOGU4O2ZpbGw6I2U4ZThlODt9I215LXN2ZyAubGFiZWxCa2d7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDIzMiwgMjMyLCAyMzIsIDAuNSk7fSNteS1zdmcgLmNsdXN0ZXIgcmVjdHtmaWxsOiNmZmZmZGU7c3Ryb2tlOiNhYWFhMzM7c3Ryb2tlLXdpZHRoOjFweDt9I215LXN2ZyAuY2x1c3RlciB0ZXh0e2ZpbGw6IzMzMzt9I215LXN2ZyAuY2x1c3RlciBzcGFuLCNteS1zdmcgcHtjb2xvcjojMzMzO30jbXktc3ZnIGRpdi5tZXJtYWlkVG9vbHRpcHtwb3NpdGlvbjphYnNvbHV0ZTt0ZXh0LWFsaWduOmNlbnRlcjttYXgtd2lkdGg6MjAwcHg7cGFkZGluZzoycHg7Zm9udC1mYW1pbHk6InRyZWJ1Y2hldCBtcyIsdmVyZGFuYSxhcmlhbCxzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMnB4O2JhY2tncm91bmQ6aHNsKDgwLCAxMDAlLCA5Ni4yNzQ1MDk4MDM5JSk7Ym9yZGVyOjFweCBzb2xpZCAjYWFhYTMzO2JvcmRlci1yYWRpdXM6MnB4O3BvaW50ZXItZXZlbnRzOm5vbmU7ei1pbmRleDoxMDA7fSNteS1zdmcgLmZsb3djaGFydFRpdGxlVGV4dHt0ZXh0LWFuY2hvcjptaWRkbGU7Zm9udC1zaXplOjE4cHg7ZmlsbDojMzMzO30jbXktc3ZnIDpyb290ey0tbWVybWFpZC1mb250LWZhbWlseToidHJlYnVjaGV0IG1zIix2ZXJkYW5hLGFyaWFsLHNhbnMtc2VyaWY7fSNteS1zdmcgLmNpdHkmZ3Q7KntmaWxsOiNiOThiOTkhaW1wb3J0YW50O3N0cm9rZTojMUIzRDJGIWltcG9ydGFudDtzdHJva2Utd2lkdGg6MnB4IWltcG9ydGFudDt9I215LXN2ZyAuY2l0eSBzcGFue2ZpbGw6I2I5OGI5OSFpbXBvcnRhbnQ7c3Ryb2tlOiMxQjNEMkYhaW1wb3J0YW50O3N0cm9rZS13aWR0aDoycHghaW1wb3J0YW50O308L3N0eWxlPjxnPjxtYXJrZXIgb3JpZW50PSJhdXRvIiBtYXJrZXJIZWlnaHQ9IjEyIiBtYXJrZXJXaWR0aD0iMTIiIG1hcmtlclVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgcmVmWT0iNSIgcmVmWD0iNiIgdmlld0JveD0iMCAwIDEwIDEwIiBjbGFzcz0ibWFya2VyIGZsb3djaGFydCIgaWQ9Im15LXN2Z19mbG93Y2hhcnQtcG9pbnRFbmQiPjxwYXRoIHN0eWxlPSJzdHJva2Utd2lkdGg6IDE7IHN0cm9rZS1kYXNoYXJyYXk6IDEsIDA7IiBjbGFzcz0iYXJyb3dNYXJrZXJQYXRoIiBkPSJNIDAgMCBMIDEwIDUgTCAwIDEwIHoiLz48L21hcmtlcj48bWFya2VyIG9yaWVudD0iYXV0byIgbWFya2VySGVpZ2h0PSIxMiIgbWFya2VyV2lkdGg9IjEyIiBtYXJrZXJVbml0cz0idXNlclNwYWNlT25Vc2UiIHJlZlk9IjUiIHJlZlg9IjQuNSIgdmlld0JveD0iMCAwIDEwIDEwIiBjbGFzcz0ibWFya2VyIGZsb3djaGFydCIgaWQ9Im15LXN2Z19mbG93Y2hhcnQtcG9pbnRTdGFydCI+PHBhdGggc3R5bGU9InN0cm9rZS13aWR0aDogMTsgc3Ryb2tlLWRhc2hhcnJheTogMSwgMDsiIGNsYXNzPSJhcnJvd01hcmtlclBhdGgiIGQ9Ik0gMCA1IEwgMTAgMTAgTCAxMCAwIHoiLz48L21hcmtlcj48bWFya2VyIG9yaWVudD0iYXV0byIgbWFya2VySGVpZ2h0PSIxMSIgbWFya2VyV2lkdGg9IjExIiBtYXJrZXJVbml0cz0idXNlclNwYWNlT25Vc2UiIHJlZlk9IjUiIHJlZlg9IjExIiB2aWV3Qm94PSIwIDAgMTAgMTAiIGNsYXNzPSJtYXJrZXIgZmxvd2NoYXJ0IiBpZD0ibXktc3ZnX2Zsb3djaGFydC1jaXJjbGVFbmQiPjxjaXJjbGUgc3R5bGU9InN0cm9rZS13aWR0aDogMTsgc3Ryb2tlLWRhc2hhcnJheTogMSwgMDsiIGNsYXNzPSJhcnJvd01hcmtlclBhdGgiIHI9IjUiIGN5PSI1IiBjeD0iNSIvPjwvbWFya2VyPjxtYXJrZXIgb3JpZW50PSJhdXRvIiBtYXJrZXJIZWlnaHQ9IjExIiBtYXJrZXJXaWR0aD0iMTEiIG1hcmtlclVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgcmVmWT0iNSIgcmVmWD0iLTEiIHZpZXdCb3g9IjAgMCAxMCAxMCIgY2xhc3M9Im1hcmtlciBmbG93Y2hhcnQiIGlkPSJteS1zdmdfZmxvd2NoYXJ0LWNpcmNsZVN0YXJ0Ij48Y2lyY2xlIHN0eWxlPSJzdHJva2Utd2lkdGg6IDE7IHN0cm9rZS1kYXNoYXJyYXk6IDEsIDA7IiBjbGFzcz0iYXJyb3dNYXJrZXJQYXRoIiByPSI1IiBjeT0iNSIgY3g9IjUiLz48L21hcmtlcj48bWFya2VyIG9yaWVudD0iYXV0byIgbWFya2VySGVpZ2h0PSIxMSIgbWFya2VyV2lkdGg9IjExIiBtYXJrZXJVbml0cz0idXNlclNwYWNlT25Vc2UiIHJlZlk9IjUuMiIgcmVmWD0iMTIiIHZpZXdCb3g9IjAgMCAxMSAxMSIgY2xhc3M9Im1hcmtlciBjcm9zcyBmbG93Y2hhcnQiIGlkPSJteS1zdmdfZmxvd2NoYXJ0LWNyb3NzRW5kIj48cGF0aCBzdHlsZT0ic3Ryb2tlLXdpZHRoOiAyOyBzdHJva2UtZGFzaGFycmF5OiAxLCAwOyIgY2xhc3M9ImFycm93TWFya2VyUGF0aCIgZD0iTSAxLDEgbCA5LDkgTSAxMCwxIGwgLTksOSIvPjwvbWFya2VyPjxtYXJrZXIgb3JpZW50PSJhdXRvIiBtYXJrZXJIZWlnaHQ9IjExIiBtYXJrZXJXaWR0aD0iMTEiIG1hcmtlclVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgcmVmWT0iNS4yIiByZWZYPSItMSIgdmlld0JveD0iMCAwIDExIDExIiBjbGFzcz0ibWFya2VyIGNyb3NzIGZsb3djaGFydCIgaWQ9Im15LXN2Z19mbG93Y2hhcnQtY3Jvc3NTdGFydCI+PHBhdGggc3R5bGU9InN0cm9rZS13aWR0aDogMjsgc3Ryb2tlLWRhc2hhcnJheTogMSwgMDsiIGNsYXNzPSJhcnJvd01hcmtlclBhdGgiIGQ9Ik0gMSwxIGwgOSw5IE0gMTAsMSBsIC05LDkiLz48L21hcmtlcj48ZyBjbGFzcz0icm9vdCI+PGcgY2xhc3M9ImNsdXN0ZXJzIi8+PGcgY2xhc3M9ImVkZ2VQYXRocyI+PHBhdGggbWFya2VyLWVuZD0idXJsKCNteS1zdmdfZmxvd2NoYXJ0LXBvaW50RW5kKSIgc3R5bGU9ImZpbGw6bm9uZTsiIGNsYXNzPSJlZGdlLXRoaWNrbmVzcy1ub3JtYWwgZWRnZS1wYXR0ZXJuLXNvbGlkIGZsb3djaGFydC1saW5rIExTLUEgTEUtQiIgaWQ9IkwtQS1CLTAiIGQ9Ik01OS43Nyw1Ni41NTJMNjkuNDE0LDUyLjMyOEM3OS4wNTgsNDguMTA1LDk4LjM0NSwzOS42NTgsMTE2LjMxMywzNS40MzRDMTM0LjI4LDMxLjIxMSwxNTAuOTI4LDMxLjIxMSwxNTkuMjUxLDMxLjIxMUwxNjcuNTc1LDMxLjIxMSIvPjxwYXRoIG1hcmtlci1lbmQ9InVybCgjbXktc3ZnX2Zsb3djaGFydC1wb2ludEVuZCkiIHN0eWxlPSJmaWxsOm5vbmU7IiBjbGFzcz0iZWRnZS10aGlja25lc3Mtbm9ybWFsIGVkZ2UtcGF0dGVybi1zb2xpZCBmbG93Y2hhcnQtbGluayBMUy1CIExFLUMiIGlkPSJMLUItQy0wIiBkPSJNMjM1LjI5NywzMS4yMTFMMjQzLjY1NSwzMS4yMTFDMjUyLjAxMywzMS4yMTEsMjY4LjcyOSwzMS4yMTEsMjg1LjEzLDM0Ljk0OUMzMDEuNTMxLDM4LjY4NiwzMTcuNjE4LDQ2LjE2MiwzMjUuNjYxLDQ5Ljg5OUwzMzMuNzA0LDUzLjYzNyIvPjxwYXRoIG1hcmtlci1lbmQ9InVybCgjbXktc3ZnX2Zsb3djaGFydC1wb2ludEVuZCkiIHN0eWxlPSJmaWxsOm5vbmU7IiBjbGFzcz0iZWRnZS10aGlja25lc3Mtbm9ybWFsIGVkZ2UtcGF0dGVybi1zb2xpZCBmbG93Y2hhcnQtbGluayBMUy1BIExFLUMiIGlkPSJMLUEtQy0wIiBkPSJNNTkuNzcsODEuNTgxTDY5LjQxNCw4NS44MDRDNzkuMDU4LDkwLjAyOCw5OC4zNDUsOTguNDc1LDEyMi4zOTgsMTAyLjY5OEMxNDYuNDUxLDEwNi45MjIsMTc1LjI2OCwxMDYuOTIyLDIwMy4yMzcsMTA2LjkyMkMyMzEuMjA2LDEwNi45MjIsMjU4LjMyNiwxMDYuOTIyLDI3OS45MjgsMTAzLjE4NEMzMDEuNTMxLDk5LjQ0NywzMTcuNjE4LDkxLjk3MSwzMjUuNjYxLDg4LjIzNEwzMzMuNzA0LDg0LjQ5NiIvPjxwYXRoIG1hcmtlci1lbmQ9InVybCgjbXktc3ZnX2Zsb3djaGFydC1wb2ludEVuZCkiIHN0eWxlPSJmaWxsOm5vbmU7IiBjbGFzcz0iZWRnZS10aGlja25lc3Mtbm9ybWFsIGVkZ2UtcGF0dGVybi1zb2xpZCBmbG93Y2hhcnQtbGluayBMUy1DIExFLUQiIGlkPSJMLUMtRC0wIiBkPSJNMzk4LjIxOSw2OS4wNjZMNDA2LjU3Nyw2OS4wNjZDNDE0LjkzNSw2OS4wNjYsNDMxLjY1MSw2OS4wNjYsNDQ3LjQ4NCw2OS4wNjZDNDYzLjMxNyw2OS4wNjYsNDc4LjI2Niw2OS4wNjYsNDg1Ljc0MSw2OS4wNjZMNDkzLjIxNiw2OS4wNjYiLz48L2c+PGcgY2xhc3M9ImVkZ2VMYWJlbHMiPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDExNy42MzI4MTI1LCAzMS4yMTA5Mzc1KSIgY2xhc3M9ImVkZ2VMYWJlbCI+PGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTMwLjI0MjE4NzUsIC05LjUpIiBjbGFzcz0ibGFiZWwiPjxmb3JlaWduT2JqZWN0IGhlaWdodD0iMTkiIHdpZHRoPSI2MC40ODQzNzUiPjxkaXYgc3R5bGU9ImRpc3BsYXk6IGlubGluZS1ibG9jazsgd2hpdGUtc3BhY2U6IG5vd3JhcDsiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj48c3BhbiBjbGFzcz0iZWRnZUxhYmVsIj4xMjAga208L3NwYW4+PC9kaXY+PC9mb3JlaWduT2JqZWN0PjwvZz48L2c+PGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMjg1LjQ0NTMxMjUsIDMxLjIxMDkzNzUpIiBjbGFzcz0iZWRnZUxhYmVsIj48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMjUuMTQ4NDM3NSwgLTkuNSkiIGNsYXNzPSJsYWJlbCI+PGZvcmVpZ25PYmplY3QgaGVpZ2h0PSIxOSIgd2lkdGg9IjUwLjI5Njg3NSI+PGRpdiBzdHlsZT0iZGlzcGxheTogaW5saW5lLWJsb2NrOyB3aGl0ZS1zcGFjZTogbm93cmFwOyIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPjxzcGFuIGNsYXNzPSJlZGdlTGFiZWwiPjg1IGttPC9zcGFuPjwvZGl2PjwvZm9yZWlnbk9iamVjdD48L2c+PC9nPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDIwNC4wODU5Mzc1LCAxMDYuOTIxODc1KSIgY2xhc3M9ImVkZ2VMYWJlbCI+PGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTMwLjI0MjE4NzUsIC05LjUpIiBjbGFzcz0ibGFiZWwiPjxmb3JlaWduT2JqZWN0IGhlaWdodD0iMTkiIHdpZHRoPSI2MC40ODQzNzUiPjxkaXYgc3R5bGU9ImRpc3BsYXk6IGlubGluZS1ibG9jazsgd2hpdGUtc3BhY2U6IG5vd3JhcDsiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj48c3BhbiBjbGFzcz0iZWRnZUxhYmVsIj4yMDAga208L3NwYW4+PC9kaXY+PC9mb3JlaWduT2JqZWN0PjwvZz48L2c+PGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoNDQ4LjM2NzE4NzUsIDY5LjA2NjQwNjI1KSIgY2xhc3M9ImVkZ2VMYWJlbCI+PGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTI1LjE0ODQzNzUsIC05LjUpIiBjbGFzcz0ibGFiZWwiPjxmb3JlaWduT2JqZWN0IGhlaWdodD0iMTkiIHdpZHRoPSI1MC4yOTY4NzUiPjxkaXYgc3R5bGU9ImRpc3BsYXk6IGlubGluZS1ibG9jazsgd2hpdGUtc3BhY2U6IG5vd3JhcDsiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj48c3BhbiBjbGFzcz0iZWRnZUxhYmVsIj42MCBrbTwvc3Bhbj48L2Rpdj48L2ZvcmVpZ25PYmplY3Q+PC9nPjwvZz48L2c+PGcgY2xhc3M9Im5vZGVzIj48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgzMS4xOTUzMTI1LCA2OS4wNjY0MDYyNSkiIGRhdGEtaWQ9IkEiIGRhdGEtbm9kZT0idHJ1ZSIgaWQ9ImZsb3djaGFydC1BLTAiIGNsYXNzPSJub2RlIGRlZmF1bHQgY2l0eSBmbG93Y2hhcnQtbGFiZWwiPjxjaXJjbGUgaGVpZ2h0PSIzNCIgd2lkdGg9IjYyLjM5MDYyNSIgcj0iMzEuMTk1MzEyNSIgcnk9IjAiIHJ4PSIwIiBzdHlsZT0iIi8+PGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTIzLjY5NTMxMjUsIC05LjUpIiBzdHlsZT0iIiBjbGFzcz0ibGFiZWwiPjxyZWN0Lz48Zm9yZWlnbk9iamVjdCBoZWlnaHQ9IjE5IiB3aWR0aD0iNDcuMzkwNjI1Ij48ZGl2IHN0eWxlPSJkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IHdoaXRlLXNwYWNlOiBub3dyYXA7IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+PHNwYW4gY2xhc3M9Im5vZGVMYWJlbCI+Q2l0eSBBPC9zcGFuPjwvZGl2PjwvZm9yZWlnbk9iamVjdD48L2c+PC9nPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDIwNC4wODU5Mzc1LCAzMS4yMTA5Mzc1KSIgZGF0YS1pZD0iQiIgZGF0YS1ub2RlPSJ0cnVlIiBpZD0iZmxvd2NoYXJ0LUItMSIgY2xhc3M9Im5vZGUgZGVmYXVsdCBjaXR5IGZsb3djaGFydC1sYWJlbCI+PGNpcmNsZSBoZWlnaHQ9IjM0IiB3aWR0aD0iNjIuNDIxODc1IiByPSIzMS4yMTA5Mzc1IiByeT0iMCIgcng9IjAiIHN0eWxlPSIiLz48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMjMuNzEwOTM3NSwgLTkuNSkiIHN0eWxlPSIiIGNsYXNzPSJsYWJlbCI+PHJlY3QvPjxmb3JlaWduT2JqZWN0IGhlaWdodD0iMTkiIHdpZHRoPSI0Ny40MjE4NzUiPjxkaXYgc3R5bGU9ImRpc3BsYXk6IGlubGluZS1ibG9jazsgd2hpdGUtc3BhY2U6IG5vd3JhcDsiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj48c3BhbiBjbGFzcz0ibm9kZUxhYmVsIj5DaXR5IEI8L3NwYW4+PC9kaXY+PC9mb3JlaWduT2JqZWN0PjwvZz48L2c+PGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMzY2LjkwNjI1LCA2OS4wNjY0MDYyNSkiIGRhdGEtaWQ9IkMiIGRhdGEtbm9kZT0idHJ1ZSIgaWQ9ImZsb3djaGFydC1DLTMiIGNsYXNzPSJub2RlIGRlZmF1bHQgY2l0eSBmbG93Y2hhcnQtbGFiZWwiPjxjaXJjbGUgaGVpZ2h0PSIzNCIgd2lkdGg9IjYyLjYyNSIgcj0iMzEuMzEyNSIgcnk9IjAiIHJ4PSIwIiBzdHlsZT0iIi8+PGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTIzLjgxMjUsIC05LjUpIiBzdHlsZT0iIiBjbGFzcz0ibGFiZWwiPjxyZWN0Lz48Zm9yZWlnbk9iamVjdCBoZWlnaHQ9IjE5IiB3aWR0aD0iNDcuNjI1Ij48ZGl2IHN0eWxlPSJkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IHdoaXRlLXNwYWNlOiBub3dyYXA7IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+PHNwYW4gY2xhc3M9Im5vZGVMYWJlbCI+Q2l0eSBDPC9zcGFuPjwvZGl2PjwvZm9yZWlnbk9iamVjdD48L2c+PC9nPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDUzMC4zOTg0Mzc1LCA2OS4wNjY0MDYyNSkiIGRhdGEtaWQ9IkQiIGRhdGEtbm9kZT0idHJ1ZSIgaWQ9ImZsb3djaGFydC1ELTciIGNsYXNzPSJub2RlIGRlZmF1bHQgY2l0eSBmbG93Y2hhcnQtbGFiZWwiPjxjaXJjbGUgaGVpZ2h0PSIzNCIgd2lkdGg9IjYzLjc2NTYyNSIgcj0iMzEuODgyODEyNSIgcnk9IjAiIHJ4PSIwIiBzdHlsZT0iIi8+PGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTI0LjM4MjgxMjUsIC05LjUpIiBzdHlsZT0iIiBjbGFzcz0ibGFiZWwiPjxyZWN0Lz48Zm9yZWlnbk9iamVjdCBoZWlnaHQ9IjE5IiB3aWR0aD0iNDguNzY1NjI1Ij48ZGl2IHN0eWxlPSJkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IHdoaXRlLXNwYWNlOiBub3dyYXA7IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+PHNwYW4gY2xhc3M9Im5vZGVMYWJlbCI+Q2l0eSBEPC9zcGFuPjwvZGl2PjwvZm9yZWlnbk9iamVjdD48L2c+PC9nPjwvZz48L2c+PC9nPjwvc3ZnPg=="&gt;&lt;/p&gt;
&lt;h4 id="unweighted-graphs"&gt;Unweighted Graphs&lt;/h4&gt;
&lt;p&gt;In unweighted graphs, all edges have equal importance.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Examples&lt;/strong&gt;: Simple connection diagrams, logical relationships&lt;/p&gt;
&lt;h2 id="common-graph-topologies"&gt;Common Graph Topologies&lt;/h2&gt;
&lt;p&gt;Graphs come in various standard topologies, each with specific use cases:&lt;/p&gt;
&lt;h3 id="bus-topology"&gt;Bus Topology&lt;/h3&gt;
&lt;p&gt;Nodes are arranged in a line, with each node connected to adjacent nodes.&lt;/p&gt;
&lt;p&gt;&lt;img src="data:image/svg+xml;base64,PHN2ZyBhcmlhLXJvbGVkZXNjcmlwdGlvbj0iZmxvd2NoYXJ0LXYyIiByb2xlPSJncmFwaGljcy1kb2N1bWVudCBkb2N1bWVudCIgdmlld0JveD0iLTggLTggNTgwLjc2NTYyNSA5MC4xNzE4NzUiIHN0eWxlPSJtYXgtd2lkdGg6IDU4MC43NjZweDsgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7IiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB3aWR0aD0iMTAwJSIgaWQ9Im15LXN2ZyI+PHN0eWxlPiNteS1zdmd7Zm9udC1mYW1pbHk6InRyZWJ1Y2hldCBtcyIsdmVyZGFuYSxhcmlhbCxzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNnB4O2ZpbGw6IzMzMzt9I215LXN2ZyAuZXJyb3ItaWNvbntmaWxsOiM1NTIyMjI7fSNteS1zdmcgLmVycm9yLXRleHR7ZmlsbDojNTUyMjIyO3N0cm9rZTojNTUyMjIyO30jbXktc3ZnIC5lZGdlLXRoaWNrbmVzcy1ub3JtYWx7c3Ryb2tlLXdpZHRoOjJweDt9I215LXN2ZyAuZWRnZS10aGlja25lc3MtdGhpY2t7c3Ryb2tlLXdpZHRoOjMuNXB4O30jbXktc3ZnIC5lZGdlLXBhdHRlcm4tc29saWR7c3Ryb2tlLWRhc2hhcnJheTowO30jbXktc3ZnIC5lZGdlLXBhdHRlcm4tZGFzaGVke3N0cm9rZS1kYXNoYXJyYXk6Mzt9I215LXN2ZyAuZWRnZS1wYXR0ZXJuLWRvdHRlZHtzdHJva2UtZGFzaGFycmF5OjI7fSNteS1zdmcgLm1hcmtlcntmaWxsOiMzMzMzMzM7c3Ryb2tlOiMzMzMzMzM7fSNteS1zdmcgLm1hcmtlci5jcm9zc3tzdHJva2U6IzMzMzMzMzt9I215LXN2ZyBzdmd7Zm9udC1mYW1pbHk6InRyZWJ1Y2hldCBtcyIsdmVyZGFuYSxhcmlhbCxzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNnB4O30jbXktc3ZnIC5sYWJlbHtmb250LWZhbWlseToidHJlYnVjaGV0IG1zIix2ZXJkYW5hLGFyaWFsLHNhbnMtc2VyaWY7Y29sb3I6IzMzMzt9I215LXN2ZyAuY2x1c3Rlci1sYWJlbCB0ZXh0e2ZpbGw6IzMzMzt9I215LXN2ZyAuY2x1c3Rlci1sYWJlbCBzcGFuLCNteS1zdmcgcHtjb2xvcjojMzMzO30jbXktc3ZnIC5sYWJlbCB0ZXh0LCNteS1zdmcgc3BhbiwjbXktc3ZnIHB7ZmlsbDojMzMzO2NvbG9yOiMzMzM7fSNteS1zdmcgLm5vZGUgcmVjdCwjbXktc3ZnIC5ub2RlIGNpcmNsZSwjbXktc3ZnIC5ub2RlIGVsbGlwc2UsI215LXN2ZyAubm9kZSBwb2x5Z29uLCNteS1zdmcgLm5vZGUgcGF0aHtmaWxsOiNFQ0VDRkY7c3Ryb2tlOiM5MzcwREI7c3Ryb2tlLXdpZHRoOjFweDt9I215LXN2ZyAuZmxvd2NoYXJ0LWxhYmVsIHRleHR7dGV4dC1hbmNob3I6bWlkZGxlO30jbXktc3ZnIC5ub2RlIC5rYXRleCBwYXRoe2ZpbGw6IzAwMDtzdHJva2U6IzAwMDtzdHJva2Utd2lkdGg6MXB4O30jbXktc3ZnIC5ub2RlIC5sYWJlbHt0ZXh0LWFsaWduOmNlbnRlcjt9I215LXN2ZyAubm9kZS5jbGlja2FibGV7Y3Vyc29yOnBvaW50ZXI7fSNteS1zdmcgLmFycm93aGVhZFBhdGh7ZmlsbDojMzMzMzMzO30jbXktc3ZnIC5lZGdlUGF0aCAucGF0aHtzdHJva2U6IzMzMzMzMztzdHJva2Utd2lkdGg6Mi4wcHg7fSNteS1zdmcgLmZsb3djaGFydC1saW5re3N0cm9rZTojMzMzMzMzO2ZpbGw6bm9uZTt9I215LXN2ZyAuZWRnZUxhYmVse2JhY2tncm91bmQtY29sb3I6I2U4ZThlODt0ZXh0LWFsaWduOmNlbnRlcjt9I215LXN2ZyAuZWRnZUxhYmVsIHJlY3R7b3BhY2l0eTowLjU7YmFja2dyb3VuZC1jb2xvcjojZThlOGU4O2ZpbGw6I2U4ZThlODt9I215LXN2ZyAubGFiZWxCa2d7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDIzMiwgMjMyLCAyMzIsIDAuNSk7fSNteS1zdmcgLmNsdXN0ZXIgcmVjdHtmaWxsOiNmZmZmZGU7c3Ryb2tlOiNhYWFhMzM7c3Ryb2tlLXdpZHRoOjFweDt9I215LXN2ZyAuY2x1c3RlciB0ZXh0e2ZpbGw6IzMzMzt9I215LXN2ZyAuY2x1c3RlciBzcGFuLCNteS1zdmcgcHtjb2xvcjojMzMzO30jbXktc3ZnIGRpdi5tZXJtYWlkVG9vbHRpcHtwb3NpdGlvbjphYnNvbHV0ZTt0ZXh0LWFsaWduOmNlbnRlcjttYXgtd2lkdGg6MjAwcHg7cGFkZGluZzoycHg7Zm9udC1mYW1pbHk6InRyZWJ1Y2hldCBtcyIsdmVyZGFuYSxhcmlhbCxzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMnB4O2JhY2tncm91bmQ6aHNsKDgwLCAxMDAlLCA5Ni4yNzQ1MDk4MDM5JSk7Ym9yZGVyOjFweCBzb2xpZCAjYWFhYTMzO2JvcmRlci1yYWRpdXM6MnB4O3BvaW50ZXItZXZlbnRzOm5vbmU7ei1pbmRleDoxMDA7fSNteS1zdmcgLmZsb3djaGFydFRpdGxlVGV4dHt0ZXh0LWFuY2hvcjptaWRkbGU7Zm9udC1zaXplOjE4cHg7ZmlsbDojMzMzO30jbXktc3ZnIDpyb290ey0tbWVybWFpZC1mb250LWZhbWlseToidHJlYnVjaGV0IG1zIix2ZXJkYW5hLGFyaWFsLHNhbnMtc2VyaWY7fSNteS1zdmcgLmJ1c05vZGUmZ3Q7KntmaWxsOiM3QTk3NkIhaW1wb3J0YW50O3N0cm9rZTojMUIzRDJGIWltcG9ydGFudDtzdHJva2Utd2lkdGg6MnB4IWltcG9ydGFudDt9I215LXN2ZyAuYnVzTm9kZSBzcGFue2ZpbGw6IzdBOTc2QiFpbXBvcnRhbnQ7c3Ryb2tlOiMxQjNEMkYhaW1wb3J0YW50O3N0cm9rZS13aWR0aDoycHghaW1wb3J0YW50O308L3N0eWxlPjxnPjxtYXJrZXIgb3JpZW50PSJhdXRvIiBtYXJrZXJIZWlnaHQ9IjEyIiBtYXJrZXJXaWR0aD0iMTIiIG1hcmtlclVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgcmVmWT0iNSIgcmVmWD0iNiIgdmlld0JveD0iMCAwIDEwIDEwIiBjbGFzcz0ibWFya2VyIGZsb3djaGFydCIgaWQ9Im15LXN2Z19mbG93Y2hhcnQtcG9pbnRFbmQiPjxwYXRoIHN0eWxlPSJzdHJva2Utd2lkdGg6IDE7IHN0cm9rZS1kYXNoYXJyYXk6IDEsIDA7IiBjbGFzcz0iYXJyb3dNYXJrZXJQYXRoIiBkPSJNIDAgMCBMIDEwIDUgTCAwIDEwIHoiLz48L21hcmtlcj48bWFya2VyIG9yaWVudD0iYXV0byIgbWFya2VySGVpZ2h0PSIxMiIgbWFya2VyV2lkdGg9IjEyIiBtYXJrZXJVbml0cz0idXNlclNwYWNlT25Vc2UiIHJlZlk9IjUiIHJlZlg9IjQuNSIgdmlld0JveD0iMCAwIDEwIDEwIiBjbGFzcz0ibWFya2VyIGZsb3djaGFydCIgaWQ9Im15LXN2Z19mbG93Y2hhcnQtcG9pbnRTdGFydCI+PHBhdGggc3R5bGU9InN0cm9rZS13aWR0aDogMTsgc3Ryb2tlLWRhc2hhcnJheTogMSwgMDsiIGNsYXNzPSJhcnJvd01hcmtlclBhdGgiIGQ9Ik0gMCA1IEwgMTAgMTAgTCAxMCAwIHoiLz48L21hcmtlcj48bWFya2VyIG9yaWVudD0iYXV0byIgbWFya2VySGVpZ2h0PSIxMSIgbWFya2VyV2lkdGg9IjExIiBtYXJrZXJVbml0cz0idXNlclNwYWNlT25Vc2UiIHJlZlk9IjUiIHJlZlg9IjExIiB2aWV3Qm94PSIwIDAgMTAgMTAiIGNsYXNzPSJtYXJrZXIgZmxvd2NoYXJ0IiBpZD0ibXktc3ZnX2Zsb3djaGFydC1jaXJjbGVFbmQiPjxjaXJjbGUgc3R5bGU9InN0cm9rZS13aWR0aDogMTsgc3Ryb2tlLWRhc2hhcnJheTogMSwgMDsiIGNsYXNzPSJhcnJvd01hcmtlclBhdGgiIHI9IjUiIGN5PSI1IiBjeD0iNSIvPjwvbWFya2VyPjxtYXJrZXIgb3JpZW50PSJhdXRvIiBtYXJrZXJIZWlnaHQ9IjExIiBtYXJrZXJXaWR0aD0iMTEiIG1hcmtlclVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgcmVmWT0iNSIgcmVmWD0iLTEiIHZpZXdCb3g9IjAgMCAxMCAxMCIgY2xhc3M9Im1hcmtlciBmbG93Y2hhcnQiIGlkPSJteS1zdmdfZmxvd2NoYXJ0LWNpcmNsZVN0YXJ0Ij48Y2lyY2xlIHN0eWxlPSJzdHJva2Utd2lkdGg6IDE7IHN0cm9rZS1kYXNoYXJyYXk6IDEsIDA7IiBjbGFzcz0iYXJyb3dNYXJrZXJQYXRoIiByPSI1IiBjeT0iNSIgY3g9IjUiLz48L21hcmtlcj48bWFya2VyIG9yaWVudD0iYXV0byIgbWFya2VySGVpZ2h0PSIxMSIgbWFya2VyV2lkdGg9IjExIiBtYXJrZXJVbml0cz0idXNlclNwYWNlT25Vc2UiIHJlZlk9IjUuMiIgcmVmWD0iMTIiIHZpZXdCb3g9IjAgMCAxMSAxMSIgY2xhc3M9Im1hcmtlciBjcm9zcyBmbG93Y2hhcnQiIGlkPSJteS1zdmdfZmxvd2NoYXJ0LWNyb3NzRW5kIj48cGF0aCBzdHlsZT0ic3Ryb2tlLXdpZHRoOiAyOyBzdHJva2UtZGFzaGFycmF5OiAxLCAwOyIgY2xhc3M9ImFycm93TWFya2VyUGF0aCIgZD0iTSAxLDEgbCA5LDkgTSAxMCwxIGwgLTksOSIvPjwvbWFya2VyPjxtYXJrZXIgb3JpZW50PSJhdXRvIiBtYXJrZXJIZWlnaHQ9IjExIiBtYXJrZXJXaWR0aD0iMTEiIG1hcmtlclVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgcmVmWT0iNS4yIiByZWZYPSItMSIgdmlld0JveD0iMCAwIDExIDExIiBjbGFzcz0ibWFya2VyIGNyb3NzIGZsb3djaGFydCIgaWQ9Im15LXN2Z19mbG93Y2hhcnQtY3Jvc3NTdGFydCI+PHBhdGggc3R5bGU9InN0cm9rZS13aWR0aDogMjsgc3Ryb2tlLWRhc2hhcnJheTogMSwgMDsiIGNsYXNzPSJhcnJvd01hcmtlclBhdGgiIGQ9Ik0gMSwxIGwgOSw5IE0gMTAsMSBsIC05LDkiLz48L21hcmtlcj48ZyBjbGFzcz0icm9vdCI+PGcgY2xhc3M9ImNsdXN0ZXJzIi8+PGcgY2xhc3M9ImVkZ2VQYXRocyI+PHBhdGggc3R5bGU9ImZpbGw6bm9uZTsiIGNsYXNzPSJlZGdlLXRoaWNrbmVzcy1ub3JtYWwgZWRnZS1wYXR0ZXJuLXNvbGlkIGZsb3djaGFydC1saW5rIExTLUEgTEUtQiIgaWQ9IkwtQS1CLTAiIGQ9Ik03Mi43OTcsMzcuMDg2TDc2Ljk2NCwzNy4wODZDODEuMTMsMzcuMDg2LDg5LjQ2NCwzNy4wODYsOTcuNzk3LDM3LjA4NkMxMDYuMTMsMzcuMDg2LDExNC40NjQsMzcuMDg2LDExOC42MywzNy4wODZMMTIyLjc5NywzNy4wODYiLz48cGF0aCBzdHlsZT0iZmlsbDpub25lOyIgY2xhc3M9ImVkZ2UtdGhpY2tuZXNzLW5vcm1hbCBlZGdlLXBhdHRlcm4tc29saWQgZmxvd2NoYXJ0LWxpbmsgTFMtQiBMRS1DIiBpZD0iTC1CLUMtMCIgZD0iTTE5NS42MjUsMzcuMDg2TDE5OS43OTIsMzcuMDg2QzIwMy45NTgsMzcuMDg2LDIxMi4yOTIsMzcuMDg2LDIyMC42MjUsMzcuMDg2QzIyOC45NTgsMzcuMDg2LDIzNy4yOTIsMzcuMDg2LDI0MS40NTgsMzcuMDg2TDI0NS42MjUsMzcuMDg2Ii8+PHBhdGggc3R5bGU9ImZpbGw6bm9uZTsiIGNsYXNzPSJlZGdlLXRoaWNrbmVzcy1ub3JtYWwgZWRnZS1wYXR0ZXJuLXNvbGlkIGZsb3djaGFydC1saW5rIExTLUMgTEUtRCIgaWQ9IkwtQy1ELTAiIGQ9Ik0zMTguNjQxLDM3LjA4NkwzMjIuODA3LDM3LjA4NkMzMjYuOTc0LDM3LjA4NiwzMzUuMzA3LDM3LjA4NiwzNDMuNjQxLDM3LjA4NkMzNTEuOTc0LDM3LjA4NiwzNjAuMzA3LDM3LjA4NiwzNjQuNDc0LDM3LjA4NkwzNjguNjQxLDM3LjA4NiIvPjxwYXRoIHN0eWxlPSJmaWxsOm5vbmU7IiBjbGFzcz0iZWRnZS10aGlja25lc3Mtbm9ybWFsIGVkZ2UtcGF0dGVybi1zb2xpZCBmbG93Y2hhcnQtbGluayBMUy1EIExFLUUiIGlkPSJMLUQtRS0wIiBkPSJNNDQyLjgxMywzNy4wODZMNDQ2Ljk3OSwzNy4wODZDNDUxLjE0NiwzNy4wODYsNDU5LjQ3OSwzNy4wODYsNDY3LjgxMywzNy4wODZDNDc2LjE0NiwzNy4wODYsNDg0LjQ3OSwzNy4wODYsNDg4LjY0NiwzNy4wODZMNDkyLjgxMywzNy4wODYiLz48L2c+PGcgY2xhc3M9ImVkZ2VMYWJlbHMiPjxnIGNsYXNzPSJlZGdlTGFiZWwiPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAsIDApIiBjbGFzcz0ibGFiZWwiPjxmb3JlaWduT2JqZWN0IGhlaWdodD0iMCIgd2lkdGg9IjAiPjxkaXYgc3R5bGU9ImRpc3BsYXk6IGlubGluZS1ibG9jazsgd2hpdGUtc3BhY2U6IG5vd3JhcDsiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj48c3BhbiBjbGFzcz0iZWRnZUxhYmVsIj48L3NwYW4+PC9kaXY+PC9mb3JlaWduT2JqZWN0PjwvZz48L2c+PGcgY2xhc3M9ImVkZ2VMYWJlbCI+PGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCwgMCkiIGNsYXNzPSJsYWJlbCI+PGZvcmVpZ25PYmplY3QgaGVpZ2h0PSIwIiB3aWR0aD0iMCI+PGRpdiBzdHlsZT0iZGlzcGxheTogaW5saW5lLWJsb2NrOyB3aGl0ZS1zcGFjZTogbm93cmFwOyIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPjxzcGFuIGNsYXNzPSJlZGdlTGFiZWwiPjwvc3Bhbj48L2Rpdj48L2ZvcmVpZ25PYmplY3Q+PC9nPjwvZz48ZyBjbGFzcz0iZWRnZUxhYmVsIj48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLCAwKSIgY2xhc3M9ImxhYmVsIj48Zm9yZWlnbk9iamVjdCBoZWlnaHQ9IjAiIHdpZHRoPSIwIj48ZGl2IHN0eWxlPSJkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IHdoaXRlLXNwYWNlOiBub3dyYXA7IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+PHNwYW4gY2xhc3M9ImVkZ2VMYWJlbCI+PC9zcGFuPjwvZGl2PjwvZm9yZWlnbk9iamVjdD48L2c+PC9nPjxnIGNsYXNzPSJlZGdlTGFiZWwiPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAsIDApIiBjbGFzcz0ibGFiZWwiPjxmb3JlaWduT2JqZWN0IGhlaWdodD0iMCIgd2lkdGg9IjAiPjxkaXYgc3R5bGU9ImRpc3BsYXk6IGlubGluZS1ibG9jazsgd2hpdGUtc3BhY2U6IG5vd3JhcDsiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj48c3BhbiBjbGFzcz0iZWRnZUxhYmVsIj48L3NwYW4+PC9kaXY+PC9mb3JlaWduT2JqZWN0PjwvZz48L2c+PC9nPjxnIGNsYXNzPSJub2RlcyI+PGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMzYuMzk4NDM3NSwgMzcuMDg1OTM3NSkiIGRhdGEtaWQ9IkEiIGRhdGEtbm9kZT0idHJ1ZSIgaWQ9ImZsb3djaGFydC1BLTAiIGNsYXNzPSJub2RlIGRlZmF1bHQgYnVzTm9kZSBmbG93Y2hhcnQtbGFiZWwiPjxjaXJjbGUgaGVpZ2h0PSIzNCIgd2lkdGg9IjcyLjc5Njg3NSIgcj0iMzYuMzk4NDM3NSIgcnk9IjAiIHJ4PSIwIiBzdHlsZT0iIi8+PGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTI4Ljg5ODQzNzUsIC05LjUpIiBzdHlsZT0iIiBjbGFzcz0ibGFiZWwiPjxyZWN0Lz48Zm9yZWlnbk9iamVjdCBoZWlnaHQ9IjE5IiB3aWR0aD0iNTcuNzk2ODc1Ij48ZGl2IHN0eWxlPSJkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IHdoaXRlLXNwYWNlOiBub3dyYXA7IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+PHNwYW4gY2xhc3M9Im5vZGVMYWJlbCI+Tm9kZSBBPC9zcGFuPjwvZGl2PjwvZm9yZWlnbk9iamVjdD48L2c+PC9nPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDE1OS4yMTA5Mzc1LCAzNy4wODU5Mzc1KSIgZGF0YS1pZD0iQiIgZGF0YS1ub2RlPSJ0cnVlIiBpZD0iZmxvd2NoYXJ0LUItMSIgY2xhc3M9Im5vZGUgZGVmYXVsdCBidXNOb2RlIGZsb3djaGFydC1sYWJlbCI+PGNpcmNsZSBoZWlnaHQ9IjM0IiB3aWR0aD0iNzIuODI4MTI1IiByPSIzNi40MTQwNjI1IiByeT0iMCIgcng9IjAiIHN0eWxlPSIiLz48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMjguOTE0MDYyNSwgLTkuNSkiIHN0eWxlPSIiIGNsYXNzPSJsYWJlbCI+PHJlY3QvPjxmb3JlaWduT2JqZWN0IGhlaWdodD0iMTkiIHdpZHRoPSI1Ny44MjgxMjUiPjxkaXYgc3R5bGU9ImRpc3BsYXk6IGlubGluZS1ibG9jazsgd2hpdGUtc3BhY2U6IG5vd3JhcDsiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj48c3BhbiBjbGFzcz0ibm9kZUxhYmVsIj5Ob2RlIEI8L3NwYW4+PC9kaXY+PC9mb3JlaWduT2JqZWN0PjwvZz48L2c+PGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMjgyLjEzMjgxMjUsIDM3LjA4NTkzNzUpIiBkYXRhLWlkPSJDIiBkYXRhLW5vZGU9InRydWUiIGlkPSJmbG93Y2hhcnQtQy0yIiBjbGFzcz0ibm9kZSBkZWZhdWx0IGJ1c05vZGUgZmxvd2NoYXJ0LWxhYmVsIj48Y2lyY2xlIGhlaWdodD0iMzQiIHdpZHRoPSI3My4wMTU2MjUiIHI9IjM2LjUwNzgxMjUiIHJ5PSIwIiByeD0iMCIgc3R5bGU9IiIvPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yOS4wMDc4MTI1LCAtOS41KSIgc3R5bGU9IiIgY2xhc3M9ImxhYmVsIj48cmVjdC8+PGZvcmVpZ25PYmplY3QgaGVpZ2h0PSIxOSIgd2lkdGg9IjU4LjAxNTYyNSI+PGRpdiBzdHlsZT0iZGlzcGxheTogaW5saW5lLWJsb2NrOyB3aGl0ZS1zcGFjZTogbm93cmFwOyIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPjxzcGFuIGNsYXNzPSJub2RlTGFiZWwiPk5vZGUgQzwvc3Bhbj48L2Rpdj48L2ZvcmVpZ25PYmplY3Q+PC9nPjwvZz48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSg0MDUuNzI2NTYyNSwgMzcuMDg1OTM3NSkiIGRhdGEtaWQ9IkQiIGRhdGEtbm9kZT0idHJ1ZSIgaWQ9ImZsb3djaGFydC1ELTMiIGNsYXNzPSJub2RlIGRlZmF1bHQgYnVzTm9kZSBmbG93Y2hhcnQtbGFiZWwiPjxjaXJjbGUgaGVpZ2h0PSIzNCIgd2lkdGg9Ijc0LjE3MTg3NSIgcj0iMzcuMDg1OTM3NSIgcnk9IjAiIHJ4PSIwIiBzdHlsZT0iIi8+PGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTI5LjU4NTkzNzUsIC05LjUpIiBzdHlsZT0iIiBjbGFzcz0ibGFiZWwiPjxyZWN0Lz48Zm9yZWlnbk9iamVjdCBoZWlnaHQ9IjE5IiB3aWR0aD0iNTkuMTcxODc1Ij48ZGl2IHN0eWxlPSJkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IHdoaXRlLXNwYWNlOiBub3dyYXA7IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+PHNwYW4gY2xhc3M9Im5vZGVMYWJlbCI+Tm9kZSBEPC9zcGFuPjwvZGl2PjwvZm9yZWlnbk9iamVjdD48L2c+PC9nPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDUyOC43ODkwNjI1LCAzNy4wODU5Mzc1KSIgZGF0YS1pZD0iRSIgZGF0YS1ub2RlPSJ0cnVlIiBpZD0iZmxvd2NoYXJ0LUUtNCIgY2xhc3M9Im5vZGUgZGVmYXVsdCBidXNOb2RlIGZsb3djaGFydC1sYWJlbCI+PGNpcmNsZSBoZWlnaHQ9IjM0IiB3aWR0aD0iNzEuOTUzMTI1IiByPSIzNS45NzY1NjI1IiByeT0iMCIgcng9IjAiIHN0eWxlPSIiLz48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMjguNDc2NTYyNSwgLTkuNSkiIHN0eWxlPSIiIGNsYXNzPSJsYWJlbCI+PHJlY3QvPjxmb3JlaWduT2JqZWN0IGhlaWdodD0iMTkiIHdpZHRoPSI1Ni45NTMxMjUiPjxkaXYgc3R5bGU9ImRpc3BsYXk6IGlubGluZS1ibG9jazsgd2hpdGUtc3BhY2U6IG5vd3JhcDsiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj48c3BhbiBjbGFzcz0ibm9kZUxhYmVsIj5Ob2RlIEU8L3NwYW4+PC9kaXY+PC9mb3JlaWduT2JqZWN0PjwvZz48L2c+PC9nPjwvZz48L2c+PC9zdmc+"&gt;&lt;/p&gt;
&lt;h3 id="ring-topology"&gt;Ring Topology&lt;/h3&gt;
&lt;p&gt;Similar to a bus, but the last node connects back to the first, forming a circle.&lt;/p&gt;
&lt;p&gt;&lt;img src="data:image/svg+xml;base64,PHN2ZyBhcmlhLXJvbGVkZXNjcmlwdGlvbj0iZmxvd2NoYXJ0LXYyIiByb2xlPSJncmFwaGljcy1kb2N1bWVudCBkb2N1bWVudCIgdmlld0JveD0iLTggLTggNTgwLjc2NTYyNSAxMjUuNTI3MzQzNzUiIHN0eWxlPSJtYXgtd2lkdGg6IDU4MC43NjZweDsgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7IiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB3aWR0aD0iMTAwJSIgaWQ9Im15LXN2ZyI+PHN0eWxlPiNteS1zdmd7Zm9udC1mYW1pbHk6InRyZWJ1Y2hldCBtcyIsdmVyZGFuYSxhcmlhbCxzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNnB4O2ZpbGw6IzMzMzt9I215LXN2ZyAuZXJyb3ItaWNvbntmaWxsOiM1NTIyMjI7fSNteS1zdmcgLmVycm9yLXRleHR7ZmlsbDojNTUyMjIyO3N0cm9rZTojNTUyMjIyO30jbXktc3ZnIC5lZGdlLXRoaWNrbmVzcy1ub3JtYWx7c3Ryb2tlLXdpZHRoOjJweDt9I215LXN2ZyAuZWRnZS10aGlja25lc3MtdGhpY2t7c3Ryb2tlLXdpZHRoOjMuNXB4O30jbXktc3ZnIC5lZGdlLXBhdHRlcm4tc29saWR7c3Ryb2tlLWRhc2hhcnJheTowO30jbXktc3ZnIC5lZGdlLXBhdHRlcm4tZGFzaGVke3N0cm9rZS1kYXNoYXJyYXk6Mzt9I215LXN2ZyAuZWRnZS1wYXR0ZXJuLWRvdHRlZHtzdHJva2UtZGFzaGFycmF5OjI7fSNteS1zdmcgLm1hcmtlcntmaWxsOiMzMzMzMzM7c3Ryb2tlOiMzMzMzMzM7fSNteS1zdmcgLm1hcmtlci5jcm9zc3tzdHJva2U6IzMzMzMzMzt9I215LXN2ZyBzdmd7Zm9udC1mYW1pbHk6InRyZWJ1Y2hldCBtcyIsdmVyZGFuYSxhcmlhbCxzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNnB4O30jbXktc3ZnIC5sYWJlbHtmb250LWZhbWlseToidHJlYnVjaGV0IG1zIix2ZXJkYW5hLGFyaWFsLHNhbnMtc2VyaWY7Y29sb3I6IzMzMzt9I215LXN2ZyAuY2x1c3Rlci1sYWJlbCB0ZXh0e2ZpbGw6IzMzMzt9I215LXN2ZyAuY2x1c3Rlci1sYWJlbCBzcGFuLCNteS1zdmcgcHtjb2xvcjojMzMzO30jbXktc3ZnIC5sYWJlbCB0ZXh0LCNteS1zdmcgc3BhbiwjbXktc3ZnIHB7ZmlsbDojMzMzO2NvbG9yOiMzMzM7fSNteS1zdmcgLm5vZGUgcmVjdCwjbXktc3ZnIC5ub2RlIGNpcmNsZSwjbXktc3ZnIC5ub2RlIGVsbGlwc2UsI215LXN2ZyAubm9kZSBwb2x5Z29uLCNteS1zdmcgLm5vZGUgcGF0aHtmaWxsOiNFQ0VDRkY7c3Ryb2tlOiM5MzcwREI7c3Ryb2tlLXdpZHRoOjFweDt9I215LXN2ZyAuZmxvd2NoYXJ0LWxhYmVsIHRleHR7dGV4dC1hbmNob3I6bWlkZGxlO30jbXktc3ZnIC5ub2RlIC5rYXRleCBwYXRoe2ZpbGw6IzAwMDtzdHJva2U6IzAwMDtzdHJva2Utd2lkdGg6MXB4O30jbXktc3ZnIC5ub2RlIC5sYWJlbHt0ZXh0LWFsaWduOmNlbnRlcjt9I215LXN2ZyAubm9kZS5jbGlja2FibGV7Y3Vyc29yOnBvaW50ZXI7fSNteS1zdmcgLmFycm93aGVhZFBhdGh7ZmlsbDojMzMzMzMzO30jbXktc3ZnIC5lZGdlUGF0aCAucGF0aHtzdHJva2U6IzMzMzMzMztzdHJva2Utd2lkdGg6Mi4wcHg7fSNteS1zdmcgLmZsb3djaGFydC1saW5re3N0cm9rZTojMzMzMzMzO2ZpbGw6bm9uZTt9I215LXN2ZyAuZWRnZUxhYmVse2JhY2tncm91bmQtY29sb3I6I2U4ZThlODt0ZXh0LWFsaWduOmNlbnRlcjt9I215LXN2ZyAuZWRnZUxhYmVsIHJlY3R7b3BhY2l0eTowLjU7YmFja2dyb3VuZC1jb2xvcjojZThlOGU4O2ZpbGw6I2U4ZThlODt9I215LXN2ZyAubGFiZWxCa2d7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDIzMiwgMjMyLCAyMzIsIDAuNSk7fSNteS1zdmcgLmNsdXN0ZXIgcmVjdHtmaWxsOiNmZmZmZGU7c3Ryb2tlOiNhYWFhMzM7c3Ryb2tlLXdpZHRoOjFweDt9I215LXN2ZyAuY2x1c3RlciB0ZXh0e2ZpbGw6IzMzMzt9I215LXN2ZyAuY2x1c3RlciBzcGFuLCNteS1zdmcgcHtjb2xvcjojMzMzO30jbXktc3ZnIGRpdi5tZXJtYWlkVG9vbHRpcHtwb3NpdGlvbjphYnNvbHV0ZTt0ZXh0LWFsaWduOmNlbnRlcjttYXgtd2lkdGg6MjAwcHg7cGFkZGluZzoycHg7Zm9udC1mYW1pbHk6InRyZWJ1Y2hldCBtcyIsdmVyZGFuYSxhcmlhbCxzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMnB4O2JhY2tncm91bmQ6aHNsKDgwLCAxMDAlLCA5Ni4yNzQ1MDk4MDM5JSk7Ym9yZGVyOjFweCBzb2xpZCAjYWFhYTMzO2JvcmRlci1yYWRpdXM6MnB4O3BvaW50ZXItZXZlbnRzOm5vbmU7ei1pbmRleDoxMDA7fSNteS1zdmcgLmZsb3djaGFydFRpdGxlVGV4dHt0ZXh0LWFuY2hvcjptaWRkbGU7Zm9udC1zaXplOjE4cHg7ZmlsbDojMzMzO30jbXktc3ZnIDpyb290ey0tbWVybWFpZC1mb250LWZhbWlseToidHJlYnVjaGV0IG1zIix2ZXJkYW5hLGFyaWFsLHNhbnMtc2VyaWY7fSNteS1zdmcgLnJpbmdOb2RlJmd0Oyp7ZmlsbDojYjliMjhiIWltcG9ydGFudDtzdHJva2U6IzFCM0QyRiFpbXBvcnRhbnQ7c3Ryb2tlLXdpZHRoOjJweCFpbXBvcnRhbnQ7fSNteS1zdmcgLnJpbmdOb2RlIHNwYW57ZmlsbDojYjliMjhiIWltcG9ydGFudDtzdHJva2U6IzFCM0QyRiFpbXBvcnRhbnQ7c3Ryb2tlLXdpZHRoOjJweCFpbXBvcnRhbnQ7fTwvc3R5bGU+PGc+PG1hcmtlciBvcmllbnQ9ImF1dG8iIG1hcmtlckhlaWdodD0iMTIiIG1hcmtlcldpZHRoPSIxMiIgbWFya2VyVW5pdHM9InVzZXJTcGFjZU9uVXNlIiByZWZZPSI1IiByZWZYPSI2IiB2aWV3Qm94PSIwIDAgMTAgMTAiIGNsYXNzPSJtYXJrZXIgZmxvd2NoYXJ0IiBpZD0ibXktc3ZnX2Zsb3djaGFydC1wb2ludEVuZCI+PHBhdGggc3R5bGU9InN0cm9rZS13aWR0aDogMTsgc3Ryb2tlLWRhc2hhcnJheTogMSwgMDsiIGNsYXNzPSJhcnJvd01hcmtlclBhdGgiIGQ9Ik0gMCAwIEwgMTAgNSBMIDAgMTAgeiIvPjwvbWFya2VyPjxtYXJrZXIgb3JpZW50PSJhdXRvIiBtYXJrZXJIZWlnaHQ9IjEyIiBtYXJrZXJXaWR0aD0iMTIiIG1hcmtlclVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgcmVmWT0iNSIgcmVmWD0iNC41IiB2aWV3Qm94PSIwIDAgMTAgMTAiIGNsYXNzPSJtYXJrZXIgZmxvd2NoYXJ0IiBpZD0ibXktc3ZnX2Zsb3djaGFydC1wb2ludFN0YXJ0Ij48cGF0aCBzdHlsZT0ic3Ryb2tlLXdpZHRoOiAxOyBzdHJva2UtZGFzaGFycmF5OiAxLCAwOyIgY2xhc3M9ImFycm93TWFya2VyUGF0aCIgZD0iTSAwIDUgTCAxMCAxMCBMIDEwIDAgeiIvPjwvbWFya2VyPjxtYXJrZXIgb3JpZW50PSJhdXRvIiBtYXJrZXJIZWlnaHQ9IjExIiBtYXJrZXJXaWR0aD0iMTEiIG1hcmtlclVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgcmVmWT0iNSIgcmVmWD0iMTEiIHZpZXdCb3g9IjAgMCAxMCAxMCIgY2xhc3M9Im1hcmtlciBmbG93Y2hhcnQiIGlkPSJteS1zdmdfZmxvd2NoYXJ0LWNpcmNsZUVuZCI+PGNpcmNsZSBzdHlsZT0ic3Ryb2tlLXdpZHRoOiAxOyBzdHJva2UtZGFzaGFycmF5OiAxLCAwOyIgY2xhc3M9ImFycm93TWFya2VyUGF0aCIgcj0iNSIgY3k9IjUiIGN4PSI1Ii8+PC9tYXJrZXI+PG1hcmtlciBvcmllbnQ9ImF1dG8iIG1hcmtlckhlaWdodD0iMTEiIG1hcmtlcldpZHRoPSIxMSIgbWFya2VyVW5pdHM9InVzZXJTcGFjZU9uVXNlIiByZWZZPSI1IiByZWZYPSItMSIgdmlld0JveD0iMCAwIDEwIDEwIiBjbGFzcz0ibWFya2VyIGZsb3djaGFydCIgaWQ9Im15LXN2Z19mbG93Y2hhcnQtY2lyY2xlU3RhcnQiPjxjaXJjbGUgc3R5bGU9InN0cm9rZS13aWR0aDogMTsgc3Ryb2tlLWRhc2hhcnJheTogMSwgMDsiIGNsYXNzPSJhcnJvd01hcmtlclBhdGgiIHI9IjUiIGN5PSI1IiBjeD0iNSIvPjwvbWFya2VyPjxtYXJrZXIgb3JpZW50PSJhdXRvIiBtYXJrZXJIZWlnaHQ9IjExIiBtYXJrZXJXaWR0aD0iMTEiIG1hcmtlclVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgcmVmWT0iNS4yIiByZWZYPSIxMiIgdmlld0JveD0iMCAwIDExIDExIiBjbGFzcz0ibWFya2VyIGNyb3NzIGZsb3djaGFydCIgaWQ9Im15LXN2Z19mbG93Y2hhcnQtY3Jvc3NFbmQiPjxwYXRoIHN0eWxlPSJzdHJva2Utd2lkdGg6IDI7IHN0cm9rZS1kYXNoYXJyYXk6IDEsIDA7IiBjbGFzcz0iYXJyb3dNYXJrZXJQYXRoIiBkPSJNIDEsMSBsIDksOSBNIDEwLDEgbCAtOSw5Ii8+PC9tYXJrZXI+PG1hcmtlciBvcmllbnQ9ImF1dG8iIG1hcmtlckhlaWdodD0iMTEiIG1hcmtlcldpZHRoPSIxMSIgbWFya2VyVW5pdHM9InVzZXJTcGFjZU9uVXNlIiByZWZZPSI1LjIiIHJlZlg9Ii0xIiB2aWV3Qm94PSIwIDAgMTEgMTEiIGNsYXNzPSJtYXJrZXIgY3Jvc3MgZmxvd2NoYXJ0IiBpZD0ibXktc3ZnX2Zsb3djaGFydC1jcm9zc1N0YXJ0Ij48cGF0aCBzdHlsZT0ic3Ryb2tlLXdpZHRoOiAyOyBzdHJva2UtZGFzaGFycmF5OiAxLCAwOyIgY2xhc3M9ImFycm93TWFya2VyUGF0aCIgZD0iTSAxLDEgbCA5LDkgTSAxMCwxIGwgLTksOSIvPjwvbWFya2VyPjxnIGNsYXNzPSJyb290Ij48ZyBjbGFzcz0iY2x1c3RlcnMiLz48ZyBjbGFzcz0iZWRnZVBhdGhzIj48cGF0aCBzdHlsZT0iZmlsbDpub25lOyIgY2xhc3M9ImVkZ2UtdGhpY2tuZXNzLW5vcm1hbCBlZGdlLXBhdHRlcm4tc29saWQgZmxvd2NoYXJ0LWxpbmsgTFMtQSBMRS1CIiBpZD0iTC1BLUItMCIgZD0iTTY3Ljc4OCw1NC43MDJMNzIuNzg5LDUxLjc2NkM3Ny43OTEsNDguODMsODcuNzk0LDQyLjk1OCw5Ni45NjIsNDAuMDIyQzEwNi4xMywzNy4wODYsMTE0LjQ2NCwzNy4wODYsMTE4LjYzLDM3LjA4NkwxMjIuNzk3LDM3LjA4NiIvPjxwYXRoIHN0eWxlPSJmaWxsOm5vbmU7IiBjbGFzcz0iZWRnZS10aGlja25lc3Mtbm9ybWFsIGVkZ2UtcGF0dGVybi1zb2xpZCBmbG93Y2hhcnQtbGluayBMUy1CIExFLUMiIGlkPSJMLUItQy0wIiBkPSJNMTk1LjYyNSwzNy4wODZMMTk5Ljc5MiwzNy4wODZDMjAzLjk1OCwzNy4wODYsMjEyLjI5MiwzNy4wODYsMjIwLjYyNSwzNy4wODZDMjI4Ljk1OCwzNy4wODYsMjM3LjI5MiwzNy4wODYsMjQxLjQ1OCwzNy4wODZMMjQ1LjYyNSwzNy4wODYiLz48cGF0aCBzdHlsZT0iZmlsbDpub25lOyIgY2xhc3M9ImVkZ2UtdGhpY2tuZXNzLW5vcm1hbCBlZGdlLXBhdHRlcm4tc29saWQgZmxvd2NoYXJ0LWxpbmsgTFMtQyBMRS1EIiBpZD0iTC1DLUQtMCIgZD0iTTMxOC42NDEsMzcuMDg2TDMyMi44MDcsMzcuMDg2QzMyNi45NzQsMzcuMDg2LDMzNS4zMDcsMzcuMDg2LDM0My42NDEsMzcuMDg2QzM1MS45NzQsMzcuMDg2LDM2MC4zMDcsMzcuMDg2LDM2NC40NzQsMzcuMDg2TDM2OC42NDEsMzcuMDg2Ii8+PHBhdGggc3R5bGU9ImZpbGw6bm9uZTsiIGNsYXNzPSJlZGdlLXRoaWNrbmVzcy1ub3JtYWwgZWRnZS1wYXR0ZXJuLXNvbGlkIGZsb3djaGFydC1saW5rIExTLUQgTEUtRSIgaWQ9IkwtRC1FLTAiIGQ9Ik00NDIuODEzLDM3LjA4Nkw0NDYuOTc5LDM3LjA4NkM0NTEuMTQ2LDM3LjA4Niw0NTkuNDc5LDM3LjA4Niw0NjguNjQ3LDQwLjA0MkM0NzcuODE0LDQyLjk5OCw0ODcuODE2LDQ4LjkxLDQ5Mi44MTcsNTEuODY2TDQ5Ny44MTgsNTQuODIyIi8+PHBhdGggc3R5bGU9ImZpbGw6bm9uZTsiIGNsYXNzPSJlZGdlLXRoaWNrbmVzcy1ub3JtYWwgZWRnZS1wYXR0ZXJuLXNvbGlkIGZsb3djaGFydC1saW5rIExTLUUgTEUtQSIgaWQ9IkwtRS1BLTAiIGQ9Ik00OTcuODE4LDkxLjQzNkw0OTIuODE3LDk0LjM5MkM0ODcuODE2LDk3LjM0OCw0NzcuODE0LDEwMy4yNiw0NjIuNDY2LDEwNi4yMTZDNDQ3LjExNywxMDkuMTcyLDQyNi40MjIsMTA5LjE3Miw0MDUuNzI3LDEwOS4xNzJDMzg1LjAzMSwxMDkuMTcyLDM2NC4zMzYsMTA5LjE3MiwzNDMuNzM3LDEwOS4xNzJDMzIzLjEzOCwxMDkuMTcyLDMwMi42MzUsMTA5LjE3MiwyODIuMTMzLDEwOS4xNzJDMjYxLjYzLDEwOS4xNzIsMjQxLjEyOCwxMDkuMTcyLDIyMC42NDEsMTA5LjE3MkMyMDAuMTU0LDEwOS4xNzIsMTc5LjY4MiwxMDkuMTcyLDE1OS4yMTEsMTA5LjE3MkMxMzguNzQsMTA5LjE3MiwxMTguMjY4LDEwOS4xNzIsMTAzLjAzMSwxMDYuMjM2Qzg3Ljc5NCwxMDMuMyw3Ny43OTEsOTcuNDI4LDcyLjc4OSw5NC40OTJMNjcuNzg4LDkxLjU1NiIvPjwvZz48ZyBjbGFzcz0iZWRnZUxhYmVscyI+PGcgY2xhc3M9ImVkZ2VMYWJlbCI+PGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCwgMCkiIGNsYXNzPSJsYWJlbCI+PGZvcmVpZ25PYmplY3QgaGVpZ2h0PSIwIiB3aWR0aD0iMCI+PGRpdiBzdHlsZT0iZGlzcGxheTogaW5saW5lLWJsb2NrOyB3aGl0ZS1zcGFjZTogbm93cmFwOyIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPjxzcGFuIGNsYXNzPSJlZGdlTGFiZWwiPjwvc3Bhbj48L2Rpdj48L2ZvcmVpZ25PYmplY3Q+PC9nPjwvZz48ZyBjbGFzcz0iZWRnZUxhYmVsIj48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLCAwKSIgY2xhc3M9ImxhYmVsIj48Zm9yZWlnbk9iamVjdCBoZWlnaHQ9IjAiIHdpZHRoPSIwIj48ZGl2IHN0eWxlPSJkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IHdoaXRlLXNwYWNlOiBub3dyYXA7IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+PHNwYW4gY2xhc3M9ImVkZ2VMYWJlbCI+PC9zcGFuPjwvZGl2PjwvZm9yZWlnbk9iamVjdD48L2c+PC9nPjxnIGNsYXNzPSJlZGdlTGFiZWwiPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAsIDApIiBjbGFzcz0ibGFiZWwiPjxmb3JlaWduT2JqZWN0IGhlaWdodD0iMCIgd2lkdGg9IjAiPjxkaXYgc3R5bGU9ImRpc3BsYXk6IGlubGluZS1ibG9jazsgd2hpdGUtc3BhY2U6IG5vd3JhcDsiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj48c3BhbiBjbGFzcz0iZWRnZUxhYmVsIj48L3NwYW4+PC9kaXY+PC9mb3JlaWduT2JqZWN0PjwvZz48L2c+PGcgY2xhc3M9ImVkZ2VMYWJlbCI+PGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCwgMCkiIGNsYXNzPSJsYWJlbCI+PGZvcmVpZ25PYmplY3QgaGVpZ2h0PSIwIiB3aWR0aD0iMCI+PGRpdiBzdHlsZT0iZGlzcGxheTogaW5saW5lLWJsb2NrOyB3aGl0ZS1zcGFjZTogbm93cmFwOyIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPjxzcGFuIGNsYXNzPSJlZGdlTGFiZWwiPjwvc3Bhbj48L2Rpdj48L2ZvcmVpZ25PYmplY3Q+PC9nPjwvZz48ZyBjbGFzcz0iZWRnZUxhYmVsIj48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLCAwKSIgY2xhc3M9ImxhYmVsIj48Zm9yZWlnbk9iamVjdCBoZWlnaHQ9IjAiIHdpZHRoPSIwIj48ZGl2IHN0eWxlPSJkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IHdoaXRlLXNwYWNlOiBub3dyYXA7IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+PHNwYW4gY2xhc3M9ImVkZ2VMYWJlbCI+PC9zcGFuPjwvZGl2PjwvZm9yZWlnbk9iamVjdD48L2c+PC9nPjwvZz48ZyBjbGFzcz0ibm9kZXMiPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDM2LjM5ODQzNzUsIDczLjEyODkwNjI1KSIgZGF0YS1pZD0iQSIgZGF0YS1ub2RlPSJ0cnVlIiBpZD0iZmxvd2NoYXJ0LUEtMCIgY2xhc3M9Im5vZGUgZGVmYXVsdCByaW5nTm9kZSBmbG93Y2hhcnQtbGFiZWwiPjxjaXJjbGUgaGVpZ2h0PSIzNCIgd2lkdGg9IjcyLjc5Njg3NSIgcj0iMzYuMzk4NDM3NSIgcnk9IjAiIHJ4PSIwIiBzdHlsZT0iIi8+PGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTI4Ljg5ODQzNzUsIC05LjUpIiBzdHlsZT0iIiBjbGFzcz0ibGFiZWwiPjxyZWN0Lz48Zm9yZWlnbk9iamVjdCBoZWlnaHQ9IjE5IiB3aWR0aD0iNTcuNzk2ODc1Ij48ZGl2IHN0eWxlPSJkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IHdoaXRlLXNwYWNlOiBub3dyYXA7IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+PHNwYW4gY2xhc3M9Im5vZGVMYWJlbCI+Tm9kZSBBPC9zcGFuPjwvZGl2PjwvZm9yZWlnbk9iamVjdD48L2c+PC9nPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDE1OS4yMTA5Mzc1LCAzNy4wODU5Mzc1KSIgZGF0YS1pZD0iQiIgZGF0YS1ub2RlPSJ0cnVlIiBpZD0iZmxvd2NoYXJ0LUItMSIgY2xhc3M9Im5vZGUgZGVmYXVsdCByaW5nTm9kZSBmbG93Y2hhcnQtbGFiZWwiPjxjaXJjbGUgaGVpZ2h0PSIzNCIgd2lkdGg9IjcyLjgyODEyNSIgcj0iMzYuNDE0MDYyNSIgcnk9IjAiIHJ4PSIwIiBzdHlsZT0iIi8+PGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTI4LjkxNDA2MjUsIC05LjUpIiBzdHlsZT0iIiBjbGFzcz0ibGFiZWwiPjxyZWN0Lz48Zm9yZWlnbk9iamVjdCBoZWlnaHQ9IjE5IiB3aWR0aD0iNTcuODI4MTI1Ij48ZGl2IHN0eWxlPSJkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IHdoaXRlLXNwYWNlOiBub3dyYXA7IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+PHNwYW4gY2xhc3M9Im5vZGVMYWJlbCI+Tm9kZSBCPC9zcGFuPjwvZGl2PjwvZm9yZWlnbk9iamVjdD48L2c+PC9nPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDI4Mi4xMzI4MTI1LCAzNy4wODU5Mzc1KSIgZGF0YS1pZD0iQyIgZGF0YS1ub2RlPSJ0cnVlIiBpZD0iZmxvd2NoYXJ0LUMtMyIgY2xhc3M9Im5vZGUgZGVmYXVsdCByaW5nTm9kZSBmbG93Y2hhcnQtbGFiZWwiPjxjaXJjbGUgaGVpZ2h0PSIzNCIgd2lkdGg9IjczLjAxNTYyNSIgcj0iMzYuNTA3ODEyNSIgcnk9IjAiIHJ4PSIwIiBzdHlsZT0iIi8+PGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTI5LjAwNzgxMjUsIC05LjUpIiBzdHlsZT0iIiBjbGFzcz0ibGFiZWwiPjxyZWN0Lz48Zm9yZWlnbk9iamVjdCBoZWlnaHQ9IjE5IiB3aWR0aD0iNTguMDE1NjI1Ij48ZGl2IHN0eWxlPSJkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IHdoaXRlLXNwYWNlOiBub3dyYXA7IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+PHNwYW4gY2xhc3M9Im5vZGVMYWJlbCI+Tm9kZSBDPC9zcGFuPjwvZGl2PjwvZm9yZWlnbk9iamVjdD48L2c+PC9nPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDQwNS43MjY1NjI1LCAzNy4wODU5Mzc1KSIgZGF0YS1pZD0iRCIgZGF0YS1ub2RlPSJ0cnVlIiBpZD0iZmxvd2NoYXJ0LUQtNSIgY2xhc3M9Im5vZGUgZGVmYXVsdCByaW5nTm9kZSBmbG93Y2hhcnQtbGFiZWwiPjxjaXJjbGUgaGVpZ2h0PSIzNCIgd2lkdGg9Ijc0LjE3MTg3NSIgcj0iMzcuMDg1OTM3NSIgcnk9IjAiIHJ4PSIwIiBzdHlsZT0iIi8+PGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTI5LjU4NTkzNzUsIC05LjUpIiBzdHlsZT0iIiBjbGFzcz0ibGFiZWwiPjxyZWN0Lz48Zm9yZWlnbk9iamVjdCBoZWlnaHQ9IjE5IiB3aWR0aD0iNTkuMTcxODc1Ij48ZGl2IHN0eWxlPSJkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IHdoaXRlLXNwYWNlOiBub3dyYXA7IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+PHNwYW4gY2xhc3M9Im5vZGVMYWJlbCI+Tm9kZSBEPC9zcGFuPjwvZGl2PjwvZm9yZWlnbk9iamVjdD48L2c+PC9nPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDUyOC43ODkwNjI1LCA3My4xMjg5MDYyNSkiIGRhdGEtaWQ9IkUiIGRhdGEtbm9kZT0idHJ1ZSIgaWQ9ImZsb3djaGFydC1FLTciIGNsYXNzPSJub2RlIGRlZmF1bHQgcmluZ05vZGUgZmxvd2NoYXJ0LWxhYmVsIj48Y2lyY2xlIGhlaWdodD0iMzQiIHdpZHRoPSI3MS45NTMxMjUiIHI9IjM1Ljk3NjU2MjUiIHJ5PSIwIiByeD0iMCIgc3R5bGU9IiIvPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yOC40NzY1NjI1LCAtOS41KSIgc3R5bGU9IiIgY2xhc3M9ImxhYmVsIj48cmVjdC8+PGZvcmVpZ25PYmplY3QgaGVpZ2h0PSIxOSIgd2lkdGg9IjU2Ljk1MzEyNSI+PGRpdiBzdHlsZT0iZGlzcGxheTogaW5saW5lLWJsb2NrOyB3aGl0ZS1zcGFjZTogbm93cmFwOyIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPjxzcGFuIGNsYXNzPSJub2RlTGFiZWwiPk5vZGUgRTwvc3Bhbj48L2Rpdj48L2ZvcmVpZ25PYmplY3Q+PC9nPjwvZz48L2c+PC9nPjwvZz48L3N2Zz4="&gt;&lt;/p&gt;
&lt;h3 id="tree-topology"&gt;Tree Topology&lt;/h3&gt;
&lt;p&gt;Follows a hierarchical tree data structure, with a root node and branches.&lt;/p&gt;
&lt;p&gt;&lt;img src="data:image/svg+xml;base64,PHN2ZyBhcmlhLXJvbGVkZXNjcmlwdGlvbj0iZmxvd2NoYXJ0LXYyIiByb2xlPSJncmFwaGljcy1kb2N1bWVudCBkb2N1bWVudCIgdmlld0JveD0iLTggLTggMzM0Ljg2NzE4NzUgMzE0LjQzNzUiIHN0eWxlPSJtYXgtd2lkdGg6IDMzNC44NjdweDsgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7IiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB3aWR0aD0iMTAwJSIgaWQ9Im15LXN2ZyI+PHN0eWxlPiNteS1zdmd7Zm9udC1mYW1pbHk6InRyZWJ1Y2hldCBtcyIsdmVyZGFuYSxhcmlhbCxzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNnB4O2ZpbGw6IzMzMzt9I215LXN2ZyAuZXJyb3ItaWNvbntmaWxsOiM1NTIyMjI7fSNteS1zdmcgLmVycm9yLXRleHR7ZmlsbDojNTUyMjIyO3N0cm9rZTojNTUyMjIyO30jbXktc3ZnIC5lZGdlLXRoaWNrbmVzcy1ub3JtYWx7c3Ryb2tlLXdpZHRoOjJweDt9I215LXN2ZyAuZWRnZS10aGlja25lc3MtdGhpY2t7c3Ryb2tlLXdpZHRoOjMuNXB4O30jbXktc3ZnIC5lZGdlLXBhdHRlcm4tc29saWR7c3Ryb2tlLWRhc2hhcnJheTowO30jbXktc3ZnIC5lZGdlLXBhdHRlcm4tZGFzaGVke3N0cm9rZS1kYXNoYXJyYXk6Mzt9I215LXN2ZyAuZWRnZS1wYXR0ZXJuLWRvdHRlZHtzdHJva2UtZGFzaGFycmF5OjI7fSNteS1zdmcgLm1hcmtlcntmaWxsOiMzMzMzMzM7c3Ryb2tlOiMzMzMzMzM7fSNteS1zdmcgLm1hcmtlci5jcm9zc3tzdHJva2U6IzMzMzMzMzt9I215LXN2ZyBzdmd7Zm9udC1mYW1pbHk6InRyZWJ1Y2hldCBtcyIsdmVyZGFuYSxhcmlhbCxzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNnB4O30jbXktc3ZnIC5sYWJlbHtmb250LWZhbWlseToidHJlYnVjaGV0IG1zIix2ZXJkYW5hLGFyaWFsLHNhbnMtc2VyaWY7Y29sb3I6IzMzMzt9I215LXN2ZyAuY2x1c3Rlci1sYWJlbCB0ZXh0e2ZpbGw6IzMzMzt9I215LXN2ZyAuY2x1c3Rlci1sYWJlbCBzcGFuLCNteS1zdmcgcHtjb2xvcjojMzMzO30jbXktc3ZnIC5sYWJlbCB0ZXh0LCNteS1zdmcgc3BhbiwjbXktc3ZnIHB7ZmlsbDojMzMzO2NvbG9yOiMzMzM7fSNteS1zdmcgLm5vZGUgcmVjdCwjbXktc3ZnIC5ub2RlIGNpcmNsZSwjbXktc3ZnIC5ub2RlIGVsbGlwc2UsI215LXN2ZyAubm9kZSBwb2x5Z29uLCNteS1zdmcgLm5vZGUgcGF0aHtmaWxsOiNFQ0VDRkY7c3Ryb2tlOiM5MzcwREI7c3Ryb2tlLXdpZHRoOjFweDt9I215LXN2ZyAuZmxvd2NoYXJ0LWxhYmVsIHRleHR7dGV4dC1hbmNob3I6bWlkZGxlO30jbXktc3ZnIC5ub2RlIC5rYXRleCBwYXRoe2ZpbGw6IzAwMDtzdHJva2U6IzAwMDtzdHJva2Utd2lkdGg6MXB4O30jbXktc3ZnIC5ub2RlIC5sYWJlbHt0ZXh0LWFsaWduOmNlbnRlcjt9I215LXN2ZyAubm9kZS5jbGlja2FibGV7Y3Vyc29yOnBvaW50ZXI7fSNteS1zdmcgLmFycm93aGVhZFBhdGh7ZmlsbDojMzMzMzMzO30jbXktc3ZnIC5lZGdlUGF0aCAucGF0aHtzdHJva2U6IzMzMzMzMztzdHJva2Utd2lkdGg6Mi4wcHg7fSNteS1zdmcgLmZsb3djaGFydC1saW5re3N0cm9rZTojMzMzMzMzO2ZpbGw6bm9uZTt9I215LXN2ZyAuZWRnZUxhYmVse2JhY2tncm91bmQtY29sb3I6I2U4ZThlODt0ZXh0LWFsaWduOmNlbnRlcjt9I215LXN2ZyAuZWRnZUxhYmVsIHJlY3R7b3BhY2l0eTowLjU7YmFja2dyb3VuZC1jb2xvcjojZThlOGU4O2ZpbGw6I2U4ZThlODt9I215LXN2ZyAubGFiZWxCa2d7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDIzMiwgMjMyLCAyMzIsIDAuNSk7fSNteS1zdmcgLmNsdXN0ZXIgcmVjdHtmaWxsOiNmZmZmZGU7c3Ryb2tlOiNhYWFhMzM7c3Ryb2tlLXdpZHRoOjFweDt9I215LXN2ZyAuY2x1c3RlciB0ZXh0e2ZpbGw6IzMzMzt9I215LXN2ZyAuY2x1c3RlciBzcGFuLCNteS1zdmcgcHtjb2xvcjojMzMzO30jbXktc3ZnIGRpdi5tZXJtYWlkVG9vbHRpcHtwb3NpdGlvbjphYnNvbHV0ZTt0ZXh0LWFsaWduOmNlbnRlcjttYXgtd2lkdGg6MjAwcHg7cGFkZGluZzoycHg7Zm9udC1mYW1pbHk6InRyZWJ1Y2hldCBtcyIsdmVyZGFuYSxhcmlhbCxzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMnB4O2JhY2tncm91bmQ6aHNsKDgwLCAxMDAlLCA5Ni4yNzQ1MDk4MDM5JSk7Ym9yZGVyOjFweCBzb2xpZCAjYWFhYTMzO2JvcmRlci1yYWRpdXM6MnB4O3BvaW50ZXItZXZlbnRzOm5vbmU7ei1pbmRleDoxMDA7fSNteS1zdmcgLmZsb3djaGFydFRpdGxlVGV4dHt0ZXh0LWFuY2hvcjptaWRkbGU7Zm9udC1zaXplOjE4cHg7ZmlsbDojMzMzO30jbXktc3ZnIDpyb290ey0tbWVybWFpZC1mb250LWZhbWlseToidHJlYnVjaGV0IG1zIix2ZXJkYW5hLGFyaWFsLHNhbnMtc2VyaWY7fSNteS1zdmcgLnRyZWVOb2RlJmd0Oyp7ZmlsbDojOGJhN2I5IWltcG9ydGFudDtzdHJva2U6IzFCM0QyRiFpbXBvcnRhbnQ7c3Ryb2tlLXdpZHRoOjJweCFpbXBvcnRhbnQ7fSNteS1zdmcgLnRyZWVOb2RlIHNwYW57ZmlsbDojOGJhN2I5IWltcG9ydGFudDtzdHJva2U6IzFCM0QyRiFpbXBvcnRhbnQ7c3Ryb2tlLXdpZHRoOjJweCFpbXBvcnRhbnQ7fTwvc3R5bGU+PGc+PG1hcmtlciBvcmllbnQ9ImF1dG8iIG1hcmtlckhlaWdodD0iMTIiIG1hcmtlcldpZHRoPSIxMiIgbWFya2VyVW5pdHM9InVzZXJTcGFjZU9uVXNlIiByZWZZPSI1IiByZWZYPSI2IiB2aWV3Qm94PSIwIDAgMTAgMTAiIGNsYXNzPSJtYXJrZXIgZmxvd2NoYXJ0IiBpZD0ibXktc3ZnX2Zsb3djaGFydC1wb2ludEVuZCI+PHBhdGggc3R5bGU9InN0cm9rZS13aWR0aDogMTsgc3Ryb2tlLWRhc2hhcnJheTogMSwgMDsiIGNsYXNzPSJhcnJvd01hcmtlclBhdGgiIGQ9Ik0gMCAwIEwgMTAgNSBMIDAgMTAgeiIvPjwvbWFya2VyPjxtYXJrZXIgb3JpZW50PSJhdXRvIiBtYXJrZXJIZWlnaHQ9IjEyIiBtYXJrZXJXaWR0aD0iMTIiIG1hcmtlclVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgcmVmWT0iNSIgcmVmWD0iNC41IiB2aWV3Qm94PSIwIDAgMTAgMTAiIGNsYXNzPSJtYXJrZXIgZmxvd2NoYXJ0IiBpZD0ibXktc3ZnX2Zsb3djaGFydC1wb2ludFN0YXJ0Ij48cGF0aCBzdHlsZT0ic3Ryb2tlLXdpZHRoOiAxOyBzdHJva2UtZGFzaGFycmF5OiAxLCAwOyIgY2xhc3M9ImFycm93TWFya2VyUGF0aCIgZD0iTSAwIDUgTCAxMCAxMCBMIDEwIDAgeiIvPjwvbWFya2VyPjxtYXJrZXIgb3JpZW50PSJhdXRvIiBtYXJrZXJIZWlnaHQ9IjExIiBtYXJrZXJXaWR0aD0iMTEiIG1hcmtlclVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgcmVmWT0iNSIgcmVmWD0iMTEiIHZpZXdCb3g9IjAgMCAxMCAxMCIgY2xhc3M9Im1hcmtlciBmbG93Y2hhcnQiIGlkPSJteS1zdmdfZmxvd2NoYXJ0LWNpcmNsZUVuZCI+PGNpcmNsZSBzdHlsZT0ic3Ryb2tlLXdpZHRoOiAxOyBzdHJva2UtZGFzaGFycmF5OiAxLCAwOyIgY2xhc3M9ImFycm93TWFya2VyUGF0aCIgcj0iNSIgY3k9IjUiIGN4PSI1Ii8+PC9tYXJrZXI+PG1hcmtlciBvcmllbnQ9ImF1dG8iIG1hcmtlckhlaWdodD0iMTEiIG1hcmtlcldpZHRoPSIxMSIgbWFya2VyVW5pdHM9InVzZXJTcGFjZU9uVXNlIiByZWZZPSI1IiByZWZYPSItMSIgdmlld0JveD0iMCAwIDEwIDEwIiBjbGFzcz0ibWFya2VyIGZsb3djaGFydCIgaWQ9Im15LXN2Z19mbG93Y2hhcnQtY2lyY2xlU3RhcnQiPjxjaXJjbGUgc3R5bGU9InN0cm9rZS13aWR0aDogMTsgc3Ryb2tlLWRhc2hhcnJheTogMSwgMDsiIGNsYXNzPSJhcnJvd01hcmtlclBhdGgiIHI9IjUiIGN5PSI1IiBjeD0iNSIvPjwvbWFya2VyPjxtYXJrZXIgb3JpZW50PSJhdXRvIiBtYXJrZXJIZWlnaHQ9IjExIiBtYXJrZXJXaWR0aD0iMTEiIG1hcmtlclVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgcmVmWT0iNS4yIiByZWZYPSIxMiIgdmlld0JveD0iMCAwIDExIDExIiBjbGFzcz0ibWFya2VyIGNyb3NzIGZsb3djaGFydCIgaWQ9Im15LXN2Z19mbG93Y2hhcnQtY3Jvc3NFbmQiPjxwYXRoIHN0eWxlPSJzdHJva2Utd2lkdGg6IDI7IHN0cm9rZS1kYXNoYXJyYXk6IDEsIDA7IiBjbGFzcz0iYXJyb3dNYXJrZXJQYXRoIiBkPSJNIDEsMSBsIDksOSBNIDEwLDEgbCAtOSw5Ii8+PC9tYXJrZXI+PG1hcmtlciBvcmllbnQ9ImF1dG8iIG1hcmtlckhlaWdodD0iMTEiIG1hcmtlcldpZHRoPSIxMSIgbWFya2VyVW5pdHM9InVzZXJTcGFjZU9uVXNlIiByZWZZPSI1LjIiIHJlZlg9Ii0xIiB2aWV3Qm94PSIwIDAgMTEgMTEiIGNsYXNzPSJtYXJrZXIgY3Jvc3MgZmxvd2NoYXJ0IiBpZD0ibXktc3ZnX2Zsb3djaGFydC1jcm9zc1N0YXJ0Ij48cGF0aCBzdHlsZT0ic3Ryb2tlLXdpZHRoOiAyOyBzdHJva2UtZGFzaGFycmF5OiAxLCAwOyIgY2xhc3M9ImFycm93TWFya2VyUGF0aCIgZD0iTSAxLDEgbCA5LDkgTSAxMCwxIGwgLTksOSIvPjwvbWFya2VyPjxnIGNsYXNzPSJyb290Ij48ZyBjbGFzcz0iY2x1c3RlcnMiLz48ZyBjbGFzcz0iZWRnZVBhdGhzIj48cGF0aCBzdHlsZT0iZmlsbDpub25lOyIgY2xhc3M9ImVkZ2UtdGhpY2tuZXNzLW5vcm1hbCBlZGdlLXBhdHRlcm4tc29saWQgZmxvd2NoYXJ0LWxpbmsgTFMtQSBMRS1CIiBpZD0iTC1BLUItMCIgZD0iTTE0MC4yOTksNDEuOTE3TDEzMy4zNTIsNDcuNjM5QzEyNi40MDUsNTMuMzYxLDExMi41MTEsNjQuODA2LDEwNS41NjQsNzQuNzFDOTguNjE3LDg0LjYxNSw5OC42MTcsOTIuOTc5LDk4LjYxNyw5Ny4xNjFMOTguNjE3LDEwMS4zNDQiLz48cGF0aCBzdHlsZT0iZmlsbDpub25lOyIgY2xhc3M9ImVkZ2UtdGhpY2tuZXNzLW5vcm1hbCBlZGdlLXBhdHRlcm4tc29saWQgZmxvd2NoYXJ0LWxpbmsgTFMtQSBMRS1DIiBpZD0iTC1BLUMtMCIgZD0iTTE4My43NTQsMzUuNDI3TDIwMC4xODgsNDIuMjMxQzIxNi42MjMsNDkuMDM1LDI0OS40OTEsNjIuNjQyLDI2NS45MjUsNzMuNjEzQzI4Mi4zNTksODQuNTgzLDI4Mi4zNTksOTIuOTE3LDI4Mi4zNTksOTcuMDgzTDI4Mi4zNTksMTAxLjI1Ii8+PHBhdGggc3R5bGU9ImZpbGw6bm9uZTsiIGNsYXNzPSJlZGdlLXRoaWNrbmVzcy1ub3JtYWwgZWRnZS1wYXR0ZXJuLXNvbGlkIGZsb3djaGFydC1saW5rIExTLUIgTEUtRCIgaWQ9IkwtQi1ELTAiIGQ9Ik03Mi44NjQsMTYzLjUwMkw2Ni45MDEsMTY5LjQ2MkM2MC45MzgsMTc1LjQyMyw0OS4wMTIsMTg3LjM0NCw0My4wNDksMTk3LjQ3MkMzNy4wODYsMjA3LjU5OSwzNy4wODYsMjE1LjkzMiwzNy4wODYsMjIwLjA5OUwzNy4wODYsMjI0LjI2NiIvPjxwYXRoIHN0eWxlPSJmaWxsOm5vbmU7IiBjbGFzcz0iZWRnZS10aGlja25lc3Mtbm9ybWFsIGVkZ2UtcGF0dGVybi1zb2xpZCBmbG93Y2hhcnQtbGluayBMUy1CIExFLUUiIGlkPSJMLUItRS0wIiBkPSJNMTI0LjM3MSwxNjMuNTAyTDEzMC4zMzQsMTY5LjQ2MkMxMzYuMjk3LDE3NS40MjMsMTQ4LjIyMywxODcuMzQ0LDE1NC4xODUsMTk3LjY1N0MxNjAuMTQ4LDIwNy45NjksMTYwLjE0OCwyMTYuNjcyLDE2MC4xNDgsMjIxLjAyM0wxNjAuMTQ4LDIyNS4zNzUiLz48cGF0aCBzdHlsZT0iZmlsbDpub25lOyIgY2xhc3M9ImVkZ2UtdGhpY2tuZXNzLW5vcm1hbCBlZGdlLXBhdHRlcm4tc29saWQgZmxvd2NoYXJ0LWxpbmsgTFMtQyBMRS1GIiBpZD0iTC1DLUYtMCIgZD0iTTI4Mi4zNTksMTc0LjI2NkwyODIuMzU5LDE3OC40MzJDMjgyLjM1OSwxODIuNTk5LDI4Mi4zNTksMTkwLjkzMiwyODIuMzU5LDE5OS41MjZDMjgyLjM1OSwyMDguMTIsMjgyLjM1OSwyMTYuOTc0LDI4Mi4zNTksMjIxLjQwMUwyODIuMzU5LDIyNS44MjgiLz48L2c+PGcgY2xhc3M9ImVkZ2VMYWJlbHMiPjxnIGNsYXNzPSJlZGdlTGFiZWwiPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAsIDApIiBjbGFzcz0ibGFiZWwiPjxmb3JlaWduT2JqZWN0IGhlaWdodD0iMCIgd2lkdGg9IjAiPjxkaXYgc3R5bGU9ImRpc3BsYXk6IGlubGluZS1ibG9jazsgd2hpdGUtc3BhY2U6IG5vd3JhcDsiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj48c3BhbiBjbGFzcz0iZWRnZUxhYmVsIj48L3NwYW4+PC9kaXY+PC9mb3JlaWduT2JqZWN0PjwvZz48L2c+PGcgY2xhc3M9ImVkZ2VMYWJlbCI+PGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCwgMCkiIGNsYXNzPSJsYWJlbCI+PGZvcmVpZ25PYmplY3QgaGVpZ2h0PSIwIiB3aWR0aD0iMCI+PGRpdiBzdHlsZT0iZGlzcGxheTogaW5saW5lLWJsb2NrOyB3aGl0ZS1zcGFjZTogbm93cmFwOyIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPjxzcGFuIGNsYXNzPSJlZGdlTGFiZWwiPjwvc3Bhbj48L2Rpdj48L2ZvcmVpZ25PYmplY3Q+PC9nPjwvZz48ZyBjbGFzcz0iZWRnZUxhYmVsIj48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLCAwKSIgY2xhc3M9ImxhYmVsIj48Zm9yZWlnbk9iamVjdCBoZWlnaHQ9IjAiIHdpZHRoPSIwIj48ZGl2IHN0eWxlPSJkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IHdoaXRlLXNwYWNlOiBub3dyYXA7IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+PHNwYW4gY2xhc3M9ImVkZ2VMYWJlbCI+PC9zcGFuPjwvZGl2PjwvZm9yZWlnbk9iamVjdD48L2c+PC9nPjxnIGNsYXNzPSJlZGdlTGFiZWwiPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAsIDApIiBjbGFzcz0ibGFiZWwiPjxmb3JlaWduT2JqZWN0IGhlaWdodD0iMCIgd2lkdGg9IjAiPjxkaXYgc3R5bGU9ImRpc3BsYXk6IGlubGluZS1ibG9jazsgd2hpdGUtc3BhY2U6IG5vd3JhcDsiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj48c3BhbiBjbGFzcz0iZWRnZUxhYmVsIj48L3NwYW4+PC9kaXY+PC9mb3JlaWduT2JqZWN0PjwvZz48L2c+PGcgY2xhc3M9ImVkZ2VMYWJlbCI+PGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCwgMCkiIGNsYXNzPSJsYWJlbCI+PGZvcmVpZ25PYmplY3QgaGVpZ2h0PSIwIiB3aWR0aD0iMCI+PGRpdiBzdHlsZT0iZGlzcGxheTogaW5saW5lLWJsb2NrOyB3aGl0ZS1zcGFjZTogbm93cmFwOyIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPjxzcGFuIGNsYXNzPSJlZGdlTGFiZWwiPjwvc3Bhbj48L2Rpdj48L2ZvcmVpZ25PYmplY3Q+PC9nPjwvZz48L2c+PGcgY2xhc3M9Im5vZGVzIj48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxNjAuMDc4MTI1LCAyNS42MjUpIiBkYXRhLWlkPSJBIiBkYXRhLW5vZGU9InRydWUiIGlkPSJmbG93Y2hhcnQtQS0wIiBjbGFzcz0ibm9kZSBkZWZhdWx0IHRyZWVOb2RlIGZsb3djaGFydC1sYWJlbCI+PGNpcmNsZSBoZWlnaHQ9IjM0IiB3aWR0aD0iNTEuMjUiIHI9IjI1LjYyNSIgcnk9IjAiIHJ4PSIwIiBzdHlsZT0iIi8+PGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTE4LjEyNSwgLTkuNSkiIHN0eWxlPSIiIGNsYXNzPSJsYWJlbCI+PHJlY3QvPjxmb3JlaWduT2JqZWN0IGhlaWdodD0iMTkiIHdpZHRoPSIzNi4yNSI+PGRpdiBzdHlsZT0iZGlzcGxheTogaW5saW5lLWJsb2NrOyB3aGl0ZS1zcGFjZTogbm93cmFwOyIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPjxzcGFuIGNsYXNzPSJub2RlTGFiZWwiPlJvb3Q8L3NwYW4+PC9kaXY+PC9mb3JlaWduT2JqZWN0PjwvZz48L2c+PGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoOTguNjE3MTg3NSwgMTM3Ljc1NzgxMjUpIiBkYXRhLWlkPSJCIiBkYXRhLW5vZGU9InRydWUiIGlkPSJmbG93Y2hhcnQtQi0xIiBjbGFzcz0ibm9kZSBkZWZhdWx0IHRyZWVOb2RlIGZsb3djaGFydC1sYWJlbCI+PGNpcmNsZSBoZWlnaHQ9IjM0IiB3aWR0aD0iNzIuODI4MTI1IiByPSIzNi40MTQwNjI1IiByeT0iMCIgcng9IjAiIHN0eWxlPSIiLz48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMjguOTE0MDYyNSwgLTkuNSkiIHN0eWxlPSIiIGNsYXNzPSJsYWJlbCI+PHJlY3QvPjxmb3JlaWduT2JqZWN0IGhlaWdodD0iMTkiIHdpZHRoPSI1Ny44MjgxMjUiPjxkaXYgc3R5bGU9ImRpc3BsYXk6IGlubGluZS1ibG9jazsgd2hpdGUtc3BhY2U6IG5vd3JhcDsiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj48c3BhbiBjbGFzcz0ibm9kZUxhYmVsIj5Ob2RlIEI8L3NwYW4+PC9kaXY+PC9mb3JlaWduT2JqZWN0PjwvZz48L2c+PGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMjgyLjM1OTM3NSwgMTM3Ljc1NzgxMjUpIiBkYXRhLWlkPSJDIiBkYXRhLW5vZGU9InRydWUiIGlkPSJmbG93Y2hhcnQtQy0zIiBjbGFzcz0ibm9kZSBkZWZhdWx0IHRyZWVOb2RlIGZsb3djaGFydC1sYWJlbCI+PGNpcmNsZSBoZWlnaHQ9IjM0IiB3aWR0aD0iNzMuMDE1NjI1IiByPSIzNi41MDc4MTI1IiByeT0iMCIgcng9IjAiIHN0eWxlPSIiLz48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMjkuMDA3ODEyNSwgLTkuNSkiIHN0eWxlPSIiIGNsYXNzPSJsYWJlbCI+PHJlY3QvPjxmb3JlaWduT2JqZWN0IGhlaWdodD0iMTkiIHdpZHRoPSI1OC4wMTU2MjUiPjxkaXYgc3R5bGU9ImRpc3BsYXk6IGlubGluZS1ibG9jazsgd2hpdGUtc3BhY2U6IG5vd3JhcDsiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj48c3BhbiBjbGFzcz0ibm9kZUxhYmVsIj5Ob2RlIEM8L3NwYW4+PC9kaXY+PC9mb3JlaWduT2JqZWN0PjwvZz48L2c+PGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMzcuMDg1OTM3NSwgMjYxLjM1MTU2MjUpIiBkYXRhLWlkPSJEIiBkYXRhLW5vZGU9InRydWUiIGlkPSJmbG93Y2hhcnQtRC01IiBjbGFzcz0ibm9kZSBkZWZhdWx0IHRyZWVOb2RlIGZsb3djaGFydC1sYWJlbCI+PGNpcmNsZSBoZWlnaHQ9IjM0IiB3aWR0aD0iNzQuMTcxODc1IiByPSIzNy4wODU5Mzc1IiByeT0iMCIgcng9IjAiIHN0eWxlPSIiLz48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMjkuNTg1OTM3NSwgLTkuNSkiIHN0eWxlPSIiIGNsYXNzPSJsYWJlbCI+PHJlY3QvPjxmb3JlaWduT2JqZWN0IGhlaWdodD0iMTkiIHdpZHRoPSI1OS4xNzE4NzUiPjxkaXYgc3R5bGU9ImRpc3BsYXk6IGlubGluZS1ibG9jazsgd2hpdGUtc3BhY2U6IG5vd3JhcDsiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj48c3BhbiBjbGFzcz0ibm9kZUxhYmVsIj5Ob2RlIEQ8L3NwYW4+PC9kaXY+PC9mb3JlaWduT2JqZWN0PjwvZz48L2c+PGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMTYwLjE0ODQzNzUsIDI2MS4zNTE1NjI1KSIgZGF0YS1pZD0iRSIgZGF0YS1ub2RlPSJ0cnVlIiBpZD0iZmxvd2NoYXJ0LUUtNyIgY2xhc3M9Im5vZGUgZGVmYXVsdCB0cmVlTm9kZSBmbG93Y2hhcnQtbGFiZWwiPjxjaXJjbGUgaGVpZ2h0PSIzNCIgd2lkdGg9IjcxLjk1MzEyNSIgcj0iMzUuOTc2NTYyNSIgcnk9IjAiIHJ4PSIwIiBzdHlsZT0iIi8+PGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTI4LjQ3NjU2MjUsIC05LjUpIiBzdHlsZT0iIiBjbGFzcz0ibGFiZWwiPjxyZWN0Lz48Zm9yZWlnbk9iamVjdCBoZWlnaHQ9IjE5IiB3aWR0aD0iNTYuOTUzMTI1Ij48ZGl2IHN0eWxlPSJkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IHdoaXRlLXNwYWNlOiBub3dyYXA7IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+PHNwYW4gY2xhc3M9Im5vZGVMYWJlbCI+Tm9kZSBFPC9zcGFuPjwvZGl2PjwvZm9yZWlnbk9iamVjdD48L2c+PC9nPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDI4Mi4zNTkzNzUsIDI2MS4zNTE1NjI1KSIgZGF0YS1pZD0iRiIgZGF0YS1ub2RlPSJ0cnVlIiBpZD0iZmxvd2NoYXJ0LUYtOSIgY2xhc3M9Im5vZGUgZGVmYXVsdCB0cmVlTm9kZSBmbG93Y2hhcnQtbGFiZWwiPjxjaXJjbGUgaGVpZ2h0PSIzNCIgd2lkdGg9IjcxLjA0Njg3NSIgcj0iMzUuNTIzNDM3NSIgcnk9IjAiIHJ4PSIwIiBzdHlsZT0iIi8+PGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTI4LjAyMzQzNzUsIC05LjUpIiBzdHlsZT0iIiBjbGFzcz0ibGFiZWwiPjxyZWN0Lz48Zm9yZWlnbk9iamVjdCBoZWlnaHQ9IjE5IiB3aWR0aD0iNTYuMDQ2ODc1Ij48ZGl2IHN0eWxlPSJkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IHdoaXRlLXNwYWNlOiBub3dyYXA7IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+PHNwYW4gY2xhc3M9Im5vZGVMYWJlbCI+Tm9kZSBGPC9zcGFuPjwvZGl2PjwvZm9yZWlnbk9iamVjdD48L2c+PC9nPjwvZz48L2c+PC9nPjwvc3ZnPg=="&gt;&lt;/p&gt;
&lt;h3 id="regular-manhattan-topology"&gt;Regular Manhattan Topology&lt;/h3&gt;
&lt;p&gt;A grid-like structure resembling city blocks.&lt;/p&gt;
&lt;p&gt;&lt;img src="data:image/svg+xml;base64,PHN2ZyBhcmlhLXJvbGVkZXNjcmlwdGlvbj0iZmxvd2NoYXJ0LXYyIiByb2xlPSJncmFwaGljcy1kb2N1bWVudCBkb2N1bWVudCIgdmlld0JveD0iLTggLTggMjQ3Ljk5MjE4NzUgNzA0LjEwOTM3NSIgc3R5bGU9Im1heC13aWR0aDogMjQ3Ljk5MnB4OyBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTsiIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMDAlIiBpZD0ibXktc3ZnIj48c3R5bGU+I215LXN2Z3tmb250LWZhbWlseToidHJlYnVjaGV0IG1zIix2ZXJkYW5hLGFyaWFsLHNhbnMtc2VyaWY7Zm9udC1zaXplOjE2cHg7ZmlsbDojMzMzO30jbXktc3ZnIC5lcnJvci1pY29ue2ZpbGw6IzU1MjIyMjt9I215LXN2ZyAuZXJyb3ItdGV4dHtmaWxsOiM1NTIyMjI7c3Ryb2tlOiM1NTIyMjI7fSNteS1zdmcgLmVkZ2UtdGhpY2tuZXNzLW5vcm1hbHtzdHJva2Utd2lkdGg6MnB4O30jbXktc3ZnIC5lZGdlLXRoaWNrbmVzcy10aGlja3tzdHJva2Utd2lkdGg6My41cHg7fSNteS1zdmcgLmVkZ2UtcGF0dGVybi1zb2xpZHtzdHJva2UtZGFzaGFycmF5OjA7fSNteS1zdmcgLmVkZ2UtcGF0dGVybi1kYXNoZWR7c3Ryb2tlLWRhc2hhcnJheTozO30jbXktc3ZnIC5lZGdlLXBhdHRlcm4tZG90dGVke3N0cm9rZS1kYXNoYXJyYXk6Mjt9I215LXN2ZyAubWFya2Vye2ZpbGw6IzMzMzMzMztzdHJva2U6IzMzMzMzMzt9I215LXN2ZyAubWFya2VyLmNyb3Nze3N0cm9rZTojMzMzMzMzO30jbXktc3ZnIHN2Z3tmb250LWZhbWlseToidHJlYnVjaGV0IG1zIix2ZXJkYW5hLGFyaWFsLHNhbnMtc2VyaWY7Zm9udC1zaXplOjE2cHg7fSNteS1zdmcgLmxhYmVse2ZvbnQtZmFtaWx5OiJ0cmVidWNoZXQgbXMiLHZlcmRhbmEsYXJpYWwsc2Fucy1zZXJpZjtjb2xvcjojMzMzO30jbXktc3ZnIC5jbHVzdGVyLWxhYmVsIHRleHR7ZmlsbDojMzMzO30jbXktc3ZnIC5jbHVzdGVyLWxhYmVsIHNwYW4sI215LXN2ZyBwe2NvbG9yOiMzMzM7fSNteS1zdmcgLmxhYmVsIHRleHQsI215LXN2ZyBzcGFuLCNteS1zdmcgcHtmaWxsOiMzMzM7Y29sb3I6IzMzMzt9I215LXN2ZyAubm9kZSByZWN0LCNteS1zdmcgLm5vZGUgY2lyY2xlLCNteS1zdmcgLm5vZGUgZWxsaXBzZSwjbXktc3ZnIC5ub2RlIHBvbHlnb24sI215LXN2ZyAubm9kZSBwYXRoe2ZpbGw6I0VDRUNGRjtzdHJva2U6IzkzNzBEQjtzdHJva2Utd2lkdGg6MXB4O30jbXktc3ZnIC5mbG93Y2hhcnQtbGFiZWwgdGV4dHt0ZXh0LWFuY2hvcjptaWRkbGU7fSNteS1zdmcgLm5vZGUgLmthdGV4IHBhdGh7ZmlsbDojMDAwO3N0cm9rZTojMDAwO3N0cm9rZS13aWR0aDoxcHg7fSNteS1zdmcgLm5vZGUgLmxhYmVse3RleHQtYWxpZ246Y2VudGVyO30jbXktc3ZnIC5ub2RlLmNsaWNrYWJsZXtjdXJzb3I6cG9pbnRlcjt9I215LXN2ZyAuYXJyb3doZWFkUGF0aHtmaWxsOiMzMzMzMzM7fSNteS1zdmcgLmVkZ2VQYXRoIC5wYXRoe3N0cm9rZTojMzMzMzMzO3N0cm9rZS13aWR0aDoyLjBweDt9I215LXN2ZyAuZmxvd2NoYXJ0LWxpbmt7c3Ryb2tlOiMzMzMzMzM7ZmlsbDpub25lO30jbXktc3ZnIC5lZGdlTGFiZWx7YmFja2dyb3VuZC1jb2xvcjojZThlOGU4O3RleHQtYWxpZ246Y2VudGVyO30jbXktc3ZnIC5lZGdlTGFiZWwgcmVjdHtvcGFjaXR5OjAuNTtiYWNrZ3JvdW5kLWNvbG9yOiNlOGU4ZTg7ZmlsbDojZThlOGU4O30jbXktc3ZnIC5sYWJlbEJrZ3tiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjMyLCAyMzIsIDIzMiwgMC41KTt9I215LXN2ZyAuY2x1c3RlciByZWN0e2ZpbGw6I2ZmZmZkZTtzdHJva2U6I2FhYWEzMztzdHJva2Utd2lkdGg6MXB4O30jbXktc3ZnIC5jbHVzdGVyIHRleHR7ZmlsbDojMzMzO30jbXktc3ZnIC5jbHVzdGVyIHNwYW4sI215LXN2ZyBwe2NvbG9yOiMzMzM7fSNteS1zdmcgZGl2Lm1lcm1haWRUb29sdGlwe3Bvc2l0aW9uOmFic29sdXRlO3RleHQtYWxpZ246Y2VudGVyO21heC13aWR0aDoyMDBweDtwYWRkaW5nOjJweDtmb250LWZhbWlseToidHJlYnVjaGV0IG1zIix2ZXJkYW5hLGFyaWFsLHNhbnMtc2VyaWY7Zm9udC1zaXplOjEycHg7YmFja2dyb3VuZDpoc2woODAsIDEwMCUsIDk2LjI3NDUwOTgwMzklKTtib3JkZXI6MXB4IHNvbGlkICNhYWFhMzM7Ym9yZGVyLXJhZGl1czoycHg7cG9pbnRlci1ldmVudHM6bm9uZTt6LWluZGV4OjEwMDt9I215LXN2ZyAuZmxvd2NoYXJ0VGl0bGVUZXh0e3RleHQtYW5jaG9yOm1pZGRsZTtmb250LXNpemU6MThweDtmaWxsOiMzMzM7fSNteS1zdmcgOnJvb3R7LS1tZXJtYWlkLWZvbnQtZmFtaWx5OiJ0cmVidWNoZXQgbXMiLHZlcmRhbmEsYXJpYWwsc2Fucy1zZXJpZjt9I215LXN2ZyAuZ3JpZE5vZGUmZ3Q7KntmaWxsOiNiOThiOTkhaW1wb3J0YW50O3N0cm9rZTojMUIzRDJGIWltcG9ydGFudDtzdHJva2Utd2lkdGg6MnB4IWltcG9ydGFudDt9I215LXN2ZyAuZ3JpZE5vZGUgc3BhbntmaWxsOiNiOThiOTkhaW1wb3J0YW50O3N0cm9rZTojMUIzRDJGIWltcG9ydGFudDtzdHJva2Utd2lkdGg6MnB4IWltcG9ydGFudDt9PC9zdHlsZT48Zz48bWFya2VyIG9yaWVudD0iYXV0byIgbWFya2VySGVpZ2h0PSIxMiIgbWFya2VyV2lkdGg9IjEyIiBtYXJrZXJVbml0cz0idXNlclNwYWNlT25Vc2UiIHJlZlk9IjUiIHJlZlg9IjYiIHZpZXdCb3g9IjAgMCAxMCAxMCIgY2xhc3M9Im1hcmtlciBmbG93Y2hhcnQiIGlkPSJteS1zdmdfZmxvd2NoYXJ0LXBvaW50RW5kIj48cGF0aCBzdHlsZT0ic3Ryb2tlLXdpZHRoOiAxOyBzdHJva2UtZGFzaGFycmF5OiAxLCAwOyIgY2xhc3M9ImFycm93TWFya2VyUGF0aCIgZD0iTSAwIDAgTCAxMCA1IEwgMCAxMCB6Ii8+PC9tYXJrZXI+PG1hcmtlciBvcmllbnQ9ImF1dG8iIG1hcmtlckhlaWdodD0iMTIiIG1hcmtlcldpZHRoPSIxMiIgbWFya2VyVW5pdHM9InVzZXJTcGFjZU9uVXNlIiByZWZZPSI1IiByZWZYPSI0LjUiIHZpZXdCb3g9IjAgMCAxMCAxMCIgY2xhc3M9Im1hcmtlciBmbG93Y2hhcnQiIGlkPSJteS1zdmdfZmxvd2NoYXJ0LXBvaW50U3RhcnQiPjxwYXRoIHN0eWxlPSJzdHJva2Utd2lkdGg6IDE7IHN0cm9rZS1kYXNoYXJyYXk6IDEsIDA7IiBjbGFzcz0iYXJyb3dNYXJrZXJQYXRoIiBkPSJNIDAgNSBMIDEwIDEwIEwgMTAgMCB6Ii8+PC9tYXJrZXI+PG1hcmtlciBvcmllbnQ9ImF1dG8iIG1hcmtlckhlaWdodD0iMTEiIG1hcmtlcldpZHRoPSIxMSIgbWFya2VyVW5pdHM9InVzZXJTcGFjZU9uVXNlIiByZWZZPSI1IiByZWZYPSIxMSIgdmlld0JveD0iMCAwIDEwIDEwIiBjbGFzcz0ibWFya2VyIGZsb3djaGFydCIgaWQ9Im15LXN2Z19mbG93Y2hhcnQtY2lyY2xlRW5kIj48Y2lyY2xlIHN0eWxlPSJzdHJva2Utd2lkdGg6IDE7IHN0cm9rZS1kYXNoYXJyYXk6IDEsIDA7IiBjbGFzcz0iYXJyb3dNYXJrZXJQYXRoIiByPSI1IiBjeT0iNSIgY3g9IjUiLz48L21hcmtlcj48bWFya2VyIG9yaWVudD0iYXV0byIgbWFya2VySGVpZ2h0PSIxMSIgbWFya2VyV2lkdGg9IjExIiBtYXJrZXJVbml0cz0idXNlclNwYWNlT25Vc2UiIHJlZlk9IjUiIHJlZlg9Ii0xIiB2aWV3Qm94PSIwIDAgMTAgMTAiIGNsYXNzPSJtYXJrZXIgZmxvd2NoYXJ0IiBpZD0ibXktc3ZnX2Zsb3djaGFydC1jaXJjbGVTdGFydCI+PGNpcmNsZSBzdHlsZT0ic3Ryb2tlLXdpZHRoOiAxOyBzdHJva2UtZGFzaGFycmF5OiAxLCAwOyIgY2xhc3M9ImFycm93TWFya2VyUGF0aCIgcj0iNSIgY3k9IjUiIGN4PSI1Ii8+PC9tYXJrZXI+PG1hcmtlciBvcmllbnQ9ImF1dG8iIG1hcmtlckhlaWdodD0iMTEiIG1hcmtlcldpZHRoPSIxMSIgbWFya2VyVW5pdHM9InVzZXJTcGFjZU9uVXNlIiByZWZZPSI1LjIiIHJlZlg9IjEyIiB2aWV3Qm94PSIwIDAgMTEgMTEiIGNsYXNzPSJtYXJrZXIgY3Jvc3MgZmxvd2NoYXJ0IiBpZD0ibXktc3ZnX2Zsb3djaGFydC1jcm9zc0VuZCI+PHBhdGggc3R5bGU9InN0cm9rZS13aWR0aDogMjsgc3Ryb2tlLWRhc2hhcnJheTogMSwgMDsiIGNsYXNzPSJhcnJvd01hcmtlclBhdGgiIGQ9Ik0gMSwxIGwgOSw5IE0gMTAsMSBsIC05LDkiLz48L21hcmtlcj48bWFya2VyIG9yaWVudD0iYXV0byIgbWFya2VySGVpZ2h0PSIxMSIgbWFya2VyV2lkdGg9IjExIiBtYXJrZXJVbml0cz0idXNlclNwYWNlT25Vc2UiIHJlZlk9IjUuMiIgcmVmWD0iLTEiIHZpZXdCb3g9IjAgMCAxMSAxMSIgY2xhc3M9Im1hcmtlciBjcm9zcyBmbG93Y2hhcnQiIGlkPSJteS1zdmdfZmxvd2NoYXJ0LWNyb3NzU3RhcnQiPjxwYXRoIHN0eWxlPSJzdHJva2Utd2lkdGg6IDI7IHN0cm9rZS1kYXNoYXJyYXk6IDEsIDA7IiBjbGFzcz0iYXJyb3dNYXJrZXJQYXRoIiBkPSJNIDEsMSBsIDksOSBNIDEwLDEgbCAtOSw5Ii8+PC9tYXJrZXI+PGcgY2xhc3M9InJvb3QiPjxnIGNsYXNzPSJjbHVzdGVycyIvPjxnIGNsYXNzPSJlZGdlUGF0aHMiPjxwYXRoIHN0eWxlPSJmaWxsOm5vbmU7IiBjbGFzcz0iZWRnZS10aGlja25lc3Mtbm9ybWFsIGVkZ2UtcGF0dGVybi1zb2xpZCBmbG93Y2hhcnQtbGluayBMUy1BIExFLUIiIGlkPSJMLUEtQi0wIiBkPSJNNzEuOTE0LDYyLjE3OUw2NS45OTgsNjguMTE1QzYwLjA4MSw3NC4wNTEsNDguMjQ4LDg1LjkyNCw0Mi4zMzEsMTAyLjIwOEMzNi40MTQsMTE4LjQ5MiwzNi40MTQsMTM5LjE4OCwzNi40MTQsMTU5Ljg4M0MzNi40MTQsMTgwLjU3OCwzNi40MTQsMjAxLjI3MywzNi40MTQsMjIxLjcwOEMzNi40MTQsMjQyLjE0MywzNi40MTQsMjYyLjMxOCwzNi40MTQsMjgyLjQ5MkMzNi40MTQsMzAyLjY2NywzNi40MTQsMzIyLjg0MSwzNi40MTQsMzQzLjI4M0MzNi40MTQsMzYzLjcyNCwzNi40MTQsMzg0LjQzMiwzNi40MTQsNDA1LjE0MUMzNi40MTQsNDI1Ljg0OSwzNi40MTQsNDQ2LjU1NywzNi40MTQsNDYxLjA3OEMzNi40MTQsNDc1LjU5OSwzNi40MTQsNDgzLjkzMiwzNi40MTQsNDg4LjA5OUwzNi40MTQsNDkyLjI2NiIvPjxwYXRoIHN0eWxlPSJmaWxsOm5vbmU7IiBjbGFzcz0iZWRnZS10aGlja25lc3Mtbm9ybWFsIGVkZ2UtcGF0dGVybi1zb2xpZCBmbG93Y2hhcnQtbGluayBMUy1CIExFLUMiIGlkPSJMLUItQy0wIiBkPSJNMzYuNDE0LDU2NS4wOTRMMzYuNDE0LDU2OS4yNkMzNi40MTQsNTczLjQyNywzNi40MTQsNTgxLjc2LDQyLjMyMiw1OTEuODY1QzQ4LjIyOSw2MDEuOTY5LDYwLjA0NSw2MTMuODQ1LDY1Ljk1Myw2MTkuNzgzTDcxLjg2LDYyNS43MjEiLz48cGF0aCBzdHlsZT0iZmlsbDpub25lOyIgY2xhc3M9ImVkZ2UtdGhpY2tuZXNzLW5vcm1hbCBlZGdlLXBhdHRlcm4tc29saWQgZmxvd2NoYXJ0LWxpbmsgTFMtQSBMRS1EIiBpZD0iTC1BLUQtMCIgZD0iTTEyMy4zMDQsNjIuMTc5TDEyOS4yMjEsNjguMTE1QzEzNS4xMzgsNzQuMDUxLDE0Ni45NzEsODUuOTI0LDE1Mi44ODgsOTYuMDI3QzE1OC44MDUsMTA2LjEzLDE1OC44MDUsMTE0LjQ2NCwxNTguODA1LDExOC42M0wxNTguODA1LDEyMi43OTciLz48cGF0aCBzdHlsZT0iZmlsbDpub25lOyIgY2xhc3M9ImVkZ2UtdGhpY2tuZXNzLW5vcm1hbCBlZGdlLXBhdHRlcm4tc29saWQgZmxvd2NoYXJ0LWxpbmsgTFMtRCBMRS1FIiBpZD0iTC1ELUUtMCIgZD0iTTEzNS4yMTEsMTg4LjQ5NkwxMzAuNjExLDE5NC4wNzVDMTI2LjAxLDE5OS42NTMsMTE2LjgxLDIxMC44MTEsMTEyLjIxLDIyNi40NzdDMTA3LjYwOSwyNDIuMTQzLDEwNy42MDksMjYyLjMxOCwxMDcuNjA5LDI4Mi40OTJDMTA3LjYwOSwzMDIuNjY3LDEwNy42MDksMzIyLjg0MSwxMDcuNjA5LDM0My4yODNDMTA3LjYwOSwzNjMuNzI0LDEwNy42MDksMzg0LjQzMiwxMDcuNjA5LDQwNS4xNDFDMTA3LjYwOSw0MjUuODQ5LDEwNy42MDksNDQ2LjU1NywxMTIuMzAzLDQ2Mi41NDFDMTE2Ljk5Niw0NzguNTI2LDEyNi4zODIsNDg5Ljc4NiwxMzEuMDc1LDQ5NS40MTVMMTM1Ljc2OSw1MDEuMDQ1Ii8+PHBhdGggc3R5bGU9ImZpbGw6bm9uZTsiIGNsYXNzPSJlZGdlLXRoaWNrbmVzcy1ub3JtYWwgZWRnZS1wYXR0ZXJuLXNvbGlkIGZsb3djaGFydC1saW5rIExTLUUgTEUtQyIgaWQ9IkwtRS1DLTAiIGQ9Ik0xNTguODA1LDU2NC42NTZMMTU4LjgwNSw1NjguODk2QzE1OC44MDUsNTczLjEzNSwxNTguODA1LDU4MS42MTUsMTUyLjg5Nyw1OTEuNzkyQzE0Ni45ODksNjAxLjk2OSwxMzUuMTc0LDYxMy44NDUsMTI5LjI2Niw2MTkuNzgzTDEyMy4zNTgsNjI1LjcyMSIvPjxwYXRoIHN0eWxlPSJmaWxsOm5vbmU7IiBjbGFzcz0iZWRnZS10aGlja25lc3Mtbm9ybWFsIGVkZ2UtcGF0dGVybi1zb2xpZCBmbG93Y2hhcnQtbGluayBMUy1EIExFLUYiIGlkPSJMLUQtRi0wIiBkPSJNMTc3LjQzMiwxOTEuOTUxTDE4MC4zMzgsMTk2Ljk1NEMxODMuMjQ0LDIwMS45NTcsMTg5LjA1NSwyMTEuOTYzLDE5MS45NjEsMjIxLjEzM0MxOTQuODY3LDIzMC4zMDIsMTk0Ljg2NywyMzguNjM1LDE5NC44NjcsMjQyLjgwMkwxOTQuODY3LDI0Ni45NjkiLz48cGF0aCBzdHlsZT0iZmlsbDpub25lOyIgY2xhc3M9ImVkZ2UtdGhpY2tuZXNzLW5vcm1hbCBlZGdlLXBhdHRlcm4tc29saWQgZmxvd2NoYXJ0LWxpbmsgTFMtRiBMRS1HIiBpZD0iTC1GLUctMCIgZD0iTTE5NC44NjcsMzE4LjAxNkwxOTQuODY3LDMyMi4xODJDMTk0Ljg2NywzMjYuMzQ5LDE5NC44NjcsMzM0LjY4MiwxOTQuODY3LDM0My4wMTZDMTk0Ljg2NywzNTEuMzQ5LDE5NC44NjcsMzU5LjY4MiwxOTQuODY3LDM2My44NDlMMTk0Ljg2NywzNjguMDE2Ii8+PHBhdGggc3R5bGU9ImZpbGw6bm9uZTsiIGNsYXNzPSJlZGdlLXRoaWNrbmVzcy1ub3JtYWwgZWRnZS1wYXR0ZXJuLXNvbGlkIGZsb3djaGFydC1saW5rIExTLUcgTEUtRSIgaWQ9IkwtRy1FLTAiIGQ9Ik0xOTQuODY3LDQ0Mi4yNjZMMTk0Ljg2Nyw0NDYuNDMyQzE5NC44NjcsNDUwLjU5OSwxOTQuODY3LDQ1OC45MzIsMTkxLjg5Myw0NjguMTY0QzE4OC45MTksNDc3LjM5NiwxODIuOTcsNDg3LjUyNiwxNzkuOTk2LDQ5Mi41OTFMMTc3LjAyMiw0OTcuNjU2Ii8+PC9nPjxnIGNsYXNzPSJlZGdlTGFiZWxzIj48ZyBjbGFzcz0iZWRnZUxhYmVsIj48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLCAwKSIgY2xhc3M9ImxhYmVsIj48Zm9yZWlnbk9iamVjdCBoZWlnaHQ9IjAiIHdpZHRoPSIwIj48ZGl2IHN0eWxlPSJkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IHdoaXRlLXNwYWNlOiBub3dyYXA7IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+PHNwYW4gY2xhc3M9ImVkZ2VMYWJlbCI+PC9zcGFuPjwvZGl2PjwvZm9yZWlnbk9iamVjdD48L2c+PC9nPjxnIGNsYXNzPSJlZGdlTGFiZWwiPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAsIDApIiBjbGFzcz0ibGFiZWwiPjxmb3JlaWduT2JqZWN0IGhlaWdodD0iMCIgd2lkdGg9IjAiPjxkaXYgc3R5bGU9ImRpc3BsYXk6IGlubGluZS1ibG9jazsgd2hpdGUtc3BhY2U6IG5vd3JhcDsiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj48c3BhbiBjbGFzcz0iZWRnZUxhYmVsIj48L3NwYW4+PC9kaXY+PC9mb3JlaWduT2JqZWN0PjwvZz48L2c+PGcgY2xhc3M9ImVkZ2VMYWJlbCI+PGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCwgMCkiIGNsYXNzPSJsYWJlbCI+PGZvcmVpZ25PYmplY3QgaGVpZ2h0PSIwIiB3aWR0aD0iMCI+PGRpdiBzdHlsZT0iZGlzcGxheTogaW5saW5lLWJsb2NrOyB3aGl0ZS1zcGFjZTogbm93cmFwOyIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPjxzcGFuIGNsYXNzPSJlZGdlTGFiZWwiPjwvc3Bhbj48L2Rpdj48L2ZvcmVpZ25PYmplY3Q+PC9nPjwvZz48ZyBjbGFzcz0iZWRnZUxhYmVsIj48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLCAwKSIgY2xhc3M9ImxhYmVsIj48Zm9yZWlnbk9iamVjdCBoZWlnaHQ9IjAiIHdpZHRoPSIwIj48ZGl2IHN0eWxlPSJkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IHdoaXRlLXNwYWNlOiBub3dyYXA7IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+PHNwYW4gY2xhc3M9ImVkZ2VMYWJlbCI+PC9zcGFuPjwvZGl2PjwvZm9yZWlnbk9iamVjdD48L2c+PC9nPjxnIGNsYXNzPSJlZGdlTGFiZWwiPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAsIDApIiBjbGFzcz0ibGFiZWwiPjxmb3JlaWduT2JqZWN0IGhlaWdodD0iMCIgd2lkdGg9IjAiPjxkaXYgc3R5bGU9ImRpc3BsYXk6IGlubGluZS1ibG9jazsgd2hpdGUtc3BhY2U6IG5vd3JhcDsiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj48c3BhbiBjbGFzcz0iZWRnZUxhYmVsIj48L3NwYW4+PC9kaXY+PC9mb3JlaWduT2JqZWN0PjwvZz48L2c+PGcgY2xhc3M9ImVkZ2VMYWJlbCI+PGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCwgMCkiIGNsYXNzPSJsYWJlbCI+PGZvcmVpZ25PYmplY3QgaGVpZ2h0PSIwIiB3aWR0aD0iMCI+PGRpdiBzdHlsZT0iZGlzcGxheTogaW5saW5lLWJsb2NrOyB3aGl0ZS1zcGFjZTogbm93cmFwOyIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPjxzcGFuIGNsYXNzPSJlZGdlTGFiZWwiPjwvc3Bhbj48L2Rpdj48L2ZvcmVpZ25PYmplY3Q+PC9nPjwvZz48ZyBjbGFzcz0iZWRnZUxhYmVsIj48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLCAwKSIgY2xhc3M9ImxhYmVsIj48Zm9yZWlnbk9iamVjdCBoZWlnaHQ9IjAiIHdpZHRoPSIwIj48ZGl2IHN0eWxlPSJkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IHdoaXRlLXNwYWNlOiBub3dyYXA7IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+PHNwYW4gY2xhc3M9ImVkZ2VMYWJlbCI+PC9zcGFuPjwvZGl2PjwvZm9yZWlnbk9iamVjdD48L2c+PC9nPjxnIGNsYXNzPSJlZGdlTGFiZWwiPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAsIDApIiBjbGFzcz0ibGFiZWwiPjxmb3JlaWduT2JqZWN0IGhlaWdodD0iMCIgd2lkdGg9IjAiPjxkaXYgc3R5bGU9ImRpc3BsYXk6IGlubGluZS1ibG9jazsgd2hpdGUtc3BhY2U6IG5vd3JhcDsiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj48c3BhbiBjbGFzcz0iZWRnZUxhYmVsIj48L3NwYW4+PC9kaXY+PC9mb3JlaWduT2JqZWN0PjwvZz48L2c+PC9nPjxnIGNsYXNzPSJub2RlcyI+PGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoOTcuNjA5Mzc1LCAzNi4zOTg0Mzc1KSIgZGF0YS1pZD0iQSIgZGF0YS1ub2RlPSJ0cnVlIiBpZD0iZmxvd2NoYXJ0LUEtMCIgY2xhc3M9Im5vZGUgZGVmYXVsdCBncmlkTm9kZSBmbG93Y2hhcnQtbGFiZWwiPjxjaXJjbGUgaGVpZ2h0PSIzNCIgd2lkdGg9IjcyLjc5Njg3NSIgcj0iMzYuMzk4NDM3NSIgcnk9IjAiIHJ4PSIwIiBzdHlsZT0iIi8+PGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTI4Ljg5ODQzNzUsIC05LjUpIiBzdHlsZT0iIiBjbGFzcz0ibGFiZWwiPjxyZWN0Lz48Zm9yZWlnbk9iamVjdCBoZWlnaHQ9IjE5IiB3aWR0aD0iNTcuNzk2ODc1Ij48ZGl2IHN0eWxlPSJkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IHdoaXRlLXNwYWNlOiBub3dyYXA7IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+PHNwYW4gY2xhc3M9Im5vZGVMYWJlbCI+Tm9kZSBBPC9zcGFuPjwvZGl2PjwvZm9yZWlnbk9iamVjdD48L2c+PC9nPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDM2LjQxNDA2MjUsIDUyOC42Nzk2ODc1KSIgZGF0YS1pZD0iQiIgZGF0YS1ub2RlPSJ0cnVlIiBpZD0iZmxvd2NoYXJ0LUItMSIgY2xhc3M9Im5vZGUgZGVmYXVsdCBncmlkTm9kZSBmbG93Y2hhcnQtbGFiZWwiPjxjaXJjbGUgaGVpZ2h0PSIzNCIgd2lkdGg9IjcyLjgyODEyNSIgcj0iMzYuNDE0MDYyNSIgcnk9IjAiIHJ4PSIwIiBzdHlsZT0iIi8+PGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTI4LjkxNDA2MjUsIC05LjUpIiBzdHlsZT0iIiBjbGFzcz0ibGFiZWwiPjxyZWN0Lz48Zm9yZWlnbk9iamVjdCBoZWlnaHQ9IjE5IiB3aWR0aD0iNTcuODI4MTI1Ij48ZGl2IHN0eWxlPSJkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IHdoaXRlLXNwYWNlOiBub3dyYXA7IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+PHNwYW4gY2xhc3M9Im5vZGVMYWJlbCI+Tm9kZSBCPC9zcGFuPjwvZGl2PjwvZm9yZWlnbk9iamVjdD48L2c+PC9nPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDk3LjYwOTM3NSwgNjUxLjYwMTU2MjUpIiBkYXRhLWlkPSJDIiBkYXRhLW5vZGU9InRydWUiIGlkPSJmbG93Y2hhcnQtQy0yIiBjbGFzcz0ibm9kZSBkZWZhdWx0IGdyaWROb2RlIGZsb3djaGFydC1sYWJlbCI+PGNpcmNsZSBoZWlnaHQ9IjM0IiB3aWR0aD0iNzMuMDE1NjI1IiByPSIzNi41MDc4MTI1IiByeT0iMCIgcng9IjAiIHN0eWxlPSIiLz48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMjkuMDA3ODEyNSwgLTkuNSkiIHN0eWxlPSIiIGNsYXNzPSJsYWJlbCI+PHJlY3QvPjxmb3JlaWduT2JqZWN0IGhlaWdodD0iMTkiIHdpZHRoPSI1OC4wMTU2MjUiPjxkaXYgc3R5bGU9ImRpc3BsYXk6IGlubGluZS1ibG9jazsgd2hpdGUtc3BhY2U6IG5vd3JhcDsiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj48c3BhbiBjbGFzcz0ibm9kZUxhYmVsIj5Ob2RlIEM8L3NwYW4+PC9kaXY+PC9mb3JlaWduT2JqZWN0PjwvZz48L2c+PGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMTU4LjgwNDY4NzUsIDE1OS44ODI4MTI1KSIgZGF0YS1pZD0iRCIgZGF0YS1ub2RlPSJ0cnVlIiBpZD0iZmxvd2NoYXJ0LUQtNCIgY2xhc3M9Im5vZGUgZGVmYXVsdCBncmlkTm9kZSBmbG93Y2hhcnQtbGFiZWwiPjxjaXJjbGUgaGVpZ2h0PSIzNCIgd2lkdGg9Ijc0LjE3MTg3NSIgcj0iMzcuMDg1OTM3NSIgcnk9IjAiIHJ4PSIwIiBzdHlsZT0iIi8+PGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTI5LjU4NTkzNzUsIC05LjUpIiBzdHlsZT0iIiBjbGFzcz0ibGFiZWwiPjxyZWN0Lz48Zm9yZWlnbk9iamVjdCBoZWlnaHQ9IjE5IiB3aWR0aD0iNTkuMTcxODc1Ij48ZGl2IHN0eWxlPSJkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IHdoaXRlLXNwYWNlOiBub3dyYXA7IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+PHNwYW4gY2xhc3M9Im5vZGVMYWJlbCI+Tm9kZSBEPC9zcGFuPjwvZGl2PjwvZm9yZWlnbk9iamVjdD48L2c+PC9nPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDE1OC44MDQ2ODc1LCA1MjguNjc5Njg3NSkiIGRhdGEtaWQ9IkUiIGRhdGEtbm9kZT0idHJ1ZSIgaWQ9ImZsb3djaGFydC1FLTUiIGNsYXNzPSJub2RlIGRlZmF1bHQgZ3JpZE5vZGUgZmxvd2NoYXJ0LWxhYmVsIj48Y2lyY2xlIGhlaWdodD0iMzQiIHdpZHRoPSI3MS45NTMxMjUiIHI9IjM1Ljk3NjU2MjUiIHJ5PSIwIiByeD0iMCIgc3R5bGU9IiIvPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yOC40NzY1NjI1LCAtOS41KSIgc3R5bGU9IiIgY2xhc3M9ImxhYmVsIj48cmVjdC8+PGZvcmVpZ25PYmplY3QgaGVpZ2h0PSIxOSIgd2lkdGg9IjU2Ljk1MzEyNSI+PGRpdiBzdHlsZT0iZGlzcGxheTogaW5saW5lLWJsb2NrOyB3aGl0ZS1zcGFjZTogbm93cmFwOyIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPjxzcGFuIGNsYXNzPSJub2RlTGFiZWwiPk5vZGUgRTwvc3Bhbj48L2Rpdj48L2ZvcmVpZ25PYmplY3Q+PC9nPjwvZz48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxOTQuODY3MTg3NSwgMjgyLjQ5MjE4NzUpIiBkYXRhLWlkPSJGIiBkYXRhLW5vZGU9InRydWUiIGlkPSJmbG93Y2hhcnQtRi04IiBjbGFzcz0ibm9kZSBkZWZhdWx0IGdyaWROb2RlIGZsb3djaGFydC1sYWJlbCI+PGNpcmNsZSBoZWlnaHQ9IjM0IiB3aWR0aD0iNzEuMDQ2ODc1IiByPSIzNS41MjM0Mzc1IiByeT0iMCIgcng9IjAiIHN0eWxlPSIiLz48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMjguMDIzNDM3NSwgLTkuNSkiIHN0eWxlPSIiIGNsYXNzPSJsYWJlbCI+PHJlY3QvPjxmb3JlaWduT2JqZWN0IGhlaWdodD0iMTkiIHdpZHRoPSI1Ni4wNDY4NzUiPjxkaXYgc3R5bGU9ImRpc3BsYXk6IGlubGluZS1ibG9jazsgd2hpdGUtc3BhY2U6IG5vd3JhcDsiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj48c3BhbiBjbGFzcz0ibm9kZUxhYmVsIj5Ob2RlIEY8L3NwYW4+PC9kaXY+PC9mb3JlaWduT2JqZWN0PjwvZz48L2c+PGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMTk0Ljg2NzE4NzUsIDQwNS4xNDA2MjUpIiBkYXRhLWlkPSJHIiBkYXRhLW5vZGU9InRydWUiIGlkPSJmbG93Y2hhcnQtRy05IiBjbGFzcz0ibm9kZSBkZWZhdWx0IGdyaWROb2RlIGZsb3djaGFydC1sYWJlbCI+PGNpcmNsZSBoZWlnaHQ9IjM0IiB3aWR0aD0iNzQuMjUiIHI9IjM3LjEyNSIgcnk9IjAiIHJ4PSIwIiBzdHlsZT0iIi8+PGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTI5LjYyNSwgLTkuNSkiIHN0eWxlPSIiIGNsYXNzPSJsYWJlbCI+PHJlY3QvPjxmb3JlaWduT2JqZWN0IGhlaWdodD0iMTkiIHdpZHRoPSI1OS4yNSI+PGRpdiBzdHlsZT0iZGlzcGxheTogaW5saW5lLWJsb2NrOyB3aGl0ZS1zcGFjZTogbm93cmFwOyIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPjxzcGFuIGNsYXNzPSJub2RlTGFiZWwiPk5vZGUgRzwvc3Bhbj48L2Rpdj48L2ZvcmVpZ25PYmplY3Q+PC9nPjwvZz48L2c+PC9nPjwvZz48L3N2Zz4="&gt;&lt;/p&gt;
&lt;h3 id="arbitrary-mesh-topology"&gt;Arbitrary Mesh Topology&lt;/h3&gt;
&lt;p&gt;Random interconnected pattern with no specific structure.&lt;/p&gt;
&lt;p&gt;&lt;img src="data:image/svg+xml;base64,PHN2ZyBhcmlhLXJvbGVkZXNjcmlwdGlvbj0iZmxvd2NoYXJ0LXYyIiByb2xlPSJncmFwaGljcy1kb2N1bWVudCBkb2N1bWVudCIgdmlld0JveD0iLTggLTggMjQ2Ljg0Mzk5NDE0MDYyNSA1NzguOTg0Mzc1IiBzdHlsZT0ibWF4LXdpZHRoOiAyNDYuODQ0cHg7IGJhY2tncm91bmQtY29sb3I6IHdoaXRlOyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjEwMCUiIGlkPSJteS1zdmciPjxzdHlsZT4jbXktc3Zne2ZvbnQtZmFtaWx5OiJ0cmVidWNoZXQgbXMiLHZlcmRhbmEsYXJpYWwsc2Fucy1zZXJpZjtmb250LXNpemU6MTZweDtmaWxsOiMzMzM7fSNteS1zdmcgLmVycm9yLWljb257ZmlsbDojNTUyMjIyO30jbXktc3ZnIC5lcnJvci10ZXh0e2ZpbGw6IzU1MjIyMjtzdHJva2U6IzU1MjIyMjt9I215LXN2ZyAuZWRnZS10aGlja25lc3Mtbm9ybWFse3N0cm9rZS13aWR0aDoycHg7fSNteS1zdmcgLmVkZ2UtdGhpY2tuZXNzLXRoaWNre3N0cm9rZS13aWR0aDozLjVweDt9I215LXN2ZyAuZWRnZS1wYXR0ZXJuLXNvbGlke3N0cm9rZS1kYXNoYXJyYXk6MDt9I215LXN2ZyAuZWRnZS1wYXR0ZXJuLWRhc2hlZHtzdHJva2UtZGFzaGFycmF5OjM7fSNteS1zdmcgLmVkZ2UtcGF0dGVybi1kb3R0ZWR7c3Ryb2tlLWRhc2hhcnJheToyO30jbXktc3ZnIC5tYXJrZXJ7ZmlsbDojMzMzMzMzO3N0cm9rZTojMzMzMzMzO30jbXktc3ZnIC5tYXJrZXIuY3Jvc3N7c3Ryb2tlOiMzMzMzMzM7fSNteS1zdmcgc3Zne2ZvbnQtZmFtaWx5OiJ0cmVidWNoZXQgbXMiLHZlcmRhbmEsYXJpYWwsc2Fucy1zZXJpZjtmb250LXNpemU6MTZweDt9I215LXN2ZyAubGFiZWx7Zm9udC1mYW1pbHk6InRyZWJ1Y2hldCBtcyIsdmVyZGFuYSxhcmlhbCxzYW5zLXNlcmlmO2NvbG9yOiMzMzM7fSNteS1zdmcgLmNsdXN0ZXItbGFiZWwgdGV4dHtmaWxsOiMzMzM7fSNteS1zdmcgLmNsdXN0ZXItbGFiZWwgc3BhbiwjbXktc3ZnIHB7Y29sb3I6IzMzMzt9I215LXN2ZyAubGFiZWwgdGV4dCwjbXktc3ZnIHNwYW4sI215LXN2ZyBwe2ZpbGw6IzMzMztjb2xvcjojMzMzO30jbXktc3ZnIC5ub2RlIHJlY3QsI215LXN2ZyAubm9kZSBjaXJjbGUsI215LXN2ZyAubm9kZSBlbGxpcHNlLCNteS1zdmcgLm5vZGUgcG9seWdvbiwjbXktc3ZnIC5ub2RlIHBhdGh7ZmlsbDojRUNFQ0ZGO3N0cm9rZTojOTM3MERCO3N0cm9rZS13aWR0aDoxcHg7fSNteS1zdmcgLmZsb3djaGFydC1sYWJlbCB0ZXh0e3RleHQtYW5jaG9yOm1pZGRsZTt9I215LXN2ZyAubm9kZSAua2F0ZXggcGF0aHtmaWxsOiMwMDA7c3Ryb2tlOiMwMDA7c3Ryb2tlLXdpZHRoOjFweDt9I215LXN2ZyAubm9kZSAubGFiZWx7dGV4dC1hbGlnbjpjZW50ZXI7fSNteS1zdmcgLm5vZGUuY2xpY2thYmxle2N1cnNvcjpwb2ludGVyO30jbXktc3ZnIC5hcnJvd2hlYWRQYXRoe2ZpbGw6IzMzMzMzMzt9I215LXN2ZyAuZWRnZVBhdGggLnBhdGh7c3Ryb2tlOiMzMzMzMzM7c3Ryb2tlLXdpZHRoOjIuMHB4O30jbXktc3ZnIC5mbG93Y2hhcnQtbGlua3tzdHJva2U6IzMzMzMzMztmaWxsOm5vbmU7fSNteS1zdmcgLmVkZ2VMYWJlbHtiYWNrZ3JvdW5kLWNvbG9yOiNlOGU4ZTg7dGV4dC1hbGlnbjpjZW50ZXI7fSNteS1zdmcgLmVkZ2VMYWJlbCByZWN0e29wYWNpdHk6MC41O2JhY2tncm91bmQtY29sb3I6I2U4ZThlODtmaWxsOiNlOGU4ZTg7fSNteS1zdmcgLmxhYmVsQmtne2JhY2tncm91bmQtY29sb3I6cmdiYSgyMzIsIDIzMiwgMjMyLCAwLjUpO30jbXktc3ZnIC5jbHVzdGVyIHJlY3R7ZmlsbDojZmZmZmRlO3N0cm9rZTojYWFhYTMzO3N0cm9rZS13aWR0aDoxcHg7fSNteS1zdmcgLmNsdXN0ZXIgdGV4dHtmaWxsOiMzMzM7fSNteS1zdmcgLmNsdXN0ZXIgc3BhbiwjbXktc3ZnIHB7Y29sb3I6IzMzMzt9I215LXN2ZyBkaXYubWVybWFpZFRvb2x0aXB7cG9zaXRpb246YWJzb2x1dGU7dGV4dC1hbGlnbjpjZW50ZXI7bWF4LXdpZHRoOjIwMHB4O3BhZGRpbmc6MnB4O2ZvbnQtZmFtaWx5OiJ0cmVidWNoZXQgbXMiLHZlcmRhbmEsYXJpYWwsc2Fucy1zZXJpZjtmb250LXNpemU6MTJweDtiYWNrZ3JvdW5kOmhzbCg4MCwgMTAwJSwgOTYuMjc0NTA5ODAzOSUpO2JvcmRlcjoxcHggc29saWQgI2FhYWEzMztib3JkZXItcmFkaXVzOjJweDtwb2ludGVyLWV2ZW50czpub25lO3otaW5kZXg6MTAwO30jbXktc3ZnIC5mbG93Y2hhcnRUaXRsZVRleHR7dGV4dC1hbmNob3I6bWlkZGxlO2ZvbnQtc2l6ZToxOHB4O2ZpbGw6IzMzMzt9I215LXN2ZyA6cm9vdHstLW1lcm1haWQtZm9udC1mYW1pbHk6InRyZWJ1Y2hldCBtcyIsdmVyZGFuYSxhcmlhbCxzYW5zLXNlcmlmO30jbXktc3ZnIC5tZXNoTm9kZSZndDsqe2ZpbGw6IzdBOTc2QiFpbXBvcnRhbnQ7c3Ryb2tlOiMxQjNEMkYhaW1wb3J0YW50O3N0cm9rZS13aWR0aDoycHghaW1wb3J0YW50O30jbXktc3ZnIC5tZXNoTm9kZSBzcGFue2ZpbGw6IzdBOTc2QiFpbXBvcnRhbnQ7c3Ryb2tlOiMxQjNEMkYhaW1wb3J0YW50O3N0cm9rZS13aWR0aDoycHghaW1wb3J0YW50O308L3N0eWxlPjxnPjxtYXJrZXIgb3JpZW50PSJhdXRvIiBtYXJrZXJIZWlnaHQ9IjEyIiBtYXJrZXJXaWR0aD0iMTIiIG1hcmtlclVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgcmVmWT0iNSIgcmVmWD0iNiIgdmlld0JveD0iMCAwIDEwIDEwIiBjbGFzcz0ibWFya2VyIGZsb3djaGFydCIgaWQ9Im15LXN2Z19mbG93Y2hhcnQtcG9pbnRFbmQiPjxwYXRoIHN0eWxlPSJzdHJva2Utd2lkdGg6IDE7IHN0cm9rZS1kYXNoYXJyYXk6IDEsIDA7IiBjbGFzcz0iYXJyb3dNYXJrZXJQYXRoIiBkPSJNIDAgMCBMIDEwIDUgTCAwIDEwIHoiLz48L21hcmtlcj48bWFya2VyIG9yaWVudD0iYXV0byIgbWFya2VySGVpZ2h0PSIxMiIgbWFya2VyV2lkdGg9IjEyIiBtYXJrZXJVbml0cz0idXNlclNwYWNlT25Vc2UiIHJlZlk9IjUiIHJlZlg9IjQuNSIgdmlld0JveD0iMCAwIDEwIDEwIiBjbGFzcz0ibWFya2VyIGZsb3djaGFydCIgaWQ9Im15LXN2Z19mbG93Y2hhcnQtcG9pbnRTdGFydCI+PHBhdGggc3R5bGU9InN0cm9rZS13aWR0aDogMTsgc3Ryb2tlLWRhc2hhcnJheTogMSwgMDsiIGNsYXNzPSJhcnJvd01hcmtlclBhdGgiIGQ9Ik0gMCA1IEwgMTAgMTAgTCAxMCAwIHoiLz48L21hcmtlcj48bWFya2VyIG9yaWVudD0iYXV0byIgbWFya2VySGVpZ2h0PSIxMSIgbWFya2VyV2lkdGg9IjExIiBtYXJrZXJVbml0cz0idXNlclNwYWNlT25Vc2UiIHJlZlk9IjUiIHJlZlg9IjExIiB2aWV3Qm94PSIwIDAgMTAgMTAiIGNsYXNzPSJtYXJrZXIgZmxvd2NoYXJ0IiBpZD0ibXktc3ZnX2Zsb3djaGFydC1jaXJjbGVFbmQiPjxjaXJjbGUgc3R5bGU9InN0cm9rZS13aWR0aDogMTsgc3Ryb2tlLWRhc2hhcnJheTogMSwgMDsiIGNsYXNzPSJhcnJvd01hcmtlclBhdGgiIHI9IjUiIGN5PSI1IiBjeD0iNSIvPjwvbWFya2VyPjxtYXJrZXIgb3JpZW50PSJhdXRvIiBtYXJrZXJIZWlnaHQ9IjExIiBtYXJrZXJXaWR0aD0iMTEiIG1hcmtlclVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgcmVmWT0iNSIgcmVmWD0iLTEiIHZpZXdCb3g9IjAgMCAxMCAxMCIgY2xhc3M9Im1hcmtlciBmbG93Y2hhcnQiIGlkPSJteS1zdmdfZmxvd2NoYXJ0LWNpcmNsZVN0YXJ0Ij48Y2lyY2xlIHN0eWxlPSJzdHJva2Utd2lkdGg6IDE7IHN0cm9rZS1kYXNoYXJyYXk6IDEsIDA7IiBjbGFzcz0iYXJyb3dNYXJrZXJQYXRoIiByPSI1IiBjeT0iNSIgY3g9IjUiLz48L21hcmtlcj48bWFya2VyIG9yaWVudD0iYXV0byIgbWFya2VySGVpZ2h0PSIxMSIgbWFya2VyV2lkdGg9IjExIiBtYXJrZXJVbml0cz0idXNlclNwYWNlT25Vc2UiIHJlZlk9IjUuMiIgcmVmWD0iMTIiIHZpZXdCb3g9IjAgMCAxMSAxMSIgY2xhc3M9Im1hcmtlciBjcm9zcyBmbG93Y2hhcnQiIGlkPSJteS1zdmdfZmxvd2NoYXJ0LWNyb3NzRW5kIj48cGF0aCBzdHlsZT0ic3Ryb2tlLXdpZHRoOiAyOyBzdHJva2UtZGFzaGFycmF5OiAxLCAwOyIgY2xhc3M9ImFycm93TWFya2VyUGF0aCIgZD0iTSAxLDEgbCA5LDkgTSAxMCwxIGwgLTksOSIvPjwvbWFya2VyPjxtYXJrZXIgb3JpZW50PSJhdXRvIiBtYXJrZXJIZWlnaHQ9IjExIiBtYXJrZXJXaWR0aD0iMTEiIG1hcmtlclVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgcmVmWT0iNS4yIiByZWZYPSItMSIgdmlld0JveD0iMCAwIDExIDExIiBjbGFzcz0ibWFya2VyIGNyb3NzIGZsb3djaGFydCIgaWQ9Im15LXN2Z19mbG93Y2hhcnQtY3Jvc3NTdGFydCI+PHBhdGggc3R5bGU9InN0cm9rZS13aWR0aDogMjsgc3Ryb2tlLWRhc2hhcnJheTogMSwgMDsiIGNsYXNzPSJhcnJvd01hcmtlclBhdGgiIGQ9Ik0gMSwxIGwgOSw5IE0gMTAsMSBsIC05LDkiLz48L21hcmtlcj48ZyBjbGFzcz0icm9vdCI+PGcgY2xhc3M9ImNsdXN0ZXJzIi8+PGcgY2xhc3M9ImVkZ2VQYXRocyI+PHBhdGggc3R5bGU9ImZpbGw6bm9uZTsiIGNsYXNzPSJlZGdlLXRoaWNrbmVzcy1ub3JtYWwgZWRnZS1wYXR0ZXJuLXNvbGlkIGZsb3djaGFydC1saW5rIExTLUEgTEUtQiIgaWQ9IkwtQS1CLTAiIGQ9Ik0xMjYuNzc0LDUyLjY2M0wxMTEuNzE0LDYwLjE4NUM5Ni42NTQsNjcuNzA4LDY2LjUzNCw4Mi43NTIsNTEuNDc0LDk0LjQ1N0MzNi40MTQsMTA2LjE2MSwzNi40MTQsMTE0LjUyNiwzNi40MTQsMTE4LjcwOEwzNi40MTQsMTIyLjg5MSIvPjxwYXRoIHN0eWxlPSJmaWxsOm5vbmU7IiBjbGFzcz0iZWRnZS10aGlja25lc3Mtbm9ybWFsIGVkZ2UtcGF0dGVybi1zb2xpZCBmbG93Y2hhcnQtbGluayBMUy1BIExFLUMiIGlkPSJMLUEtQy0wIiBkPSJNMTU5LjMzNiw3Mi43OTdMMTU5LjMzNiw3Ni45NjRDMTU5LjMzNiw4MS4xMywxNTkuMzM2LDg5LjQ2NCwxNTkuMzM2LDk3Ljc5N0MxNTkuMzM2LDEwNi4xMywxNTkuMzM2LDExNC40NjQsMTU5LjMzNiwxMTguNjNMMTU5LjMzNiwxMjIuNzk3Ii8+PHBhdGggc3R5bGU9ImZpbGw6bm9uZTsiIGNsYXNzPSJlZGdlLXRoaWNrbmVzcy1ub3JtYWwgZWRnZS1wYXR0ZXJuLXNvbGlkIGZsb3djaGFydC1saW5rIExTLUEgTEUtRSIgaWQ9IkwtQS1FLTAiIGQ9Ik0xODYuOTUxLDYwLjExTDE5NC4yNjcsNjYuMzkxQzIwMS41ODIsNzIuNjcyLDIxNi4yMTMsODUuMjM1LDIyMy41MjgsMTAxLjc2N0MyMzAuODQ0LDExOC4yOTksMjMwLjg0NCwxMzguODAyLDIzMC44NDQsMTU5LjMwNUMyMzAuODQ0LDE3OS44MDcsMjMwLjg0NCwyMDAuMzEsMjMwLjg0NCwyMjAuOTA5QzIzMC44NDQsMjQxLjUwOCwyMzAuODQ0LDI2Mi4yMDMsMjMwLjg0NCwyODIuODk4QzIzMC44NDQsMzAzLjU5NCwyMzAuODQ0LDMyNC4yODksMjA1Ljc5OCwzNDIuOTE3QzE4MC43NTMsMzYxLjU0NSwxMzAuNjYzLDM3OC4xMDYsMTA1LjYxNywzODYuMzg3TDgwLjU3MiwzOTQuNjY4Ii8+PHBhdGggc3R5bGU9ImZpbGw6bm9uZTsiIGNsYXNzPSJlZGdlLXRoaWNrbmVzcy1ub3JtYWwgZWRnZS1wYXR0ZXJuLXNvbGlkIGZsb3djaGFydC1saW5rIExTLUIgTEUtRCIgaWQ9IkwtQi1ELTAiIGQ9Ik0zNi40MTQsMTk1LjcxOUwzNi40MTQsMTk5LjkwMUMzNi40MTQsMjA0LjA4MywzNi40MTQsMjEyLjQ0OCwzNy4wOTgsMjIwLjg3NkMzNy43ODIsMjI5LjMwMywzOS4xNDksMjM3Ljc5NCwzOS44MzMsMjQyLjAzOUw0MC41MTcsMjQ2LjI4NCIvPjxwYXRoIHN0eWxlPSJmaWxsOm5vbmU7IiBjbGFzcz0iZWRnZS10aGlja25lc3Mtbm9ybWFsIGVkZ2UtcGF0dGVybi1zb2xpZCBmbG93Y2hhcnQtbGluayBMUy1DIExFLUQiIGlkPSJMLUMtRC0wIiBkPSJNMTM1LjkwOSwxODcuMzA1TDEzMS4yMzcsMTkyLjg5QzEyNi41NjUsMTk4LjQ3NCwxMTcuMjIsMjA5LjY0MywxMDYuNjUyLDIyMS4xODNDOTYuMDg1LDIzMi43MjIsODQuMjk1LDI0NC42MzIsNzguNCwyNTAuNTg3TDcyLjUwNSwyNTYuNTQyIi8+PHBhdGggc3R5bGU9ImZpbGw6bm9uZTsiIGNsYXNzPSJlZGdlLXRoaWNrbmVzcy1ub3JtYWwgZWRnZS1wYXR0ZXJuLXNvbGlkIGZsb3djaGFydC1saW5rIExTLUMgTEUtRiIgaWQ9IkwtQy1GLTAiIGQ9Ik0xNzMuNDM2LDE5Mi45OEwxNzUuMzc4LDE5Ny42MTlDMTc3LjMyMSwyMDIuMjU3LDE4MS4yMDUsMjExLjUzNSwxODMuMTQ4LDIyNi41MjFDMTg1LjA5LDI0MS41MDgsMTg1LjA5LDI2Mi4yMDMsMTg1LjA5LDI4Mi44OThDMTg1LjA5LDMwMy41OTQsMTg1LjA5LDMyNC4yODksMTg1LjA5LDM0NC43OTlDMTg1LjA5LDM2NS4zMSwxODUuMDksMzg1LjYzNSwxODUuMDksNDA1Ljk2MUMxODUuMDksNDI2LjI4NiwxODUuMDksNDQ2LjYxMiwxNzUuNDE4LDQ2My40ODdDMTY1Ljc0Niw0ODAuMzYxLDE0Ni40MDMsNDkzLjc4NSwxMzYuNzMxLDUwMC40OTZMMTI3LjA2LDUwNy4yMDgiLz48cGF0aCBzdHlsZT0iZmlsbDpub25lOyIgY2xhc3M9ImVkZ2UtdGhpY2tuZXNzLW5vcm1hbCBlZGdlLXBhdHRlcm4tc29saWQgZmxvd2NoYXJ0LWxpbmsgTFMtRCBMRS1FIiBpZD0iTC1ELUUtMCIgZD0iTTQ2LjQxNCwzMTkuOTg0TDQ2LjQxNCwzMjQuMTUxQzQ2LjQxNCwzMjguMzE4LDQ2LjQxNCwzMzYuNjUxLDQ2LjQxNCwzNDQuOTg0QzQ2LjQxNCwzNTMuMzE4LDQ2LjQxNCwzNjEuNjUxLDQ2LjQxNCwzNjUuODE4TDQ2LjQxNCwzNjkuOTg0Ii8+PHBhdGggc3R5bGU9ImZpbGw6bm9uZTsiIGNsYXNzPSJlZGdlLXRoaWNrbmVzcy1ub3JtYWwgZWRnZS1wYXR0ZXJuLXNvbGlkIGZsb3djaGFydC1saW5rIExTLUUgTEUtRiIgaWQ9IkwtRS1GLTAiIGQ9Ik00Ni40MTQsNDQxLjkzOEw0Ni40MTQsNDQ2LjEwNEM0Ni40MTQsNDUwLjI3MSw0Ni40MTQsNDU4LjYwNCw1MS4xNTYsNDY4LjM0OEM1NS44OTcsNDc4LjA5MSw2NS4zODEsNDg5LjI0NCw3MC4xMjIsNDk0LjgyMUw3NC44NjQsNTAwLjM5OCIvPjwvZz48ZyBjbGFzcz0iZWRnZUxhYmVscyI+PGcgY2xhc3M9ImVkZ2VMYWJlbCI+PGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCwgMCkiIGNsYXNzPSJsYWJlbCI+PGZvcmVpZ25PYmplY3QgaGVpZ2h0PSIwIiB3aWR0aD0iMCI+PGRpdiBzdHlsZT0iZGlzcGxheTogaW5saW5lLWJsb2NrOyB3aGl0ZS1zcGFjZTogbm93cmFwOyIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPjxzcGFuIGNsYXNzPSJlZGdlTGFiZWwiPjwvc3Bhbj48L2Rpdj48L2ZvcmVpZ25PYmplY3Q+PC9nPjwvZz48ZyBjbGFzcz0iZWRnZUxhYmVsIj48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLCAwKSIgY2xhc3M9ImxhYmVsIj48Zm9yZWlnbk9iamVjdCBoZWlnaHQ9IjAiIHdpZHRoPSIwIj48ZGl2IHN0eWxlPSJkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IHdoaXRlLXNwYWNlOiBub3dyYXA7IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+PHNwYW4gY2xhc3M9ImVkZ2VMYWJlbCI+PC9zcGFuPjwvZGl2PjwvZm9yZWlnbk9iamVjdD48L2c+PC9nPjxnIGNsYXNzPSJlZGdlTGFiZWwiPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAsIDApIiBjbGFzcz0ibGFiZWwiPjxmb3JlaWduT2JqZWN0IGhlaWdodD0iMCIgd2lkdGg9IjAiPjxkaXYgc3R5bGU9ImRpc3BsYXk6IGlubGluZS1ibG9jazsgd2hpdGUtc3BhY2U6IG5vd3JhcDsiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj48c3BhbiBjbGFzcz0iZWRnZUxhYmVsIj48L3NwYW4+PC9kaXY+PC9mb3JlaWduT2JqZWN0PjwvZz48L2c+PGcgY2xhc3M9ImVkZ2VMYWJlbCI+PGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCwgMCkiIGNsYXNzPSJsYWJlbCI+PGZvcmVpZ25PYmplY3QgaGVpZ2h0PSIwIiB3aWR0aD0iMCI+PGRpdiBzdHlsZT0iZGlzcGxheTogaW5saW5lLWJsb2NrOyB3aGl0ZS1zcGFjZTogbm93cmFwOyIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPjxzcGFuIGNsYXNzPSJlZGdlTGFiZWwiPjwvc3Bhbj48L2Rpdj48L2ZvcmVpZ25PYmplY3Q+PC9nPjwvZz48ZyBjbGFzcz0iZWRnZUxhYmVsIj48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLCAwKSIgY2xhc3M9ImxhYmVsIj48Zm9yZWlnbk9iamVjdCBoZWlnaHQ9IjAiIHdpZHRoPSIwIj48ZGl2IHN0eWxlPSJkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IHdoaXRlLXNwYWNlOiBub3dyYXA7IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+PHNwYW4gY2xhc3M9ImVkZ2VMYWJlbCI+PC9zcGFuPjwvZGl2PjwvZm9yZWlnbk9iamVjdD48L2c+PC9nPjxnIGNsYXNzPSJlZGdlTGFiZWwiPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAsIDApIiBjbGFzcz0ibGFiZWwiPjxmb3JlaWduT2JqZWN0IGhlaWdodD0iMCIgd2lkdGg9IjAiPjxkaXYgc3R5bGU9ImRpc3BsYXk6IGlubGluZS1ibG9jazsgd2hpdGUtc3BhY2U6IG5vd3JhcDsiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj48c3BhbiBjbGFzcz0iZWRnZUxhYmVsIj48L3NwYW4+PC9kaXY+PC9mb3JlaWduT2JqZWN0PjwvZz48L2c+PGcgY2xhc3M9ImVkZ2VMYWJlbCI+PGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCwgMCkiIGNsYXNzPSJsYWJlbCI+PGZvcmVpZ25PYmplY3QgaGVpZ2h0PSIwIiB3aWR0aD0iMCI+PGRpdiBzdHlsZT0iZGlzcGxheTogaW5saW5lLWJsb2NrOyB3aGl0ZS1zcGFjZTogbm93cmFwOyIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPjxzcGFuIGNsYXNzPSJlZGdlTGFiZWwiPjwvc3Bhbj48L2Rpdj48L2ZvcmVpZ25PYmplY3Q+PC9nPjwvZz48ZyBjbGFzcz0iZWRnZUxhYmVsIj48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLCAwKSIgY2xhc3M9ImxhYmVsIj48Zm9yZWlnbk9iamVjdCBoZWlnaHQ9IjAiIHdpZHRoPSIwIj48ZGl2IHN0eWxlPSJkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IHdoaXRlLXNwYWNlOiBub3dyYXA7IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+PHNwYW4gY2xhc3M9ImVkZ2VMYWJlbCI+PC9zcGFuPjwvZGl2PjwvZm9yZWlnbk9iamVjdD48L2c+PC9nPjwvZz48ZyBjbGFzcz0ibm9kZXMiPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDE1OS4zMzU5Mzc1LCAzNi4zOTg0Mzc1KSIgZGF0YS1pZD0iQSIgZGF0YS1ub2RlPSJ0cnVlIiBpZD0iZmxvd2NoYXJ0LUEtMCIgY2xhc3M9Im5vZGUgZGVmYXVsdCBtZXNoTm9kZSBmbG93Y2hhcnQtbGFiZWwiPjxjaXJjbGUgaGVpZ2h0PSIzNCIgd2lkdGg9IjcyLjc5Njg3NSIgcj0iMzYuMzk4NDM3NSIgcnk9IjAiIHJ4PSIwIiBzdHlsZT0iIi8+PGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTI4Ljg5ODQzNzUsIC05LjUpIiBzdHlsZT0iIiBjbGFzcz0ibGFiZWwiPjxyZWN0Lz48Zm9yZWlnbk9iamVjdCBoZWlnaHQ9IjE5IiB3aWR0aD0iNTcuNzk2ODc1Ij48ZGl2IHN0eWxlPSJkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IHdoaXRlLXNwYWNlOiBub3dyYXA7IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+PHNwYW4gY2xhc3M9Im5vZGVMYWJlbCI+Tm9kZSBBPC9zcGFuPjwvZGl2PjwvZm9yZWlnbk9iamVjdD48L2c+PC9nPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDM2LjQxNDA2MjUsIDE1OS4zMDQ2ODc1KSIgZGF0YS1pZD0iQiIgZGF0YS1ub2RlPSJ0cnVlIiBpZD0iZmxvd2NoYXJ0LUItMSIgY2xhc3M9Im5vZGUgZGVmYXVsdCBtZXNoTm9kZSBmbG93Y2hhcnQtbGFiZWwiPjxjaXJjbGUgaGVpZ2h0PSIzNCIgd2lkdGg9IjcyLjgyODEyNSIgcj0iMzYuNDE0MDYyNSIgcnk9IjAiIHJ4PSIwIiBzdHlsZT0iIi8+PGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTI4LjkxNDA2MjUsIC05LjUpIiBzdHlsZT0iIiBjbGFzcz0ibGFiZWwiPjxyZWN0Lz48Zm9yZWlnbk9iamVjdCBoZWlnaHQ9IjE5IiB3aWR0aD0iNTcuODI4MTI1Ij48ZGl2IHN0eWxlPSJkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IHdoaXRlLXNwYWNlOiBub3dyYXA7IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+PHNwYW4gY2xhc3M9Im5vZGVMYWJlbCI+Tm9kZSBCPC9zcGFuPjwvZGl2PjwvZm9yZWlnbk9iamVjdD48L2c+PC9nPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDE1OS4zMzU5Mzc1LCAxNTkuMzA0Njg3NSkiIGRhdGEtaWQ9IkMiIGRhdGEtbm9kZT0idHJ1ZSIgaWQ9ImZsb3djaGFydC1DLTMiIGNsYXNzPSJub2RlIGRlZmF1bHQgbWVzaE5vZGUgZmxvd2NoYXJ0LWxhYmVsIj48Y2lyY2xlIGhlaWdodD0iMzQiIHdpZHRoPSI3My4wMTU2MjUiIHI9IjM2LjUwNzgxMjUiIHJ5PSIwIiByeD0iMCIgc3R5bGU9IiIvPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yOS4wMDc4MTI1LCAtOS41KSIgc3R5bGU9IiIgY2xhc3M9ImxhYmVsIj48cmVjdC8+PGZvcmVpZ25PYmplY3QgaGVpZ2h0PSIxOSIgd2lkdGg9IjU4LjAxNTYyNSI+PGRpdiBzdHlsZT0iZGlzcGxheTogaW5saW5lLWJsb2NrOyB3aGl0ZS1zcGFjZTogbm93cmFwOyIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPjxzcGFuIGNsYXNzPSJub2RlTGFiZWwiPk5vZGUgQzwvc3Bhbj48L2Rpdj48L2ZvcmVpZ25PYmplY3Q+PC9nPjwvZz48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSg0Ni40MTQwNjI1LCA0MDUuOTYwOTM3NSkiIGRhdGEtaWQ9IkUiIGRhdGEtbm9kZT0idHJ1ZSIgaWQ9ImZsb3djaGFydC1FLTUiIGNsYXNzPSJub2RlIGRlZmF1bHQgbWVzaE5vZGUgZmxvd2NoYXJ0LWxhYmVsIj48Y2lyY2xlIGhlaWdodD0iMzQiIHdpZHRoPSI3MS45NTMxMjUiIHI9IjM1Ljk3NjU2MjUiIHJ5PSIwIiByeD0iMCIgc3R5bGU9IiIvPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yOC40NzY1NjI1LCAtOS41KSIgc3R5bGU9IiIgY2xhc3M9ImxhYmVsIj48cmVjdC8+PGZvcmVpZ25PYmplY3QgaGVpZ2h0PSIxOSIgd2lkdGg9IjU2Ljk1MzEyNSI+PGRpdiBzdHlsZT0iZGlzcGxheTogaW5saW5lLWJsb2NrOyB3aGl0ZS1zcGFjZTogbm93cmFwOyIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPjxzcGFuIGNsYXNzPSJub2RlTGFiZWwiPk5vZGUgRTwvc3Bhbj48L2Rpdj48L2ZvcmVpZ25PYmplY3Q+PC9nPjwvZz48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSg0Ni40MTQwNjI1LCAyODIuODk4NDM3NSkiIGRhdGEtaWQ9IkQiIGRhdGEtbm9kZT0idHJ1ZSIgaWQ9ImZsb3djaGFydC1ELTciIGNsYXNzPSJub2RlIGRlZmF1bHQgbWVzaE5vZGUgZmxvd2NoYXJ0LWxhYmVsIj48Y2lyY2xlIGhlaWdodD0iMzQiIHdpZHRoPSI3NC4xNzE4NzUiIHI9IjM3LjA4NTkzNzUiIHJ5PSIwIiByeD0iMCIgc3R5bGU9IiIvPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yOS41ODU5Mzc1LCAtOS41KSIgc3R5bGU9IiIgY2xhc3M9ImxhYmVsIj48cmVjdC8+PGZvcmVpZ25PYmplY3QgaGVpZ2h0PSIxOSIgd2lkdGg9IjU5LjE3MTg3NSI+PGRpdiBzdHlsZT0iZGlzcGxheTogaW5saW5lLWJsb2NrOyB3aGl0ZS1zcGFjZTogbm93cmFwOyIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPjxzcGFuIGNsYXNzPSJub2RlTGFiZWwiPk5vZGUgRDwvc3Bhbj48L2Rpdj48L2ZvcmVpZ25PYmplY3Q+PC9nPjwvZz48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSg5Ny44NzUsIDUyNy40NjA5Mzc1KSIgZGF0YS1pZD0iRiIgZGF0YS1ub2RlPSJ0cnVlIiBpZD0iZmxvd2NoYXJ0LUYtMTEiIGNsYXNzPSJub2RlIGRlZmF1bHQgbWVzaE5vZGUgZmxvd2NoYXJ0LWxhYmVsIj48Y2lyY2xlIGhlaWdodD0iMzQiIHdpZHRoPSI3MS4wNDY4NzUiIHI9IjM1LjUyMzQzNzUiIHJ5PSIwIiByeD0iMCIgc3R5bGU9IiIvPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yOC4wMjM0Mzc1LCAtOS41KSIgc3R5bGU9IiIgY2xhc3M9ImxhYmVsIj48cmVjdC8+PGZvcmVpZ25PYmplY3QgaGVpZ2h0PSIxOSIgd2lkdGg9IjU2LjA0Njg3NSI+PGRpdiBzdHlsZT0iZGlzcGxheTogaW5saW5lLWJsb2NrOyB3aGl0ZS1zcGFjZTogbm93cmFwOyIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPjxzcGFuIGNsYXNzPSJub2RlTGFiZWwiPk5vZGUgRjwvc3Bhbj48L2Rpdj48L2ZvcmVpZ25PYmplY3Q+PC9nPjwvZz48L2c+PC9nPjwvZz48L3N2Zz4="&gt;&lt;/p&gt;
&lt;h2 id="real-world-applications"&gt;Real-World Applications&lt;/h2&gt;
&lt;p&gt;Graphs have countless real-world applications across different domains:&lt;/p&gt;
&lt;h3 id="literature-analysis"&gt;Literature Analysis&lt;/h3&gt;
&lt;p&gt;In literature analysis, graphs can represent character interactions. For example, in "Les Misérables," nodes represent characters and edges show interactions between them, revealing the structure of relationships within the novel.&lt;/p&gt;
&lt;h3 id="movie-plot-mapping"&gt;Movie Plot Mapping&lt;/h3&gt;
&lt;p&gt;Similar to books, graphs can be used to visualize character interactions in films. For instance, in "The Imitation Game," a graph could show relationships between Alan Turing and other characters, highlighting the central role of certain individuals.&lt;/p&gt;
&lt;h3 id="computer-networks"&gt;Computer Networks&lt;/h3&gt;
&lt;p&gt;In computer networks, nodes represent routers or computers, while edges represent communication links. The 1991 NSFNET (National Science Foundation Network) backbone can be visualized as a graph showing the early structure of what would become the internet.&lt;/p&gt;
&lt;h3 id="social-networks"&gt;Social Networks&lt;/h3&gt;
&lt;p&gt;Social media platforms use graph theory extensively. Nodes represent people, and edges indicate friendships or following relationships. This helps identify communities, influential users, and information flow patterns.&lt;/p&gt;
&lt;p&gt;&lt;img src="data:image/svg+xml;base64,PHN2ZyBhcmlhLXJvbGVkZXNjcmlwdGlvbj0iZmxvd2NoYXJ0LXYyIiByb2xlPSJncmFwaGljcy1kb2N1bWVudCBkb2N1bWVudCIgdmlld0JveD0iLTggLTggMTk4LjA4NTkzNzUgNzcwLjA3ODEyNSIgc3R5bGU9Im1heC13aWR0aDogMTk4LjA4NnB4OyBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTsiIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMDAlIiBpZD0ibXktc3ZnIj48c3R5bGU+I215LXN2Z3tmb250LWZhbWlseToidHJlYnVjaGV0IG1zIix2ZXJkYW5hLGFyaWFsLHNhbnMtc2VyaWY7Zm9udC1zaXplOjE2cHg7ZmlsbDojMzMzO30jbXktc3ZnIC5lcnJvci1pY29ue2ZpbGw6IzU1MjIyMjt9I215LXN2ZyAuZXJyb3ItdGV4dHtmaWxsOiM1NTIyMjI7c3Ryb2tlOiM1NTIyMjI7fSNteS1zdmcgLmVkZ2UtdGhpY2tuZXNzLW5vcm1hbHtzdHJva2Utd2lkdGg6MnB4O30jbXktc3ZnIC5lZGdlLXRoaWNrbmVzcy10aGlja3tzdHJva2Utd2lkdGg6My41cHg7fSNteS1zdmcgLmVkZ2UtcGF0dGVybi1zb2xpZHtzdHJva2UtZGFzaGFycmF5OjA7fSNteS1zdmcgLmVkZ2UtcGF0dGVybi1kYXNoZWR7c3Ryb2tlLWRhc2hhcnJheTozO30jbXktc3ZnIC5lZGdlLXBhdHRlcm4tZG90dGVke3N0cm9rZS1kYXNoYXJyYXk6Mjt9I215LXN2ZyAubWFya2Vye2ZpbGw6IzMzMzMzMztzdHJva2U6IzMzMzMzMzt9I215LXN2ZyAubWFya2VyLmNyb3Nze3N0cm9rZTojMzMzMzMzO30jbXktc3ZnIHN2Z3tmb250LWZhbWlseToidHJlYnVjaGV0IG1zIix2ZXJkYW5hLGFyaWFsLHNhbnMtc2VyaWY7Zm9udC1zaXplOjE2cHg7fSNteS1zdmcgLmxhYmVse2ZvbnQtZmFtaWx5OiJ0cmVidWNoZXQgbXMiLHZlcmRhbmEsYXJpYWwsc2Fucy1zZXJpZjtjb2xvcjojMzMzO30jbXktc3ZnIC5jbHVzdGVyLWxhYmVsIHRleHR7ZmlsbDojMzMzO30jbXktc3ZnIC5jbHVzdGVyLWxhYmVsIHNwYW4sI215LXN2ZyBwe2NvbG9yOiMzMzM7fSNteS1zdmcgLmxhYmVsIHRleHQsI215LXN2ZyBzcGFuLCNteS1zdmcgcHtmaWxsOiMzMzM7Y29sb3I6IzMzMzt9I215LXN2ZyAubm9kZSByZWN0LCNteS1zdmcgLm5vZGUgY2lyY2xlLCNteS1zdmcgLm5vZGUgZWxsaXBzZSwjbXktc3ZnIC5ub2RlIHBvbHlnb24sI215LXN2ZyAubm9kZSBwYXRoe2ZpbGw6I0VDRUNGRjtzdHJva2U6IzkzNzBEQjtzdHJva2Utd2lkdGg6MXB4O30jbXktc3ZnIC5mbG93Y2hhcnQtbGFiZWwgdGV4dHt0ZXh0LWFuY2hvcjptaWRkbGU7fSNteS1zdmcgLm5vZGUgLmthdGV4IHBhdGh7ZmlsbDojMDAwO3N0cm9rZTojMDAwO3N0cm9rZS13aWR0aDoxcHg7fSNteS1zdmcgLm5vZGUgLmxhYmVse3RleHQtYWxpZ246Y2VudGVyO30jbXktc3ZnIC5ub2RlLmNsaWNrYWJsZXtjdXJzb3I6cG9pbnRlcjt9I215LXN2ZyAuYXJyb3doZWFkUGF0aHtmaWxsOiMzMzMzMzM7fSNteS1zdmcgLmVkZ2VQYXRoIC5wYXRoe3N0cm9rZTojMzMzMzMzO3N0cm9rZS13aWR0aDoyLjBweDt9I215LXN2ZyAuZmxvd2NoYXJ0LWxpbmt7c3Ryb2tlOiMzMzMzMzM7ZmlsbDpub25lO30jbXktc3ZnIC5lZGdlTGFiZWx7YmFja2dyb3VuZC1jb2xvcjojZThlOGU4O3RleHQtYWxpZ246Y2VudGVyO30jbXktc3ZnIC5lZGdlTGFiZWwgcmVjdHtvcGFjaXR5OjAuNTtiYWNrZ3JvdW5kLWNvbG9yOiNlOGU4ZTg7ZmlsbDojZThlOGU4O30jbXktc3ZnIC5sYWJlbEJrZ3tiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjMyLCAyMzIsIDIzMiwgMC41KTt9I215LXN2ZyAuY2x1c3RlciByZWN0e2ZpbGw6I2ZmZmZkZTtzdHJva2U6I2FhYWEzMztzdHJva2Utd2lkdGg6MXB4O30jbXktc3ZnIC5jbHVzdGVyIHRleHR7ZmlsbDojMzMzO30jbXktc3ZnIC5jbHVzdGVyIHNwYW4sI215LXN2ZyBwe2NvbG9yOiMzMzM7fSNteS1zdmcgZGl2Lm1lcm1haWRUb29sdGlwe3Bvc2l0aW9uOmFic29sdXRlO3RleHQtYWxpZ246Y2VudGVyO21heC13aWR0aDoyMDBweDtwYWRkaW5nOjJweDtmb250LWZhbWlseToidHJlYnVjaGV0IG1zIix2ZXJkYW5hLGFyaWFsLHNhbnMtc2VyaWY7Zm9udC1zaXplOjEycHg7YmFja2dyb3VuZDpoc2woODAsIDEwMCUsIDk2LjI3NDUwOTgwMzklKTtib3JkZXI6MXB4IHNvbGlkICNhYWFhMzM7Ym9yZGVyLXJhZGl1czoycHg7cG9pbnRlci1ldmVudHM6bm9uZTt6LWluZGV4OjEwMDt9I215LXN2ZyAuZmxvd2NoYXJ0VGl0bGVUZXh0e3RleHQtYW5jaG9yOm1pZGRsZTtmb250LXNpemU6MThweDtmaWxsOiMzMzM7fSNteS1zdmcgOnJvb3R7LS1tZXJtYWlkLWZvbnQtZmFtaWx5OiJ0cmVidWNoZXQgbXMiLHZlcmRhbmEsYXJpYWwsc2Fucy1zZXJpZjt9I215LXN2ZyAuY29tbXVuaXR5QSZndDsqe2ZpbGw6I2I5YjI4YiFpbXBvcnRhbnQ7c3Ryb2tlOiMxQjNEMkYhaW1wb3J0YW50O3N0cm9rZS13aWR0aDoycHghaW1wb3J0YW50O30jbXktc3ZnIC5jb21tdW5pdHlBIHNwYW57ZmlsbDojYjliMjhiIWltcG9ydGFudDtzdHJva2U6IzFCM0QyRiFpbXBvcnRhbnQ7c3Ryb2tlLXdpZHRoOjJweCFpbXBvcnRhbnQ7fSNteS1zdmcgLmNvbW11bml0eUImZ3Q7KntmaWxsOiM4YmE3YjkhaW1wb3J0YW50O3N0cm9rZTojMUIzRDJGIWltcG9ydGFudDtzdHJva2Utd2lkdGg6MnB4IWltcG9ydGFudDt9I215LXN2ZyAuY29tbXVuaXR5QiBzcGFue2ZpbGw6IzhiYTdiOSFpbXBvcnRhbnQ7c3Ryb2tlOiMxQjNEMkYhaW1wb3J0YW50O3N0cm9rZS13aWR0aDoycHghaW1wb3J0YW50O308L3N0eWxlPjxnPjxtYXJrZXIgb3JpZW50PSJhdXRvIiBtYXJrZXJIZWlnaHQ9IjEyIiBtYXJrZXJXaWR0aD0iMTIiIG1hcmtlclVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgcmVmWT0iNSIgcmVmWD0iNiIgdmlld0JveD0iMCAwIDEwIDEwIiBjbGFzcz0ibWFya2VyIGZsb3djaGFydCIgaWQ9Im15LXN2Z19mbG93Y2hhcnQtcG9pbnRFbmQiPjxwYXRoIHN0eWxlPSJzdHJva2Utd2lkdGg6IDE7IHN0cm9rZS1kYXNoYXJyYXk6IDEsIDA7IiBjbGFzcz0iYXJyb3dNYXJrZXJQYXRoIiBkPSJNIDAgMCBMIDEwIDUgTCAwIDEwIHoiLz48L21hcmtlcj48bWFya2VyIG9yaWVudD0iYXV0byIgbWFya2VySGVpZ2h0PSIxMiIgbWFya2VyV2lkdGg9IjEyIiBtYXJrZXJVbml0cz0idXNlclNwYWNlT25Vc2UiIHJlZlk9IjUiIHJlZlg9IjQuNSIgdmlld0JveD0iMCAwIDEwIDEwIiBjbGFzcz0ibWFya2VyIGZsb3djaGFydCIgaWQ9Im15LXN2Z19mbG93Y2hhcnQtcG9pbnRTdGFydCI+PHBhdGggc3R5bGU9InN0cm9rZS13aWR0aDogMTsgc3Ryb2tlLWRhc2hhcnJheTogMSwgMDsiIGNsYXNzPSJhcnJvd01hcmtlclBhdGgiIGQ9Ik0gMCA1IEwgMTAgMTAgTCAxMCAwIHoiLz48L21hcmtlcj48bWFya2VyIG9yaWVudD0iYXV0byIgbWFya2VySGVpZ2h0PSIxMSIgbWFya2VyV2lkdGg9IjExIiBtYXJrZXJVbml0cz0idXNlclNwYWNlT25Vc2UiIHJlZlk9IjUiIHJlZlg9IjExIiB2aWV3Qm94PSIwIDAgMTAgMTAiIGNsYXNzPSJtYXJrZXIgZmxvd2NoYXJ0IiBpZD0ibXktc3ZnX2Zsb3djaGFydC1jaXJjbGVFbmQiPjxjaXJjbGUgc3R5bGU9InN0cm9rZS13aWR0aDogMTsgc3Ryb2tlLWRhc2hhcnJheTogMSwgMDsiIGNsYXNzPSJhcnJvd01hcmtlclBhdGgiIHI9IjUiIGN5PSI1IiBjeD0iNSIvPjwvbWFya2VyPjxtYXJrZXIgb3JpZW50PSJhdXRvIiBtYXJrZXJIZWlnaHQ9IjExIiBtYXJrZXJXaWR0aD0iMTEiIG1hcmtlclVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgcmVmWT0iNSIgcmVmWD0iLTEiIHZpZXdCb3g9IjAgMCAxMCAxMCIgY2xhc3M9Im1hcmtlciBmbG93Y2hhcnQiIGlkPSJteS1zdmdfZmxvd2NoYXJ0LWNpcmNsZVN0YXJ0Ij48Y2lyY2xlIHN0eWxlPSJzdHJva2Utd2lkdGg6IDE7IHN0cm9rZS1kYXNoYXJyYXk6IDEsIDA7IiBjbGFzcz0iYXJyb3dNYXJrZXJQYXRoIiByPSI1IiBjeT0iNSIgY3g9IjUiLz48L21hcmtlcj48bWFya2VyIG9yaWVudD0iYXV0byIgbWFya2VySGVpZ2h0PSIxMSIgbWFya2VyV2lkdGg9IjExIiBtYXJrZXJVbml0cz0idXNlclNwYWNlT25Vc2UiIHJlZlk9IjUuMiIgcmVmWD0iMTIiIHZpZXdCb3g9IjAgMCAxMSAxMSIgY2xhc3M9Im1hcmtlciBjcm9zcyBmbG93Y2hhcnQiIGlkPSJteS1zdmdfZmxvd2NoYXJ0LWNyb3NzRW5kIj48cGF0aCBzdHlsZT0ic3Ryb2tlLXdpZHRoOiAyOyBzdHJva2UtZGFzaGFycmF5OiAxLCAwOyIgY2xhc3M9ImFycm93TWFya2VyUGF0aCIgZD0iTSAxLDEgbCA5LDkgTSAxMCwxIGwgLTksOSIvPjwvbWFya2VyPjxtYXJrZXIgb3JpZW50PSJhdXRvIiBtYXJrZXJIZWlnaHQ9IjExIiBtYXJrZXJXaWR0aD0iMTEiIG1hcmtlclVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgcmVmWT0iNS4yIiByZWZYPSItMSIgdmlld0JveD0iMCAwIDExIDExIiBjbGFzcz0ibWFya2VyIGNyb3NzIGZsb3djaGFydCIgaWQ9Im15LXN2Z19mbG93Y2hhcnQtY3Jvc3NTdGFydCI+PHBhdGggc3R5bGU9InN0cm9rZS13aWR0aDogMjsgc3Ryb2tlLWRhc2hhcnJheTogMSwgMDsiIGNsYXNzPSJhcnJvd01hcmtlclBhdGgiIGQ9Ik0gMSwxIGwgOSw5IE0gMTAsMSBsIC05LDkiLz48L21hcmtlcj48ZyBjbGFzcz0icm9vdCI+PGcgY2xhc3M9ImNsdXN0ZXJzIj48ZyBpZD0ic3ViR3JhcGgxIiBjbGFzcz0iY2x1c3RlciBkZWZhdWx0IGZsb3djaGFydC1sYWJlbCI+PHJlY3QgaGVpZ2h0PSIzNTEuMzEyNSIgd2lkdGg9IjE4MS45NDE0MDYyNSIgeT0iNDAyLjc2NTYyNSIgeD0iMCIgcnk9IjAiIHJ4PSIwIiBzdHlsZT0iIi8+PGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMzYuNjM0NzY1NjI1LCA0MDIuNzY1NjI1KSIgY2xhc3M9ImNsdXN0ZXItbGFiZWwiPjxmb3JlaWduT2JqZWN0IGhlaWdodD0iMTkiIHdpZHRoPSIxMDguNjcxODc1Ij48ZGl2IHN0eWxlPSJkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IHdoaXRlLXNwYWNlOiBub3dyYXA7IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+PHNwYW4gY2xhc3M9Im5vZGVMYWJlbCI+Q29tbXVuaXR5IEI8L3NwYW4+PC9kaXY+PC9mb3JlaWduT2JqZWN0PjwvZz48L2c+PGcgaWQ9InN1YkdyYXBoMCIgY2xhc3M9ImNsdXN0ZXIgZGVmYXVsdCBmbG93Y2hhcnQtbGFiZWwiPjxyZWN0IGhlaWdodD0iMzUyLjc2NTYyNSIgd2lkdGg9IjE4Mi4wMTU2MjUiIHk9IjAiIHg9IjAuMDcwMzEyNSIgcnk9IjAiIHJ4PSIwIiBzdHlsZT0iIi8+PGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMzYuNzU3ODEyNSwgMCkiIGNsYXNzPSJjbHVzdGVyLWxhYmVsIj48Zm9yZWlnbk9iamVjdCBoZWlnaHQ9IjE5IiB3aWR0aD0iMTA4LjY0MDYyNSI+PGRpdiBzdHlsZT0iZGlzcGxheTogaW5saW5lLWJsb2NrOyB3aGl0ZS1zcGFjZTogbm93cmFwOyIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPjxzcGFuIGNsYXNzPSJub2RlTGFiZWwiPkNvbW11bml0eSBBPC9zcGFuPjwvZGl2PjwvZm9yZWlnbk9iamVjdD48L2c+PC9nPjwvZz48ZyBjbGFzcz0iZWRnZVBhdGhzIj48cGF0aCBzdHlsZT0iZmlsbDpub25lOyIgY2xhc3M9ImVkZ2UtdGhpY2tuZXNzLW5vcm1hbCBlZGdlLXBhdHRlcm4tc29saWQgZmxvd2NoYXJ0LWxpbmsgTFMtQSBMRS1CIiBpZD0iTC1BLUItMCIgZD0iTTk1LjkzNCw4Ny44NzhMOTguODIzLDkyLjgxNUMxMDEuNzEyLDk3Ljc1MiwxMDcuNDkxLDEwNy42MjYsMTEwLjM4LDExNi43M0MxMTMuMjcsMTI1LjgzMywxMTMuMjcsMTM0LjE2NywxMTMuMjcsMTM4LjMzM0wxMTMuMjcsMTQyLjUiLz48cGF0aCBzdHlsZT0iZmlsbDpub25lOyIgY2xhc3M9ImVkZ2UtdGhpY2tuZXNzLW5vcm1hbCBlZGdlLXBhdHRlcm4tc29saWQgZmxvd2NoYXJ0LWxpbmsgTFMtQSBMRS1DIiBpZD0iTC1BLUMtMCIgZD0iTTYxLjg0LDg3Ljg3OEw1OC45NSw5Mi44MTVDNTYuMDYxLDk3Ljc1Miw1MC4yODIsMTA3LjYyNiw0Ny4zOTMsMTIyLjM1N0M0NC41MDQsMTM3LjA4OSw0NC41MDQsMTU2LjY3Nyw0NC41MDQsMTc2LjI2NkM0NC41MDQsMTk1Ljg1NCw0NC41MDQsMjE1LjQ0Myw0Ny4zODgsMjMwLjE3NEM1MC4yNzEsMjQ0LjkwNiw1Ni4wMzksMjU0Ljc4LDU4LjkyMiwyNTkuNzE3TDYxLjgwNiwyNjQuNjU0Ii8+PHBhdGggc3R5bGU9ImZpbGw6bm9uZTsiIGNsYXNzPSJlZGdlLXRoaWNrbmVzcy1ub3JtYWwgZWRnZS1wYXR0ZXJuLXNvbGlkIGZsb3djaGFydC1saW5rIExTLUIgTEUtQyIgaWQ9IkwtQi1DLTAiIGQ9Ik0xMTMuMjcsMjEwLjAzMUwxMTMuMjcsMjE0LjE5OEMxMTMuMjcsMjE4LjM2NSwxMTMuMjcsMjI2LjY5OCwxMTAuMzg2LDIzNS44MDJDMTA3LjUwMiwyNDQuOTA2LDEwMS43MzUsMjU0Ljc4LDk4Ljg1MSwyNTkuNzE3TDk1Ljk2OCwyNjQuNjU0Ii8+PHBhdGggc3R5bGU9ImZpbGw6bm9uZTsiIGNsYXNzPSJlZGdlLXRoaWNrbmVzcy1ub3JtYWwgZWRnZS1wYXR0ZXJuLXNvbGlkIGZsb3djaGFydC1saW5rIExTLUQgTEUtRSIgaWQ9IkwtRC1FLTAiIGQ9Ik05Ni4wNSw0OTIuMDU5TDk4Ljg4NCw0OTYuOTg5QzEwMS43MTgsNTAxLjkyLDEwNy4zODYsNTExLjc4LDExMC4yMjEsNTIwLjg3N0MxMTMuMDU1LDUyOS45NzQsMTEzLjA1NSw1MzguMzA3LDExMy4wNTUsNTQyLjQ3NEwxMTMuMDU1LDU0Ni42NDEiLz48cGF0aCBzdHlsZT0iZmlsbDpub25lOyIgY2xhc3M9ImVkZ2UtdGhpY2tuZXNzLW5vcm1hbCBlZGdlLXBhdHRlcm4tc29saWQgZmxvd2NoYXJ0LWxpbmsgTFMtRCBMRS1GIiBpZD0iTC1ELUYtMCIgZD0iTTYxLjcyNCw0OTIuMDU5TDU4Ljg5LDQ5Ni45ODlDNTYuMDU1LDUwMS45Miw1MC4zODcsNTExLjc4LDQ3LjU1Myw1MjYuNDMzQzQ0LjcxOSw1NDEuMDg2LDQ0LjcxOSw1NjAuNTMxLDQ0LjcxOSw1NzkuOTc3QzQ0LjcxOSw1OTkuNDIyLDQ0LjcxOSw2MTguODY3LDQ3LjYyNyw2MzMuNTE3QzUwLjUzNiw2NDguMTY4LDU2LjM1NCw2NTguMDIzLDU5LjI2Miw2NjIuOTVMNjIuMTcxLDY2Ny44NzgiLz48cGF0aCBzdHlsZT0iZmlsbDpub25lOyIgY2xhc3M9ImVkZ2UtdGhpY2tuZXNzLW5vcm1hbCBlZGdlLXBhdHRlcm4tc29saWQgZmxvd2NoYXJ0LWxpbmsgTFMtRSBMRS1GIiBpZD0iTC1FLUYtMCIgZD0iTTExMy4wNTUsNjEzLjMxM0wxMTMuMDU1LDYxNy40NzlDMTEzLjA1NSw2MjEuNjQ2LDExMy4wNTUsNjI5Ljk3OSwxMTAuMTQ2LDYzOS4wNzNDMTA3LjIzNyw2NDguMTY4LDEwMS40Miw2NTguMDIzLDk4LjUxMSw2NjIuOTVMOTUuNjAyLDY2Ny44NzgiLz48cGF0aCBzdHlsZT0iZmlsbDpub25lOyIgY2xhc3M9ImVkZ2UtdGhpY2tuZXNzLW5vcm1hbCBlZGdlLXBhdHRlcm4tc29saWQgZmxvd2NoYXJ0LWxpbmsgTFMtQyBMRS1EIiBpZD0iTC1DLUQtMCIgZD0iTTc4Ljg4NywzMjcuNzY2TDc4Ljg4NywzMzEuOTMyQzc4Ljg4NywzMzYuMDk5LDc4Ljg4NywzNDQuNDMyLDc4Ljg4NywzNTIuNzY2Qzc4Ljg4NywzNjEuMDk5LDc4Ljg4NywzNjkuNDMyLDc4Ljg4NywzNzcuNzY2Qzc4Ljg4NywzODYuMDk5LDc4Ljg4NywzOTQuNDMyLDc4Ljg4Nyw0MDIuNzY2Qzc4Ljg4Nyw0MTEuMDk5LDc4Ljg4Nyw0MTkuNDMyLDc4Ljg4Nyw0MjMuNTk5TDc4Ljg4Nyw0MjcuNzY2Ii8+PC9nPjxnIGNsYXNzPSJlZGdlTGFiZWxzIj48ZyBjbGFzcz0iZWRnZUxhYmVsIj48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLCAwKSIgY2xhc3M9ImxhYmVsIj48Zm9yZWlnbk9iamVjdCBoZWlnaHQ9IjAiIHdpZHRoPSIwIj48ZGl2IHN0eWxlPSJkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IHdoaXRlLXNwYWNlOiBub3dyYXA7IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+PHNwYW4gY2xhc3M9ImVkZ2VMYWJlbCI+PC9zcGFuPjwvZGl2PjwvZm9yZWlnbk9iamVjdD48L2c+PC9nPjxnIGNsYXNzPSJlZGdlTGFiZWwiPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAsIDApIiBjbGFzcz0ibGFiZWwiPjxmb3JlaWduT2JqZWN0IGhlaWdodD0iMCIgd2lkdGg9IjAiPjxkaXYgc3R5bGU9ImRpc3BsYXk6IGlubGluZS1ibG9jazsgd2hpdGUtc3BhY2U6IG5vd3JhcDsiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj48c3BhbiBjbGFzcz0iZWRnZUxhYmVsIj48L3NwYW4+PC9kaXY+PC9mb3JlaWduT2JqZWN0PjwvZz48L2c+PGcgY2xhc3M9ImVkZ2VMYWJlbCI+PGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCwgMCkiIGNsYXNzPSJsYWJlbCI+PGZvcmVpZ25PYmplY3QgaGVpZ2h0PSIwIiB3aWR0aD0iMCI+PGRpdiBzdHlsZT0iZGlzcGxheTogaW5saW5lLWJsb2NrOyB3aGl0ZS1zcGFjZTogbm93cmFwOyIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPjxzcGFuIGNsYXNzPSJlZGdlTGFiZWwiPjwvc3Bhbj48L2Rpdj48L2ZvcmVpZ25PYmplY3Q+PC9nPjwvZz48ZyBjbGFzcz0iZWRnZUxhYmVsIj48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLCAwKSIgY2xhc3M9ImxhYmVsIj48Zm9yZWlnbk9iamVjdCBoZWlnaHQ9IjAiIHdpZHRoPSIwIj48ZGl2IHN0eWxlPSJkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IHdoaXRlLXNwYWNlOiBub3dyYXA7IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+PHNwYW4gY2xhc3M9ImVkZ2VMYWJlbCI+PC9zcGFuPjwvZGl2PjwvZm9yZWlnbk9iamVjdD48L2c+PC9nPjxnIGNsYXNzPSJlZGdlTGFiZWwiPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAsIDApIiBjbGFzcz0ibGFiZWwiPjxmb3JlaWduT2JqZWN0IGhlaWdodD0iMCIgd2lkdGg9IjAiPjxkaXYgc3R5bGU9ImRpc3BsYXk6IGlubGluZS1ibG9jazsgd2hpdGUtc3BhY2U6IG5vd3JhcDsiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj48c3BhbiBjbGFzcz0iZWRnZUxhYmVsIj48L3NwYW4+PC9kaXY+PC9mb3JlaWduT2JqZWN0PjwvZz48L2c+PGcgY2xhc3M9ImVkZ2VMYWJlbCI+PGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCwgMCkiIGNsYXNzPSJsYWJlbCI+PGZvcmVpZ25PYmplY3QgaGVpZ2h0PSIwIiB3aWR0aD0iMCI+PGRpdiBzdHlsZT0iZGlzcGxheTogaW5saW5lLWJsb2NrOyB3aGl0ZS1zcGFjZTogbm93cmFwOyIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPjxzcGFuIGNsYXNzPSJlZGdlTGFiZWwiPjwvc3Bhbj48L2Rpdj48L2ZvcmVpZ25PYmplY3Q+PC9nPjwvZz48ZyBjbGFzcz0iZWRnZUxhYmVsIj48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLCAwKSIgY2xhc3M9ImxhYmVsIj48Zm9yZWlnbk9iamVjdCBoZWlnaHQ9IjAiIHdpZHRoPSIwIj48ZGl2IHN0eWxlPSJkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IHdoaXRlLXNwYWNlOiBub3dyYXA7IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+PHNwYW4gY2xhc3M9ImVkZ2VMYWJlbCI+PC9zcGFuPjwvZGl2PjwvZm9yZWlnbk9iamVjdD48L2c+PC9nPjwvZz48ZyBjbGFzcz0ibm9kZXMiPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDExMy4wNTQ2ODc1LCA1NzkuOTc2NTYyNSkiIGRhdGEtaWQ9IkUiIGRhdGEtbm9kZT0idHJ1ZSIgaWQ9ImZsb3djaGFydC1FLTciIGNsYXNzPSJub2RlIGRlZmF1bHQgY29tbXVuaXR5QiBmbG93Y2hhcnQtbGFiZWwiPjxjaXJjbGUgaGVpZ2h0PSIzNCIgd2lkdGg9IjY2LjY3MTg3NSIgcj0iMzMuMzM1OTM3NSIgcnk9IjAiIHJ4PSIwIiBzdHlsZT0iIi8+PGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTI1LjgzNTkzNzUsIC05LjUpIiBzdHlsZT0iIiBjbGFzcz0ibGFiZWwiPjxyZWN0Lz48Zm9yZWlnbk9iamVjdCBoZWlnaHQ9IjE5IiB3aWR0aD0iNTEuNjcxODc1Ij48ZGl2IHN0eWxlPSJkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IHdoaXRlLXNwYWNlOiBub3dyYXA7IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+PHNwYW4gY2xhc3M9Im5vZGVMYWJlbCI+VXNlciBFPC9zcGFuPjwvZGl2PjwvZm9yZWlnbk9iamVjdD48L2c+PC9nPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDc4Ljg4NjcxODc1LCA0NjIuMjAzMTI1KSIgZGF0YS1pZD0iRCIgZGF0YS1ub2RlPSJ0cnVlIiBpZD0iZmxvd2NoYXJ0LUQtNiIgY2xhc3M9Im5vZGUgZGVmYXVsdCBjb21tdW5pdHlCIGZsb3djaGFydC1sYWJlbCI+PGNpcmNsZSBoZWlnaHQ9IjM0IiB3aWR0aD0iNjguODc1IiByPSIzNC40Mzc1IiByeT0iMCIgcng9IjAiIHN0eWxlPSIiLz48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMjYuOTM3NSwgLTkuNSkiIHN0eWxlPSIiIGNsYXNzPSJsYWJlbCI+PHJlY3QvPjxmb3JlaWduT2JqZWN0IGhlaWdodD0iMTkiIHdpZHRoPSI1My44NzUiPjxkaXYgc3R5bGU9ImRpc3BsYXk6IGlubGluZS1ibG9jazsgd2hpdGUtc3BhY2U6IG5vd3JhcDsiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj48c3BhbiBjbGFzcz0ibm9kZUxhYmVsIj5Vc2VyIEQ8L3NwYW4+PC9kaXY+PC9mb3JlaWduT2JqZWN0PjwvZz48L2c+PGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoNzguODg2NzE4NzUsIDY5Ni4xOTUzMTI1KSIgZGF0YS1pZD0iRiIgZGF0YS1ub2RlPSJ0cnVlIiBpZD0iZmxvd2NoYXJ0LUYtOSIgY2xhc3M9Im5vZGUgZGVmYXVsdCBjb21tdW5pdHlCIGZsb3djaGFydC1sYWJlbCI+PGNpcmNsZSBoZWlnaHQ9IjM0IiB3aWR0aD0iNjUuNzY1NjI1IiByPSIzMi44ODI4MTI1IiByeT0iMCIgcng9IjAiIHN0eWxlPSIiLz48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMjUuMzgyODEyNSwgLTkuNSkiIHN0eWxlPSIiIGNsYXNzPSJsYWJlbCI+PHJlY3QvPjxmb3JlaWduT2JqZWN0IGhlaWdodD0iMTkiIHdpZHRoPSI1MC43NjU2MjUiPjxkaXYgc3R5bGU9ImRpc3BsYXk6IGlubGluZS1ibG9jazsgd2hpdGUtc3BhY2U6IG5vd3JhcDsiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj48c3BhbiBjbGFzcz0ibm9kZUxhYmVsIj5Vc2VyIEY8L3NwYW4+PC9kaXY+PC9mb3JlaWduT2JqZWN0PjwvZz48L2c+PGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMTEzLjI2OTUzMTI1LCAxNzYuMjY1NjI1KSIgZGF0YS1pZD0iQiIgZGF0YS1ub2RlPSJ0cnVlIiBpZD0iZmxvd2NoYXJ0LUItMSIgY2xhc3M9Im5vZGUgZGVmYXVsdCBjb21tdW5pdHlBIGZsb3djaGFydC1sYWJlbCI+PGNpcmNsZSBoZWlnaHQ9IjM0IiB3aWR0aD0iNjcuNTMxMjUiIHI9IjMzLjc2NTYyNSIgcnk9IjAiIHJ4PSIwIiBzdHlsZT0iIi8+PGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTI2LjI2NTYyNSwgLTkuNSkiIHN0eWxlPSIiIGNsYXNzPSJsYWJlbCI+PHJlY3QvPjxmb3JlaWduT2JqZWN0IGhlaWdodD0iMTkiIHdpZHRoPSI1Mi41MzEyNSI+PGRpdiBzdHlsZT0iZGlzcGxheTogaW5saW5lLWJsb2NrOyB3aGl0ZS1zcGFjZTogbm93cmFwOyIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPjxzcGFuIGNsYXNzPSJub2RlTGFiZWwiPlVzZXIgQjwvc3Bhbj48L2Rpdj48L2ZvcmVpZ25PYmplY3Q+PC9nPjwvZz48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSg3OC44ODY3MTg3NSwgNTguNzUpIiBkYXRhLWlkPSJBIiBkYXRhLW5vZGU9InRydWUiIGlkPSJmbG93Y2hhcnQtQS0wIiBjbGFzcz0ibm9kZSBkZWZhdWx0IGNvbW11bml0eUEgZmxvd2NoYXJ0LWxhYmVsIj48Y2lyY2xlIGhlaWdodD0iMzQiIHdpZHRoPSI2Ny41IiByPSIzMy43NSIgcnk9IjAiIHJ4PSIwIiBzdHlsZT0iIi8+PGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTI2LjI1LCAtOS41KSIgc3R5bGU9IiIgY2xhc3M9ImxhYmVsIj48cmVjdC8+PGZvcmVpZ25PYmplY3QgaGVpZ2h0PSIxOSIgd2lkdGg9IjUyLjUiPjxkaXYgc3R5bGU9ImRpc3BsYXk6IGlubGluZS1ibG9jazsgd2hpdGUtc3BhY2U6IG5vd3JhcDsiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj48c3BhbiBjbGFzcz0ibm9kZUxhYmVsIj5Vc2VyIEE8L3NwYW4+PC9kaXY+PC9mb3JlaWduT2JqZWN0PjwvZz48L2c+PGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoNzguODg2NzE4NzUsIDI5My44OTg0Mzc1KSIgZGF0YS1pZD0iQyIgZGF0YS1ub2RlPSJ0cnVlIiBpZD0iZmxvd2NoYXJ0LUMtMyIgY2xhc3M9Im5vZGUgZGVmYXVsdCBjb21tdW5pdHlBIGZsb3djaGFydC1sYWJlbCI+PGNpcmNsZSBoZWlnaHQ9IjM0IiB3aWR0aD0iNjcuNzM0Mzc1IiByPSIzMy44NjcxODc1IiByeT0iMCIgcng9IjAiIHN0eWxlPSIiLz48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMjYuMzY3MTg3NSwgLTkuNSkiIHN0eWxlPSIiIGNsYXNzPSJsYWJlbCI+PHJlY3QvPjxmb3JlaWduT2JqZWN0IGhlaWdodD0iMTkiIHdpZHRoPSI1Mi43MzQzNzUiPjxkaXYgc3R5bGU9ImRpc3BsYXk6IGlubGluZS1ibG9jazsgd2hpdGUtc3BhY2U6IG5vd3JhcDsiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj48c3BhbiBjbGFzcz0ibm9kZUxhYmVsIj5Vc2VyIEM8L3NwYW4+PC9kaXY+PC9mb3JlaWduT2JqZWN0PjwvZz48L2c+PC9nPjwvZz48L2c+PC9zdmc+"&gt;&lt;/p&gt;
&lt;p&gt;Graph theory provides a powerful framework for understanding complex systems across disciplines, from mathematics and computer science to sociology and literature.&lt;/p&gt;</content><category term="permanent"/><category term="ComputerScience"/><category term="GraphTheory"/></entry><entry><title>Graph Theory</title><link href="http://localhost:8000/graph-theory.html" rel="alternate"/><published>2023-04-09T00:00:00+10:00</published><updated>2023-04-09T00:00:00+10:00</updated><author><name>Lex Toumbourou</name></author><id>tag:localhost,2023-04-09:/graph-theory.html</id><summary type="html">&lt;p&gt;the study of graphs&lt;/p&gt;</summary><content type="html">&lt;p&gt;See &lt;a href="graph.html"&gt;Graphs&lt;/a&gt;&lt;/p&gt;</content><category term="permanent"/></entry><entry><title>Linear Function</title><link href="http://localhost:8000/linear-function.html" rel="alternate"/><published>2023-04-09T00:00:00+10:00</published><updated>2023-04-09T00:00:00+10:00</updated><author><name>Lex Toumbourou</name></author><id>tag:localhost,2023-04-09:/linear-function.html</id><summary type="html">&lt;p&gt;a function represented by a straight line on a graph&lt;/p&gt;</summary><content type="html">&lt;p&gt;&lt;strong&gt;A linear function&lt;/strong&gt; is represented by a straight line on a graph. It indicates a linear relationship between two variables: when one changes, the other changes at a constant rate. For example:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The count of floors vs number of windows on a high-rise building.&lt;/li&gt;
&lt;li&gt;The distance travelled vs time at a constant speed.&lt;/li&gt;
&lt;li&gt;The number of beers consumed vs blood alcohol content.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img alt="A graph showing a linear relationship between BAC and beers consumed" src="../_media/linear-func-bac-vs-beers.png"&gt;&lt;/p&gt;
&lt;p&gt;The general form of a linear function is: &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;f&lt;/mi&gt;&lt;mo stretchy="false"&gt;(&lt;/mo&gt;&lt;mstyle mathcolor="#8ba7b9"&gt;&lt;mi mathvariant="bold"&gt;x&lt;/mi&gt;&lt;/mstyle&gt;&lt;mo stretchy="false"&gt;)&lt;/mo&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mstyle mathcolor="#b9b28b"&gt;&lt;mi mathvariant="bold"&gt;m&lt;/mi&gt;&lt;/mstyle&gt;&lt;mstyle mathcolor="#8ba7b9"&gt;&lt;mi mathvariant="bold"&gt;x&lt;/mi&gt;&lt;/mstyle&gt;&lt;mo&gt;+&lt;/mo&gt;&lt;mstyle mathcolor="#b98b99"&gt;&lt;mi mathvariant="bold"&gt;b&lt;/mi&gt;&lt;/mstyle&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;f(\mathbf{\textcolor{#8ba7b9}{x}}) = \mathbf{\textcolor{#b9b28b}{m}}\mathbf{\textcolor{#8ba7b9}{x}} + \mathbf{\textcolor{#b98b99}{b}}&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1em;vertical-align:-0.25em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.10764em;"&gt;f&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathbf" style="color:#8ba7b9;"&gt;x&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.66666em;vertical-align:-0.08333em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathbf" style="color:#b9b28b;"&gt;m&lt;/span&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathbf" style="color:#8ba7b9;"&gt;x&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;+&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.69444em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathbf" style="color:#b98b99;"&gt;b&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; where &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mstyle mathcolor="#b9b28b"&gt;&lt;mi mathvariant="bold"&gt;m&lt;/mi&gt;&lt;/mstyle&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;\mathbf{\textcolor{#b9b28b}{m}}&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.44444em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathbf" style="color:#b9b28b;"&gt;m&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; is the &lt;em&gt;slope&lt;/em&gt; of the line and &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mstyle mathcolor="#b98b99"&gt;&lt;mi mathvariant="bold"&gt;b&lt;/mi&gt;&lt;/mstyle&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;\mathbf{\textcolor{#b98b99}{b}}&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.69444em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathbf" style="color:#b98b99;"&gt;b&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; is the &lt;em&gt;intercept&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;The slope, &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mstyle mathcolor="#b9b28b"&gt;&lt;mi mathvariant="bold"&gt;m&lt;/mi&gt;&lt;/mstyle&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;\mathbf{\textcolor{#b9b28b}{m}}&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.44444em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathbf" style="color:#b9b28b;"&gt;m&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;, indicates how steep the line is and in which direction it points.&lt;/p&gt;
&lt;p&gt;The point &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mstyle mathcolor="#b98b99"&gt;&lt;mi mathvariant="bold"&gt;b&lt;/mi&gt;&lt;/mstyle&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;\mathbf{\textcolor{#b98b99}{b}}&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.69444em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathbf" style="color:#b98b99;"&gt;b&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; is the y-coordinate of the point where the line intercepts on the y-axis, which tells us the value of the function when &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mstyle mathcolor="#8ba7b9"&gt;&lt;mi mathvariant="bold"&gt;x&lt;/mi&gt;&lt;/mstyle&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;\mathbf{\textcolor{#8ba7b9}{x}}&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.44444em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathbf" style="color:#8ba7b9;"&gt;x&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; is zero.&lt;/p&gt;</content><category term="permanent"/><category term="Maths"/></entry><entry><title>Quadratic Function</title><link href="http://localhost:8000/quadratic-function.html" rel="alternate"/><published>2023-04-09T00:00:00+10:00</published><updated>2023-04-09T00:00:00+10:00</updated><author><name>Lex Toumbourou</name></author><id>tag:localhost,2023-04-09:/quadratic-function.html</id><summary type="html">&lt;p&gt;a function represented by a U-shaped curve on a graph&lt;/p&gt;</summary><content type="html">&lt;p&gt;&lt;strong&gt;Quadratic functions&lt;/strong&gt; are of the form: &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;f&lt;/mi&gt;&lt;mo stretchy="false"&gt;(&lt;/mo&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;mo stretchy="false"&gt;)&lt;/mo&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;msup&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;/msup&gt;&lt;mo&gt;+&lt;/mo&gt;&lt;mi&gt;b&lt;/mi&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;mo&gt;+&lt;/mo&gt;&lt;mi&gt;c&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;f(x) = ax^2 + bx + c&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1em;vertical-align:-0.25em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.10764em;"&gt;f&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord mathdefault"&gt;x&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.897438em;vertical-align:-0.08333em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;a&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;x&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.8141079999999999em;"&gt;&lt;span style="top:-3.063em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;+&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.77777em;vertical-align:-0.08333em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;b&lt;/span&gt;&lt;span class="mord mathdefault"&gt;x&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;+&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.43056em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;c&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; where &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;a&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.43056em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;a&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;, &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;b&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;b&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.69444em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;b&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; and &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;c&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;c&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.43056em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;c&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; are constants.&lt;/p&gt;
&lt;p&gt;The functions graph as parabolas - a U-shape curve that open upwards or downs depending on the sign of &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;a&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.43056em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;a&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;. If &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mo&gt;&amp;gt;&lt;/mo&gt;&lt;mn&gt;0&lt;/mn&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;a&amp;gt;0&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.5782em;vertical-align:-0.0391em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;a&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;&amp;gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.64444em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;0&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;, the parabola opens upwards, and if &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mo&gt;&amp;lt;&lt;/mo&gt;&lt;mn&gt;0&lt;/mn&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;a&amp;lt;0&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.5782em;vertical-align:-0.0391em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;a&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;&amp;lt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.64444em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;0&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;, it opens downwards.&lt;/p&gt;
&lt;p&gt;In this example, I've used &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;a = 1&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.43056em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;a&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.64444em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;, &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;b&lt;/mi&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;b = -2&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.69444em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;b&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.72777em;vertical-align:-0.08333em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;−&lt;/span&gt;&lt;span class="mord"&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; and &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;c&lt;/mi&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;c =1&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.43056em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;c&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.64444em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;, giving us the function &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;f&lt;/mi&gt;&lt;mo stretchy="false"&gt;(&lt;/mo&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;mo stretchy="false"&gt;)&lt;/mo&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;msup&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;/msup&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;mo&gt;+&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;f(x) = x^2 - 2x + 1&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1em;vertical-align:-0.25em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.10764em;"&gt;f&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord mathdefault"&gt;x&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.897438em;vertical-align:-0.08333em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;x&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.8141079999999999em;"&gt;&lt;span style="top:-3.063em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;−&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.72777em;vertical-align:-0.08333em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;2&lt;/span&gt;&lt;span class="mord mathdefault"&gt;x&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;+&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.64444em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="Quadratic Function" src="../_media/quadratic-function.png"&gt;&lt;/p&gt;</content><category term="permanent"/></entry><entry><title>TF-IDF</title><link href="http://localhost:8000/tf-idf.html" rel="alternate"/><published>2023-04-09T00:00:00+10:00</published><updated>2025-12-20T00:00:00+10:00</updated><author><name>Lex Toumbourou</name></author><id>tag:localhost,2023-04-09:/tf-idf.html</id><summary type="html">A word numerisation technique that weights terms by their importance to a document.</summary><content type="html">&lt;p&gt;&lt;strong&gt;TF-IDF&lt;/strong&gt; (Term Frequency - Inverse Document Frequency) is a word numerisation technique in NLP which weights terms by their importance in the document relative to a corpus. The idea is that:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Words that appear frequently in a specific document should be weighted higher.&lt;/li&gt;
&lt;li&gt;Words that appear frequently across all documents (like "the", "is", and "and") have less signal and are weighted lower.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;An alternative numerisation approach to the &lt;a href="bag-of-words-model.html"&gt;Bag-of-Words Model&lt;/a&gt;, which simply counts word frequency in a text - TF-IDF includes context about how important each word is compared to the corpus as a whole.&lt;/p&gt;
&lt;h4&gt;Step-by-step&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;1. Term Frequency (TF)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Measures how frequently a term occurs in a document.&lt;/p&gt;
&lt;p&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mtext&gt;tf&lt;/mtext&gt;&lt;mo stretchy="false"&gt;(&lt;/mo&gt;&lt;mi&gt;t&lt;/mi&gt;&lt;mo separator="true"&gt;,&lt;/mo&gt;&lt;mi&gt;d&lt;/mi&gt;&lt;mo stretchy="false"&gt;)&lt;/mo&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mfrac&gt;&lt;mrow&gt;&lt;mtext&gt;count of &lt;/mtext&gt;&lt;mtext mathvariant="italic"&gt;t&lt;/mtext&gt;&lt;mtext&gt; in &lt;/mtext&gt;&lt;mtext mathvariant="italic"&gt;d&lt;/mtext&gt;&lt;/mrow&gt;&lt;mrow&gt;&lt;mtext&gt;total words in &lt;/mtext&gt;&lt;mtext mathvariant="italic"&gt;d&lt;/mtext&gt;&lt;/mrow&gt;&lt;/mfrac&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;\text{tf}(t, d) = \frac{\text{count of \textit{t} in \textit{d}}}{\text{total words in \textit{d}}}&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span class="katex-html" aria-hidden="true"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1em;vertical-align:-0.25em;"&gt;&lt;/span&gt;&lt;span class="mord text"&gt;&lt;span class="mord"&gt;tf&lt;/span&gt;&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord mathdefault"&gt;t&lt;/span&gt;&lt;span class="mpunct"&gt;,&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;d&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1.2251079999999999em;vertical-align:-0.345em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mopen nulldelimiter"&gt;&lt;/span&gt;&lt;span class="mfrac"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.8801079999999999em;"&gt;&lt;span style="top:-2.6550000000000002em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord text mtight"&gt;&lt;span class="mord mtight"&gt;total words in &lt;/span&gt;&lt;span class="mord text mtight"&gt;&lt;span class="mord textit mtight"&gt;d&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-3.23em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="frac-line" style="border-bottom-width:0.04em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-3.394em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord text mtight"&gt;&lt;span class="mord mtight"&gt;count of &lt;/span&gt;&lt;span class="mord text mtight"&gt;&lt;span class="mord textit mtight"&gt;t&lt;/span&gt;&lt;/span&gt;&lt;span class="mord mtight"&gt; in &lt;/span&gt;&lt;span class="mord text mtight"&gt;&lt;span class="mord textit mtight"&gt;d&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.345em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose nulldelimiter"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2. Inverse Document Frequency (IDF)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mtext&gt;idf&lt;/mtext&gt;&lt;mo stretchy="false"&gt;(&lt;/mo&gt;&lt;mi&gt;t&lt;/mi&gt;&lt;mo stretchy="false"&gt;)&lt;/mo&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mi&gt;log&lt;/mi&gt;&lt;mo&gt;⁡&lt;/mo&gt;&lt;mrow&gt;&lt;mo fence="true"&gt;(&lt;/mo&gt;&lt;mfrac&gt;&lt;mi&gt;N&lt;/mi&gt;&lt;mrow&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;mo&gt;+&lt;/mo&gt;&lt;mi&gt;d&lt;/mi&gt;&lt;msub&gt;&lt;mi&gt;f&lt;/mi&gt;&lt;mi&gt;t&lt;/mi&gt;&lt;/msub&gt;&lt;/mrow&gt;&lt;/mfrac&gt;&lt;mo fence="true"&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;\text{idf}(t) = \log\left(\frac{N}{1 + df_t}\right)&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span class="katex-html" aria-hidden="true"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1em;vertical-align:-0.25em;"&gt;&lt;/span&gt;&lt;span class="mord text"&gt;&lt;span class="mord"&gt;idf&lt;/span&gt;&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord mathdefault"&gt;t&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1.80002em;vertical-align:-0.65002em;"&gt;&lt;/span&gt;&lt;span class="mop"&gt;lo&lt;span style="margin-right:0.01389em;"&gt;g&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="minner"&gt;&lt;span class="mopen delimcenter" style="top:0em;"&gt;&lt;span class="delimsizing size2"&gt;(&lt;/span&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mopen nulldelimiter"&gt;&lt;/span&gt;&lt;span class="mfrac"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.872331em;"&gt;&lt;span style="top:-2.6550000000000002em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mtight"&gt;1&lt;/span&gt;&lt;span class="mbin mtight"&gt;+&lt;/span&gt;&lt;span class="mord mathdefault mtight"&gt;d&lt;/span&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathdefault mtight" style="margin-right:0.10764em;"&gt;f&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.29634285714285713em;"&gt;&lt;span style="top:-2.357em;margin-left:-0.10764em;margin-right:0.07142857142857144em;"&gt;&lt;span class="pstrut" style="height:2.5em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size3 size1 mtight"&gt;&lt;span class="mord mathdefault mtight"&gt;t&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.143em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-3.23em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="frac-line" style="border-bottom-width:0.04em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-3.394em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathdefault mtight" style="margin-right:0.10903em;"&gt;N&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.481108em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose nulldelimiter"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose delimcenter" style="top:0em;"&gt;&lt;span class="delimsizing size2"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Measures how rare a term is across the entire corpus of documents.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;N&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;N&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span class="katex-html" aria-hidden="true"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.68333em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.10903em;"&gt;N&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;: Total number of documents.&lt;/li&gt;
&lt;li&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;d&lt;/mi&gt;&lt;msub&gt;&lt;mi&gt;f&lt;/mi&gt;&lt;mi&gt;t&lt;/mi&gt;&lt;/msub&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;df_t&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span class="katex-html" aria-hidden="true"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.8888799999999999em;vertical-align:-0.19444em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;d&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault" style="margin-right:0.10764em;"&gt;f&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.2805559999999999em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:-0.10764em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mathdefault mtight"&gt;t&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;: Number of documents containing the term.&lt;/li&gt;
&lt;li&gt;The &lt;code&gt;+1&lt;/code&gt; (smoothing) prevents division by zero if a term isn't in the training corpus.&lt;/li&gt;
&lt;li&gt;The &lt;code&gt;log&lt;/code&gt; function dampens the magnitude of the IDF weight, ensuring that extremely rare words don't overpower the entire vector.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;3. TF-IDF Score&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The final score is the product of these two metrics:&lt;/p&gt;
&lt;p&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mtext&gt;tf-idf&lt;/mtext&gt;&lt;mo stretchy="false"&gt;(&lt;/mo&gt;&lt;mi&gt;t&lt;/mi&gt;&lt;mo separator="true"&gt;,&lt;/mo&gt;&lt;mi&gt;d&lt;/mi&gt;&lt;mo stretchy="false"&gt;)&lt;/mo&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mtext&gt;tf&lt;/mtext&gt;&lt;mo stretchy="false"&gt;(&lt;/mo&gt;&lt;mi&gt;t&lt;/mi&gt;&lt;mo separator="true"&gt;,&lt;/mo&gt;&lt;mi&gt;d&lt;/mi&gt;&lt;mo stretchy="false"&gt;)&lt;/mo&gt;&lt;mo&gt;×&lt;/mo&gt;&lt;mtext&gt;idf&lt;/mtext&gt;&lt;mo stretchy="false"&gt;(&lt;/mo&gt;&lt;mi&gt;t&lt;/mi&gt;&lt;mo stretchy="false"&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;\text{tf-idf}(t, d) = \text{tf}(t, d) \times \text{idf}(t)&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span class="katex-html" aria-hidden="true"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1em;vertical-align:-0.25em;"&gt;&lt;/span&gt;&lt;span class="mord text"&gt;&lt;span class="mord"&gt;tf-idf&lt;/span&gt;&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord mathdefault"&gt;t&lt;/span&gt;&lt;span class="mpunct"&gt;,&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;d&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1em;vertical-align:-0.25em;"&gt;&lt;/span&gt;&lt;span class="mord text"&gt;&lt;span class="mord"&gt;tf&lt;/span&gt;&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord mathdefault"&gt;t&lt;/span&gt;&lt;span class="mpunct"&gt;,&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;d&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;×&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1em;vertical-align:-0.25em;"&gt;&lt;/span&gt;&lt;span class="mord text"&gt;&lt;span class="mord"&gt;idf&lt;/span&gt;&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord mathdefault"&gt;t&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Words that are frequent in a specific document but rare across the corpus receive the highest scores, making them the "signature" terms for that document.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;4. Normalisation&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;TF-IDF vectors are typically normalised to unit length using L2 (Euclidean) normalisation:&lt;/p&gt;
&lt;p&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mover accent="true"&gt;&lt;mi&gt;v&lt;/mi&gt;&lt;mo&gt;^&lt;/mo&gt;&lt;/mover&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mfrac&gt;&lt;mi&gt;v&lt;/mi&gt;&lt;mrow&gt;&lt;mi mathvariant="normal"&gt;∣&lt;/mi&gt;&lt;mi&gt;v&lt;/mi&gt;&lt;msub&gt;&lt;mi mathvariant="normal"&gt;∣&lt;/mi&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;/msub&gt;&lt;/mrow&gt;&lt;/mfrac&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mfrac&gt;&lt;mi&gt;v&lt;/mi&gt;&lt;msqrt&gt;&lt;mrow&gt;&lt;msub&gt;&lt;mo&gt;∑&lt;/mo&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;/msub&gt;&lt;msubsup&gt;&lt;mi&gt;v&lt;/mi&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;/msubsup&gt;&lt;/mrow&gt;&lt;/msqrt&gt;&lt;/mfrac&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;\hat{v} = \frac{v}{|v|_2} = \frac{v}{\sqrt{\sum_i v_i^2}}&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span class="katex-html" aria-hidden="true"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.69444em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord accent"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.69444em;"&gt;&lt;span style="top:-3em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault" style="margin-right:0.03588em;"&gt;v&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-3em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="accent-body" style="left:-0.22222em;"&gt;^&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1.215392em;vertical-align:-0.52em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mopen nulldelimiter"&gt;&lt;/span&gt;&lt;span class="mfrac"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.695392em;"&gt;&lt;span style="top:-2.655em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mtight"&gt;∣&lt;/span&gt;&lt;span class="mord mathdefault mtight" style="margin-right:0.03588em;"&gt;v&lt;/span&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mtight"&gt;∣&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.31731428571428577em;"&gt;&lt;span style="top:-2.357em;margin-left:0em;margin-right:0.07142857142857144em;"&gt;&lt;span class="pstrut" style="height:2.5em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size3 size1 mtight"&gt;&lt;span class="mord mtight"&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.143em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-3.23em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="frac-line" style="border-bottom-width:0.04em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-3.394em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathdefault mtight" style="margin-right:0.03588em;"&gt;v&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.52em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose nulldelimiter"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1.524992em;vertical-align:-0.8295999999999999em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mopen nulldelimiter"&gt;&lt;/span&gt;&lt;span class="mfrac"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.695392em;"&gt;&lt;span style="top:-2.4701725em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord sqrt mtight"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:1.028325em;"&gt;&lt;span class="svg-align" style="top:-3.428571428571429em;"&gt;&lt;span class="pstrut" style="height:3.428571428571429em;"&gt;&lt;/span&gt;&lt;span class="mord mtight" style="padding-left:1.19em;"&gt;&lt;span class="mop mtight"&gt;&lt;span class="mop op-symbol small-op mtight" style="position:relative;top:-0.0000050000000000050004em;"&gt;∑&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.1496471428571428em;"&gt;&lt;span style="top:-2.1785614285714283em;margin-left:0em;margin-right:0.07142857142857144em;"&gt;&lt;span class="pstrut" style="height:2.5em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size3 size1 mtight"&gt;&lt;span class="mord mathdefault mtight"&gt;i&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.32143857142857146em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace mtight" style="margin-right:0.19516666666666668em;"&gt;&lt;/span&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathdefault mtight" style="margin-right:0.03588em;"&gt;v&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.8051142857142857em;"&gt;&lt;span style="top:-2.177714285714286em;margin-left:-0.03588em;margin-right:0.07142857142857144em;"&gt;&lt;span class="pstrut" style="height:2.5em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size3 size1 mtight"&gt;&lt;span class="mord mathdefault mtight"&gt;i&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-2.8448em;margin-right:0.07142857142857144em;"&gt;&lt;span class="pstrut" style="height:2.5em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size3 size1 mtight"&gt;&lt;span class="mord mtight"&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.3222857142857143em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-3.000325em;"&gt;&lt;span class="pstrut" style="height:3.428571428571429em;"&gt;&lt;/span&gt;&lt;span class="hide-tail mtight" style="min-width:0.853em;height:1.5428571428571431em;"&gt;&lt;svg width='400em' height='1.5428571428571431em' viewBox='0 0 400000 1080' preserveAspectRatio='xMinYMin slice'&gt;&lt;path d='M95,702
c-2.7,0,-7.17,-2.7,-13.5,-8c-5.8,-5.3,-9.5,-10,-9.5,-14
c0,-2,0.3,-3.3,1,-4c1.3,-2.7,23.83,-20.7,67.5,-54
c44.2,-33.3,65.8,-50.3,66.5,-51c1.3,-1.3,3,-2,5,-2c4.7,0,8.7,3.3,12,10
s173,378,173,378c0.7,0,35.3,-71,104,-213c68.7,-142,137.5,-285,206.5,-429
c69,-144,104.5,-217.7,106.5,-221
l0 -0
c5.3,-9.3,12,-14,20,-14
H400000v40H845.2724
s-225.272,467,-225.272,467s-235,486,-235,486c-2.7,4.7,-9,7,-19,7
c-6,0,-10,-1,-12,-3s-194,-422,-194,-422s-65,47,-65,47z
M834 80h400000v40h-400000z'/&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.4282464285714287em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-3.23em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="frac-line" style="border-bottom-width:0.04em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-3.394em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathdefault mtight" style="margin-right:0.03588em;"&gt;v&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.8295999999999999em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose nulldelimiter"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Otherwise, longer documents would naturally have higher TF-IDF magnitudes.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;Scikit-learn provides &lt;code&gt;TfidfVectorizer&lt;/code&gt;, which can convert a collection of text documents into a matrix of TF-IDF features. Here we visualise a heatmap of 4 simple texts to illustrate TF-IDF in effect:&lt;/p&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;

&lt;div class="inner_cell"&gt;
    &lt;div class="input_area"&gt;
&lt;div class=" highlight hl-ipython3"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;pandas&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;as&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;pd&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;seaborn&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;as&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;sns&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;matplotlib.pyplot&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;as&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;plt&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;sklearn.feature_extraction.text&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;TfidfVectorizer&lt;/span&gt;

&lt;span class="n"&gt;corpus&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="s2"&gt;&amp;quot;the cat sat on the mat&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;&amp;quot;the dog sat on the log&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;&amp;quot;cats and dogs are great pets&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;&amp;quot;the mat is on the floor&amp;quot;&lt;/span&gt;
&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="n"&gt;vectorizer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;TfidfVectorizer&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;tfidf_matrix&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;vectorizer&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;fit_transform&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;corpus&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;df_tfidf&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pd&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;DataFrame&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;tfidf_matrix&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;toarray&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; 
    &lt;span class="n"&gt;columns&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;vectorizer&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get_feature_names_out&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
    &lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Doc &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;corpus&lt;/span&gt;&lt;span class="p"&gt;))]&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;figure&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;figsize&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="n"&gt;sns&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;heatmap&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;df_tfidf&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;annot&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cmap&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;YlGnBu&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;TF-IDF Scores Heatmap&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;xticks&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;rotation&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;45&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;show&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

    &lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


</content><category term="permanent"/><category term="NaturalLanguageProcessing"/></entry><entry><title>Cardinality</title><link href="http://localhost:8000/cardinality.html" rel="alternate"/><published>2023-04-08T00:00:00+10:00</published><updated>2023-04-13T00:00:00+10:00</updated><author><name>Lex Toumbourou</name></author><id>tag:localhost,2023-04-08:/cardinality.html</id><summary type="html">&lt;p&gt;Cardinality refers to the number of elements a set contains.&lt;/p&gt;</summary><content type="html">&lt;p&gt;The cardinality of a &lt;a href="set.html"&gt;Set&lt;/a&gt; refers to the number of elements it contains.&lt;/p&gt;
&lt;p&gt;In math notation, we represent the cardinality of a set &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;S&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;S&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.68333em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.05764em;"&gt;S&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; as &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi mathvariant="normal"&gt;∣&lt;/mi&gt;&lt;mi&gt;S&lt;/mi&gt;&lt;mi mathvariant="normal"&gt;∣&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;|S|&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1em;vertical-align:-0.25em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;∣&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.05764em;"&gt;S&lt;/span&gt;&lt;span class="mord"&gt;∣&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;. For example, the set &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;S&lt;/mi&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mo stretchy="false"&gt;{&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;mo separator="true"&gt;,&lt;/mo&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;mo separator="true"&gt;,&lt;/mo&gt;&lt;mn&gt;3&lt;/mn&gt;&lt;mo stretchy="false"&gt;}&lt;/mo&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;S = \{1, 2, 3\}&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.68333em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.05764em;"&gt;S&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1em;vertical-align:-0.25em;"&gt;&lt;/span&gt;&lt;span class="mopen"&gt;{&lt;/span&gt;&lt;span class="mord"&gt;1&lt;/span&gt;&lt;span class="mpunct"&gt;,&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;2&lt;/span&gt;&lt;span class="mpunct"&gt;,&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;3&lt;/span&gt;&lt;span class="mclose"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; has a cardinality of 3, expressed as &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi mathvariant="normal"&gt;∣&lt;/mi&gt;&lt;mi&gt;S&lt;/mi&gt;&lt;mi mathvariant="normal"&gt;∣&lt;/mi&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mn&gt;3&lt;/mn&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;|S| = 3&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1em;vertical-align:-0.25em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;∣&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.05764em;"&gt;S&lt;/span&gt;&lt;span class="mord"&gt;∣&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.64444em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;3&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;.&lt;/p&gt;
&lt;p&gt;In machine learning, the &lt;em&gt;"cardinality of a feature"&lt;/em&gt; denotes the number of unique elements or categories within that feature. High-cardinality features may require feature engineering or be excluded entirely (for example, &lt;code&gt;user_id&lt;/code&gt;).&lt;/p&gt;
&lt;div clear="both"&gt;&lt;/div&gt;

&lt;h2 id="use-of-the-vertical-bar-a-notation"&gt;Use of the vertical bar &lt;code&gt;|A|&lt;/code&gt; notation&lt;/h2&gt;
&lt;p&gt;Initially it seemed confusing to me that mathematical notation employs the vertical bar symbol for different purposes.&lt;/p&gt;
&lt;p&gt;For instance:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The absolute value of a number &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;a&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.43056em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;a&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; is expressed as &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi mathvariant="normal"&gt;∣&lt;/mi&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mi mathvariant="normal"&gt;∣&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;|a|&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1em;vertical-align:-0.25em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;∣&lt;/span&gt;&lt;span class="mord mathdefault"&gt;a&lt;/span&gt;&lt;span class="mord"&gt;∣&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The &lt;a href="matrix-determinate.html"&gt;Matrix Determinate&lt;/a&gt; of a matrix &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi mathvariant="bold"&gt;M&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;\mathbf{M}&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.68611em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathbf"&gt;M&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; is expressed as &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi mathvariant="normal"&gt;∣&lt;/mi&gt;&lt;mi mathvariant="bold"&gt;M&lt;/mi&gt;&lt;mi mathvariant="normal"&gt;∣&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;|\mathbf{M}|&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1em;vertical-align:-0.25em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;∣&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathbf"&gt;M&lt;/span&gt;&lt;/span&gt;&lt;span class="mord"&gt;∣&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;:&lt;/p&gt;
&lt;p&gt;&lt;span class="katex-display"&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mtable columnalign="right" columnspacing="" rowspacing="0.24999999999999992em"&gt;&lt;mtr&gt;&lt;mtd&gt;&lt;mstyle displaystyle="true" scriptlevel="0"&gt;&lt;mrow&gt;&lt;mi mathvariant="bold"&gt;M&lt;/mi&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mrow&gt;&lt;mo fence="true"&gt;[&lt;/mo&gt;&lt;mtable columnspacing="1em" rowspacing="0.15999999999999992em"&gt;&lt;mtr&gt;&lt;mtd&gt;&lt;mstyle displaystyle="false" scriptlevel="0"&gt;&lt;mi&gt;A&lt;/mi&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;mtd&gt;&lt;mstyle displaystyle="false" scriptlevel="0"&gt;&lt;mi&gt;B&lt;/mi&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;/mtr&gt;&lt;mtr&gt;&lt;mtd&gt;&lt;mstyle displaystyle="false" scriptlevel="0"&gt;&lt;mi&gt;C&lt;/mi&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;mtd&gt;&lt;mstyle displaystyle="false" scriptlevel="0"&gt;&lt;mi&gt;D&lt;/mi&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;/mtr&gt;&lt;/mtable&gt;&lt;mo fence="true"&gt;]&lt;/mo&gt;&lt;/mrow&gt;&lt;mo separator="true"&gt;,&lt;/mo&gt;&lt;mspace width="1em"&gt;&lt;/mspace&gt;&lt;mi mathvariant="normal"&gt;∣&lt;/mi&gt;&lt;mi mathvariant="bold"&gt;M&lt;/mi&gt;&lt;mi mathvariant="normal"&gt;∣&lt;/mi&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mi&gt;A&lt;/mi&gt;&lt;mi&gt;D&lt;/mi&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;mi&gt;B&lt;/mi&gt;&lt;mi&gt;C&lt;/mi&gt;&lt;/mrow&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;/mtr&gt;&lt;/mtable&gt;&lt;annotation encoding="application/x-tex"&gt;
\begin{aligned}
\mathbf{M} = \begin{bmatrix}
A &amp;amp; B \\
C &amp;amp; D
\end{bmatrix}
,\quad
|\mathbf{M}| = AD - BC
\end{aligned}
&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:2.70003em;vertical-align:-1.1000150000000002em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mtable"&gt;&lt;span class="col-align-r"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:1.6000149999999997em;"&gt;&lt;span style="top:-3.6000150000000004em;"&gt;&lt;span class="pstrut" style="height:3.45em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;&lt;span class="mord mathbf"&gt;M&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="minner"&gt;&lt;span class="mopen delimcenter" style="top:0em;"&gt;&lt;span class="delimsizing size3"&gt;[&lt;/span&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mtable"&gt;&lt;span class="col-align-c"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:1.45em;"&gt;&lt;span style="top:-3.61em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;A&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-2.4099999999999997em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault" style="margin-right:0.07153em;"&gt;C&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.9500000000000004em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="arraycolsep" style="width:0.5em;"&gt;&lt;/span&gt;&lt;span class="arraycolsep" style="width:0.5em;"&gt;&lt;/span&gt;&lt;span class="col-align-c"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:1.45em;"&gt;&lt;span style="top:-3.61em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault" style="margin-right:0.05017em;"&gt;B&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-2.4099999999999997em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault" style="margin-right:0.02778em;"&gt;D&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.9500000000000004em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose delimcenter" style="top:0em;"&gt;&lt;span class="delimsizing size3"&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mpunct"&gt;,&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:1em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;∣&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathbf"&gt;M&lt;/span&gt;&lt;/span&gt;&lt;span class="mord"&gt;∣&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;A&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.02778em;"&gt;D&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;−&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.05017em;"&gt;B&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.07153em;"&gt;C&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:1.1000150000000002em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;However, these notations share a common theme of representing size or magnitude:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;In set theory, cardinality describes the size of a set by the number of elements it contains.&lt;/li&gt;
&lt;li&gt;For numbers, the absolute value captures the distance from zero on the number line.&lt;/li&gt;
&lt;li&gt;In linear algebra, the &lt;a href="matrix-determinate.html"&gt;Matrix Determinate&lt;/a&gt; determinant describes how much a &lt;a href="matrix-transformation.html"&gt;Matrix Transformation&lt;/a&gt; scales space.&lt;/li&gt;
&lt;/ul&gt;</content><category term="permanent"/><category term="SetTheory"/><category term="MachineLearning"/></entry><entry><title>Discrete Mathematics Course Notes</title><link href="http://localhost:8000/uol-discrete-mathematics.html" rel="alternate"/><published>2023-03-06T00:00:00+10:00</published><updated>2023-03-06T00:00:00+10:00</updated><author><name>Lex Toumbourou</name></author><id>tag:localhost,2023-03-06:/uol-discrete-mathematics.html</id><summary type="html">&lt;p&gt;Notes from &lt;a href="https://www.coursera.org/learn/uol-discrete-mathematics"&gt;Discrete Mathematics by University of London&lt;/a&gt;&lt;/p&gt;</summary><content type="html">&lt;p&gt;These are my notes from &lt;a href="https://www.coursera.org/learn/uol-discrete-mathematics/"&gt;Discrete Mathematics&lt;/a&gt; by the University of London.&lt;/p&gt;
&lt;p&gt;I took it as part of the BSc Computer Science degree from Oct 2022 - March 2023.&lt;/p&gt;
&lt;p&gt;The books required:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.amazon.com.au/Discrete-Mathematics-Applications-Kenneth-Rosen/dp/0072899050"&gt;Kenneth, H, Rosen. Discrete Mathematics and its Applications. (2012) Global Edition&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.amazon.com/Computing-Undergraduate-Topics-Computer-Science/dp/1447124995"&gt;David Mackinson, Sets, Logic and Maths for Computing, Springer Verlag. 2012&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="intro"&gt;Intro&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="discrete-maths.html"&gt;Discrete Maths&lt;/a&gt;&lt;ul&gt;
&lt;li&gt;The study of discrete objects.&lt;/li&gt;
&lt;li&gt;Discrete objects are different from "connected objects".&lt;ul&gt;
&lt;li&gt;separated and distance from each other&lt;/li&gt;
&lt;li&gt;examples: integer, positions, set, relationships, functions&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Increasingly applied to practical fields of math and science.&lt;/li&gt;
&lt;li&gt;Improves reasoning and problem-solving.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Course instructor is &lt;a href="https://www.gold.ac.uk/computing/people/l-ouarbya/"&gt;Dr Lahcen Ouarbya&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="contents"&gt;Contents&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="week-1-sets-a.html"&gt;UOL Discrete Maths - Week 1 - Sets A&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="week-2-sets-b.html"&gt;Week 2 - Sets B&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="week-3-functions-a.html"&gt;Week 3 - Functions A&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="week-4-functions-b.html"&gt;Week 4 - Functions B&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="week-5-propositional-logic-a.html"&gt;Week 5 - Propositional Logic A&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="week-6-propositional-logic-b.html"&gt;Week 6 - Propositional Logic B&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="week-7-predicate-logic-a.html"&gt;Week 7 - Predicate Logic A&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="week-8-predicate-logic-b.html"&gt;Week 8 - Predicate Logic B&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="week-9-boolean-algebra-a.html"&gt;Week 9 - Boolean Algebra A&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="week-10-boolean-algebra-b.html"&gt;Week 10 - Boolean Algebra B&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="mid-term-assessment.html"&gt;Mid-Term Assessment&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="week-11-mathematical-induction-a.html"&gt;Week 11 - Mathematical Induction A&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="week-12-recursion-b.html"&gt;Week 12 - Recursion B&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="week-13-graphs-a.html"&gt;Week 13 - Graphs A&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="week-14-graphs-b.html"&gt;Week 14 - Graphs B&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="week-15-trees-a.html"&gt;Week 15 - Trees A&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="week-16-trees-b.html"&gt;Week 16 - Trees B&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="week-17-relations-a.html"&gt;Week 17 - Relations A&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="week-18-relations-b.html"&gt;Week 18 - Relations B&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="week-19-combinatorics-a.html"&gt;Week 19 - Combinatorics A&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="week-20-combinatorics-b.html"&gt;Week 20 - Combinatorics B&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="final-exam.html"&gt;Final Exam&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content><category term="reference"/><category term="DiscreteMath"/></entry><entry><title>Set</title><link href="http://localhost:8000/set.html" rel="alternate"/><published>2023-01-15T00:00:00+10:00</published><updated>2023-04-13T00:00:00+10:00</updated><author><name>Lex Toumbourou</name></author><id>tag:localhost,2023-01-15:/set.html</id><summary type="html">&lt;p&gt;A set is a unique collection of well-defined objects.&lt;/p&gt;</summary><content type="html">&lt;p&gt;A set is a unique collection of well-defined objects.&lt;/p&gt;
&lt;p&gt;Objects in a set are called &lt;strong&gt;elements&lt;/strong&gt; or &lt;strong&gt;members&lt;/strong&gt; of the set.&lt;/p&gt;
&lt;p&gt;We often refer to sets in everyday language: you may have heard of a tea set, a drum set, a set of action figurines, etc. These terms refer to specific collections of objects. It is clear which objects in are members of each set and which are not.&lt;/p&gt;
&lt;p&gt;Sets are commonly notated using curly braces. For example:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The set of numbers from 1 to 3: &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;A&lt;/mi&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mo stretchy="false"&gt;{&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;mo separator="true"&gt;,&lt;/mo&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;mo separator="true"&gt;,&lt;/mo&gt;&lt;mn&gt;3&lt;/mn&gt;&lt;mo stretchy="false"&gt;}&lt;/mo&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;A = \{1, 2, 3\}&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.68333em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;A&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1em;vertical-align:-0.25em;"&gt;&lt;/span&gt;&lt;span class="mopen"&gt;{&lt;/span&gt;&lt;span class="mord"&gt;1&lt;/span&gt;&lt;span class="mpunct"&gt;,&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;2&lt;/span&gt;&lt;span class="mpunct"&gt;,&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;3&lt;/span&gt;&lt;span class="mclose"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;A set of words: &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;B&lt;/mi&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mo stretchy="false"&gt;{&lt;/mo&gt;&lt;mtext&gt;hello&lt;/mtext&gt;&lt;mo separator="true"&gt;,&lt;/mo&gt;&lt;mtext&gt;world&lt;/mtext&gt;&lt;mo stretchy="false"&gt;}&lt;/mo&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;B = \{\text{hello}, \text{world}\}&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.68333em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.05017em;"&gt;B&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1em;vertical-align:-0.25em;"&gt;&lt;/span&gt;&lt;span class="mopen"&gt;{&lt;/span&gt;&lt;span class="mord text"&gt;&lt;span class="mord"&gt;hello&lt;/span&gt;&lt;/span&gt;&lt;span class="mpunct"&gt;,&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mord text"&gt;&lt;span class="mord"&gt;world&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="membership"&gt;Membership&lt;/h2&gt;
&lt;p&gt;The elements of a set must be well-defined, and there should be no ambiguity about whether something is a set member or not.&lt;/p&gt;
&lt;p&gt;We use the &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mo&gt;∈&lt;/mo&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;\in&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.5782em;vertical-align:-0.0391em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;∈&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; notation to describe if something is a set member:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;mo&gt;∈&lt;/mo&gt;&lt;mi&gt;A&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;1 \in A&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.68354em;vertical-align:-0.0391em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;1&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;∈&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.68333em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;A&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mtext&gt;hello&lt;/mtext&gt;&lt;mo&gt;∈&lt;/mo&gt;&lt;mi&gt;B&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;\text{hello} \in B&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.73354em;vertical-align:-0.0391em;"&gt;&lt;/span&gt;&lt;span class="mord text"&gt;&lt;span class="mord"&gt;hello&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;∈&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.68333em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.05017em;"&gt;B&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;We use the &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mo mathvariant="normal"&gt;∉&lt;/mo&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;\notin&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1em;vertical-align:-0.25em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;&lt;span class="mord"&gt;&lt;span class="mrel"&gt;∈&lt;/span&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.75em;"&gt;&lt;span style="top:-3em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="llap"&gt;&lt;span class="strut" style="height:1em;vertical-align:-0.25em;"&gt;&lt;/span&gt;&lt;span class="inner"&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;/&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.05555555555555555em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="fix"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.25em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; notation to describe if something is a not set member:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mn&gt;99&lt;/mn&gt;&lt;mo mathvariant="normal"&gt;∉&lt;/mo&gt;&lt;mi&gt;A&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;99 \notin A&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1em;vertical-align:-0.25em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;9&lt;/span&gt;&lt;span class="mord"&gt;9&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;&lt;span class="mord"&gt;&lt;span class="mrel"&gt;∈&lt;/span&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.75em;"&gt;&lt;span style="top:-3em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="llap"&gt;&lt;span class="strut" style="height:1em;vertical-align:-0.25em;"&gt;&lt;/span&gt;&lt;span class="inner"&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;/&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.05555555555555555em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="fix"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.25em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.68333em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;A&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mtext&gt;goodbye&lt;/mtext&gt;&lt;mo mathvariant="normal"&gt;∉&lt;/mo&gt;&lt;mi&gt;B&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;\text{goodbye} \notin B&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1em;vertical-align:-0.25em;"&gt;&lt;/span&gt;&lt;span class="mord text"&gt;&lt;span class="mord"&gt;goodbye&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;&lt;span class="mord"&gt;&lt;span class="mrel"&gt;∈&lt;/span&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.75em;"&gt;&lt;span style="top:-3em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="llap"&gt;&lt;span class="strut" style="height:1em;vertical-align:-0.25em;"&gt;&lt;/span&gt;&lt;span class="inner"&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;/&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.05555555555555555em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="fix"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.25em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.68333em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.05017em;"&gt;B&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The symbols in Latex are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mo&gt;∈&lt;/mo&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;\in&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.5782em;vertical-align:-0.0391em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;∈&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;: &lt;code&gt;\in&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mo mathvariant="normal"&gt;∉&lt;/mo&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;\notin&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1em;vertical-align:-0.25em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;&lt;span class="mord"&gt;&lt;span class="mrel"&gt;∈&lt;/span&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.75em;"&gt;&lt;span style="top:-3em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="llap"&gt;&lt;span class="strut" style="height:1em;vertical-align:-0.25em;"&gt;&lt;/span&gt;&lt;span class="inner"&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;/&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.05555555555555555em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="fix"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.25em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;: &lt;code&gt;\notin&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;A set can be a member of another set. Interestingly, this fact means that the definition of a "set" is circular, making it technically an undefined term.&lt;/p&gt;
&lt;h2 id="uniqueness"&gt;Uniqueness&lt;/h2&gt;
&lt;p&gt;Sets do not have duplicates; therefore:&lt;/p&gt;
&lt;p&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;A&lt;/mi&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mo stretchy="false"&gt;{&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;mo separator="true"&gt;,&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;mo separator="true"&gt;,&lt;/mo&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;mo stretchy="false"&gt;}&lt;/mo&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mo stretchy="false"&gt;{&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;mo separator="true"&gt;,&lt;/mo&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;mo stretchy="false"&gt;}&lt;/mo&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;A = \{1, 1, 2\} = \{1, 2\}&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.68333em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;A&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1em;vertical-align:-0.25em;"&gt;&lt;/span&gt;&lt;span class="mopen"&gt;{&lt;/span&gt;&lt;span class="mord"&gt;1&lt;/span&gt;&lt;span class="mpunct"&gt;,&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;1&lt;/span&gt;&lt;span class="mpunct"&gt;,&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;2&lt;/span&gt;&lt;span class="mclose"&gt;}&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1em;vertical-align:-0.25em;"&gt;&lt;/span&gt;&lt;span class="mopen"&gt;{&lt;/span&gt;&lt;span class="mord"&gt;1&lt;/span&gt;&lt;span class="mpunct"&gt;,&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;2&lt;/span&gt;&lt;span class="mclose"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;This property means sets are practically helpful for finding unique counts of things, and they often appear in programming for this purpose and many others.&lt;/p&gt;
&lt;h2 id="subsets"&gt;Subsets&lt;/h2&gt;
&lt;p&gt;If every element in set &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;A&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;A&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.68333em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;A&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; is in set &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;B&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;B&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.68333em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.05017em;"&gt;B&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;, we consider set &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;A&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;A&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.68333em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;A&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; to be a subset of &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;B&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;B&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.68333em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.05017em;"&gt;B&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;. The notation for subset is &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;A&lt;/mi&gt;&lt;mo&gt;⊆&lt;/mo&gt;&lt;mi&gt;B&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;A \subseteq B&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.8193em;vertical-align:-0.13597em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;A&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;⊆&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.68333em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.05017em;"&gt;B&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;. In LaTeX, we use: \subseteq&lt;/p&gt;
&lt;p&gt;For example, the set of days on the weekend is a subset of the days in the week:&lt;/p&gt;
&lt;p&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mo stretchy="false"&gt;{&lt;/mo&gt;&lt;mtext&gt;Sunday&lt;/mtext&gt;&lt;mo separator="true"&gt;,&lt;/mo&gt;&lt;mtext&gt;Saturday&lt;/mtext&gt;&lt;mo stretchy="false"&gt;}&lt;/mo&gt;&lt;mo&gt;⊆&lt;/mo&gt;&lt;mo stretchy="false"&gt;{&lt;/mo&gt;&lt;mtext&gt;Sunday&lt;/mtext&gt;&lt;mo separator="true"&gt;,&lt;/mo&gt;&lt;mtext&gt;Monday&lt;/mtext&gt;&lt;mo separator="true"&gt;,&lt;/mo&gt;&lt;mtext&gt;Tuesday&lt;/mtext&gt;&lt;mo separator="true"&gt;,&lt;/mo&gt;&lt;mtext&gt;Wednesday&lt;/mtext&gt;&lt;mo separator="true"&gt;,&lt;/mo&gt;&lt;mtext&gt;Thursday&lt;/mtext&gt;&lt;mo separator="true"&gt;,&lt;/mo&gt;&lt;mtext&gt;Friday&lt;/mtext&gt;&lt;mo separator="true"&gt;,&lt;/mo&gt;&lt;mtext&gt;Saturday&lt;/mtext&gt;&lt;mo stretchy="false"&gt;}&lt;/mo&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;\{\text{Sunday}, \text{Saturday}\} \subseteq \{\text{Sunday}, \text{Monday}, \text{Tuesday}, \text{Wednesday}, \text{Thursday}, \text{Friday}, \text{Saturday}\}&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1em;vertical-align:-0.25em;"&gt;&lt;/span&gt;&lt;span class="mopen"&gt;{&lt;/span&gt;&lt;span class="mord text"&gt;&lt;span class="mord"&gt;Sunday&lt;/span&gt;&lt;/span&gt;&lt;span class="mpunct"&gt;,&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mord text"&gt;&lt;span class="mord"&gt;Saturday&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose"&gt;}&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;⊆&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1em;vertical-align:-0.25em;"&gt;&lt;/span&gt;&lt;span class="mopen"&gt;{&lt;/span&gt;&lt;span class="mord text"&gt;&lt;span class="mord"&gt;Sunday&lt;/span&gt;&lt;/span&gt;&lt;span class="mpunct"&gt;,&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mord text"&gt;&lt;span class="mord"&gt;Monday&lt;/span&gt;&lt;/span&gt;&lt;span class="mpunct"&gt;,&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mord text"&gt;&lt;span class="mord"&gt;Tuesday&lt;/span&gt;&lt;/span&gt;&lt;span class="mpunct"&gt;,&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mord text"&gt;&lt;span class="mord"&gt;Wednesday&lt;/span&gt;&lt;/span&gt;&lt;span class="mpunct"&gt;,&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mord text"&gt;&lt;span class="mord"&gt;Thursday&lt;/span&gt;&lt;/span&gt;&lt;span class="mpunct"&gt;,&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mord text"&gt;&lt;span class="mord"&gt;Friday&lt;/span&gt;&lt;/span&gt;&lt;span class="mpunct"&gt;,&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mord text"&gt;&lt;span class="mord"&gt;Saturday&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h2 id="supersets"&gt;Supersets&lt;/h2&gt;
&lt;p&gt;Conversely, we consider &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;B&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;B&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.68333em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.05017em;"&gt;B&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; to contain &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;A&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;A&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.68333em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;A&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;, denoted as &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;B&lt;/mi&gt;&lt;mo&gt;⊇&lt;/mo&gt;&lt;mi&gt;A&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;B \supseteq A&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.8193em;vertical-align:-0.13597em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.05017em;"&gt;B&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;⊇&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.68333em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;A&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;. We say that &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;B&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;B&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.68333em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.05017em;"&gt;B&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; is a superset of &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;A&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;A&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.68333em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;A&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;.&lt;/p&gt;
&lt;p&gt;If &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;A&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;A&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.68333em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;A&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; is not a subset of &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;B&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;B&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.68333em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.05017em;"&gt;B&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;, we write &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;A&lt;/mi&gt;&lt;mo&gt;⊈&lt;/mo&gt;&lt;mi&gt;B&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;A \nsubseteq B&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1.09657em;vertical-align:-0.30274em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;A&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel amsrm"&gt;⊈&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.68333em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.05017em;"&gt;B&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;. In LaTeX, it's: \nsubseteq&lt;/p&gt;
&lt;h2 id="cardinality"&gt;Cardinality&lt;/h2&gt;
&lt;p&gt;The number of elements in a set is called &lt;a href="cardinality.html"&gt;Cardinality&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="equal-sets"&gt;Equal Sets&lt;/h2&gt;
&lt;p&gt;When 2 sets contain the same elements, we consider them &lt;strong&gt;equal sets&lt;/strong&gt;: &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;A&lt;/mi&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mi&gt;B&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;A == B&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.68333em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;A&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.36687em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.68333em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.05017em;"&gt;B&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;.&lt;/p&gt;
&lt;h2 id="empty-set"&gt;Empty Set&lt;/h2&gt;
&lt;p&gt;When a set has no elements it's called the &lt;strong&gt;empty set&lt;/strong&gt;: &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi mathvariant="normal"&gt;∅&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;\emptyset&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.80556em;vertical-align:-0.05556em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;∅&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;: &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi mathvariant="normal"&gt;∅&lt;/mi&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mo stretchy="false"&gt;{&lt;/mo&gt;&lt;mo stretchy="false"&gt;}&lt;/mo&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;\emptyset = \{\}&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.80556em;vertical-align:-0.05556em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;∅&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1em;vertical-align:-0.25em;"&gt;&lt;/span&gt;&lt;span class="mopen"&gt;{&lt;/span&gt;&lt;span class="mclose"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;. The empty set is a subset of every other set.&lt;/p&gt;
&lt;h2 id="universal-set"&gt;Universal Set&lt;/h2&gt;
&lt;p&gt;A special set called the universal set &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;U&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;U&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.68333em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.10903em;"&gt;U&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;, is a set where every other set is a subset of &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;U&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;U&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.68333em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.10903em;"&gt;U&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;.&lt;/p&gt;
&lt;p&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;A&lt;/mi&gt;&lt;mo&gt;⊆&lt;/mo&gt;&lt;mi&gt;U&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;A \subseteq U&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.8193em;vertical-align:-0.13597em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;A&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;⊆&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.68333em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.10903em;"&gt;U&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; for every set &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;A&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;A&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.68333em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;A&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h2 id="disjoint-sets"&gt;Disjoint Sets&lt;/h2&gt;
&lt;p&gt;A set may not have common elements. These are called disjoint sets. For example, a set of integers and a set of letters are disjoint sets.&lt;/p&gt;
&lt;h2 id="power-set"&gt;Power Set&lt;/h2&gt;
&lt;p&gt;The power set is a subset representing all subsets of set A, written as &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;P&lt;/mi&gt;&lt;mo stretchy="false"&gt;(&lt;/mo&gt;&lt;mi&gt;A&lt;/mi&gt;&lt;mo stretchy="false"&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;P(A)&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1em;vertical-align:-0.25em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.13889em;"&gt;P&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord mathdefault"&gt;A&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;.&lt;/p&gt;
&lt;p&gt;For example, the power set of &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;A&lt;/mi&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mo stretchy="false"&gt;{&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;mo separator="true"&gt;,&lt;/mo&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;mo stretchy="false"&gt;}&lt;/mo&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;A = \{1, 2\}&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.68333em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;A&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1em;vertical-align:-0.25em;"&gt;&lt;/span&gt;&lt;span class="mopen"&gt;{&lt;/span&gt;&lt;span class="mord"&gt;1&lt;/span&gt;&lt;span class="mpunct"&gt;,&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;2&lt;/span&gt;&lt;span class="mclose"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;:&lt;/p&gt;
&lt;p&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;P&lt;/mi&gt;&lt;mo stretchy="false"&gt;(&lt;/mo&gt;&lt;mi&gt;A&lt;/mi&gt;&lt;mo stretchy="false"&gt;)&lt;/mo&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mo stretchy="false"&gt;{&lt;/mo&gt;&lt;mi mathvariant="normal"&gt;∅&lt;/mi&gt;&lt;mo separator="true"&gt;,&lt;/mo&gt;&lt;mo stretchy="false"&gt;{&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;mo stretchy="false"&gt;}&lt;/mo&gt;&lt;mo separator="true"&gt;,&lt;/mo&gt;&lt;mo stretchy="false"&gt;{&lt;/mo&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;mo stretchy="false"&gt;}&lt;/mo&gt;&lt;mo separator="true"&gt;,&lt;/mo&gt;&lt;mo stretchy="false"&gt;{&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;mo separator="true"&gt;,&lt;/mo&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;mo stretchy="false"&gt;}&lt;/mo&gt;&lt;mo stretchy="false"&gt;}&lt;/mo&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;P(A) = \{\emptyset, \{1\}, \{2\}, \{1, 2\}\}&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1em;vertical-align:-0.25em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.13889em;"&gt;P&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord mathdefault"&gt;A&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1em;vertical-align:-0.25em;"&gt;&lt;/span&gt;&lt;span class="mopen"&gt;{&lt;/span&gt;&lt;span class="mord"&gt;∅&lt;/span&gt;&lt;span class="mpunct"&gt;,&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mopen"&gt;{&lt;/span&gt;&lt;span class="mord"&gt;1&lt;/span&gt;&lt;span class="mclose"&gt;}&lt;/span&gt;&lt;span class="mpunct"&gt;,&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mopen"&gt;{&lt;/span&gt;&lt;span class="mord"&gt;2&lt;/span&gt;&lt;span class="mclose"&gt;}&lt;/span&gt;&lt;span class="mpunct"&gt;,&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mopen"&gt;{&lt;/span&gt;&lt;span class="mord"&gt;1&lt;/span&gt;&lt;span class="mpunct"&gt;,&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;2&lt;/span&gt;&lt;span class="mclose"&gt;}&lt;/span&gt;&lt;span class="mclose"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h2 id="infinite-and-finite-sets"&gt;Infinite and finite sets&lt;/h2&gt;
&lt;p&gt;If a set has an infinite number of elements, we call it an infinite set.&lt;/p&gt;
&lt;p&gt;Some &lt;a href="special-infinite-sets.html"&gt;Special Infinite Set&lt;/a&gt; come up frequently in Math.&lt;/p&gt;
&lt;hr&gt;

&lt;p&gt;Cover by &lt;a href="https://unsplash.com/ko/@ahlianyq?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText"&gt;ahlianyq&lt;/a&gt; on &lt;a href="https://unsplash.com/photos/Cu80T4bZ0rI?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText"&gt;Unsplash&lt;/a&gt;.&lt;/p&gt;</content><category term="permanent"/><category term="SetTheory"/><category term="DiscreteMath"/></entry><entry><title>Disputing A Parking Fine with ChatGPT</title><link href="http://localhost:8000/disputing-a-parking-fine-with-chatgpt.html" rel="alternate"/><published>2022-12-10T00:00:00+10:00</published><updated>2022-12-10T00:00:00+10:00</updated><author><name>Lex Toumbourou</name></author><id>tag:localhost,2022-12-10:/disputing-a-parking-fine-with-chatgpt.html</id><summary type="html">&lt;p&gt;A use case for ChatGPT&lt;/p&gt;</summary><content type="html">&lt;p&gt;This article covers a use case for &lt;a href="https://chat.openai.com/"&gt;ChatGPT&lt;/a&gt;, an exciting new product by &lt;a href="https://chat.openai.com/"&gt;OpenAI&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;This post made it to the front page of Hacker News. See the discussion &lt;a href="https://news.ycombinator.com/item?id=33937753"&gt;here&lt;/a&gt;. Sydney Morning Herald also mentioned the story in an &lt;a href="https://www.smh.com.au/technology/will-ai-rescue-us-from-the-yoke-of-futile-jobs-20221213-p5c5zj.html"&gt;article on chatbots&lt;/a&gt;.&lt;/p&gt;
&lt;hr&gt;
&lt;style&gt;
img {
    border: 1px solid #000;
   border-radius: 8px;
}
&lt;/style&gt;

&lt;p&gt;Recently, on holidays in Far North Queensland, my wife and I parked our rental car in a paid parking lot to visit a restaurant.&lt;/p&gt;
&lt;p&gt;I paid using the EasyPark App per the council's instruction on various signs throughout the lot.&lt;/p&gt;
&lt;p&gt;When we returned, they had slapped a fine on our Toyota anyway.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Parking Fine" src="../_media/chatgpt1-parking-fine.png"&gt;&lt;/p&gt;
&lt;p&gt;I double-checked what I had entered into the app. I mistyped the number plate by one letter. Oops.&lt;/p&gt;
&lt;p&gt;Since we have never received a parking fine before, and I had proof of payment, I knew there was a good chance the council would let me off if I sent a letter of explanation.&lt;/p&gt;
&lt;p&gt;We had already been experimenting with ChatGPT, and the letter seemed a good test case.&lt;/p&gt;
&lt;p&gt;&lt;img alt="This is the prompt I first put into ChatGPT" src="../_media/chatgpt1-prompt1.png"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="This is the first response I first put into ChatGPT" src="../_media/chatgpt1-response1.png"&gt;&lt;/p&gt;
&lt;p&gt;The first response was close but longer than I would like. Plus, I didn't tell it that I was planning to attach a photo of the fine and proof of payment.&lt;/p&gt;
&lt;p&gt;&lt;img alt="The 2nd prompt passed to ChatGPT" src="../_media/chatgpt1-prompt2-response2.png"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="ChatGPT 2nd Response" src="../_media/chatgpt1-response2.png"&gt;&lt;/p&gt;
&lt;p&gt;That works. Now for a title.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Title request" src="../_media/chatgpt1-title.png"&gt;&lt;/p&gt;
&lt;p&gt;I emailed that&lt;small&gt;*&lt;/small&gt; from my phone and a day later received this response.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Response from Council" src="../_media/chatgpt1-response-email.png"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="Council response" src="../_media/chatgpt1-council-response.png"&gt;&lt;/p&gt;
&lt;p&gt;So you can dispute a parking fine with ChatGPT.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;ChatGPT is incredible - I cannot believe how well this technology works. It's like having a talented personal assistant (who is often wrong - need to read their work thoroughly) at your fingertips.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;small&gt;
* I used ChatGPT from my phone and didn't screenshot the prompt, so I had to generate a new prompt/response for this blog post. It's similar enough that I'm sure it would work too.
&lt;/small&gt;&lt;/p&gt;</content><category term="permanent"/><category term="LargeLanguageModels"/></entry><entry><title>Idempotent Data Pipelines</title><link href="http://localhost:8000/idempotent-data-pipelines.html" rel="alternate"/><published>2022-07-17T00:00:00+10:00</published><updated>2022-07-17T00:00:00+10:00</updated><author><name>Lex Toumbourou</name></author><id>tag:localhost,2022-07-17:/idempotent-data-pipelines.html</id><summary type="html">&lt;p&gt;Idempotence is a key property of a fault tolerant and easy-to-operate data pipeline&lt;/p&gt;</summary><content type="html">&lt;p&gt;A key property of a fault-tolerant and easy-to-operate data pipeline is idempotence. &lt;sup id="fnref:1"&gt;&lt;a class="footnote-ref" href="#fn:1"&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;p&gt;When an operation is idempotent, it means if we perform it multiple times, the result will be the same as if we ran it once. In math, we express an idempotent function as: &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;f&lt;/mi&gt;&lt;mo stretchy="false"&gt;(&lt;/mo&gt;&lt;mi&gt;f&lt;/mi&gt;&lt;mo stretchy="false"&gt;(&lt;/mo&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;mo stretchy="false"&gt;)&lt;/mo&gt;&lt;mo stretchy="false"&gt;)&lt;/mo&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mi&gt;f&lt;/mi&gt;&lt;mo stretchy="false"&gt;(&lt;/mo&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;mo stretchy="false"&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;f(f(x)) = f(x)&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1em;vertical-align:-0.25em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.10764em;"&gt;f&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.10764em;"&gt;f&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord mathdefault"&gt;x&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1em;vertical-align:-0.25em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.10764em;"&gt;f&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord mathdefault"&gt;x&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;.&lt;/p&gt;
&lt;p&gt;Consider a simple data pipeline task that loads and transforms source records into batches, then stores the result in a relational database.&lt;/p&gt;
&lt;p&gt;If a pipeline is not idempotent, running the job twice would generate 2x as many records as running it once. Therefore we must take care only to run our job once. If the pipeline fails halfway through, we must ensure that we resume it from where it broke. However, if it failed midway through a batch (especially one that partially succeeded in writing to the database), it may become difficult or near impossible to resume. Our only action is to clear the destination database and run the pipeline from the start or manually correct the destination database by hand.&lt;/p&gt;
&lt;p&gt;On the other hand, an idempotent pipeline can be run infinite times and only generates one set of records. With this configuration, we can safely resume from somewhere before the failed batch, in or worst case, restart the entire pipeline from scratch. We could even have pipeline tasks automatically restart on failure.&lt;/p&gt;
&lt;p&gt;&lt;img src="/_media/idempotent-data-pipeline-example.png"&gt;&lt;/img&gt; &lt;sup id="fnref:2"&gt;&lt;a class="footnote-ref" href="#fn:2"&gt;2&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;p&gt;To achieve idempotence, we must figure out how to uniquely identify our transformed records. Sometimes this is as simple as taking a primary key already provided in the source data. Other times we need to concatenate metadata together to identify a record uniquely. Sometimes the entire body of a source record must be hashed to identify it uniquely.&lt;/p&gt;
&lt;p&gt;A side benefit of doing this is that you will have a richer understanding of your source data and transformations. It will force you to think about what makes each record unique and what you consider a duplicate.&lt;/p&gt;
&lt;p&gt;&lt;img src="/_media/idempotent-unique-identifier.png"&gt;&lt;/img&gt;&lt;/p&gt;
&lt;p&gt;Now our pipeline can use the unique identifier to check if the destination record exists, performing either an update, delete or perform a no-op, depending on what makes sense for our problem. Another advantage of doing it this way means if our transformations need adjustments, we can make them and rerun the pipeline when needed.&lt;/p&gt;
&lt;p&gt;Performing a query to check for existing records will add performance overhead to the pipeline; however, the savings in operational complexity far outweigh the penalty in my experience. If you can just rerun parts of your system on errors, or when you find that your transforms need to be updated, you will spend far less time babysitting them.&lt;/p&gt;
&lt;p&gt;It's not just pipelines that benefit from idempotence. In &lt;a href="https://ericlathrop.com/2021/04/idempotence-now-prevents-pain-later/"&gt;a blog post&lt;/a&gt;, Eric Lathrop describes a customer billing operation that he makes dramatically easier to operate after introducing idempotence.&lt;/p&gt;
&lt;p&gt;It's much easier to build idempotence from the start than bolting it on later.&lt;/p&gt;
&lt;div class="footnote"&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id="fn:1"&gt;
&lt;p&gt;Idempotence is closely related to &lt;a href="https://en.wikipedia.org/wiki/Declarative_programming"&gt;Declarative programming&lt;/a&gt;, a paradigm used amongst Infrastructure As Code practitioners.&amp;#160;&lt;a class="footnote-backref" href="#fnref:1" title="Jump back to footnote 1 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:2"&gt;
&lt;p&gt;Inspired by &lt;a href="https://livebook.manning.com/concept/apache-airflow/idempotent-task"&gt;this&lt;/a&gt; diagram from Data Pipelines with Apache Airflow.&amp;#160;&lt;a class="footnote-backref" href="#fnref:2" title="Jump back to footnote 2 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</content><category term="permanent"/><category term="DataEngineering"/></entry><entry><title>An Interface Should Respond Within A Tenth Of A Second</title><link href="http://localhost:8000/an-interface-should-respond-within-a-tenth-of-a-second.html" rel="alternate"/><published>2022-07-03T00:00:00+10:00</published><updated>2022-07-03T00:00:00+10:00</updated><author><name>Lex Toumbourou</name></author><id>tag:localhost,2022-07-03:/an-interface-should-respond-within-a-tenth-of-a-second.html</id><summary type="html">&lt;p&gt;Developers must be vigilant of slow user interfaces&lt;/p&gt;</summary><content type="html">&lt;blockquote&gt;
&lt;p&gt;"if your interface does not respond within a tenth of a second, the player will feel like something is wrong with the interface."
- James Schell, The Art of Game Design: A Book of Lenses &lt;sup id="fnref:1"&gt;&lt;a class="footnote-ref" href="#fn:1"&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;According to &lt;a href="https://www.nngroup.com/articles/response-times-3-important-limits"&gt;studies&lt;/a&gt; &lt;sup id="fnref:2"&gt;&lt;a class="footnote-ref" href="#fn:2"&gt;2&lt;/a&gt;&lt;/sup&gt;, 0.1 seconds is roughly the response time limit for a user to feel like they are in control of an interface.&lt;/p&gt;
&lt;p&gt;Up to 1 second is the cut-off for a user's flow to remain uninterrupted, though they will not feel in control.&lt;/p&gt;
&lt;p&gt;Ten seconds is the hard limit for keeping a user's attention focused. After that, they will want to do other things while waiting for the interface to respond.&lt;/p&gt;
&lt;p&gt;You can try it yourself. Each button here will change color when clicked and respond in the time shown in the button text.&lt;/p&gt;
&lt;style&gt;
.buttons {
    width: 100%;
    display: flex;
    flex-flow: wrap;
}

a.btn {
    padding: 0 1.25rem;
    line-height: 2.125rem;
    font-size: 0.875rem;
    font-weight: 400;
    text-align: center;
    margin: 0.5rem;
    border-radius: 0.5em;
    background-color: #7187A2;
    color: #fff;
    text-decoration: none;
    overflow: hidden;
    cursor: pointer;
    vertical-align: middle;
    outline: none;
    touch-action: none !important;
    -webkit-tap-highlight-color: rgba(0,0,0,0);
}

@keyframes pulse {
    0% {
        transform: scale(0.95);
        box-shadow: 0 0 0 0 rgba(0, 0, 0, 0.7);
    }

    70% {
        transform: scale(1);
        box-shadow: 0 0 0 10px rgba(0, 0, 0, 0);
    }

    100% {
        transform: scale(0.95);
        box-shadow: 0 0 0 0 rgba(0, 0, 0, 0);
    }
}
&lt;/style&gt;

&lt;script&gt;
const colors = ["rgb(113, 135, 162)", "rgb(255, 105, 180)", "rgb(255, 0, 0)", "rgb(255, 142, 0)", "rgb(255, 209, 0)", "rgb(0, 142, 0)", "rgb(0, 192, 192)", "rgb(64, 0, 152)", "rgb(142, 0, 142)"];

// Thanks to https://stackoverflow.com/questions/34458815/comparing-rgb-colors-in-javascript
function rgbExtract(s) {
  var match = /^\s*rgb\(\s*(\d+),\s*(\d+),\s*(\d+)\)\s*$/.exec(s);
  if (match === null) {
    return null;
  }
  return {
    r: parseInt(match[1], 10),
    g: parseInt(match[2], 10),
    b: parseInt(match[3], 10)
  };
}

function rgbMatches(sText, tText) {
  var sColor = rgbExtract(sText),
    tColor = rgbExtract(tText);
  if (sColor === null || tColor === null) {
    return false;
  }
  var componentNames = ['r', 'g', 'b'];
  for (var i = 0; i &lt; componentNames.length; ++i) {
    var name = componentNames[i];
    if (sColor[name] != tColor[name]) {
      return false;
    }
  }
  return true;
}

function toggleLoading(el, isOn) {
    if (isOn) {
        el.style.animation = "pulse 2s linear infinite"
    }
    else {
        el.style.removeProperty("animation");
    }
}

function changeColor(delay, id, loading) {
  var el = document.getElementById(id);

  if (loading) {
      toggleLoading(el, true)
  }

  setTimeout(() =&gt; {
    let color = window.getComputedStyle(el).getPropertyValue('background-color');
    var colorIndex = colors.findIndex(candidateColor =&gt; rgbMatches(candidateColor, color));
    var nextIndex = (colorIndex + 1) % colors.length;
    var nextColor = colors[nextIndex];
    el.style.backgroundColor = nextColor;
    toggleLoading(el, false)
  }, delay);
}
&lt;/script&gt;

&lt;div class="buttons"&gt;
    &lt;a onclick="changeColor(50, this.id)" id="btn-1" class="btn"&gt;&lt;span&gt;0.05 secs&lt;/span&gt;&lt;/a&gt;
    &lt;a onclick="changeColor(100, this.id)" id="btn-2" class="btn"&gt;&lt;span&gt;0.1 secs&lt;/span&gt;&lt;/a&gt;
    &lt;a onclick="changeColor(500, this.id)" id="btn-3" class="btn"&gt;&lt;span&gt;0.5 secs&lt;/span&gt;&lt;/a&gt;
    &lt;a onclick="changeColor(1000, this.id)" id="btn-4" class="btn"&gt;&lt;span&gt;1 sec&lt;/span&gt;&lt;/a&gt;
    &lt;a onclick="changeColor(5000, this.id)" id="btn-5" class="btn"&gt;&lt;span&gt;5 secs&lt;/span&gt;&lt;/a&gt;
    &lt;a onclick="changeColor(10000, this.id)" id="btn-6" class="btn"&gt;&lt;span&gt;10 secs&lt;/span&gt;&lt;/a&gt;
    &lt;a onclick="changeColor(15000, this.id)" id="btn-7" class="btn"&gt;&lt;span&gt;15 secs&lt;/span&gt;&lt;/a&gt;
&lt;/div&gt;

&lt;p&gt;Which of them makes you feel in control of the button color? Which of them feels like the computer is in control? Which of them makes you want to rage quit?&lt;/p&gt;
&lt;p&gt;There are &lt;a href="https://www.nngroup.com/articles/progress-indicators/"&gt;many solutions&lt;/a&gt; to make an interface feel responsive, even when a delay is required to return results: animations, loading spinners, progression indicators, skeleton objects, etc.&lt;/p&gt;
&lt;p&gt;Here's one idea to make the buttons respond immediately using a fun pulsing animation I found &lt;a href="https://www.florin-pop.com/blog/2019/03/css-pulse-effect/"&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;div class="buttons"&gt;
    &lt;a onclick="changeColor(50, this.id, true)" id="btn-8" class="btn"&gt;&lt;span&gt;0.05 secs&lt;/span&gt;&lt;/a&gt;
    &lt;a onclick="changeColor(100, this.id, true)" id="btn-9" class="btn"&gt;&lt;span&gt;0.1 secs&lt;/span&gt;&lt;/a&gt;
    &lt;a onclick="changeColor(500, this.id, true)" id="btn-10" class="btn"&gt;&lt;span&gt;0.5 secs&lt;/span&gt;&lt;/a&gt;
    &lt;a onclick="changeColor(1000, this.id, true)" id="btn-11" class="btn"&gt;&lt;span&gt;1 sec&lt;/span&gt;&lt;/a&gt;
    &lt;a onclick="changeColor(5000, this.id, true)" id="btn-12" class="btn"&gt;&lt;span&gt;5 secs&lt;/span&gt;&lt;/a&gt;
    &lt;a onclick="changeColor(10000, this.id, true)" id="btn-13" class="btn"&gt;&lt;span&gt;10 secs&lt;/span&gt;&lt;/a&gt;
    &lt;a onclick="changeColor(15000, this.id, true)" id="btn-14" class="btn"&gt;&lt;span&gt;15 secs&lt;/span&gt;&lt;/a&gt;
&lt;/div&gt;

&lt;p&gt;Notice how you still feel in control even at the longest wait time for a change.&lt;/p&gt;
&lt;p&gt;Though the exact solution you choose will likely come from a designer (if you're lucky enough to work with one), a developer's responsibility is to understand which parts of an interface are likely to need these solutions.&lt;/p&gt;
&lt;p&gt;Only we know which interactions can return results straight from the client, which need to request results from servers, which requests are produced quickly from a cache or will require expensive processing.&lt;/p&gt;
&lt;p&gt;It is up to us to review designs and give feedback on these interface problem areas.&lt;/p&gt;
&lt;p&gt;For the development of the Splash game, since the response time for any call to a server is difficult to estimate, we follow a simple rule:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Any button press that triggers a server invocation we must first acknowledge on the client.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Usually we do this via a loading state. In code terms, we're doing this:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nv"&gt;interface&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;onClick&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kr"&gt;function&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="nf"&gt;toggleLoadingState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="kd"&gt;local&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;response&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;invokeServer&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="nf"&gt;displayResponse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;response&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="nf"&gt;toggleLoadingState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="kr"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;For some particularly long-running requests, we aim to do them in the background to allow the player to continue to enjoy the game while they wait.&lt;/p&gt;
&lt;p&gt;See also the &lt;a href="goal-of-a-game-interface.html"&gt;Goal Of A Game Interface&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Photo by &lt;a href="https://unsplash.com/@mike_van_den_bos?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText"&gt;Mike van den Bos&lt;/a&gt; on &lt;a href="https://unsplash.com/s/photos/loading?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText"&gt;Unsplash&lt;/a&gt;&lt;/p&gt;
&lt;div class="footnote"&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id="fn:1"&gt;
&lt;p&gt;Schell, Jesse. The Art of Game Design: A Book of Lenses. Amsterdam, Boston; Elsevier/Morgan Kaufmann, 2008. (pg. 910)&amp;#160;&lt;a class="footnote-backref" href="#fnref:1" title="Jump back to footnote 1 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:2"&gt;
&lt;p&gt;Nah, Fiona, "A Study on Tolerable Waiting Time: How Long Are Web Users Willing to Wait?" (2003). AMCIS 2003 Proceedings. 285.
http://aisel.aisnet.org/amcis2003/285&amp;#160;&lt;a class="footnote-backref" href="#fnref:2" title="Jump back to footnote 2 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</content><category term="permanent"/><category term="UserInterface"/></entry><entry><title>A Rule For Ordering Methods</title><link href="http://localhost:8000/a-rule-for-ordering-methods.html" rel="alternate"/><published>2022-06-27T00:00:00+10:00</published><updated>2022-06-27T00:00:00+10:00</updated><author><name>Lex Toumbourou</name></author><id>tag:localhost,2022-06-27:/a-rule-for-ordering-methods.html</id><summary type="html">&lt;p&gt;Apply the Stepdown Rule to the ordering of methods&lt;/p&gt;</summary><content type="html">&lt;p&gt;A small thing that made our code more readable and consistent was to add a code style guide rule for ordering methods.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Order your methods so that the object starts with the constructor (if required), followed by the key public methods, then any private implementation details.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;We based this rule on The Stepdown Rule from Clean Code in the chapter on functions &lt;sup id="fnref:1"&gt;&lt;a class="footnote-ref" href="#fn:1"&gt;1&lt;/a&gt;&lt;/sup&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;"We want the code to read like a top-down narrative. We want every function to be followed by those at the next level of abstraction so that we can read the program descending one level of abstraction at a time as we read down the list of functions."&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Public methods first, preferably only a few, ensure the object's key functionality is immediately apparent. Most intuitively follow this anyway, but it is easy to overlook.&lt;/p&gt;
&lt;p&gt;The exact order you prefer matters less than being consistent. The cost of searching through arbitrarily ordered code accumulates over time. Plus, it's one less inconsequential decision a developer has to make.&lt;/p&gt;
&lt;p&gt;Below is an example of a typical object we'd write in Lua ordered with our style guide rule in mind.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Note that Lua uses &lt;a href="metatables.html"&gt;Metatables&lt;/a&gt; modules to emulate classes using &lt;a href="object-prototypes.html"&gt;Object Prototypes&lt;/a&gt; like Javascript. The details are unimportant, included for completeness.&lt;/em&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kd"&gt;local&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;UsefulThing&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{}&lt;/span&gt;
&lt;span class="c1"&gt;-- Lua Metatable thing.&lt;/span&gt;
&lt;span class="nv"&gt;UsefulThing&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;__index&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;UsefulThing&lt;/span&gt;

&lt;span class="c1"&gt;-- Constructor first.&lt;/span&gt;
&lt;span class="kr"&gt;function&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nc"&gt;UsefulThing&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kd"&gt;local&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;self&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{}&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="c1"&gt;-- Another Lua Metatable thing.&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nb"&gt;setmetatable&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;UsefulThing&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;self&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kr"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;self&lt;/span&gt;
&lt;span class="kr"&gt;end&lt;/span&gt;

&lt;span class="c1"&gt;-- The key public method(s) (often just one).&lt;/span&gt;
&lt;span class="kr"&gt;function&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nc"&gt;UsefulThing&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nf"&gt;use&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nv"&gt;self&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nf"&gt;_prepare&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nv"&gt;self&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nf"&gt;_doBehaviour&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nv"&gt;self&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nf"&gt;_cleanUp&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="kr"&gt;end&lt;/span&gt;

&lt;span class="c1"&gt;-- All the implementation details.&lt;/span&gt;
&lt;span class="kr"&gt;function&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nc"&gt;UsefulThing&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nf"&gt;_prepare&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="kr"&gt;end&lt;/span&gt;

&lt;span class="kr"&gt;function&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nc"&gt;UsefulThing&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nf"&gt;_doBehaviour&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="kr"&gt;end&lt;/span&gt;

&lt;span class="kr"&gt;function&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nc"&gt;UsefulThing&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nf"&gt;_cleanUp&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="kr"&gt;end&lt;/span&gt;

&lt;span class="kr"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;UsefulThing&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Like the Python convention, we prefix private methods with underscores to further distinguish.&lt;/p&gt;
&lt;p&gt;Photo by &lt;a href="https://unsplash.com/@andrew23brandy?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText"&gt;Andrew Brandy&lt;/a&gt; on &lt;a href="https://unsplash.com/s/photos/complexity-step?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText"&gt;Unsplash&lt;/a&gt;&lt;/p&gt;
&lt;div class="footnote"&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id="fn:1"&gt;
&lt;p&gt;MLA (7th ed.) Martin, Robert C. Clean Code: A Handbook of Agile Software Craftsmanship. Upper Saddle River, NJ: Prentice Hall, 2009. (Pg. 37)&amp;#160;&lt;a class="footnote-backref" href="#fnref:1" title="Jump back to footnote 1 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</content><category term="permanent"/><category term="SoftwareEngineering"/></entry><entry><title>Do Standups Story-By-Story not Person-By-Person</title><link href="http://localhost:8000/do-standups-story-by-story-not-person-by-person.html" rel="alternate"/><published>2022-06-21T00:00:00+10:00</published><updated>2022-06-21T00:00:00+10:00</updated><author><name>Lex Toumbourou</name></author><id>tag:localhost,2022-06-21:/do-standups-story-by-story-not-person-by-person.html</id><summary type="html">&lt;p&gt;Start the day by focusing on the work&lt;/p&gt;</summary><content type="html">&lt;p&gt;Story-focused (or story-by-story) standups work like this: every morning, the host walks us through each in-progress story on the board from right to left (closest to release first), with assignees giving a brief update. We take turns hosting the meeting.&lt;/p&gt;
&lt;p&gt;In contrast, a person-focused standup, also known as person-by-person or Three Questions &lt;sup id="fnref:1"&gt;&lt;a class="footnote-ref" href="#fn:1"&gt;1&lt;/a&gt;&lt;/sup&gt;, has each team member answering three questions: "What did you work on today?", "What did you work on yesterday?" and "Are there any blockers?". The host selects who speaks next or creates a system for it.&lt;/p&gt;
&lt;p&gt;I think story-focused daily standups are almost always better, having tried both at times throughout my career, for three key reasons.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Story-focused reminds us every day of what we're trying to achieve&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The goal of a standup is to review the work in progress. Our story-focused status updates give us our best chance to adjust if it looks like our commitments are in danger. A daily review also means that if we change course mid-sprint, everyone knows what direction we're now heading in.&lt;/p&gt;
&lt;p&gt;On the other hand, a person-focused standup might have you believe the goal is to review the details of each other's work days or even for each of us to justify our existence. The person-focused updates can sometimes take the whole allotted standup time, at worse, causing us to get no ongoing feedback on our sprint commitments until our next Retro.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Story-focused standups are more collaborative.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Product development is a team sport. We all have different skills, and collectively, we seek to build something more significant than one of us could alone.&lt;/p&gt;
&lt;p&gt;Giving our updates in the context of our overall plan gives us a better chance of collaboration.&lt;/p&gt;
&lt;p&gt;Maybe a designer learns how difficult a particular detail is to implement and can propose a simpler alternative. Perhaps another developer knows an expert in an area of struggle from another team who can help.&lt;/p&gt;
&lt;p&gt;In comparison, in a person-by-person standup, lacking the context of each other's updates, we may find ourselves tuning out some of the ones where updates aren't clear to us how they fit into our overall goals.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Story-focused standups are fun and less stressful&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Since we're focusing on what we're collecting and achieving, not interrogating the details of each person's work days, we can relax and be more engaged and present. The overall work we are trying to accomplish is much more interesting than the minutiae of each other's work days.&lt;/p&gt;
&lt;p&gt;A meeting where everyone is engaged and present is much more fun.&lt;/p&gt;
&lt;p&gt;The day's first meeting should not sap the team's energy.&lt;/p&gt;
&lt;p&gt;In either case, we aim to finish standup in 15 minutes or less. The host politely tries to wrap up long-winded status updates and organizes follow-up discussions.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;The downside to story-focused standups is that some individuals who are less comfortable contributing to the group may not get a chance to speak. Maybe they are working on something we aren't covering on our board, or perhaps we haven't assigned them anything, and they're not sure when to ask.&lt;/p&gt;
&lt;p&gt;To combat this, we end standups by giving the floor to anyone who hasn't yet contributed. It allows us to write tickets for their work or to ensure tasks are assigned.&lt;/p&gt;
&lt;p&gt;It's vital to remember why we do daily standups: we do them because the coordination effort is complex enough to require daily alignment. If it isn't sufficiently complex - i.e., if it's a small team - you may not need standup.&lt;/p&gt;
&lt;p&gt;Cover by &lt;a href="https://unsplash.com/@plhnk?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText"&gt;Paul Hanaoka&lt;/a&gt; on &lt;a href="https://unsplash.com/@plhnk?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText"&gt;Unsplash&lt;/a&gt;&lt;/p&gt;
&lt;div class="footnote"&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id="fn:1"&gt;
&lt;p&gt;&lt;a href="https://martinfowler.com/articles/itsNotJustStandingUp.html"&gt;It's Not Just Standing Up: Patterns for Daily Standup Meetings&lt;/a&gt;&amp;#160;&lt;a class="footnote-backref" href="#fnref:1" title="Jump back to footnote 1 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</content><category term="permanent"/><category term="SoftwareEngineering"/></entry><entry><title>Document Your Documentation</title><link href="http://localhost:8000/document-your-documentation.html" rel="alternate"/><published>2022-06-18T00:00:00+10:00</published><updated>2022-06-18T00:00:00+10:00</updated><author><name>Lex Toumbourou</name></author><id>tag:localhost,2022-06-18:/document-your-documentation.html</id><summary type="html">&lt;p&gt;A short document that explains how your team documents things.&lt;/p&gt;</summary><content type="html">&lt;p&gt;One simple thing that can help a software team is to create a short document explaining how the team documents things.&lt;/p&gt;
&lt;p&gt;Over time, as your product's complexity increases, so does the complexity of knowledge required to support it. It's common to find information scattered in many places.&lt;/p&gt;
&lt;p&gt;My team has most documents in Notion, some in the README.md files, some as comments in code, some pinned to Slack channels, and some in Google Docs.&lt;/p&gt;
&lt;p&gt;Documentation in multiple places isn't necessarily a problem - information requires various mediums.&lt;/p&gt;
&lt;p&gt;However, having to make a decision every time we try to share information is a waste of valuable brain cycles and increases &lt;a href="https://en.wikipedia.org/wiki/Decision_fatigue"&gt;Decision Fatigue&lt;/a&gt;. I would prefer we utilize our brain energy for writing good documentation.&lt;/p&gt;
&lt;p&gt;We should instead make a decision once for each class of information (see example below), documenting how and where we store and retrieve as clearly as possible. It doesn't matter if we don't cover all kinds of information initially or if the system isn't perfect; we can improve it over time.&lt;/p&gt;
&lt;p&gt;You can think of it as a code-style guide for your information.&lt;/p&gt;
&lt;p&gt;It's also helpful to include &lt;em&gt;why&lt;/em&gt; you have made decisions; that allows you or the future team to evaluate if the original logic still holds up. Maybe there's a better way to communicate that information now - that's okay.&lt;/p&gt;
&lt;p&gt;A well-understood knowledge system will also help us with document retrieval.&lt;/p&gt;
&lt;p&gt;Here's an example:&lt;/p&gt;
&lt;blockquote&gt;
&lt;h2 id="documentation-guide"&gt;Documentation Guide&lt;/h2&gt;
&lt;h3 id="primary"&gt;Primary&lt;/h3&gt;
&lt;p&gt;Notion should be the first choice for most documentation.&lt;/p&gt;
&lt;p&gt;If it's product-specific, please put it in the folder under &lt;strong&gt;Products &amp;gt; Product Name&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Review the existing categories in the sidebar for the most relevant ones for company-wide sharing. You may add a new one if none fit.&lt;/p&gt;
&lt;p&gt;Notion ensures our documentation is searchable and easily accessible.&lt;/p&gt;
&lt;p&gt;Some exceptions apply:&lt;/p&gt;
&lt;h3 id="repository-setup-information"&gt;Repository setup information&lt;/h3&gt;
&lt;p&gt;A &lt;code&gt;README.md&lt;/code&gt; file should describe how to set up the project, including running the application and unit tests.
Add a page in Notion that links to each repository. See &lt;strong&gt;Project A&lt;/strong&gt; for an example.
Use Notion if you need to expand on documentation beyond simply setting up the project.&lt;/p&gt;
&lt;p&gt;Using the README for repository setup is usually the shortest path to ensuring that the setup instructions remain up-to-date and allow for linking to files within the repro. It is also the first place that most newer developers will look for documentation.&lt;/p&gt;
&lt;h3 id="ephemeral-documents"&gt;Ephemeral Documents&lt;/h3&gt;
&lt;p&gt;Some documents, for example, the project to-do lists, meeting summaries, balancing information, etc., make sense to live in a Google Document.&lt;/p&gt;
&lt;p&gt;Google Documents is generally better for these sorts of documents, especially involving outside collaborators.&lt;/p&gt;
&lt;p&gt;If the document needs to become long-lived, add a link for it in Notion. Each project has a page called &lt;strong&gt;Key Documents&lt;/strong&gt; to which we can link these.
&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The cover is by &lt;a href="https://unsplash.com/@jontyson"&gt;Jon Tyson on Unsplash&lt;/a&gt;&lt;/p&gt;</content><category term="permanent"/><category term="SoftwareEngineering"/><category term="KnowledgeManagement"/></entry><entry><title>A Discriminative Feature Learning Approach for Deep Face Recognition</title><link href="http://localhost:8000/a-discriminative-feature-learning-approach-for-deep-face-recognition.html" rel="alternate"/><published>2022-05-18T00:00:00+10:00</published><updated>2022-05-18T00:00:00+10:00</updated><author><name>Lex Toumbourou</name></author><id>tag:localhost,2022-05-18:/a-discriminative-feature-learning-approach-for-deep-face-recognition.html</id><summary type="html">&lt;p&gt;Notes from paper &lt;a href="https://ydwen.github.io/papers/WenECCV16.pdf"&gt;A Discriminative Feature Learning Approach for Deep Face Recognition&lt;/a&gt; by Yandong Wen, Kaipeng Zhang, Zhifeng Li, and Yu Qiao&lt;/p&gt;</summary><content type="html">&lt;p&gt;These are my notes from the paper &lt;a href="https://ydwen.github.io/papers/WenECCV16.pdf"&gt;A Discriminative Feature Learning Approach for Deep Face Recognition&lt;/a&gt; by Yandong Wen, Kaipeng Zhang, Zhifeng Li, and Yu Qiao.&lt;/p&gt;
&lt;h2 id="abstract"&gt;Abstract&lt;/h2&gt;
&lt;p&gt;We commonly train image classification models using &lt;a href="categorical-cross-entropy-loss.html"&gt;Categorical Cross-Entropy Loss&lt;/a&gt;. However, softmax loss does not learn sufficiently discriminative features for face recognition.&lt;/p&gt;
&lt;p&gt;This paper proposes a new supervision signal called &lt;a href="center loss.html"&gt;Center Loss&lt;/a&gt;. Center Loss simultaneously learns a center for each class and penalizes the distance between features and their class centers.&lt;/p&gt;
&lt;p&gt;Center Loss requires training with joint supervision of softmax loss for stability.&lt;/p&gt;
&lt;p&gt;The paper improves on the state-of-the-art for face recognition and face verification tasks.&lt;/p&gt;
&lt;h2 id="1-introduction"&gt;1. Introduction&lt;/h2&gt;
&lt;p&gt;Modern image classification typically involves some backbone model to learn features from input images, which we can feed into a final fully-connected layer for classification.&lt;/p&gt;
&lt;p&gt;At the time of the paper, CNNs were the best-performing model architecture for learning features.&lt;/p&gt;
&lt;p&gt;Since image classification problems are typically &lt;a href="Close-Set"&gt;Close-Set&lt;/a&gt; (all possible test classes well represented in the training set), &lt;a href="categorical-cross-entropy-loss.html"&gt;Categorical Cross-Entropy Loss&lt;/a&gt; table loss function choice. In this case, the features learned by the backbone model only need to be separable enough so the classifier can distinguish between classes.&lt;/p&gt;
&lt;p&gt;However, in facial recognition, you cannot pre-collect all possible test identities in the training set for face recognition. We call these problems &lt;a href="Open-Set Classification"&gt;Open-Set Classification&lt;/a&gt;. Therefore, for facial recognition, we need to learn discriminative features.&lt;/p&gt;
&lt;p&gt;Discriminative features have two properties:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;features from the same class should be close together, aka "inter-class dispensation."&lt;/li&gt;
&lt;li&gt;features from different classes should be far apart, aka "intra-class compactness."&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In Fig 1. we see a typical image classification pipeline, comparing separable and discriminative features.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Fig 1. Showing a typical image classification pipeline and the difference between separable and discriminative features" src="../../_media/center-loss-fig-1.png"&gt;&lt;/p&gt;
&lt;p&gt;Typically recognition pipelines use a Nearest Neighbours or K Nearest Neighbours step to classify faces based on the distance to other identities instead of label predictions.&lt;/p&gt;
&lt;p&gt;Constructing a loss function for discriminative feature learning is challenging.&lt;/p&gt;
&lt;p&gt;Since &lt;a href="Stochastic Gradient Descent (SGD)"&gt;Stochastic Gradient Descent (SGD)&lt;/a&gt; relies on mini-batches, you cannot represent the global distribution in every step.&lt;/p&gt;
&lt;p&gt;Alternatives proposed include &lt;a href="Contrastive Loss"&gt;Contrastive Loss&lt;/a&gt; (training using pairs) and &lt;a href="Triplet Loss"&gt;Triplet Loss&lt;/a&gt; (training using triplets). However, they rely on Hard Negative Mining for efficiency, which adds complexity to the training pipeline.&lt;/p&gt;
&lt;p&gt;This paper proposes &lt;a href="center loss.html"&gt;Center Loss&lt;/a&gt;. They add a center for each class, a vector of the same dimension as the input feature embedding.&lt;/p&gt;
&lt;p&gt;They simultaneously learn center during training while minimizing the distance between features and their corresponding class center.&lt;/p&gt;
&lt;p&gt;The backbone requires trained using joint supervision of &lt;a href="categorical-cross-entropy-loss.html"&gt;Categorical Cross-Entropy Loss&lt;/a&gt;Loss, with a new hyperparameter to balance each component.&lt;/p&gt;
&lt;p&gt;The center loss pulls deep features of the same class toward their centers, accomplishing the goal of inter-class compactness and intra-class dispersion.&lt;/p&gt;
&lt;p&gt;Paper runs experiments on:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;MegaFace Challenge&lt;/li&gt;
&lt;li&gt;Labeled Faces in the Wild (LFW)&lt;/li&gt;
&lt;li&gt;YouTube Faces (YTF)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="2-related-work"&gt;2. Related Work&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Face recognition with Deep Learning&lt;ul&gt;
&lt;li&gt;Parkhi, O.M., Vedaldi, A., Zisserman, A.: Deep face recognition. In: Proceedings of the British Machine Vision, vol. 1, no. 3, p. 6 (2015)&lt;/li&gt;
&lt;li&gt;Schroff, F., Kalenichenko, D., Philbin, J.: Facenet: a unified embedding for face recognition and clustering. In: Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition, pp. 815–823 (2015)&lt;/li&gt;
&lt;li&gt;Sun, Y., Chen, Y., Wang, X., Tang, X.: Deep learning face representation by joint identification-verification. In: Advances in Neural Information Processing Systems, pp. 1988–1996 (2014)&lt;/li&gt;
&lt;li&gt;Sun, Y., Wang, X., Tang, X.: Hybrid deep learning for face verification. In: Proceedings of the IEEE International Conference on Computer Vision, pp. 1489–1496 (2013)&lt;/li&gt;
&lt;li&gt;Taigman, Y., Yang, M., Ranzato, M., Wolf, L.: Deepface: closing the gap to human level performance in face verification. In: Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition, pp. 1701–1708 (2014)&lt;/li&gt;
&lt;li&gt;Wen, Y., Li, Z., Qiao, Y.: Latent factor guided convolutional neural networks for age-invariant face recognition. In: Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition, pp. 4893–4901 (2016)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Mapping pair of face images to distance&lt;ul&gt;
&lt;li&gt;Chopra, S., Hadsell, R., LeCun, Y.: Learning a similarity metric discriminatively, with application to face verification. In: 2005 IEEE Computer Society Conference on Computer Vision and Pattern Recognition, CVPR 2005, vol. 1, pp. 539–546. IEEE (2005).&lt;ul&gt;
&lt;li&gt;They train siamese networks to drive the similarity metric to be small for positive and large for negative pairs.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;ol&gt;
&lt;li&gt;Hu, J., Lu, J., Tan, Y.P.: Discriminative deep metric learning for face verification in the wild. In: Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition, pp. 1875–1882 (2014)&lt;/li&gt;
&lt;li&gt;Introduce a margin between positive and negative face image pairs.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Softmax modifications&lt;ul&gt;
&lt;li&gt;Sun, Y., Wang, X., Tang, X.: Deep learning face representation from predicting 10,000 classes. In: Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition, pp. 1891–1898 (2014)&lt;/li&gt;
&lt;li&gt;Taigman, Y., Yang, M., Ranzato, M., Wolf, L.: Deepface: closing the gap to human level performance in face verification. In: Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition, pp. 1701–1708 (2014)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Joint Identification Verification Supervision Signal&lt;ul&gt;
&lt;li&gt;Sun, Y., Chen, Y., Wang, X., Tang, X.: Deep learning face representation by joint identification-verification. In: Advances in Neural Information Processing Systems, pp. 1988–1996 (2014)&lt;/li&gt;
&lt;li&gt;Wen, Y., Li, Z., Qiao, Y.: Latent factor guided convolutional neural networks for age-invariant face recognition. In: Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition, pp. 4893–4901 (2016)&lt;/li&gt;
&lt;li&gt;Sun, Y., Wang, X., Tang, X.: Deeply learned face representations are sparse, selective, and robust. In: Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition, pp. 2892–2900 (2015)&lt;ul&gt;
&lt;li&gt;Add fully connected layer and loss functions to each conv layer.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Triplet Loss&lt;ul&gt;
&lt;li&gt;Liu, J., Deng, Y., Huang, C.: Targeting ultimate accuracy: Face recognition via deep embedding. arXiv preprint (2015). arXiv:1506.07310&lt;/li&gt;
&lt;li&gt;Parkhi, O.M., Vedaldi, A., Zisserman, A.: Deep face recognition. In: Proceedings of the British Machine Vision, vol. 1, no. 3, p. 6 (2015)&lt;/li&gt;
&lt;li&gt;Schroff, F., Kalenichenko, D., Philbin, J.: Facenet: a unified embedding for face recognition and clustering. In: Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition, pp. 815–823 (2015)&lt;ul&gt;
&lt;li&gt;In this paper, they minimise the distance between an anchor and a positive, while maximising the distance between an anchor and a negative until the margin is met.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="3-the-proposed-approach"&gt;3. The Proposed Approach&lt;/h2&gt;
&lt;p&gt;The authors use a toy example to intuitively show the distribution of deeply learned features. Inspired by this distribution, they propose center loss to improve the discriminative power of the learned features.&lt;/p&gt;
&lt;p&gt;The toy example is trained on &lt;a href="MNIST"&gt;MNIST&lt;/a&gt;. They modify LeNet (a standard convolutional architecture) to include an extra conv layer (making up three conv layers in total) and additional conv filters in each layer. Then they reduce the output of the last hidden layer to 2, so they can visualize features in 2d space.&lt;/p&gt;
&lt;p&gt;Fig 2. shows the results of plotting the 2-dimension hidden layer output on the training set (a) and the test set (b).&lt;/p&gt;
&lt;p&gt;&lt;img alt="2D hidden layer plot for features learned using Softmax Loss" src="../../_media/center-loss-fig-2.png"&gt;&lt;/p&gt;
&lt;p&gt;We can infer from this that the learned features are separable - a classifier can find a decision boundary between them - but not discriminative. In other words, it would be challenging to classify features using the nearest neighbors approach, as the distance between intra-class samples often matches those inter-class.&lt;/p&gt;
&lt;p&gt;Center loss function is proposed to address this:&lt;/p&gt;
&lt;p&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;msub&gt;&lt;mi&gt;L&lt;/mi&gt;&lt;mi&gt;C&lt;/mi&gt;&lt;/msub&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mfrac&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;/mfrac&gt;&lt;msubsup&gt;&lt;mo&gt;∑&lt;/mo&gt;&lt;mrow&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/mrow&gt;&lt;mi&gt;m&lt;/mi&gt;&lt;/msubsup&gt;&lt;msubsup&gt;&lt;mrow&gt;&lt;mi mathvariant="normal"&gt;∣&lt;/mi&gt;&lt;mi mathvariant="normal"&gt;∣&lt;/mi&gt;&lt;msub&gt;&lt;mi mathvariant="bold"&gt;x&lt;/mi&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;/msub&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;msub&gt;&lt;mi mathvariant="bold"&gt;c&lt;/mi&gt;&lt;msub&gt;&lt;mi&gt;y&lt;/mi&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;/msub&gt;&lt;/msub&gt;&lt;mi mathvariant="normal"&gt;∣&lt;/mi&gt;&lt;mi mathvariant="normal"&gt;∣&lt;/mi&gt;&lt;/mrow&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;/msubsup&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;L_{C} = \frac{1}{2} \sum\limits_{i=1}^{m} {||\mathbf{x}_i - \mathbf{c}_{y_i}||}^{2}_{2}&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.83333em;vertical-align:-0.15em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;L&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.32833099999999993em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathdefault mtight" style="margin-right:0.07153em;"&gt;C&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:2.329066em;vertical-align:-0.9776689999999999em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mopen nulldelimiter"&gt;&lt;/span&gt;&lt;span class="mfrac"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.845108em;"&gt;&lt;span style="top:-2.6550000000000002em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mtight"&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-3.23em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="frac-line" style="border-bottom-width:0.04em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-3.394em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mtight"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.345em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose nulldelimiter"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mop op-limits"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:1.3513970000000004em;"&gt;&lt;span style="top:-2.122331em;margin-left:0em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathdefault mtight"&gt;i&lt;/span&gt;&lt;span class="mrel mtight"&gt;=&lt;/span&gt;&lt;span class="mord mtight"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-3.0000050000000003em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="mop op-symbol small-op"&gt;∑&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-3.950005em;margin-left:0em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathdefault mtight"&gt;m&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.9776689999999999em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;∣&lt;/span&gt;&lt;span class="mord"&gt;∣&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;&lt;span class="mord mathbf"&gt;x&lt;/span&gt;&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.31166399999999994em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mathdefault mtight"&gt;i&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;−&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;&lt;span class="mord mathbf"&gt;c&lt;/span&gt;&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15139200000000003em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathdefault mtight" style="margin-right:0.03588em;"&gt;y&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.3280857142857143em;"&gt;&lt;span style="top:-2.357em;margin-left:-0.03588em;margin-right:0.07142857142857144em;"&gt;&lt;span class="pstrut" style="height:2.5em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size3 size1 mtight"&gt;&lt;span class="mord mathdefault mtight"&gt;i&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.143em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.286108em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mord"&gt;∣&lt;/span&gt;&lt;span class="mord"&gt;∣&lt;/span&gt;&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.954008em;"&gt;&lt;span style="top:-2.364192em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mtight"&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-3.2029em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mtight"&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.335808em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Where:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;m&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;m&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.43056em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;m&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; refers to the size of the mini-batch&lt;/li&gt;
&lt;li&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;msub&gt;&lt;mi&gt;c&lt;/mi&gt;&lt;mrow&gt;&lt;mi&gt;y&lt;/mi&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;/mrow&gt;&lt;/msub&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;c_{yi}&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.716668em;vertical-align:-0.286108em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;c&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.311664em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathdefault mtight" style="margin-right:0.03588em;"&gt;y&lt;/span&gt;&lt;span class="mord mathdefault mtight"&gt;i&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.286108em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; refers to the &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;msub&gt;&lt;mi&gt;y&lt;/mi&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;/msub&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;y_i&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.625em;vertical-align:-0.19444em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault" style="margin-right:0.03588em;"&gt;y&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.31166399999999994em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:-0.03588em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mathdefault mtight"&gt;i&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;th class center of the deep features.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Since we cannot take the entire training set into account to average features of every class in each iteration, we have to make two modifications to support mini-batches.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Centers are computed by averaging features of the corresponding class (some centers may not update in a mini-batch)&lt;/li&gt;
&lt;li&gt;Control the learning rate of the center using param &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;α&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;\alpha&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.43056em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.0037em;"&gt;α&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; to avoid mislabelled samples breaking everything.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Lastly, they train the model using joint supervision of softmax loss and center loss, using hyperparameters &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;λ&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;\lambda&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.69444em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;λ&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;. When &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;λ&lt;/mi&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mn&gt;0&lt;/mn&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;\lambda = 0&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.69444em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;λ&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.64444em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;0&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;, training uses conventional Softmax Loss.&lt;/p&gt;
&lt;p&gt;Fig 3. shows how the hyperparameters &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;λ&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;\lambda&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.69444em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;λ&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; affect the feature distributions. The higher it is, the more discriminative the features.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Plot for 2d features trained using Center Loss" src="../../_media/center-loss-fig-3.png"&gt;&lt;/p&gt;
&lt;p&gt;Joint supervision is necessary: if you only trained using class centers, the centers would degrade to 0 since that creates the lowest possible center loss.&lt;/p&gt;
&lt;p&gt;The method is superior to contrastive and triplet loss as it is efficient and easy to implement.&lt;/p&gt;
&lt;h2 id="4-experiments"&gt;4. Experiments&lt;/h2&gt;
&lt;p&gt;They use a typically CNN archiecture for the experiments.&lt;/p&gt;
&lt;p&gt;Filter sizes for conv and local conv layers are 3x3 with stride 1, followed by PReLU nonlinear units.&lt;/p&gt;
&lt;p&gt;The number of feature maps is 128 for conv layers and 256 for local conv layers. Max-pooling grid is 2x2, and the stride is 2.&lt;/p&gt;
&lt;p&gt;They concatenate the output of the 4th pooling layer and the 3rd local conv layer as input to the 1st fully connected layer. The output of the fully connected layer is 512.&lt;/p&gt;
&lt;p&gt;In Fig 4, we see a diagram of this architecture.&lt;/p&gt;
&lt;p&gt;&lt;img alt="CNN architecture used throughout experiments" src="../../_media/center-loss-fig-4.png"&gt;&lt;/p&gt;
&lt;h3 id="41-implementation-details"&gt;4.1 Implementation Details&lt;/h3&gt;
&lt;p&gt;Use five landmarks (2 eyes, nose, and mouth corners) for similarity transformation.&lt;/p&gt;
&lt;p&gt;When detection fails, discard the image in the training set, but use the provided landmarks if it is a testing image.&lt;/p&gt;
&lt;p&gt;Faces are cropped to 112 x 96 RGB images.&lt;/p&gt;
&lt;p&gt;Each pixel &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mo stretchy="false"&gt;[&lt;/mo&gt;&lt;mn&gt;0&lt;/mn&gt;&lt;mo separator="true"&gt;,&lt;/mo&gt;&lt;mn&gt;255&lt;/mn&gt;&lt;mo stretchy="false"&gt;]&lt;/mo&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;[0, 255]&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1em;vertical-align:-0.25em;"&gt;&lt;/span&gt;&lt;span class="mopen"&gt;[&lt;/span&gt;&lt;span class="mord"&gt;0&lt;/span&gt;&lt;span class="mpunct"&gt;,&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;2&lt;/span&gt;&lt;span class="mord"&gt;5&lt;/span&gt;&lt;span class="mord"&gt;5&lt;/span&gt;&lt;span class="mclose"&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; is normalized by subtracting 127.5 and dividing by 128.&lt;/p&gt;
&lt;p&gt;Training data uses web-collected training data, including:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;CASIA-WebFace&lt;/li&gt;
&lt;li&gt;CACD2000&lt;/li&gt;
&lt;li&gt;Celebrity&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;They remove images with identities appearing in testing datasets, which goes to 0.7M images of 17,189 unique persons.&lt;/p&gt;
&lt;p&gt;The authors horizontally flip images for augmentation.&lt;/p&gt;
&lt;p&gt;They train three types of models for comparison:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Model A: Softmax loss&lt;/li&gt;
&lt;li&gt;Model B: Softmax and contrastive loss&lt;/li&gt;
&lt;li&gt;Model C: Softmax and center loss&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;They extract features for each image and the horizontally flipped one and concatenate them as representation.&lt;/p&gt;
&lt;p&gt;They compute the score as Cosine Distance of 2 features after PCA.&lt;/p&gt;
&lt;p&gt;They use Nearest neighbor and threshold comparison for &lt;a href="Face Identification"&gt;Face Identification&lt;/a&gt; and &lt;a href="Face Verification"&gt;Face Verification&lt;/a&gt; tasks.&lt;/p&gt;
&lt;h3 id="42-experiments-on-the-parameter-lambda-and-alpha"&gt;4.2 Experiments on the Parameter &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;λ&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;\lambda&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.69444em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;λ&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; and &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;α&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;\alpha&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.43056em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.0037em;"&gt;α&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;They conducted experiments to investigate the sensitivity of the params on &lt;a href="Labeled Faces in the Wild"&gt;Labeled Faces in the Wild&lt;/a&gt; dataset.&lt;/p&gt;
&lt;p&gt;The results are shown in Fig 5, for 2 experiments:&lt;/p&gt;
&lt;p&gt;Experiment (a)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Fix &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;α&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;α&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.43056em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.0037em;"&gt;α&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; to 0.5.&lt;/li&gt;
&lt;li&gt;Vary &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;λ&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;\lambda&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.69444em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;λ&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; from 0 to 0.1 to train different models.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Experiment (b)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Fix &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;λ&lt;/mi&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mn&gt;0.003&lt;/mn&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;\lambda = 0.003&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.69444em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;λ&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.64444em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;0&lt;/span&gt;&lt;span class="mord"&gt;.&lt;/span&gt;&lt;span class="mord"&gt;0&lt;/span&gt;&lt;span class="mord"&gt;0&lt;/span&gt;&lt;span class="mord"&gt;3&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;Vary &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;α&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;\alpha&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.43056em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.0037em;"&gt;α&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; from 0.01 to 1.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img alt="Fig 5. Experiments with different hyperparameters" src="../../_media/center-loss-fig-5.png"&gt;&lt;/p&gt;
&lt;p&gt;From this they infer:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Softmax Loss alone is not a good choice. It leads to poor verification performance.&lt;/li&gt;
&lt;li&gt;Properly choosing a value of &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;λ&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;\lambda&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.69444em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;λ&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; can improve verification accuracy.&lt;/li&gt;
&lt;li&gt;Verification performance of model remains stable across a range of &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;λ&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;\lambda&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.69444em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;λ&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; and &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;α&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;\alpha&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.43056em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.0037em;"&gt;α&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="43-experiments-on-the-lfw-and-ytf-datasets"&gt;4.3 Experiments on the LFW and YTF Datasets&lt;/h3&gt;
&lt;p&gt;Evaluate single model on &lt;a href="Labeled Faces in the Wild"&gt;Labeled Faces in the Wild&lt;/a&gt; and &lt;a href="YouTube Faces"&gt;YouTube Faces&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Fig 6. has some examples.&lt;/p&gt;
&lt;p&gt;In (a), they show pairs in LFW the green frame is for positive pairs, and the red frame is for negative ones.&lt;/p&gt;
&lt;p&gt;In (b), they show examples from YTF, where the white bounding box is the face for testing.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Examples from Labeled Faces in the Wild and YouTube Faces" src="../../_media/center-loss-fig-6.png"&gt;&lt;/p&gt;
&lt;p&gt;They train model on only 0.7M outside data with no overlapping in LFW and YTF. Fix &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;λ&lt;/mi&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mn&gt;0.003&lt;/mn&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;\lambda = 0.003&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.69444em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;λ&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.64444em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;0&lt;/span&gt;&lt;span class="mord"&gt;.&lt;/span&gt;&lt;span class="mord"&gt;0&lt;/span&gt;&lt;span class="mord"&gt;0&lt;/span&gt;&lt;span class="mord"&gt;3&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; and &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;α&lt;/mi&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mn&gt;0.5&lt;/mn&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;\alpha = 0.5&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.43056em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.0037em;"&gt;α&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.64444em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;0&lt;/span&gt;&lt;span class="mord"&gt;.&lt;/span&gt;&lt;span class="mord"&gt;5&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; for Model C.&lt;/p&gt;
&lt;p&gt;LFW dataset contains 13,233 web-collected images from 5749 identities, with variations in pose, expression, and illuminations. They test on 6,000 face pairs and report the experiment results.&lt;/p&gt;
&lt;p&gt;YTF dataset consists of 3,425 videos of 1,595 different people, with an
average of 2.15 videos per person. The clip durations vary from 48 to 6,070 frames, with an average length of 181.3 frames.&lt;/p&gt;
&lt;p&gt;Table 2 has the results on 5,000 video pairs.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Table 2" src="../../_media/center-loss-table-2.png"&gt;&lt;/p&gt;
&lt;p&gt;They observe the following:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Softmax Loss and Center Loss beats baseline one (Model A) by a large margin.&lt;/li&gt;
&lt;li&gt;Joint supervision can notably enhance the discriminative power of deeply learned features, demonstrating the effectiveness of center loss over Softmax.&lt;/li&gt;
&lt;li&gt;It also improves over Softmax and Contrastive Loss.&lt;/li&gt;
&lt;li&gt;Using less training data and simpler architectures, they outperform many state-of-the-art approaches.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="44-experiments-on-megaface-challenge-dataset"&gt;4.4 Experiments on MegaFace Challenge Dataset&lt;/h3&gt;
&lt;p&gt;MegaFace datasets aim to evaluate the performance of face recognition algorithms with millions of distractors (people who are not in the testing set).&lt;/p&gt;
&lt;p&gt;MegaFace dataset has two parts:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Gallery Set. 1 million images from 690K people. A subset of Flickr photos from Yahoo.&lt;/li&gt;
&lt;li&gt;Probe Set. It consists of 2 datasets:&lt;ul&gt;
&lt;li&gt;Facescrub contains 100K photos of 530 unique people.&lt;/li&gt;
&lt;li&gt;FGNet. Face Aging Dataset, with 1002 images from 82 identities. Each identity has multiple face images at different ages (ranging from 0 to 69).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The challenge has several testing scenarios: Identification, Verification, and Pose Invariance with two protocols: large or small training set.&lt;/p&gt;
&lt;p&gt;The Center Loss authors follow a small training set protocol, which is less than 0.5M images and 20K subjects. They reduced the size of the training image dataset to 0.49M but kept the number of identities unchanged at 17,189.&lt;/p&gt;
&lt;p&gt;They discard any images overlapping with Facescrub dataset.&lt;/p&gt;
&lt;p&gt;They train three models: Model A, B, and C for comparison.&lt;/p&gt;
&lt;p&gt;They use the same settings as earlier the &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;λ&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;\lambda&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.69444em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;λ&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; is 0.003 and the &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;α&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;\alpha&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.43056em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.0037em;"&gt;α&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; is 0.5 in Model C.&lt;/p&gt;
&lt;p&gt;They test the algorithm on only one of the three galleries.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Face Identification&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Face identification aims to match a given probe image to those with the same person in the gallery. This task computes the similarity between each given probe face image and the gallery, including at least one image with the same identity as the probe one. The gallery contains a different scale of distractors, from 10 to 1 million, leading to increasing testing challenges.&lt;/p&gt;
&lt;p&gt;In Fig 8, they show the results of face identification experiments. They measure performance using Cumulative Match Characteristics (CMC) curves, which is the probability that a correct gallery image is in top-K.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Fig 8. CMC Curves of different methods" src="../../_media/center-loss-fig-8.png"&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Face Verification&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;For face verification, the algorithm should decide whether a given pair of images is the same person or not.&lt;/p&gt;
&lt;p&gt;They create four billion negative pairs between the probe and gallery datasets.&lt;/p&gt;
&lt;p&gt;They compute the True Accept Rate (TAR) and False Accept Rate (FAR) and plot the Receiver Operating Characteristic (ROC) curves of different methods in Fig. 9.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Fig 9. ROC Curves of different verification methods" src="../../_media/center-loss-fig-9.png"&gt;&lt;/p&gt;
&lt;p&gt;Some of the methods they compare against include methods that require hand-crafted features, including LBP (Local Binary Pattern) and shallow models like JointBayes.&lt;/p&gt;
&lt;p&gt;From Fig. 8 and Fig. 9, we can see that these modes perform poorly: their accuracies drop as the number of distractors increases.&lt;/p&gt;
&lt;p&gt;Model C performs the best out of A and B and outperforms the other published methods.&lt;/p&gt;
&lt;p&gt;To be practical, face recognition models should achieve high performance with millions of distractors.&lt;/p&gt;
&lt;p&gt;Table 3 reports the rank-1 identification rate with at least 1 million distractors.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Table 3" src="../../_media/center-loss-table-3.png"&gt;&lt;/p&gt;
&lt;p&gt;Table 4 reports the True Accept Rate with a False Accept Rate of &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;msup&gt;&lt;mn&gt;0&lt;/mn&gt;&lt;mrow&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;mn&gt;6&lt;/mn&gt;&lt;/mrow&gt;&lt;/msup&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;10^{-6}&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.8141079999999999em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;1&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;0&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.8141079999999999em;"&gt;&lt;span style="top:-3.063em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mtight"&gt;−&lt;/span&gt;&lt;span class="mord mtight"&gt;6&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Table 4" src="../../_media/center-loss-table-4.png"&gt;&lt;/p&gt;
&lt;p&gt;They make these observations from the results:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Model C is much better than Model A and Model B for face identification and verification tasks, confirming Center Loss with Softmax works best.&lt;/li&gt;
&lt;li&gt;Second, under the evaluation protocol of a small training set, the proposed Model C- achieves the best results in both face identification and verification tasks, outperforming 2nd place by 5.97% on face identification and 10.15% on face verification, respectively.&lt;/li&gt;
&lt;li&gt;Model C does better than some models trained with a large training set (e.g., Beijing Facecall Co.).&lt;/li&gt;
&lt;li&gt;The models from Google and NTechLAB achieve the best performance thanks to the large training set (500M vs. 0.49M).&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="5-conclusions"&gt;5 Conclusions&lt;/h2&gt;
&lt;p&gt;The paper proposes a new loss function called Center Loss.&lt;/p&gt;
&lt;p&gt;By combining Center Loss with &lt;a href="Softmax Loss"&gt;Softmax Loss&lt;/a&gt; to jointly supervise the learning of CNNs, the authors show that they can enhance the discriminative power of features for face recognition problems.&lt;/p&gt;
&lt;p&gt;The paper runs extensive experiments on large-scale face benchmarks to demonstrate its effectiveness.&lt;/p&gt;</content><category term="reference"/></entry><entry><title>ArcFace: Additive Angular Margin Loss for Deep Face Recognition</title><link href="http://localhost:8000/arcface-additive-angular-margin-loss-for-deep-face-recognition.html" rel="alternate"/><published>2022-05-01T00:00:00+10:00</published><updated>2022-05-01T00:00:00+10:00</updated><author><name>Lex Toumbourou</name></author><id>tag:localhost,2022-05-01:/arcface-additive-angular-margin-loss-for-deep-face-recognition.html</id><summary type="html">&lt;p&gt;Notes from paper &lt;a href="https://arxiv.org/pdf/1801.07698.pdf"&gt;ArcFace: Additive Angular Margin Loss for Deep Face Recognition&lt;/a&gt; by Jiankang Deng, Jia Guo, Niannan Xue, Stefanos Zafeiriou&lt;/p&gt;</summary><content type="html">&lt;p&gt;These are my notes from the paper &lt;a href="https://arxiv.org/pdf/1801.07698.pdf"&gt;ArcFace: Additive Angular Margin Loss for Deep Face Recognition&lt;/a&gt; by Jiankang Deng, Jia Guo, Niannan Xue, Stefanos Zafeiriou.&lt;/p&gt;
&lt;h2 id="abstract"&gt;Abstract&lt;/h2&gt;
&lt;p&gt;The key to face recognition is a loss function with strong discriminative power.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://arxiv.org/abs/1707.07391"&gt;Centre loss&lt;/a&gt; penalises the distance between features and a set of learned class centres.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://arxiv.org/abs/1704.08063"&gt;SphereFace&lt;/a&gt; lets the linear transformation matrix in the last fully connected layer represent class-center and penalise the angle between deep features and their corresponding weights.&lt;/p&gt;
&lt;p&gt;A recently popular idea is incorporating "margins" to maximise face class separability.&lt;/p&gt;
&lt;p&gt;This paper proposes &lt;a href="additive-angular-margin-loss.html"&gt;Additive Angular Margin Loss&lt;/a&gt; (ArcFace), which creates "highly discriminative features" for face recognition.&lt;/p&gt;
&lt;p&gt;ArcFace has a "clear geometric interpretation" due to its correspondence to "geodesic distance" (a curve representing the shortest path between 2 points) on the hypersphere.&lt;/p&gt;
&lt;p&gt;This paper studies the results of ArcFace on ten face recognition benchmarks and shows that ArcFace continually outperforms other algorithms.&lt;/p&gt;
&lt;p&gt;The authors released all their training code and metadata.&lt;/p&gt;
&lt;h2 id="1-intro"&gt;1. Intro&lt;/h2&gt;
&lt;p&gt;The method of choice right now for face recognition is to represent faces using an &lt;a href="embedding.html"&gt;Embedding&lt;/a&gt; generated by a &lt;a href="convolutional-neural-network.html"&gt;Convolutional Neural Network&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The embedding has a small distance to other examples in the same class (intra-class) and a large distance to different classes (inter-class).&lt;/p&gt;
&lt;p&gt;A pose normalisation step (aligning faces) typically occurs before generating embeddings.&lt;/p&gt;
&lt;p&gt;There are two main tracks of research for training these embeddings:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Train a multi-class classifier and use the embedding generated by the network as the representation.&lt;/li&gt;
&lt;li&gt;Directly learn an embedding, for example, Triplet Loss.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Both have their drawbacks.&lt;/p&gt;
&lt;p&gt;The linear transformation matrix &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;W&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;W&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.68333em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.13889em;"&gt;W&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; size increases linearly with every identity &lt;code&gt;n&lt;/code&gt; for softmax loss.&lt;/p&gt;
&lt;p&gt;The learned features are separable enough for closed-set classification but not for open-set problems.&lt;/p&gt;
&lt;p&gt;For triplet loss, there's a combinatorial explosion in the number of face triplets for large-scale datasets.&lt;/p&gt;
&lt;p&gt;Semi-hard sample mining is quite a complex problem to engineer.&lt;/p&gt;
&lt;p&gt;Others have proposed some variants of Softmax loss to enhance the discriminative power of Softmax loss.&lt;/p&gt;
&lt;p&gt;Wen et al. l. pioneered centre loss. It captures the distance between each feature vector and class centre and requires joint penalisation of softmax loss for intra-class dispersion. However, it is challenging to update class centres when there are a lot of classes.&lt;/p&gt;
&lt;p&gt;Instead, enforcing intra-class closes and inter-class separateness at every step should lead to better models.&lt;/p&gt;
&lt;p&gt;That's the idea behind Sphereface, which introduced an angular margin. However, the loss function needs a series of approximations to be computed, resulting in unstable training. They fix this by proposing a hybrid loss function that includes softmax loss.&lt;/p&gt;
&lt;p&gt;CosFace adds a cosine margin penalty to the target logits:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;logits&lt;/code&gt; + &lt;code&gt;some margin penalty&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;This method provides better performance and is easier to train.&lt;/p&gt;
&lt;p&gt;ArcFace is just a slight alternative to CosFace. It gets its name from the use of arc-cosine.&lt;/p&gt;
&lt;p&gt;In this paper, they propose Additive Angular Margin Loss (ArcFace) to improve the discriminative power of CosFace.&lt;/p&gt;
&lt;p&gt;Since we know the dot product between the CNN feature and the last fully connected layer is equal to cosine distance after feature and weight normalisation.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Arcface Figure 2" src="../../_media/arcface-figure-2.png"&gt;&lt;/p&gt;
&lt;p&gt;They utilise the arc-cosine function to calculate the angle between the current feature and target weight.&lt;/p&gt;
&lt;p&gt;Then, add an additive angular margin to the target angle and get the target logit back by a cosine function. They rescale all logits by a fixed feature norm, and subsequent steps are the same as Softmax loss.&lt;/p&gt;
&lt;p&gt;Its:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Engaging - optimises the geodesic distance margin by exact correspondence between angle and arc in the normalised hypersphere.&lt;/li&gt;
&lt;li&gt;Effective - achieves state-of-the-art performance on ten face rec datasets.&lt;/li&gt;
&lt;li&gt;Easy - Only needs several lines of code to implement.&lt;/li&gt;
&lt;li&gt;Efficient - negligible computational overhead.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="2-proposed-approach"&gt;2. Proposed Approach&lt;/h2&gt;
&lt;h3 id="21-arcface"&gt;2.1 ArcFace&lt;/h3&gt;
&lt;p&gt;Firstly, the function for &lt;a href="softmax-loss.html"&gt;Softmax Loss&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;span class="katex-display"&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;msub&gt;&lt;mi&gt;L&lt;/mi&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/msub&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;mfrac&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;mi&gt;N&lt;/mi&gt;&lt;/mfrac&gt;&lt;munderover&gt;&lt;mo&gt;∑&lt;/mo&gt;&lt;mrow&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/mrow&gt;&lt;mi&gt;N&lt;/mi&gt;&lt;/munderover&gt;&lt;mi&gt;log&lt;/mi&gt;&lt;mo&gt;⁡&lt;/mo&gt;&lt;mfrac&gt;&lt;msup&gt;&lt;mi&gt;e&lt;/mi&gt;&lt;mrow&gt;&lt;msubsup&gt;&lt;mi&gt;W&lt;/mi&gt;&lt;msub&gt;&lt;mi&gt;y&lt;/mi&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;/msub&gt;&lt;mi&gt;T&lt;/mi&gt;&lt;/msubsup&gt;&lt;msub&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;/msub&gt;&lt;mo&gt;+&lt;/mo&gt;&lt;msub&gt;&lt;mi&gt;b&lt;/mi&gt;&lt;mrow&gt;&lt;mi&gt;y&lt;/mi&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;/mrow&gt;&lt;/msub&gt;&lt;/mrow&gt;&lt;/msup&gt;&lt;mrow&gt;&lt;munderover&gt;&lt;mo&gt;∑&lt;/mo&gt;&lt;mrow&gt;&lt;mi&gt;j&lt;/mi&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/mrow&gt;&lt;mi&gt;n&lt;/mi&gt;&lt;/munderover&gt;&lt;msup&gt;&lt;mi&gt;e&lt;/mi&gt;&lt;mrow&gt;&lt;msubsup&gt;&lt;mi&gt;W&lt;/mi&gt;&lt;mi&gt;j&lt;/mi&gt;&lt;mi&gt;T&lt;/mi&gt;&lt;/msubsup&gt;&lt;msub&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;/msub&gt;&lt;mo&gt;+&lt;/mo&gt;&lt;msub&gt;&lt;mi&gt;b&lt;/mi&gt;&lt;mi&gt;j&lt;/mi&gt;&lt;/msub&gt;&lt;/mrow&gt;&lt;/msup&gt;&lt;/mrow&gt;&lt;/mfrac&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;L_1 = -\frac{1}{N} \sum\limits_{i=1}^{N} \log \frac{e^{W^{T}_{y_i} x_i + b_{yi}}}{\sum_{j=1}^{n} e^{W^{T}_{j} x_i + b_j}}&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.83333em;vertical-align:-0.15em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;L&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.30110799999999993em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:3.167749em;vertical-align:-1.339413em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;−&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mopen nulldelimiter"&gt;&lt;/span&gt;&lt;span class="mfrac"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:1.32144em;"&gt;&lt;span style="top:-2.314em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault" style="margin-right:0.10903em;"&gt;N&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-3.23em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="frac-line" style="border-bottom-width:0.04em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-3.677em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.686em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose nulldelimiter"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mop op-limits"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:1.8283360000000002em;"&gt;&lt;span style="top:-1.872331em;margin-left:0em;"&gt;&lt;span class="pstrut" style="height:3.05em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathdefault mtight"&gt;i&lt;/span&gt;&lt;span class="mrel mtight"&gt;=&lt;/span&gt;&lt;span class="mord mtight"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-3.050005em;"&gt;&lt;span class="pstrut" style="height:3.05em;"&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="mop op-symbol large-op"&gt;∑&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-4.3000050000000005em;margin-left:0em;"&gt;&lt;span class="pstrut" style="height:3.05em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathdefault mtight" style="margin-right:0.10903em;"&gt;N&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:1.277669em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mop"&gt;lo&lt;span style="margin-right:0.01389em;"&gt;g&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mopen nulldelimiter"&gt;&lt;/span&gt;&lt;span class="mfrac"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:1.785675em;"&gt;&lt;span style="top:-2.2050799999999997em;"&gt;&lt;span class="pstrut" style="height:3.108675em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mop"&gt;&lt;span class="mop op-symbol small-op" style="position:relative;top:-0.0000050000000000050004em;"&gt;∑&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.804292em;"&gt;&lt;span style="top:-2.40029em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathdefault mtight" style="margin-right:0.05724em;"&gt;j&lt;/span&gt;&lt;span class="mrel mtight"&gt;=&lt;/span&gt;&lt;span class="mord mtight"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-3.2029em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathdefault mtight"&gt;n&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.43581800000000004em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;e&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:1.013595em;"&gt;&lt;span style="top:-3.1305700000000005em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathdefault mtight" style="margin-right:0.13889em;"&gt;W&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.8328928571428571em;"&gt;&lt;span style="top:-2.177714285714286em;margin-left:-0.13889em;margin-right:0.07142857142857144em;"&gt;&lt;span class="pstrut" style="height:2.5em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size3 size1 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathdefault mtight" style="margin-right:0.05724em;"&gt;j&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-2.8448em;margin-right:0.07142857142857144em;"&gt;&lt;span class="pstrut" style="height:2.5em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size3 size1 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathdefault mtight" style="margin-right:0.13889em;"&gt;T&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.46117142857142857em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathdefault mtight"&gt;x&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.3280857142857143em;"&gt;&lt;span style="top:-2.357em;margin-left:0em;margin-right:0.07142857142857144em;"&gt;&lt;span class="pstrut" style="height:2.5em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size3 size1 mtight"&gt;&lt;span class="mord mathdefault mtight"&gt;i&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.143em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mbin mtight"&gt;+&lt;/span&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathdefault mtight"&gt;b&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.3280857142857143em;"&gt;&lt;span style="top:-2.357em;margin-left:0em;margin-right:0.07142857142857144em;"&gt;&lt;span class="pstrut" style="height:2.5em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size3 size1 mtight"&gt;&lt;span class="mord mathdefault mtight" style="margin-right:0.05724em;"&gt;j&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.2818857142857143em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-3.338675em;"&gt;&lt;span class="pstrut" style="height:3.108675em;"&gt;&lt;/span&gt;&lt;span class="frac-line" style="border-bottom-width:0.04em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-3.785675em;"&gt;&lt;span class="pstrut" style="height:3.108675em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;e&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:1.1086749999999999em;"&gt;&lt;span style="top:-3.1653100000000003em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathdefault mtight" style="margin-right:0.13889em;"&gt;W&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.9190928571428572em;"&gt;&lt;span style="top:-2.214em;margin-left:-0.13889em;margin-right:0.07142857142857144em;"&gt;&lt;span class="pstrut" style="height:2.5em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size3 size1 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathdefault mtight" style="margin-right:0.03588em;"&gt;y&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.3448em;"&gt;&lt;span style="top:-2.3448em;margin-left:-0.03588em;margin-right:0.1em;"&gt;&lt;span class="pstrut" style="height:2.65952em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault mtight"&gt;i&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.31472em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-2.931em;margin-right:0.07142857142857144em;"&gt;&lt;span class="pstrut" style="height:2.5em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size3 size1 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathdefault mtight" style="margin-right:0.13889em;"&gt;T&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.5107999999999999em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathdefault mtight"&gt;x&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.3280857142857143em;"&gt;&lt;span style="top:-2.357em;margin-left:0em;margin-right:0.07142857142857144em;"&gt;&lt;span class="pstrut" style="height:2.5em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size3 size1 mtight"&gt;&lt;span class="mord mathdefault mtight"&gt;i&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.143em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mbin mtight"&gt;+&lt;/span&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathdefault mtight"&gt;b&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.3280857142857143em;"&gt;&lt;span style="top:-2.357em;margin-left:0em;margin-right:0.07142857142857144em;"&gt;&lt;span class="pstrut" style="height:2.5em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size3 size1 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathdefault mtight" style="margin-right:0.03588em;"&gt;y&lt;/span&gt;&lt;span class="mord mathdefault mtight"&gt;i&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.2818857142857143em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:1.339413em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose nulldelimiter"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;In this expression, &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;msub&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;/msub&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;x_i&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.58056em;vertical-align:-0.15em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;x&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.31166399999999994em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mathdefault mtight"&gt;i&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; is a deep feature of the &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;i&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.65952em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;i&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;th sample, belonging to the &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;msub&gt;&lt;mi&gt;y&lt;/mi&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;/msub&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;y_i&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.625em;vertical-align:-0.19444em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault" style="margin-right:0.03588em;"&gt;y&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.31166399999999994em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:-0.03588em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mathdefault mtight"&gt;i&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; class. The author sets the embedding feature dimension to 512.&lt;/p&gt;
&lt;p&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;msub&gt;&lt;mi&gt;W&lt;/mi&gt;&lt;mi&gt;j&lt;/mi&gt;&lt;/msub&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;W_j&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.969438em;vertical-align:-0.286108em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault" style="margin-right:0.13889em;"&gt;W&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.311664em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:-0.13889em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mathdefault mtight" style="margin-right:0.05724em;"&gt;j&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.286108em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; denotes the jth column of the weight &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;W&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;W&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.68333em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.13889em;"&gt;W&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;, and &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;msub&gt;&lt;mi&gt;b&lt;/mi&gt;&lt;mi&gt;j&lt;/mi&gt;&lt;/msub&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;b_j&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.980548em;vertical-align:-0.286108em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;b&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.311664em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mathdefault mtight" style="margin-right:0.05724em;"&gt;j&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.286108em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; is the bias term. The batch size and class numbers are &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;N&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;N&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.68333em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.10903em;"&gt;N&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; and &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;n&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;n&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.43056em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;n&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;.&lt;/p&gt;
&lt;p&gt;Softmax loss does not explicitly optimise the feature embedding to enforce higher similarity for intra-class samples and diversity for inter-class samples.&lt;/p&gt;
&lt;p&gt;We can set the bias &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;msub&gt;&lt;mi&gt;b&lt;/mi&gt;&lt;mi&gt;j&lt;/mi&gt;&lt;/msub&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mn&gt;0&lt;/mn&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;b_j = 0&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.980548em;vertical-align:-0.286108em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;b&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.311664em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mathdefault mtight" style="margin-right:0.05724em;"&gt;j&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.286108em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.64444em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;0&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; then change the logit &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;msubsup&gt;&lt;mi&gt;W&lt;/mi&gt;&lt;mi&gt;j&lt;/mi&gt;&lt;mi&gt;T&lt;/mi&gt;&lt;/msubsup&gt;&lt;msub&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;/msub&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mi mathvariant="normal"&gt;∣&lt;/mi&gt;&lt;mi mathvariant="normal"&gt;∣&lt;/mi&gt;&lt;msub&gt;&lt;mi&gt;W&lt;/mi&gt;&lt;mi&gt;j&lt;/mi&gt;&lt;/msub&gt;&lt;mi mathvariant="normal"&gt;∣&lt;/mi&gt;&lt;mi mathvariant="normal"&gt;∣&lt;/mi&gt;&lt;mtext&gt; &lt;/mtext&gt;&lt;mi mathvariant="normal"&gt;∣&lt;/mi&gt;&lt;mi mathvariant="normal"&gt;∣&lt;/mi&gt;&lt;msub&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;/msub&gt;&lt;mi mathvariant="normal"&gt;∣&lt;/mi&gt;&lt;mi mathvariant="normal"&gt;∣&lt;/mi&gt;&lt;mi&gt;cos&lt;/mi&gt;&lt;mo&gt;⁡&lt;/mo&gt;&lt;msub&gt;&lt;mi&gt;θ&lt;/mi&gt;&lt;mi&gt;j&lt;/mi&gt;&lt;/msub&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;W^{T}_{j} x_i = ||W_j|| \ ||x_i|| \cos \theta_j&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1.236103em;vertical-align:-0.394772em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault" style="margin-right:0.13889em;"&gt;W&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.8413309999999999em;"&gt;&lt;span style="top:-2.441336em;margin-left:-0.13889em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathdefault mtight" style="margin-right:0.05724em;"&gt;j&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-3.063em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathdefault mtight" style="margin-right:0.13889em;"&gt;T&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.394772em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;x&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.31166399999999994em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mathdefault mtight"&gt;i&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1.036108em;vertical-align:-0.286108em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;∣&lt;/span&gt;&lt;span class="mord"&gt;∣&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault" style="margin-right:0.13889em;"&gt;W&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.311664em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:-0.13889em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mathdefault mtight" style="margin-right:0.05724em;"&gt;j&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.286108em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mord"&gt;∣&lt;/span&gt;&lt;span class="mord"&gt;∣&lt;/span&gt;&lt;span class="mspace"&gt; &lt;/span&gt;&lt;span class="mord"&gt;∣&lt;/span&gt;&lt;span class="mord"&gt;∣&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;x&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.31166399999999994em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mathdefault mtight"&gt;i&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mord"&gt;∣&lt;/span&gt;&lt;span class="mord"&gt;∣&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mop"&gt;cos&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault" style="margin-right:0.02778em;"&gt;θ&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.311664em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:-0.02778em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mathdefault mtight" style="margin-right:0.05724em;"&gt;j&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.286108em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;. If we l2 norm &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;msub&gt;&lt;mi&gt;W&lt;/mi&gt;&lt;mi&gt;j&lt;/mi&gt;&lt;/msub&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;W_j&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.969438em;vertical-align:-0.286108em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault" style="margin-right:0.13889em;"&gt;W&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.311664em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:-0.13889em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mathdefault mtight" style="margin-right:0.05724em;"&gt;j&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.286108em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; and &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;msub&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;/msub&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;x_i&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.58056em;vertical-align:-0.15em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;x&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.31166399999999994em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mathdefault mtight"&gt;i&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;, re-scale it to &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;s&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;s&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.43056em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;s&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;. The normalisation step on features and weights makes the prediction only dependent on the angle between features and thus distributed on a hypersphere with a radius of &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;s&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;s&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.43056em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;s&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;.&lt;/p&gt;
&lt;p&gt;&lt;span class="katex-display"&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;msub&gt;&lt;mi&gt;L&lt;/mi&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;/msub&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;mfrac&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;mi&gt;N&lt;/mi&gt;&lt;/mfrac&gt;&lt;munderover&gt;&lt;mo&gt;∑&lt;/mo&gt;&lt;mrow&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/mrow&gt;&lt;mi&gt;N&lt;/mi&gt;&lt;/munderover&gt;&lt;mi&gt;log&lt;/mi&gt;&lt;mo&gt;⁡&lt;/mo&gt;&lt;mfrac&gt;&lt;msup&gt;&lt;mi&gt;e&lt;/mi&gt;&lt;mrow&gt;&lt;mi&gt;s&lt;/mi&gt;&lt;mi&gt;cos&lt;/mi&gt;&lt;mo&gt;⁡&lt;/mo&gt;&lt;msub&gt;&lt;mi&gt;θ&lt;/mi&gt;&lt;msub&gt;&lt;mi&gt;y&lt;/mi&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;/msub&gt;&lt;/msub&gt;&lt;/mrow&gt;&lt;/msup&gt;&lt;mrow&gt;&lt;msup&gt;&lt;mi&gt;e&lt;/mi&gt;&lt;mrow&gt;&lt;mi&gt;s&lt;/mi&gt;&lt;mi&gt;cos&lt;/mi&gt;&lt;mo&gt;⁡&lt;/mo&gt;&lt;msub&gt;&lt;mi&gt;θ&lt;/mi&gt;&lt;msub&gt;&lt;mi&gt;y&lt;/mi&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;/msub&gt;&lt;/msub&gt;&lt;/mrow&gt;&lt;/msup&gt;&lt;mo&gt;+&lt;/mo&gt;&lt;munderover&gt;&lt;mo&gt;∑&lt;/mo&gt;&lt;mrow&gt;&lt;mi&gt;j&lt;/mi&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;mo separator="true"&gt;,&lt;/mo&gt;&lt;mi&gt;j&lt;/mi&gt;&lt;mo mathvariant="normal"&gt;≠&lt;/mo&gt;&lt;msub&gt;&lt;mi&gt;y&lt;/mi&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;/msub&gt;&lt;/mrow&gt;&lt;mi&gt;n&lt;/mi&gt;&lt;/munderover&gt;&lt;msup&gt;&lt;mi&gt;e&lt;/mi&gt;&lt;mrow&gt;&lt;mi&gt;s&lt;/mi&gt;&lt;mi&gt;cos&lt;/mi&gt;&lt;mo&gt;⁡&lt;/mo&gt;&lt;msub&gt;&lt;mi&gt;θ&lt;/mi&gt;&lt;mi&gt;j&lt;/mi&gt;&lt;/msub&gt;&lt;/mrow&gt;&lt;/msup&gt;&lt;/mrow&gt;&lt;/mfrac&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;L_2 = -\frac{1}{N} \sum\limits_{i=1}^{N} \log \frac{e^{s \cos \theta_{y_i}}}{e^{s \cos \theta_{y_i}} + \sum_{j=1,j \ne y_i}^{n} e^{s \cos \theta_{j}}}&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.83333em;vertical-align:-0.15em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;L&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.30110799999999993em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:3.106005em;vertical-align:-1.277669em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;−&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mopen nulldelimiter"&gt;&lt;/span&gt;&lt;span class="mfrac"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:1.32144em;"&gt;&lt;span style="top:-2.314em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault" style="margin-right:0.10903em;"&gt;N&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-3.23em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="frac-line" style="border-bottom-width:0.04em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-3.677em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.686em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose nulldelimiter"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mop op-limits"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:1.8283360000000002em;"&gt;&lt;span style="top:-1.872331em;margin-left:0em;"&gt;&lt;span class="pstrut" style="height:3.05em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathdefault mtight"&gt;i&lt;/span&gt;&lt;span class="mrel mtight"&gt;=&lt;/span&gt;&lt;span class="mord mtight"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-3.050005em;"&gt;&lt;span class="pstrut" style="height:3.05em;"&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="mop op-symbol large-op"&gt;∑&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-4.3000050000000005em;margin-left:0em;"&gt;&lt;span class="pstrut" style="height:3.05em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathdefault mtight" style="margin-right:0.10903em;"&gt;N&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:1.277669em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mop"&gt;lo&lt;span style="margin-right:0.01389em;"&gt;g&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mopen nulldelimiter"&gt;&lt;/span&gt;&lt;span class="mfrac"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:1.528318em;"&gt;&lt;span style="top:-2.2586820000000003em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;e&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.851318em;"&gt;&lt;span style="top:-3.0652100000000004em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathdefault mtight"&gt;s&lt;/span&gt;&lt;span class="mspace mtight" style="margin-right:0.19516666666666668em;"&gt;&lt;/span&gt;&lt;span class="mop mtight"&gt;&lt;span class="mtight"&gt;c&lt;/span&gt;&lt;span class="mtight"&gt;o&lt;/span&gt;&lt;span class="mtight"&gt;s&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace mtight" style="margin-right:0.19516666666666668em;"&gt;&lt;/span&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathdefault mtight" style="margin-right:0.02778em;"&gt;θ&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.1645428571428572em;"&gt;&lt;span style="top:-2.357em;margin-left:-0.02778em;margin-right:0.07142857142857144em;"&gt;&lt;span class="pstrut" style="height:2.5em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size3 size1 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathdefault mtight" style="margin-right:0.03588em;"&gt;y&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.3448em;"&gt;&lt;span style="top:-2.3448em;margin-left:-0.03588em;margin-right:0.1em;"&gt;&lt;span class="pstrut" style="height:2.65952em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault mtight"&gt;i&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.31472em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.3678em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;+&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;span class="mop"&gt;&lt;span class="mop op-symbol small-op" style="position:relative;top:-0.0000050000000000050004em;"&gt;∑&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.804292em;"&gt;&lt;span style="top:-2.40029em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathdefault mtight" style="margin-right:0.05724em;"&gt;j&lt;/span&gt;&lt;span class="mrel mtight"&gt;=&lt;/span&gt;&lt;span class="mord mtight"&gt;1&lt;/span&gt;&lt;span class="mpunct mtight"&gt;,&lt;/span&gt;&lt;span class="mord mathdefault mtight" style="margin-right:0.05724em;"&gt;j&lt;/span&gt;&lt;span class="mrel mtight"&gt;&lt;span class="mrel mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.69444em;"&gt;&lt;span style="top:-2.7em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="rlap mtight"&gt;&lt;span class="strut" style="height:0.8888799999999999em;vertical-align:-0.19444em;"&gt;&lt;/span&gt;&lt;span class="inner"&gt;&lt;span class="mrel mtight"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="fix"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.19444em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mrel mtight"&gt;=&lt;/span&gt;&lt;/span&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathdefault mtight" style="margin-right:0.03588em;"&gt;y&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.3280857142857143em;"&gt;&lt;span style="top:-2.357em;margin-left:-0.03588em;margin-right:0.07142857142857144em;"&gt;&lt;span class="pstrut" style="height:2.5em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size3 size1 mtight"&gt;&lt;span class="mord mathdefault mtight"&gt;i&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.143em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-3.2029em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathdefault mtight"&gt;n&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.43581800000000004em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;e&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.7911779999999999em;"&gt;&lt;span style="top:-3.0050700000000004em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathdefault mtight"&gt;s&lt;/span&gt;&lt;span class="mspace mtight" style="margin-right:0.19516666666666668em;"&gt;&lt;/span&gt;&lt;span class="mop mtight"&gt;&lt;span class="mtight"&gt;c&lt;/span&gt;&lt;span class="mtight"&gt;o&lt;/span&gt;&lt;span class="mtight"&gt;s&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace mtight" style="margin-right:0.19516666666666668em;"&gt;&lt;/span&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathdefault mtight" style="margin-right:0.02778em;"&gt;θ&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.3280857142857143em;"&gt;&lt;span style="top:-2.357em;margin-left:-0.02778em;margin-right:0.07142857142857144em;"&gt;&lt;span class="pstrut" style="height:2.5em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size3 size1 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathdefault mtight" style="margin-right:0.05724em;"&gt;j&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.2818857142857143em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-3.23em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="frac-line" style="border-bottom-width:0.04em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-3.677em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;e&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.851318em;"&gt;&lt;span style="top:-3.0652100000000004em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathdefault mtight"&gt;s&lt;/span&gt;&lt;span class="mspace mtight" style="margin-right:0.19516666666666668em;"&gt;&lt;/span&gt;&lt;span class="mop mtight"&gt;&lt;span class="mtight"&gt;c&lt;/span&gt;&lt;span class="mtight"&gt;o&lt;/span&gt;&lt;span class="mtight"&gt;s&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace mtight" style="margin-right:0.19516666666666668em;"&gt;&lt;/span&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathdefault mtight" style="margin-right:0.02778em;"&gt;θ&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.1645428571428572em;"&gt;&lt;span style="top:-2.357em;margin-left:-0.02778em;margin-right:0.07142857142857144em;"&gt;&lt;span class="pstrut" style="height:2.5em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size3 size1 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathdefault mtight" style="margin-right:0.03588em;"&gt;y&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.3448em;"&gt;&lt;span style="top:-2.3448em;margin-left:-0.03588em;margin-right:0.1em;"&gt;&lt;span class="pstrut" style="height:2.65952em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault mtight"&gt;i&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.31472em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.3678em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:1.177136em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose nulldelimiter"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;As we distribute embedding features around each feature centre on the hypersphere, we add an additive angular margin penalty &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;m&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;m&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.43056em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;m&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; between &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;msub&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;/msub&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;x_i&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.58056em;vertical-align:-0.15em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;x&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.31166399999999994em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mathdefault mtight"&gt;i&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; and &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;msub&gt;&lt;mi&gt;W&lt;/mi&gt;&lt;mrow&gt;&lt;mi&gt;j&lt;/mi&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;/mrow&gt;&lt;/msub&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;W_{ji}&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.969438em;vertical-align:-0.286108em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault" style="margin-right:0.13889em;"&gt;W&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.311664em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:-0.13889em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathdefault mtight" style="margin-right:0.05724em;"&gt;j&lt;/span&gt;&lt;span class="mord mathdefault mtight"&gt;i&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.286108em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; to enhance intra-class compactness and inter-class discrepancy.&lt;/p&gt;
&lt;p&gt;The method is named ArcFace since the additive angular margin penalty is equal to the geodesic distance margin penalty in the normalised hypersphere,&lt;/p&gt;
&lt;p&gt;&lt;span class="katex-display"&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;msub&gt;&lt;mi&gt;L&lt;/mi&gt;&lt;mn&gt;3&lt;/mn&gt;&lt;/msub&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;mfrac&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;mi&gt;N&lt;/mi&gt;&lt;/mfrac&gt;&lt;munderover&gt;&lt;mo&gt;∑&lt;/mo&gt;&lt;mrow&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/mrow&gt;&lt;mi&gt;N&lt;/mi&gt;&lt;/munderover&gt;&lt;mi&gt;log&lt;/mi&gt;&lt;mo&gt;⁡&lt;/mo&gt;&lt;mfrac&gt;&lt;msup&gt;&lt;mi&gt;e&lt;/mi&gt;&lt;mrow&gt;&lt;mi&gt;s&lt;/mi&gt;&lt;mo stretchy="false"&gt;(&lt;/mo&gt;&lt;mi&gt;cos&lt;/mi&gt;&lt;mo&gt;⁡&lt;/mo&gt;&lt;msub&gt;&lt;mi&gt;θ&lt;/mi&gt;&lt;msub&gt;&lt;mi&gt;y&lt;/mi&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;/msub&gt;&lt;/msub&gt;&lt;mo&gt;+&lt;/mo&gt;&lt;mi&gt;m&lt;/mi&gt;&lt;mo stretchy="false"&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;/msup&gt;&lt;mrow&gt;&lt;msup&gt;&lt;mi&gt;e&lt;/mi&gt;&lt;mrow&gt;&lt;mi&gt;s&lt;/mi&gt;&lt;mo stretchy="false"&gt;(&lt;/mo&gt;&lt;mi&gt;cos&lt;/mi&gt;&lt;mo&gt;⁡&lt;/mo&gt;&lt;msub&gt;&lt;mi&gt;θ&lt;/mi&gt;&lt;msub&gt;&lt;mi&gt;y&lt;/mi&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;/msub&gt;&lt;/msub&gt;&lt;mo&gt;+&lt;/mo&gt;&lt;mi&gt;m&lt;/mi&gt;&lt;mo stretchy="false"&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;/msup&gt;&lt;mo&gt;+&lt;/mo&gt;&lt;munderover&gt;&lt;mo&gt;∑&lt;/mo&gt;&lt;mrow&gt;&lt;mi&gt;j&lt;/mi&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;mo separator="true"&gt;,&lt;/mo&gt;&lt;mi&gt;j&lt;/mi&gt;&lt;mo mathvariant="normal"&gt;≠&lt;/mo&gt;&lt;msub&gt;&lt;mi&gt;y&lt;/mi&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;/msub&gt;&lt;/mrow&gt;&lt;mi&gt;n&lt;/mi&gt;&lt;/munderover&gt;&lt;msup&gt;&lt;mi&gt;e&lt;/mi&gt;&lt;mrow&gt;&lt;mi&gt;s&lt;/mi&gt;&lt;mi&gt;cos&lt;/mi&gt;&lt;mo&gt;⁡&lt;/mo&gt;&lt;msub&gt;&lt;mi&gt;θ&lt;/mi&gt;&lt;mi&gt;j&lt;/mi&gt;&lt;/msub&gt;&lt;/mrow&gt;&lt;/msup&gt;&lt;/mrow&gt;&lt;/mfrac&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;L_3 = -\frac{1}{N} \sum\limits_{i=1}^{N} \log \frac{e^{s (\cos \theta_{y_i} + m ) }}{e^{s (\cos \theta_{y_i} + m) } + \sum_{j=1,j \ne y_i}^{n} e^{s \cos \theta_{j}}}&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.83333em;vertical-align:-0.15em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;L&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.30110799999999993em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;3&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:3.106005em;vertical-align:-1.277669em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;−&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mopen nulldelimiter"&gt;&lt;/span&gt;&lt;span class="mfrac"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:1.32144em;"&gt;&lt;span style="top:-2.314em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault" style="margin-right:0.10903em;"&gt;N&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-3.23em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="frac-line" style="border-bottom-width:0.04em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-3.677em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.686em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose nulldelimiter"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mop op-limits"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:1.8283360000000002em;"&gt;&lt;span style="top:-1.872331em;margin-left:0em;"&gt;&lt;span class="pstrut" style="height:3.05em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathdefault mtight"&gt;i&lt;/span&gt;&lt;span class="mrel mtight"&gt;=&lt;/span&gt;&lt;span class="mord mtight"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-3.050005em;"&gt;&lt;span class="pstrut" style="height:3.05em;"&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="mop op-symbol large-op"&gt;∑&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-4.3000050000000005em;margin-left:0em;"&gt;&lt;span class="pstrut" style="height:3.05em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathdefault mtight" style="margin-right:0.10903em;"&gt;N&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:1.277669em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mop"&gt;lo&lt;span style="margin-right:0.01389em;"&gt;g&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mopen nulldelimiter"&gt;&lt;/span&gt;&lt;span class="mfrac"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:1.56721em;"&gt;&lt;span style="top:-2.2197899999999997em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;e&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.89021em;"&gt;&lt;span style="top:-3.0652100000000004em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathdefault mtight"&gt;s&lt;/span&gt;&lt;span class="mopen mtight"&gt;(&lt;/span&gt;&lt;span class="mop mtight"&gt;&lt;span class="mtight"&gt;c&lt;/span&gt;&lt;span class="mtight"&gt;o&lt;/span&gt;&lt;span class="mtight"&gt;s&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace mtight" style="margin-right:0.19516666666666668em;"&gt;&lt;/span&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathdefault mtight" style="margin-right:0.02778em;"&gt;θ&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.1645428571428572em;"&gt;&lt;span style="top:-2.357em;margin-left:-0.02778em;margin-right:0.07142857142857144em;"&gt;&lt;span class="pstrut" style="height:2.5em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size3 size1 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathdefault mtight" style="margin-right:0.03588em;"&gt;y&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.3448em;"&gt;&lt;span style="top:-2.3448em;margin-left:-0.03588em;margin-right:0.1em;"&gt;&lt;span class="pstrut" style="height:2.65952em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault mtight"&gt;i&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.31472em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.3678em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mbin mtight"&gt;+&lt;/span&gt;&lt;span class="mord mathdefault mtight"&gt;m&lt;/span&gt;&lt;span class="mclose mtight"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;+&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;span class="mop"&gt;&lt;span class="mop op-symbol small-op" style="position:relative;top:-0.0000050000000000050004em;"&gt;∑&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.804292em;"&gt;&lt;span style="top:-2.40029em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathdefault mtight" style="margin-right:0.05724em;"&gt;j&lt;/span&gt;&lt;span class="mrel mtight"&gt;=&lt;/span&gt;&lt;span class="mord mtight"&gt;1&lt;/span&gt;&lt;span class="mpunct mtight"&gt;,&lt;/span&gt;&lt;span class="mord mathdefault mtight" style="margin-right:0.05724em;"&gt;j&lt;/span&gt;&lt;span class="mrel mtight"&gt;&lt;span class="mrel mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.69444em;"&gt;&lt;span style="top:-2.7em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="rlap mtight"&gt;&lt;span class="strut" style="height:0.8888799999999999em;vertical-align:-0.19444em;"&gt;&lt;/span&gt;&lt;span class="inner"&gt;&lt;span class="mrel mtight"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="fix"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.19444em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mrel mtight"&gt;=&lt;/span&gt;&lt;/span&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathdefault mtight" style="margin-right:0.03588em;"&gt;y&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.3280857142857143em;"&gt;&lt;span style="top:-2.357em;margin-left:-0.03588em;margin-right:0.07142857142857144em;"&gt;&lt;span class="pstrut" style="height:2.5em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size3 size1 mtight"&gt;&lt;span class="mord mathdefault mtight"&gt;i&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.143em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-3.2029em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathdefault mtight"&gt;n&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.43581800000000004em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;e&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.7911779999999999em;"&gt;&lt;span style="top:-3.0050700000000004em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathdefault mtight"&gt;s&lt;/span&gt;&lt;span class="mspace mtight" style="margin-right:0.19516666666666668em;"&gt;&lt;/span&gt;&lt;span class="mop mtight"&gt;&lt;span class="mtight"&gt;c&lt;/span&gt;&lt;span class="mtight"&gt;o&lt;/span&gt;&lt;span class="mtight"&gt;s&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace mtight" style="margin-right:0.19516666666666668em;"&gt;&lt;/span&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathdefault mtight" style="margin-right:0.02778em;"&gt;θ&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.3280857142857143em;"&gt;&lt;span style="top:-2.357em;margin-left:-0.02778em;margin-right:0.07142857142857144em;"&gt;&lt;span class="pstrut" style="height:2.5em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size3 size1 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathdefault mtight" style="margin-right:0.05724em;"&gt;j&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.2818857142857143em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-3.23em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="frac-line" style="border-bottom-width:0.04em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-3.677em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;e&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.89021em;"&gt;&lt;span style="top:-3.0652100000000004em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathdefault mtight"&gt;s&lt;/span&gt;&lt;span class="mopen mtight"&gt;(&lt;/span&gt;&lt;span class="mop mtight"&gt;&lt;span class="mtight"&gt;c&lt;/span&gt;&lt;span class="mtight"&gt;o&lt;/span&gt;&lt;span class="mtight"&gt;s&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace mtight" style="margin-right:0.19516666666666668em;"&gt;&lt;/span&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathdefault mtight" style="margin-right:0.02778em;"&gt;θ&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.1645428571428572em;"&gt;&lt;span style="top:-2.357em;margin-left:-0.02778em;margin-right:0.07142857142857144em;"&gt;&lt;span class="pstrut" style="height:2.5em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size3 size1 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathdefault mtight" style="margin-right:0.03588em;"&gt;y&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.3448em;"&gt;&lt;span style="top:-2.3448em;margin-left:-0.03588em;margin-right:0.1em;"&gt;&lt;span class="pstrut" style="height:2.65952em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault mtight"&gt;i&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.31472em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.3678em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mbin mtight"&gt;+&lt;/span&gt;&lt;span class="mord mathdefault mtight"&gt;m&lt;/span&gt;&lt;span class="mclose mtight"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:1.216028em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose nulldelimiter"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;The authors demonstrate the idea of ArcFace using a 2D feature embedding network—Softmax on the left and ArcFace on the right. The "geodesic distance gap" is evident here.&lt;/p&gt;
&lt;p&gt;&lt;img alt="ArcFace Toy Example" src="../../_media/arcface-toy-example.png"&gt;&lt;/p&gt;
&lt;h3 id="22-comparison-with-sphereface-and-cosface"&gt;2.2 Comparison with SphereFace and CosFace&lt;/h3&gt;
&lt;p&gt;SphereFace, ArcFace and CosFace propose three different kinds of margin penalty:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;multiplicative angular margin &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;msub&gt;&lt;mi&gt;m&lt;/mi&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/msub&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;m_1&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.58056em;vertical-align:-0.15em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;m&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.30110799999999993em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;additive angular margin &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;msub&gt;&lt;mi&gt;m&lt;/mi&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;/msub&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;m_2&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.58056em;vertical-align:-0.15em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;m&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.30110799999999993em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;additive cosine margin &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;msub&gt;&lt;mi&gt;m&lt;/mi&gt;&lt;mn&gt;3&lt;/mn&gt;&lt;/msub&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;m_3&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.58056em;vertical-align:-0.15em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;m&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.30110799999999993em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;3&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;All of them enforce inter-class diversity by penalising the target logit.&lt;/p&gt;
&lt;p&gt;This plot shows the angle between the target class and another class. As you can see, the angle between the target and the correct feature is around 20° ArcFace and 100°.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Feature vs. Target Center" src="../../_media/arcface-paper-feature-vs-target-center.png"&gt;&lt;/p&gt;
&lt;p&gt;In this plot, we see the angle between the feature and target centre at different stages of training.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Angle between feature and target center at different stages of training" src="../../_media/arcface-paper-angle-at-diff-stages.png"&gt;&lt;/p&gt;
&lt;p&gt;Combining all margin penalties, we can implement SphereFace, ArcFace, and CosFace in a unified framework with &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;msub&gt;&lt;mi&gt;m&lt;/mi&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/msub&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;m_1&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.58056em;vertical-align:-0.15em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;m&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.30110799999999993em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;, &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;msub&gt;&lt;mi&gt;m&lt;/mi&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;/msub&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;m_2&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.58056em;vertical-align:-0.15em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;m&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.30110799999999993em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;, and &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;msub&gt;&lt;mi&gt;m&lt;/mi&gt;&lt;mn&gt;3&lt;/mn&gt;&lt;/msub&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;m_3&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.58056em;vertical-align:-0.15em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;m&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.30110799999999993em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;3&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; as the hyperparams. Unifying penalties like this should give us target logit curves with high performance.&lt;/p&gt;
&lt;p&gt;&lt;span class="katex-display"&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;msub&gt;&lt;mi&gt;L&lt;/mi&gt;&lt;mn&gt;4&lt;/mn&gt;&lt;/msub&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;mfrac&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;mi&gt;N&lt;/mi&gt;&lt;/mfrac&gt;&lt;munderover&gt;&lt;mo&gt;∑&lt;/mo&gt;&lt;mrow&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/mrow&gt;&lt;mi&gt;N&lt;/mi&gt;&lt;/munderover&gt;&lt;mi&gt;log&lt;/mi&gt;&lt;mo&gt;⁡&lt;/mo&gt;&lt;mfrac&gt;&lt;msup&gt;&lt;mi&gt;e&lt;/mi&gt;&lt;mrow&gt;&lt;mi&gt;s&lt;/mi&gt;&lt;mo stretchy="false"&gt;(&lt;/mo&gt;&lt;mi&gt;cos&lt;/mi&gt;&lt;mo&gt;⁡&lt;/mo&gt;&lt;mo stretchy="false"&gt;(&lt;/mo&gt;&lt;msub&gt;&lt;mi&gt;m&lt;/mi&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/msub&gt;&lt;msub&gt;&lt;mi&gt;θ&lt;/mi&gt;&lt;msub&gt;&lt;mi&gt;y&lt;/mi&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;/msub&gt;&lt;/msub&gt;&lt;mo&gt;+&lt;/mo&gt;&lt;msub&gt;&lt;mi&gt;m&lt;/mi&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;/msub&gt;&lt;mo stretchy="false"&gt;)&lt;/mo&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;msub&gt;&lt;mi&gt;m&lt;/mi&gt;&lt;mn&gt;3&lt;/mn&gt;&lt;/msub&gt;&lt;mo stretchy="false"&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;/msup&gt;&lt;mrow&gt;&lt;msup&gt;&lt;mi&gt;e&lt;/mi&gt;&lt;mrow&gt;&lt;mi&gt;s&lt;/mi&gt;&lt;mo stretchy="false"&gt;(&lt;/mo&gt;&lt;mi&gt;cos&lt;/mi&gt;&lt;mo&gt;⁡&lt;/mo&gt;&lt;mo stretchy="false"&gt;(&lt;/mo&gt;&lt;msub&gt;&lt;mi&gt;m&lt;/mi&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/msub&gt;&lt;msub&gt;&lt;mi&gt;θ&lt;/mi&gt;&lt;msub&gt;&lt;mi&gt;y&lt;/mi&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;/msub&gt;&lt;/msub&gt;&lt;mo&gt;+&lt;/mo&gt;&lt;msub&gt;&lt;mi&gt;m&lt;/mi&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;/msub&gt;&lt;mo stretchy="false"&gt;)&lt;/mo&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;msub&gt;&lt;mi&gt;m&lt;/mi&gt;&lt;mn&gt;3&lt;/mn&gt;&lt;/msub&gt;&lt;mo stretchy="false"&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;/msup&gt;&lt;mo&gt;+&lt;/mo&gt;&lt;munderover&gt;&lt;mo&gt;∑&lt;/mo&gt;&lt;mrow&gt;&lt;mi&gt;j&lt;/mi&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;mo separator="true"&gt;,&lt;/mo&gt;&lt;mi&gt;j&lt;/mi&gt;&lt;mo mathvariant="normal"&gt;≠&lt;/mo&gt;&lt;msub&gt;&lt;mi&gt;y&lt;/mi&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;/msub&gt;&lt;/mrow&gt;&lt;mi&gt;n&lt;/mi&gt;&lt;/munderover&gt;&lt;msup&gt;&lt;mi&gt;e&lt;/mi&gt;&lt;mrow&gt;&lt;mi&gt;s&lt;/mi&gt;&lt;mi&gt;cos&lt;/mi&gt;&lt;mo&gt;⁡&lt;/mo&gt;&lt;msub&gt;&lt;mi&gt;θ&lt;/mi&gt;&lt;mi&gt;j&lt;/mi&gt;&lt;/msub&gt;&lt;/mrow&gt;&lt;/msup&gt;&lt;/mrow&gt;&lt;/mfrac&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;L_4 = -\frac{1}{N} \sum\limits_{i=1}^{N} \log \frac{e^{s (\cos ( m_1 \theta_{y_i} + m_2 ) - m_3 ) }}{e^{s (\cos (m_1 \theta_{y_i} + m_2) - m_3 ) } + \sum_{j=1,j \ne y_i}^{n} e^{s \cos \theta_{j}}}&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.83333em;vertical-align:-0.15em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;L&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.30110799999999993em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;4&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:3.106005em;vertical-align:-1.277669em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;−&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mopen nulldelimiter"&gt;&lt;/span&gt;&lt;span class="mfrac"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:1.32144em;"&gt;&lt;span style="top:-2.314em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault" style="margin-right:0.10903em;"&gt;N&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-3.23em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="frac-line" style="border-bottom-width:0.04em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-3.677em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.686em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose nulldelimiter"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mop op-limits"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:1.8283360000000002em;"&gt;&lt;span style="top:-1.872331em;margin-left:0em;"&gt;&lt;span class="pstrut" style="height:3.05em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathdefault mtight"&gt;i&lt;/span&gt;&lt;span class="mrel mtight"&gt;=&lt;/span&gt;&lt;span class="mord mtight"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-3.050005em;"&gt;&lt;span class="pstrut" style="height:3.05em;"&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="mop op-symbol large-op"&gt;∑&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-4.3000050000000005em;margin-left:0em;"&gt;&lt;span class="pstrut" style="height:3.05em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathdefault mtight" style="margin-right:0.10903em;"&gt;N&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:1.277669em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mop"&gt;lo&lt;span style="margin-right:0.01389em;"&gt;g&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mopen nulldelimiter"&gt;&lt;/span&gt;&lt;span class="mfrac"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:1.56721em;"&gt;&lt;span style="top:-2.2197899999999997em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;e&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.89021em;"&gt;&lt;span style="top:-3.0652100000000004em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathdefault mtight"&gt;s&lt;/span&gt;&lt;span class="mopen mtight"&gt;(&lt;/span&gt;&lt;span class="mop mtight"&gt;&lt;span class="mtight"&gt;c&lt;/span&gt;&lt;span class="mtight"&gt;o&lt;/span&gt;&lt;span class="mtight"&gt;s&lt;/span&gt;&lt;/span&gt;&lt;span class="mopen mtight"&gt;(&lt;/span&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathdefault mtight"&gt;m&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.31731428571428577em;"&gt;&lt;span style="top:-2.357em;margin-left:0em;margin-right:0.07142857142857144em;"&gt;&lt;span class="pstrut" style="height:2.5em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size3 size1 mtight"&gt;&lt;span class="mord mtight"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.143em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathdefault mtight" style="margin-right:0.02778em;"&gt;θ&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.1645428571428572em;"&gt;&lt;span style="top:-2.357em;margin-left:-0.02778em;margin-right:0.07142857142857144em;"&gt;&lt;span class="pstrut" style="height:2.5em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size3 size1 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathdefault mtight" style="margin-right:0.03588em;"&gt;y&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.3448em;"&gt;&lt;span style="top:-2.3448em;margin-left:-0.03588em;margin-right:0.1em;"&gt;&lt;span class="pstrut" style="height:2.65952em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault mtight"&gt;i&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.31472em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.3678em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mbin mtight"&gt;+&lt;/span&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathdefault mtight"&gt;m&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.31731428571428577em;"&gt;&lt;span style="top:-2.357em;margin-left:0em;margin-right:0.07142857142857144em;"&gt;&lt;span class="pstrut" style="height:2.5em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size3 size1 mtight"&gt;&lt;span class="mord mtight"&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.143em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose mtight"&gt;)&lt;/span&gt;&lt;span class="mbin mtight"&gt;−&lt;/span&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathdefault mtight"&gt;m&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.31731428571428577em;"&gt;&lt;span style="top:-2.357em;margin-left:0em;margin-right:0.07142857142857144em;"&gt;&lt;span class="pstrut" style="height:2.5em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size3 size1 mtight"&gt;&lt;span class="mord mtight"&gt;3&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.143em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose mtight"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;+&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;span class="mop"&gt;&lt;span class="mop op-symbol small-op" style="position:relative;top:-0.0000050000000000050004em;"&gt;∑&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.804292em;"&gt;&lt;span style="top:-2.40029em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathdefault mtight" style="margin-right:0.05724em;"&gt;j&lt;/span&gt;&lt;span class="mrel mtight"&gt;=&lt;/span&gt;&lt;span class="mord mtight"&gt;1&lt;/span&gt;&lt;span class="mpunct mtight"&gt;,&lt;/span&gt;&lt;span class="mord mathdefault mtight" style="margin-right:0.05724em;"&gt;j&lt;/span&gt;&lt;span class="mrel mtight"&gt;&lt;span class="mrel mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.69444em;"&gt;&lt;span style="top:-2.7em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="rlap mtight"&gt;&lt;span class="strut" style="height:0.8888799999999999em;vertical-align:-0.19444em;"&gt;&lt;/span&gt;&lt;span class="inner"&gt;&lt;span class="mrel mtight"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="fix"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.19444em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mrel mtight"&gt;=&lt;/span&gt;&lt;/span&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathdefault mtight" style="margin-right:0.03588em;"&gt;y&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.3280857142857143em;"&gt;&lt;span style="top:-2.357em;margin-left:-0.03588em;margin-right:0.07142857142857144em;"&gt;&lt;span class="pstrut" style="height:2.5em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size3 size1 mtight"&gt;&lt;span class="mord mathdefault mtight"&gt;i&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.143em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-3.2029em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathdefault mtight"&gt;n&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.43581800000000004em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;e&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.7911779999999999em;"&gt;&lt;span style="top:-3.0050700000000004em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathdefault mtight"&gt;s&lt;/span&gt;&lt;span class="mspace mtight" style="margin-right:0.19516666666666668em;"&gt;&lt;/span&gt;&lt;span class="mop mtight"&gt;&lt;span class="mtight"&gt;c&lt;/span&gt;&lt;span class="mtight"&gt;o&lt;/span&gt;&lt;span class="mtight"&gt;s&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace mtight" style="margin-right:0.19516666666666668em;"&gt;&lt;/span&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathdefault mtight" style="margin-right:0.02778em;"&gt;θ&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.3280857142857143em;"&gt;&lt;span style="top:-2.357em;margin-left:-0.02778em;margin-right:0.07142857142857144em;"&gt;&lt;span class="pstrut" style="height:2.5em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size3 size1 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathdefault mtight" style="margin-right:0.05724em;"&gt;j&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.2818857142857143em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-3.23em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="frac-line" style="border-bottom-width:0.04em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-3.677em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;e&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.89021em;"&gt;&lt;span style="top:-3.0652100000000004em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathdefault mtight"&gt;s&lt;/span&gt;&lt;span class="mopen mtight"&gt;(&lt;/span&gt;&lt;span class="mop mtight"&gt;&lt;span class="mtight"&gt;c&lt;/span&gt;&lt;span class="mtight"&gt;o&lt;/span&gt;&lt;span class="mtight"&gt;s&lt;/span&gt;&lt;/span&gt;&lt;span class="mopen mtight"&gt;(&lt;/span&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathdefault mtight"&gt;m&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.31731428571428577em;"&gt;&lt;span style="top:-2.357em;margin-left:0em;margin-right:0.07142857142857144em;"&gt;&lt;span class="pstrut" style="height:2.5em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size3 size1 mtight"&gt;&lt;span class="mord mtight"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.143em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathdefault mtight" style="margin-right:0.02778em;"&gt;θ&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.1645428571428572em;"&gt;&lt;span style="top:-2.357em;margin-left:-0.02778em;margin-right:0.07142857142857144em;"&gt;&lt;span class="pstrut" style="height:2.5em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size3 size1 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathdefault mtight" style="margin-right:0.03588em;"&gt;y&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.3448em;"&gt;&lt;span style="top:-2.3448em;margin-left:-0.03588em;margin-right:0.1em;"&gt;&lt;span class="pstrut" style="height:2.65952em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault mtight"&gt;i&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.31472em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.3678em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mbin mtight"&gt;+&lt;/span&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathdefault mtight"&gt;m&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.31731428571428577em;"&gt;&lt;span style="top:-2.357em;margin-left:0em;margin-right:0.07142857142857144em;"&gt;&lt;span class="pstrut" style="height:2.5em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size3 size1 mtight"&gt;&lt;span class="mord mtight"&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.143em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose mtight"&gt;)&lt;/span&gt;&lt;span class="mbin mtight"&gt;−&lt;/span&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathdefault mtight"&gt;m&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.31731428571428577em;"&gt;&lt;span style="top:-2.357em;margin-left:0em;margin-right:0.07142857142857144em;"&gt;&lt;span class="pstrut" style="height:2.5em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size3 size1 mtight"&gt;&lt;span class="mord mtight"&gt;3&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.143em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose mtight"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:1.216028em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose nulldelimiter"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h4 id="geometric-difference"&gt;Geometric Difference&lt;/h4&gt;
&lt;p&gt;Though similar, ArcFace has a better geometric attribute as the angular margin corresponds directly to Geodesic distance.&lt;/p&gt;
&lt;p&gt;ArcFace has a "constant linear, angular margin" throughout the interval. By contrast, SphereFace and CosFace only have a nonlinear angular margin.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Decision Margins of Different Loss Functions" src="../../_media/decision-margins-of-diff-loss-functions.png"&gt;&lt;/p&gt;
&lt;p&gt;Minor margin differences can have a "butterfly effect" on model training. For example, the original SphereFace employs an annealing optimisation strategy. They tried implementing a new version of SphereFace without the integer requirement on the margin. &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;m&lt;/mi&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mn&gt;1.35&lt;/mn&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;m = 1.35&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.43056em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;m&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.64444em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;1&lt;/span&gt;&lt;span class="mord"&gt;.&lt;/span&gt;&lt;span class="mord"&gt;3&lt;/span&gt;&lt;span class="mord"&gt;5&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; can perform similarly to SphereFace without convergence difficulty.&lt;/p&gt;
&lt;h3 id="23-comparison-with-other-losses"&gt;2.3 Comparison with Other Losses&lt;/h3&gt;
&lt;p&gt;Other loss functions can be designed based on the angular representation of features and weight vectors.&lt;/p&gt;
&lt;p&gt;We can design a loss to enforce intra-class compactness and inter-class discrepancy on the hypersphere. Here's the comparison with three other losses:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Intra-Loss&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;They designed them to improve the intra-class compactness by decreasing the angle/arc between a sample and the ground truth centre.&lt;/p&gt;
&lt;p&gt;&lt;span class="katex-display"&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;msub&gt;&lt;mi&gt;L&lt;/mi&gt;&lt;mn&gt;5&lt;/mn&gt;&lt;/msub&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mi&gt;L&lt;/mi&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;mo&gt;+&lt;/mo&gt;&lt;mfrac&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;mrow&gt;&lt;mi&gt;π&lt;/mi&gt;&lt;mi&gt;N&lt;/mi&gt;&lt;/mrow&gt;&lt;/mfrac&gt;&lt;munderover&gt;&lt;mo&gt;∑&lt;/mo&gt;&lt;mrow&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/mrow&gt;&lt;mi&gt;N&lt;/mi&gt;&lt;/munderover&gt;&lt;msub&gt;&lt;mi&gt;θ&lt;/mi&gt;&lt;mrow&gt;&lt;mi&gt;y&lt;/mi&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;/mrow&gt;&lt;/msub&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;L_5 = L2 + \frac{1}{\pi N} \sum\limits_{i=1}^{N} \theta_{yi}&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.83333em;vertical-align:-0.15em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;L&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.30110799999999993em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;5&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.76666em;vertical-align:-0.08333em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;L&lt;/span&gt;&lt;span class="mord"&gt;2&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;+&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:3.106005em;vertical-align:-1.277669em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mopen nulldelimiter"&gt;&lt;/span&gt;&lt;span class="mfrac"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:1.32144em;"&gt;&lt;span style="top:-2.314em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault" style="margin-right:0.03588em;"&gt;π&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.10903em;"&gt;N&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-3.23em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="frac-line" style="border-bottom-width:0.04em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-3.677em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.686em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose nulldelimiter"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mop op-limits"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:1.8283360000000002em;"&gt;&lt;span style="top:-1.872331em;margin-left:0em;"&gt;&lt;span class="pstrut" style="height:3.05em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathdefault mtight"&gt;i&lt;/span&gt;&lt;span class="mrel mtight"&gt;=&lt;/span&gt;&lt;span class="mord mtight"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-3.050005em;"&gt;&lt;span class="pstrut" style="height:3.05em;"&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="mop op-symbol large-op"&gt;∑&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-4.3000050000000005em;margin-left:0em;"&gt;&lt;span class="pstrut" style="height:3.05em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathdefault mtight" style="margin-right:0.10903em;"&gt;N&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:1.277669em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault" style="margin-right:0.02778em;"&gt;θ&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.311664em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:-0.02778em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathdefault mtight" style="margin-right:0.03588em;"&gt;y&lt;/span&gt;&lt;span class="mord mathdefault mtight"&gt;i&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.286108em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Inter-Loss&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Targets enhance inter-class discrepancy by increasing the angle/arc between different centres.&lt;/p&gt;
&lt;p&gt;&lt;span class="katex-display"&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;msub&gt;&lt;mi&gt;L&lt;/mi&gt;&lt;mn&gt;6&lt;/mn&gt;&lt;/msub&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mi&gt;L&lt;/mi&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;mfrac&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;mrow&gt;&lt;mi&gt;π&lt;/mi&gt;&lt;mi&gt;N&lt;/mi&gt;&lt;mo stretchy="false"&gt;(&lt;/mo&gt;&lt;mi&gt;n&lt;/mi&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;mo stretchy="false"&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;/mfrac&gt;&lt;munderover&gt;&lt;mo&gt;∑&lt;/mo&gt;&lt;mrow&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/mrow&gt;&lt;mi&gt;N&lt;/mi&gt;&lt;/munderover&gt;&lt;munderover&gt;&lt;mo&gt;∑&lt;/mo&gt;&lt;mrow&gt;&lt;mi&gt;j&lt;/mi&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;mo separator="true"&gt;,&lt;/mo&gt;&lt;mi&gt;j&lt;/mi&gt;&lt;mo mathvariant="normal"&gt;≠&lt;/mo&gt;&lt;msub&gt;&lt;mi&gt;y&lt;/mi&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;/msub&gt;&lt;/mrow&gt;&lt;mi&gt;n&lt;/mi&gt;&lt;/munderover&gt;&lt;mi&gt;arccos&lt;/mi&gt;&lt;mo&gt;⁡&lt;/mo&gt;&lt;mo stretchy="false"&gt;(&lt;/mo&gt;&lt;msubsup&gt;&lt;mi&gt;W&lt;/mi&gt;&lt;msub&gt;&lt;mi&gt;y&lt;/mi&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;/msub&gt;&lt;mi&gt;T&lt;/mi&gt;&lt;/msubsup&gt;&lt;msub&gt;&lt;mi&gt;W&lt;/mi&gt;&lt;mi&gt;j&lt;/mi&gt;&lt;/msub&gt;&lt;mo stretchy="false"&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;L_6 = L2 - \frac{1}{\pi N (n - 1)} \sum\limits_{i=1}^{N} \sum\limits_{j=1, j \ne y_i}^{n} \arccos(W^{T}_{y_i} W_{j})&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.83333em;vertical-align:-0.15em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;L&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.30110799999999993em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;6&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.76666em;vertical-align:-0.08333em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;L&lt;/span&gt;&lt;span class="mord"&gt;2&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;−&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:3.266557em;vertical-align:-1.438221em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mopen nulldelimiter"&gt;&lt;/span&gt;&lt;span class="mfrac"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:1.32144em;"&gt;&lt;span style="top:-2.314em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault" style="margin-right:0.03588em;"&gt;π&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.10903em;"&gt;N&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord mathdefault"&gt;n&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;−&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;1&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-3.23em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="frac-line" style="border-bottom-width:0.04em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-3.677em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.936em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose nulldelimiter"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mop op-limits"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:1.8283360000000002em;"&gt;&lt;span style="top:-1.872331em;margin-left:0em;"&gt;&lt;span class="pstrut" style="height:3.05em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathdefault mtight"&gt;i&lt;/span&gt;&lt;span class="mrel mtight"&gt;=&lt;/span&gt;&lt;span class="mord mtight"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-3.050005em;"&gt;&lt;span class="pstrut" style="height:3.05em;"&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="mop op-symbol large-op"&gt;∑&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-4.3000050000000005em;margin-left:0em;"&gt;&lt;span class="pstrut" style="height:3.05em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathdefault mtight" style="margin-right:0.10903em;"&gt;N&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:1.277669em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mop op-limits"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:1.6513970000000002em;"&gt;&lt;span style="top:-1.8478869999999998em;margin-left:0em;"&gt;&lt;span class="pstrut" style="height:3.05em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathdefault mtight" style="margin-right:0.05724em;"&gt;j&lt;/span&gt;&lt;span class="mrel mtight"&gt;=&lt;/span&gt;&lt;span class="mord mtight"&gt;1&lt;/span&gt;&lt;span class="mpunct mtight"&gt;,&lt;/span&gt;&lt;span class="mord mathdefault mtight" style="margin-right:0.05724em;"&gt;j&lt;/span&gt;&lt;span class="mrel mtight"&gt;&lt;span class="mrel mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.69444em;"&gt;&lt;span style="top:-2.7em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="rlap mtight"&gt;&lt;span class="strut" style="height:0.8888799999999999em;vertical-align:-0.19444em;"&gt;&lt;/span&gt;&lt;span class="inner"&gt;&lt;span class="mrel mtight"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="fix"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.19444em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mrel mtight"&gt;=&lt;/span&gt;&lt;/span&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathdefault mtight" style="margin-right:0.03588em;"&gt;y&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.3280857142857143em;"&gt;&lt;span style="top:-2.357em;margin-left:-0.03588em;margin-right:0.07142857142857144em;"&gt;&lt;span class="pstrut" style="height:2.5em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size3 size1 mtight"&gt;&lt;span class="mord mathdefault mtight"&gt;i&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.143em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-3.0500049999999996em;"&gt;&lt;span class="pstrut" style="height:3.05em;"&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="mop op-symbol large-op"&gt;∑&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-4.300005em;margin-left:0em;"&gt;&lt;span class="pstrut" style="height:3.05em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathdefault mtight"&gt;n&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:1.438221em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mop"&gt;arccos&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault" style="margin-right:0.13889em;"&gt;W&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.891331em;"&gt;&lt;span style="top:-2.4530000000000003em;margin-left:-0.13889em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathdefault mtight" style="margin-right:0.03588em;"&gt;y&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.3280857142857143em;"&gt;&lt;span style="top:-2.357em;margin-left:-0.03588em;margin-right:0.07142857142857144em;"&gt;&lt;span class="pstrut" style="height:2.5em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size3 size1 mtight"&gt;&lt;span class="mord mathdefault mtight"&gt;i&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.143em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-3.1130000000000004em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathdefault mtight" style="margin-right:0.13889em;"&gt;T&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.383108em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault" style="margin-right:0.13889em;"&gt;W&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.311664em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:-0.13889em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathdefault mtight" style="margin-right:0.05724em;"&gt;j&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.286108em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;We can think of Inter-Loss as a particular Minimum Hyper-spherical Energy (MHE) case. With this loss, we regularise hidden and output layers by MHE. In the MHE paper, the authors propose a special case of loss function by combining the SphereLoss with MHE loss on the network's last layer.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Triplet-loss&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;It aims to increase the angle arc between triple samples. In Facenet, the Euclidean margin is applied to the normalised features. Here we employ the triplet-loss by the angular representation of our features as &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;arccos&lt;/mi&gt;&lt;mo&gt;⁡&lt;/mo&gt;&lt;mo stretchy="false"&gt;(&lt;/mo&gt;&lt;msubsup&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;mtext&gt;pos&lt;/mtext&gt;&lt;/msubsup&gt;&lt;msub&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;/msub&gt;&lt;mo stretchy="false"&gt;)&lt;/mo&gt;&lt;mo&gt;+&lt;/mo&gt;&lt;mi&gt;m&lt;/mi&gt;&lt;mo&gt;≤&lt;/mo&gt;&lt;mi&gt;arccos&lt;/mi&gt;&lt;mo&gt;⁡&lt;/mo&gt;&lt;mo stretchy="false"&gt;(&lt;/mo&gt;&lt;msubsup&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;mtext&gt;neg&lt;/mtext&gt;&lt;/msubsup&gt;&lt;msub&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;/msub&gt;&lt;mo stretchy="false"&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;\arccos(x_{i}^{\text{pos}} x_i) + m \leq \arccos (x_i^{\text{neg}} x_i)&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1.059164em;vertical-align:-0.276864em;"&gt;&lt;/span&gt;&lt;span class="mop"&gt;arccos&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;x&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.7823em;"&gt;&lt;span style="top:-2.4231360000000004em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathdefault mtight"&gt;i&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-3.1809080000000005em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord text mtight"&gt;&lt;span class="mord mtight"&gt;pos&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.276864em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;x&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.31166399999999994em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mathdefault mtight"&gt;i&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;+&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.7719400000000001em;vertical-align:-0.13597em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;m&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;≤&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1.059164em;vertical-align:-0.276864em;"&gt;&lt;/span&gt;&lt;span class="mop"&gt;arccos&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;x&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.7823em;"&gt;&lt;span style="top:-2.4231360000000004em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mathdefault mtight"&gt;i&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-3.1809080000000005em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord text mtight"&gt;&lt;span class="mord mtight"&gt;neg&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.276864em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;x&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.31166399999999994em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mathdefault mtight"&gt;i&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h2 id="3-experiments"&gt;3. Experiments&lt;/h2&gt;
&lt;h3 id="31-implementation-details"&gt;3.1. Implementation Details&lt;/h3&gt;
&lt;h4 id="datasets"&gt;Datasets&lt;/h4&gt;
&lt;p&gt;Use &lt;a href="https://arxiv.org/abs/1411.7923"&gt;CA-SIA&lt;/a&gt;, &lt;a href="https://arxiv.org/abs/1710.08092"&gt;VGGFace2&lt;/a&gt;, &lt;a href="http://trillionpairs.deepglint.com/overview"&gt;MS1MV2, and DeepGlint-Face (including MS1M-DeepGlint and Asian-DeepGlint)&lt;/a&gt; as training data to conduct a fair comparison with other methods.&lt;/p&gt;
&lt;p&gt;MS1MV2 is a refined semi-automatic version of the MS-Celeb-1M dataset. Authors use ethnicity-specific annotators for large-scale face annotations.&lt;/p&gt;
&lt;p&gt;Use face verification datasets (LFW, CFP-FP, and AgeDB-30) to check improvements from different settings. Report performance on large-pos and large-age datasets (CPLFW and CALFW). Test ArcFace on large-scale image datasets (MegaFace, IJB-B, IJB-C, Trillion-Pairs, and video dataset (iQIYI-VID))&lt;/p&gt;
&lt;h4 id="experimental-settings"&gt;Experimental Settings&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Generate normalized face crops (112 x 112) utilizing five facial points.&lt;/li&gt;
&lt;li&gt;For embedding networks, use CNN architectures ResNet50 and ResNet100.&lt;/li&gt;
&lt;li&gt;After the last conv layer, use the BN-Dropout-FC-BN structure to get the final 512-D embedding feature.&lt;/li&gt;
&lt;li&gt;Paper used ([training_dataset, network structure, loss]) for understanding experimental settings.&lt;/li&gt;
&lt;li&gt;Set feature scale to &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;s&lt;/mi&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mn&gt;64&lt;/mn&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;s = 64&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.43056em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;s&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.64444em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;6&lt;/span&gt;&lt;span class="mord"&gt;4&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; and choose angular margin &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;m&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;m&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.43056em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;m&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; of ArcFace at 0.5.&lt;/li&gt;
&lt;li&gt;Use batch size 512 and train on 4 NVIDIA Tesla P40 (24GB) GPUs.&lt;/li&gt;
&lt;li&gt;On CASIA, the learning rate starts from 0.1 and is divided by ten at 20K and 28K iterations. Training finished at 32K iterations. On MS1MV2, divide the learning rate at 100K, 160K, and 180K iterations. We set the momentum to 0.9 and weight decay to 5e-4. During testing, keep the feature embedding without the FC layer, with extra 5120D features for each face.&lt;/li&gt;
&lt;li&gt;Remove overlap identities between the training and test sets and use only one crop for testing.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="32-ablation-study-on-losses"&gt;3.2 Ablation Study on Losses&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;The best margin observed in experiments was 0.5.&lt;/li&gt;
&lt;li&gt;Using the combined margin framework in Eq. 4, it is easier to set the margin of SphereFace and CosFace, found to have optimal performance at 1.35 and 0.35&lt;/li&gt;
&lt;li&gt;Implementations for SphereFace and CoseFace can lead to strong performance without issue converging.&lt;/li&gt;
&lt;li&gt;ArcFace achieves the highest verification accuracy on all 3 test sets.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;em&gt;Refer to the paper for comprehensive testing results.&lt;/em&gt;&lt;/p&gt;
&lt;h2 id="4-conclusions"&gt;4. Conclusions&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Paper proposed an Additive Angular Margin Loss function, which can enhance the discriminative power of feature embeddings learned with CNNs for face recognition.&lt;/li&gt;
&lt;li&gt;Paper demonstrates that the method consistently outperforms the state-of-the-art.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="5-appendix"&gt;5. Appendix&lt;/h2&gt;
&lt;h3 id="51-parallel-acceleration"&gt;5.1 Parallel Acceleration&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;ArcFace and other margin loss rely on Center ($W$), but the param size of Centre is proportional to the number of classes.&lt;/li&gt;
&lt;li&gt;When there are millions of identities in training, ArcFace can cause GPU memory to run out.&lt;/li&gt;
&lt;li&gt;They solve it with a strategy called "parallel acceleration":&lt;ol&gt;
&lt;li&gt;Get feature &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;x&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.43056em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;x&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; (face embeddings are aggregated into one feature matrix (batch size 8 * 64 (as there are 8 GPUs) &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mo&gt;×&lt;/mo&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;\times&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.66666em;vertical-align:-0.08333em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;×&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; feat dim 512))&lt;ul&gt;
&lt;li&gt;The size of the feature matrix is only 1MB, so the communication cost between GPUs is negligible.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Get similarity score matrix ($score = xW)$. They copy the feature matrix into each GPU and concurrently multiply the feature matrix by the centre sub-matrix (1M/8) to get the similarity score submatrix&lt;/li&gt;
&lt;li&gt;Get the gradient on Centre ($dW$). Transpose the feature matrix on each GPU and multiply the transposed feature matrix by the gradient sub-matrix of the similarity score.&lt;/li&gt;
&lt;li&gt;Get the gradient on the feature ($x$) by concurrently multiplying the gradient sub-matrix of similarity score by the transposed centre sub-matrix and sum up the outputs from 8 GPU cards to get the gradient on feature x.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="52-feature-space-analysis"&gt;5.2 Feature Space Analysis&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;512-d hypersphere space should be large enough for large-scale identities.&lt;/li&gt;
&lt;/ul&gt;</content><category term="reference"/><category term="MachineLearning"/></entry><entry><title>Eigenvalue</title><link href="http://localhost:8000/eigenvalue.html" rel="alternate"/><published>2022-01-22T00:00:00+10:00</published><updated>2022-01-22T00:00:00+10:00</updated><author><name>Lex Toumbourou</name></author><id>tag:localhost,2022-01-22:/eigenvalue.html</id><summary type="html">&lt;p&gt;A value which describes how much a transformation scales an Eigenvector&lt;/p&gt;</summary><content type="html">&lt;p&gt;A scalar value that describes how much a transformation scales an &lt;a href="eigenvector.html"&gt;Eigenvector&lt;/a&gt;.&lt;/p&gt;</content><category term="permanent"/><category term="LinearAlgebra"/></entry><entry><title>Eigenvector</title><link href="http://localhost:8000/eigenvector.html" rel="alternate"/><published>2022-01-21T00:00:00+10:00</published><updated>2022-01-21T00:00:00+10:00</updated><author><name>Lex Toumbourou</name></author><id>tag:localhost,2022-01-21:/eigenvector.html</id><summary type="html">&lt;p&gt;A set of vectors whose span doesn't change after a transformation.&lt;/p&gt;</summary><content type="html">&lt;p&gt;An Eigenvectors of a &lt;a href="matrix-transformation.html"&gt;Matrix Transformation&lt;/a&gt; is any non-zero vector that remains on its &lt;a href="vector span.html"&gt;Vector Span&lt;/a&gt; after being transformed.&lt;/p&gt;
&lt;p&gt;That means that performing the transformation is equivalent to scaling the vector by some amount. The amount it scales the Eigenvector is called the &lt;a href="eigenvalue.html"&gt;Eigenvalue&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;For example, if we transform the basis vectors with matrix &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mo fence="true"&gt;[&lt;/mo&gt;&lt;mtable columnspacing="1em" rowspacing="0.15999999999999992em"&gt;&lt;mtr&gt;&lt;mtd&gt;&lt;mstyle displaystyle="false" scriptlevel="0"&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;mtd&gt;&lt;mstyle displaystyle="false" scriptlevel="0"&gt;&lt;mrow&gt;&lt;/mrow&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;mtd&gt;&lt;mstyle displaystyle="false" scriptlevel="0"&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;/mtr&gt;&lt;mtr&gt;&lt;mtd&gt;&lt;mstyle displaystyle="false" scriptlevel="0"&gt;&lt;mn&gt;0&lt;/mn&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;mtd&gt;&lt;mstyle displaystyle="false" scriptlevel="0"&gt;&lt;mrow&gt;&lt;/mrow&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;mtd&gt;&lt;mstyle displaystyle="false" scriptlevel="0"&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;/mtr&gt;&lt;/mtable&gt;&lt;mo fence="true"&gt;]&lt;/mo&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;\begin{bmatrix}2 &amp;amp;&amp;amp; 1 \\ 0 &amp;amp;&amp;amp; 2\end{bmatrix}&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:2.40003em;vertical-align:-0.95003em;"&gt;&lt;/span&gt;&lt;span class="minner"&gt;&lt;span class="mopen delimcenter" style="top:0em;"&gt;&lt;span class="delimsizing size3"&gt;[&lt;/span&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mtable"&gt;&lt;span class="col-align-c"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:1.45em;"&gt;&lt;span style="top:-3.61em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-2.4099999999999997em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;0&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.9500000000000004em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="arraycolsep" style="width:0.5em;"&gt;&lt;/span&gt;&lt;span class="arraycolsep" style="width:0.5em;"&gt;&lt;/span&gt;&lt;span class="col-align-c"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:1.45em;"&gt;&lt;span style="top:-3.4499999999999997em;"&gt;&lt;span class="pstrut" style="height:2.84em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-2.2499999999999996em;"&gt;&lt;span class="pstrut" style="height:2.84em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.9500000000000004em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="arraycolsep" style="width:0.5em;"&gt;&lt;/span&gt;&lt;span class="arraycolsep" style="width:0.5em;"&gt;&lt;/span&gt;&lt;span class="col-align-c"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:1.45em;"&gt;&lt;span style="top:-3.61em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-2.4099999999999997em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.9500000000000004em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose delimcenter" style="top:0em;"&gt;&lt;span class="delimsizing size3"&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;, we can see that &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mover accent="true"&gt;&lt;mi&gt;j&lt;/mi&gt;&lt;mo&gt;^&lt;/mo&gt;&lt;/mover&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;\hat{j}&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1.1174em;vertical-align:-0.19444em;"&gt;&lt;/span&gt;&lt;span class="mord accent"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.92296em;"&gt;&lt;span style="top:-3em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault" style="margin-right:0.05724em;"&gt;j&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-3.22852em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="accent-body" style="left:-0.25em;"&gt;^&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.19444em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; is knocked off its span, where &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mover accent="true"&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;mo&gt;^&lt;/mo&gt;&lt;/mover&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;\hat{i}&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.92296em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord accent"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.92296em;"&gt;&lt;span style="top:-3em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;i&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-3.22852em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="accent-body" style="left:-0.25em;"&gt;^&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; is simply scaled by 2.&lt;/p&gt;
&lt;video controls loop&gt;&lt;source src="/_media/eigenvector.mp4" type="video/mp4"&gt;&lt;/video&gt;

&lt;p&gt;One other particular case of vector that remains on its span is the zero vector: &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mover accent="true"&gt;&lt;mi&gt;v&lt;/mi&gt;&lt;mo&gt;⃗&lt;/mo&gt;&lt;/mover&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mrow&gt;&lt;mo fence="true"&gt;[&lt;/mo&gt;&lt;mtable columnspacing="1em" rowspacing="0.15999999999999992em"&gt;&lt;mtr&gt;&lt;mtd&gt;&lt;mstyle displaystyle="false" scriptlevel="0"&gt;&lt;mn&gt;0&lt;/mn&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;/mtr&gt;&lt;mtr&gt;&lt;mtd&gt;&lt;mstyle displaystyle="false" scriptlevel="0"&gt;&lt;mn&gt;0&lt;/mn&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;/mtr&gt;&lt;/mtable&gt;&lt;mo fence="true"&gt;]&lt;/mo&gt;&lt;/mrow&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;\vec{v}=\begin{bmatrix}0\\0\end{bmatrix}&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.714em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord accent"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.714em;"&gt;&lt;span style="top:-3em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault" style="margin-right:0.03588em;"&gt;v&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-3em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="accent-body" style="left:-0.20772em;"&gt;&lt;span class="overlay" style="height:0.714em;width:0.471em;"&gt;&lt;svg height="0.714em" preserveAspectRatio="xMinYMin" style="width:0.471em" viewBox="0 0 471 714" width="0.471em"&gt;&lt;path d="M377 20c0-5.333 1.833-10 5.5-14S391 0 397 0c4.667 0 8.667 1.667 12 5 3.333 2.667 6.667 9 10 19 6.667 24.667 20.333 43.667 41 57 7.333 4.667 11 10.667 11 18 0 6-1 10-3 12s-6.667 5-14 9c-28.667 14.667-53.667 35.667-75 63 -1.333 1.333-3.167 3.5-5.5 6.5s-4 4.833-5 5.5c-1 .667-2.5 1.333-4.5 2s-4.333 1 -7 1c-4.667 0-9.167-1.833-13.5-5.5S337 184 337 178c0-12.667 15.667-32.333 47-59 H213l-171-1c-8.667-6-13-12.333-13-19 0-4.667 4.333-11.333 13-20h359 c-16-25.333-24-45-24-59z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:2.40003em;vertical-align:-0.95003em;"&gt;&lt;/span&gt;&lt;span class="minner"&gt;&lt;span class="mopen delimcenter" style="top:0em;"&gt;&lt;span class="delimsizing size3"&gt;[&lt;/span&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mtable"&gt;&lt;span class="col-align-c"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:1.45em;"&gt;&lt;span style="top:-3.61em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;0&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-2.4099999999999997em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;0&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.9500000000000004em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose delimcenter" style="top:0em;"&gt;&lt;span class="delimsizing size3"&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;, but that's not an Eigenvector.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;When performing 3d rotations, the Eigenvectors are particularly useful as they describe the axis of rotation.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;The notation for describing the relationship between the matrix transformation of the vector and same scaling quality equivalent:&lt;/p&gt;
&lt;p&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;A&lt;/mi&gt;&lt;mover accent="true"&gt;&lt;mi&gt;v&lt;/mi&gt;&lt;mo&gt;⃗&lt;/mo&gt;&lt;/mover&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mi&gt;λ&lt;/mi&gt;&lt;mover accent="true"&gt;&lt;mi&gt;v&lt;/mi&gt;&lt;mo&gt;⃗&lt;/mo&gt;&lt;/mover&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;A\vec{v} = \lambda\vec{v}&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.714em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;A&lt;/span&gt;&lt;span class="mord accent"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.714em;"&gt;&lt;span style="top:-3em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault" style="margin-right:0.03588em;"&gt;v&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-3em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="accent-body" style="left:-0.20772em;"&gt;&lt;span class="overlay" style="height:0.714em;width:0.471em;"&gt;&lt;svg height="0.714em" preserveAspectRatio="xMinYMin" style="width:0.471em" viewBox="0 0 471 714" width="0.471em"&gt;&lt;path d="M377 20c0-5.333 1.833-10 5.5-14S391 0 397 0c4.667 0 8.667 1.667 12 5 3.333 2.667 6.667 9 10 19 6.667 24.667 20.333 43.667 41 57 7.333 4.667 11 10.667 11 18 0 6-1 10-3 12s-6.667 5-14 9c-28.667 14.667-53.667 35.667-75 63 -1.333 1.333-3.167 3.5-5.5 6.5s-4 4.833-5 5.5c-1 .667-2.5 1.333-4.5 2s-4.333 1 -7 1c-4.667 0-9.167-1.833-13.5-5.5S337 184 337 178c0-12.667 15.667-32.333 47-59 H213l-171-1c-8.667-6-13-12.333-13-19 0-4.667 4.333-11.333 13-20h359 c-16-25.333-24-45-24-59z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.714em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;λ&lt;/span&gt;&lt;span class="mord accent"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.714em;"&gt;&lt;span style="top:-3em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault" style="margin-right:0.03588em;"&gt;v&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-3em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="accent-body" style="left:-0.20772em;"&gt;&lt;span class="overlay" style="height:0.714em;width:0.471em;"&gt;&lt;svg height="0.714em" preserveAspectRatio="xMinYMin" style="width:0.471em" viewBox="0 0 471 714" width="0.471em"&gt;&lt;path d="M377 20c0-5.333 1.833-10 5.5-14S391 0 397 0c4.667 0 8.667 1.667 12 5 3.333 2.667 6.667 9 10 19 6.667 24.667 20.333 43.667 41 57 7.333 4.667 11 10.667 11 18 0 6-1 10-3 12s-6.667 5-14 9c-28.667 14.667-53.667 35.667-75 63 -1.333 1.333-3.167 3.5-5.5 6.5s-4 4.833-5 5.5c-1 .667-2.5 1.333-4.5 2s-4.333 1 -7 1c-4.667 0-9.167-1.833-13.5-5.5S337 184 337 178c0-12.667 15.667-32.333 47-59 H213l-171-1c-8.667-6-13-12.333-13-19 0-4.667 4.333-11.333 13-20h359 c-16-25.333-24-45-24-59z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;</content><category term="permanent"/><category term="LinearAlgebra"/></entry><entry><title>Essence of Linear Algebra</title><link href="http://localhost:8000/essence-of-linear-algebra.html" rel="alternate"/><published>2022-01-14T00:00:00+10:00</published><updated>2022-01-14T00:00:00+10:00</updated><author><name>Lex Toumbourou</name></author><id>tag:localhost,2022-01-14:/essence-of-linear-algebra.html</id><summary type="html">&lt;p&gt;Notes from 3Blue1Brown's video series, &lt;a href="https://www.youtube.com/playlist?list=PLZHQObOWTQDPD3MizzM2xVFitgF8hE_ab"&gt;Essence of Linear Algebra&lt;/a&gt;&lt;/p&gt;</summary><content type="html">&lt;p&gt;Notes from 3Blue1Brown's &lt;a href="https://www.youtube.com/playlist?list=PLZHQObOWTQDPD3MizzM2xVFitgF8hE_ab"&gt;Essence of Linear Algebra&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="contents"&gt;Contents&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="vectors-essence-of-linear-algebra.html"&gt;Essense of linear algebra&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="linear-combinations-span-and-basis-vector-essense.html"&gt;Linear combinations, span, and basis vectors&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="linear-transformations-and-matrices.html"&gt;Linear Transformations and Matrices&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="matrix-multiplication-as-composition.html"&gt;Matrix multiplication as composition&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="three-dimensional-linear-transformations.html"&gt;Three-Dimensional Linear Transformations&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="the-determinant.html"&gt;The determinant&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="inverse-matrices-column-space-and-null-space.html"&gt;Inverse matrices, column space, and null space&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="nonsquare-matrices-as-transformations-between-dimensions.html"&gt;Nonsquare matrices as transformations between dimensions&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="dot-products-and-duality.html"&gt;Dot Products and Duality&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="cross-products.html"&gt;Cross Products&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Chapter 11. Cross products in the light of linear transformations (missing)&lt;/li&gt;
&lt;li&gt;Chapter 12. Cramer's rule, explained geometrically (missing)&lt;/li&gt;
&lt;li&gt;&lt;a href="change-of-basis.html"&gt;Change of basis&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="eigenvectors-and-eigenvalues.html"&gt;Eigenvectors and Eigenvalues&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content><category term="reference"/></entry><entry><title>Changing Basis</title><link href="http://localhost:8000/changing-basis.html" rel="alternate"/><published>2022-01-04T00:00:00+10:00</published><updated>2022-01-04T00:00:00+10:00</updated><author><name>Lex Toumbourou</name></author><id>tag:localhost,2022-01-04:/changing-basis.html</id><summary type="html">&lt;p&gt;Since any vectors can be Basis Vectors, it's useful to understand how to translate vectors between bases&lt;/p&gt;</summary><content type="html">&lt;p&gt;The use of coordinates to define vectors implies an agreement about which &lt;a href="basis vectors.html"&gt;Basis Vectors&lt;/a&gt; we use. In 2d space, we commonly use the standard basis vectors:&lt;/p&gt;
&lt;p&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mover accent="true"&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;mo&gt;^&lt;/mo&gt;&lt;/mover&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mrow&gt;&lt;mo fence="true"&gt;[&lt;/mo&gt;&lt;mtable columnspacing="1em" rowspacing="0.15999999999999992em"&gt;&lt;mtr&gt;&lt;mtd&gt;&lt;mstyle displaystyle="false" scriptlevel="0"&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;/mtr&gt;&lt;mtr&gt;&lt;mtd&gt;&lt;mstyle displaystyle="false" scriptlevel="0"&gt;&lt;mn&gt;0&lt;/mn&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;/mtr&gt;&lt;/mtable&gt;&lt;mo fence="true"&gt;]&lt;/mo&gt;&lt;/mrow&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;\hat{i}=\begin{bmatrix}1 \\ 0\end{bmatrix}&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.92296em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord accent"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.92296em;"&gt;&lt;span style="top:-3em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;i&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-3.22852em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="accent-body" style="left:-0.25em;"&gt;^&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:2.40003em;vertical-align:-0.95003em;"&gt;&lt;/span&gt;&lt;span class="minner"&gt;&lt;span class="mopen delimcenter" style="top:0em;"&gt;&lt;span class="delimsizing size3"&gt;[&lt;/span&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mtable"&gt;&lt;span class="col-align-c"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:1.45em;"&gt;&lt;span style="top:-3.61em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-2.4099999999999997em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;0&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.9500000000000004em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose delimcenter" style="top:0em;"&gt;&lt;span class="delimsizing size3"&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;, &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mover accent="true"&gt;&lt;mi&gt;j&lt;/mi&gt;&lt;mo&gt;^&lt;/mo&gt;&lt;/mover&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mrow&gt;&lt;mo fence="true"&gt;[&lt;/mo&gt;&lt;mtable columnspacing="1em" rowspacing="0.15999999999999992em"&gt;&lt;mtr&gt;&lt;mtd&gt;&lt;mstyle displaystyle="false" scriptlevel="0"&gt;&lt;mn&gt;0&lt;/mn&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;/mtr&gt;&lt;mtr&gt;&lt;mtd&gt;&lt;mstyle displaystyle="false" scriptlevel="0"&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;/mtr&gt;&lt;/mtable&gt;&lt;mo fence="true"&gt;]&lt;/mo&gt;&lt;/mrow&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;\hat{j}=\begin{bmatrix}0 \\ 1\end{bmatrix}&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1.1174em;vertical-align:-0.19444em;"&gt;&lt;/span&gt;&lt;span class="mord accent"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.92296em;"&gt;&lt;span style="top:-3em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault" style="margin-right:0.05724em;"&gt;j&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-3.22852em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="accent-body" style="left:-0.25em;"&gt;^&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.19444em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:2.40003em;vertical-align:-0.95003em;"&gt;&lt;/span&gt;&lt;span class="minner"&gt;&lt;span class="mopen delimcenter" style="top:0em;"&gt;&lt;span class="delimsizing size3"&gt;[&lt;/span&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mtable"&gt;&lt;span class="col-align-c"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:1.45em;"&gt;&lt;span style="top:-3.61em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;0&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-2.4099999999999997em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.9500000000000004em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose delimcenter" style="top:0em;"&gt;&lt;span class="delimsizing size3"&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;.&lt;/p&gt;
&lt;p&gt;However, we are technically not limited to just the standard basis vectors: we can use any set of vectors to describe a coordinate system. Perhaps we encounter an Alien whose coordinate system uses these basis vectors:&lt;/p&gt;
&lt;p&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;msub&gt;&lt;mover accent="true"&gt;&lt;mi&gt;e&lt;/mi&gt;&lt;mo&gt;^&lt;/mo&gt;&lt;/mover&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/msub&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mrow&gt;&lt;mo fence="true"&gt;[&lt;/mo&gt;&lt;mtable columnspacing="1em" rowspacing="0.15999999999999992em"&gt;&lt;mtr&gt;&lt;mtd&gt;&lt;mstyle displaystyle="false" scriptlevel="0"&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;/mtr&gt;&lt;mtr&gt;&lt;mtd&gt;&lt;mstyle displaystyle="false" scriptlevel="0"&gt;&lt;mn&gt;4&lt;/mn&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;/mtr&gt;&lt;/mtable&gt;&lt;mo fence="true"&gt;]&lt;/mo&gt;&lt;/mrow&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;\hat{e}_{1} = \begin{bmatrix}2 \\ 4\end{bmatrix}&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.84444em;vertical-align:-0.15em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord accent"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.69444em;"&gt;&lt;span style="top:-3em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;e&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-3em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="accent-body" style="left:-0.19444em;"&gt;^&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.30110799999999993em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mtight"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:2.40003em;vertical-align:-0.95003em;"&gt;&lt;/span&gt;&lt;span class="minner"&gt;&lt;span class="mopen delimcenter" style="top:0em;"&gt;&lt;span class="delimsizing size3"&gt;[&lt;/span&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mtable"&gt;&lt;span class="col-align-c"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:1.45em;"&gt;&lt;span style="top:-3.61em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-2.4099999999999997em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;4&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.9500000000000004em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose delimcenter" style="top:0em;"&gt;&lt;span class="delimsizing size3"&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;, &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;msub&gt;&lt;mover accent="true"&gt;&lt;mi&gt;e&lt;/mi&gt;&lt;mo&gt;^&lt;/mo&gt;&lt;/mover&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;/msub&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mrow&gt;&lt;mo fence="true"&gt;[&lt;/mo&gt;&lt;mtable columnspacing="1em" rowspacing="0.15999999999999992em"&gt;&lt;mtr&gt;&lt;mtd&gt;&lt;mstyle displaystyle="false" scriptlevel="0"&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;/mtr&gt;&lt;mtr&gt;&lt;mtd&gt;&lt;mstyle displaystyle="false" scriptlevel="0"&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;/mtr&gt;&lt;/mtable&gt;&lt;mo fence="true"&gt;]&lt;/mo&gt;&lt;/mrow&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;\hat{e}_{2} = \begin{bmatrix}1 \\ 1\end{bmatrix}&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.84444em;vertical-align:-0.15em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord accent"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.69444em;"&gt;&lt;span style="top:-3em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;e&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-3em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="accent-body" style="left:-0.19444em;"&gt;^&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.30110799999999993em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mtight"&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:2.40003em;vertical-align:-0.95003em;"&gt;&lt;/span&gt;&lt;span class="minner"&gt;&lt;span class="mopen delimcenter" style="top:0em;"&gt;&lt;span class="delimsizing size3"&gt;[&lt;/span&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mtable"&gt;&lt;span class="col-align-c"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:1.45em;"&gt;&lt;span style="top:-3.61em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-2.4099999999999997em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.9500000000000004em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose delimcenter" style="top:0em;"&gt;&lt;span class="delimsizing size3"&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;.&lt;/p&gt;
&lt;p&gt;If the Alien describes a vector, say &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mo fence="true"&gt;[&lt;/mo&gt;&lt;mtable columnspacing="1em" rowspacing="0.15999999999999992em"&gt;&lt;mtr&gt;&lt;mtd&gt;&lt;mstyle displaystyle="false" scriptlevel="0"&gt;&lt;mn&gt;3&lt;/mn&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;/mtr&gt;&lt;mtr&gt;&lt;mtd&gt;&lt;mstyle displaystyle="false" scriptlevel="0"&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;/mtr&gt;&lt;/mtable&gt;&lt;mo fence="true"&gt;]&lt;/mo&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;\begin{bmatrix}3 \\ 1\end{bmatrix}&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:2.40003em;vertical-align:-0.95003em;"&gt;&lt;/span&gt;&lt;span class="minner"&gt;&lt;span class="mopen delimcenter" style="top:0em;"&gt;&lt;span class="delimsizing size3"&gt;[&lt;/span&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mtable"&gt;&lt;span class="col-align-c"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:1.45em;"&gt;&lt;span style="top:-3.61em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;3&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-2.4099999999999997em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.9500000000000004em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose delimcenter" style="top:0em;"&gt;&lt;span class="delimsizing size3"&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;, in their coordinate system, we'd have first to translate it to our system.&lt;/p&gt;
&lt;p&gt;We can translate back into our system by creating a matrix which uses the Alien basis vectors as the columns:&lt;/p&gt;
&lt;p&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mrow&gt;&lt;mo fence="true"&gt;[&lt;/mo&gt;&lt;mtable columnspacing="1em" rowspacing="0.15999999999999992em"&gt;&lt;mtr&gt;&lt;mtd&gt;&lt;mstyle displaystyle="false" scriptlevel="0"&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;mtd&gt;&lt;mstyle displaystyle="false" scriptlevel="0"&gt;&lt;mrow&gt;&lt;/mrow&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;mtd&gt;&lt;mstyle displaystyle="false" scriptlevel="0"&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;/mtr&gt;&lt;mtr&gt;&lt;mtd&gt;&lt;mstyle displaystyle="false" scriptlevel="0"&gt;&lt;mn&gt;4&lt;/mn&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;mtd&gt;&lt;mstyle displaystyle="false" scriptlevel="0"&gt;&lt;mrow&gt;&lt;/mrow&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;mtd&gt;&lt;mstyle displaystyle="false" scriptlevel="0"&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;/mtr&gt;&lt;/mtable&gt;&lt;mo fence="true"&gt;]&lt;/mo&gt;&lt;/mrow&gt;&lt;mrow&gt;&lt;mo fence="true"&gt;[&lt;/mo&gt;&lt;mtable columnspacing="1em" rowspacing="0.15999999999999992em"&gt;&lt;mtr&gt;&lt;mtd&gt;&lt;mstyle displaystyle="false" scriptlevel="0"&gt;&lt;mn&gt;3&lt;/mn&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;/mtr&gt;&lt;mtr&gt;&lt;mtd&gt;&lt;mstyle displaystyle="false" scriptlevel="0"&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;/mtr&gt;&lt;/mtable&gt;&lt;mo fence="true"&gt;]&lt;/mo&gt;&lt;/mrow&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mrow&gt;&lt;mo fence="true"&gt;[&lt;/mo&gt;&lt;mtable columnspacing="1em" rowspacing="0.15999999999999992em"&gt;&lt;mtr&gt;&lt;mtd&gt;&lt;mstyle displaystyle="false" scriptlevel="0"&gt;&lt;mn&gt;7&lt;/mn&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;/mtr&gt;&lt;mtr&gt;&lt;mtd&gt;&lt;mstyle displaystyle="false" scriptlevel="0"&gt;&lt;mn&gt;13&lt;/mn&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;/mtr&gt;&lt;/mtable&gt;&lt;mo fence="true"&gt;]&lt;/mo&gt;&lt;/mrow&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;\begin{bmatrix}2 &amp;amp;&amp;amp; 1 \\ 4 &amp;amp;&amp;amp; 1\end{bmatrix}\begin{bmatrix}3 \\ 1\end{bmatrix} = \begin{bmatrix}7 \\ 13\end{bmatrix}&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:2.40003em;vertical-align:-0.95003em;"&gt;&lt;/span&gt;&lt;span class="minner"&gt;&lt;span class="mopen delimcenter" style="top:0em;"&gt;&lt;span class="delimsizing size3"&gt;[&lt;/span&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mtable"&gt;&lt;span class="col-align-c"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:1.45em;"&gt;&lt;span style="top:-3.61em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-2.4099999999999997em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;4&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.9500000000000004em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="arraycolsep" style="width:0.5em;"&gt;&lt;/span&gt;&lt;span class="arraycolsep" style="width:0.5em;"&gt;&lt;/span&gt;&lt;span class="col-align-c"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:1.45em;"&gt;&lt;span style="top:-3.4499999999999997em;"&gt;&lt;span class="pstrut" style="height:2.84em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-2.2499999999999996em;"&gt;&lt;span class="pstrut" style="height:2.84em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.9500000000000004em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="arraycolsep" style="width:0.5em;"&gt;&lt;/span&gt;&lt;span class="arraycolsep" style="width:0.5em;"&gt;&lt;/span&gt;&lt;span class="col-align-c"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:1.45em;"&gt;&lt;span style="top:-3.61em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-2.4099999999999997em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.9500000000000004em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose delimcenter" style="top:0em;"&gt;&lt;span class="delimsizing size3"&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="minner"&gt;&lt;span class="mopen delimcenter" style="top:0em;"&gt;&lt;span class="delimsizing size3"&gt;[&lt;/span&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mtable"&gt;&lt;span class="col-align-c"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:1.45em;"&gt;&lt;span style="top:-3.61em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;3&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-2.4099999999999997em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.9500000000000004em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose delimcenter" style="top:0em;"&gt;&lt;span class="delimsizing size3"&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:2.40003em;vertical-align:-0.95003em;"&gt;&lt;/span&gt;&lt;span class="minner"&gt;&lt;span class="mopen delimcenter" style="top:0em;"&gt;&lt;span class="delimsizing size3"&gt;[&lt;/span&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mtable"&gt;&lt;span class="col-align-c"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:1.45em;"&gt;&lt;span style="top:-3.61em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;7&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-2.4099999999999997em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;1&lt;/span&gt;&lt;span class="mord"&gt;3&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.9500000000000004em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose delimcenter" style="top:0em;"&gt;&lt;span class="delimsizing size3"&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;We can think of that as a &lt;a href="matrix-transformation.html"&gt;Matrix Transformation&lt;/a&gt; that scales basis vector &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;msub&gt;&lt;mover accent="true"&gt;&lt;mi&gt;e&lt;/mi&gt;&lt;mo&gt;^&lt;/mo&gt;&lt;/mover&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/msub&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;\hat{e}_1&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.84444em;vertical-align:-0.15em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord accent"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.69444em;"&gt;&lt;span style="top:-3em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;e&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-3em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="accent-body" style="left:-0.19444em;"&gt;^&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.30110799999999993em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; by &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mn&gt;3&lt;/mn&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;3&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.64444em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;3&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; and &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;msub&gt;&lt;mover accent="true"&gt;&lt;mi&gt;e&lt;/mi&gt;&lt;mo&gt;^&lt;/mo&gt;&lt;/mover&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;/msub&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;\hat{e}_2&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.84444em;vertical-align:-0.15em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord accent"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.69444em;"&gt;&lt;span style="top:-3em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;e&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-3em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="accent-body" style="left:-0.19444em;"&gt;^&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.30110799999999993em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; by &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;1&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.64444em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;.&lt;/p&gt;
&lt;p&gt;We can convert a vector described in our coordinate system to the Alien using the &lt;a href="matrix-inverse.html"&gt;Matrix Inverse&lt;/a&gt; of our Alien's basis vector matrix:&lt;/p&gt;
&lt;p&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;msup&gt;&lt;mrow&gt;&lt;mo fence="true"&gt;[&lt;/mo&gt;&lt;mtable columnspacing="1em" rowspacing="0.15999999999999992em"&gt;&lt;mtr&gt;&lt;mtd&gt;&lt;mstyle displaystyle="false" scriptlevel="0"&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;mtd&gt;&lt;mstyle displaystyle="false" scriptlevel="0"&gt;&lt;mrow&gt;&lt;/mrow&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;mtd&gt;&lt;mstyle displaystyle="false" scriptlevel="0"&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;/mtr&gt;&lt;mtr&gt;&lt;mtd&gt;&lt;mstyle displaystyle="false" scriptlevel="0"&gt;&lt;mn&gt;4&lt;/mn&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;mtd&gt;&lt;mstyle displaystyle="false" scriptlevel="0"&gt;&lt;mrow&gt;&lt;/mrow&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;mtd&gt;&lt;mstyle displaystyle="false" scriptlevel="0"&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;/mtr&gt;&lt;/mtable&gt;&lt;mo fence="true"&gt;]&lt;/mo&gt;&lt;/mrow&gt;&lt;mrow&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/mrow&gt;&lt;/msup&gt;&lt;mrow&gt;&lt;mo fence="true"&gt;[&lt;/mo&gt;&lt;mtable columnspacing="1em" rowspacing="0.15999999999999992em"&gt;&lt;mtr&gt;&lt;mtd&gt;&lt;mstyle displaystyle="false" scriptlevel="0"&gt;&lt;mn&gt;7&lt;/mn&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;/mtr&gt;&lt;mtr&gt;&lt;mtd&gt;&lt;mstyle displaystyle="false" scriptlevel="0"&gt;&lt;mn&gt;13&lt;/mn&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;/mtr&gt;&lt;/mtable&gt;&lt;mo fence="true"&gt;]&lt;/mo&gt;&lt;/mrow&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mrow&gt;&lt;mo fence="true"&gt;[&lt;/mo&gt;&lt;mtable columnspacing="1em" rowspacing="0.15999999999999992em"&gt;&lt;mtr&gt;&lt;mtd&gt;&lt;mstyle displaystyle="false" scriptlevel="0"&gt;&lt;mn&gt;3&lt;/mn&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;/mtr&gt;&lt;mtr&gt;&lt;mtd&gt;&lt;mstyle displaystyle="false" scriptlevel="0"&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;/mtr&gt;&lt;/mtable&gt;&lt;mo fence="true"&gt;]&lt;/mo&gt;&lt;/mrow&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;\begin{bmatrix}2 &amp;amp;&amp;amp; 1 \\ 4 &amp;amp;&amp;amp; 1\end{bmatrix}^{-1}\begin{bmatrix}7 \\ 13\end{bmatrix} = \begin{bmatrix}3 \\ 1\end{bmatrix}&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:2.604038em;vertical-align:-0.95003em;"&gt;&lt;/span&gt;&lt;span class="minner"&gt;&lt;span class="minner"&gt;&lt;span class="mopen delimcenter" style="top:0em;"&gt;&lt;span class="delimsizing size3"&gt;[&lt;/span&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mtable"&gt;&lt;span class="col-align-c"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:1.45em;"&gt;&lt;span style="top:-3.61em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-2.4099999999999997em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;4&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.9500000000000004em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="arraycolsep" style="width:0.5em;"&gt;&lt;/span&gt;&lt;span class="arraycolsep" style="width:0.5em;"&gt;&lt;/span&gt;&lt;span class="col-align-c"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:1.45em;"&gt;&lt;span style="top:-3.4499999999999997em;"&gt;&lt;span class="pstrut" style="height:2.84em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-2.2499999999999996em;"&gt;&lt;span class="pstrut" style="height:2.84em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.9500000000000004em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="arraycolsep" style="width:0.5em;"&gt;&lt;/span&gt;&lt;span class="arraycolsep" style="width:0.5em;"&gt;&lt;/span&gt;&lt;span class="col-align-c"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:1.45em;"&gt;&lt;span style="top:-3.61em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-2.4099999999999997em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.9500000000000004em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose delimcenter" style="top:0em;"&gt;&lt;span class="delimsizing size3"&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:1.6540080000000001em;"&gt;&lt;span style="top:-3.9029000000000003em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mtight"&gt;−&lt;/span&gt;&lt;span class="mord mtight"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="minner"&gt;&lt;span class="mopen delimcenter" style="top:0em;"&gt;&lt;span class="delimsizing size3"&gt;[&lt;/span&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mtable"&gt;&lt;span class="col-align-c"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:1.45em;"&gt;&lt;span style="top:-3.61em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;7&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-2.4099999999999997em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;1&lt;/span&gt;&lt;span class="mord"&gt;3&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.9500000000000004em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose delimcenter" style="top:0em;"&gt;&lt;span class="delimsizing size3"&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:2.40003em;vertical-align:-0.95003em;"&gt;&lt;/span&gt;&lt;span class="minner"&gt;&lt;span class="mopen delimcenter" style="top:0em;"&gt;&lt;span class="delimsizing size3"&gt;[&lt;/span&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mtable"&gt;&lt;span class="col-align-c"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:1.45em;"&gt;&lt;span style="top:-3.61em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;3&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-2.4099999999999997em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.9500000000000004em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose delimcenter" style="top:0em;"&gt;&lt;span class="delimsizing size3"&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;If we wish to perform a transformation described in our Basis, for example, a rotational transformation on an alternate basis, we can follow these steps:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Convert the vector into our Basis by applying our friend's transformation matrix.&lt;/li&gt;
&lt;li&gt;Perform the translation.&lt;/li&gt;
&lt;li&gt;Convert the vector back into our friend's Basis by applying the inverse of the transformation.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;In notation, if we have vector &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mover accent="true"&gt;&lt;mi&gt;v&lt;/mi&gt;&lt;mo&gt;⃗&lt;/mo&gt;&lt;/mover&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;\vec{v}&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.714em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord accent"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.714em;"&gt;&lt;span style="top:-3em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault" style="margin-right:0.03588em;"&gt;v&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-3em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="accent-body" style="left:-0.20772em;"&gt;&lt;span class="overlay" style="height:0.714em;width:0.471em;"&gt;&lt;svg height="0.714em" preserveAspectRatio="xMinYMin" style="width:0.471em" viewBox="0 0 471 714" width="0.471em"&gt;&lt;path d="M377 20c0-5.333 1.833-10 5.5-14S391 0 397 0c4.667 0 8.667 1.667 12 5 3.333 2.667 6.667 9 10 19 6.667 24.667 20.333 43.667 41 57 7.333 4.667 11 10.667 11 18 0 6-1 10-3 12s-6.667 5-14 9c-28.667 14.667-53.667 35.667-75 63 -1.333 1.333-3.167 3.5-5.5 6.5s-4 4.833-5 5.5c-1 .667-2.5 1.333-4.5 2s-4.333 1 -7 1c-4.667 0-9.167-1.833-13.5-5.5S337 184 337 178c0-12.667 15.667-32.333 47-59 H213l-171-1c-8.667-6-13-12.333-13-19 0-4.667 4.333-11.333 13-20h359 c-16-25.333-24-45-24-59z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; described in our friend's Basis &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;A&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;A&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.68333em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;A&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;, we can apply &lt;a href="matrix transformation.html"&gt;Matrix Transformation&lt;/a&gt; &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;M&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;M&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.68333em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.10903em;"&gt;M&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;, described in our Basis, as follows:&lt;/p&gt;
&lt;p&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;msup&gt;&lt;mi&gt;A&lt;/mi&gt;&lt;mrow&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/mrow&gt;&lt;/msup&gt;&lt;mi&gt;M&lt;/mi&gt;&lt;mi&gt;A&lt;/mi&gt;&lt;mtext&gt; &lt;/mtext&gt;&lt;mover accent="true"&gt;&lt;mi&gt;v&lt;/mi&gt;&lt;mo&gt;⃗&lt;/mo&gt;&lt;/mover&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;A^{-1}MA \ \vec{v}&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.8141079999999999em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;A&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.8141079999999999em;"&gt;&lt;span style="top:-3.063em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mtight"&gt;−&lt;/span&gt;&lt;span class="mord mtight"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.10903em;"&gt;M&lt;/span&gt;&lt;span class="mord mathdefault"&gt;A&lt;/span&gt;&lt;span class="mspace"&gt; &lt;/span&gt;&lt;span class="mord accent"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.714em;"&gt;&lt;span style="top:-3em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault" style="margin-right:0.03588em;"&gt;v&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-3em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="accent-body" style="left:-0.20772em;"&gt;&lt;span class="overlay" style="height:0.714em;width:0.471em;"&gt;&lt;svg height="0.714em" preserveAspectRatio="xMinYMin" style="width:0.471em" viewBox="0 0 471 714" width="0.471em"&gt;&lt;path d="M377 20c0-5.333 1.833-10 5.5-14S391 0 397 0c4.667 0 8.667 1.667 12 5 3.333 2.667 6.667 9 10 19 6.667 24.667 20.333 43.667 41 57 7.333 4.667 11 10.667 11 18 0 6-1 10-3 12s-6.667 5-14 9c-28.667 14.667-53.667 35.667-75 63 -1.333 1.333-3.167 3.5-5.5 6.5s-4 4.833-5 5.5c-1 .667-2.5 1.333-4.5 2s-4.333 1 -7 1c-4.667 0-9.167-1.833-13.5-5.5S337 184 337 178c0-12.667 15.667-32.333 47-59 H213l-171-1c-8.667-6-13-12.333-13-19 0-4.667 4.333-11.333 13-20h359 c-16-25.333-24-45-24-59z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;</content><category term="permanent"/><category term="LinearAlgebra"/></entry><entry><title>Roblox Attachment</title><link href="http://localhost:8000/roblox-attachment.html" rel="alternate"/><published>2021-12-12T00:00:00+10:00</published><updated>2021-12-12T00:00:00+10:00</updated><author><name>Lex Toumbourou</name></author><id>tag:localhost,2021-12-12:/roblox-attachment.html</id><summary type="html">&lt;p&gt;An object that describes a point and orientation relative to a BasePart&lt;/p&gt;</summary><content type="html">&lt;p&gt;An &lt;code&gt;Attachment&lt;/code&gt; in Roblox is an object that describes a point and orientation in space relative BasePart's &lt;a href="roblox-cframe.html"&gt;Roblox CFrame&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Consider a &lt;code&gt;Fire&lt;/code&gt; that you want to burn from the back of a &lt;code&gt;Part&lt;/code&gt;. If I attach a &lt;code&gt;Fire&lt;/code&gt; instance directly to a &lt;code&gt;Part&lt;/code&gt;, it will always burn from the &lt;code&gt;Part&lt;/code&gt;'s center of the Part. Instead, I can create an &lt;code&gt;Attachment&lt;/code&gt; parented to the &lt;code&gt;Part&lt;/code&gt; and position it -2 studs along the X-axis and one stud along the Y-axis from the Part's center.&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;Attachment&lt;/code&gt; remains in the same place relative to the &lt;code&gt;Part&lt;/code&gt; as the part moves.&lt;/p&gt;
&lt;video controls loop autoplay&gt;&lt;source src="/_media/roblox-attachment-low.mp4" type="video/mp4"&gt;&lt;/video&gt;

&lt;p&gt;Here's how it looks in code:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="c1"&gt;--!strict&lt;/span&gt;

&lt;span class="c1"&gt;-- Create Part.&lt;/span&gt;
&lt;span class="kd"&gt;local&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;part&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="py"&gt;Part&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;Instance&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Part&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nv"&gt;part&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;Anchored&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;

&lt;span class="c1"&gt;-- Create an Attachment behind the Part.&lt;/span&gt;
&lt;span class="kd"&gt;local&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;attachment&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="py"&gt;Attachment&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;Instance&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Attachment&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nv"&gt;attachment&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;Position&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;Vector3&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nv"&gt;attachment&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;Parent&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;part&lt;/span&gt;

&lt;span class="c1"&gt;-- Attach fire to Attachment instead of Part.&lt;/span&gt;
&lt;span class="kd"&gt;local&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;fire&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="py"&gt;Fire&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;Instance&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Fire&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nv"&gt;fire&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;Size&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;
&lt;span class="nv"&gt;fire&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;Heat&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;
&lt;span class="nv"&gt;fire&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;Parent&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;attachment&lt;/span&gt;

&lt;span class="nv"&gt;part&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;Parent&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;game&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;Workspace&lt;/span&gt;

&lt;span class="c1"&gt;-- Code to move Part around below.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;A new attachment can be created using &lt;code&gt;Instance.new('Attachment')&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;An attachment's position can be updated using the &lt;code&gt;Position&lt;/code&gt; attribute or editing the &lt;code&gt;CFrame&lt;/code&gt; attribute.&lt;/p&gt;
&lt;p&gt;There are many items that you can parent directly to an &lt;code&gt;Attachment&lt;/code&gt; instead of a &lt;code&gt;Part&lt;/code&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Any &lt;code&gt;ParticleEmitters&lt;/code&gt; can be parented directly to an &lt;code&gt;Attachment.&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Sound&lt;/code&gt; objects allow audio to play directly from the &lt;code&gt;Attachment&lt;/code&gt;'s location.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;PointLight&lt;/code&gt; and &lt;code&gt;SpotLight&lt;/code&gt; allow light to shine from a specific point on a Part.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href="Roblox Constraint"&gt;Roblox Constraint&lt;/a&gt; objects rely on Attachments.&lt;/p&gt;
&lt;p&gt;The &lt;a href="Roblox Accessory"&gt;Roblox Accessory&lt;/a&gt; system utilizes attachments to position accessories on a character's body parts.&lt;/p&gt;</content><category term="permanent"/><category term="Roblox"/></entry><entry><title>Cross Product</title><link href="http://localhost:8000/cross-product.html" rel="alternate"/><published>2021-12-05T00:00:00+10:00</published><updated>2021-12-05T00:00:00+10:00</updated><author><name>Lex Toumbourou</name></author><id>tag:localhost,2021-12-05:/cross-product.html</id><summary type="html">&lt;p&gt;An operation between two 3d vectors that returns a vector.&lt;/p&gt;</summary><content type="html">&lt;p&gt;The Cross Product is an operation between two vectors that returns a vector: &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mover accent="true"&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mo&gt;⃗&lt;/mo&gt;&lt;/mover&gt;&lt;mo&gt;×&lt;/mo&gt;&lt;mover accent="true"&gt;&lt;mi&gt;b&lt;/mi&gt;&lt;mo&gt;⃗&lt;/mo&gt;&lt;/mover&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mover accent="true"&gt;&lt;mi&gt;c&lt;/mi&gt;&lt;mo&gt;⃗&lt;/mo&gt;&lt;/mover&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;\vec{a} \times \vec{b} = \vec{c}&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.79733em;vertical-align:-0.08333em;"&gt;&lt;/span&gt;&lt;span class="mord accent"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.714em;"&gt;&lt;span style="top:-3em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;a&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-3em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="accent-body" style="left:-0.2355em;"&gt;&lt;span class="overlay" style="height:0.714em;width:0.471em;"&gt;&lt;svg height="0.714em" preserveAspectRatio="xMinYMin" style="width:0.471em" viewBox="0 0 471 714" width="0.471em"&gt;&lt;path d="M377 20c0-5.333 1.833-10 5.5-14S391 0 397 0c4.667 0 8.667 1.667 12 5 3.333 2.667 6.667 9 10 19 6.667 24.667 20.333 43.667 41 57 7.333 4.667 11 10.667 11 18 0 6-1 10-3 12s-6.667 5-14 9c-28.667 14.667-53.667 35.667-75 63 -1.333 1.333-3.167 3.5-5.5 6.5s-4 4.833-5 5.5c-1 .667-2.5 1.333-4.5 2s-4.333 1 -7 1c-4.667 0-9.167-1.833-13.5-5.5S337 184 337 178c0-12.667 15.667-32.333 47-59 H213l-171-1c-8.667-6-13-12.333-13-19 0-4.667 4.333-11.333 13-20h359 c-16-25.333-24-45-24-59z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;×&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.9774399999999999em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord accent"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.9774399999999999em;"&gt;&lt;span style="top:-3em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;b&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-3.26344em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="accent-body" style="left:-0.2355em;"&gt;&lt;span class="overlay" style="height:0.714em;width:0.471em;"&gt;&lt;svg height="0.714em" preserveAspectRatio="xMinYMin" style="width:0.471em" viewBox="0 0 471 714" width="0.471em"&gt;&lt;path d="M377 20c0-5.333 1.833-10 5.5-14S391 0 397 0c4.667 0 8.667 1.667 12 5 3.333 2.667 6.667 9 10 19 6.667 24.667 20.333 43.667 41 57 7.333 4.667 11 10.667 11 18 0 6-1 10-3 12s-6.667 5-14 9c-28.667 14.667-53.667 35.667-75 63 -1.333 1.333-3.167 3.5-5.5 6.5s-4 4.833-5 5.5c-1 .667-2.5 1.333-4.5 2s-4.333 1 -7 1c-4.667 0-9.167-1.833-13.5-5.5S337 184 337 178c0-12.667 15.667-32.333 47-59 H213l-171-1c-8.667-6-13-12.333-13-19 0-4.667 4.333-11.333 13-20h359 c-16-25.333-24-45-24-59z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.714em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord accent"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.714em;"&gt;&lt;span style="top:-3em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;c&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-3em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="accent-body" style="left:-0.17994em;"&gt;&lt;span class="overlay" style="height:0.714em;width:0.471em;"&gt;&lt;svg height="0.714em" preserveAspectRatio="xMinYMin" style="width:0.471em" viewBox="0 0 471 714" width="0.471em"&gt;&lt;path d="M377 20c0-5.333 1.833-10 5.5-14S391 0 397 0c4.667 0 8.667 1.667 12 5 3.333 2.667 6.667 9 10 19 6.667 24.667 20.333 43.667 41 57 7.333 4.667 11 10.667 11 18 0 6-1 10-3 12s-6.667 5-14 9c-28.667 14.667-53.667 35.667-75 63 -1.333 1.333-3.167 3.5-5.5 6.5s-4 4.833-5 5.5c-1 .667-2.5 1.333-4.5 2s-4.333 1 -7 1c-4.667 0-9.167-1.833-13.5-5.5S337 184 337 178c0-12.667 15.667-32.333 47-59 H213l-171-1c-8.667-6-13-12.333-13-19 0-4.667 4.333-11.333 13-20h359 c-16-25.333-24-45-24-59z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;The returned vector will be orthogonal to both input vectors and have a length equal to the &lt;a href="parallelogram-area.html"&gt;Parallelogram Area&lt;/a&gt; the input vectors define.&lt;/p&gt;
&lt;video controls loop&gt;&lt;source src="/_media/cross-product.mp4" type="video/mp4"&gt;&lt;/video&gt;

&lt;p&gt;Though the Cross Product can be generalized to multiple dimensions by taking the product of &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;n&lt;/mi&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;n - 1&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.66666em;vertical-align:-0.08333em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;n&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;−&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.64444em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; vectors, you usually calculate the Cross Product in 3d space.&lt;/p&gt;
&lt;p&gt;The Cross Product operation works as follows:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Line up the vectors, as you would when taking the &lt;a href="dot-product.html"&gt;Dot Product&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mrow&gt;&lt;mo fence="true"&gt;[&lt;/mo&gt;&lt;mtable columnspacing="1em" rowspacing="0.15999999999999992em"&gt;&lt;mtr&gt;&lt;mtd&gt;&lt;mstyle displaystyle="false" scriptlevel="0"&gt;&lt;msub&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/msub&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;/mtr&gt;&lt;mtr&gt;&lt;mtd&gt;&lt;mstyle displaystyle="false" scriptlevel="0"&gt;&lt;msub&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;/msub&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;/mtr&gt;&lt;mtr&gt;&lt;mtd&gt;&lt;mstyle displaystyle="false" scriptlevel="0"&gt;&lt;msub&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mn&gt;3&lt;/mn&gt;&lt;/msub&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;/mtr&gt;&lt;/mtable&gt;&lt;mo fence="true"&gt;]&lt;/mo&gt;&lt;/mrow&gt;&lt;mo&gt;×&lt;/mo&gt;&lt;mrow&gt;&lt;mo fence="true"&gt;[&lt;/mo&gt;&lt;mtable columnspacing="1em" rowspacing="0.15999999999999992em"&gt;&lt;mtr&gt;&lt;mtd&gt;&lt;mstyle displaystyle="false" scriptlevel="0"&gt;&lt;msub&gt;&lt;mi&gt;b&lt;/mi&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/msub&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;/mtr&gt;&lt;mtr&gt;&lt;mtd&gt;&lt;mstyle displaystyle="false" scriptlevel="0"&gt;&lt;msub&gt;&lt;mi&gt;b&lt;/mi&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;/msub&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;/mtr&gt;&lt;mtr&gt;&lt;mtd&gt;&lt;mstyle displaystyle="false" scriptlevel="0"&gt;&lt;msub&gt;&lt;mi&gt;b&lt;/mi&gt;&lt;mn&gt;3&lt;/mn&gt;&lt;/msub&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;/mtr&gt;&lt;/mtable&gt;&lt;mo fence="true"&gt;]&lt;/mo&gt;&lt;/mrow&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mrow&gt;&lt;mo fence="true"&gt;[&lt;/mo&gt;&lt;mtable columnspacing="1em" rowspacing="0.15999999999999992em"&gt;&lt;mtr&gt;&lt;mtd&gt;&lt;mstyle displaystyle="false" scriptlevel="0"&gt;&lt;mo lspace="0em" rspace="0em" stretchy="false"&gt;?&lt;/mo&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;/mtr&gt;&lt;mtr&gt;&lt;mtd&gt;&lt;mstyle displaystyle="false" scriptlevel="0"&gt;&lt;mo lspace="0em" rspace="0em" stretchy="false"&gt;?&lt;/mo&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;/mtr&gt;&lt;mtr&gt;&lt;mtd&gt;&lt;mstyle displaystyle="false" scriptlevel="0"&gt;&lt;mo lspace="0em" rspace="0em" stretchy="false"&gt;?&lt;/mo&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;/mtr&gt;&lt;/mtable&gt;&lt;mo fence="true"&gt;]&lt;/mo&gt;&lt;/mrow&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;\begin{bmatrix}a_1 \\ a_2 \\ a_3\end{bmatrix} \times \begin{bmatrix}b_1 \\ b_2 \\ b_3\end{bmatrix} = \begin{bmatrix} ? \\ ? \\ ? \end{bmatrix}&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:3.6010299999999997em;vertical-align:-1.55002em;"&gt;&lt;/span&gt;&lt;span class="minner"&gt;&lt;span class="mopen"&gt;&lt;span class="delimsizing mult"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:2.0510099999999998em;"&gt;&lt;span style="top:-2.2500000000000004em;"&gt;&lt;span class="pstrut" style="height:3.1550000000000002em;"&gt;&lt;/span&gt;&lt;span class="delimsizinginner delim-size4"&gt;&lt;span&gt;⎣&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-2.8099900000000004em;"&gt;&lt;span class="pstrut" style="height:3.1550000000000002em;"&gt;&lt;/span&gt;&lt;span class="delimsizinginner delim-size4"&gt;&lt;span&gt;⎢&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-4.05101em;"&gt;&lt;span class="pstrut" style="height:3.1550000000000002em;"&gt;&lt;/span&gt;&lt;span class="delimsizinginner delim-size4"&gt;&lt;span&gt;⎡&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:1.55002em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mtable"&gt;&lt;span class="col-align-c"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:2.05em;"&gt;&lt;span style="top:-4.21em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;a&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.30110799999999993em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-3.0099999999999993em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;a&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.30110799999999993em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-1.8099999999999994em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;a&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.30110799999999993em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;3&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:1.5500000000000007em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose"&gt;&lt;span class="delimsizing mult"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:2.0510099999999998em;"&gt;&lt;span style="top:-2.2500000000000004em;"&gt;&lt;span class="pstrut" style="height:3.1550000000000002em;"&gt;&lt;/span&gt;&lt;span class="delimsizinginner delim-size4"&gt;&lt;span&gt;⎦&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-2.8099900000000004em;"&gt;&lt;span class="pstrut" style="height:3.1550000000000002em;"&gt;&lt;/span&gt;&lt;span class="delimsizinginner delim-size4"&gt;&lt;span&gt;⎥&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-4.05101em;"&gt;&lt;span class="pstrut" style="height:3.1550000000000002em;"&gt;&lt;/span&gt;&lt;span class="delimsizinginner delim-size4"&gt;&lt;span&gt;⎤&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:1.55002em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;×&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:3.6010299999999997em;vertical-align:-1.55002em;"&gt;&lt;/span&gt;&lt;span class="minner"&gt;&lt;span class="mopen"&gt;&lt;span class="delimsizing mult"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:2.0510099999999998em;"&gt;&lt;span style="top:-2.2500000000000004em;"&gt;&lt;span class="pstrut" style="height:3.1550000000000002em;"&gt;&lt;/span&gt;&lt;span class="delimsizinginner delim-size4"&gt;&lt;span&gt;⎣&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-2.8099900000000004em;"&gt;&lt;span class="pstrut" style="height:3.1550000000000002em;"&gt;&lt;/span&gt;&lt;span class="delimsizinginner delim-size4"&gt;&lt;span&gt;⎢&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-4.05101em;"&gt;&lt;span class="pstrut" style="height:3.1550000000000002em;"&gt;&lt;/span&gt;&lt;span class="delimsizinginner delim-size4"&gt;&lt;span&gt;⎡&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:1.55002em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mtable"&gt;&lt;span class="col-align-c"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:2.05em;"&gt;&lt;span style="top:-4.21em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;b&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.30110799999999993em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-3.0099999999999993em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;b&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.30110799999999993em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-1.8099999999999994em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;b&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.30110799999999993em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;3&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:1.5500000000000007em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose"&gt;&lt;span class="delimsizing mult"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:2.0510099999999998em;"&gt;&lt;span style="top:-2.2500000000000004em;"&gt;&lt;span class="pstrut" style="height:3.1550000000000002em;"&gt;&lt;/span&gt;&lt;span class="delimsizinginner delim-size4"&gt;&lt;span&gt;⎦&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-2.8099900000000004em;"&gt;&lt;span class="pstrut" style="height:3.1550000000000002em;"&gt;&lt;/span&gt;&lt;span class="delimsizinginner delim-size4"&gt;&lt;span&gt;⎥&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-4.05101em;"&gt;&lt;span class="pstrut" style="height:3.1550000000000002em;"&gt;&lt;/span&gt;&lt;span class="delimsizinginner delim-size4"&gt;&lt;span&gt;⎤&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:1.55002em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:3.6010299999999997em;vertical-align:-1.55002em;"&gt;&lt;/span&gt;&lt;span class="minner"&gt;&lt;span class="mopen"&gt;&lt;span class="delimsizing mult"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:2.0510099999999998em;"&gt;&lt;span style="top:-2.2500000000000004em;"&gt;&lt;span class="pstrut" style="height:3.1550000000000002em;"&gt;&lt;/span&gt;&lt;span class="delimsizinginner delim-size4"&gt;&lt;span&gt;⎣&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-2.8099900000000004em;"&gt;&lt;span class="pstrut" style="height:3.1550000000000002em;"&gt;&lt;/span&gt;&lt;span class="delimsizinginner delim-size4"&gt;&lt;span&gt;⎢&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-4.05101em;"&gt;&lt;span class="pstrut" style="height:3.1550000000000002em;"&gt;&lt;/span&gt;&lt;span class="delimsizinginner delim-size4"&gt;&lt;span&gt;⎡&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:1.55002em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mtable"&gt;&lt;span class="col-align-c"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:2.05em;"&gt;&lt;span style="top:-4.21em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mclose"&gt;?&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-3.0099999999999993em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mclose"&gt;?&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-1.8099999999999994em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mclose"&gt;?&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:1.5500000000000007em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose"&gt;&lt;span class="delimsizing mult"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:2.0510099999999998em;"&gt;&lt;span style="top:-2.2500000000000004em;"&gt;&lt;span class="pstrut" style="height:3.1550000000000002em;"&gt;&lt;/span&gt;&lt;span class="delimsizinginner delim-size4"&gt;&lt;span&gt;⎦&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-2.8099900000000004em;"&gt;&lt;span class="pstrut" style="height:3.1550000000000002em;"&gt;&lt;/span&gt;&lt;span class="delimsizinginner delim-size4"&gt;&lt;span&gt;⎥&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-4.05101em;"&gt;&lt;span class="pstrut" style="height:3.1550000000000002em;"&gt;&lt;/span&gt;&lt;span class="delimsizinginner delim-size4"&gt;&lt;span&gt;⎤&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:1.55002em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;For the first component of the new vector, exclude the top rows of the input vectors. Then, calculate the 2d &lt;a href="matrix determinate.html"&gt;Matrix Determinate&lt;/a&gt; of the matrix created by the bottom two rows of each matrix.&lt;/p&gt;
&lt;p&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;det&lt;/mi&gt;&lt;mo&gt;⁡&lt;/mo&gt;&lt;mrow&gt;&lt;mo fence="true"&gt;(&lt;/mo&gt;&lt;mrow&gt;&lt;mo fence="true"&gt;[&lt;/mo&gt;&lt;mtable columnspacing="1em" rowspacing="0.15999999999999992em"&gt;&lt;mtr&gt;&lt;mtd&gt;&lt;mstyle displaystyle="false" scriptlevel="0"&gt;&lt;mrow&gt;&lt;/mrow&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;/mtr&gt;&lt;mtr&gt;&lt;mtd&gt;&lt;mstyle displaystyle="false" scriptlevel="0"&gt;&lt;msub&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;/msub&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;/mtr&gt;&lt;mtr&gt;&lt;mtd&gt;&lt;mstyle displaystyle="false" scriptlevel="0"&gt;&lt;msub&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mn&gt;3&lt;/mn&gt;&lt;/msub&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;/mtr&gt;&lt;/mtable&gt;&lt;mo fence="true"&gt;]&lt;/mo&gt;&lt;/mrow&gt;&lt;mo&gt;×&lt;/mo&gt;&lt;mrow&gt;&lt;mo fence="true"&gt;[&lt;/mo&gt;&lt;mtable columnspacing="1em" rowspacing="0.15999999999999992em"&gt;&lt;mtr&gt;&lt;mtd&gt;&lt;mstyle displaystyle="false" scriptlevel="0"&gt;&lt;mrow&gt;&lt;/mrow&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;/mtr&gt;&lt;mtr&gt;&lt;mtd&gt;&lt;mstyle displaystyle="false" scriptlevel="0"&gt;&lt;msub&gt;&lt;mi&gt;b&lt;/mi&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;/msub&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;/mtr&gt;&lt;mtr&gt;&lt;mtd&gt;&lt;mstyle displaystyle="false" scriptlevel="0"&gt;&lt;msub&gt;&lt;mi&gt;b&lt;/mi&gt;&lt;mn&gt;3&lt;/mn&gt;&lt;/msub&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;/mtr&gt;&lt;/mtable&gt;&lt;mo fence="true"&gt;]&lt;/mo&gt;&lt;/mrow&gt;&lt;mo fence="true"&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mrow&gt;&lt;mo fence="true"&gt;[&lt;/mo&gt;&lt;mtable columnspacing="1em" rowspacing="0.15999999999999992em"&gt;&lt;mtr&gt;&lt;mtd&gt;&lt;mstyle displaystyle="false" scriptlevel="0"&gt;&lt;mrow&gt;&lt;msub&gt;&lt;mi mathvariant="bold"&gt;a&lt;/mi&gt;&lt;mn mathvariant="bold"&gt;2&lt;/mn&gt;&lt;/msub&gt;&lt;msub&gt;&lt;mi mathvariant="bold"&gt;b&lt;/mi&gt;&lt;mn mathvariant="bold"&gt;3&lt;/mn&gt;&lt;/msub&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;msub&gt;&lt;mi mathvariant="bold"&gt;a&lt;/mi&gt;&lt;mn mathvariant="bold"&gt;3&lt;/mn&gt;&lt;/msub&gt;&lt;msub&gt;&lt;mi mathvariant="bold"&gt;b&lt;/mi&gt;&lt;mn mathvariant="bold"&gt;2&lt;/mn&gt;&lt;/msub&gt;&lt;/mrow&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;/mtr&gt;&lt;mtr&gt;&lt;mtd&gt;&lt;mstyle displaystyle="false" scriptlevel="0"&gt;&lt;mrow&gt;&lt;/mrow&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;/mtr&gt;&lt;/mtable&gt;&lt;mo fence="true"&gt;]&lt;/mo&gt;&lt;/mrow&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;\det\left( \begin{bmatrix} \\ a_2 \\ a_3\end{bmatrix} \times \begin{bmatrix} \\ b_2 \\ b_3\end{bmatrix} \right) = \begin{bmatrix}\mathbf{a_2b_3 - a_3b_2} \\ \\ \end{bmatrix}&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:3.6010299999999997em;vertical-align:-1.55002em;"&gt;&lt;/span&gt;&lt;span class="mop"&gt;det&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="minner"&gt;&lt;span class="mopen"&gt;&lt;span class="delimsizing mult"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:2.05002em;"&gt;&lt;span style="top:-2.2500000000000004em;"&gt;&lt;span class="pstrut" style="height:3.1550000000000002em;"&gt;&lt;/span&gt;&lt;span class="delimsizinginner delim-size4"&gt;&lt;span&gt;⎝&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-2.8100000000000005em;"&gt;&lt;span class="pstrut" style="height:3.1550000000000002em;"&gt;&lt;/span&gt;&lt;span class="delimsizinginner delim-size4"&gt;&lt;span&gt;⎜&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-4.05002em;"&gt;&lt;span class="pstrut" style="height:3.1550000000000002em;"&gt;&lt;/span&gt;&lt;span class="delimsizinginner delim-size4"&gt;&lt;span&gt;⎛&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:1.55002em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="minner"&gt;&lt;span class="mopen"&gt;&lt;span class="delimsizing mult"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:2.0510099999999998em;"&gt;&lt;span style="top:-2.2500000000000004em;"&gt;&lt;span class="pstrut" style="height:3.1550000000000002em;"&gt;&lt;/span&gt;&lt;span class="delimsizinginner delim-size4"&gt;&lt;span&gt;⎣&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-2.8099900000000004em;"&gt;&lt;span class="pstrut" style="height:3.1550000000000002em;"&gt;&lt;/span&gt;&lt;span class="delimsizinginner delim-size4"&gt;&lt;span&gt;⎢&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-4.05101em;"&gt;&lt;span class="pstrut" style="height:3.1550000000000002em;"&gt;&lt;/span&gt;&lt;span class="delimsizinginner delim-size4"&gt;&lt;span&gt;⎡&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:1.55002em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mtable"&gt;&lt;span class="col-align-c"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:2.05em;"&gt;&lt;span style="top:-4.21em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-3.0099999999999993em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;a&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.30110799999999993em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-1.8099999999999994em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;a&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.30110799999999993em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;3&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:1.5500000000000007em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose"&gt;&lt;span class="delimsizing mult"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:2.0510099999999998em;"&gt;&lt;span style="top:-2.2500000000000004em;"&gt;&lt;span class="pstrut" style="height:3.1550000000000002em;"&gt;&lt;/span&gt;&lt;span class="delimsizinginner delim-size4"&gt;&lt;span&gt;⎦&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-2.8099900000000004em;"&gt;&lt;span class="pstrut" style="height:3.1550000000000002em;"&gt;&lt;/span&gt;&lt;span class="delimsizinginner delim-size4"&gt;&lt;span&gt;⎥&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-4.05101em;"&gt;&lt;span class="pstrut" style="height:3.1550000000000002em;"&gt;&lt;/span&gt;&lt;span class="delimsizinginner delim-size4"&gt;&lt;span&gt;⎤&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:1.55002em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;×&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;span class="minner"&gt;&lt;span class="mopen"&gt;&lt;span class="delimsizing mult"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:2.0510099999999998em;"&gt;&lt;span style="top:-2.2500000000000004em;"&gt;&lt;span class="pstrut" style="height:3.1550000000000002em;"&gt;&lt;/span&gt;&lt;span class="delimsizinginner delim-size4"&gt;&lt;span&gt;⎣&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-2.8099900000000004em;"&gt;&lt;span class="pstrut" style="height:3.1550000000000002em;"&gt;&lt;/span&gt;&lt;span class="delimsizinginner delim-size4"&gt;&lt;span&gt;⎢&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-4.05101em;"&gt;&lt;span class="pstrut" style="height:3.1550000000000002em;"&gt;&lt;/span&gt;&lt;span class="delimsizinginner delim-size4"&gt;&lt;span&gt;⎡&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:1.55002em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mtable"&gt;&lt;span class="col-align-c"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:2.05em;"&gt;&lt;span style="top:-4.21em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-3.0099999999999993em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;b&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.30110799999999993em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-1.8099999999999994em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;b&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.30110799999999993em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;3&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:1.5500000000000007em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose"&gt;&lt;span class="delimsizing mult"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:2.0510099999999998em;"&gt;&lt;span style="top:-2.2500000000000004em;"&gt;&lt;span class="pstrut" style="height:3.1550000000000002em;"&gt;&lt;/span&gt;&lt;span class="delimsizinginner delim-size4"&gt;&lt;span&gt;⎦&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-2.8099900000000004em;"&gt;&lt;span class="pstrut" style="height:3.1550000000000002em;"&gt;&lt;/span&gt;&lt;span class="delimsizinginner delim-size4"&gt;&lt;span&gt;⎥&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-4.05101em;"&gt;&lt;span class="pstrut" style="height:3.1550000000000002em;"&gt;&lt;/span&gt;&lt;span class="delimsizinginner delim-size4"&gt;&lt;span&gt;⎤&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:1.55002em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose"&gt;&lt;span class="delimsizing mult"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:2.05002em;"&gt;&lt;span style="top:-2.2500000000000004em;"&gt;&lt;span class="pstrut" style="height:3.1550000000000002em;"&gt;&lt;/span&gt;&lt;span class="delimsizinginner delim-size4"&gt;&lt;span&gt;⎠&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-2.8100000000000005em;"&gt;&lt;span class="pstrut" style="height:3.1550000000000002em;"&gt;&lt;/span&gt;&lt;span class="delimsizinginner delim-size4"&gt;&lt;span&gt;⎟&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-4.05002em;"&gt;&lt;span class="pstrut" style="height:3.1550000000000002em;"&gt;&lt;/span&gt;&lt;span class="delimsizinginner delim-size4"&gt;&lt;span&gt;⎞&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:1.55002em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:2.40003em;vertical-align:-0.95003em;"&gt;&lt;/span&gt;&lt;span class="minner"&gt;&lt;span class="mopen delimcenter" style="top:0em;"&gt;&lt;span class="delimsizing size3"&gt;[&lt;/span&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mtable"&gt;&lt;span class="col-align-c"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:1.45em;"&gt;&lt;span style="top:-3.61em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;&lt;span class="mord mathbf"&gt;a&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.30110799999999993em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mathbf mtight"&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathbf"&gt;b&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.30110799999999993em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mathbf mtight"&gt;3&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;−&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathbf"&gt;a&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.30110799999999993em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mathbf mtight"&gt;3&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathbf"&gt;b&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.30110799999999993em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mathbf mtight"&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-2.4099999999999997em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.9500000000000004em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose delimcenter" style="top:0em;"&gt;&lt;span class="delimsizing size3"&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;For the 2nd component of the new vector, exclude the middle row of the input vectors. Then, we calculate the determinate; however, this time, you flip the order of the operations from &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mi&gt;d&lt;/mi&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;mi&gt;b&lt;/mi&gt;&lt;mi&gt;c&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;ad - bc&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.77777em;vertical-align:-0.08333em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;a&lt;/span&gt;&lt;span class="mord mathdefault"&gt;d&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;−&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.69444em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;b&lt;/span&gt;&lt;span class="mord mathdefault"&gt;c&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; to &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;b&lt;/mi&gt;&lt;mi&gt;c&lt;/mi&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mi&gt;d&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;bc - ad&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.77777em;vertical-align:-0.08333em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;b&lt;/span&gt;&lt;span class="mord mathdefault"&gt;c&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;−&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.69444em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;a&lt;/span&gt;&lt;span class="mord mathdefault"&gt;d&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;.&lt;/p&gt;
&lt;p&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mrow&gt;&lt;mo fence="true"&gt;(&lt;/mo&gt;&lt;mrow&gt;&lt;mo fence="true"&gt;[&lt;/mo&gt;&lt;mtable columnspacing="1em" rowspacing="0.15999999999999992em"&gt;&lt;mtr&gt;&lt;mtd&gt;&lt;mstyle displaystyle="false" scriptlevel="0"&gt;&lt;msub&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/msub&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;/mtr&gt;&lt;mtr&gt;&lt;mtd&gt;&lt;mstyle displaystyle="false" scriptlevel="0"&gt;&lt;mrow&gt;&lt;/mrow&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;/mtr&gt;&lt;mtr&gt;&lt;mtd&gt;&lt;mstyle displaystyle="false" scriptlevel="0"&gt;&lt;msub&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mn&gt;3&lt;/mn&gt;&lt;/msub&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;/mtr&gt;&lt;/mtable&gt;&lt;mo fence="true"&gt;]&lt;/mo&gt;&lt;/mrow&gt;&lt;mo&gt;×&lt;/mo&gt;&lt;mrow&gt;&lt;mo fence="true"&gt;[&lt;/mo&gt;&lt;mtable columnspacing="1em" rowspacing="0.15999999999999992em"&gt;&lt;mtr&gt;&lt;mtd&gt;&lt;mstyle displaystyle="false" scriptlevel="0"&gt;&lt;msub&gt;&lt;mi&gt;b&lt;/mi&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/msub&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;/mtr&gt;&lt;mtr&gt;&lt;mtd&gt;&lt;mstyle displaystyle="false" scriptlevel="0"&gt;&lt;mrow&gt;&lt;/mrow&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;/mtr&gt;&lt;mtr&gt;&lt;mtd&gt;&lt;mstyle displaystyle="false" scriptlevel="0"&gt;&lt;msub&gt;&lt;mi&gt;b&lt;/mi&gt;&lt;mn&gt;3&lt;/mn&gt;&lt;/msub&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;/mtr&gt;&lt;/mtable&gt;&lt;mo fence="true"&gt;]&lt;/mo&gt;&lt;/mrow&gt;&lt;mo fence="true"&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mrow&gt;&lt;mo fence="true"&gt;[&lt;/mo&gt;&lt;mtable columnspacing="1em" rowspacing="0.15999999999999992em"&gt;&lt;mtr&gt;&lt;mtd&gt;&lt;mstyle displaystyle="false" scriptlevel="0"&gt;&lt;mrow&gt;&lt;msub&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;/msub&gt;&lt;msub&gt;&lt;mi&gt;b&lt;/mi&gt;&lt;mn&gt;3&lt;/mn&gt;&lt;/msub&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;msub&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mn&gt;3&lt;/mn&gt;&lt;/msub&gt;&lt;msub&gt;&lt;mi&gt;b&lt;/mi&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;/msub&gt;&lt;/mrow&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;/mtr&gt;&lt;mtr&gt;&lt;mtd&gt;&lt;mstyle displaystyle="false" scriptlevel="0"&gt;&lt;mrow&gt;&lt;msub&gt;&lt;mi mathvariant="bold"&gt;a&lt;/mi&gt;&lt;mn mathvariant="bold"&gt;3&lt;/mn&gt;&lt;/msub&gt;&lt;msub&gt;&lt;mi mathvariant="bold"&gt;b&lt;/mi&gt;&lt;mn mathvariant="bold"&gt;1&lt;/mn&gt;&lt;/msub&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;msub&gt;&lt;mi mathvariant="bold"&gt;a&lt;/mi&gt;&lt;mn mathvariant="bold"&gt;1&lt;/mn&gt;&lt;/msub&gt;&lt;msub&gt;&lt;mi mathvariant="bold"&gt;b&lt;/mi&gt;&lt;mn mathvariant="bold"&gt;3&lt;/mn&gt;&lt;/msub&gt;&lt;/mrow&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;/mtr&gt;&lt;mtr&gt;&lt;mtd&gt;&lt;mstyle displaystyle="false" scriptlevel="0"&gt;&lt;mtext&gt; &lt;/mtext&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;/mtr&gt;&lt;/mtable&gt;&lt;mo fence="true"&gt;]&lt;/mo&gt;&lt;/mrow&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;\left( \begin{bmatrix} a_1 \\  \\ a_3\end{bmatrix} \times \begin{bmatrix} b_1 \\  \\ b_3\end{bmatrix} \right) = \begin{bmatrix}a_2b_3 - a_3b_2 \\ \mathbf{a_3b_1 - a_1b_3} \\ \ \end{bmatrix}&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:3.6010299999999997em;vertical-align:-1.55002em;"&gt;&lt;/span&gt;&lt;span class="minner"&gt;&lt;span class="mopen"&gt;&lt;span class="delimsizing mult"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:2.05002em;"&gt;&lt;span style="top:-2.2500000000000004em;"&gt;&lt;span class="pstrut" style="height:3.1550000000000002em;"&gt;&lt;/span&gt;&lt;span class="delimsizinginner delim-size4"&gt;&lt;span&gt;⎝&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-2.8100000000000005em;"&gt;&lt;span class="pstrut" style="height:3.1550000000000002em;"&gt;&lt;/span&gt;&lt;span class="delimsizinginner delim-size4"&gt;&lt;span&gt;⎜&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-4.05002em;"&gt;&lt;span class="pstrut" style="height:3.1550000000000002em;"&gt;&lt;/span&gt;&lt;span class="delimsizinginner delim-size4"&gt;&lt;span&gt;⎛&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:1.55002em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="minner"&gt;&lt;span class="mopen"&gt;&lt;span class="delimsizing mult"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:2.0510099999999998em;"&gt;&lt;span style="top:-2.2500000000000004em;"&gt;&lt;span class="pstrut" style="height:3.1550000000000002em;"&gt;&lt;/span&gt;&lt;span class="delimsizinginner delim-size4"&gt;&lt;span&gt;⎣&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-2.8099900000000004em;"&gt;&lt;span class="pstrut" style="height:3.1550000000000002em;"&gt;&lt;/span&gt;&lt;span class="delimsizinginner delim-size4"&gt;&lt;span&gt;⎢&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-4.05101em;"&gt;&lt;span class="pstrut" style="height:3.1550000000000002em;"&gt;&lt;/span&gt;&lt;span class="delimsizinginner delim-size4"&gt;&lt;span&gt;⎡&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:1.55002em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mtable"&gt;&lt;span class="col-align-c"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:2.05em;"&gt;&lt;span style="top:-4.21em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;a&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.30110799999999993em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-3.0099999999999993em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-1.8099999999999994em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;a&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.30110799999999993em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;3&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:1.5500000000000007em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose"&gt;&lt;span class="delimsizing mult"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:2.0510099999999998em;"&gt;&lt;span style="top:-2.2500000000000004em;"&gt;&lt;span class="pstrut" style="height:3.1550000000000002em;"&gt;&lt;/span&gt;&lt;span class="delimsizinginner delim-size4"&gt;&lt;span&gt;⎦&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-2.8099900000000004em;"&gt;&lt;span class="pstrut" style="height:3.1550000000000002em;"&gt;&lt;/span&gt;&lt;span class="delimsizinginner delim-size4"&gt;&lt;span&gt;⎥&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-4.05101em;"&gt;&lt;span class="pstrut" style="height:3.1550000000000002em;"&gt;&lt;/span&gt;&lt;span class="delimsizinginner delim-size4"&gt;&lt;span&gt;⎤&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:1.55002em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;×&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;span class="minner"&gt;&lt;span class="mopen"&gt;&lt;span class="delimsizing mult"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:2.0510099999999998em;"&gt;&lt;span style="top:-2.2500000000000004em;"&gt;&lt;span class="pstrut" style="height:3.1550000000000002em;"&gt;&lt;/span&gt;&lt;span class="delimsizinginner delim-size4"&gt;&lt;span&gt;⎣&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-2.8099900000000004em;"&gt;&lt;span class="pstrut" style="height:3.1550000000000002em;"&gt;&lt;/span&gt;&lt;span class="delimsizinginner delim-size4"&gt;&lt;span&gt;⎢&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-4.05101em;"&gt;&lt;span class="pstrut" style="height:3.1550000000000002em;"&gt;&lt;/span&gt;&lt;span class="delimsizinginner delim-size4"&gt;&lt;span&gt;⎡&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:1.55002em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mtable"&gt;&lt;span class="col-align-c"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:2.05em;"&gt;&lt;span style="top:-4.21em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;b&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.30110799999999993em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-3.0099999999999993em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-1.8099999999999994em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;b&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.30110799999999993em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;3&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:1.5500000000000007em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose"&gt;&lt;span class="delimsizing mult"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:2.0510099999999998em;"&gt;&lt;span style="top:-2.2500000000000004em;"&gt;&lt;span class="pstrut" style="height:3.1550000000000002em;"&gt;&lt;/span&gt;&lt;span class="delimsizinginner delim-size4"&gt;&lt;span&gt;⎦&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-2.8099900000000004em;"&gt;&lt;span class="pstrut" style="height:3.1550000000000002em;"&gt;&lt;/span&gt;&lt;span class="delimsizinginner delim-size4"&gt;&lt;span&gt;⎥&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-4.05101em;"&gt;&lt;span class="pstrut" style="height:3.1550000000000002em;"&gt;&lt;/span&gt;&lt;span class="delimsizinginner delim-size4"&gt;&lt;span&gt;⎤&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:1.55002em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose"&gt;&lt;span class="delimsizing mult"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:2.05002em;"&gt;&lt;span style="top:-2.2500000000000004em;"&gt;&lt;span class="pstrut" style="height:3.1550000000000002em;"&gt;&lt;/span&gt;&lt;span class="delimsizinginner delim-size4"&gt;&lt;span&gt;⎠&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-2.8100000000000005em;"&gt;&lt;span class="pstrut" style="height:3.1550000000000002em;"&gt;&lt;/span&gt;&lt;span class="delimsizinginner delim-size4"&gt;&lt;span&gt;⎟&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-4.05002em;"&gt;&lt;span class="pstrut" style="height:3.1550000000000002em;"&gt;&lt;/span&gt;&lt;span class="delimsizinginner delim-size4"&gt;&lt;span&gt;⎞&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:1.55002em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:3.6010299999999997em;vertical-align:-1.55002em;"&gt;&lt;/span&gt;&lt;span class="minner"&gt;&lt;span class="mopen"&gt;&lt;span class="delimsizing mult"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:2.0510099999999998em;"&gt;&lt;span style="top:-2.2500000000000004em;"&gt;&lt;span class="pstrut" style="height:3.1550000000000002em;"&gt;&lt;/span&gt;&lt;span class="delimsizinginner delim-size4"&gt;&lt;span&gt;⎣&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-2.8099900000000004em;"&gt;&lt;span class="pstrut" style="height:3.1550000000000002em;"&gt;&lt;/span&gt;&lt;span class="delimsizinginner delim-size4"&gt;&lt;span&gt;⎢&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-4.05101em;"&gt;&lt;span class="pstrut" style="height:3.1550000000000002em;"&gt;&lt;/span&gt;&lt;span class="delimsizinginner delim-size4"&gt;&lt;span&gt;⎡&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:1.55002em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mtable"&gt;&lt;span class="col-align-c"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:2.05em;"&gt;&lt;span style="top:-4.21em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;a&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.30110799999999993em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;b&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.30110799999999993em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;3&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;−&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;a&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.30110799999999993em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;3&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;b&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.30110799999999993em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-3.0099999999999993em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;&lt;span class="mord mathbf"&gt;a&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.30110799999999993em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mathbf mtight"&gt;3&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathbf"&gt;b&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.30110799999999993em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mathbf mtight"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;−&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathbf"&gt;a&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.30110799999999993em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mathbf mtight"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathbf"&gt;b&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.30110799999999993em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mathbf mtight"&gt;3&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-1.8099999999999994em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mspace"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:1.5500000000000007em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose"&gt;&lt;span class="delimsizing mult"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:2.0510099999999998em;"&gt;&lt;span style="top:-2.2500000000000004em;"&gt;&lt;span class="pstrut" style="height:3.1550000000000002em;"&gt;&lt;/span&gt;&lt;span class="delimsizinginner delim-size4"&gt;&lt;span&gt;⎦&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-2.8099900000000004em;"&gt;&lt;span class="pstrut" style="height:3.1550000000000002em;"&gt;&lt;/span&gt;&lt;span class="delimsizinginner delim-size4"&gt;&lt;span&gt;⎥&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-4.05101em;"&gt;&lt;span class="pstrut" style="height:3.1550000000000002em;"&gt;&lt;/span&gt;&lt;span class="delimsizinginner delim-size4"&gt;&lt;span&gt;⎤&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:1.55002em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Perform a 2d determinate operation, excluding the input vector's last rows for the final component.&lt;/p&gt;
&lt;p&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;det&lt;/mi&gt;&lt;mo&gt;⁡&lt;/mo&gt;&lt;mrow&gt;&lt;mo fence="true"&gt;(&lt;/mo&gt;&lt;mrow&gt;&lt;mo fence="true"&gt;[&lt;/mo&gt;&lt;mtable columnspacing="1em" rowspacing="0.15999999999999992em"&gt;&lt;mtr&gt;&lt;mtd&gt;&lt;mstyle displaystyle="false" scriptlevel="0"&gt;&lt;msub&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/msub&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;/mtr&gt;&lt;mtr&gt;&lt;mtd&gt;&lt;mstyle displaystyle="false" scriptlevel="0"&gt;&lt;msub&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;/msub&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;/mtr&gt;&lt;mtr&gt;&lt;mtd&gt;&lt;mstyle displaystyle="false" scriptlevel="0"&gt;&lt;mtext&gt; &lt;/mtext&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;/mtr&gt;&lt;/mtable&gt;&lt;mo fence="true"&gt;]&lt;/mo&gt;&lt;/mrow&gt;&lt;mo&gt;×&lt;/mo&gt;&lt;mrow&gt;&lt;mo fence="true"&gt;[&lt;/mo&gt;&lt;mtable columnspacing="1em" rowspacing="0.15999999999999992em"&gt;&lt;mtr&gt;&lt;mtd&gt;&lt;mstyle displaystyle="false" scriptlevel="0"&gt;&lt;msub&gt;&lt;mi&gt;b&lt;/mi&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/msub&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;/mtr&gt;&lt;mtr&gt;&lt;mtd&gt;&lt;mstyle displaystyle="false" scriptlevel="0"&gt;&lt;msub&gt;&lt;mi&gt;b&lt;/mi&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;/msub&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;/mtr&gt;&lt;mtr&gt;&lt;mtd&gt;&lt;mstyle displaystyle="false" scriptlevel="0"&gt;&lt;mtext&gt; &lt;/mtext&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;/mtr&gt;&lt;/mtable&gt;&lt;mo fence="true"&gt;]&lt;/mo&gt;&lt;/mrow&gt;&lt;mo fence="true"&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mrow&gt;&lt;mo fence="true"&gt;[&lt;/mo&gt;&lt;mtable columnspacing="1em" rowspacing="0.15999999999999992em"&gt;&lt;mtr&gt;&lt;mtd&gt;&lt;mstyle displaystyle="false" scriptlevel="0"&gt;&lt;mrow&gt;&lt;msub&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;/msub&gt;&lt;msub&gt;&lt;mi&gt;b&lt;/mi&gt;&lt;mn&gt;3&lt;/mn&gt;&lt;/msub&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;msub&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mn&gt;3&lt;/mn&gt;&lt;/msub&gt;&lt;msub&gt;&lt;mi&gt;b&lt;/mi&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;/msub&gt;&lt;/mrow&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;/mtr&gt;&lt;mtr&gt;&lt;mtd&gt;&lt;mstyle displaystyle="false" scriptlevel="0"&gt;&lt;mrow&gt;&lt;msub&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mn&gt;3&lt;/mn&gt;&lt;/msub&gt;&lt;msub&gt;&lt;mi&gt;b&lt;/mi&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/msub&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;msub&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/msub&gt;&lt;msub&gt;&lt;mi&gt;b&lt;/mi&gt;&lt;mn&gt;3&lt;/mn&gt;&lt;/msub&gt;&lt;/mrow&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;/mtr&gt;&lt;mtr&gt;&lt;mtd&gt;&lt;mstyle displaystyle="false" scriptlevel="0"&gt;&lt;mrow&gt;&lt;msub&gt;&lt;mi mathvariant="bold"&gt;a&lt;/mi&gt;&lt;mn mathvariant="bold"&gt;1&lt;/mn&gt;&lt;/msub&gt;&lt;msub&gt;&lt;mi mathvariant="bold"&gt;b&lt;/mi&gt;&lt;mn mathvariant="bold"&gt;2&lt;/mn&gt;&lt;/msub&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;msub&gt;&lt;mi mathvariant="bold"&gt;a&lt;/mi&gt;&lt;mn mathvariant="bold"&gt;2&lt;/mn&gt;&lt;/msub&gt;&lt;msub&gt;&lt;mi mathvariant="bold"&gt;b&lt;/mi&gt;&lt;mn mathvariant="bold"&gt;1&lt;/mn&gt;&lt;/msub&gt;&lt;/mrow&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;/mtr&gt;&lt;/mtable&gt;&lt;mo fence="true"&gt;]&lt;/mo&gt;&lt;/mrow&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;\det\left( \begin{bmatrix} a_1 \\ a_2 \\ \ \end{bmatrix} \times \begin{bmatrix} b_1 \\ b_2 \\ \ \end{bmatrix} \right) = \begin{bmatrix}a_2b_3 - a_3b_2 \\ a_3b_1 - a_1b_3 \\ \mathbf{a_1b_2 - a_2b_1} \end{bmatrix}&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:3.6010299999999997em;vertical-align:-1.55002em;"&gt;&lt;/span&gt;&lt;span class="mop"&gt;det&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="minner"&gt;&lt;span class="mopen"&gt;&lt;span class="delimsizing mult"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:2.05002em;"&gt;&lt;span style="top:-2.2500000000000004em;"&gt;&lt;span class="pstrut" style="height:3.1550000000000002em;"&gt;&lt;/span&gt;&lt;span class="delimsizinginner delim-size4"&gt;&lt;span&gt;⎝&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-2.8100000000000005em;"&gt;&lt;span class="pstrut" style="height:3.1550000000000002em;"&gt;&lt;/span&gt;&lt;span class="delimsizinginner delim-size4"&gt;&lt;span&gt;⎜&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-4.05002em;"&gt;&lt;span class="pstrut" style="height:3.1550000000000002em;"&gt;&lt;/span&gt;&lt;span class="delimsizinginner delim-size4"&gt;&lt;span&gt;⎛&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:1.55002em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="minner"&gt;&lt;span class="mopen"&gt;&lt;span class="delimsizing mult"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:2.0510099999999998em;"&gt;&lt;span style="top:-2.2500000000000004em;"&gt;&lt;span class="pstrut" style="height:3.1550000000000002em;"&gt;&lt;/span&gt;&lt;span class="delimsizinginner delim-size4"&gt;&lt;span&gt;⎣&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-2.8099900000000004em;"&gt;&lt;span class="pstrut" style="height:3.1550000000000002em;"&gt;&lt;/span&gt;&lt;span class="delimsizinginner delim-size4"&gt;&lt;span&gt;⎢&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-4.05101em;"&gt;&lt;span class="pstrut" style="height:3.1550000000000002em;"&gt;&lt;/span&gt;&lt;span class="delimsizinginner delim-size4"&gt;&lt;span&gt;⎡&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:1.55002em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mtable"&gt;&lt;span class="col-align-c"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:2.05em;"&gt;&lt;span style="top:-4.21em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;a&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.30110799999999993em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-3.0099999999999993em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;a&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.30110799999999993em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-1.8099999999999994em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mspace"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:1.5500000000000007em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose"&gt;&lt;span class="delimsizing mult"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:2.0510099999999998em;"&gt;&lt;span style="top:-2.2500000000000004em;"&gt;&lt;span class="pstrut" style="height:3.1550000000000002em;"&gt;&lt;/span&gt;&lt;span class="delimsizinginner delim-size4"&gt;&lt;span&gt;⎦&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-2.8099900000000004em;"&gt;&lt;span class="pstrut" style="height:3.1550000000000002em;"&gt;&lt;/span&gt;&lt;span class="delimsizinginner delim-size4"&gt;&lt;span&gt;⎥&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-4.05101em;"&gt;&lt;span class="pstrut" style="height:3.1550000000000002em;"&gt;&lt;/span&gt;&lt;span class="delimsizinginner delim-size4"&gt;&lt;span&gt;⎤&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:1.55002em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;×&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;span class="minner"&gt;&lt;span class="mopen"&gt;&lt;span class="delimsizing mult"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:2.0510099999999998em;"&gt;&lt;span style="top:-2.2500000000000004em;"&gt;&lt;span class="pstrut" style="height:3.1550000000000002em;"&gt;&lt;/span&gt;&lt;span class="delimsizinginner delim-size4"&gt;&lt;span&gt;⎣&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-2.8099900000000004em;"&gt;&lt;span class="pstrut" style="height:3.1550000000000002em;"&gt;&lt;/span&gt;&lt;span class="delimsizinginner delim-size4"&gt;&lt;span&gt;⎢&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-4.05101em;"&gt;&lt;span class="pstrut" style="height:3.1550000000000002em;"&gt;&lt;/span&gt;&lt;span class="delimsizinginner delim-size4"&gt;&lt;span&gt;⎡&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:1.55002em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mtable"&gt;&lt;span class="col-align-c"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:2.05em;"&gt;&lt;span style="top:-4.21em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;b&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.30110799999999993em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-3.0099999999999993em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;b&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.30110799999999993em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-1.8099999999999994em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mspace"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:1.5500000000000007em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose"&gt;&lt;span class="delimsizing mult"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:2.0510099999999998em;"&gt;&lt;span style="top:-2.2500000000000004em;"&gt;&lt;span class="pstrut" style="height:3.1550000000000002em;"&gt;&lt;/span&gt;&lt;span class="delimsizinginner delim-size4"&gt;&lt;span&gt;⎦&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-2.8099900000000004em;"&gt;&lt;span class="pstrut" style="height:3.1550000000000002em;"&gt;&lt;/span&gt;&lt;span class="delimsizinginner delim-size4"&gt;&lt;span&gt;⎥&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-4.05101em;"&gt;&lt;span class="pstrut" style="height:3.1550000000000002em;"&gt;&lt;/span&gt;&lt;span class="delimsizinginner delim-size4"&gt;&lt;span&gt;⎤&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:1.55002em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose"&gt;&lt;span class="delimsizing mult"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:2.05002em;"&gt;&lt;span style="top:-2.2500000000000004em;"&gt;&lt;span class="pstrut" style="height:3.1550000000000002em;"&gt;&lt;/span&gt;&lt;span class="delimsizinginner delim-size4"&gt;&lt;span&gt;⎠&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-2.8100000000000005em;"&gt;&lt;span class="pstrut" style="height:3.1550000000000002em;"&gt;&lt;/span&gt;&lt;span class="delimsizinginner delim-size4"&gt;&lt;span&gt;⎟&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-4.05002em;"&gt;&lt;span class="pstrut" style="height:3.1550000000000002em;"&gt;&lt;/span&gt;&lt;span class="delimsizinginner delim-size4"&gt;&lt;span&gt;⎞&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:1.55002em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:3.6010299999999997em;vertical-align:-1.55002em;"&gt;&lt;/span&gt;&lt;span class="minner"&gt;&lt;span class="mopen"&gt;&lt;span class="delimsizing mult"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:2.0510099999999998em;"&gt;&lt;span style="top:-2.2500000000000004em;"&gt;&lt;span class="pstrut" style="height:3.1550000000000002em;"&gt;&lt;/span&gt;&lt;span class="delimsizinginner delim-size4"&gt;&lt;span&gt;⎣&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-2.8099900000000004em;"&gt;&lt;span class="pstrut" style="height:3.1550000000000002em;"&gt;&lt;/span&gt;&lt;span class="delimsizinginner delim-size4"&gt;&lt;span&gt;⎢&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-4.05101em;"&gt;&lt;span class="pstrut" style="height:3.1550000000000002em;"&gt;&lt;/span&gt;&lt;span class="delimsizinginner delim-size4"&gt;&lt;span&gt;⎡&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:1.55002em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mtable"&gt;&lt;span class="col-align-c"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:2.05em;"&gt;&lt;span style="top:-4.21em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;a&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.30110799999999993em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;b&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.30110799999999993em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;3&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;−&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;a&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.30110799999999993em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;3&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;b&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.30110799999999993em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-3.0099999999999993em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;a&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.30110799999999993em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;3&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;b&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.30110799999999993em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;−&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;a&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.30110799999999993em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;b&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.30110799999999993em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;3&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-1.8099999999999994em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;&lt;span class="mord mathbf"&gt;a&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.30110799999999993em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mathbf mtight"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathbf"&gt;b&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.30110799999999993em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mathbf mtight"&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;−&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathbf"&gt;a&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.30110799999999993em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mathbf mtight"&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathbf"&gt;b&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.30110799999999993em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mathbf mtight"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:1.5500000000000007em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose"&gt;&lt;span class="delimsizing mult"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:2.0510099999999998em;"&gt;&lt;span style="top:-2.2500000000000004em;"&gt;&lt;span class="pstrut" style="height:3.1550000000000002em;"&gt;&lt;/span&gt;&lt;span class="delimsizinginner delim-size4"&gt;&lt;span&gt;⎦&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-2.8099900000000004em;"&gt;&lt;span class="pstrut" style="height:3.1550000000000002em;"&gt;&lt;/span&gt;&lt;span class="delimsizinginner delim-size4"&gt;&lt;span&gt;⎥&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-4.05101em;"&gt;&lt;span class="pstrut" style="height:3.1550000000000002em;"&gt;&lt;/span&gt;&lt;span class="delimsizinginner delim-size4"&gt;&lt;span&gt;⎤&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:1.55002em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;For each pair of vectors, there will be two vectors that are perpendicular to both. To find out which direction the Cross Product's vector faces, use the right-hand rule. For &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mover accent="true"&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mo&gt;⃗&lt;/mo&gt;&lt;/mover&gt;&lt;mo&gt;×&lt;/mo&gt;&lt;mover accent="true"&gt;&lt;mi&gt;b&lt;/mi&gt;&lt;mo&gt;⃗&lt;/mo&gt;&lt;/mover&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;\vec{a} \times \vec{b}&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.79733em;vertical-align:-0.08333em;"&gt;&lt;/span&gt;&lt;span class="mord accent"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.714em;"&gt;&lt;span style="top:-3em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;a&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-3em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="accent-body" style="left:-0.2355em;"&gt;&lt;span class="overlay" style="height:0.714em;width:0.471em;"&gt;&lt;svg height="0.714em" preserveAspectRatio="xMinYMin" style="width:0.471em" viewBox="0 0 471 714" width="0.471em"&gt;&lt;path d="M377 20c0-5.333 1.833-10 5.5-14S391 0 397 0c4.667 0 8.667 1.667 12 5 3.333 2.667 6.667 9 10 19 6.667 24.667 20.333 43.667 41 57 7.333 4.667 11 10.667 11 18 0 6-1 10-3 12s-6.667 5-14 9c-28.667 14.667-53.667 35.667-75 63 -1.333 1.333-3.167 3.5-5.5 6.5s-4 4.833-5 5.5c-1 .667-2.5 1.333-4.5 2s-4.333 1 -7 1c-4.667 0-9.167-1.833-13.5-5.5S337 184 337 178c0-12.667 15.667-32.333 47-59 H213l-171-1c-8.667-6-13-12.333-13-19 0-4.667 4.333-11.333 13-20h359 c-16-25.333-24-45-24-59z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;×&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.9774399999999999em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord accent"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.9774399999999999em;"&gt;&lt;span style="top:-3em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;b&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-3.26344em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="accent-body" style="left:-0.2355em;"&gt;&lt;span class="overlay" style="height:0.714em;width:0.471em;"&gt;&lt;svg height="0.714em" preserveAspectRatio="xMinYMin" style="width:0.471em" viewBox="0 0 471 714" width="0.471em"&gt;&lt;path d="M377 20c0-5.333 1.833-10 5.5-14S391 0 397 0c4.667 0 8.667 1.667 12 5 3.333 2.667 6.667 9 10 19 6.667 24.667 20.333 43.667 41 57 7.333 4.667 11 10.667 11 18 0 6-1 10-3 12s-6.667 5-14 9c-28.667 14.667-53.667 35.667-75 63 -1.333 1.333-3.167 3.5-5.5 6.5s-4 4.833-5 5.5c-1 .667-2.5 1.333-4.5 2s-4.333 1 -7 1c-4.667 0-9.167-1.833-13.5-5.5S337 184 337 178c0-12.667 15.667-32.333 47-59 H213l-171-1c-8.667-6-13-12.333-13-19 0-4.667 4.333-11.333 13-20h359 c-16-25.333-24-45-24-59z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;, adjust you right-hand so you can place your index finger in the direction of &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mover accent="true"&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mo&gt;⃗&lt;/mo&gt;&lt;/mover&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;\vec{a}&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.714em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord accent"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.714em;"&gt;&lt;span style="top:-3em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;a&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-3em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="accent-body" style="left:-0.2355em;"&gt;&lt;span class="overlay" style="height:0.714em;width:0.471em;"&gt;&lt;svg height="0.714em" preserveAspectRatio="xMinYMin" style="width:0.471em" viewBox="0 0 471 714" width="0.471em"&gt;&lt;path d="M377 20c0-5.333 1.833-10 5.5-14S391 0 397 0c4.667 0 8.667 1.667 12 5 3.333 2.667 6.667 9 10 19 6.667 24.667 20.333 43.667 41 57 7.333 4.667 11 10.667 11 18 0 6-1 10-3 12s-6.667 5-14 9c-28.667 14.667-53.667 35.667-75 63 -1.333 1.333-3.167 3.5-5.5 6.5s-4 4.833-5 5.5c-1 .667-2.5 1.333-4.5 2s-4.333 1 -7 1c-4.667 0-9.167-1.833-13.5-5.5S337 184 337 178c0-12.667 15.667-32.333 47-59 H213l-171-1c-8.667-6-13-12.333-13-19 0-4.667 4.333-11.333 13-20h359 c-16-25.333-24-45-24-59z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; and your middle finger in the direction of &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mover accent="true"&gt;&lt;mi&gt;b&lt;/mi&gt;&lt;mo&gt;⃗&lt;/mo&gt;&lt;/mover&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;\vec{b}&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.9774399999999999em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord accent"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.9774399999999999em;"&gt;&lt;span style="top:-3em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;b&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-3.26344em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="accent-body" style="left:-0.2355em;"&gt;&lt;span class="overlay" style="height:0.714em;width:0.471em;"&gt;&lt;svg height="0.714em" preserveAspectRatio="xMinYMin" style="width:0.471em" viewBox="0 0 471 714" width="0.471em"&gt;&lt;path d="M377 20c0-5.333 1.833-10 5.5-14S391 0 397 0c4.667 0 8.667 1.667 12 5 3.333 2.667 6.667 9 10 19 6.667 24.667 20.333 43.667 41 57 7.333 4.667 11 10.667 11 18 0 6-1 10-3 12s-6.667 5-14 9c-28.667 14.667-53.667 35.667-75 63 -1.333 1.333-3.167 3.5-5.5 6.5s-4 4.833-5 5.5c-1 .667-2.5 1.333-4.5 2s-4.333 1 -7 1c-4.667 0-9.167-1.833-13.5-5.5S337 184 337 178c0-12.667 15.667-32.333 47-59 H213l-171-1c-8.667-6-13-12.333-13-19 0-4.667 4.333-11.333 13-20h359 c-16-25.333-24-45-24-59z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;. Whichever direction your thumb is pointing in is the direction of the cross product.&lt;/p&gt;
&lt;p&gt;The cross product is helpful because it tells you if your vectors are parallel when the length of the vector returned by the Cross Product is 0.&lt;/p&gt;
&lt;p&gt;&lt;a href='#khanacademylabCrossProductIntroduction' id='ref-khanacademylabCrossProductIntroduction-1'&gt;KhanAcademyLabs (2009)&lt;/a&gt;
&lt;a href='#3blue1brownCrossProductChapterEssence2016' id='ref-3blue1brownCrossProductChapterEssence2016-1'&gt;3Blue1Brown (2016)&lt;/a&gt;&lt;/p&gt;&lt;section id="bib"&gt;&lt;h4&gt;References&lt;/h4&gt;&lt;p id='3blue1brownCrossProductChapterEssence2016'&gt;&lt;span class="bibtex-protected"&gt;3Blue1Brown&lt;/span&gt;.
Cross products \textbar  &lt;span class="bibtex-protected"&gt;&lt;span class="bibtex-protected"&gt;Chapter&lt;/span&gt;&lt;/span&gt; 10, &lt;span class="bibtex-protected"&gt;&lt;span class="bibtex-protected"&gt;Essence&lt;/span&gt;&lt;/span&gt; of linear algebra.
September 2016. &lt;a class="cite-backref" href="#ref-3blue1brownCrossProductChapterEssence2016-1" title="Jump back to reference 1"&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;p id='khanacademylabCrossProductIntroduction'&gt;&lt;span class="bibtex-protected"&gt;Khan Academy Labs&lt;/span&gt;.
Cross product introduction.
October 2009. &lt;a class="cite-backref" href="#ref-khanacademylabCrossProductIntroduction-1" title="Jump back to reference 1"&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/section&gt;</content><category term="permanent"/><category term="LinearAlgebra"/></entry><entry><title>Cross product introduction</title><link href="http://localhost:8000/cross-product-introduction.html" rel="alternate"/><published>2021-12-04T00:00:00+10:00</published><updated>2021-12-04T00:00:00+10:00</updated><author><name>Lex Toumbourou</name></author><id>tag:localhost,2021-12-04:/cross-product-introduction.html</id><summary type="html">&lt;p&gt;Notes from &lt;a href="https://www.youtube.com/watch?v=pJzmiywagfY"&gt;Cross product introduction&lt;/a&gt; by Khan Academy.&lt;/p&gt;</summary><content type="html">&lt;p&gt;These are notes from &lt;a href="https://www.youtube.com/watch?v=pJzmiywagfY"&gt;Cross product introduction | Vectors and spaces | Linear Algebra | Khan Academy&lt;/a&gt; by Khan Academy.&lt;/p&gt;
&lt;p&gt;The &lt;a href="cross-product.html"&gt;Cross Product&lt;/a&gt; is much more limited than &lt;a href="dot-product.html"&gt;Dot Product&lt;/a&gt;. Where the dot product is defined in any dimension ( &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;msub&gt;&lt;mi&gt;R&lt;/mi&gt;&lt;mi&gt;N&lt;/mi&gt;&lt;/msub&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;R_N&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.83333em;vertical-align:-0.15em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault" style="margin-right:0.00773em;"&gt;R&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.32833099999999993em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:-0.00773em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mathdefault mtight" style="margin-right:0.10903em;"&gt;N&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; ), the cross product is only defined in 3d ( &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;msub&gt;&lt;mi&gt;R&lt;/mi&gt;&lt;mn&gt;3&lt;/mn&gt;&lt;/msub&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;R_{3}&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.83333em;vertical-align:-0.15em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault" style="margin-right:0.00773em;"&gt;R&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.30110799999999993em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:-0.00773em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mtight"&gt;3&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; ).&lt;/p&gt;
&lt;p&gt;The dot product returns a scalar; the cross product a &lt;a href="vector.html"&gt;Vector&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Definition of the dot product:&lt;/p&gt;
&lt;p&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mover accent="true"&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mo&gt;⃗&lt;/mo&gt;&lt;/mover&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mrow&gt;&lt;mo fence="true"&gt;[&lt;/mo&gt;&lt;mtable columnspacing="1em" rowspacing="0.15999999999999992em"&gt;&lt;mtr&gt;&lt;mtd&gt;&lt;mstyle displaystyle="false" scriptlevel="0"&gt;&lt;msub&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/msub&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;/mtr&gt;&lt;mtr&gt;&lt;mtd&gt;&lt;mstyle displaystyle="false" scriptlevel="0"&gt;&lt;msub&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;/msub&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;/mtr&gt;&lt;mtr&gt;&lt;mtd&gt;&lt;mstyle displaystyle="false" scriptlevel="0"&gt;&lt;msub&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mn&gt;3&lt;/mn&gt;&lt;/msub&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;/mtr&gt;&lt;/mtable&gt;&lt;mo fence="true"&gt;]&lt;/mo&gt;&lt;/mrow&gt;&lt;mo separator="true"&gt;,&lt;/mo&gt;&lt;mover accent="true"&gt;&lt;mi&gt;b&lt;/mi&gt;&lt;mo&gt;⃗&lt;/mo&gt;&lt;/mover&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mrow&gt;&lt;mo fence="true"&gt;[&lt;/mo&gt;&lt;mtable columnspacing="1em" rowspacing="0.15999999999999992em"&gt;&lt;mtr&gt;&lt;mtd&gt;&lt;mstyle displaystyle="false" scriptlevel="0"&gt;&lt;msub&gt;&lt;mi&gt;b&lt;/mi&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/msub&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;/mtr&gt;&lt;mtr&gt;&lt;mtd&gt;&lt;mstyle displaystyle="false" scriptlevel="0"&gt;&lt;msub&gt;&lt;mi&gt;b&lt;/mi&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;/msub&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;/mtr&gt;&lt;mtr&gt;&lt;mtd&gt;&lt;mstyle displaystyle="false" scriptlevel="0"&gt;&lt;msub&gt;&lt;mi&gt;b&lt;/mi&gt;&lt;mn&gt;3&lt;/mn&gt;&lt;/msub&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;/mtr&gt;&lt;/mtable&gt;&lt;mo fence="true"&gt;]&lt;/mo&gt;&lt;/mrow&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;\vec{a} = \begin{bmatrix}a_1 \\ a_2 \\ a_3\end{bmatrix}, \vec{b} = \begin{bmatrix}b_1 \\ b_2 \\ b_3\end{bmatrix}&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.714em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord accent"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.714em;"&gt;&lt;span style="top:-3em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;a&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-3em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="accent-body" style="left:-0.2355em;"&gt;&lt;span class="overlay" style="height:0.714em;width:0.471em;"&gt;&lt;svg height="0.714em" preserveAspectRatio="xMinYMin" style="width:0.471em" viewBox="0 0 471 714" width="0.471em"&gt;&lt;path d="M377 20c0-5.333 1.833-10 5.5-14S391 0 397 0c4.667 0 8.667 1.667 12 5 3.333 2.667 6.667 9 10 19 6.667 24.667 20.333 43.667 41 57 7.333 4.667 11 10.667 11 18 0 6-1 10-3 12s-6.667 5-14 9c-28.667 14.667-53.667 35.667-75 63 -1.333 1.333-3.167 3.5-5.5 6.5s-4 4.833-5 5.5c-1 .667-2.5 1.333-4.5 2s-4.333 1 -7 1c-4.667 0-9.167-1.833-13.5-5.5S337 184 337 178c0-12.667 15.667-32.333 47-59 H213l-171-1c-8.667-6-13-12.333-13-19 0-4.667 4.333-11.333 13-20h359 c-16-25.333-24-45-24-59z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:3.6010299999999997em;vertical-align:-1.55002em;"&gt;&lt;/span&gt;&lt;span class="minner"&gt;&lt;span class="mopen"&gt;&lt;span class="delimsizing mult"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:2.0510099999999998em;"&gt;&lt;span style="top:-2.2500000000000004em;"&gt;&lt;span class="pstrut" style="height:3.1550000000000002em;"&gt;&lt;/span&gt;&lt;span class="delimsizinginner delim-size4"&gt;&lt;span&gt;⎣&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-2.8099900000000004em;"&gt;&lt;span class="pstrut" style="height:3.1550000000000002em;"&gt;&lt;/span&gt;&lt;span class="delimsizinginner delim-size4"&gt;&lt;span&gt;⎢&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-4.05101em;"&gt;&lt;span class="pstrut" style="height:3.1550000000000002em;"&gt;&lt;/span&gt;&lt;span class="delimsizinginner delim-size4"&gt;&lt;span&gt;⎡&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:1.55002em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mtable"&gt;&lt;span class="col-align-c"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:2.05em;"&gt;&lt;span style="top:-4.21em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;a&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.30110799999999993em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-3.0099999999999993em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;a&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.30110799999999993em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-1.8099999999999994em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;a&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.30110799999999993em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;3&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:1.5500000000000007em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose"&gt;&lt;span class="delimsizing mult"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:2.0510099999999998em;"&gt;&lt;span style="top:-2.2500000000000004em;"&gt;&lt;span class="pstrut" style="height:3.1550000000000002em;"&gt;&lt;/span&gt;&lt;span class="delimsizinginner delim-size4"&gt;&lt;span&gt;⎦&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-2.8099900000000004em;"&gt;&lt;span class="pstrut" style="height:3.1550000000000002em;"&gt;&lt;/span&gt;&lt;span class="delimsizinginner delim-size4"&gt;&lt;span&gt;⎥&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-4.05101em;"&gt;&lt;span class="pstrut" style="height:3.1550000000000002em;"&gt;&lt;/span&gt;&lt;span class="delimsizinginner delim-size4"&gt;&lt;span&gt;⎤&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:1.55002em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mpunct"&gt;,&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mord accent"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.9774399999999999em;"&gt;&lt;span style="top:-3em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;b&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-3.26344em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="accent-body" style="left:-0.2355em;"&gt;&lt;span class="overlay" style="height:0.714em;width:0.471em;"&gt;&lt;svg height="0.714em" preserveAspectRatio="xMinYMin" style="width:0.471em" viewBox="0 0 471 714" width="0.471em"&gt;&lt;path d="M377 20c0-5.333 1.833-10 5.5-14S391 0 397 0c4.667 0 8.667 1.667 12 5 3.333 2.667 6.667 9 10 19 6.667 24.667 20.333 43.667 41 57 7.333 4.667 11 10.667 11 18 0 6-1 10-3 12s-6.667 5-14 9c-28.667 14.667-53.667 35.667-75 63 -1.333 1.333-3.167 3.5-5.5 6.5s-4 4.833-5 5.5c-1 .667-2.5 1.333-4.5 2s-4.333 1 -7 1c-4.667 0-9.167-1.833-13.5-5.5S337 184 337 178c0-12.667 15.667-32.333 47-59 H213l-171-1c-8.667-6-13-12.333-13-19 0-4.667 4.333-11.333 13-20h359 c-16-25.333-24-45-24-59z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:3.6010299999999997em;vertical-align:-1.55002em;"&gt;&lt;/span&gt;&lt;span class="minner"&gt;&lt;span class="mopen"&gt;&lt;span class="delimsizing mult"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:2.0510099999999998em;"&gt;&lt;span style="top:-2.2500000000000004em;"&gt;&lt;span class="pstrut" style="height:3.1550000000000002em;"&gt;&lt;/span&gt;&lt;span class="delimsizinginner delim-size4"&gt;&lt;span&gt;⎣&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-2.8099900000000004em;"&gt;&lt;span class="pstrut" style="height:3.1550000000000002em;"&gt;&lt;/span&gt;&lt;span class="delimsizinginner delim-size4"&gt;&lt;span&gt;⎢&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-4.05101em;"&gt;&lt;span class="pstrut" style="height:3.1550000000000002em;"&gt;&lt;/span&gt;&lt;span class="delimsizinginner delim-size4"&gt;&lt;span&gt;⎡&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:1.55002em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mtable"&gt;&lt;span class="col-align-c"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:2.05em;"&gt;&lt;span style="top:-4.21em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;b&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.30110799999999993em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-3.0099999999999993em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;b&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.30110799999999993em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-1.8099999999999994em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;b&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.30110799999999993em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;3&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:1.5500000000000007em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose"&gt;&lt;span class="delimsizing mult"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:2.0510099999999998em;"&gt;&lt;span style="top:-2.2500000000000004em;"&gt;&lt;span class="pstrut" style="height:3.1550000000000002em;"&gt;&lt;/span&gt;&lt;span class="delimsizinginner delim-size4"&gt;&lt;span&gt;⎦&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-2.8099900000000004em;"&gt;&lt;span class="pstrut" style="height:3.1550000000000002em;"&gt;&lt;/span&gt;&lt;span class="delimsizinginner delim-size4"&gt;&lt;span&gt;⎥&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-4.05101em;"&gt;&lt;span class="pstrut" style="height:3.1550000000000002em;"&gt;&lt;/span&gt;&lt;span class="delimsizinginner delim-size4"&gt;&lt;span&gt;⎤&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:1.55002em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mover accent="true"&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mo&gt;⃗&lt;/mo&gt;&lt;/mover&gt;&lt;mo&gt;×&lt;/mo&gt;&lt;mover accent="true"&gt;&lt;mi&gt;b&lt;/mi&gt;&lt;mo&gt;⃗&lt;/mo&gt;&lt;/mover&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mrow&gt;&lt;mo fence="true"&gt;[&lt;/mo&gt;&lt;mtable columnspacing="1em" rowspacing="0.15999999999999992em"&gt;&lt;mtr&gt;&lt;mtd&gt;&lt;mstyle displaystyle="false" scriptlevel="0"&gt;&lt;mrow&gt;&lt;msub&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;/msub&gt;&lt;mo&gt;⋅&lt;/mo&gt;&lt;msub&gt;&lt;mi&gt;b&lt;/mi&gt;&lt;mn&gt;3&lt;/mn&gt;&lt;/msub&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;msub&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mn&gt;3&lt;/mn&gt;&lt;/msub&gt;&lt;mo&gt;⋅&lt;/mo&gt;&lt;msub&gt;&lt;mi&gt;b&lt;/mi&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;/msub&gt;&lt;/mrow&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;/mtr&gt;&lt;mtr&gt;&lt;mtd&gt;&lt;mstyle displaystyle="false" scriptlevel="0"&gt;&lt;mrow&gt;&lt;msub&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mn&gt;3&lt;/mn&gt;&lt;/msub&gt;&lt;mo&gt;⋅&lt;/mo&gt;&lt;msub&gt;&lt;mi&gt;b&lt;/mi&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/msub&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;msub&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/msub&gt;&lt;mo&gt;⋅&lt;/mo&gt;&lt;msub&gt;&lt;mi&gt;b&lt;/mi&gt;&lt;mn&gt;3&lt;/mn&gt;&lt;/msub&gt;&lt;/mrow&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;/mtr&gt;&lt;mtr&gt;&lt;mtd&gt;&lt;mstyle displaystyle="false" scriptlevel="0"&gt;&lt;mrow&gt;&lt;msub&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/msub&gt;&lt;mo&gt;⋅&lt;/mo&gt;&lt;msub&gt;&lt;mi&gt;b&lt;/mi&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;/msub&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;msub&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;/msub&gt;&lt;mo&gt;⋅&lt;/mo&gt;&lt;msub&gt;&lt;mi&gt;b&lt;/mi&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/msub&gt;&lt;/mrow&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;/mtr&gt;&lt;/mtable&gt;&lt;mo fence="true"&gt;]&lt;/mo&gt;&lt;/mrow&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;\vec{a} \times \vec{b} = \begin{bmatrix} a_2 \cdot b_3 -  a_3 \cdot b_2 \\ a_3 \cdot b_1 - a_1 \cdot  b_3 \\ a_1 \cdot b_2 - a_2 \cdot b_1 \end{bmatrix}&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.79733em;vertical-align:-0.08333em;"&gt;&lt;/span&gt;&lt;span class="mord accent"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.714em;"&gt;&lt;span style="top:-3em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;a&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-3em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="accent-body" style="left:-0.2355em;"&gt;&lt;span class="overlay" style="height:0.714em;width:0.471em;"&gt;&lt;svg height="0.714em" preserveAspectRatio="xMinYMin" style="width:0.471em" viewBox="0 0 471 714" width="0.471em"&gt;&lt;path d="M377 20c0-5.333 1.833-10 5.5-14S391 0 397 0c4.667 0 8.667 1.667 12 5 3.333 2.667 6.667 9 10 19 6.667 24.667 20.333 43.667 41 57 7.333 4.667 11 10.667 11 18 0 6-1 10-3 12s-6.667 5-14 9c-28.667 14.667-53.667 35.667-75 63 -1.333 1.333-3.167 3.5-5.5 6.5s-4 4.833-5 5.5c-1 .667-2.5 1.333-4.5 2s-4.333 1 -7 1c-4.667 0-9.167-1.833-13.5-5.5S337 184 337 178c0-12.667 15.667-32.333 47-59 H213l-171-1c-8.667-6-13-12.333-13-19 0-4.667 4.333-11.333 13-20h359 c-16-25.333-24-45-24-59z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;×&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.9774399999999999em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord accent"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.9774399999999999em;"&gt;&lt;span style="top:-3em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;b&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-3.26344em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="accent-body" style="left:-0.2355em;"&gt;&lt;span class="overlay" style="height:0.714em;width:0.471em;"&gt;&lt;svg height="0.714em" preserveAspectRatio="xMinYMin" style="width:0.471em" viewBox="0 0 471 714" width="0.471em"&gt;&lt;path d="M377 20c0-5.333 1.833-10 5.5-14S391 0 397 0c4.667 0 8.667 1.667 12 5 3.333 2.667 6.667 9 10 19 6.667 24.667 20.333 43.667 41 57 7.333 4.667 11 10.667 11 18 0 6-1 10-3 12s-6.667 5-14 9c-28.667 14.667-53.667 35.667-75 63 -1.333 1.333-3.167 3.5-5.5 6.5s-4 4.833-5 5.5c-1 .667-2.5 1.333-4.5 2s-4.333 1 -7 1c-4.667 0-9.167-1.833-13.5-5.5S337 184 337 178c0-12.667 15.667-32.333 47-59 H213l-171-1c-8.667-6-13-12.333-13-19 0-4.667 4.333-11.333 13-20h359 c-16-25.333-24-45-24-59z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:3.6010299999999997em;vertical-align:-1.55002em;"&gt;&lt;/span&gt;&lt;span class="minner"&gt;&lt;span class="mopen"&gt;&lt;span class="delimsizing mult"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:2.0510099999999998em;"&gt;&lt;span style="top:-2.2500000000000004em;"&gt;&lt;span class="pstrut" style="height:3.1550000000000002em;"&gt;&lt;/span&gt;&lt;span class="delimsizinginner delim-size4"&gt;&lt;span&gt;⎣&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-2.8099900000000004em;"&gt;&lt;span class="pstrut" style="height:3.1550000000000002em;"&gt;&lt;/span&gt;&lt;span class="delimsizinginner delim-size4"&gt;&lt;span&gt;⎢&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-4.05101em;"&gt;&lt;span class="pstrut" style="height:3.1550000000000002em;"&gt;&lt;/span&gt;&lt;span class="delimsizinginner delim-size4"&gt;&lt;span&gt;⎡&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:1.55002em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mtable"&gt;&lt;span class="col-align-c"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:2.05em;"&gt;&lt;span style="top:-4.21em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;a&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.30110799999999993em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;⋅&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;b&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.30110799999999993em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;3&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;−&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;a&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.30110799999999993em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;3&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;⋅&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;b&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.30110799999999993em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-3.0099999999999993em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;a&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.30110799999999993em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;3&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;⋅&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;b&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.30110799999999993em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;−&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;a&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.30110799999999993em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;⋅&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;b&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.30110799999999993em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;3&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-1.8099999999999994em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;a&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.30110799999999993em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;⋅&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;b&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.30110799999999993em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;−&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;a&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.30110799999999993em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;⋅&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;b&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.30110799999999993em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:1.5500000000000007em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose"&gt;&lt;span class="delimsizing mult"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:2.0510099999999998em;"&gt;&lt;span style="top:-2.2500000000000004em;"&gt;&lt;span class="pstrut" style="height:3.1550000000000002em;"&gt;&lt;/span&gt;&lt;span class="delimsizinginner delim-size4"&gt;&lt;span&gt;⎦&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-2.8099900000000004em;"&gt;&lt;span class="pstrut" style="height:3.1550000000000002em;"&gt;&lt;/span&gt;&lt;span class="delimsizinginner delim-size4"&gt;&lt;span&gt;⎥&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-4.05101em;"&gt;&lt;span class="pstrut" style="height:3.1550000000000002em;"&gt;&lt;/span&gt;&lt;span class="delimsizinginner delim-size4"&gt;&lt;span&gt;⎤&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:1.55002em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;For first row in the returned vector, you ignore the top row and take &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;msub&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;/msub&gt;&lt;mo&gt;⋅&lt;/mo&gt;&lt;msub&gt;&lt;mi&gt;b&lt;/mi&gt;&lt;mn&gt;3&lt;/mn&gt;&lt;/msub&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;msub&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mn&gt;3&lt;/mn&gt;&lt;/msub&gt;&lt;mo&gt;⋅&lt;/mo&gt;&lt;msub&gt;&lt;mi&gt;b&lt;/mi&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;/msub&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;a_2 \cdot b_3 -  a_3 \cdot b_2&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.59445em;vertical-align:-0.15em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;a&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.30110799999999993em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;⋅&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.84444em;vertical-align:-0.15em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;b&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.30110799999999993em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;3&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;−&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.59445em;vertical-align:-0.15em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;a&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.30110799999999993em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;3&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;⋅&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.84444em;vertical-align:-0.15em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;b&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.30110799999999993em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;For the 2nd row in the returned vector, you ignore the middle row of the vectors and take a similar product to the first; however, this time, you are doing it the opposite way around: &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;msub&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mn&gt;3&lt;/mn&gt;&lt;/msub&gt;&lt;mo&gt;⋅&lt;/mo&gt;&lt;msub&gt;&lt;mi&gt;b&lt;/mi&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/msub&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;msub&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/msub&gt;&lt;mo&gt;⋅&lt;/mo&gt;&lt;msub&gt;&lt;mi&gt;b&lt;/mi&gt;&lt;mn&gt;3&lt;/mn&gt;&lt;/msub&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;a_3 \cdot b_1 - a_1 \cdot  b_3&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.59445em;vertical-align:-0.15em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;a&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.30110799999999993em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;3&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;⋅&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.84444em;vertical-align:-0.15em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;b&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.30110799999999993em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;−&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.59445em;vertical-align:-0.15em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;a&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.30110799999999993em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;⋅&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.84444em;vertical-align:-0.15em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;b&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.30110799999999993em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;3&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;For the 3rd row, you ignore the last row of input and make the same operation as the first row of the top 2 rows of input: &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;msub&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/msub&gt;&lt;mo&gt;⋅&lt;/mo&gt;&lt;msub&gt;&lt;mi&gt;b&lt;/mi&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;/msub&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;msub&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;/msub&gt;&lt;mo&gt;⋅&lt;/mo&gt;&lt;msub&gt;&lt;mi&gt;b&lt;/mi&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/msub&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;a_1 \cdot b_2 - a_2 \cdot b_1&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.59445em;vertical-align:-0.15em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;a&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.30110799999999993em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;⋅&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.84444em;vertical-align:-0.15em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;b&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.30110799999999993em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;−&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.59445em;vertical-align:-0.15em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;a&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.30110799999999993em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;⋅&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.84444em;vertical-align:-0.15em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;b&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.30110799999999993em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The vector that's returned is orthogonal to both &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mover accent="true"&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mo&gt;⃗&lt;/mo&gt;&lt;/mover&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;\vec{a}&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.714em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord accent"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.714em;"&gt;&lt;span style="top:-3em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;a&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-3em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="accent-body" style="left:-0.2355em;"&gt;&lt;span class="overlay" style="height:0.714em;width:0.471em;"&gt;&lt;svg height="0.714em" preserveAspectRatio="xMinYMin" style="width:0.471em" viewBox="0 0 471 714" width="0.471em"&gt;&lt;path d="M377 20c0-5.333 1.833-10 5.5-14S391 0 397 0c4.667 0 8.667 1.667 12 5 3.333 2.667 6.667 9 10 19 6.667 24.667 20.333 43.667 41 57 7.333 4.667 11 10.667 11 18 0 6-1 10-3 12s-6.667 5-14 9c-28.667 14.667-53.667 35.667-75 63 -1.333 1.333-3.167 3.5-5.5 6.5s-4 4.833-5 5.5c-1 .667-2.5 1.333-4.5 2s-4.333 1 -7 1c-4.667 0-9.167-1.833-13.5-5.5S337 184 337 178c0-12.667 15.667-32.333 47-59 H213l-171-1c-8.667-6-13-12.333-13-19 0-4.667 4.333-11.333 13-20h359 c-16-25.333-24-45-24-59z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; and &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mover accent="true"&gt;&lt;mi&gt;b&lt;/mi&gt;&lt;mo&gt;⃗&lt;/mo&gt;&lt;/mover&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;\vec{b}&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.9774399999999999em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord accent"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.9774399999999999em;"&gt;&lt;span style="top:-3em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;b&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-3.26344em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="accent-body" style="left:-0.2355em;"&gt;&lt;span class="overlay" style="height:0.714em;width:0.471em;"&gt;&lt;svg height="0.714em" preserveAspectRatio="xMinYMin" style="width:0.471em" viewBox="0 0 471 714" width="0.471em"&gt;&lt;path d="M377 20c0-5.333 1.833-10 5.5-14S391 0 397 0c4.667 0 8.667 1.667 12 5 3.333 2.667 6.667 9 10 19 6.667 24.667 20.333 43.667 41 57 7.333 4.667 11 10.667 11 18 0 6-1 10-3 12s-6.667 5-14 9c-28.667 14.667-53.667 35.667-75 63 -1.333 1.333-3.167 3.5-5.5 6.5s-4 4.833-5 5.5c-1 .667-2.5 1.333-4.5 2s-4.333 1 -7 1c-4.667 0-9.167-1.833-13.5-5.5S337 184 337 178c0-12.667 15.667-32.333 47-59 H213l-171-1c-8.667-6-13-12.333-13-19 0-4.667 4.333-11.333 13-20h359 c-16-25.333-24-45-24-59z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Orthogonal vector example" src="../../_media/khan-orthogonal-example.png"&gt;&lt;/p&gt;
&lt;p&gt;Note that two vectors are orthogonal to those vectors. To find which direction it points in, you use the right-hand rule: take your right hand and put your index finger in the direction of &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mover accent="true"&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mo&gt;⃗&lt;/mo&gt;&lt;/mover&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;\vec{a}&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.714em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord accent"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.714em;"&gt;&lt;span style="top:-3em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;a&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-3em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="accent-body" style="left:-0.2355em;"&gt;&lt;span class="overlay" style="height:0.714em;width:0.471em;"&gt;&lt;svg height="0.714em" preserveAspectRatio="xMinYMin" style="width:0.471em" viewBox="0 0 471 714" width="0.471em"&gt;&lt;path d="M377 20c0-5.333 1.833-10 5.5-14S391 0 397 0c4.667 0 8.667 1.667 12 5 3.333 2.667 6.667 9 10 19 6.667 24.667 20.333 43.667 41 57 7.333 4.667 11 10.667 11 18 0 6-1 10-3 12s-6.667 5-14 9c-28.667 14.667-53.667 35.667-75 63 -1.333 1.333-3.167 3.5-5.5 6.5s-4 4.833-5 5.5c-1 .667-2.5 1.333-4.5 2s-4.333 1 -7 1c-4.667 0-9.167-1.833-13.5-5.5S337 184 337 178c0-12.667 15.667-32.333 47-59 H213l-171-1c-8.667-6-13-12.333-13-19 0-4.667 4.333-11.333 13-20h359 c-16-25.333-24-45-24-59z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; and your middle finger in the direction of &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mover accent="true"&gt;&lt;mi&gt;b&lt;/mi&gt;&lt;mo&gt;⃗&lt;/mo&gt;&lt;/mover&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;\vec{b}&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.9774399999999999em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord accent"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.9774399999999999em;"&gt;&lt;span style="top:-3em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;b&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-3.26344em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="accent-body" style="left:-0.2355em;"&gt;&lt;span class="overlay" style="height:0.714em;width:0.471em;"&gt;&lt;svg height="0.714em" preserveAspectRatio="xMinYMin" style="width:0.471em" viewBox="0 0 471 714" width="0.471em"&gt;&lt;path d="M377 20c0-5.333 1.833-10 5.5-14S391 0 397 0c4.667 0 8.667 1.667 12 5 3.333 2.667 6.667 9 10 19 6.667 24.667 20.333 43.667 41 57 7.333 4.667 11 10.667 11 18 0 6-1 10-3 12s-6.667 5-14 9c-28.667 14.667-53.667 35.667-75 63 -1.333 1.333-3.167 3.5-5.5 6.5s-4 4.833-5 5.5c-1 .667-2.5 1.333-4.5 2s-4.333 1 -7 1c-4.667 0-9.167-1.833-13.5-5.5S337 184 337 178c0-12.667 15.667-32.333 47-59 H213l-171-1c-8.667-6-13-12.333-13-19 0-4.667 4.333-11.333 13-20h359 c-16-25.333-24-45-24-59z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;, where your thumb is pointing in the direction of the returned vector.&lt;/p&gt;
&lt;p&gt;What does orthogonal mean in this context? It means if &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mover accent="true"&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mo&gt;⃗&lt;/mo&gt;&lt;/mover&gt;&lt;mo&gt;⋅&lt;/mo&gt;&lt;mover accent="true"&gt;&lt;mi&gt;b&lt;/mi&gt;&lt;mo&gt;⃗&lt;/mo&gt;&lt;/mover&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mn&gt;0&lt;/mn&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;\vec{a} \cdot \vec{b} = 0&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.714em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord accent"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.714em;"&gt;&lt;span style="top:-3em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;a&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-3em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="accent-body" style="left:-0.2355em;"&gt;&lt;span class="overlay" style="height:0.714em;width:0.471em;"&gt;&lt;svg height="0.714em" preserveAspectRatio="xMinYMin" style="width:0.471em" viewBox="0 0 471 714" width="0.471em"&gt;&lt;path d="M377 20c0-5.333 1.833-10 5.5-14S391 0 397 0c4.667 0 8.667 1.667 12 5 3.333 2.667 6.667 9 10 19 6.667 24.667 20.333 43.667 41 57 7.333 4.667 11 10.667 11 18 0 6-1 10-3 12s-6.667 5-14 9c-28.667 14.667-53.667 35.667-75 63 -1.333 1.333-3.167 3.5-5.5 6.5s-4 4.833-5 5.5c-1 .667-2.5 1.333-4.5 2s-4.333 1 -7 1c-4.667 0-9.167-1.833-13.5-5.5S337 184 337 178c0-12.667 15.667-32.333 47-59 H213l-171-1c-8.667-6-13-12.333-13-19 0-4.667 4.333-11.333 13-20h359 c-16-25.333-24-45-24-59z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;⋅&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.9774399999999999em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord accent"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.9774399999999999em;"&gt;&lt;span style="top:-3em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;b&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-3.26344em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="accent-body" style="left:-0.2355em;"&gt;&lt;span class="overlay" style="height:0.714em;width:0.471em;"&gt;&lt;svg height="0.714em" preserveAspectRatio="xMinYMin" style="width:0.471em" viewBox="0 0 471 714" width="0.471em"&gt;&lt;path d="M377 20c0-5.333 1.833-10 5.5-14S391 0 397 0c4.667 0 8.667 1.667 12 5 3.333 2.667 6.667 9 10 19 6.667 24.667 20.333 43.667 41 57 7.333 4.667 11 10.667 11 18 0 6-1 10-3 12s-6.667 5-14 9c-28.667 14.667-53.667 35.667-75 63 -1.333 1.333-3.167 3.5-5.5 6.5s-4 4.833-5 5.5c-1 .667-2.5 1.333-4.5 2s-4.333 1 -7 1c-4.667 0-9.167-1.833-13.5-5.5S337 184 337 178c0-12.667 15.667-32.333 47-59 H213l-171-1c-8.667-6-13-12.333-13-19 0-4.667 4.333-11.333 13-20h359 c-16-25.333-24-45-24-59z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.64444em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;0&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;, the difference between orthogonal vectors and perpendicular vectors is orthogonal could also apply to 0 vectors.&lt;/p&gt;
&lt;p&gt;You can prove it works by taking the dot product with one of the input vectors and the output vector:&lt;/p&gt;
&lt;p&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mrow&gt;&lt;mo fence="true"&gt;[&lt;/mo&gt;&lt;mtable columnspacing="1em" rowspacing="0.15999999999999992em"&gt;&lt;mtr&gt;&lt;mtd&gt;&lt;mstyle displaystyle="false" scriptlevel="0"&gt;&lt;mrow&gt;&lt;msub&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;/msub&gt;&lt;mo&gt;⋅&lt;/mo&gt;&lt;msub&gt;&lt;mi&gt;b&lt;/mi&gt;&lt;mn&gt;3&lt;/mn&gt;&lt;/msub&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;msub&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mn&gt;3&lt;/mn&gt;&lt;/msub&gt;&lt;mo&gt;⋅&lt;/mo&gt;&lt;msub&gt;&lt;mi&gt;b&lt;/mi&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;/msub&gt;&lt;/mrow&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;/mtr&gt;&lt;mtr&gt;&lt;mtd&gt;&lt;mstyle displaystyle="false" scriptlevel="0"&gt;&lt;mrow&gt;&lt;msub&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mn&gt;3&lt;/mn&gt;&lt;/msub&gt;&lt;mo&gt;⋅&lt;/mo&gt;&lt;msub&gt;&lt;mi&gt;b&lt;/mi&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/msub&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;msub&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/msub&gt;&lt;mo&gt;⋅&lt;/mo&gt;&lt;msub&gt;&lt;mi&gt;b&lt;/mi&gt;&lt;mn&gt;3&lt;/mn&gt;&lt;/msub&gt;&lt;/mrow&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;/mtr&gt;&lt;mtr&gt;&lt;mtd&gt;&lt;mstyle displaystyle="false" scriptlevel="0"&gt;&lt;mrow&gt;&lt;msub&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/msub&gt;&lt;mo&gt;⋅&lt;/mo&gt;&lt;msub&gt;&lt;mi&gt;b&lt;/mi&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;/msub&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;msub&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;/msub&gt;&lt;mo&gt;⋅&lt;/mo&gt;&lt;msub&gt;&lt;mi&gt;b&lt;/mi&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/msub&gt;&lt;/mrow&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;/mtr&gt;&lt;/mtable&gt;&lt;mo fence="true"&gt;]&lt;/mo&gt;&lt;/mrow&gt;&lt;mo&gt;⋅&lt;/mo&gt;&lt;mrow&gt;&lt;mo fence="true"&gt;[&lt;/mo&gt;&lt;mtable columnspacing="1em" rowspacing="0.15999999999999992em"&gt;&lt;mtr&gt;&lt;mtd&gt;&lt;mstyle displaystyle="false" scriptlevel="0"&gt;&lt;msub&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/msub&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;/mtr&gt;&lt;mtr&gt;&lt;mtd&gt;&lt;mstyle displaystyle="false" scriptlevel="0"&gt;&lt;msub&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;/msub&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;/mtr&gt;&lt;mtr&gt;&lt;mtd&gt;&lt;mstyle displaystyle="false" scriptlevel="0"&gt;&lt;msub&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mn&gt;3&lt;/mn&gt;&lt;/msub&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;/mtr&gt;&lt;/mtable&gt;&lt;mo fence="true"&gt;]&lt;/mo&gt;&lt;/mrow&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;\begin{bmatrix} a_2 \cdot b_3 -  a_3 \cdot b_2 \\ a_3 \cdot b_1 - a_1 \cdot  b_3 \\ a_1 \cdot b_2 - a_2 \cdot b_1 \end{bmatrix} \cdot \begin{bmatrix}a_1 \\ a_2 \\ a_3\end{bmatrix}&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:3.6010299999999997em;vertical-align:-1.55002em;"&gt;&lt;/span&gt;&lt;span class="minner"&gt;&lt;span class="mopen"&gt;&lt;span class="delimsizing mult"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:2.0510099999999998em;"&gt;&lt;span style="top:-2.2500000000000004em;"&gt;&lt;span class="pstrut" style="height:3.1550000000000002em;"&gt;&lt;/span&gt;&lt;span class="delimsizinginner delim-size4"&gt;&lt;span&gt;⎣&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-2.8099900000000004em;"&gt;&lt;span class="pstrut" style="height:3.1550000000000002em;"&gt;&lt;/span&gt;&lt;span class="delimsizinginner delim-size4"&gt;&lt;span&gt;⎢&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-4.05101em;"&gt;&lt;span class="pstrut" style="height:3.1550000000000002em;"&gt;&lt;/span&gt;&lt;span class="delimsizinginner delim-size4"&gt;&lt;span&gt;⎡&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:1.55002em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mtable"&gt;&lt;span class="col-align-c"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:2.05em;"&gt;&lt;span style="top:-4.21em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;a&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.30110799999999993em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;⋅&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;b&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.30110799999999993em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;3&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;−&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;a&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.30110799999999993em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;3&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;⋅&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;b&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.30110799999999993em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-3.0099999999999993em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;a&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.30110799999999993em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;3&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;⋅&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;b&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.30110799999999993em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;−&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;a&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.30110799999999993em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;⋅&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;b&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.30110799999999993em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;3&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-1.8099999999999994em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;a&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.30110799999999993em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;⋅&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;b&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.30110799999999993em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;−&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;a&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.30110799999999993em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;⋅&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;b&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.30110799999999993em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:1.5500000000000007em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose"&gt;&lt;span class="delimsizing mult"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:2.0510099999999998em;"&gt;&lt;span style="top:-2.2500000000000004em;"&gt;&lt;span class="pstrut" style="height:3.1550000000000002em;"&gt;&lt;/span&gt;&lt;span class="delimsizinginner delim-size4"&gt;&lt;span&gt;⎦&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-2.8099900000000004em;"&gt;&lt;span class="pstrut" style="height:3.1550000000000002em;"&gt;&lt;/span&gt;&lt;span class="delimsizinginner delim-size4"&gt;&lt;span&gt;⎥&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-4.05101em;"&gt;&lt;span class="pstrut" style="height:3.1550000000000002em;"&gt;&lt;/span&gt;&lt;span class="delimsizinginner delim-size4"&gt;&lt;span&gt;⎤&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:1.55002em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;⋅&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:3.6010299999999997em;vertical-align:-1.55002em;"&gt;&lt;/span&gt;&lt;span class="minner"&gt;&lt;span class="mopen"&gt;&lt;span class="delimsizing mult"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:2.0510099999999998em;"&gt;&lt;span style="top:-2.2500000000000004em;"&gt;&lt;span class="pstrut" style="height:3.1550000000000002em;"&gt;&lt;/span&gt;&lt;span class="delimsizinginner delim-size4"&gt;&lt;span&gt;⎣&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-2.8099900000000004em;"&gt;&lt;span class="pstrut" style="height:3.1550000000000002em;"&gt;&lt;/span&gt;&lt;span class="delimsizinginner delim-size4"&gt;&lt;span&gt;⎢&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-4.05101em;"&gt;&lt;span class="pstrut" style="height:3.1550000000000002em;"&gt;&lt;/span&gt;&lt;span class="delimsizinginner delim-size4"&gt;&lt;span&gt;⎡&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:1.55002em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mtable"&gt;&lt;span class="col-align-c"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:2.05em;"&gt;&lt;span style="top:-4.21em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;a&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.30110799999999993em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-3.0099999999999993em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;a&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.30110799999999993em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-1.8099999999999994em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;a&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.30110799999999993em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;3&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:1.5500000000000007em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose"&gt;&lt;span class="delimsizing mult"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:2.0510099999999998em;"&gt;&lt;span style="top:-2.2500000000000004em;"&gt;&lt;span class="pstrut" style="height:3.1550000000000002em;"&gt;&lt;/span&gt;&lt;span class="delimsizinginner delim-size4"&gt;&lt;span&gt;⎦&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-2.8099900000000004em;"&gt;&lt;span class="pstrut" style="height:3.1550000000000002em;"&gt;&lt;/span&gt;&lt;span class="delimsizinginner delim-size4"&gt;&lt;span&gt;⎥&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-4.05101em;"&gt;&lt;span class="pstrut" style="height:3.1550000000000002em;"&gt;&lt;/span&gt;&lt;span class="delimsizinginner delim-size4"&gt;&lt;span&gt;⎤&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:1.55002em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;msub&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/msub&gt;&lt;msub&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;/msub&gt;&lt;msub&gt;&lt;mi&gt;b&lt;/mi&gt;&lt;mn&gt;3&lt;/mn&gt;&lt;/msub&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;msub&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/msub&gt;&lt;msub&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mn&gt;3&lt;/mn&gt;&lt;/msub&gt;&lt;msub&gt;&lt;mi&gt;b&lt;/mi&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;/msub&gt;&lt;mo&gt;+&lt;/mo&gt;&lt;msub&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;/msub&gt;&lt;msub&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mn&gt;3&lt;/mn&gt;&lt;/msub&gt;&lt;msub&gt;&lt;mi&gt;b&lt;/mi&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/msub&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;msub&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;/msub&gt;&lt;msub&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/msub&gt;&lt;msub&gt;&lt;mi&gt;b&lt;/mi&gt;&lt;mn&gt;3&lt;/mn&gt;&lt;/msub&gt;&lt;mo&gt;+&lt;/mo&gt;&lt;msub&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mn&gt;3&lt;/mn&gt;&lt;/msub&gt;&lt;msub&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/msub&gt;&lt;msub&gt;&lt;mi&gt;b&lt;/mi&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;/msub&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;msub&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mn&gt;3&lt;/mn&gt;&lt;/msub&gt;&lt;msub&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;/msub&gt;&lt;msub&gt;&lt;mi&gt;b&lt;/mi&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/msub&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;= a_1 a_2 b_3 - a_1 a_3 b_2 + a_2 a_3 b_1 - a_2 a_1 b_3 + a_3 a_1 b_2 - a_3 a_2 b_1&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.36687em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.84444em;vertical-align:-0.15em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;a&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.30110799999999993em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;a&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.30110799999999993em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;b&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.30110799999999993em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;3&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;−&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.84444em;vertical-align:-0.15em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;a&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.30110799999999993em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;a&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.30110799999999993em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;3&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;b&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.30110799999999993em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;+&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.84444em;vertical-align:-0.15em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;a&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.30110799999999993em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;a&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.30110799999999993em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;3&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;b&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.30110799999999993em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;−&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.84444em;vertical-align:-0.15em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;a&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.30110799999999993em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;a&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.30110799999999993em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;b&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.30110799999999993em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;3&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;+&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.84444em;vertical-align:-0.15em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;a&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.30110799999999993em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;3&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;a&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.30110799999999993em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;b&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.30110799999999993em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;−&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.84444em;vertical-align:-0.15em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;a&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.30110799999999993em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;3&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;a&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.30110799999999993em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;b&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.30110799999999993em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mrow&gt;&lt;msub&gt;&lt;mi mathvariant="bold"&gt;a&lt;/mi&gt;&lt;mn mathvariant="bold"&gt;1&lt;/mn&gt;&lt;/msub&gt;&lt;msub&gt;&lt;mi mathvariant="bold"&gt;a&lt;/mi&gt;&lt;mn mathvariant="bold"&gt;2&lt;/mn&gt;&lt;/msub&gt;&lt;msub&gt;&lt;mi mathvariant="bold"&gt;b&lt;/mi&gt;&lt;mn mathvariant="bold"&gt;3&lt;/mn&gt;&lt;/msub&gt;&lt;/mrow&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;msub&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/msub&gt;&lt;msub&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mn&gt;3&lt;/mn&gt;&lt;/msub&gt;&lt;msub&gt;&lt;mi&gt;b&lt;/mi&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;/msub&gt;&lt;mo&gt;+&lt;/mo&gt;&lt;msub&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;/msub&gt;&lt;msub&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mn&gt;3&lt;/mn&gt;&lt;/msub&gt;&lt;msub&gt;&lt;mi&gt;b&lt;/mi&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/msub&gt;&lt;mrow&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;msub&gt;&lt;mi mathvariant="bold"&gt;a&lt;/mi&gt;&lt;mn mathvariant="bold"&gt;2&lt;/mn&gt;&lt;/msub&gt;&lt;msub&gt;&lt;mi mathvariant="bold"&gt;a&lt;/mi&gt;&lt;mn mathvariant="bold"&gt;1&lt;/mn&gt;&lt;/msub&gt;&lt;msub&gt;&lt;mi mathvariant="bold"&gt;b&lt;/mi&gt;&lt;mn mathvariant="bold"&gt;3&lt;/mn&gt;&lt;/msub&gt;&lt;/mrow&gt;&lt;mo&gt;+&lt;/mo&gt;&lt;msub&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mn&gt;3&lt;/mn&gt;&lt;/msub&gt;&lt;msub&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/msub&gt;&lt;msub&gt;&lt;mi&gt;b&lt;/mi&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;/msub&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;msub&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mn&gt;3&lt;/mn&gt;&lt;/msub&gt;&lt;msub&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;/msub&gt;&lt;msub&gt;&lt;mi&gt;b&lt;/mi&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/msub&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;= \mathbf{a_1 a_2 b_3} - a_1 a_3 b_2 + a_2 a_3 b_1 \mathbf{- a_2 a_1 b_3} + a_3 a_1 b_2 - a_3 a_2 b_1&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.36687em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.84444em;vertical-align:-0.15em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;&lt;span class="mord mathbf"&gt;a&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.30110799999999993em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mathbf mtight"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathbf"&gt;a&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.30110799999999993em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mathbf mtight"&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathbf"&gt;b&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.30110799999999993em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mathbf mtight"&gt;3&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;−&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.84444em;vertical-align:-0.15em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;a&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.30110799999999993em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;a&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.30110799999999993em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;3&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;b&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.30110799999999993em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;+&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.84444em;vertical-align:-0.15em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;a&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.30110799999999993em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;a&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.30110799999999993em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;3&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;b&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.30110799999999993em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;−&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathbf"&gt;a&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.30110799999999993em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mathbf mtight"&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathbf"&gt;a&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.30110799999999993em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mathbf mtight"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathbf"&gt;b&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.30110799999999993em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mathbf mtight"&gt;3&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;+&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.84444em;vertical-align:-0.15em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;a&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.30110799999999993em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;3&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;a&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.30110799999999993em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;b&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.30110799999999993em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;−&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.84444em;vertical-align:-0.15em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;a&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.30110799999999993em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;3&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;a&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.30110799999999993em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;b&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.30110799999999993em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mrow&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;msub&gt;&lt;mi mathvariant="bold"&gt;a&lt;/mi&gt;&lt;mn mathvariant="bold"&gt;1&lt;/mn&gt;&lt;/msub&gt;&lt;msub&gt;&lt;mi mathvariant="bold"&gt;a&lt;/mi&gt;&lt;mn mathvariant="bold"&gt;3&lt;/mn&gt;&lt;/msub&gt;&lt;msub&gt;&lt;mi mathvariant="bold"&gt;b&lt;/mi&gt;&lt;mn mathvariant="bold"&gt;2&lt;/mn&gt;&lt;/msub&gt;&lt;/mrow&gt;&lt;mo&gt;+&lt;/mo&gt;&lt;msub&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;/msub&gt;&lt;msub&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mn&gt;3&lt;/mn&gt;&lt;/msub&gt;&lt;msub&gt;&lt;mi&gt;b&lt;/mi&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/msub&gt;&lt;mo&gt;+&lt;/mo&gt;&lt;mrow&gt;&lt;msub&gt;&lt;mi mathvariant="bold"&gt;a&lt;/mi&gt;&lt;mn mathvariant="bold"&gt;3&lt;/mn&gt;&lt;/msub&gt;&lt;msub&gt;&lt;mi mathvariant="bold"&gt;a&lt;/mi&gt;&lt;mn mathvariant="bold"&gt;1&lt;/mn&gt;&lt;/msub&gt;&lt;msub&gt;&lt;mi mathvariant="bold"&gt;b&lt;/mi&gt;&lt;mn mathvariant="bold"&gt;2&lt;/mn&gt;&lt;/msub&gt;&lt;/mrow&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;msub&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mn&gt;3&lt;/mn&gt;&lt;/msub&gt;&lt;msub&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;/msub&gt;&lt;msub&gt;&lt;mi&gt;b&lt;/mi&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/msub&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;= \mathbf{-a_1 a_3 b_2} + a_2 a_3 b_1 + \mathbf{a_3 a_1 b_2} - a_3 a_2 b_1&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.36687em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.84444em;vertical-align:-0.15em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;−&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathbf"&gt;a&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.30110799999999993em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mathbf mtight"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathbf"&gt;a&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.30110799999999993em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mathbf mtight"&gt;3&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathbf"&gt;b&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.30110799999999993em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mathbf mtight"&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;+&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.84444em;vertical-align:-0.15em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;a&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.30110799999999993em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;a&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.30110799999999993em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;3&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;b&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.30110799999999993em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;+&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.84444em;vertical-align:-0.15em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;&lt;span class="mord mathbf"&gt;a&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.30110799999999993em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mathbf mtight"&gt;3&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathbf"&gt;a&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.30110799999999993em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mathbf mtight"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathbf"&gt;b&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.30110799999999993em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mathbf mtight"&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;−&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.84444em;vertical-align:-0.15em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;a&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.30110799999999993em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;3&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;a&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.30110799999999993em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;b&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.30110799999999993em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mrow&gt;&lt;msub&gt;&lt;mi mathvariant="bold"&gt;a&lt;/mi&gt;&lt;mn mathvariant="bold"&gt;2&lt;/mn&gt;&lt;/msub&gt;&lt;msub&gt;&lt;mi mathvariant="bold"&gt;a&lt;/mi&gt;&lt;mn mathvariant="bold"&gt;3&lt;/mn&gt;&lt;/msub&gt;&lt;msub&gt;&lt;mi mathvariant="bold"&gt;b&lt;/mi&gt;&lt;mn mathvariant="bold"&gt;1&lt;/mn&gt;&lt;/msub&gt;&lt;/mrow&gt;&lt;mrow&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;msub&gt;&lt;mi mathvariant="bold"&gt;a&lt;/mi&gt;&lt;mn mathvariant="bold"&gt;3&lt;/mn&gt;&lt;/msub&gt;&lt;msub&gt;&lt;mi mathvariant="bold"&gt;a&lt;/mi&gt;&lt;mn mathvariant="bold"&gt;2&lt;/mn&gt;&lt;/msub&gt;&lt;msub&gt;&lt;mi mathvariant="bold"&gt;b&lt;/mi&gt;&lt;mn mathvariant="bold"&gt;1&lt;/mn&gt;&lt;/msub&gt;&lt;/mrow&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;= \mathbf{a_2 a_3 b_1} \mathbf{- a_3 a_2 b_1}&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.36687em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.84444em;vertical-align:-0.15em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;&lt;span class="mord mathbf"&gt;a&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.30110799999999993em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mathbf mtight"&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathbf"&gt;a&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.30110799999999993em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mathbf mtight"&gt;3&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathbf"&gt;b&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.30110799999999993em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mathbf mtight"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;−&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathbf"&gt;a&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.30110799999999993em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mathbf mtight"&gt;3&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathbf"&gt;a&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.30110799999999993em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mathbf mtight"&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathbf"&gt;b&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.30110799999999993em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mathbf mtight"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mn&gt;0&lt;/mn&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;= 0&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.36687em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.64444em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;0&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h1 id="mathslinearalgebracrossproduct"&gt;Maths/LinearAlgebra/CrossProduct&lt;/h1&gt;</content><category term="reference"/></entry><entry><title>Matrix Determinate</title><link href="http://localhost:8000/matrix-determinate.html" rel="alternate"/><published>2021-11-06T00:00:00+10:00</published><updated>2021-11-06T00:00:00+10:00</updated><author><name>Lex Toumbourou</name></author><id>tag:localhost,2021-11-06:/matrix-determinate.html</id><summary type="html">&lt;p&gt;A measure of how a matrix scales space.&lt;/p&gt;</summary><content type="html">&lt;p&gt;The determinate of a &lt;a href="matrix-transformation.html"&gt;Matrix Transformation&lt;/a&gt; refers to how much it scales space.&lt;/p&gt;
&lt;p&gt;If we think of the standard &lt;a href="basis-vectors.html"&gt;Basis Vectors&lt;/a&gt; as the sides of a square, we can think of them as having an area of &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;mo&gt;×&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;1 \times 1 = 1&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.72777em;vertical-align:-0.08333em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;1&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;×&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.64444em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;1&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.64444em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;.&lt;/p&gt;
&lt;p&gt;Then, if we transform them using matrix &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mo fence="true"&gt;[&lt;/mo&gt;&lt;mtable columnspacing="1em" rowspacing="0.15999999999999992em"&gt;&lt;mtr&gt;&lt;mtd&gt;&lt;mstyle displaystyle="false" scriptlevel="0"&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;mtd&gt;&lt;mstyle displaystyle="false" scriptlevel="0"&gt;&lt;mrow&gt;&lt;/mrow&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;mtd&gt;&lt;mstyle displaystyle="false" scriptlevel="0"&gt;&lt;mn&gt;0&lt;/mn&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;/mtr&gt;&lt;mtr&gt;&lt;mtd&gt;&lt;mstyle displaystyle="false" scriptlevel="0"&gt;&lt;mn&gt;0&lt;/mn&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;mtd&gt;&lt;mstyle displaystyle="false" scriptlevel="0"&gt;&lt;mrow&gt;&lt;/mrow&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;mtd&gt;&lt;mstyle displaystyle="false" scriptlevel="0"&gt;&lt;mn&gt;4&lt;/mn&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;/mtr&gt;&lt;/mtable&gt;&lt;mo fence="true"&gt;]&lt;/mo&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;\begin{bmatrix}2 &amp;amp;&amp;amp; 0 \\ 0 &amp;amp;&amp;amp; 4\end{bmatrix}&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:2.40003em;vertical-align:-0.95003em;"&gt;&lt;/span&gt;&lt;span class="minner"&gt;&lt;span class="mopen delimcenter" style="top:0em;"&gt;&lt;span class="delimsizing size3"&gt;[&lt;/span&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mtable"&gt;&lt;span class="col-align-c"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:1.45em;"&gt;&lt;span style="top:-3.61em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-2.4099999999999997em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;0&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.9500000000000004em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="arraycolsep" style="width:0.5em;"&gt;&lt;/span&gt;&lt;span class="arraycolsep" style="width:0.5em;"&gt;&lt;/span&gt;&lt;span class="col-align-c"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:1.45em;"&gt;&lt;span style="top:-3.4499999999999997em;"&gt;&lt;span class="pstrut" style="height:2.84em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-2.2499999999999996em;"&gt;&lt;span class="pstrut" style="height:2.84em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.9500000000000004em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="arraycolsep" style="width:0.5em;"&gt;&lt;/span&gt;&lt;span class="arraycolsep" style="width:0.5em;"&gt;&lt;/span&gt;&lt;span class="col-align-c"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:1.45em;"&gt;&lt;span style="top:-3.61em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;0&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-2.4099999999999997em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;4&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.9500000000000004em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose delimcenter" style="top:0em;"&gt;&lt;span class="delimsizing size3"&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;, the new area is &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;mo&gt;×&lt;/mo&gt;&lt;mn&gt;4&lt;/mn&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mn&gt;8&lt;/mn&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;2 \times 4 = 8&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.72777em;vertical-align:-0.08333em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;2&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;×&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.64444em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;4&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.64444em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;8&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;. So we can say that the matrix has a determinant of 8.&lt;/p&gt;
&lt;p&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;det&lt;/mi&gt;&lt;mo&gt;⁡&lt;/mo&gt;&lt;mo stretchy="false"&gt;(&lt;/mo&gt;&lt;mrow&gt;&lt;mo fence="true"&gt;[&lt;/mo&gt;&lt;mtable columnspacing="1em" rowspacing="0.15999999999999992em"&gt;&lt;mtr&gt;&lt;mtd&gt;&lt;mstyle displaystyle="false" scriptlevel="0"&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;mtd&gt;&lt;mstyle displaystyle="false" scriptlevel="0"&gt;&lt;mrow&gt;&lt;/mrow&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;mtd&gt;&lt;mstyle displaystyle="false" scriptlevel="0"&gt;&lt;mn&gt;0&lt;/mn&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;/mtr&gt;&lt;mtr&gt;&lt;mtd&gt;&lt;mstyle displaystyle="false" scriptlevel="0"&gt;&lt;mn&gt;0&lt;/mn&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;mtd&gt;&lt;mstyle displaystyle="false" scriptlevel="0"&gt;&lt;mrow&gt;&lt;/mrow&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;mtd&gt;&lt;mstyle displaystyle="false" scriptlevel="0"&gt;&lt;mn&gt;4&lt;/mn&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;/mtr&gt;&lt;/mtable&gt;&lt;mo fence="true"&gt;]&lt;/mo&gt;&lt;/mrow&gt;&lt;mo stretchy="false"&gt;)&lt;/mo&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mn&gt;8&lt;/mn&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;\det(\begin{bmatrix}2 &amp;amp;&amp;amp; 0 \\ 0 &amp;amp;&amp;amp; 4\end{bmatrix}) = 8&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:2.40003em;vertical-align:-0.95003em;"&gt;&lt;/span&gt;&lt;span class="mop"&gt;det&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="minner"&gt;&lt;span class="mopen delimcenter" style="top:0em;"&gt;&lt;span class="delimsizing size3"&gt;[&lt;/span&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mtable"&gt;&lt;span class="col-align-c"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:1.45em;"&gt;&lt;span style="top:-3.61em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-2.4099999999999997em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;0&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.9500000000000004em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="arraycolsep" style="width:0.5em;"&gt;&lt;/span&gt;&lt;span class="arraycolsep" style="width:0.5em;"&gt;&lt;/span&gt;&lt;span class="col-align-c"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:1.45em;"&gt;&lt;span style="top:-3.4499999999999997em;"&gt;&lt;span class="pstrut" style="height:2.84em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-2.2499999999999996em;"&gt;&lt;span class="pstrut" style="height:2.84em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.9500000000000004em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="arraycolsep" style="width:0.5em;"&gt;&lt;/span&gt;&lt;span class="arraycolsep" style="width:0.5em;"&gt;&lt;/span&gt;&lt;span class="col-align-c"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:1.45em;"&gt;&lt;span style="top:-3.61em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;0&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-2.4099999999999997em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;4&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.9500000000000004em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose delimcenter" style="top:0em;"&gt;&lt;span class="delimsizing size3"&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.64444em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;8&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;.&lt;/p&gt;
&lt;p&gt;Once we know how much a transformation scales a single square, that tells us how any area in space would be scaled, since linear transformations "keep gridlines parallel and evenly spaced." &lt;a href='#3blue1brownVectorsChapter6Essence2016' id='ref-3blue1brownVectorsChapter6Essence2016-1'&gt;3Blue1Brown (2016)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;A determinate can be a fractional value, which reduces the size of space:&lt;/p&gt;
&lt;p&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;det&lt;/mi&gt;&lt;mo&gt;⁡&lt;/mo&gt;&lt;mrow&gt;&lt;mo fence="true"&gt;(&lt;/mo&gt;&lt;mrow&gt;&lt;mo fence="true"&gt;[&lt;/mo&gt;&lt;mtable columnspacing="1em" rowspacing="0.15999999999999992em"&gt;&lt;mtr&gt;&lt;mtd&gt;&lt;mstyle displaystyle="false" scriptlevel="0"&gt;&lt;mn&gt;0.5&lt;/mn&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;mtd&gt;&lt;mstyle displaystyle="false" scriptlevel="0"&gt;&lt;mrow&gt;&lt;/mrow&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;mtd&gt;&lt;mstyle displaystyle="false" scriptlevel="0"&gt;&lt;mn&gt;0.5&lt;/mn&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;/mtr&gt;&lt;mtr&gt;&lt;mtd&gt;&lt;mstyle displaystyle="false" scriptlevel="0"&gt;&lt;mn&gt;0.5&lt;/mn&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;mtd&gt;&lt;mstyle displaystyle="false" scriptlevel="0"&gt;&lt;mrow&gt;&lt;/mrow&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;mtd&gt;&lt;mstyle displaystyle="false" scriptlevel="0"&gt;&lt;mn&gt;0.5&lt;/mn&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;/mtr&gt;&lt;/mtable&gt;&lt;mo fence="true"&gt;]&lt;/mo&gt;&lt;/mrow&gt;&lt;mo fence="true"&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mn&gt;0.5&lt;/mn&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;\det\left(\begin{bmatrix}0.5 &amp;amp;&amp;amp; 0.5 \\ 0.5 &amp;amp;&amp;amp; 0.5\end{bmatrix}\right) = 0.5&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:2.40003em;vertical-align:-0.95003em;"&gt;&lt;/span&gt;&lt;span class="mop"&gt;det&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="minner"&gt;&lt;span class="mopen delimcenter" style="top:0em;"&gt;&lt;span class="delimsizing size3"&gt;(&lt;/span&gt;&lt;/span&gt;&lt;span class="minner"&gt;&lt;span class="mopen delimcenter" style="top:0em;"&gt;&lt;span class="delimsizing size3"&gt;[&lt;/span&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mtable"&gt;&lt;span class="col-align-c"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:1.45em;"&gt;&lt;span style="top:-3.61em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;0&lt;/span&gt;&lt;span class="mord"&gt;.&lt;/span&gt;&lt;span class="mord"&gt;5&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-2.4099999999999997em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;0&lt;/span&gt;&lt;span class="mord"&gt;.&lt;/span&gt;&lt;span class="mord"&gt;5&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.9500000000000004em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="arraycolsep" style="width:0.5em;"&gt;&lt;/span&gt;&lt;span class="arraycolsep" style="width:0.5em;"&gt;&lt;/span&gt;&lt;span class="col-align-c"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:1.45em;"&gt;&lt;span style="top:-3.4499999999999997em;"&gt;&lt;span class="pstrut" style="height:2.84em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-2.2499999999999996em;"&gt;&lt;span class="pstrut" style="height:2.84em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.9500000000000004em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="arraycolsep" style="width:0.5em;"&gt;&lt;/span&gt;&lt;span class="arraycolsep" style="width:0.5em;"&gt;&lt;/span&gt;&lt;span class="col-align-c"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:1.45em;"&gt;&lt;span style="top:-3.61em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;0&lt;/span&gt;&lt;span class="mord"&gt;.&lt;/span&gt;&lt;span class="mord"&gt;5&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-2.4099999999999997em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;0&lt;/span&gt;&lt;span class="mord"&gt;.&lt;/span&gt;&lt;span class="mord"&gt;5&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.9500000000000004em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose delimcenter" style="top:0em;"&gt;&lt;span class="delimsizing size3"&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose delimcenter" style="top:0em;"&gt;&lt;span class="delimsizing size3"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.64444em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;0&lt;/span&gt;&lt;span class="mord"&gt;.&lt;/span&gt;&lt;span class="mord"&gt;5&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;A determinate can even have a negative value, which means that the orientation of space is flipped.&lt;/p&gt;
&lt;p&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;det&lt;/mi&gt;&lt;mo&gt;⁡&lt;/mo&gt;&lt;mrow&gt;&lt;mo fence="true"&gt;(&lt;/mo&gt;&lt;mrow&gt;&lt;mo fence="true"&gt;[&lt;/mo&gt;&lt;mtable columnspacing="1em" rowspacing="0.15999999999999992em"&gt;&lt;mtr&gt;&lt;mtd&gt;&lt;mstyle displaystyle="false" scriptlevel="0"&gt;&lt;mrow&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/mrow&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;mtd&gt;&lt;mstyle displaystyle="false" scriptlevel="0"&gt;&lt;mrow&gt;&lt;/mrow&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;mtd&gt;&lt;mstyle displaystyle="false" scriptlevel="0"&gt;&lt;mn&gt;0&lt;/mn&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;/mtr&gt;&lt;mtr&gt;&lt;mtd&gt;&lt;mstyle displaystyle="false" scriptlevel="0"&gt;&lt;mn&gt;0&lt;/mn&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;mtd&gt;&lt;mstyle displaystyle="false" scriptlevel="0"&gt;&lt;mrow&gt;&lt;/mrow&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;mtd&gt;&lt;mstyle displaystyle="false" scriptlevel="0"&gt;&lt;mrow&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/mrow&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;/mtr&gt;&lt;/mtable&gt;&lt;mo fence="true"&gt;]&lt;/mo&gt;&lt;/mrow&gt;&lt;mo fence="true"&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;\det\left(\begin{bmatrix}-1 &amp;amp;&amp;amp; 0 \\ 0 &amp;amp;&amp;amp; -1\end{bmatrix}\right) = -1&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:2.40003em;vertical-align:-0.95003em;"&gt;&lt;/span&gt;&lt;span class="mop"&gt;det&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="minner"&gt;&lt;span class="mopen delimcenter" style="top:0em;"&gt;&lt;span class="delimsizing size3"&gt;(&lt;/span&gt;&lt;/span&gt;&lt;span class="minner"&gt;&lt;span class="mopen delimcenter" style="top:0em;"&gt;&lt;span class="delimsizing size3"&gt;[&lt;/span&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mtable"&gt;&lt;span class="col-align-c"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:1.45em;"&gt;&lt;span style="top:-3.61em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;−&lt;/span&gt;&lt;span class="mord"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-2.4099999999999997em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;0&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.9500000000000004em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="arraycolsep" style="width:0.5em;"&gt;&lt;/span&gt;&lt;span class="arraycolsep" style="width:0.5em;"&gt;&lt;/span&gt;&lt;span class="col-align-c"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:1.45em;"&gt;&lt;span style="top:-3.4499999999999997em;"&gt;&lt;span class="pstrut" style="height:2.84em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-2.2499999999999996em;"&gt;&lt;span class="pstrut" style="height:2.84em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.9500000000000004em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="arraycolsep" style="width:0.5em;"&gt;&lt;/span&gt;&lt;span class="arraycolsep" style="width:0.5em;"&gt;&lt;/span&gt;&lt;span class="col-align-c"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:1.45em;"&gt;&lt;span style="top:-3.61em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;0&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-2.4099999999999997em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;−&lt;/span&gt;&lt;span class="mord"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.9500000000000004em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose delimcenter" style="top:0em;"&gt;&lt;span class="delimsizing size3"&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose delimcenter" style="top:0em;"&gt;&lt;span class="delimsizing size3"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.72777em;vertical-align:-0.08333em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;−&lt;/span&gt;&lt;span class="mord"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;A &lt;a href="matrix-transformation.html"&gt;Matrix Transformation&lt;/a&gt; was a determinate of 0, means that the transformation collapses space onto a single line. These types of matrices do not have a &lt;a href="matrix-inverse.html"&gt;Matrix Inverse&lt;/a&gt;
In 2d space, the Determinate can be calculated using this formula: &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;det&lt;/mi&gt;&lt;mo&gt;⁡&lt;/mo&gt;&lt;mo stretchy="false"&gt;(&lt;/mo&gt;&lt;mrow&gt;&lt;mo fence="true"&gt;[&lt;/mo&gt;&lt;mtable columnspacing="1em" rowspacing="0.15999999999999992em"&gt;&lt;mtr&gt;&lt;mtd&gt;&lt;mstyle displaystyle="false" scriptlevel="0"&gt;&lt;mstyle mathcolor="red"&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;/mstyle&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;mtd&gt;&lt;mstyle displaystyle="false" scriptlevel="0"&gt;&lt;mrow&gt;&lt;/mrow&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;mtd&gt;&lt;mstyle displaystyle="false" scriptlevel="0"&gt;&lt;mstyle mathcolor="green"&gt;&lt;mi&gt;b&lt;/mi&gt;&lt;/mstyle&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;/mtr&gt;&lt;mtr&gt;&lt;mtd&gt;&lt;mstyle displaystyle="false" scriptlevel="0"&gt;&lt;mstyle mathcolor="red"&gt;&lt;mi&gt;c&lt;/mi&gt;&lt;/mstyle&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;mtd&gt;&lt;mstyle displaystyle="false" scriptlevel="0"&gt;&lt;mrow&gt;&lt;/mrow&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;mtd&gt;&lt;mstyle displaystyle="false" scriptlevel="0"&gt;&lt;mstyle mathcolor="green"&gt;&lt;mi&gt;d&lt;/mi&gt;&lt;/mstyle&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;/mtr&gt;&lt;/mtable&gt;&lt;mo fence="true"&gt;]&lt;/mo&gt;&lt;/mrow&gt;&lt;mo stretchy="false"&gt;)&lt;/mo&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mstyle mathcolor="red"&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;/mstyle&gt;&lt;mstyle mathcolor="green"&gt;&lt;mi&gt;d&lt;/mi&gt;&lt;/mstyle&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;mstyle mathcolor="green"&gt;&lt;mi&gt;b&lt;/mi&gt;&lt;/mstyle&gt;&lt;mstyle mathcolor="red"&gt;&lt;mi&gt;c&lt;/mi&gt;&lt;/mstyle&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;\det(\begin{bmatrix}{\color{red}{a}} &amp;amp;&amp;amp; \color{green}{b} \\ \color{red}{c} &amp;amp;&amp;amp; \color{green}{d}\end{bmatrix}) = {\color{red}{a}}{\color{green}{d}} - {\color{green}{b}}{\color{red}{c}}&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:2.40003em;vertical-align:-0.95003em;"&gt;&lt;/span&gt;&lt;span class="mop"&gt;det&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="minner"&gt;&lt;span class="mopen delimcenter" style="top:0em;"&gt;&lt;span class="delimsizing size3"&gt;[&lt;/span&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mtable"&gt;&lt;span class="col-align-c"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:1.45em;"&gt;&lt;span style="top:-3.61em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;&lt;span class="mord" style="color:red;"&gt;&lt;span class="mord mathdefault" style="color:red;"&gt;a&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-2.4099999999999997em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord" style="color:red;"&gt;&lt;span class="mord mathdefault" style="color:red;"&gt;c&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.9500000000000004em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="arraycolsep" style="width:0.5em;"&gt;&lt;/span&gt;&lt;span class="arraycolsep" style="width:0.5em;"&gt;&lt;/span&gt;&lt;span class="col-align-c"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:1.45em;"&gt;&lt;span style="top:-3.4499999999999997em;"&gt;&lt;span class="pstrut" style="height:2.84em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-2.2499999999999996em;"&gt;&lt;span class="pstrut" style="height:2.84em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.9500000000000004em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="arraycolsep" style="width:0.5em;"&gt;&lt;/span&gt;&lt;span class="arraycolsep" style="width:0.5em;"&gt;&lt;/span&gt;&lt;span class="col-align-c"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:1.45em;"&gt;&lt;span style="top:-3.61em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord" style="color:green;"&gt;&lt;span class="mord mathdefault" style="color:green;"&gt;b&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-2.4099999999999997em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord" style="color:green;"&gt;&lt;span class="mord mathdefault" style="color:green;"&gt;d&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.9500000000000004em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose delimcenter" style="top:0em;"&gt;&lt;span class="delimsizing size3"&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.77777em;vertical-align:-0.08333em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord" style="color:red;"&gt;&lt;span class="mord mathdefault" style="color:red;"&gt;a&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord" style="color:green;"&gt;&lt;span class="mord mathdefault" style="color:green;"&gt;d&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;−&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.69444em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord" style="color:green;"&gt;&lt;span class="mord mathdefault" style="color:green;"&gt;b&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord" style="color:red;"&gt;&lt;span class="mord mathdefault" style="color:red;"&gt;c&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;.&lt;/p&gt;
&lt;p&gt;The intuition for this comes when you set &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;b&lt;/mi&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mn&gt;0&lt;/mn&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;b = 0&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.69444em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;b&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.64444em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;0&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; and &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;c&lt;/mi&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mn&gt;0&lt;/mn&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;c = 0&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.43056em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;c&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.64444em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;0&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;. In that case, the x and y-axis are scaled in a straight line. If you set &lt;em&gt;either&lt;/em&gt; &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;b&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;b&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.69444em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;b&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; or &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;c&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;c&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.43056em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;c&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; to 0, the shape becomes a parallelogram. But the area is unchanged.&lt;/p&gt;
&lt;p&gt;&lt;a href='#dyeMathematicsMachineLearning' id='ref-dyeMathematicsMachineLearning-1'&gt;Dye et al. (2018)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;In 3d space, it becomes a lot more complex. We take the product of each element of the first row with the matrix that can be created excluding the current element's column and row.&lt;/p&gt;
&lt;p&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;d&lt;/mi&gt;&lt;mi&gt;e&lt;/mi&gt;&lt;mi&gt;t&lt;/mi&gt;&lt;mrow&gt;&lt;mo fence="true"&gt;(&lt;/mo&gt;&lt;mrow&gt;&lt;mo fence="true"&gt;[&lt;/mo&gt;&lt;mtable columnspacing="1em" rowspacing="0.15999999999999992em"&gt;&lt;mtr&gt;&lt;mtd&gt;&lt;mstyle displaystyle="false" scriptlevel="0"&gt;&lt;mstyle mathcolor="red"&gt;&lt;msub&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mn&gt;11&lt;/mn&gt;&lt;/msub&gt;&lt;/mstyle&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;mtd&gt;&lt;mstyle displaystyle="false" scriptlevel="0"&gt;&lt;mrow&gt;&lt;/mrow&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;mtd&gt;&lt;mstyle displaystyle="false" scriptlevel="0"&gt;&lt;mstyle mathcolor="green"&gt;&lt;msub&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mn&gt;12&lt;/mn&gt;&lt;/msub&gt;&lt;/mstyle&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;mtd&gt;&lt;mstyle displaystyle="false" scriptlevel="0"&gt;&lt;mrow&gt;&lt;/mrow&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;mtd&gt;&lt;mstyle displaystyle="false" scriptlevel="0"&gt;&lt;mstyle mathcolor="blue"&gt;&lt;msub&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mn&gt;13&lt;/mn&gt;&lt;/msub&gt;&lt;/mstyle&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;/mtr&gt;&lt;mtr&gt;&lt;mtd&gt;&lt;mstyle displaystyle="false" scriptlevel="0"&gt;&lt;mstyle mathcolor="red"&gt;&lt;msub&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mn&gt;21&lt;/mn&gt;&lt;/msub&gt;&lt;/mstyle&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;mtd&gt;&lt;mstyle displaystyle="false" scriptlevel="0"&gt;&lt;mrow&gt;&lt;/mrow&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;mtd&gt;&lt;mstyle displaystyle="false" scriptlevel="0"&gt;&lt;mstyle mathcolor="green"&gt;&lt;msub&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mn&gt;22&lt;/mn&gt;&lt;/msub&gt;&lt;/mstyle&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;mtd&gt;&lt;mstyle displaystyle="false" scriptlevel="0"&gt;&lt;mrow&gt;&lt;/mrow&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;mtd&gt;&lt;mstyle displaystyle="false" scriptlevel="0"&gt;&lt;mstyle mathcolor="blue"&gt;&lt;msub&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mn&gt;23&lt;/mn&gt;&lt;/msub&gt;&lt;/mstyle&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;/mtr&gt;&lt;mtr&gt;&lt;mtd&gt;&lt;mstyle displaystyle="false" scriptlevel="0"&gt;&lt;mstyle mathcolor="red"&gt;&lt;msub&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mn&gt;31&lt;/mn&gt;&lt;/msub&gt;&lt;/mstyle&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;mtd&gt;&lt;mstyle displaystyle="false" scriptlevel="0"&gt;&lt;mrow&gt;&lt;/mrow&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;mtd&gt;&lt;mstyle displaystyle="false" scriptlevel="0"&gt;&lt;mstyle mathcolor="green"&gt;&lt;msub&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mn&gt;32&lt;/mn&gt;&lt;/msub&gt;&lt;/mstyle&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;mtd&gt;&lt;mstyle displaystyle="false" scriptlevel="0"&gt;&lt;mrow&gt;&lt;/mrow&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;mtd&gt;&lt;mstyle displaystyle="false" scriptlevel="0"&gt;&lt;mstyle mathcolor="blue"&gt;&lt;msub&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mn&gt;33&lt;/mn&gt;&lt;/msub&gt;&lt;/mstyle&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;/mtr&gt;&lt;/mtable&gt;&lt;mo fence="true"&gt;]&lt;/mo&gt;&lt;/mrow&gt;&lt;mo fence="true"&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mstyle mathcolor="red"&gt;&lt;msub&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mn&gt;11&lt;/mn&gt;&lt;/msub&gt;&lt;/mstyle&gt;&lt;mtext&gt; &lt;/mtext&gt;&lt;mi&gt;det&lt;/mi&gt;&lt;mo&gt;⁡&lt;/mo&gt;&lt;mrow&gt;&lt;mo fence="true"&gt;(&lt;/mo&gt;&lt;mrow&gt;&lt;mo fence="true"&gt;[&lt;/mo&gt;&lt;mtable columnspacing="1em" rowspacing="0.15999999999999992em"&gt;&lt;mtr&gt;&lt;mtd&gt;&lt;mstyle displaystyle="false" scriptlevel="0"&gt;&lt;mstyle mathcolor="green"&gt;&lt;msub&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mn&gt;22&lt;/mn&gt;&lt;/msub&gt;&lt;/mstyle&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;mtd&gt;&lt;mstyle displaystyle="false" scriptlevel="0"&gt;&lt;mrow&gt;&lt;/mrow&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;mtd&gt;&lt;mstyle displaystyle="false" scriptlevel="0"&gt;&lt;mstyle mathcolor="blue"&gt;&lt;msub&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mn&gt;23&lt;/mn&gt;&lt;/msub&gt;&lt;/mstyle&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;/mtr&gt;&lt;mtr&gt;&lt;mtd&gt;&lt;mstyle displaystyle="false" scriptlevel="0"&gt;&lt;mstyle mathcolor="green"&gt;&lt;msub&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mn&gt;32&lt;/mn&gt;&lt;/msub&gt;&lt;/mstyle&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;mtd&gt;&lt;mstyle displaystyle="false" scriptlevel="0"&gt;&lt;mrow&gt;&lt;/mrow&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;mtd&gt;&lt;mstyle displaystyle="false" scriptlevel="0"&gt;&lt;mstyle mathcolor="blue"&gt;&lt;msub&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mn&gt;33&lt;/mn&gt;&lt;/msub&gt;&lt;/mstyle&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;/mtr&gt;&lt;/mtable&gt;&lt;mo fence="true"&gt;]&lt;/mo&gt;&lt;/mrow&gt;&lt;mo fence="true"&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;mstyle mathcolor="green"&gt;&lt;msub&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mn&gt;12&lt;/mn&gt;&lt;/msub&gt;&lt;/mstyle&gt;&lt;mtext&gt; &lt;/mtext&gt;&lt;mi&gt;det&lt;/mi&gt;&lt;mo&gt;⁡&lt;/mo&gt;&lt;mrow&gt;&lt;mo fence="true"&gt;(&lt;/mo&gt;&lt;mrow&gt;&lt;mo fence="true"&gt;[&lt;/mo&gt;&lt;mtable columnspacing="1em" rowspacing="0.15999999999999992em"&gt;&lt;mtr&gt;&lt;mtd&gt;&lt;mstyle displaystyle="false" scriptlevel="0"&gt;&lt;mstyle mathcolor="red"&gt;&lt;msub&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mn&gt;21&lt;/mn&gt;&lt;/msub&gt;&lt;/mstyle&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;mtd&gt;&lt;mstyle displaystyle="false" scriptlevel="0"&gt;&lt;mrow&gt;&lt;/mrow&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;mtd&gt;&lt;mstyle displaystyle="false" scriptlevel="0"&gt;&lt;mstyle mathcolor="blue"&gt;&lt;msub&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mn&gt;23&lt;/mn&gt;&lt;/msub&gt;&lt;/mstyle&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;/mtr&gt;&lt;mtr&gt;&lt;mtd&gt;&lt;mstyle displaystyle="false" scriptlevel="0"&gt;&lt;mstyle mathcolor="red"&gt;&lt;msub&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mn&gt;31&lt;/mn&gt;&lt;/msub&gt;&lt;/mstyle&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;mtd&gt;&lt;mstyle displaystyle="false" scriptlevel="0"&gt;&lt;mrow&gt;&lt;/mrow&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;mtd&gt;&lt;mstyle displaystyle="false" scriptlevel="0"&gt;&lt;mstyle mathcolor="blue"&gt;&lt;msub&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mn&gt;33&lt;/mn&gt;&lt;/msub&gt;&lt;/mstyle&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;/mtr&gt;&lt;/mtable&gt;&lt;mo fence="true"&gt;]&lt;/mo&gt;&lt;/mrow&gt;&lt;mo fence="true"&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;mo&gt;+&lt;/mo&gt;&lt;mstyle mathcolor="blue"&gt;&lt;msub&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mn&gt;13&lt;/mn&gt;&lt;/msub&gt;&lt;/mstyle&gt;&lt;mtext&gt; &lt;/mtext&gt;&lt;mi&gt;det&lt;/mi&gt;&lt;mo&gt;⁡&lt;/mo&gt;&lt;mrow&gt;&lt;mo fence="true"&gt;(&lt;/mo&gt;&lt;mrow&gt;&lt;mo fence="true"&gt;[&lt;/mo&gt;&lt;mtable columnspacing="1em" rowspacing="0.15999999999999992em"&gt;&lt;mtr&gt;&lt;mtd&gt;&lt;mstyle displaystyle="false" scriptlevel="0"&gt;&lt;mstyle mathcolor="red"&gt;&lt;msub&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mn&gt;21&lt;/mn&gt;&lt;/msub&gt;&lt;/mstyle&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;mtd&gt;&lt;mstyle displaystyle="false" scriptlevel="0"&gt;&lt;mrow&gt;&lt;/mrow&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;mtd&gt;&lt;mstyle displaystyle="false" scriptlevel="0"&gt;&lt;mstyle mathcolor="green"&gt;&lt;msub&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mn&gt;22&lt;/mn&gt;&lt;/msub&gt;&lt;/mstyle&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;/mtr&gt;&lt;mtr&gt;&lt;mtd&gt;&lt;mstyle displaystyle="false" scriptlevel="0"&gt;&lt;mstyle mathcolor="red"&gt;&lt;msub&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mn&gt;31&lt;/mn&gt;&lt;/msub&gt;&lt;/mstyle&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;mtd&gt;&lt;mstyle displaystyle="false" scriptlevel="0"&gt;&lt;mrow&gt;&lt;/mrow&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;mtd&gt;&lt;mstyle displaystyle="false" scriptlevel="0"&gt;&lt;mstyle mathcolor="green"&gt;&lt;msub&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mn&gt;32&lt;/mn&gt;&lt;/msub&gt;&lt;/mstyle&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;/mtr&gt;&lt;/mtable&gt;&lt;mo fence="true"&gt;]&lt;/mo&gt;&lt;/mrow&gt;&lt;mo fence="true"&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;det\left(\begin{bmatrix}\color{red}{a_{11}} &amp;amp;&amp;amp; \color{green}{a_{12}} &amp;amp;&amp;amp; \color{blue}{a_{13}} \\ \color{red}{a_{21}} &amp;amp;&amp;amp; \color{green}{a_{22}} &amp;amp;&amp;amp; \color{blue}{a_{23}} \\ \color{red}{a_{31}} &amp;amp;&amp;amp; \color{green}{a_{32}} &amp;amp;&amp;amp; \color{blue}{a_{33}}\end{bmatrix}\right) = {\color{red}{a_{11}}} \ \det\left(\begin{bmatrix}\color{green}{a_{22}} &amp;amp;&amp;amp; \color{blue}{a_{23}} \\ \color{green}{a_{32}} &amp;amp;&amp;amp; \color{blue}{a_{33}}\end{bmatrix}\right) - {\color{green}{a_{12}}} \ \det\left(\begin{bmatrix}\color{red}{a_{21}} &amp;amp;&amp;amp; \color{blue}{a_{23}} \\ \color{red}{a_{31}} &amp;amp;&amp;amp; \color{blue}{a_{33}}\end{bmatrix}\right) + {\color{blue}{a_{13}}} \ \det\left(\begin{bmatrix}\color{red}{a_{21}} &amp;amp;&amp;amp; \color{green}{a_{22}} \\ \color{red}{a_{31}} &amp;amp;&amp;amp; \color{green}{a_{32}}\end{bmatrix}\right)&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:3.6010299999999997em;vertical-align:-1.55002em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;d&lt;/span&gt;&lt;span class="mord mathdefault"&gt;e&lt;/span&gt;&lt;span class="mord mathdefault"&gt;t&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="minner"&gt;&lt;span class="mopen"&gt;&lt;span class="delimsizing mult"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:2.05002em;"&gt;&lt;span style="top:-2.2500000000000004em;"&gt;&lt;span class="pstrut" style="height:3.1550000000000002em;"&gt;&lt;/span&gt;&lt;span class="delimsizinginner delim-size4"&gt;&lt;span&gt;⎝&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-2.8100000000000005em;"&gt;&lt;span class="pstrut" style="height:3.1550000000000002em;"&gt;&lt;/span&gt;&lt;span class="delimsizinginner delim-size4"&gt;&lt;span&gt;⎜&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-4.05002em;"&gt;&lt;span class="pstrut" style="height:3.1550000000000002em;"&gt;&lt;/span&gt;&lt;span class="delimsizinginner delim-size4"&gt;&lt;span&gt;⎛&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:1.55002em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="minner"&gt;&lt;span class="mopen"&gt;&lt;span class="delimsizing mult"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:2.0510099999999998em;"&gt;&lt;span style="top:-2.2500000000000004em;"&gt;&lt;span class="pstrut" style="height:3.1550000000000002em;"&gt;&lt;/span&gt;&lt;span class="delimsizinginner delim-size4"&gt;&lt;span&gt;⎣&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-2.8099900000000004em;"&gt;&lt;span class="pstrut" style="height:3.1550000000000002em;"&gt;&lt;/span&gt;&lt;span class="delimsizinginner delim-size4"&gt;&lt;span&gt;⎢&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-4.05101em;"&gt;&lt;span class="pstrut" style="height:3.1550000000000002em;"&gt;&lt;/span&gt;&lt;span class="delimsizinginner delim-size4"&gt;&lt;span&gt;⎡&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:1.55002em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mtable"&gt;&lt;span class="col-align-c"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:2.05em;"&gt;&lt;span style="top:-4.21em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord" style="color:red;"&gt;&lt;span class="mord" style="color:red;"&gt;&lt;span class="mord mathdefault" style="color:red;"&gt;a&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.30110799999999993em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight" style="color:red;"&gt;&lt;span class="mord mtight" style="color:red;"&gt;&lt;span class="mord mtight" style="color:red;"&gt;1&lt;/span&gt;&lt;span class="mord mtight" style="color:red;"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-3.0099999999999993em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord" style="color:red;"&gt;&lt;span class="mord" style="color:red;"&gt;&lt;span class="mord mathdefault" style="color:red;"&gt;a&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.30110799999999993em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight" style="color:red;"&gt;&lt;span class="mord mtight" style="color:red;"&gt;&lt;span class="mord mtight" style="color:red;"&gt;2&lt;/span&gt;&lt;span class="mord mtight" style="color:red;"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-1.8099999999999994em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord" style="color:red;"&gt;&lt;span class="mord" style="color:red;"&gt;&lt;span class="mord mathdefault" style="color:red;"&gt;a&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.30110799999999993em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight" style="color:red;"&gt;&lt;span class="mord mtight" style="color:red;"&gt;&lt;span class="mord mtight" style="color:red;"&gt;3&lt;/span&gt;&lt;span class="mord mtight" style="color:red;"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:1.5500000000000007em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="arraycolsep" style="width:0.5em;"&gt;&lt;/span&gt;&lt;span class="arraycolsep" style="width:0.5em;"&gt;&lt;/span&gt;&lt;span class="col-align-c"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:2.05em;"&gt;&lt;span style="top:-4.05em;"&gt;&lt;span class="pstrut" style="height:2.84em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-2.849999999999999em;"&gt;&lt;span class="pstrut" style="height:2.84em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-1.6499999999999992em;"&gt;&lt;span class="pstrut" style="height:2.84em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:1.5500000000000007em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="arraycolsep" style="width:0.5em;"&gt;&lt;/span&gt;&lt;span class="arraycolsep" style="width:0.5em;"&gt;&lt;/span&gt;&lt;span class="col-align-c"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:2.05em;"&gt;&lt;span style="top:-4.21em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord" style="color:green;"&gt;&lt;span class="mord" style="color:green;"&gt;&lt;span class="mord mathdefault" style="color:green;"&gt;a&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.30110799999999993em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight" style="color:green;"&gt;&lt;span class="mord mtight" style="color:green;"&gt;&lt;span class="mord mtight" style="color:green;"&gt;1&lt;/span&gt;&lt;span class="mord mtight" style="color:green;"&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-3.0099999999999993em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord" style="color:green;"&gt;&lt;span class="mord" style="color:green;"&gt;&lt;span class="mord mathdefault" style="color:green;"&gt;a&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.30110799999999993em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight" style="color:green;"&gt;&lt;span class="mord mtight" style="color:green;"&gt;&lt;span class="mord mtight" style="color:green;"&gt;2&lt;/span&gt;&lt;span class="mord mtight" style="color:green;"&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-1.8099999999999994em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord" style="color:green;"&gt;&lt;span class="mord" style="color:green;"&gt;&lt;span class="mord mathdefault" style="color:green;"&gt;a&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.30110799999999993em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight" style="color:green;"&gt;&lt;span class="mord mtight" style="color:green;"&gt;&lt;span class="mord mtight" style="color:green;"&gt;3&lt;/span&gt;&lt;span class="mord mtight" style="color:green;"&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:1.5500000000000007em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="arraycolsep" style="width:0.5em;"&gt;&lt;/span&gt;&lt;span class="arraycolsep" style="width:0.5em;"&gt;&lt;/span&gt;&lt;span class="col-align-c"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:2.05em;"&gt;&lt;span style="top:-4.05em;"&gt;&lt;span class="pstrut" style="height:2.84em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-2.849999999999999em;"&gt;&lt;span class="pstrut" style="height:2.84em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-1.6499999999999992em;"&gt;&lt;span class="pstrut" style="height:2.84em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:1.5500000000000007em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="arraycolsep" style="width:0.5em;"&gt;&lt;/span&gt;&lt;span class="arraycolsep" style="width:0.5em;"&gt;&lt;/span&gt;&lt;span class="col-align-c"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:2.05em;"&gt;&lt;span style="top:-4.21em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord" style="color:blue;"&gt;&lt;span class="mord" style="color:blue;"&gt;&lt;span class="mord mathdefault" style="color:blue;"&gt;a&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.30110799999999993em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight" style="color:blue;"&gt;&lt;span class="mord mtight" style="color:blue;"&gt;&lt;span class="mord mtight" style="color:blue;"&gt;1&lt;/span&gt;&lt;span class="mord mtight" style="color:blue;"&gt;3&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-3.0099999999999993em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord" style="color:blue;"&gt;&lt;span class="mord" style="color:blue;"&gt;&lt;span class="mord mathdefault" style="color:blue;"&gt;a&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.30110799999999993em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight" style="color:blue;"&gt;&lt;span class="mord mtight" style="color:blue;"&gt;&lt;span class="mord mtight" style="color:blue;"&gt;2&lt;/span&gt;&lt;span class="mord mtight" style="color:blue;"&gt;3&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-1.8099999999999994em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord" style="color:blue;"&gt;&lt;span class="mord" style="color:blue;"&gt;&lt;span class="mord mathdefault" style="color:blue;"&gt;a&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.30110799999999993em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight" style="color:blue;"&gt;&lt;span class="mord mtight" style="color:blue;"&gt;&lt;span class="mord mtight" style="color:blue;"&gt;3&lt;/span&gt;&lt;span class="mord mtight" style="color:blue;"&gt;3&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:1.5500000000000007em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose"&gt;&lt;span class="delimsizing mult"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:2.0510099999999998em;"&gt;&lt;span style="top:-2.2500000000000004em;"&gt;&lt;span class="pstrut" style="height:3.1550000000000002em;"&gt;&lt;/span&gt;&lt;span class="delimsizinginner delim-size4"&gt;&lt;span&gt;⎦&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-2.8099900000000004em;"&gt;&lt;span class="pstrut" style="height:3.1550000000000002em;"&gt;&lt;/span&gt;&lt;span class="delimsizinginner delim-size4"&gt;&lt;span&gt;⎥&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-4.05101em;"&gt;&lt;span class="pstrut" style="height:3.1550000000000002em;"&gt;&lt;/span&gt;&lt;span class="delimsizinginner delim-size4"&gt;&lt;span&gt;⎤&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:1.55002em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose"&gt;&lt;span class="delimsizing mult"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:2.05002em;"&gt;&lt;span style="top:-2.2500000000000004em;"&gt;&lt;span class="pstrut" style="height:3.1550000000000002em;"&gt;&lt;/span&gt;&lt;span class="delimsizinginner delim-size4"&gt;&lt;span&gt;⎠&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-2.8100000000000005em;"&gt;&lt;span class="pstrut" style="height:3.1550000000000002em;"&gt;&lt;/span&gt;&lt;span class="delimsizinginner delim-size4"&gt;&lt;span&gt;⎟&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-4.05002em;"&gt;&lt;span class="pstrut" style="height:3.1550000000000002em;"&gt;&lt;/span&gt;&lt;span class="delimsizinginner delim-size4"&gt;&lt;span&gt;⎞&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:1.55002em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:2.40003em;vertical-align:-0.95003em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord" style="color:red;"&gt;&lt;span class="mord" style="color:red;"&gt;&lt;span class="mord mathdefault" style="color:red;"&gt;a&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.30110799999999993em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight" style="color:red;"&gt;&lt;span class="mord mtight" style="color:red;"&gt;&lt;span class="mord mtight" style="color:red;"&gt;1&lt;/span&gt;&lt;span class="mord mtight" style="color:red;"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mspace"&gt; &lt;/span&gt;&lt;span class="mop"&gt;det&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="minner"&gt;&lt;span class="mopen delimcenter" style="top:0em;"&gt;&lt;span class="delimsizing size3"&gt;(&lt;/span&gt;&lt;/span&gt;&lt;span class="minner"&gt;&lt;span class="mopen delimcenter" style="top:0em;"&gt;&lt;span class="delimsizing size3"&gt;[&lt;/span&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mtable"&gt;&lt;span class="col-align-c"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:1.45em;"&gt;&lt;span style="top:-3.61em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord" style="color:green;"&gt;&lt;span class="mord" style="color:green;"&gt;&lt;span class="mord mathdefault" style="color:green;"&gt;a&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.30110799999999993em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight" style="color:green;"&gt;&lt;span class="mord mtight" style="color:green;"&gt;&lt;span class="mord mtight" style="color:green;"&gt;2&lt;/span&gt;&lt;span class="mord mtight" style="color:green;"&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-2.4099999999999997em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord" style="color:green;"&gt;&lt;span class="mord" style="color:green;"&gt;&lt;span class="mord mathdefault" style="color:green;"&gt;a&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.30110799999999993em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight" style="color:green;"&gt;&lt;span class="mord mtight" style="color:green;"&gt;&lt;span class="mord mtight" style="color:green;"&gt;3&lt;/span&gt;&lt;span class="mord mtight" style="color:green;"&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.9500000000000004em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="arraycolsep" style="width:0.5em;"&gt;&lt;/span&gt;&lt;span class="arraycolsep" style="width:0.5em;"&gt;&lt;/span&gt;&lt;span class="col-align-c"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:1.45em;"&gt;&lt;span style="top:-3.4499999999999997em;"&gt;&lt;span class="pstrut" style="height:2.84em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-2.2499999999999996em;"&gt;&lt;span class="pstrut" style="height:2.84em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.9500000000000004em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="arraycolsep" style="width:0.5em;"&gt;&lt;/span&gt;&lt;span class="arraycolsep" style="width:0.5em;"&gt;&lt;/span&gt;&lt;span class="col-align-c"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:1.45em;"&gt;&lt;span style="top:-3.61em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord" style="color:blue;"&gt;&lt;span class="mord" style="color:blue;"&gt;&lt;span class="mord mathdefault" style="color:blue;"&gt;a&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.30110799999999993em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight" style="color:blue;"&gt;&lt;span class="mord mtight" style="color:blue;"&gt;&lt;span class="mord mtight" style="color:blue;"&gt;2&lt;/span&gt;&lt;span class="mord mtight" style="color:blue;"&gt;3&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-2.4099999999999997em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord" style="color:blue;"&gt;&lt;span class="mord" style="color:blue;"&gt;&lt;span class="mord mathdefault" style="color:blue;"&gt;a&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.30110799999999993em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight" style="color:blue;"&gt;&lt;span class="mord mtight" style="color:blue;"&gt;&lt;span class="mord mtight" style="color:blue;"&gt;3&lt;/span&gt;&lt;span class="mord mtight" style="color:blue;"&gt;3&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.9500000000000004em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose delimcenter" style="top:0em;"&gt;&lt;span class="delimsizing size3"&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose delimcenter" style="top:0em;"&gt;&lt;span class="delimsizing size3"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;−&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:2.40003em;vertical-align:-0.95003em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord" style="color:green;"&gt;&lt;span class="mord" style="color:green;"&gt;&lt;span class="mord mathdefault" style="color:green;"&gt;a&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.30110799999999993em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight" style="color:green;"&gt;&lt;span class="mord mtight" style="color:green;"&gt;&lt;span class="mord mtight" style="color:green;"&gt;1&lt;/span&gt;&lt;span class="mord mtight" style="color:green;"&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mspace"&gt; &lt;/span&gt;&lt;span class="mop"&gt;det&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="minner"&gt;&lt;span class="mopen delimcenter" style="top:0em;"&gt;&lt;span class="delimsizing size3"&gt;(&lt;/span&gt;&lt;/span&gt;&lt;span class="minner"&gt;&lt;span class="mopen delimcenter" style="top:0em;"&gt;&lt;span class="delimsizing size3"&gt;[&lt;/span&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mtable"&gt;&lt;span class="col-align-c"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:1.45em;"&gt;&lt;span style="top:-3.61em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord" style="color:red;"&gt;&lt;span class="mord" style="color:red;"&gt;&lt;span class="mord mathdefault" style="color:red;"&gt;a&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.30110799999999993em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight" style="color:red;"&gt;&lt;span class="mord mtight" style="color:red;"&gt;&lt;span class="mord mtight" style="color:red;"&gt;2&lt;/span&gt;&lt;span class="mord mtight" style="color:red;"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-2.4099999999999997em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord" style="color:red;"&gt;&lt;span class="mord" style="color:red;"&gt;&lt;span class="mord mathdefault" style="color:red;"&gt;a&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.30110799999999993em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight" style="color:red;"&gt;&lt;span class="mord mtight" style="color:red;"&gt;&lt;span class="mord mtight" style="color:red;"&gt;3&lt;/span&gt;&lt;span class="mord mtight" style="color:red;"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.9500000000000004em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="arraycolsep" style="width:0.5em;"&gt;&lt;/span&gt;&lt;span class="arraycolsep" style="width:0.5em;"&gt;&lt;/span&gt;&lt;span class="col-align-c"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:1.45em;"&gt;&lt;span style="top:-3.4499999999999997em;"&gt;&lt;span class="pstrut" style="height:2.84em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-2.2499999999999996em;"&gt;&lt;span class="pstrut" style="height:2.84em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.9500000000000004em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="arraycolsep" style="width:0.5em;"&gt;&lt;/span&gt;&lt;span class="arraycolsep" style="width:0.5em;"&gt;&lt;/span&gt;&lt;span class="col-align-c"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:1.45em;"&gt;&lt;span style="top:-3.61em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord" style="color:blue;"&gt;&lt;span class="mord" style="color:blue;"&gt;&lt;span class="mord mathdefault" style="color:blue;"&gt;a&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.30110799999999993em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight" style="color:blue;"&gt;&lt;span class="mord mtight" style="color:blue;"&gt;&lt;span class="mord mtight" style="color:blue;"&gt;2&lt;/span&gt;&lt;span class="mord mtight" style="color:blue;"&gt;3&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-2.4099999999999997em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord" style="color:blue;"&gt;&lt;span class="mord" style="color:blue;"&gt;&lt;span class="mord mathdefault" style="color:blue;"&gt;a&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.30110799999999993em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight" style="color:blue;"&gt;&lt;span class="mord mtight" style="color:blue;"&gt;&lt;span class="mord mtight" style="color:blue;"&gt;3&lt;/span&gt;&lt;span class="mord mtight" style="color:blue;"&gt;3&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.9500000000000004em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose delimcenter" style="top:0em;"&gt;&lt;span class="delimsizing size3"&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose delimcenter" style="top:0em;"&gt;&lt;span class="delimsizing size3"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;+&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:2.40003em;vertical-align:-0.95003em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord" style="color:blue;"&gt;&lt;span class="mord" style="color:blue;"&gt;&lt;span class="mord mathdefault" style="color:blue;"&gt;a&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.30110799999999993em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight" style="color:blue;"&gt;&lt;span class="mord mtight" style="color:blue;"&gt;&lt;span class="mord mtight" style="color:blue;"&gt;1&lt;/span&gt;&lt;span class="mord mtight" style="color:blue;"&gt;3&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mspace"&gt; &lt;/span&gt;&lt;span class="mop"&gt;det&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="minner"&gt;&lt;span class="mopen delimcenter" style="top:0em;"&gt;&lt;span class="delimsizing size3"&gt;(&lt;/span&gt;&lt;/span&gt;&lt;span class="minner"&gt;&lt;span class="mopen delimcenter" style="top:0em;"&gt;&lt;span class="delimsizing size3"&gt;[&lt;/span&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mtable"&gt;&lt;span class="col-align-c"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:1.45em;"&gt;&lt;span style="top:-3.61em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord" style="color:red;"&gt;&lt;span class="mord" style="color:red;"&gt;&lt;span class="mord mathdefault" style="color:red;"&gt;a&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.30110799999999993em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight" style="color:red;"&gt;&lt;span class="mord mtight" style="color:red;"&gt;&lt;span class="mord mtight" style="color:red;"&gt;2&lt;/span&gt;&lt;span class="mord mtight" style="color:red;"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-2.4099999999999997em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord" style="color:red;"&gt;&lt;span class="mord" style="color:red;"&gt;&lt;span class="mord mathdefault" style="color:red;"&gt;a&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.30110799999999993em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight" style="color:red;"&gt;&lt;span class="mord mtight" style="color:red;"&gt;&lt;span class="mord mtight" style="color:red;"&gt;3&lt;/span&gt;&lt;span class="mord mtight" style="color:red;"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.9500000000000004em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="arraycolsep" style="width:0.5em;"&gt;&lt;/span&gt;&lt;span class="arraycolsep" style="width:0.5em;"&gt;&lt;/span&gt;&lt;span class="col-align-c"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:1.45em;"&gt;&lt;span style="top:-3.4499999999999997em;"&gt;&lt;span class="pstrut" style="height:2.84em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-2.2499999999999996em;"&gt;&lt;span class="pstrut" style="height:2.84em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.9500000000000004em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="arraycolsep" style="width:0.5em;"&gt;&lt;/span&gt;&lt;span class="arraycolsep" style="width:0.5em;"&gt;&lt;/span&gt;&lt;span class="col-align-c"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:1.45em;"&gt;&lt;span style="top:-3.61em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord" style="color:green;"&gt;&lt;span class="mord" style="color:green;"&gt;&lt;span class="mord mathdefault" style="color:green;"&gt;a&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.30110799999999993em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight" style="color:green;"&gt;&lt;span class="mord mtight" style="color:green;"&gt;&lt;span class="mord mtight" style="color:green;"&gt;2&lt;/span&gt;&lt;span class="mord mtight" style="color:green;"&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-2.4099999999999997em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord" style="color:green;"&gt;&lt;span class="mord" style="color:green;"&gt;&lt;span class="mord mathdefault" style="color:green;"&gt;a&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.30110799999999993em;"&gt;&lt;span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"&gt;&lt;span class="pstrut" style="height:2.7em;"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight" style="color:green;"&gt;&lt;span class="mord mtight" style="color:green;"&gt;&lt;span class="mord mtight" style="color:green;"&gt;3&lt;/span&gt;&lt;span class="mord mtight" style="color:green;"&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.15em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.9500000000000004em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose delimcenter" style="top:0em;"&gt;&lt;span class="delimsizing size3"&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose delimcenter" style="top:0em;"&gt;&lt;span class="delimsizing size3"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href='#khanacademylab3x3Determinant' id='ref-khanacademylab3x3Determinant-1'&gt;KhanAcademyLabs (2009)&lt;/a&gt;&lt;/p&gt;&lt;section id="bib"&gt;&lt;h4&gt;References&lt;/h4&gt;&lt;p id='dyeMathematicsMachineLearning'&gt;David Dye, Sam Cooper, and Freddie Page.
Mathematics for &lt;span class="bibtex-protected"&gt;&lt;span class="bibtex-protected"&gt;Machine Learning&lt;/span&gt;&lt;/span&gt;: &lt;span class="bibtex-protected"&gt;&lt;span class="bibtex-protected"&gt;Linear Algebra&lt;/span&gt;&lt;/span&gt; - &lt;span class="bibtex-protected"&gt;&lt;span class="bibtex-protected"&gt;Home&lt;/span&gt;&lt;/span&gt;.
2018. &lt;a class="cite-backref" href="#ref-dyeMathematicsMachineLearning-1" title="Jump back to reference 1"&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;p id='3blue1brownVectorsChapter6Essence2016'&gt;&lt;span class="bibtex-protected"&gt;3Blue1Brown&lt;/span&gt;.
The determinant.
August 2016. &lt;a class="cite-backref" href="#ref-3blue1brownVectorsChapter6Essence2016-1" title="Jump back to reference 1"&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;p id='khanacademylab3x3Determinant'&gt;&lt;span class="bibtex-protected"&gt;Khan Academy Labs&lt;/span&gt;.
3 x 3 determinant.
November 2009. &lt;a class="cite-backref" href="#ref-khanacademylab3x3Determinant-1" title="Jump back to reference 1"&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/section&gt;</content><category term="permanent"/><category term="LinearAlgebra"/></entry><entry><title>Matrix Transformation</title><link href="http://localhost:8000/matrix-transformation.html" rel="alternate"/><published>2021-11-01T00:00:00+10:00</published><updated>2021-11-01T00:00:00+10:00</updated><author><name>Lex Toumbourou</name></author><id>tag:localhost,2021-11-01:/matrix-transformation.html</id><summary type="html">&lt;p&gt;A matrix as a transformation of a space.&lt;/p&gt;</summary><content type="html">&lt;p&gt;We can think of a matrix as a transformation of a &lt;a href="vector.html"&gt;Vector&lt;/a&gt; or all vectors in space.&lt;/p&gt;
&lt;p&gt;When we take the product of a matrix and a vector, we are &lt;em&gt;transforming&lt;/em&gt; the vector.&lt;/p&gt;
&lt;p&gt;A transformation is another word for a function: it takes in some inputs (a vector) and returns some output (a transformed vector).&lt;/p&gt;
&lt;p&gt;For example, we can rotate a vector &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mo fence="true"&gt;[&lt;/mo&gt;&lt;mtable columnspacing="1em" rowspacing="0.15999999999999992em"&gt;&lt;mtr&gt;&lt;mtd&gt;&lt;mstyle displaystyle="false" scriptlevel="0"&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;/mtr&gt;&lt;mtr&gt;&lt;mtd&gt;&lt;mstyle displaystyle="false" scriptlevel="0"&gt;&lt;mi&gt;y&lt;/mi&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;/mtr&gt;&lt;/mtable&gt;&lt;mo fence="true"&gt;]&lt;/mo&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;\begin{bmatrix}x \\ y\end{bmatrix}&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:2.40003em;vertical-align:-0.95003em;"&gt;&lt;/span&gt;&lt;span class="minner"&gt;&lt;span class="mopen delimcenter" style="top:0em;"&gt;&lt;span class="delimsizing size3"&gt;[&lt;/span&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mtable"&gt;&lt;span class="col-align-c"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:1.45em;"&gt;&lt;span style="top:-3.61em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;x&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-2.4099999999999997em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault" style="margin-right:0.03588em;"&gt;y&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.9500000000000004em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose delimcenter" style="top:0em;"&gt;&lt;span class="delimsizing size3"&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; some angle &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;θ&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;\theta&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.69444em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.02778em;"&gt;θ&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; about the origin using a &lt;a href="rotational-matrix.html"&gt;Rotational Matrix&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mrow&gt;&lt;mo fence="true"&gt;[&lt;/mo&gt;&lt;mtable columnspacing="1em" rowspacing="0.15999999999999992em"&gt;&lt;mtr&gt;&lt;mtd&gt;&lt;mstyle displaystyle="false" scriptlevel="0"&gt;&lt;mtext&gt;x*&lt;/mtext&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;/mtr&gt;&lt;mtr&gt;&lt;mtd&gt;&lt;mstyle displaystyle="false" scriptlevel="0"&gt;&lt;mtext&gt;y*&lt;/mtext&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;/mtr&gt;&lt;/mtable&gt;&lt;mo fence="true"&gt;]&lt;/mo&gt;&lt;/mrow&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mrow&gt;&lt;mo fence="true"&gt;[&lt;/mo&gt;&lt;mtable columnspacing="1em" rowspacing="0.15999999999999992em"&gt;&lt;mtr&gt;&lt;mtd&gt;&lt;mstyle displaystyle="false" scriptlevel="0"&gt;&lt;mrow&gt;&lt;mi&gt;cos&lt;/mi&gt;&lt;mo&gt;⁡&lt;/mo&gt;&lt;mi&gt;θ&lt;/mi&gt;&lt;/mrow&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;mtd&gt;&lt;mstyle displaystyle="false" scriptlevel="0"&gt;&lt;mrow&gt;&lt;/mrow&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;mtd&gt;&lt;mstyle displaystyle="false" scriptlevel="0"&gt;&lt;mrow&gt;&lt;mi&gt;sin&lt;/mi&gt;&lt;mo&gt;⁡&lt;/mo&gt;&lt;mi&gt;θ&lt;/mi&gt;&lt;/mrow&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;/mtr&gt;&lt;mtr&gt;&lt;mtd&gt;&lt;mstyle displaystyle="false" scriptlevel="0"&gt;&lt;mrow&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;mi&gt;sin&lt;/mi&gt;&lt;mo&gt;⁡&lt;/mo&gt;&lt;mi&gt;θ&lt;/mi&gt;&lt;/mrow&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;mtd&gt;&lt;mstyle displaystyle="false" scriptlevel="0"&gt;&lt;mrow&gt;&lt;/mrow&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;mtd&gt;&lt;mstyle displaystyle="false" scriptlevel="0"&gt;&lt;mrow&gt;&lt;mi&gt;cos&lt;/mi&gt;&lt;mo&gt;⁡&lt;/mo&gt;&lt;mi&gt;θ&lt;/mi&gt;&lt;/mrow&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;/mtr&gt;&lt;/mtable&gt;&lt;mo fence="true"&gt;]&lt;/mo&gt;&lt;/mrow&gt;&lt;mrow&gt;&lt;mo fence="true"&gt;[&lt;/mo&gt;&lt;mtable columnspacing="1em" rowspacing="0.15999999999999992em"&gt;&lt;mtr&gt;&lt;mtd&gt;&lt;mstyle displaystyle="false" scriptlevel="0"&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;/mtr&gt;&lt;mtr&gt;&lt;mtd&gt;&lt;mstyle displaystyle="false" scriptlevel="0"&gt;&lt;mi&gt;y&lt;/mi&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;/mtr&gt;&lt;/mtable&gt;&lt;mo fence="true"&gt;]&lt;/mo&gt;&lt;/mrow&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;\begin{bmatrix}\text{x*} \\ \text{y*} \end{bmatrix} = \begin{bmatrix}\cos\theta &amp;amp;&amp;amp; \sin\theta \\ -\sin\theta &amp;amp;&amp;amp; \cos\theta\end{bmatrix} \begin{bmatrix}x \\ y\end{bmatrix}&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:2.40003em;vertical-align:-0.95003em;"&gt;&lt;/span&gt;&lt;span class="minner"&gt;&lt;span class="mopen delimcenter" style="top:0em;"&gt;&lt;span class="delimsizing size3"&gt;[&lt;/span&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mtable"&gt;&lt;span class="col-align-c"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:1.45em;"&gt;&lt;span style="top:-3.61em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord text"&gt;&lt;span class="mord"&gt;x*&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-2.4099999999999997em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord text"&gt;&lt;span class="mord"&gt;y*&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.9500000000000004em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose delimcenter" style="top:0em;"&gt;&lt;span class="delimsizing size3"&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:2.40003em;vertical-align:-0.95003em;"&gt;&lt;/span&gt;&lt;span class="minner"&gt;&lt;span class="mopen delimcenter" style="top:0em;"&gt;&lt;span class="delimsizing size3"&gt;[&lt;/span&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mtable"&gt;&lt;span class="col-align-c"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:1.45em;"&gt;&lt;span style="top:-3.61em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mop"&gt;cos&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.02778em;"&gt;θ&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-2.4099999999999997em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;−&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mop"&gt;sin&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.02778em;"&gt;θ&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.9500000000000004em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="arraycolsep" style="width:0.5em;"&gt;&lt;/span&gt;&lt;span class="arraycolsep" style="width:0.5em;"&gt;&lt;/span&gt;&lt;span class="col-align-c"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:1.45em;"&gt;&lt;span style="top:-3.4499999999999997em;"&gt;&lt;span class="pstrut" style="height:2.84em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-2.2499999999999996em;"&gt;&lt;span class="pstrut" style="height:2.84em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.9500000000000004em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="arraycolsep" style="width:0.5em;"&gt;&lt;/span&gt;&lt;span class="arraycolsep" style="width:0.5em;"&gt;&lt;/span&gt;&lt;span class="col-align-c"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:1.45em;"&gt;&lt;span style="top:-3.61em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mop"&gt;sin&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.02778em;"&gt;θ&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-2.4099999999999997em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mop"&gt;cos&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault" style="margin-right:0.02778em;"&gt;θ&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.9500000000000004em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose delimcenter" style="top:0em;"&gt;&lt;span class="delimsizing size3"&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="minner"&gt;&lt;span class="mopen delimcenter" style="top:0em;"&gt;&lt;span class="delimsizing size3"&gt;[&lt;/span&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mtable"&gt;&lt;span class="col-align-c"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:1.45em;"&gt;&lt;span style="top:-3.61em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;x&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-2.4099999999999997em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault" style="margin-right:0.03588em;"&gt;y&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.9500000000000004em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose delimcenter" style="top:0em;"&gt;&lt;span class="delimsizing size3"&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;In this example, we perform a 90° rotation of vector &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mo fence="true"&gt;[&lt;/mo&gt;&lt;mtable columnspacing="1em" rowspacing="0.15999999999999992em"&gt;&lt;mtr&gt;&lt;mtd&gt;&lt;mstyle displaystyle="false" scriptlevel="0"&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;/mtr&gt;&lt;mtr&gt;&lt;mtd&gt;&lt;mstyle displaystyle="false" scriptlevel="0"&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;/mtr&gt;&lt;/mtable&gt;&lt;mo fence="true"&gt;]&lt;/mo&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;\begin{bmatrix}2 \\ 2\end{bmatrix}&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:2.40003em;vertical-align:-0.95003em;"&gt;&lt;/span&gt;&lt;span class="minner"&gt;&lt;span class="mopen delimcenter" style="top:0em;"&gt;&lt;span class="delimsizing size3"&gt;[&lt;/span&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mtable"&gt;&lt;span class="col-align-c"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:1.45em;"&gt;&lt;span style="top:-3.61em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-2.4099999999999997em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.9500000000000004em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose delimcenter" style="top:0em;"&gt;&lt;span class="delimsizing size3"&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Rotation matrix product with vector" src="../_media/transformation-matrix-example.gif"&gt;&lt;/p&gt;
&lt;p&gt;To describe a transformation as a matrix, we only need to record where the &lt;a href="basis vectors.html"&gt;Basis Vectors&lt;/a&gt; land as columns of a new matrix: &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mo fence="true"&gt;[&lt;/mo&gt;&lt;mtable columnspacing="1em" rowspacing="0.15999999999999992em"&gt;&lt;mtr&gt;&lt;mtd&gt;&lt;mstyle displaystyle="false" scriptlevel="0"&gt;&lt;mstyle mathcolor="red"&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;/mstyle&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;mtd&gt;&lt;mstyle displaystyle="false" scriptlevel="0"&gt;&lt;mrow&gt;&lt;/mrow&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;mtd&gt;&lt;mstyle displaystyle="false" scriptlevel="0"&gt;&lt;mstyle mathcolor="green"&gt;&lt;mi&gt;b&lt;/mi&gt;&lt;/mstyle&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;/mtr&gt;&lt;mtr&gt;&lt;mtd&gt;&lt;mstyle displaystyle="false" scriptlevel="0"&gt;&lt;mstyle mathcolor="red"&gt;&lt;mi&gt;c&lt;/mi&gt;&lt;/mstyle&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;mtd&gt;&lt;mstyle displaystyle="false" scriptlevel="0"&gt;&lt;mrow&gt;&lt;/mrow&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;mtd&gt;&lt;mstyle displaystyle="false" scriptlevel="0"&gt;&lt;mstyle mathcolor="green"&gt;&lt;mi&gt;d&lt;/mi&gt;&lt;/mstyle&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;/mtr&gt;&lt;/mtable&gt;&lt;mo fence="true"&gt;]&lt;/mo&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;\begin{bmatrix}\color{red}{a} &amp;amp;&amp;amp; \color{green}{b} \\ \color{red}{c} &amp;amp;&amp;amp; \color{green}{d}\end{bmatrix}&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:2.40003em;vertical-align:-0.95003em;"&gt;&lt;/span&gt;&lt;span class="minner"&gt;&lt;span class="mopen delimcenter" style="top:0em;"&gt;&lt;span class="delimsizing size3"&gt;[&lt;/span&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mtable"&gt;&lt;span class="col-align-c"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:1.45em;"&gt;&lt;span style="top:-3.61em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord" style="color:red;"&gt;&lt;span class="mord mathdefault" style="color:red;"&gt;a&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-2.4099999999999997em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord" style="color:red;"&gt;&lt;span class="mord mathdefault" style="color:red;"&gt;c&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.9500000000000004em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="arraycolsep" style="width:0.5em;"&gt;&lt;/span&gt;&lt;span class="arraycolsep" style="width:0.5em;"&gt;&lt;/span&gt;&lt;span class="col-align-c"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:1.45em;"&gt;&lt;span style="top:-3.4499999999999997em;"&gt;&lt;span class="pstrut" style="height:2.84em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-2.2499999999999996em;"&gt;&lt;span class="pstrut" style="height:2.84em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.9500000000000004em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="arraycolsep" style="width:0.5em;"&gt;&lt;/span&gt;&lt;span class="arraycolsep" style="width:0.5em;"&gt;&lt;/span&gt;&lt;span class="col-align-c"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:1.45em;"&gt;&lt;span style="top:-3.61em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord" style="color:green;"&gt;&lt;span class="mord mathdefault" style="color:green;"&gt;b&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-2.4099999999999997em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord" style="color:green;"&gt;&lt;span class="mord mathdefault" style="color:green;"&gt;d&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.9500000000000004em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose delimcenter" style="top:0em;"&gt;&lt;span class="delimsizing size3"&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;For example, a &lt;a href="Shear Transformation"&gt;Shear Transformation&lt;/a&gt; keeps the &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mover accent="true"&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;mo&gt;^&lt;/mo&gt;&lt;/mover&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;\hat{i}&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.92296em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord accent"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.92296em;"&gt;&lt;span style="top:-3em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;i&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-3.22852em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="accent-body" style="left:-0.25em;"&gt;^&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; basis vector fixed, and slants the &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mover accent="true"&gt;&lt;mi&gt;j&lt;/mi&gt;&lt;mo&gt;^&lt;/mo&gt;&lt;/mover&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;\hat{j}&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1.1174em;vertical-align:-0.19444em;"&gt;&lt;/span&gt;&lt;span class="mord accent"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.92296em;"&gt;&lt;span style="top:-3em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault" style="margin-right:0.05724em;"&gt;j&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-3.22852em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="accent-body" style="left:-0.25em;"&gt;^&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.19444em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; basis vector. We can record that as: &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mo fence="true"&gt;[&lt;/mo&gt;&lt;mtable columnspacing="1em" rowspacing="0.15999999999999992em"&gt;&lt;mtr&gt;&lt;mtd&gt;&lt;mstyle displaystyle="false" scriptlevel="0"&gt;&lt;mstyle mathcolor="red"&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/mstyle&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;mtd&gt;&lt;mstyle displaystyle="false" scriptlevel="0"&gt;&lt;mrow&gt;&lt;/mrow&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;mtd&gt;&lt;mstyle displaystyle="false" scriptlevel="0"&gt;&lt;mstyle mathcolor="green"&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/mstyle&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;/mtr&gt;&lt;mtr&gt;&lt;mtd&gt;&lt;mstyle displaystyle="false" scriptlevel="0"&gt;&lt;mstyle mathcolor="red"&gt;&lt;mn&gt;0&lt;/mn&gt;&lt;/mstyle&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;mtd&gt;&lt;mstyle displaystyle="false" scriptlevel="0"&gt;&lt;mrow&gt;&lt;/mrow&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;mtd&gt;&lt;mstyle displaystyle="false" scriptlevel="0"&gt;&lt;mstyle mathcolor="green"&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;/mstyle&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;/mtr&gt;&lt;/mtable&gt;&lt;mo fence="true"&gt;]&lt;/mo&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;\begin{bmatrix}\color{red}{1} &amp;amp;&amp;amp; \color{green}{1} \\ \color{red}{0} &amp;amp;&amp;amp; \color{green}{2}\end{bmatrix}&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:2.40003em;vertical-align:-0.95003em;"&gt;&lt;/span&gt;&lt;span class="minner"&gt;&lt;span class="mopen delimcenter" style="top:0em;"&gt;&lt;span class="delimsizing size3"&gt;[&lt;/span&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mtable"&gt;&lt;span class="col-align-c"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:1.45em;"&gt;&lt;span style="top:-3.61em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord" style="color:red;"&gt;&lt;span class="mord" style="color:red;"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-2.4099999999999997em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord" style="color:red;"&gt;&lt;span class="mord" style="color:red;"&gt;0&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.9500000000000004em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="arraycolsep" style="width:0.5em;"&gt;&lt;/span&gt;&lt;span class="arraycolsep" style="width:0.5em;"&gt;&lt;/span&gt;&lt;span class="col-align-c"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:1.45em;"&gt;&lt;span style="top:-3.4499999999999997em;"&gt;&lt;span class="pstrut" style="height:2.84em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-2.2499999999999996em;"&gt;&lt;span class="pstrut" style="height:2.84em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.9500000000000004em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="arraycolsep" style="width:0.5em;"&gt;&lt;/span&gt;&lt;span class="arraycolsep" style="width:0.5em;"&gt;&lt;/span&gt;&lt;span class="col-align-c"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:1.45em;"&gt;&lt;span style="top:-3.61em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord" style="color:green;"&gt;&lt;span class="mord" style="color:green;"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-2.4099999999999997em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord" style="color:green;"&gt;&lt;span class="mord" style="color:green;"&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.9500000000000004em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose delimcenter" style="top:0em;"&gt;&lt;span class="delimsizing size3"&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="Transformed basis vectors" src="../_media/trans-basis.gif"&gt;&lt;/p&gt;
&lt;p&gt;A matrix transformation is always linear in that it keeps all gridlines in space are parallel and evenly spaced.&lt;/p&gt;
&lt;p&gt;&lt;a href='#3blue1brownVectorsChapter3Essence2016' id='ref-3blue1brownVectorsChapter3Essence2016-1'&gt;3Blue1Brown (2016)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href='#dyeMathematicsMachineLearning' id='ref-dyeMathematicsMachineLearning-1'&gt;Dye et al. (2018)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Image processing is a use case for matrix transformations.&lt;/p&gt;
&lt;p&gt;Since we represent an image as a &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;m&lt;/mi&gt;&lt;mtext&gt; &lt;/mtext&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;mtext&gt; &lt;/mtext&gt;&lt;mi&gt;n&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;m \ x \ n&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.43056em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord mathdefault"&gt;m&lt;/span&gt;&lt;span class="mspace"&gt; &lt;/span&gt;&lt;span class="mord mathdefault"&gt;x&lt;/span&gt;&lt;span class="mspace"&gt; &lt;/span&gt;&lt;span class="mord mathdefault"&gt;n&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; grid of pixels, we can treat the position of each pixel as a vector, then perform a transform of each position vector to transform the entire image.&lt;/p&gt;
&lt;p&gt;In &lt;a href="https://www.kaggle.com/lextoumbourou/image-rotation"&gt;this example&lt;/a&gt;, I rotate an image using the rotational matrix above.&lt;/p&gt;
&lt;p&gt;There's some additional code required:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Create a new matrix that's the maximum possible width and height.&lt;/li&gt;
&lt;li&gt;Convert each position into a vector.&lt;/li&gt;
&lt;li&gt;Convert each position vector, so it's a distance from the center, not top-left.&lt;/li&gt;
&lt;li&gt;Rotate each position.&lt;/li&gt;
&lt;li&gt;Revert convert using a new image size.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;{% notebook permanent/notebooks/rotation-mnist.ipynb cells[1:2] %}&lt;/p&gt;
&lt;p&gt;Note that we end up with some empty pixels in a 45° rotation. These occur because some of the transformed coordinates are floating-point numbers. When they get rounded into integer positions, some of the pixels get excluded. There are many strategies to deal with this, but that's for another article.&lt;/p&gt;
&lt;p&gt;&lt;a href='#agrawalRotatingImage' id='ref-agrawalRotatingImage-1'&gt;Agrawal (202)&lt;/a&gt;&lt;/p&gt;&lt;section id="bib"&gt;&lt;h4&gt;References&lt;/h4&gt;&lt;p id='agrawalRotatingImage'&gt;Gautam Agrawal.
Rotating image by any angle using only &lt;span class="bibtex-protected"&gt;&lt;span class="bibtex-protected"&gt;NumPy&lt;/span&gt;&lt;/span&gt;.
September 202. &lt;a class="cite-backref" href="#ref-agrawalRotatingImage-1" title="Jump back to reference 1"&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;p id='dyeMathematicsMachineLearning'&gt;David Dye, Sam Cooper, and Freddie Page.
Mathematics for &lt;span class="bibtex-protected"&gt;&lt;span class="bibtex-protected"&gt;Machine Learning&lt;/span&gt;&lt;/span&gt;: &lt;span class="bibtex-protected"&gt;&lt;span class="bibtex-protected"&gt;Linear Algebra&lt;/span&gt;&lt;/span&gt; - &lt;span class="bibtex-protected"&gt;&lt;span class="bibtex-protected"&gt;Home&lt;/span&gt;&lt;/span&gt;.
2018. &lt;a class="cite-backref" href="#ref-dyeMathematicsMachineLearning-1" title="Jump back to reference 1"&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;p id='3blue1brownVectorsChapter3Essence2016'&gt;&lt;span class="bibtex-protected"&gt;3Blue1Brown&lt;/span&gt;.
Linear transformations and matrices.
August 2016. &lt;a class="cite-backref" href="#ref-3blue1brownVectorsChapter3Essence2016-1" title="Jump back to reference 1"&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/section&gt;</content><category term="permanent"/><category term="LinearAlgebra"/></entry><entry><title>Basis Vectors</title><link href="http://localhost:8000/basis-vectors.html" rel="alternate"/><published>2021-10-24T00:00:00+10:00</published><updated>2021-10-24T00:00:00+10:00</updated><author><name>Lex Toumbourou</name></author><id>tag:localhost,2021-10-24:/basis-vectors.html</id><summary type="html">&lt;p&gt;The set of vectors that defines space.&lt;/p&gt;</summary><content type="html">&lt;p&gt;The set of &lt;a href="vector.html"&gt;Vector&lt;/a&gt;s that defines space is called the &lt;em&gt;basis&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;We refer to these vectors as &lt;em&gt;basis vectors&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;In 2d space, basis vectors are commonly defined as &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mover accent="true"&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;mo&gt;^&lt;/mo&gt;&lt;/mover&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mrow&gt;&lt;mo fence="true"&gt;[&lt;/mo&gt;&lt;mtable columnspacing="1em" rowspacing="0.15999999999999992em"&gt;&lt;mtr&gt;&lt;mtd&gt;&lt;mstyle displaystyle="false" scriptlevel="0"&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;/mtr&gt;&lt;mtr&gt;&lt;mtd&gt;&lt;mstyle displaystyle="false" scriptlevel="0"&gt;&lt;mn&gt;0&lt;/mn&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;/mtr&gt;&lt;/mtable&gt;&lt;mo fence="true"&gt;]&lt;/mo&gt;&lt;/mrow&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;\hat{i} = \begin{bmatrix}1 \\ 0\end{bmatrix}&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:0.92296em;vertical-align:0em;"&gt;&lt;/span&gt;&lt;span class="mord accent"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.92296em;"&gt;&lt;span style="top:-3em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault"&gt;i&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-3.22852em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="accent-body" style="left:-0.25em;"&gt;^&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:2.40003em;vertical-align:-0.95003em;"&gt;&lt;/span&gt;&lt;span class="minner"&gt;&lt;span class="mopen delimcenter" style="top:0em;"&gt;&lt;span class="delimsizing size3"&gt;[&lt;/span&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mtable"&gt;&lt;span class="col-align-c"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:1.45em;"&gt;&lt;span style="top:-3.61em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-2.4099999999999997em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;0&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.9500000000000004em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose delimcenter" style="top:0em;"&gt;&lt;span class="delimsizing size3"&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; and &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mover accent="true"&gt;&lt;mi&gt;j&lt;/mi&gt;&lt;mo&gt;^&lt;/mo&gt;&lt;/mover&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mrow&gt;&lt;mo fence="true"&gt;[&lt;/mo&gt;&lt;mtable columnspacing="1em" rowspacing="0.15999999999999992em"&gt;&lt;mtr&gt;&lt;mtd&gt;&lt;mstyle displaystyle="false" scriptlevel="0"&gt;&lt;mn&gt;0&lt;/mn&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;/mtr&gt;&lt;mtr&gt;&lt;mtd&gt;&lt;mstyle displaystyle="false" scriptlevel="0"&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;/mtr&gt;&lt;/mtable&gt;&lt;mo fence="true"&gt;]&lt;/mo&gt;&lt;/mrow&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;\hat{j} = \begin{bmatrix}0 \\ 1\end{bmatrix}&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:1.1174em;vertical-align:-0.19444em;"&gt;&lt;/span&gt;&lt;span class="mord accent"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.92296em;"&gt;&lt;span style="top:-3em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathdefault" style="margin-right:0.05724em;"&gt;j&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-3.22852em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="accent-body" style="left:-0.25em;"&gt;^&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.19444em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2777777777777778em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:2.40003em;vertical-align:-0.95003em;"&gt;&lt;/span&gt;&lt;span class="minner"&gt;&lt;span class="mopen delimcenter" style="top:0em;"&gt;&lt;span class="delimsizing size3"&gt;[&lt;/span&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mtable"&gt;&lt;span class="col-align-c"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:1.45em;"&gt;&lt;span style="top:-3.61em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;0&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-2.4099999999999997em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.9500000000000004em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose delimcenter" style="top:0em;"&gt;&lt;span class="delimsizing size3"&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;.&lt;/p&gt;
&lt;p&gt;These particular vectors are called the &lt;em&gt;standard basis vectors&lt;/em&gt;. We can think of them as 1 in the direction of X and 1 in the direction of Y.&lt;/p&gt;
&lt;p&gt;We can think of all other vectors in the space as &lt;a href="Linear Combinations"&gt;Linear Combinations&lt;/a&gt; of the basis vectors.&lt;/p&gt;
&lt;p&gt;For example, if I have vector &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mo fence="true"&gt;[&lt;/mo&gt;&lt;mtable columnspacing="1em" rowspacing="0.15999999999999992em"&gt;&lt;mtr&gt;&lt;mtd&gt;&lt;mstyle displaystyle="false" scriptlevel="0"&gt;&lt;mn&gt;10&lt;/mn&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;/mtr&gt;&lt;mtr&gt;&lt;mtd&gt;&lt;mstyle displaystyle="false" scriptlevel="0"&gt;&lt;mrow&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;mn&gt;7&lt;/mn&gt;&lt;/mrow&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;/mtr&gt;&lt;/mtable&gt;&lt;mo fence="true"&gt;]&lt;/mo&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;\begin{bmatrix}10 \\ -7\end{bmatrix}&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:2.40003em;vertical-align:-0.95003em;"&gt;&lt;/span&gt;&lt;span class="minner"&gt;&lt;span class="mopen delimcenter" style="top:0em;"&gt;&lt;span class="delimsizing size3"&gt;[&lt;/span&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mtable"&gt;&lt;span class="col-align-c"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:1.45em;"&gt;&lt;span style="top:-3.61em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;1&lt;/span&gt;&lt;span class="mord"&gt;0&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-2.4099999999999997em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;−&lt;/span&gt;&lt;span class="mord"&gt;7&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.9500000000000004em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose delimcenter" style="top:0em;"&gt;&lt;span class="delimsizing size3"&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;, we can treat each component as scalar (see &lt;a href="vector scaling.html"&gt;Vector Scaling&lt;/a&gt;) for the basis vectors: &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mn&gt;10&lt;/mn&gt;&lt;mrow&gt;&lt;mo fence="true"&gt;[&lt;/mo&gt;&lt;mtable columnspacing="1em" rowspacing="0.15999999999999992em"&gt;&lt;mtr&gt;&lt;mtd&gt;&lt;mstyle displaystyle="false" scriptlevel="0"&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;/mtr&gt;&lt;mtr&gt;&lt;mtd&gt;&lt;mstyle displaystyle="false" scriptlevel="0"&gt;&lt;mn&gt;0&lt;/mn&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;/mtr&gt;&lt;/mtable&gt;&lt;mo fence="true"&gt;]&lt;/mo&gt;&lt;/mrow&gt;&lt;mo&gt;+&lt;/mo&gt;&lt;mo stretchy="false"&gt;(&lt;/mo&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;mn&gt;7&lt;/mn&gt;&lt;mo stretchy="false"&gt;)&lt;/mo&gt;&lt;mrow&gt;&lt;mo fence="true"&gt;[&lt;/mo&gt;&lt;mtable columnspacing="1em" rowspacing="0.15999999999999992em"&gt;&lt;mtr&gt;&lt;mtd&gt;&lt;mstyle displaystyle="false" scriptlevel="0"&gt;&lt;mn&gt;0&lt;/mn&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;/mtr&gt;&lt;mtr&gt;&lt;mtd&gt;&lt;mstyle displaystyle="false" scriptlevel="0"&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;/mtr&gt;&lt;/mtable&gt;&lt;mo fence="true"&gt;]&lt;/mo&gt;&lt;/mrow&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;10\begin{bmatrix}1 \\ 0\end{bmatrix} + (-7)\begin{bmatrix}0 \\ 1\end{bmatrix}&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span aria-hidden="true" class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:2.40003em;vertical-align:-0.95003em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;1&lt;/span&gt;&lt;span class="mord"&gt;0&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="minner"&gt;&lt;span class="mopen delimcenter" style="top:0em;"&gt;&lt;span class="delimsizing size3"&gt;[&lt;/span&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mtable"&gt;&lt;span class="col-align-c"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:1.45em;"&gt;&lt;span style="top:-3.61em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-2.4099999999999997em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;0&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.9500000000000004em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose delimcenter" style="top:0em;"&gt;&lt;span class="delimsizing size3"&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;+&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.2222222222222222em;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut" style="height:2.40003em;vertical-align:-0.95003em;"&gt;&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord"&gt;−&lt;/span&gt;&lt;span class="mord"&gt;7&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;span class="mspace" style="margin-right:0.16666666666666666em;"&gt;&lt;/span&gt;&lt;span class="minner"&gt;&lt;span class="mopen delimcenter" style="top:0em;"&gt;&lt;span class="delimsizing size3"&gt;[&lt;/span&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mtable"&gt;&lt;span class="col-align-c"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:1.45em;"&gt;&lt;span style="top:-3.61em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;0&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="top:-2.4099999999999997em;"&gt;&lt;span class="pstrut" style="height:3em;"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist" style="height:0.9500000000000004em;"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose delimcenter" style="top:0em;"&gt;&lt;span class="delimsizing size3"&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;.&lt;/p&gt;
&lt;p&gt;We can choose any set of vectors as the basis vectors for space, giving us entirely new coordinate systems. However, they must meet the following criteria:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;They're linear independent. That means you cannot get one &lt;a href="vector.html"&gt;Vector&lt;/a&gt; by just scaling the other.&lt;/li&gt;
&lt;li&gt;They span the space. That means, by taking a linear combination of the two scaled vectors, you can return any vector.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Basis vectors don't have to be orthogonal to each other, but transformations become more challenging with a non-orthogonal basis.&lt;/p&gt;
&lt;p&gt;&lt;a href='#3blue1brownVectorsChapter2Essence2016' id='ref-3blue1brownVectorsChapter2Essence2016-1'&gt;3Blue1Brown (2016)&lt;/a&gt;
&lt;a href='#dyeMathematicsMachineLearning' id='ref-dyeMathematicsMachineLearning-1'&gt;Dye et al. (2018)&lt;/a&gt;&lt;/p&gt;&lt;section id="bib"&gt;&lt;h4&gt;References&lt;/h4&gt;&lt;p id='dyeMathematicsMachineLearning'&gt;David Dye, Sam Cooper, and Freddie Page.
Mathematics for &lt;span class="bibtex-protected"&gt;&lt;span class="bibtex-protected"&gt;Machine Learning&lt;/span&gt;&lt;/span&gt;: &lt;span class="bibtex-protected"&gt;&lt;span class="bibtex-protected"&gt;Linear Algebra&lt;/span&gt;&lt;/span&gt; - &lt;span class="bibtex-protected"&gt;&lt;span class="bibtex-protected"&gt;Home&lt;/span&gt;&lt;/span&gt;.
2018. &lt;a class="cite-backref" href="#ref-dyeMathematicsMachineLearning-1" title="Jump back to reference 1"&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;p id='3blue1brownVectorsChapter2Essence2016'&gt;&lt;span class="bibtex-protected"&gt;3Blue1Brown&lt;/span&gt;.
Linear combinations, span, and basis vectors.
August 2016. &lt;a class="cite-backref" href="#ref-3blue1brownVectorsChapter2Essence2016-1" title="Jump back to reference 1"&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/section&gt;</content><category term="permanent"/><category term="LinearAlgebra"/></entry></feed>