PageSourceSearch

https://www.logml.ai/speaker.html

html logml.ai collected 2026-09-24 11:45:16 UTC 31,709 bytes, 897 lines download raw bytes

1<!DOCTYPE html>
2<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en"><head>
3
4<meta charset="utf-8">
5<meta name="generator" content="quarto-1.6.40">
6
7<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes">
8
9
10<title>Speakers – LOGML 2026</title>
11<style>
12code{white-space: pre-wrap;}
13span.smallcaps{font-variant: small-caps;}
14div.columns{display: flex; gap: min(4vw, 1.5em);}
15div.column{flex: auto; overflow-x: auto;}
16div.hanging-indent{margin-left: 1.5em; text-indent: -1.5em;}
17ul.task-list{list-style: none;}
18ul.task-list li input[type="checkbox"] {
19  width: 0.8em;
20  margin: 0 0.8em 0.2em -1em; /* quarto-specific, see https://github.com/quarto-dev/quarto-cli/issues/4556 */ 
21  vertical-align: middle;
22}
23</style>
24
25
26<script src="site_libs/quarto-nav/quarto-nav.js"></script>
vendor: 1 bytes, line 26
26
27<script src="site_libs/clipboard/clipboard.min.js"></script>
vendor: 1 bytes, line 27
27
28<script src="site_libs/quarto-search/autocomplete.umd.js"></script>
vendor: 1 bytes, line 28
28
29<script src="site_libs/quarto-search/fuse.min.js"></script>
vendor: 1 bytes, line 29
29
30<script src="site_libs/quarto-search/quarto-search.js"></script>
30
31<meta name="quarto:offset" content="./">
32<link href="./favicon.ico" rel="icon">
33<script src="site_libs/quarto-listing/list.min.js"></script>
vendor: 1 bytes, line 33
33
34<script src="site_libs/quarto-listing/quarto-listing.js"></script>
vendor: 1 bytes, line 34
34
35<script src="site_libs/quarto-html/quarto.js"></script>
vendor: 1 bytes, line 35
35
36<script src="site_libs/quarto-html/popper.min.js"></script>
vendor: 1 bytes, line 36
36
37<script src="site_libs/quarto-html/tippy.umd.min.js"></script>
vendor: 1 bytes, line 37
37
38<script src="site_libs/quarto-html/anchor.min.js"></script>
38
39<link href="site_libs/quarto-html/tippy.css" rel="stylesheet">
40<link href="site_libs/quarto-html/quarto-syntax-highlighting-549806ee2085284f45b00abea8c6df48.css" rel="stylesheet" id="quarto-text-highlighting-styles">
41<script src="site_libs/bootstrap/bootstrap.min.js"></script>
41
42<link href="site_libs/bootstrap/bootstrap-icons.css" rel="stylesheet">
43<link href="site_libs/bootstrap/bootstrap-f239b952b3453a68574901cf4d3afaf7.min.css" rel="stylesheet" append-hash="true" id="quarto-bootstrap" data-mode="light">
44<link href="site_libs/quarto-contrib/fontawesome6-1.2.0/all.min.css" rel="stylesheet">
45<link href="site_libs/quarto-contrib/fontawesome6-1.2.0/latex-fontsize.css" rel="stylesheet">
46<script id="quarto-search-options" type="application/json">{
47  "location": "navbar",
48  "copy-button": false,
49  "collapse-after": 3,
50  "panel-placement": "end",
51  "type": "overlay",
52  "limit": 50,
53  "keyboard-shortcut": [
54    "f",
55    "/",
56    "s"
57  ],
58  "show-item-context": false,
59  "language": {
60    "search-no-results-text": "No results",
61    "search-matching-documents-text": "matching documents",
62    "search-copy-link-title": "Copy link to search",
63    "search-hide-matches-text": "Hide additional matches",
64    "search-more-match-text": "more match in this document",
65    "search-more-matches-text": "more matches in this document",
66    "search-clear-button-title": "Clear",
67    "search-text-placeholder": "",
68    "search-detached-cancel-button-title": "Cancel",
69    "search-submit-button-title": "Submit",
70    "search-label": "Search"
71  }
72}</script>
vendor: 1 bytes, line 72
72
73<script>
74
75  window.document.addEventListener("DOMContentLoaded", function (_event) {
76    const listingTargetEl = window.document.querySelector('#listing-listing .list');
77    if (!listingTargetEl) {
78      // No listing discovered, do not attach.
79      return; 
80    }
81
82    const options = {
83      valueNames: ['listing-title','listing-description','listing-image',{ data: ['index'] },{ data: ['categories'] },{ data: ['listing-date-sort'] },{ data: ['listing-file-modified-sort'] }],
84      
85      searchColumns: ["listing-title","listing-author","listing-image","listing-description"],
86    };
87
88    window['quarto-listings'] = window['quarto-listings'] || {};
89    window['quarto-listings']['listing-listing'] = new List('listing-listing', options);
90
91    if (window['quarto-listing-loaded']) {
92      window['quarto-listing-loaded']();
93    }
94  });
95
96  window.addEventListener('hashchange',() => {
97    if (window['quarto-listing-loaded']) {
98      window['quarto-listing-loaded']();
99    }
100  })
101  </script>
101
102
103  
103<script src="https://cdnjs.cloudflare.com/polyfill/v3/polyfill.min.js?features=es6"></script>
103
104  
104<script src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-chtml-full.js" type="text/javascript"></script>
104
105
106<script type="text/javascript">
107const typesetMath = (el) => {
108  if (window.MathJax) {
109    // MathJax Typeset
110    window.MathJax.typeset([el]);
111  } else if (window.katex) {
112    // KaTeX Render
113    var mathElements = el.getElementsByClassName("math");
114    var macros = [];
115    for (var i = 0; i < mathElements.length; i++) {
116      var texText = mathElements[i].firstChild;
117      if (mathElements[i].tagName == "SPAN") {
118        window.katex.render(texText.data, mathElements[i], {
119          displayMode: mathElements[i].classList.contains('display'),
120          throwOnError: false,
121          macros: macros,
122          fleqn: false
123        });
124      }
125    }
126  }
127}
128window.Quarto = {
129  typesetMath
130};
131</script>
131
132
133<link rel="stylesheet" href="styles.css">
134<meta name="twitter:title" content="LOGML 2026">
135<meta name="twitter:description" content="London Geometry and Machine Learning Summer School, July 13-17 2026">
136<meta name="twitter:image" content="https://www.logml.ai/img/logo.png">
137<meta name="twitter:site" content="@LogmlSchool">
138<meta name="twitter:card" content="summary">
139</head>
140
141<body class="nav-fixed">
142
143<div id="quarto-search-results"></div>
144  <header id="quarto-header" class="headroom fixed-top">
145    <nav class="navbar navbar-expand-lg " data-bs-theme="dark">
146      <div class="navbar-container container-fluid">
147      <div class="navbar-brand-container mx-auto">
148    <a href="./index.html" class="navbar-brand navbar-brand-logo">
149    <img src="./logo.png" alt="" class="navbar-logo">
150    </a>
151    <a class="navbar-brand" href="./index.html">
152    <span class="navbar-title">LOGML 2026</span>
153    </a>
154  </div>
155            <div id="quarto-search" class="" title="Search"></div>
156          <button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarCollapse" aria-controls="navbarCollapse" role="menu" aria-expanded="false" aria-label="Toggle navigation" onclick="if (window.quartoToggleHeadroom) { window.quartoToggleHeadroom(); }">
157  <span class="navbar-toggler-icon"></span>
158</button>
159          <div class="collapse navbar-collapse" id="navbarCollapse">
160            <ul class="navbar-nav navbar-nav-scroll me-auto">
161  <li class="nav-item">
162    <a class="nav-link active" href="./speaker.html" aria-current="page"> 
163<span class="menu-text">Speakers</span></a>
164  </li>  
165  <li class="nav-item">
166    <a class="nav-link" href="./projects.html"> 
167<span class="menu-text">Projects &amp; Mentors</span></a>
168  </li>  
169  <li class="nav-item">
170    <a class="nav-link" href="./people.html"> 
171<span class="menu-text">People</span></a>
172  </li>  
173  <li class="nav-item">
174    <a class="nav-link" href="./sponsors.html"> 
175<span class="menu-text">Sponsors</span></a>
176  </li>  
177  <li class="nav-item">
178    <a class="nav-link" href="./policies.html"> 
179<span class="menu-text">Policies</span></a>
180  </li>  
181  <li class="nav-item">
182    <a class="nav-link" href="./program.html"> 
183<span class="menu-text">Program</span></a>
184  </li>  
185  <li class="nav-item">
186    <a class="nav-link" href="./logml2026/speaker.html"> 
187<span class="menu-text">Archives</span></a>
188  </li>  
189</ul>
190            <ul class="navbar-nav navbar-nav-scroll ms-auto">
191  <li class="nav-item compact">
192    <a class="nav-link" href="mailto:[email protected]"> <i class="bi bi-envelope" role="img">
193</i> 
194<span class="menu-text"></span></a>
195  </li>  
196  <li class="nav-item compact">
197    <a class="nav-link" href="https://www.linkedin.com/company/logml/"> <i class="bi bi-linkedin" role="img">
198</i> 
199<span class="menu-text"></span></a>
200  </li>  
201  <li class="nav-item compact">
202    <a class="nav-link" href="https://x.com/LogmlSchool"> <i class="bi bi-twitter-x" role="img">
203</i> 
204<span class="menu-text"></span></a>
205  </li>  
206  <li class="nav-item">
207    <a class="nav-link" href="https://bsky.app/profile/logml.bsky.social"> 
208<span class="menu-text"><i class="fa-brands fa-bluesky" aria-label="bluesky"></i></span></a>
209  </li>  
210  <li class="nav-item compact">
211    <a class="nav-link" href="https://www.youtube.com/@logmlsummerschool"> <i class="bi bi-youtube" role="img">
212</i> 
213<span class="menu-text"></span></a>
214  </li>  
215  <li class="nav-item compact">
216    <a class="nav-link" href="https://www.instagram.com/logml.ig/"> <i class="bi bi-instagram" role="img">
217</i> 
218<span class="menu-text"></span></a>
219  </li>  
220</ul>
221          </div> <!-- /navcollapse -->
222            <div class="quarto-navbar-tools">
223</div>
224      </div> <!-- /container-fluid -->
225    </nav>
226</header>
227<!-- content -->
228<div id="quarto-content" class="quarto-container page-columns page-rows-contents page-layout-full page-navbar">
229<!-- sidebar -->
230<!-- margin-sidebar -->
231    <div id="quarto-margin-sidebar" class="sidebar margin-sidebar zindex-bottom">
232        
233    </div>
234<!-- main -->
235<main class="content column-page" id="quarto-document-content">
236
237<header id="title-block-header" class="quarto-title-block default">
238<div class="quarto-title">
239<h1 class="title">Speakers</h1>
240</div>
241
242
243
244<div class="quarto-title-meta column-page">
245
246    
247  
248    
249  </div>
250  
251
252
253</header>
254
255
256<nav aria-label="breadcrumb">
257  <ol class="breadcrumb">
258    <li class="breadcrumb-item"><a href="index.html">Home</a></li>
259    <li class="breadcrumb-item active" aria-current="page">Speakers</li>
260  </ol>
261</nav>
262
263
264
265
266<div class="quarto-listing quarto-listing-container-grid" id="listing-listing">
267<div class="list grid quarto-listing-cols-4">
268<div class="g-col-1" data-index="0" data-listing-file-modified-sort="1773855571547" data-listing-reading-time-sort="2" data-listing-word-count-sort="227">
269<a href="./speakers/ismail.html" class="quarto-grid-link">
270<div class="quarto-grid-item card h-100 card-left">
271<p class="card-img-top">
272<img loading="lazy" src="./speakers/ismail.jpg" class="thumbnail-image card-img" style="height: 200px;">
273</p>
274<div class="card-body post-contents">
275<h5 class="no-anchor card-title listing-title">
276Ismail Ilkan Ceylan
277</h5>
278<div class="card-text listing-description">
279TU Vienna, AITHYRA, University of Oxford
280</div>
281</div>
282</div>
283</a>
284</div>
285<div class="g-col-1" data-index="1" data-listing-file-modified-sort="1774285746580" data-listing-reading-time-sort="1" data-listing-word-count-sort="107">
286<a href="./speakers/xiaowen.html" class="quarto-grid-link">
287<div class="quarto-grid-item card h-100 card-left">
288<p class="card-img-top">
289<img loading="lazy" src="./speakers/xiaowen.jpg" class="thumbnail-image card-img" style="height: 200px;">
290</p>
291<div class="card-body post-contents">
292<h5 class="no-anchor card-title listing-title">
293Xiaowen Dong
294</h5>
295<div class="card-text listing-description">
296University of Oxford
297</div>
298</div>
299</div>
300</a>
301</div>
302<div class="g-col-1" data-index="2" data-listing-file-modified-sort="1773856449582" data-listing-reading-time-sort="1" data-listing-word-count-sort="101">
303<a href="./speakers/olga.html" class="quarto-grid-link">
304<div class="quarto-grid-item card h-100 card-left">
305<p class="card-img-top">
306<img loading="lazy" src="./speakers/olga.jpg" class="thumbnail-image card-img" style="height: 200px;">
307</p>
308<div class="card-body post-contents">
309<h5 class="no-anchor card-title listing-title">
310Olga Fink
311</h5>
312<div class="card-text listing-description">
313EPFL
314</div>
315</div>
316</div>
317</a>
318</div>
319<div class="g-col-1" data-index="3" data-listing-file-modified-sort="1771868043133" data-listing-reading-time-sort="2" data-listing-word-count-sort="201">
320<a href="./speakers/stefanie.html" class="quarto-grid-link">
321<div class="quarto-grid-item card h-100 card-left">
322<p class="card-img-top">
323<img loading="lazy" src="./speakers/stefanie.webp" class="thumbnail-image card-img" style="height: 200px;">
324</p>
325<div class="card-body post-contents">
326<h5 class="no-anchor card-title listing-title">
327Stefanie Jegelka
328</h5>
329<div class="card-text listing-description">
330MIT, TUM
331</div>
332</div>
333</div>
334</a>
335</div>
336<div class="g-col-1" data-index="4" data-listing-file-modified-sort="1771365467828" data-listing-reading-time-sort="1" data-listing-word-count-sort="98">
337<a href="./speakers/giovanni.html" class="quarto-grid-link">
338<div class="quarto-grid-item card h-100 card-left">
339<p class="card-img-top">
340<img loading="lazy" src="./speakers/giovanni.png" class="thumbnail-image card-img" style="height: 200px;">
341</p>
342<div class="card-body post-contents">
343<h5 class="no-anchor card-title listing-title">
344Giovanni Luca Marchetti
345</h5>
346<div class="card-text listing-description">
347Royal Institute of Technology (KTH), Stockholm
348</div>
349</div>
350</div>
351</a>
352</div>
353<div class="g-col-1" data-index="5" data-listing-file-modified-sort="1771867553466" data-listing-reading-time-sort="1" data-listing-word-count-sort="138">
354<a href="./speakers/nicholas.html" class="quarto-grid-link">
355<div class="quarto-grid-item card h-100 card-left">
356<p class="card-img-top">
357<img loading="lazy" src="./speakers/nicholas.jpg" class="thumbnail-image card-img" style="height: 200px;">
358</p>
359<div class="card-body post-contents">
360<h5 class="no-anchor card-title listing-title">
361Nicholas Sharp
362</h5>
363<div class="card-text listing-description">
364NVIDIA
365</div>
366</div>
367</div>
368</a>
369</div>
370<div class="g-col-1" data-index="6" data-listing-file-modified-sort="1773856720818" data-listing-reading-time-sort="1" data-listing-word-count-sort="100">
371<a href="./speakers/dorina.html" class="quarto-grid-link">
372<div class="quarto-grid-item card h-100 card-left">
373<p class="card-img-top">
374<img loading="lazy" src="./speakers/dorina.jpg" class="thumbnail-image card-img" style="height: 200px;">
375</p>
376<div class="card-body post-contents">
377<h5 class="no-anchor card-title listing-title">
378Dorina Thanou
379</h5>
380<div class="card-text listing-description">
381EPFL
382</div>
383</div>
384</div>
385</a>
386</div>
387<div class="g-col-1" data-index="7" data-listing-file-modified-sort="1773857773258" data-listing-reading-time-sort="1" data-listing-word-count-sort="106">
388<a href="./speakers/soledad.html" class="quarto-grid-link">
389<div class="quarto-grid-item card h-100 card-left">
390<p class="card-img-top">
391<img loading="lazy" src="./speakers/soledad.jpg" class="thumbnail-image card-img" style="height: 200px;">
392</p>
393<div class="card-body post-contents">
394<h5 class="no-anchor card-title listing-title">
395Soledad Villar
396</h5>
397<div class="card-text listing-description">
398Johns Hopkins University
399</div>
400</div>
401</div>
402</a>
403</div>
404<div class="g-col-1" data-index="8" data-listing-file-modified-sort="1771868575741" data-listing-reading-time-sort="1" data-listing-word-count-sort="139">
405<a href="./speakers/pascal.html" class="quarto-grid-link">
406<div class="quarto-grid-item card h-100 card-left">
407<p class="card-img-top">
408<img loading="lazy" src="./speakers/pascal.jpg" class="thumbnail-image card-img" style="height: 200px;">
409</p>
410<div class="card-body post-contents">
411<h5 class="no-anchor card-title listing-title">
412Pascal Welke
413</h5>
414<div class="card-text listing-description">
415Lancaster University Leipzig, TU Vienna
416</div>
417</div>
418</div>
419</a>
420</div>
421</div>
422<div class="listing-no-matching d-none">
423No matching items
424</div>
425</div></main> <!-- /main -->
426<script id="quarto-html-after-body" type="application/javascript">
427window.document.addEventListener("DOMContentLoaded", function (event) {
428  const toggleBodyColorMode = (bsSheetEl) => {
429    const mode = bsSheetEl.getAttribute("data-mode");
430    const bodyEl = window.document.querySelector("body");
431    if (mode === "dark") {
432      bodyEl.classList.add("quarto-dark");
433      bodyEl.classList.remove("quarto-light");
434    } else {
435      bodyEl.classList.add("quarto-light");
436      bodyEl.classList.remove("quarto-dark");
437    }
438  }
439  const toggleBodyColorPrimary = () => {
440    const bsSheetEl = window.document.querySelector("link#quarto-bootstrap");
441    if (bsSheetEl) {
442      toggleBodyColorMode(bsSheetEl);
443    }
444  }
445  toggleBodyColorPrimary();  
446  const icon = "";
447  const anchorJS = new window.AnchorJS();
448  anchorJS.options = {
449    placement: 'right',
450    icon: icon
451  };
452  anchorJS.add('.anchored');
453  const isCodeAnnotation = (el) => {
454    for (const clz of el.classList) {
455      if (clz.startsWith('code-annotation-')) {                     
456        return true;
457      }
458    }
459    return false;
460  }
461  const onCopySuccess = function(e) {
462    // button target
463    const button = e.trigger;
464    // don't keep focus
465    button.blur();
466    // flash "checked"
467    button.classList.add('code-copy-button-checked');
468    var currentTitle = button.getAttribute("title");
469    button.setAttribute("title", "Copied!");
470    let tooltip;
471    if (window.bootstrap) {
472      button.setAttribute("data-bs-toggle", "tooltip");
473      button.setAttribute("data-bs-placement", "left");
474      button.setAttribute("data-bs-title", "Copied!");
475      tooltip = new bootstrap.Tooltip(button, 
476        { trigger: "manual", 
477          customClass: "code-copy-button-tooltip",
478          offset: [0, -8]});
479      tooltip.show();    
480    }
481    setTimeout(function() {
482      if (tooltip) {
483        tooltip.hide();
484        button.removeAttribute("data-bs-title");
485        button.removeAttribute("data-bs-toggle");
486        button.removeAttribute("data-bs-placement");
487      }
488      button.setAttribute("title", currentTitle);
489      button.classList.remove('code-copy-button-checked');
490    }, 1000);
491    // clear code selection
492    e.clearSelection();
493  }
494  const getTextToCopy = function(trigger) {
495      const codeEl = trigger.previousElementSibling.cloneNode(true);
496      for (const childEl of codeEl.children) {
497        if (isCodeAnnotation(childEl)) {
498          childEl.remove();
499        }
500      }
501      return codeEl.innerText;
502  }
503  const clipboard = new window.ClipboardJS('.code-copy-button:not([data-in-quarto-modal])', {
504    text: getTextToCopy
505  });
506  clipboard.on('success', onCopySuccess);
507  if (window.document.getElementById('quarto-embedded-source-code-modal')) {
508    const clipboardModal = new window.ClipboardJS('.code-copy-button[data-in-quarto-modal]', {
509      text: getTextToCopy,
510      container: window.document.getElementById('quarto-embedded-source-code-modal')
511    });
512    clipboardModal.on('success', onCopySuccess);
513  }
514    var localhostRegex = new RegExp(/^(?:http|https):\/\/localhost\:?[0-9]*\//);
515    var mailtoRegex = new RegExp(/^mailto:/);
516      var filterRegex = new RegExp('/' + window.location.host + '/');
517    var isInternal = (href) => {
518        return filterRegex.test(href) || localhostRegex.test(href) || mailtoRegex.test(href);
519    }
520    // Inspect non-navigation links and adorn them if external
521 	var links = window.document.querySelectorAll('a[href]:not(.nav-link):not(.navbar-brand):not(.toc-action):not(.sidebar-link):not(.sidebar-item-toggle):not(.pagination-link):not(.no-external):not([aria-hidden]):not(.dropdown-item):not(.quarto-navigation-tool):not(.about-link)');
522    for (var i=0; i<links.length; i++) {
523      const link = links[i];
524      if (!isInternal(link.href)) {
525        // undo the damage that might have been done by quarto-nav.js in the case of
526        // links that we want to consider external
527        if (link.dataset.originalHref !== undefined) {
528          link.href = link.dataset.originalHref;
529        }
530      }
531    }
532  function tippyHover(el, contentFn, onTriggerFn, onUntriggerFn) {
533    const config = {
534      allowHTML: true,
535      maxWidth: 500,
536      delay: 100,
537      arrow: false,
538      appendTo: function(el) {
539          return el.parentElement;
540      },
541      interactive: true,
542      interactiveBorder: 10,
543      theme: 'quarto',
544      placement: 'bottom-start',
545    };
546    if (contentFn) {
547      config.content = contentFn;
548    }
549    if (onTriggerFn) {
550      config.onTrigger = onTriggerFn;
551    }
552    if (onUntriggerFn) {
553      config.onUntrigger = onUntriggerFn;
554    }
555    window.tippy(el, config); 
556  }
557  const noterefs = window.document.querySelectorAll('a[role="doc-noteref"]');
558  for (var i=0; i<noterefs.length; i++) {
559    const ref = noterefs[i];
560    tippyHover(ref, function() {
561      // use id or data attribute instead here
562      let href = ref.getAttribute('data-footnote-href') || ref.getAttribute('href');
563      try { href = new URL(href).hash; } catch {}
564      const id = href.replace(/^#\/?/, "");
565      const note = window.document.getElementById(id);
566      if (note) {
567        return note.innerHTML;
568      } else {
569        return "";
570      }
571    });
572  }
573  const xrefs = window.document.querySelectorAll('a.quarto-xref');
574  const processXRef = (id, note) => {
575    // Strip column container classes
576    const stripColumnClz = (el) => {
577      el.classList.remove("page-full", "page-columns");
578      if (el.children) {
579        for (const child of el.children) {
580          stripColumnClz(child);
581        }
582      }
583    }
584    stripColumnClz(note)
585    if (id === null || id.startsWith('sec-')) {
586      // Special case sections, only their first couple elements
587      const container = document.createElement("div");
588      if (note.children && note.children.length > 2) {
589        container.appendChild(note.children[0].cloneNode(true));
590        for (let i = 1; i < note.children.length; i++) {
591          const child = note.children[i];
592          if (child.tagName === "P" && child.innerText === "") {
593            continue;
594          } else {
595            container.appendChild(child.cloneNode(true));
596            break;
597          }
598        }
599        if (window.Quarto?.typesetMath) {
600          window.Quarto.typesetMath(container);
601        }
602        return container.innerHTML
603      } else {
604        if (window.Quarto?.typesetMath) {
605          window.Quarto.typesetMath(note);
606        }
607        return note.innerHTML;
608      }
609    } else {
610      // Remove any anchor links if they are present
611      const anchorLink = note.querySelector('a.anchorjs-link');
612      if (anchorLink) {
613        anchorLink.remove();
614      }
615      if (window.Quarto?.typesetMath) {
616        window.Quarto.typesetMath(note);
617      }
618      if (note.classList.contains("callout")) {
619        return note.outerHTML;
620      } else {
621        return note.innerHTML;
622      }
623    }
624  }
625  for (var i=0; i<xrefs.length; i++) {
626    const xref = xrefs[i];
627    tippyHover(xref, undefined, function(instance) {
628      instance.disable();
629      let url = xref.getAttribute('href');
630      let hash = undefined; 
631      if (url.startsWith('#')) {
632        hash = url;
633      } else {
634        try { hash = new URL(url).hash; } catch {}
635      }
636      if (hash) {
637        const id = hash.replace(/^#\/?/, "");
638        const note = window.document.getElementById(id);
639        if (note !== null) {
640          try {
641            const html = processXRef(id, note.cloneNode(true));
642            instance.setContent(html);
643          } finally {
644            instance.enable();
645            instance.show();
646          }
647        } else {
648          // See if we can fetch this
649          fetch(url.split('#')[0])
650          .then(res => res.text())
651          .then(html => {
652            const parser = new DOMParser();
653            const htmlDoc = parser.parseFromString(html, "text/html");
654            const note = htmlDoc.getElementById(id);
655            if (note !== null) {
656              const html = processXRef(id, note);
657              instance.setContent(html);
658            } 
659          }).finally(() => {
660            instance.enable();
661            instance.show();
662          });
663        }
664      } else {
665        // See if we can fetch a full url (with no hash to target)
666        // This is a special case and we should probably do some content thinning / targeting
667        fetch(url)
668        .then(res => res.text())
669        .then(html => {
670          const parser = new DOMParser();
671          const htmlDoc = parser.parseFromString(html, "text/html");
672          const note = htmlDoc.querySelector('main.content');
673          if (note !== null) {
674            // This should only happen for chapter cross references
675            // (since there is no id in the URL)
676            // remove the first header
677            if (note.children.length > 0 && note.children[0].tagName === "HEADER") {
678              note.children[0].remove();
679            }
680            const html = processXRef(null, note);
681            instance.setContent(html);
682          } 
683        }).finally(() => {
684          instance.enable();
685          instance.show();
686        });
687      }
688    }, function(instance) {
689    });
690  }
691      let selectedAnnoteEl;
692      const selectorForAnnotation = ( cell, annotation) => {
693        let cellAttr = 'data-code-cell="' + cell + '"';
694        let lineAttr = 'data-code-annotation="' +  annotation + '"';
695        const selector = 'span[' + cellAttr + '][' + lineAttr + ']';
696        return selector;
697      }
698      const selectCodeLines = (annoteEl) => {
699        const doc = window.document;
700        const targetCell = annoteEl.getAttribute("data-target-cell");
701        const targetAnnotation = annoteEl.getAttribute("data-target-annotation");
702        const annoteSpan = window.document.querySelector(selectorForAnnotation(targetCell, targetAnnotation));
703        const lines = annoteSpan.getAttribute("data-code-lines").split(",");
704        const lineIds = lines.map((line) => {
705          return targetCell + "-" + line;
706        })
707        let top = null;
708        let height = null;
709        let parent = null;
710        if (lineIds.length > 0) {
711            //compute the position of the single el (top and bottom and make a div)
712            const el = window.document.getElementById(lineIds[0]);
713            top = el.offsetTop;
714            height = el.offsetHeight;
715            parent = el.parentElement.parentElement;
716          if (lineIds.length > 1) {
717            const lastEl = window.document.getElementById(lineIds[lineIds.length - 1]);
718            const bottom = lastEl.offsetTop + lastEl.offsetHeight;
719            height = bottom - top;
720          }
721          if (top !== null && height !== null && parent !== null) {
722            // cook up a div (if necessary) and position it 
723            let div = window.document.getElementById("code-annotation-line-highlight");
724            if (div === null) {
725              div = window.document.createElement("div");
726              div.setAttribute("id", "code-annotation-line-highlight");
727              div.style.position = 'absolute';
728              parent.appendChild(div);
729            }
730            div.style.top = top - 2 + "px";
731            div.style.height = height + 4 + "px";
732            div.style.left = 0;
733            let gutterDiv = window.document.getElementById("code-annotation-line-highlight-gutter");
734            if (gutterDiv === null) {
735              gutterDiv = window.document.createElement("div");
736              gutterDiv.setAttribute("id", "code-annotation-line-highlight-gutter");
737              gutterDiv.style.position = 'absolute';
738              const codeCell = window.document.getElementById(targetCell);
739              const gutter = codeCell.querySelector('.code-annotation-gutter');
740              gutter.appendChild(gutterDiv);
741            }
742            gutterDiv.style.top = top - 2 + "px";
743            gutterDiv.style.height = height + 4 + "px";
744          }
745          selectedAnnoteEl = annoteEl;
746        }
747      };
748      const unselectCodeLines = () => {
749        const elementsIds = ["code-annotation-line-highlight", "code-annotation-line-highlight-gutter"];
750        elementsIds.forEach((elId) => {
751          const div = window.document.getElementById(elId);
752          if (div) {
753            div.remove();
754          }
755        });
756        selectedAnnoteEl = undefined;
757      };
758        // Handle positioning of the toggle
759    window.addEventListener(
760      "resize",
761      throttle(() => {
762        elRect = undefined;
763        if (selectedAnnoteEl) {
764          selectCodeLines(selectedAnnoteEl);
765        }
766      }, 10)
767    );
768    function throttle(fn, ms) {
769    let throttle = false;
770    let timer;
771      return (...args) => {
772        if(!throttle) { // first call gets through
773            fn.apply(this, args);
774            throttle = true;
775        } else { // all the others get throttled
776            if(timer) clearTimeout(timer); // cancel #2
777            timer = setTimeout(() => {
778              fn.apply(this, args);
779              timer = throttle = false;
780            }, ms);
781        }
782      };
783    }
784      // Attach click handler to the DT
785      const annoteDls = window.document.querySelectorAll('dt[data-target-cell]');
786      for (const annoteDlNode of annoteDls) {
787        annoteDlNode.addEventListener('click', (event) => {
788          const clickedEl = event.target;
789          if (clickedEl !== selectedAnnoteEl) {
790            unselectCodeLines();
791            const activeEl = window.document.querySelector('dt[data-target-cell].code-annotation-active');
792            if (activeEl) {
793              activeEl.classList.remove('code-annotation-active');
794            }
795            selectCodeLines(clickedEl);
796            clickedEl.classList.add('code-annotation-active');
797          } else {
798            // Unselect the line
799            unselectCodeLines();
800            clickedEl.classList.remove('code-annotation-active');
801          }
802        });
803      }
804  const findCites = (el) => {
805    const parentEl = el.parentElement;
806    if (parentEl) {
807      const cites = parentEl.dataset.cites;
808      if (cites) {
809        return {
810          el,
811          cites: cites.split(' ')
812        };
813      } else {
814        return findCites(el.parentElement)
815      }
816    } else {
817      return undefined;
818    }
819  };
820  var bibliorefs = window.document.querySelectorAll('a[role="doc-biblioref"]');
821  for (var i=0; i<bibliorefs.length; i++) {
822    const ref = bibliorefs[i];
823    const citeInfo = findCites(ref);
824    if (citeInfo) {
825      tippyHover(citeInfo.el, function() {
826        var popup = window.document.createElement('div');
827        citeInfo.cites.forEach(function(cite) {
828          var citeDiv = window.document.createElement('div');
829          citeDiv.classList.add('hanging-indent');
830          citeDiv.classList.add('csl-entry');
831          var biblioDiv = window.document.getElementById('ref-' + cite);
832          if (biblioDiv) {
833            citeDiv.innerHTML = biblioDiv.innerHTML;
834          }
835          popup.appendChild(citeDiv);
836        });
837        return popup.innerHTML;
838      });
839    }
840  }
841});
842</script>
842
843</div> <!-- /content -->
844<footer class="footer">
845  <div class="nav-footer">
846    <div class="nav-footer-left">
847<p>Copyright © 2026, LOGML Team</p>
848</div>   
849    <div class="nav-footer-center">
850      &nbsp;
851    </div>
852    <div class="nav-footer-right">
853      <ul class="footer-items list-unstyled">
854    <li class="nav-item compact">
855    <a class="nav-link" href="mailto:[email protected]">
856      <i class="bi bi-envelope" role="img">
857</i> 
858    </a>
859  </li>  
860    <li class="nav-item compact">
861    <a class="nav-link" href="https://www.linkedin.com/company/logml/">
862      <i class="bi bi-linkedin" role="img">
863</i> 
864    </a>
865  </li>  
866    <li class="nav-item compact">
867    <a class="nav-link" href="https://x.com/LogmlSchool">
868      <i class="bi bi-twitter-x" role="img">
869</i> 
870    </a>
871  </li>  
872    <li class="nav-item">
873    <a class="nav-link" href="https://bsky.app/profile/logml.bsky.social">
874<p><i class="fa-brands fa-bluesky" aria-label="bluesky"></i></p>
875</a>
876  </li>  
877    <li class="nav-item compact">
878    <a class="nav-link" href="https://www.youtube.com/@logmlsummerschool">
879      <i class="bi bi-youtube" role="img">
880</i> 
881    </a>
882  </li>  
883    <li class="nav-item compact">
884    <a class="nav-link" href="https://www.instagram.com/logml.ig/">
885      <i class="bi bi-instagram" role="img">
886</i> 
887    </a>
888  </li>  
889</ul>
890    </div>
891  </div>
892</footer>
893
894
895
896
897</body></html>

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.