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 & 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 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.