PageSourceSearch

https://dominlopez.netlify.app/about/

html dominlopez.netlify.app collected 2026-10-03 10:39:42 UTC 49,629 bytes, 1,160 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<!-- This site is hosted on Netlify. Anyone can build and deploy a site
6     like this one for free: https://netlify.new/?utm_campaign=loops&utm_source=ai-legible&utm_medium=owned&utm_content=comment&utm_id=6214997d-9e50-4e83-a6ea-306b634eeb3a
7     Netlify hosting facts for this site: static/SSR served via Netlify Edge. -->
8<meta name="generator" content="quarto-1.9.17">
9
10<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes">
11
12
13<title>Domingo López Rodríguez</title>
14<style>
15/* Default styles provided by pandoc.
16** See https://pandoc.org/MANUAL.html#variables-for-html for config info.
17*/
18code{white-space: pre-wrap;}
19span.smallcaps{font-variant: small-caps;}
20div.columns{display: flex; gap: min(4vw, 1.5em);}
21div.column{flex: auto; overflow-x: auto;}
22div.hanging-indent{margin-left: 1.5em; text-indent: -1.5em;}
23ul.task-list{list-style: none;}
24ul.task-list li input[type="checkbox"] {
25  width: 0.8em;
26  margin: 0 0.8em 0.2em -1em; /* quarto-specific, see https://github.com/quarto-dev/quarto-cli/issues/4556 */ 
27  vertical-align: middle;
28}
29</style>
30
31
32<script src="../site_libs/quarto-nav/quarto-nav.js"></script>
vendor: 1 bytes, line 32
32
33<script src="../site_libs/quarto-nav/headroom.min.js"></script>
vendor: 1 bytes, line 33
33
34<script src="../site_libs/clipboard/clipboard.min.js"></script>
vendor: 1 bytes, line 34
34
35<script src="../site_libs/quarto-search/autocomplete.umd.js"></script>
vendor: 1 bytes, line 35
35
36<script src="../site_libs/quarto-search/fuse.min.js"></script>
vendor: 1 bytes, line 36
36
37<script src="../site_libs/quarto-search/quarto-search.js"></script>
37
38<meta name="quarto:offset" content="../">
39<script src="../site_libs/cookie-consent/cookie-consent.js"></script>
39
40<link href="../site_libs/cookie-consent/cookie-consent.css" rel="stylesheet">
41<script src="../site_libs/quarto-html/quarto.js" type="module"></script>
vendor: 1 bytes, line 41
41
42<script src="../site_libs/quarto-html/tabsets/tabsets.js" type="module"></script>
vendor: 1 bytes, line 42
42
43<script src="../site_libs/quarto-html/axe/axe-check.js" type="module"></script>
vendor: 1 bytes, line 43
43
44<script src="../site_libs/quarto-html/popper.min.js"></script>
vendor: 1 bytes, line 44
44
45<script src="../site_libs/quarto-html/tippy.umd.min.js"></script>
45
46<link href="../site_libs/quarto-html/tippy.css" rel="stylesheet">
47<link href="../site_libs/quarto-html/quarto-syntax-highlighting-ce4278342a015d016477ed09bce942c5.css" rel="stylesheet" id="quarto-text-highlighting-styles">
48<script src="../site_libs/bootstrap/bootstrap.min.js"></script>
48
49<link href="../site_libs/bootstrap/bootstrap-icons.css" rel="stylesheet">
50<link href="../site_libs/bootstrap/bootstrap-137ad79071c2adac38395dead4c968d4.min.css" rel="stylesheet" append-hash="true" id="quarto-bootstrap" data-mode="light">
51<script id="quarto-search-options" type="application/json">{
52  "location": "navbar",
53  "copy-button": false,
54  "collapse-after": 3,
55  "panel-placement": "end",
56  "type": "overlay",
57  "limit": 50,
58  "keyboard-shortcut": [
59    "f",
60    "/",
61    "s"
62  ],
63  "show-item-context": false,
64  "language": {
65    "search-no-results-text": "No results",
66    "search-matching-documents-text": "matching documents",
67    "search-copy-link-title": "Copy link to search",
68    "search-hide-matches-text": "Hide additional matches",
69    "search-more-match-text": "more match in this document",
70    "search-more-matches-text": "more matches in this document",
71    "search-clear-button-title": "Clear",
72    "search-text-placeholder": "",
73    "search-detached-cancel-button-title": "Cancel",
74    "search-submit-button-title": "Submit",
75    "search-label": "Search"
76  }
77}</script>
vendor: 67 bytes, lines 77-78
77
78<script async="" src="https://www.googletagmanager.com/gtag/js?id=
78G-SSMR9M3FZG
vendor: 13 bytes, lines 78-79
78"></script>
79
80<script type="text/plain" cookie-consent="tracking">
81
vendor: 127 bytes, lines 82-85
82window.dataLayer = window.dataLayer || [];
83function gtag(){dataLayer.push(arguments);}
84gtag('js', new Date());
85gtag('config', '
85G-SSMR9M3FZG
vendor: 29 bytes, line 85
85', { 'anonymize_ip': true});
86</script>
86
87
88<script type="text/javascript" charset="UTF-8">
89document.addEventListener('DOMContentLoaded', function () {
90cookieconsent.run({
91  "notice_banner_type":"simple",
92  "consent_type":"express",
93  "palette":"light",
94  "language":"en",
95  "page_load_consent_levels":["strictly-necessary"],
96  "notice_banner_reject_button_hide":false,
97  "preferences_center_close_button_hide":false,
98  "website_name":""
99  ,
100"language":"en"
101  });
102});
103</script>
103 
104  
105<style>html{ scroll-behavior: smooth; }</style>
106<link href="https://fonts.googleapis.com/css?family=Fira+Sans|Merriweather" rel="stylesheet">
107<script src="https://kit.fontawesome.com/0fba9333d8.js" crossorigin="anonymous"></script>
107
108<link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/jpswalsh/academicons@1/css/academicons.min.css">
109<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/animate.css/4.1.1/animate.min.css">
110
111<script src="https://code.iconify.design/iconify-icon/1.0.7/iconify-icon.min.js"></script>
111
112
113<script src="https://cdnjs.cloudflare.com/ajax/libs/pdf.js/3.4.120/pdf.min.js"></script>
vendor: 1 bytes, line 113
113
114<script src="../prism.js"></script>
vendor: 1 bytes, line 114
114
115<script>
116// Carga el archivo JavaScript de resaltado de sintaxis
117// (sustituye "prism.js" por el nombre del archivo que hayas descargado)
118
119// Crea una función que muestre una ventana popup con el contenido del archivo "cite.bib"
120function showPopup() {
121  // Abre la ventana popup
122  var popupWindow = window.open("", "Popup", "height=500,width=500");
123
124  // Lee el contenido del archivo "cite.bib" usando Ajax
125  var xhr = new XMLHttpRequest();
126  xhr.onreadystatechange = function() {
127    if (xhr.readyState == XMLHttpRequest.DONE) {
128      // Cuando el archivo se haya cargado, muestra su contenido en la ventana popup
129      // usando resaltado de sintaxis
130      var text = xhr.responseText;
131      popupWindow.document.body.innerHTML = "<pre><code class='language-bibtex'>" + text + "</code></pre>";
132
133      // Aplica el resaltado de sintaxis a la ventana popup
134      Prism.highlightAll();
135    }
136  }
137  xhr.open("GET", "cite.bib", true);
138  xhr.send();
139}
140
141document.addEventListener("DOMContentLoaded", function() {
142  // Configure PDF.js Worker
143  pdfjsLib.GlobalWorkerOptions.workerSrc = 'https://cdnjs.cloudflare.com/ajax/libs/pdf.js/3.4.120/pdf.worker.min.js';
144
145  // Inyectar estructura del Slides Modal en el body
146  const modalDiv = document.createElement("div");
147  modalDiv.className = "slides-modal";
148  modalDiv.id = "global-slides-modal";
149  modalDiv.innerHTML = `
150    <div class="slides-modal-content animate__animated animate__fadeInUp animate__faster">
151      <div class="slides-modal-header">
152        <h3 class="slides-modal-title"><i class="bi bi-easel"></i> Presentation Slides</h3>
153        <button class="slides-modal-close" id="global-slides-modal-close">&times;</button>
154      </div>
155      
156      <!-- Container for reveal.js or HTML slides -->
157      <div class="slides-modal-body" id="slides-iframe-container" style="display: none; width: 100%; height: 100%;">
158        <iframe src="" id="global-slides-modal-iframe" allowfullscreen></iframe>
159      </div>
160      
161      <!-- Container for PDF slides (Slide deck player) -->
162      <div class="slides-modal-body" id="slides-pdf-container" style="background-color: #1a1a1a; display: flex; align-items: center; justify-content: center; overflow: auto; padding: 20px; position: relative; min-height: 400px; flex: 1;">
163        <!-- Loading spinner -->
164        <div id="slides-loading" style="color: #fff; display: flex; flex-direction: column; align-items: center; gap: 10px; position: absolute; z-index: 10;">
165          <div class="spinner-border text-light" role="status" style="width: 2rem; height: 2rem;"></div>
166          <span style="font-weight: 500; font-size: 0.95rem;">Loading presentation...</span>
167        </div>
168        <!-- Canvas for rendering slides -->
169        <canvas id="slides-canvas" style="box-shadow: 0 8px 30px rgba(0,0,0,0.6); max-width: 100%; max-height: 100%; display: none; background-color: #fff; border-radius: 4px;"></canvas>
170      </div>
171      
172      <!-- PDF Player Controls -->
173      <div class="slides-modal-footer" id="slides-pdf-controls" style="padding: 12px 20px; background-color: #f8f9fa; border-top: 1px solid #dee2e6; display: flex; align-items: center; justify-content: space-between;">
174        <button class="slides-modal-btn" id="prev-slide-btn" style="border: none; background: #dee2e6; color: #333; padding: 6px 18px; border-radius: 20px; font-weight: 600; cursor: pointer; display: inline-flex; align-items: center; gap: 6px; transition: all 0.2s ease;">
175          <i class="bi bi-chevron-left"></i> Previous
176        </button>
177        <span style="font-size: 0.95rem; font-weight: 600; color: #495057; font-family: var(--font-sans);">
178          Slide <span id="current-page-num">0</span> of <span id="total-page-count">0</span>
179        </span>
180        <button class="slides-modal-btn" id="next-slide-btn" style="border: none; background: #dee2e6; color: #333; padding: 6px 18px; border-radius: 20px; font-weight: 600; cursor: pointer; display: inline-flex; align-items: center; gap: 6px; transition: all 0.2s ease;">
181          Next <i class="bi bi-chevron-right"></i>
182        </button>
183      </div>
184    </div>
185  `;
186  document.body.appendChild(modalDiv);
187
188  const modal = document.getElementById("global-slides-modal");
189  const iframe = document.getElementById("global-slides-modal-iframe");
190  const closeBtn = document.getElementById("global-slides-modal-close");
191  const canvas = document.getElementById("slides-canvas");
192  const ctx = canvas.getContext("2d");
193
194  let pdfDoc = null,
195      pageNum = 1,
196      pageRendering = false,
197      pageNumPending = null;
198
199  // Escuchar clics en los enlaces de slides
200  document.addEventListener("click", function(e) {
201    const trigger = e.target.closest(".slides-modal-trigger");
202    if (trigger) {
203      e.preventDefault();
204      const href = trigger.getAttribute("href");
205      
206      modal.style.display = "flex";
207      document.body.style.overflow = "hidden";
208      
209      const isPdf = href.toLowerCase().endsWith(".pdf");
210      
211      if (isPdf) {
212        document.getElementById("slides-iframe-container").style.display = "none";
213        document.getElementById("slides-pdf-container").style.display = "flex";
214        document.getElementById("slides-pdf-controls").style.display = "flex";
215        document.getElementById("slides-loading").style.display = "flex";
216        document.getElementById("slides-loading").innerHTML = `
217          <div class="spinner-border text-light" role="status" style="width: 2rem; height: 2rem;"></div>
218          <span style="font-weight: 500; font-size: 0.95rem;">Loading presentation...</span>
219        `;
220        canvas.style.display = "none";
221        
222        pdfjsLib.getDocument(href).promise.then(function(pdfDoc_) {
223          pdfDoc = pdfDoc_;
224          document.getElementById("total-page-count").textContent = pdfDoc.numPages;
225          pageNum = 1;
226          
227          document.getElementById("slides-loading").style.display = "none";
228          canvas.style.display = "block";
229          
230          renderPage(pageNum);
231        }).catch(function(err) {
232          console.error("Error loading PDF: ", err);
233          document.getElementById("slides-loading").innerHTML = '<span style="color: #c92a2a; font-weight: 600;">Error: Failed to load slides.</span>';
234        });
235      } else {
236        document.getElementById("slides-pdf-container").style.display = "none";
237        document.getElementById("slides-pdf-controls").style.display = "none";
238        document.getElementById("slides-iframe-container").style.display = "block";
239        iframe.src = href;
240      }
241    }
242  });
243
244  function renderPage(num) {
245    pageRendering = true;
246    pdfDoc.getPage(num).then(function(page) {
247      // Responsive responsiveScale based on viewport size
248      let unscaledViewport = page.getViewport({scale: 1.0});
249      let containerWidth = canvas.parentElement.clientWidth - 40;
250      let containerHeight = canvas.parentElement.clientHeight - 40;
251      
252      let widthScale = containerWidth / unscaledViewport.width;
253      let heightScale = containerHeight / unscaledViewport.height;
254      let responsiveScale = Math.min(widthScale, heightScale);
255      
256      // Clamp values to keep it crisp and fast
257      responsiveScale = Math.min(Math.max(responsiveScale, 0.8), 2.2);
258      
259      let viewport = page.getViewport({scale: responsiveScale});
260      canvas.height = viewport.height;
261      canvas.width = viewport.width;
262
263      let renderContext = {
264        canvasContext: ctx,
265        viewport: viewport
266      };
267      let renderTask = page.render(renderContext);
268
269      renderTask.promise.then(function() {
270        pageRendering = false;
271        if (pageNumPending !== null) {
272          renderPage(pageNumPending);
273          pageNumPending = null;
274        }
275      });
276    });
277
278    document.getElementById("current-page-num").textContent = num;
279  }
280
281  function queueRenderPage(num) {
282    if (pageRendering) {
283      pageNumPending = num;
284    } else {
285      renderPage(num);
286    }
287  }
288
289  function onPrevPage() {
290    if (!pdfDoc || pageNum <= 1) return;
291    pageNum--;
292    queueRenderPage(pageNum);
293  }
294
295  function onNextPage() {
296    if (!pdfDoc || pageNum >= pdfDoc.numPages) return;
297    pageNum++;
298    queueRenderPage(pageNum);
299  }
300
301  document.getElementById("prev-slide-btn").addEventListener("click", onPrevPage);
302  document.getElementById("next-slide-btn").addEventListener("click", onNextPage);
303
304  // Keyboard navigation for PDF slide viewer
305  document.addEventListener("keydown", function(e) {
306    if (modal.style.display === "flex" && pdfDoc) {
307      if (e.key === "ArrowLeft" || e.key === "PageUp") {
308        onPrevPage();
309      } else if (e.key === "ArrowRight" || e.key === " " || e.key === "PageDown") {
310        e.preventDefault();
311        onNextPage();
312      }
313    }
314  });
315
316  // Cerrar modal
317  function closeModal() {
318    modal.style.display = "none";
319    iframe.src = "";
320    pdfDoc = null;
321    document.body.style.overflow = ""; // Reactivar scroll
322  }
323
324  closeBtn.addEventListener("click", closeModal);
325  modal.addEventListener("click", function(e) {
326    if (e.target === modal) {
327      closeModal();
328    }
329  });
330
331  // Inyectar estructura del BibTeX Modal en el body
332  const bibModalDiv = document.createElement("div");
333  bibModalDiv.className = "bibtex-modal";
334  bibModalDiv.id = "global-bibtex-modal";
335  bibModalDiv.innerHTML = `
336    <div class="bibtex-modal-content animate__animated animate__fadeInUp animate__faster">
337      <div class="bibtex-modal-header">
338        <h3 class="bibtex-modal-title">
338<i class="bi bi-code-slash"></i> BibTeX Citation</h3>
339        <button class="bibtex-modal-close" id="global-bibtex-modal-close">&times;</button>
340      </div>
341      <div class="bibtex-modal-body">
342        <pre><code id="global-bibtex-modal-code"></code></pre>
343      </div>
344      <div class="bibtex-modal-footer">
345        <button class="bibtex-modal-btn bibtex-modal-btn-secondary" id="global-bibtex-modal-copy">
346          <i class="bi bi-clipboard"></i> Copy BibTeX
347        </button>
348        <button class="bibtex-modal-btn bibtex-modal-btn-primary" id="global-bibtex-modal-download">
349          <i class="bi bi-download"></i> Download .bib
350        </button>
351      </div>
352    </div>
353  `;
354  document.body.appendChild(bibModalDiv);
355
356  const bibModal = document.getElementById("global-bibtex-modal");
357  const bibCode = document.getElementById("global-bibtex-modal-code");
358  const bibCloseBtn = document.getElementById("global-bibtex-modal-close");
359  const bibCopyBtn = document.getElementById("global-bibtex-modal-copy");
360  const bibDownloadBtn = document.getElementById("global-bibtex-modal-download");
361
362  let currentBibtex = "";
363  let currentFilename = "citation.bib";
364
365  // Escuchar clics en los botones de BibTeX
366  document.addEventListener("click", function(e) {
367    const trigger = e.target.closest(".show-bibtex-btn");
368    if (trigger) {
369      e.preventDefault();
370      currentBibtex = trigger.getAttribute("data-bibtex") || "";
371      currentFilename = trigger.getAttribute("data-filename") || "citation.bib";
372      
373      bibCode.textContent = currentBibtex;
374      bibModal.style.display = "flex";
375      document.body.style.overflow = "hidden";
376      
377      // Reset copy button
378      bibCopyBtn.innerHTML = '<i class="bi bi-clipboard"></i> Copy BibTeX';
379      bibCopyBtn.classList.remove("copied");
380    }
381  });
382
383  // Cerrar BibTeX modal
384  function closeBibModal() {
385    bibModal.style.display = "none";
386    document.body.style.overflow = "";
387  }
388
389  bibCloseBtn.addEventListener("click", closeBibModal);
390  bibModal.addEventListener("click", function(e) {
391    if (e.target === bibModal) {
392      closeBibModal();
393    }
394  });
395
396  // Copiar al portapapeles
397  bibCopyBtn.addEventListener("click", function() {
398    navigator.clipboard.writeText(currentBibtex).then(function() {
399      bibCopyBtn.innerHTML = '<i class="bi bi-check-lg"></i> Copied!';
400      bibCopyBtn.classList.add("copied");
401      setTimeout(function() {
402        bibCopyBtn.innerHTML = '<i class="bi bi-clipboard"></i> Copy BibTeX';
403        bibCopyBtn.classList.remove("copied");
404      }, 2000);
405    }).catch(function(err) {
406      console.error("Could not copy BibTeX: ", err);
407    });
408  });
409
410  // Descargar archivo .bib
411  bibDownloadBtn.addEventListener("click", function() {
412    const blob = new Blob([currentBibtex], { type: "text/plain;charset=utf-8" });
413    const link = document.createElement("a");
414    link.href = URL.createObjectURL(blob);
415    link.download = currentFilename;
416    document.body.appendChild(link);
417    link.click();
418    document.body.removeChild(link);
419  });
420
421  document.addEventListener("keydown", function(e) {
422    if (e.key === "Escape") {
423      if (modal.style.display === "flex") {
424        closeModal();
425      }
426      if (bibModal.style.display === "flex") {
427        closeBibModal();
428      }
429    }
430  });
431
432  // --- PREMIUM BLOG INTERACTIVE UX ---
433  const isBlogPost = window.location.pathname.includes("/blog/") && 
434                     !window.location.pathname.endsWith("/blog/") && 
435                     !window.location.pathname.endsWith("/blog/index.html");
436
437  if (isBlogPost) {
438    // 1. Reading progress bar
439    const progBar = document.createElement("div");
440    progBar.id = "reading-progress-bar";
441    progBar.style.cssText = "position: fixed; top: 0; left: 0; height: 3px; background-color: #bd666d; width: 0%; z-index: 9999; transition: width 0.1s ease;";
442    document.body.appendChild(progBar);
443
444    window.addEventListener("scroll", function() {
445      const winScroll = document.documentElement.scrollTop || document.body.scrollTop;
446      const height = document.documentElement.scrollHeight - document.documentElement.clientHeight;
447      const scrolled = height > 0 ? (winScroll / height) * 100 : 0;
448      progBar.style.width = scrolled + "%";
449    });
450
451    // 2. Dynamic Share widget
452    const shareDiv = document.createElement("div");
453    shareDiv.className = "blog-share-widget";
454    shareDiv.innerHTML = `
455      <a href="https://twitter.com/intent/tweet?url=${encodeURIComponent(window.location.href)}&text=${encodeURIComponent(document.title)}" target="_blank" title="Share on Twitter"><i class="fa-brands fa-twitter"></i></a>
456      <a href="https://www.linkedin.com/sharing/share-offsite/?url=${encodeURIComponent(window.location.href)}" target="_blank" title="Share on LinkedIn"><i class="fa-brands fa-linkedin"></i></a>
457      <button id="blog-copy-link" title="Copy Link"><i class="fa-solid fa-link"></i></button>
458    `;
459    document.body.appendChild(shareDiv);
460
461    document.getElementById("blog-copy-link").addEventListener("click", function() {
462      navigator.clipboard.writeText(window.location.href).then(function() {
463        const btn = document.getElementById("blog-copy-link");
464        btn.innerHTML = '<i class="fa-solid fa-check" style="color: #bd666d;"></i>';
465        setTimeout(() => {
466          btn.innerHTML = '<i class="fa-solid fa-link"></i>';
467        }, 2000);
468      });
469    });
470  }
471});
472</script>
472
473
474
475<link rel="stylesheet" href="../styles.css">
476<meta property="og:title" content="Domingo López Rodríguez">
477<meta property="og:site_name" content="Domingo López Rodríguez">
478<meta name="twitter:title" content="Domingo López Rodríguez">
479<meta name="twitter:creator" content="@dominlopez">
480<meta name="twitter:card" content="summary_large_image">
481</head>
482
483<body class="nav-fixed quarto-light">
484
485<div id="quarto-search-results"></div>
486  <header id="quarto-header" class="headroom fixed-top">
487    <nav class="navbar navbar-expand-lg " data-bs-theme="dark">
488      <div class="navbar-container container-fluid">
489      <div class="navbar-brand-container mx-auto">
490    <a class='navbar-brand' href='/'>
491    <span class="navbar-title">Domingo López Rodríguez</span>
492    </a>
493  </div>
494            <div id="quarto-search" class="" title="Search"></div>
495          <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(); }">
496  <span class="navbar-toggler-icon"></span>
497</button>
498          <div class="collapse navbar-collapse" id="navbarCollapse">
499            <ul class="navbar-nav navbar-nav-scroll ms-auto">
500  <li class="nav-item">
501    <a aria-current='page' class='nav-link active' href='/about/'> 
502<span class="menu-text">About</span></a>
503  </li>  
504  <li class="nav-item">
505    <a class='nav-link' href='/teaching/'> 
506<span class="menu-text">Teaching</span></a>
507  </li>  
508  <li class="nav-item dropdown ">
509    <a class="nav-link dropdown-toggle" href="#" id="nav-menu-research" role="link" data-bs-toggle="dropdown" aria-expanded="false">
510 <span class="menu-text">Research</span>
511    </a>
512    <ul class="dropdown-menu dropdown-menu-end" aria-labelledby="nav-menu-research">    
513        <li>
514    <a class='dropdown-item' href='/research/'>
515 <span class="dropdown-text">Research summary</span></a>
516  </li>  
517        <li>
518    <a class='dropdown-item' href='/publications/'>
519 <span class="dropdown-text">Publications</span></a>
520  </li>  
521        <li>
522    <a class='dropdown-item' href='/projects/'>
523 <span class="dropdown-text">Projects</span></a>
524  </li>  
525        <li>
526    <a class='dropdown-item' href='/talks/'>
527 <span class="dropdown-text">Talks</span></a>
528  </li>  
529    </ul>
530  </li>
531  <li class="nav-item">
532    <a class='nav-link' href='/resources/'> 
533<span class="menu-text">Resources</span></a>
534  </li>  
535  <li class="nav-item">
536    <a class='nav-link' href='/blog/'> 
537<span class="menu-text">Blog</span></a>
538  </li>  
539</ul>
540          </div> <!-- /navcollapse -->
541            <div class="quarto-navbar-tools">
542</div>
543      </div> <!-- /container-fluid -->
544    </nav>
545</header>
546<!-- content -->
547<div id="quarto-content" class="quarto-container page-columns page-rows-contents page-layout-full page-navbar">
548<!-- sidebar -->
549<!-- margin-sidebar -->
550    
551<!-- main -->
552<div class="quarto-about-solana page-columns page-full column-body">
553  <div class="about-entity page-columns page-full">
554    <div class="entity-contents page-columns page-full">
555      <header id="title-block-header" class="quarto-title-block default">
556<div class="quarto-title">
557<h1 class="title">Domingo López Rodríguez</h1>
558</div>
559<div class="quarto-title-meta column-body">
560  </div>
561</header> <div class="about-links">
562  <a href="https://twitter.com/dominlopez" class="about-link" rel="" target="">
563    <i class="bi bi-twitter"></i>
564     <span class="about-link-text">Twitter</span>
565  </a>
566  <a href="https://mastodon.social/" class="about-link" rel="" target="">
567    <i class="bi bi-mastodon"></i>
568     <span class="about-link-text">Mastodon</span>
569  </a>
570  <a href="https://github.com/neuroimaginador" class="about-link" rel="" target="">
571    <i class="bi bi-github"></i>
572     <span class="about-link-text">Github</span>
573  </a>
574  <a href="mailto:[email protected]" class="about-link" rel="" target="">
575    <i class="bi bi-envelope"></i>
576     <span class="about-link-text">Email</span>
577  </a>
578  <a href="/cv.pdf" class="about-link" rel="" target="">
579    <i class="bi bi-file-earmark-pdf-fill"></i>
580     <span class="about-link-text">CV (Full)</span>
581  </a>
582  <a href="/cv-5years.pdf" class="about-link" rel="" target="">
583    <i class="bi bi-file-earmark-pdf"></i>
584     <span class="about-link-text">CV (5 Years)</span>
585  </a>
586</div>
587      <div class="about-contents page-columns page-full"><main class="content page-columns page-full column-body" id="quarto-document-content">
588<div class="column-page">
589<div class="tabset-margin-container"></div><div class="panel-tabset">
590<ul class="nav nav-tabs" role="tablist"><li class="nav-item" role="presentation"><a class="nav-link active" id="tabset-1-1-tab" data-bs-toggle="tab" data-bs-target="#tabset-1-1" role="tab" aria-controls="tabset-1-1" aria-selected="true" href="">Biography</a></li><li class="nav-item" role="presentation"><a class="nav-link" id="tabset-1-2-tab" data-bs-toggle="tab" data-bs-target="#tabset-1-2" role="tab" aria-controls="tabset-1-2" aria-selected="false" href="">Education &amp; Interests</a></li><li class="nav-item" role="presentation"><a class="nav-link" id="tabset-1-3-tab" data-bs-toggle="tab" data-bs-target="#tabset-1-3" role="tab" aria-controls="tabset-1-3" aria-selected="false" href="">Responsibilities</a></li><li class="nav-item" role="presentation"><a class="nav-link" id="tabset-1-4-tab" data-bs-toggle="tab" data-bs-target="#tabset-1-4" role="tab" aria-controls="tabset-1-4" aria-selected="false" href="">Contact &amp; Location</a></li></ul>
591<div class="tab-content">
592<div id="tabset-1-1" class="tab-pane active" role="tabpanel" aria-labelledby="tabset-1-1-tab">
593<p>I am currently a professor at the <strong>University of Málaga</strong> in Spain, in the Department of Applied Mathematics.</p>
594<p>I studied for my undergraduate degree in Mathematics at the same university, and later obtained my Doctoral degree by defending my thesis on a new method of mathematical optimization with applications to artificial neural networks. I specialized in neural networks, computational learning, and image analysis.</p>
595<p>Before joining the university, I worked for <strong>nine years as an R&amp;D manager</strong> in a private company, focusing on digital processing of medical images (neuroimaging) and developing products for neuroscience.</p>
596<p>This experience led me to expert mastery of <strong>R</strong>, developing over 20 packages for research and teaching.</p>
597<div class="text-center my-4">
598<p class="text-muted">
599<em>Member of the <a href="http://circulodeilusionismomalaga.blogspot.com/">Círculo de Ilusionistas Malagueños</a> and founder of the <a href="https://malagarusers.netlify.app/">R users’ group in Málaga</a>.</em>
600</p>
601</div>
602</div>
603<div id="tabset-1-2" class="tab-pane" role="tabpanel" aria-labelledby="tabset-1-2-tab">
604<section id="education" class="level3">
605<h3 data-anchor-id="education">Education</h3>
606<ul>
607<li><i class="bi bi-mortarboard-fill"></i> <strong>Doctorate</strong>, University of Málaga (2007)</li>
608<li><i class="bi bi-mortarboard"></i> <strong>Bachelor’s Degree in Mathematics</strong>, University of Málaga (2001)</li>
609</ul>
610</section>
611<section id="interests" class="level3">
612<h3 data-anchor-id="interests">Interests</h3>
613<div class="grid">
614<div class="g-col-12 g-col-md-4">
615<p><strong>Data Science</strong></p>
616<ul>
617<li>Data Visualization</li>
618<li>Scientific Communication</li>
619<li>R Programming</li>
620</ul>
621</div>
622<div class="g-col-12 g-col-md-4">
623<p><strong>Research</strong></p>
624<ul>
625<li>Formal Concept Analysis</li>
626<li>Machine/Deep Learning</li>
627<li>Neuroimaging</li>
628</ul>
629</div>
630<div class="g-col-12 g-col-md-4">
631<p><strong>Community</strong></p>
632<ul>
633<li>Open Source</li>
634<li>Education &amp; Teaching</li>
635</ul>
636</div>
637</div>
638</section>
639<section id="trivia" class="level3">
640<h3 data-anchor-id="trivia">Trivia</h3>
641<p>My <a href="http://www.oakland.edu/enp/">Erdös number</a> is 4 via Nicolás Madrid / Vladik Kreinovich / Paul C. Kainen / Paul Erdös.</p>
642</section>
643</div>
644<div id="tabset-1-3" class="tab-pane" role="tabpanel" aria-labelledby="tabset-1-3-tab">
645<section id="conferences-organization" class="level3">
646<h3 data-anchor-id="conferences-organization">Conferences &amp; Organization</h3>
647<p><strong>Conferences and Sessions organizing committee</strong>:</p>
648<ul>
649<li>Special Session on <em>Formal Concept Analysis and Uncertainty</em> at the <a href="https://ipmu2022.disco.unimib.it/">19th International Conference on Information Processing and Management of Uncertainty in Knowledge-Based Systems</a> (IPMU 2022), held in Milan, Italy, on July 11th – 15th, 2022.</li>
650<li>Program Chair of the <a href="https://www.kde.cs.uni-kassel.de/icfca2023/">17th International Conference on Formal Concept Analysis</a> (ICFCA 2023), held at the University of Kassel, Germany, on July 17th – 21st, 2023.</li>
651<li>Symposium Chair of the <a href="https://attend.ieee.org/ssci-2023/ieee-symposium-on-foundations-of-computational-intelligence-ieee-foci/">IEEE Symposium on Foundations of Computational Intelligence</a> (SSCI FOCI 2023) held at Mexico City, Mexico, on December 5th – 8th, 2023.</li>
652<li>Program Chair of the <a href="https://concepts2026.org/">3rd International Conference on Conceptual Structures</a> (CONCEPTS 2026), at Montpellier, France, on August, 31st – September, 4th, 2026.</li>
653</ul>
654<p><strong>Programme Committee member for</strong>:</p>
655<ul>
656<li><a href="https://concepts2024.uca.es/">International Joint Conference on Conceptual Knowledge Structures 2024</a> (CONCEPTS 2024), held in Cádiz, Spain.</li>
657<li><a href="https://caepia24.aepia.org/">Conferencia de la Asociación Española para la Inteligencia Artificial 2024</a> (CAEPIA 2024), <em>Conference of the Spanish Association for Artificial Intelligence</em>, held in A Coruña, Spain.</li>
658<li><a href="https://ijcrs24.cs.smu.ca/">International Joint Conference on Rough Sets 2024</a> (IJCRS 2024), held in Halifax, Nova Scotia, Canada.</li>
659</ul>
660</section>
661<section id="administrative" class="level3">
662<h3 data-anchor-id="administrative">Administrative</h3>
663<ul>
664<li>ERASMUS+ academic tutor at the <em>ETSI de Informática</em> for the following destinations:
665<ul>
666<li>Universitaet Kassel (Germany).</li>
667<li>Pavol Jozef Safarik University at Kosice (Slovakia).</li>
668<li>Université de Lille (France).</li>
669<li>Université Clermont-Auvergne (France).</li>
670<li>Charles University at Prague (Czech Republic).</li>
671</ul></li>
672<li>Coordinator of the <em>Estadística y Métodos Numéricos</em> (Statistics and Numerical Methods) subject in <em>ETSI de Telecomunicaciones</em> from 2020 to 2023.</li>
673<li>Coordinator of the <em>Estructuras Algebraicas para la Computación</em> (Algebraic Structures for Computation) subject in <em>ETSI de Informática</em> from 2023.</li>
674</ul>
675</section>
676</div>
677<div id="tabset-1-4" class="tab-pane" role="tabpanel" aria-labelledby="tabset-1-4-tab">
678<p><a href="https://www.uma.es/matematica-aplicada/">Departmento de Matemática Aplicada</a>, <a href="https://www.uma.es/">Universidad de Málaga</a>, Campus de Teatinos, 29071, Málaga, Spain. Office 2.2.7, ETSI de Informática y Telecomunicaciones.</p>
679<iframe src="https://www.google.com/maps/embed?pb=!1m18!1m12!1m3!1d25586.456052121437!2d-4.493380899922942!3d36.715187349837!2m3!1f0!2f0!3f0!3m2!1i1024!2i768!4f13.1!3m3!1m2!1s0xd72f74b9f3606f1%3A0x9fa32cc2e6b0bbf9!2sE.T.S.%20de%20Ingenier%C3%ADa%20Inform%C3%A1tica!5e0!3m2!1ses!2ses!4v1671016531150!5m2!1ses!2ses" width="100%" height="400" style="border:0;" allowfullscreen="" loading="lazy" referrerpolicy="no-referrer-when-downgrade">
680</iframe>
681</div>
682</div>
683</div>
684</div>
685
686
687</main></div>
688    </div>
689    <img src="/avatar.png" class="about-image
690  rounded " style="width: 15em;">
691  </div>
692</div>
693 <!-- /main -->
694<script id="quarto-html-after-body" type="application/javascript">
695  window.document.addEventListener("DOMContentLoaded", function (event) {
696    const isCodeAnnotation = (el) => {
697      for (const clz of el.classList) {
698        if (clz.startsWith('code-annotation-')) {                     
699          return true;
700        }
701      }
702      return false;
703    }
704    const onCopySuccess = function(e) {
705      // button target
706      const button = e.trigger;
707      // don't keep focus
708      button.blur();
709      // flash "checked"
710      button.classList.add('code-copy-button-checked');
711      var currentTitle = button.getAttribute("title");
712      button.setAttribute("title", "Copied!");
713      let tooltip;
714      if (window.bootstrap) {
715        button.setAttribute("data-bs-toggle", "tooltip");
716        button.setAttribute("data-bs-placement", "left");
717        button.setAttribute("data-bs-title", "Copied!");
718        tooltip = new bootstrap.Tooltip(button, 
719          { trigger: "manual", 
720            customClass: "code-copy-button-tooltip",
721            offset: [0, -8]});
722        tooltip.show();    
723      }
724      setTimeout(function() {
725        if (tooltip) {
726          tooltip.hide();
727          button.removeAttribute("data-bs-title");
728          button.removeAttribute("data-bs-toggle");
729          button.removeAttribute("data-bs-placement");
730        }
731        button.setAttribute("title", currentTitle);
732        button.classList.remove('code-copy-button-checked');
733      }, 1000);
734      // clear code selection
735      e.clearSelection();
736    }
737    const getTextToCopy = function(trigger) {
738      const outerScaffold = trigger.parentElement.cloneNode(true);
739      const codeEl = outerScaffold.querySelector('code');
740      for (const childEl of codeEl.children) {
741        if (isCodeAnnotation(childEl)) {
742          childEl.remove();
743        }
744      }
745      return codeEl.innerText;
746    }
747    const clipboard = new window.ClipboardJS('.code-copy-button:not([data-in-quarto-modal])', {
748      text: getTextToCopy
749    });
750    clipboard.on('success', onCopySuccess);
751    if (window.document.getElementById('quarto-embedded-source-code-modal')) {
752      const clipboardModal = new window.ClipboardJS('.code-copy-button[data-in-quarto-modal]', {
753        text: getTextToCopy,
754        container: window.document.getElementById('quarto-embedded-source-code-modal')
755      });
756      clipboardModal.on('success', onCopySuccess);
757    }
758      var localhostRegex = new RegExp(/^(?:http|https):\/\/localhost\:?[0-9]*\//);
759      var mailtoRegex = new RegExp(/^mailto:/);
760        var filterRegex = new RegExp("https:\/\/dominlopez\.netlify\.app");
761      var isInternal = (href) => {
762          return filterRegex.test(href) || localhostRegex.test(href) || mailtoRegex.test(href);
763      }
764      // Inspect non-navigation links and adorn them if external
765     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)');
766      for (var i=0; i<links.length; i++) {
767        const link = links[i];
768        if (!isInternal(link.href)) {
769          // undo the damage that might have been done by quarto-nav.js in the case of
770          // links that we want to consider external
771          if (link.dataset.originalHref !== undefined) {
772            link.href = link.dataset.originalHref;
773          }
774        }
775      }
776    function tippyHover(el, contentFn, onTriggerFn, onUntriggerFn) {
777      const config = {
778        allowHTML: true,
779        maxWidth: 500,
780        delay: 100,
781        arrow: false,
782        appendTo: function(el) {
783            return el.parentElement;
784        },
785        interactive: true,
786        interactiveBorder: 10,
787        theme: 'quarto',
788        placement: 'bottom-start',
789      };
790      if (contentFn) {
791        config.content = contentFn;
792      }
793      if (onTriggerFn) {
794        config.onTrigger = onTriggerFn;
795      }
796      if (onUntriggerFn) {
797        config.onUntrigger = onUntriggerFn;
798      }
799      window.tippy(el, config); 
800    }
801    const noterefs = window.document.querySelectorAll('a[role="doc-noteref"]');
802    for (var i=0; i<noterefs.length; i++) {
803      const ref = noterefs[i];
804      tippyHover(ref, function() {
805        // use id or data attribute instead here
806        let href = ref.getAttribute('data-footnote-href') || ref.getAttribute('href');
807        try { href = new URL(href).hash; } catch {}
808        const id = href.replace(/^#\/?/, "");
809        const note = window.document.getElementById(id);
810        if (note) {
811          return note.innerHTML;
812        } else {
813          return "";
814        }
815      });
816    }
817    const xrefs = window.document.querySelectorAll('a.quarto-xref');
818    const processXRef = (id, note) => {
819      // Strip column container classes
820      const stripColumnClz = (el) => {
821        el.classList.remove("page-full", "page-columns");
822        if (el.children) {
823          for (const child of el.children) {
824            stripColumnClz(child);
825          }
826        }
827      }
828      stripColumnClz(note)
829      if (id === null || id.startsWith('sec-')) {
830        // Special case sections, only their first couple elements
831        const container = document.createElement("div");
832        if (note.children && note.children.length > 2) {
833          container.appendChild(note.children[0].cloneNode(true));
834          for (let i = 1; i < note.children.length; i++) {
835            const child = note.children[i];
836            if (child.tagName === "P" && child.innerText === "") {
837              continue;
838            } else {
839              container.appendChild(child.cloneNode(true));
840              break;
841            }
842          }
843          if (window.Quarto?.typesetMath) {
844            window.Quarto.typesetMath(container);
845          }
846          return container.innerHTML
847        } else {
848          if (window.Quarto?.typesetMath) {
849            window.Quarto.typesetMath(note);
850          }
851          return note.innerHTML;
852        }
853      } else {
854        // Remove any anchor links if they are present
855        const anchorLink = note.querySelector('a.anchorjs-link');
856        if (anchorLink) {
857          anchorLink.remove();
858        }
859        if (window.Quarto?.typesetMath) {
860          window.Quarto.typesetMath(note);
861        }
862        if (note.classList.contains("callout")) {
863          return note.outerHTML;
864        } else {
865          return note.innerHTML;
866        }
867      }
868    }
869    for (var i=0; i<xrefs.length; i++) {
870      const xref = xrefs[i];
871      tippyHover(xref, undefined, function(instance) {
872        instance.disable();
873        let url = xref.getAttribute('href');
874        let hash = undefined; 
875        if (url.startsWith('#')) {
876          hash = url;
877        } else {
878          try { hash = new URL(url).hash; } catch {}
879        }
880        if (hash) {
881          const id = hash.replace(/^#\/?/, "");
882          const note = window.document.getElementById(id);
883          if (note !== null) {
884            try {
885              const html = processXRef(id, note.cloneNode(true));
886              instance.setContent(html);
887            } finally {
888              instance.enable();
889              instance.show();
890            }
891          } else {
892            // See if we can fetch this
893            fetch(url.split('#')[0])
894            .then(res => res.text())
895            .then(html => {
896              const parser = new DOMParser();
897              const htmlDoc = parser.parseFromString(html, "text/html");
898              const note = htmlDoc.getElementById(id);
899              if (note !== null) {
900                const html = processXRef(id, note);
901                instance.setContent(html);
902              } 
903            }).finally(() => {
904              instance.enable();
905              instance.show();
906            });
907          }
908        } else {
909          // See if we can fetch a full url (with no hash to target)
910          // This is a special case and we should probably do some content thinning / targeting
911          fetch(url)
912          .then(res => res.text())
913          .then(html => {
914            const parser = new DOMParser();
915            const htmlDoc = parser.parseFromString(html, "text/html");
916            const note = htmlDoc.querySelector('main.content');
917            if (note !== null) {
918              // This should only happen for chapter cross references
919              // (since there is no id in the URL)
920              // remove the first header
921              if (note.children.length > 0 && note.children[0].tagName === "HEADER") {
922                note.children[0].remove();
923              }
924              const html = processXRef(null, note);
925              instance.setContent(html);
926            } 
927          }).finally(() => {
928            instance.enable();
929            instance.show();
930          });
931        }
932      }, function(instance) {
933      });
934    }
935        let selectedAnnoteEl;
936        const selectorForAnnotation = ( cell, annotation) => {
937          let cellAttr = 'data-code-cell="' + cell + '"';
938          let lineAttr = 'data-code-annotation="' +  annotation + '"';
939          const selector = 'span[' + cellAttr + '][' + lineAttr + ']';
940          return selector;
941        }
942        const selectCodeLines = (annoteEl) => {
943          const doc = window.document;
944          const targetCell = annoteEl.getAttribute("data-target-cell");
945          const targetAnnotation = annoteEl.getAttribute("data-target-annotation");
946          const annoteSpan = window.document.querySelector(selectorForAnnotation(targetCell, targetAnnotation));
947          const lines = annoteSpan.getAttribute("data-code-lines").split(",");
948          const lineIds = lines.map((line) => {
949            return targetCell + "-" + line;
950          })
951          let top = null;
952          let height = null;
953          let parent = null;
954          if (lineIds.length > 0) {
955              //compute the position of the single el (top and bottom and make a div)
956              const el = window.document.getElementById(lineIds[0]);
957              top = el.offsetTop;
958              height = el.offsetHeight;
959              parent = el.parentElement.parentElement;
960            if (lineIds.length > 1) {
961              const lastEl = window.document.getElementById(lineIds[lineIds.length - 1]);
962              const bottom = lastEl.offsetTop + lastEl.offsetHeight;
963              height = bottom - top;
964            }
965            if (top !== null && height !== null && parent !== null) {
966              // cook up a div (if necessary) and position it 
967              let div = window.document.getElementById("code-annotation-line-highlight");
968              if (div === null) {
969                div = window.document.createElement("div");
970                div.setAttribute("id", "code-annotation-line-highlight");
971                div.style.position = 'absolute';
972                parent.appendChild(div);
973              }
974              div.style.top = top - 2 + "px";
975              div.style.height = height + 4 + "px";
976              div.style.left = 0;
977              let gutterDiv = window.document.getElementById("code-annotation-line-highlight-gutter");
978              if (gutterDiv === null) {
979                gutterDiv = window.document.createElement("div");
980                gutterDiv.setAttribute("id", "code-annotation-line-highlight-gutter");
981                gutterDiv.style.position = 'absolute';
982                const codeCell = window.document.getElementById(targetCell);
983                const gutter = codeCell.querySelector('.code-annotation-gutter');
984                gutter.appendChild(gutterDiv);
985              }
986              gutterDiv.style.top = top - 2 + "px";
987              gutterDiv.style.height = height + 4 + "px";
988            }
989            selectedAnnoteEl = annoteEl;
990          }
991        };
992        const unselectCodeLines = () => {
993          const elementsIds = ["code-annotation-line-highlight", "code-annotation-line-highlight-gutter"];
994          elementsIds.forEach((elId) => {
995            const div = window.document.getElementById(elId);
996            if (div) {
997              div.remove();
998            }
999          });
1000          selectedAnnoteEl = undefined;
1001        };
1002          // Handle positioning of the toggle
1003      window.addEventListener(
1004        "resize",
1005        throttle(() => {
1006          elRect = undefined;
1007          if (selectedAnnoteEl) {
1008            selectCodeLines(selectedAnnoteEl);
1009          }
1010        }, 10)
1011      );
1012      function throttle(fn, ms) {
1013      let throttle = false;
1014      let timer;
1015        return (...args) => {
1016          if(!throttle) { // first call gets through
1017              fn.apply(this, args);
1018              throttle = true;
1019          } else { // all the others get throttled
1020              if(timer) clearTimeout(timer); // cancel #2
1021              timer = setTimeout(() => {
1022                fn.apply(this, args);
1023                timer = throttle = false;
1024              }, ms);
1025          }
1026        };
1027      }
1028        // Attach click handler to the DT
1029        const annoteDls = window.document.querySelectorAll('dt[data-target-cell]');
1030        for (const annoteDlNode of annoteDls) {
1031          annoteDlNode.addEventListener('click', (event) => {
1032            const clickedEl = event.target;
1033            if (clickedEl !== selectedAnnoteEl) {
1034              unselectCodeLines();
1035              const activeEl = window.document.querySelector('dt[data-target-cell].code-annotation-active');
1036              if (activeEl) {
1037                activeEl.classList.remove('code-annotation-active');
1038              }
1039              selectCodeLines(clickedEl);
1040              clickedEl.classList.add('code-annotation-active');
1041            } else {
1042              // Unselect the line
1043              unselectCodeLines();
1044              clickedEl.classList.remove('code-annotation-active');
1045            }
1046          });
1047        }
1048    const findCites = (el) => {
1049      const parentEl = el.parentElement;
1050      if (parentEl) {
1051        const cites = parentEl.dataset.cites;
1052        if (cites) {
1053          return {
1054            el,
1055            cites: cites.split(' ')
1056          };
1057        } else {
1058          return findCites(el.parentElement)
1059        }
1060      } else {
1061        return undefined;
1062      }
1063    };
1064    var bibliorefs = window.document.querySelectorAll('a[role="doc-biblioref"]');
1065    for (var i=0; i<bibliorefs.length; i++) {
1066      const ref = bibliorefs[i];
1067      const citeInfo = findCites(ref);
1068      if (citeInfo) {
1069        tippyHover(citeInfo.el, function() {
1070          var popup = window.document.createElement('div');
1071          citeInfo.cites.forEach(function(cite) {
1072            var citeDiv = window.document.createElement('div');
1073            citeDiv.classList.add('hanging-indent');
1074            citeDiv.classList.add('csl-entry');
1075            var biblioDiv = window.document.getElementById('ref-' + cite);
1076            if (biblioDiv) {
1077              citeDiv.innerHTML = biblioDiv.innerHTML;
1078            }
1079            popup.appendChild(citeDiv);
1080          });
1081          return popup.innerHTML;
1082        });
1083      }
1084    }
1085  });
1086  </script>
1086
1087<input type="hidden" id="giscus-base-theme" value="light">
1088<input type="hidden" id="giscus-alt-theme" value="light">
1089<script>
1090  function loadGiscus() {
1091    // Function to get the theme based on body class
1092    const getTheme = () => {
1093      let baseTheme = document.getElementById('giscus-base-theme').value;
1094      let altTheme = document.getElementById('giscus-alt-theme').value;
1095      return document.body.classList.contains('quarto-dark') ? altTheme : baseTheme;
1096    };
1097    const script = document.createElement("script");
1098    script.src = "https://giscus.app/client.js";
1099    script.async = true;
1100    script.dataset.repo = "neuroimaginador/website";
1101    script.dataset.repoId = "R_kgDOJ1sUKw";
1102    script.dataset.category = "General";
1103    script.dataset.categoryId = "DIC_kwDOJ1sUK84CdJtu";
1104    script.dataset.mapping = "title";
1105    script.dataset.reactionsEnabled = "1";
1106    script.dataset.emitMetadata = "0";
1107    script.dataset.inputPosition = "top";
1108    script.dataset.theme = getTheme();
1109    script.dataset.lang = "en";
1110    script.crossOrigin = "anonymous";
1111    // Append the script to the desired div instead of at the end of the body
1112    document.getElementById("quarto-content").appendChild(script);
1113  }
1114  loadGiscus();
1115</script>
1115
1116</div> <!-- /content -->
1117<footer class="footer">
1118  <div class="nav-footer">
1119    <div class="nav-footer-left">
1120<p><strong>Domingo López-Rodríguez</strong><br> Department of Applied Mathematics<br> University of Málaga</p>
1121</div>   
1122    <div class="nav-footer-center">
1123      <ul class="footer-items list-unstyled">
1124    <li class="nav-item compact">
1125    <a class="nav-link" href="https://twitter.com/dominlopez">
1126      <i class="bi bi-twitter" role="img" aria-label="Twitter">
1127</i> 
1128    </a>
1129  </li>  
1130    <li class="nav-item compact">
1131    <a class="nav-link" href="https://mastodon.social/">
1132      <i class="bi bi-mastodon" role="img" aria-label="Mastodon">
1133</i> 
1134    </a>
1135  </li>  
1136    <li class="nav-item compact">
1137    <a class="nav-link" href="https://github.com/neuroimaginador">
1138      <i class="bi bi-github" role="img" aria-label="Github">
1139</i> 
1140    </a>
1141  </li>  
1142    <li class="nav-item compact">
1143    <a class="nav-link" href="mailto:[email protected]">
1144      <i class="bi bi-envelope" role="img" aria-label="Email">
1145</i> 
1146    </a>
1147  </li>  
1148</ul>
1149    <div class="cookie-consent-footer"><a href="#" id="open_preferences_center">Cookie Preferences</a></div></div>
1150    <div class="nav-footer-right">
1151<p><a href="https://www.uma.es" target="_blank" style="color: #fdfbf7; text-decoration: underline;">University of Málaga</a><br> Built with <a href="https://quarto.org">Quarto</a></p>
1152</div>
1153  </div>
1154</footer>
1155
1156
1157
1158
1159<script src="../site_libs/quarto-html/zenscroll-min.js"></script>
1159
1160</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.