PageSourceSearch

https://pietrostefani.com/papers

html pietrostefani.com collected 2026-09-24 10:35:13 UTC 33,836 bytes, 700 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.39">
6
7<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes">
8
9
10<title>Publications – Elisabetta Pietrostefani</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="./assets/favicon.svg" rel="icon" type="image/svg+xml">
33<script src="site_libs/quarto-html/quarto.js"></script>
vendor: 1 bytes, line 33
33
34<script src="site_libs/quarto-html/popper.min.js"></script>
vendor: 1 bytes, line 34
34
35<script src="site_libs/quarto-html/tippy.umd.min.js"></script>
35
36<link href="site_libs/quarto-html/tippy.css" rel="stylesheet">
37<link href="site_libs/quarto-html/quarto-syntax-highlighting-e26003cea8cd680ca0c55a263523d882.css" rel="stylesheet" id="quarto-text-highlighting-styles">
38<script src="site_libs/bootstrap/bootstrap.min.js"></script>
38
39<link href="site_libs/bootstrap/bootstrap-icons.css" rel="stylesheet">
40<link href="site_libs/bootstrap/bootstrap-518349efc12e5c6411259d03c752f14e.min.css" rel="stylesheet" append-hash="true" id="quarto-bootstrap" data-mode="light">
41<script id="quarto-search-options" type="application/json">{
42  "location": "navbar",
43  "copy-button": false,
44  "collapse-after": 3,
45  "panel-placement": "end",
46  "type": "overlay",
47  "limit": 50,
48  "keyboard-shortcut": [
49    "f",
50    "/",
51    "s"
52  ],
53  "show-item-context": false,
54  "language": {
55    "search-no-results-text": "No results",
56    "search-matching-documents-text": "matching documents",
57    "search-copy-link-title": "Copy link to search",
58    "search-hide-matches-text": "Hide additional matches",
59    "search-more-match-text": "more match in this document",
60    "search-more-matches-text": "more matches in this document",
61    "search-clear-button-title": "Clear",
62    "search-text-placeholder": "",
63    "search-detached-cancel-button-title": "Cancel",
64    "search-submit-button-title": "Submit",
65    "search-label": "Search"
66  }
67}</script>
67
68<style>html{ scroll-behavior: smooth; }</style>
69<link rel="icon" href="./favicon.ico?v=4" sizes="any">
70<link rel="shortcut icon" href="./favicon.ico?v=4" type="image/x-icon">
71<link rel="icon" href="./favicon-v3.ico" sizes="any">
72<link rel="icon" href="./assets/favicon.svg?v=4" type="image/svg+xml">
73<link rel="apple-touch-icon" href="./apple-touch-icon.png?v=4">
74
75
76</head>
77
78<body class="nav-fixed fullcontent">
79
80<div id="quarto-search-results"></div>
81  <header id="quarto-header" class="headroom fixed-top">
82    <nav class="navbar navbar-expand-lg " data-bs-theme="dark">
83      <div class="navbar-container container-fluid">
84      <div class="navbar-brand-container mx-auto">
85    <a class='navbar-brand' href='/'>
86    <span class="navbar-title">Elisabetta Pietrostefani</span>
87    </a>
88  </div>
89            <div id="quarto-search" class="" title="Search"></div>
90          <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(); }">
91  <span class="navbar-toggler-icon"></span>
92</button>
93          <div class="collapse navbar-collapse" id="navbarCollapse">
94            <ul class="navbar-nav navbar-nav-scroll me-auto">
95  <li class="nav-item">
96    <a class='nav-link' href='/projects'> 
97<span class="menu-text">Projects</span></a>
98  </li>  
99  <li class="nav-item">
100    <a aria-current='page' class='nav-link active' href='/papers'> 
101<span class="menu-text">Publications</span></a>
102  </li>  
103  <li class="nav-item">
104    <a class='nav-link' href='/courses'> 
105<span class="menu-text">Teaching</span></a>
106  </li>  
107  <li class="nav-item">
108    <a class='nav-link' href='/log'> 
109<span class="menu-text">Log</span></a>
110  </li>  
111</ul>
112          </div> <!-- /navcollapse -->
113            <div class="quarto-navbar-tools">
114</div>
115      </div> <!-- /container-fluid -->
116    </nav>
117</header>
118<!-- content -->
119<div id="quarto-content" class="quarto-container page-columns page-rows-contents page-layout-article page-navbar">
120<!-- sidebar -->
121<!-- margin-sidebar -->
122    
123<!-- main -->
124<main class="content" id="quarto-document-content">
125
126<header id="title-block-header" class="quarto-title-block default">
127<div class="quarto-title">
128<h1 class="title">Publications</h1>
129</div>
130
131
132
133<div class="quarto-title-meta">
134
135    
136  
137    
138  </div>
139  
140
141
142</header>
143
144
145<div class="lead" style="font-size: 1rem; color: var(--muted); margin: 0 0 2.4rem; max-width: 65ch;">
146<p>An up-to-date list is available on <a href="https://scholar.google.com/citations?hl=en&amp;user=VVogR6sAAAAJ">Google Scholar</a> and <a href="https://orcid.org/0000-0002-8115-1868">ORCID</a>.</p>
147</div>
148<section id="under-review-or-in-press" class="level2">
149<h2 data-anchor-id="under-review-or-in-press">Under review or in press</h2>
150<div class="paper-list">
151<p><strong>Pietrostefani, E., Baumann, H., Harker, C., Sayyad, D., &amp; Shebeitah, R.</strong> (2026). Urban Quality of Life in Times of War. (Under review at <em>Cities</em>).</p>
152<p><strong>Kenyon, G., Pietrostefani, E., Robinson, C., &amp; Gkountouna, O.</strong> (2025). The Price of Cool: Using Hedonic Modelling to Assess Spatial Inequalities of Air Conditioning in Madrid. (R&amp;R at <em>The Geographical Journal</em>).</p>
153<p><strong>Pietrostefani, E.</strong> (2020). Conservation Planning and Informal Institutions: Heterogeneous Patterns in Italian Cities. (Under review at <em>Regional Studies</em>).</p>
154<p><strong>Pietrostefani, E., Mason, M., &amp; Rowe, F.</strong> (2026). Policy-Oriented Data Pipelines for Dynamic Estimation of Disaster-Induced Displacement. (Under review at <em>Vienna Yearbook of Population Research</em>).</p>
155<p><strong>Pietrostefani, E., &amp; Sleiman, Y.</strong> (2022). Assessing Vulnerabilities in Post-Blast Beirut. (Submitting to at <em>Annals of the American Association of Geographers</em>).</p>
156<p><strong>Melios, G., Pietrostefani, E., &amp; Sleiman, Y.</strong> (2026). <a href="https://discovery.ucl.ac.uk/id/eprint/10190727/1/SSRN-id4479897.pdf">Who Needs Job Security in a Crisis? Evidence from a Field Experiment in Lebanon</a>. (Submitted to <em>Journal of Economic Behavior &amp; Organization</em>).</p>
157<p><strong>Pietrostefani, E., Makki, D., &amp; Sleiman, Y.</strong> (2022). (In)formal Employment — Default or Choice: A Mixed-Methods Investigation. (Submitting to <em>World Development</em>).</p>
158<p><strong>Garofani, G., &amp; Pietrostefani, E.</strong> (2026). The Urban Promise? Diverging Economic Perceptions of Opportunity Around the World. (Submitting to <em>Urban Studies</em>).</p>
159</div>
160</section>
161<section id="section" class="level2">
162<h2 data-anchor-id="section">2026</h2>
163<div class="paper-list">
164<ol type="1">
165<li><p><strong>Ahlfeldt, G. M., Pietrostefani, E., &amp; Zhang, A.</strong> (2026). <a href="https://cepr.org/publications/dp21022">The Economics of Architecture</a>. <em>CEPR Discussion Paper.</em></p></li>
166<li><p><strong>Sato, Y., Pietrostefani, E., Mahabir, R., &amp; Arribas-Bel, D.</strong> (2026). <a href="https://www.sciencedirect.com/science/article/pii/S0198971526000943">City2Graph: A Python library for Heterogeneous Graph Neural Networks and spatial analysis in urban systems</a>. <em>Computers, Environment and Urban Systems</em>, 130, 102492.</p></li>
167</ol>
168</div>
169</section>
170<section id="section-1" class="level2">
171<h2 data-anchor-id="section-1">2025</h2>
172<div class="paper-list">
173<ol type="1">
174<li><p><strong>Iradukunda, R., Rowe, F., &amp; Pietrostefani, E.</strong> (2025). <a href="https://www.nature.com/articles/s41599-025-06137-4">Estimating internal displacement in Ukraine from high-frequency GPS mobile phone data</a>. <em>Nature Humanities and Social Sciences Communications</em>, 12(1), 1863.</p></li>
175<li><p><strong>Pietrostefani, E., Mason, M., Iradukunda, R., Tran-Jones, H., Loktieva, I., &amp; Rowe, F.</strong> (2025). Dynamic Estimates of Displacement in Disaster Regions: A Policy-Driven Framework Triangulating Data. <em>Report.</em> IOM, Geneva.</p></li>
176</ol>
177</div>
178</section>
179<section id="section-2" class="level2">
180<h2 data-anchor-id="section-2">2024</h2>
181<div class="paper-list">
182<ol type="1">
183<li><p><strong>Mintchev, N., Daher, M., Jallad, M., Zaher, R., Pietrostefani, E., Ghamrawi, G., Al Harrache, A., Majed, A., &amp; Moore, H. L.</strong> (2024). <a href="https://journals.sagepub.com/doi/pdf/10.1177/19408447241256052">Citizen Social Science for Improved Quality of Life: Research, Interventions, Evaluations</a>. <em>International Review of Qualitative Research.</em> SAGE.</p></li>
184<li><p><strong>Boeri, F., Di Cataldo, M., &amp; Pietrostefani, E.</strong> (2024). <a href="https://iris.unive.it/bitstream/10278/5045981/1/Boeri_DiCataldo_Pietrostefani_JoEG.pdf">Localized effects of confiscated and re-allocated real estate mafia assets</a>. <em>Journal of Economic Geography</em>, 24(2), 219–240.</p></li>
185<li><p><strong>Pietrostefani, E., Garofani, G., &amp; Melios, G.</strong> (2024). <a href="https://www.elgaronline.com/edcollchap/book/9781839106958/book-part-9781839106958-13.xml">Spatial Polarisation of Labour Markets: A Comparative Approach</a>. <em>In</em> Handbook on Labour Markets in Transition. Edward Elgar.</p></li>
186<li><p><strong>Woodcraft, S., Izcue-Gana, J., Melios, G., Tzivanakis, N., Pietrostefani, E., Chan, G., Hasan, Z., &amp; Perez, J.</strong> (2024). <a href="https://discovery.ucl.ac.uk/id/eprint/10195858/">Prosperity in Heath, Barking and Dagenham: Findings from the Prosperity in East London 2021–2031 Longitudinal Study</a>. <em>Report.</em> UCL Institute for Global Prosperity.</p></li>
187<li><p><strong>Woodcraft, S., Izcue-Gana, J., Melios, G., Tzivanakis, N., Pietrostefani, E., Chan, G., Hasan, Z., &amp; Perez, J.</strong> (2024). <a href="https://discovery.ucl.ac.uk/id/eprint/10195859/">Prosperity in and around London’s Olympic Park: Findings from the Prosperity in East London 2021–2031 Longitudinal Study</a>. <em>Report.</em> UCL Institute for Global Prosperity.</p></li>
188<li><p><strong>Woodcraft, S., Izcue-Gana, J., Melios, G., Tzivanakis, N., Pietrostefani, E., Chan, G., Hasan, Z., &amp; Perez, J.</strong> (2024). <a href="https://discovery.ucl.ac.uk/id/eprint/10195860/">Prosperity in the Teviot Estate and Coventry Cross Estate, Tower Hamlets: Findings from the Prosperity in East London 2021–2031 Longitudinal Study</a>. <em>Report.</em> UCL Institute for Global Prosperity.</p></li>
189<li><p><strong>Woodcraft, S., Izcue-Gana, J., Melios, G., Tzivanakis, N., Pietrostefani, E., Chan, G., Hasan, Z., &amp; Perez, J.</strong> (2024). <a href="https://discovery.ucl.ac.uk/id/eprint/10195861/">Prosperity in London’s Royal Docks, Newham: Findings from the Prosperity in East London 2021–2031 Longitudinal Study</a>. <em>Report.</em> UCL Institute for Global Prosperity.</p></li>
190</ol>
191</div>
192</section>
193<section id="section-3" class="level2">
194<h2 data-anchor-id="section-3">2023</h2>
195<div class="paper-list">
196<ol type="1">
197<li><p><strong>Pietrostefani, E., Dabaj, J., &amp; Boano, C.</strong> (2023). <a href="https://discovery.ucl.ac.uk/id/eprint/10168696/1/Pietrostefani%2CDabaj%2C%20Boano%202023.pdf">Rethinking ‘Spaces of Exchange’ for Future Cities</a>. <em>In</em> Future Cities — City Futures: Emerging Urban Perspectives (pp.&nbsp;208–215). TU Delft.</p></li>
198<li><p><strong>Ahlfeldt, G. M., &amp; Pietrostefani, E.</strong> (2023). <a href="https://www.bak.admin.ch/dam/bak/de/dokumente/kulturpflege/publikationen/study-quality-ells-ahlfeldt-pietrostefani.pdf.download.pdf/Study_Quality_sells_Ahlfeldt-Pietrostefani.pdf">“Quality Sells”: High-Quality Baukultur as a Success Factor for the Construction and Real Estate Industry</a>. <em>Report.</em> Swiss Federal Office of Culture.</p></li>
199</ol>
200</div>
201</section>
202<section id="section-4" class="level2">
203<h2 data-anchor-id="section-4">2022</h2>
204<div class="paper-list">
205<ol type="1">
206<li><p><strong>Pietrostefani, E.</strong> (2022). <a href="https://www.cogitatiopress.com/urbanplanning/article/view/4851">Urban Transformations and Complex Values: Insights from Beirut</a>. <em>Urban Planning</em>, 7(1), 1–13.</p></li>
207<li><p><strong>Mintchev, N., Daher, M., Jallad, M., Pietrostefani, E., Moore, H. L., Ghamrawi, G., Al Harrache, A., Majed, A., &amp; Younes, Y.</strong> (2022). <a href="https://journals.sagepub.com/doi/full/10.1177/16094069221133232">Sustained Citizen Science From Research to Solutions: A New Impact Model for the Social Sciences</a>. <em>International Journal of Qualitative Methods</em>, 21, 1–16.</p></li>
208<li><p><strong>Jallad, M., Mintchev, N., Pietrostefani, E., Daher, M., &amp; Moore, H. L.</strong> (2022). <a href="https://www.tandfonline.com/doi/abs/10.1080/13645579.2021.1942664">Citizen Social Science and Pathways to Prosperity: Co-Designing Research and Impact in Beirut, Lebanon</a>. <em>International Journal of Social Research Methodology</em>, 25(6), 769–782.</p></li>
209<li><p><strong>Ahlfeldt, G. M., &amp; Pietrostefani, E.</strong> (2022). Revisiting the Economic Effects of Density in the Wake of the COVID-19 Pandemic. <em>In</em> European Cities After COVID-19: Strategies for Resilient Cities and Real Estate (pp.&nbsp;95–106). Springer.</p></li>
210<li><p><strong>Pietrostefani, E., Dabaj, J., Jallad, M., Maassarani, S., Makki, D., Mersalli, T., Mintchev, N., Sleiman, Y., Sleiman, M., &amp; Moore, H. L.</strong> (2022). <a href="https://discovery.ucl.ac.uk/id/eprint/10156806/">Prosperity Report — El Mina, Tripoli</a>. <em>Report.</em> UCL and CatalyticAction.</p></li>
211<li><p><strong>Pietrostefani, E., Dabaj, J., Sleiman, Y., Jallad, M., Maassarani, S., &amp; Charalambous, E.</strong> (2022). <a href="https://discovery.ucl.ac.uk/id/eprint/10143225/">Assessing Vulnerabilities for Urban Recovery Solutions</a>. <em>Report.</em> UCL and CatalyticAction.</p></li>
212</ol>
213</div>
214</section>
215<section id="section-5" class="level2">
216<h2 data-anchor-id="section-5">2021</h2>
217<div class="paper-list">
218<ol type="1">
219<li><p><strong>Ahlfeldt, G. M., &amp; Pietrostefani, E.</strong> (2021). Die ökonomischen Effekte urbaner Dichte: Eine Bestandsaufnahme im Lichte der Corona-Pandemie. <em>In</em> Die Europäische Stadt nach Corona: Strategien für resiliente Städte und Immobilien (pp.&nbsp;111–124). Springer.</p></li>
220<li><p><strong>Charalambous, E., Pietrostefani, E., &amp; Woodcraft, S.</strong> (2021). <a href="https://discovery.ucl.ac.uk/id/eprint/10130980/">Ethnicity and Prosperity in East London: How Racial Inequalities Impact Experiences of the Good Life</a>. <em>Report.</em> UCL Institute for Global Prosperity.</p></li>
221</ol>
222</div>
223</section>
224<section id="section-6" class="level2">
225<h2 data-anchor-id="section-6">2020</h2>
226<div class="paper-list">
227<ol type="1">
228<li><p><strong>Pietrostefani, E., &amp; Holman, N.</strong> (2020). <a href="https://www.sciencedirect.com/science/article/pii/S030590062030026X">The politics of conservation planning: a comparative study of urban heritage making in the Global North and the Global South</a>. <em>
228Progress in Planning</em>, 145, 100505.</p></li>
229<li><p><strong>RELIEF Centre &amp; UN-Habitat Lebanon</strong> (2020). <a href="https://discovery.ucl.ac.uk/id/eprint/10116434/">Hamra Neighbourhood Profile 2020</a>. <em>Report.</em> UN-Habitat Lebanon.</p></li>
230</ol>
231</div>
232</section>
233<section id="section-7" class="level2">
234<h2 data-anchor-id="section-7">2019</h2>
235<div class="paper-list">
236<ol type="1">
237<li><strong>Ahlfeldt, G., &amp; Pietrostefani, E.</strong> (2019). <a href="https://cepr.org/active/publications/discussion_papers/dp.php?dpno=13440">The economic effects of density: a synthesis</a>. <em>Journal of Urban Economics</em>, 111, 93–107.</li>
238</ol>
239</div>
240</section>
241<section id="section-8" class="level2">
242<h2 data-anchor-id="section-8">2018</h2>
243<div class="paper-list">
244<ol type="1">
245<li><strong>Ahlfeldt, G., Pietrostefani, E., Schumann, A., &amp; Matsumoto, T.</strong> (2018). <a href="http://newclimateeconomy.report/workingpapers/wp-content/uploads/sites/5/2017/09/NCE2017_OECD_CompactUrbanGrowth.pdf">Demystifying compact urban growth: Evidence from 300 studies from across the world</a>. <em>OECD Regional Development Working Papers</em>, 2018/03. OECD Publishing.</li>
246</ol>
247</div>
248</section>
249<section id="section-9" class="level2">
250<h2 data-anchor-id="section-9">2017</h2>
251<div class="paper-list">
252<ol type="1">
253<li><p><strong>Fawaz, M., Salamé, I., Serhan, D., Pietrostefani, E., Abdo, N., &amp; Feghali, D.</strong> (2017). <a href="https://www.aub.edu.lb/ifi/Documents/publications/policy_briefs/2017-2018/20180318_you_can_stay_in_beirut.pdf">You Can Stay in Beirut: Towards Inclusive Urban Housing Policy</a>. <em>Policy brief.</em> American University of Beirut, Social Justice and the City (AUB Policy Institute Brief #8/2017).</p></li>
254<li><p><strong>Ahlfeldt, G., &amp; Pietrostefani, E.</strong> (2017). <a href="https://researchonline.lse.ac.uk/id/eprint/83638/1/sercdp0215.pdf">The Compact City in Empirical Research: A Quantitative Literature Review</a>. <em>SERC Discussion Paper.</em></p></li>
255</ol>
256</div>
257</section>
258<section id="section-10" class="level2">
259<h2 data-anchor-id="section-10">2015</h2>
260<div class="paper-list">
261<ol type="1">
262<li><strong>Pietrostefani, E.</strong> (2015). <a href="https://shs.cairn.info/article/TFD_118_0065/pdf?lang=fr">Valuating Urban Heritage in the Perspective of Holistic Development: Illustrating the Lebanese Case</a>. <em>La valeur économique du patrimoine — Techniques Financières et Développement</em>, Epargne Sans Frontière, no. 118.</li>
263</ol>
264</div>
265
266
267</section>
268
269</main> <!-- /main -->
270<script src="assets/menu.js"></script>
vendor: 1 bytes, line 270
270
271<script id="quarto-html-after-body" type="application/javascript">
272window.document.addEventListener("DOMContentLoaded", function (event) {
273  const toggleBodyColorMode = (bsSheetEl) => {
274    const mode = bsSheetEl.getAttribute("data-mode");
275    const bodyEl = window.document.querySelector("body");
276    if (mode === "dark") {
277      bodyEl.classList.add("quarto-dark");
278      bodyEl.classList.remove("quarto-light");
279    } else {
280      bodyEl.classList.add("quarto-light");
281      bodyEl.classList.remove("quarto-dark");
282    }
283  }
284  const toggleBodyColorPrimary = () => {
285    const bsSheetEl = window.document.querySelector("link#quarto-bootstrap");
286    if (bsSheetEl) {
287      toggleBodyColorMode(bsSheetEl);
288    }
289  }
290  toggleBodyColorPrimary();  
291  const isCodeAnnotation = (el) => {
292    for (const clz of el.classList) {
293      if (clz.startsWith('code-annotation-')) {                     
294        return true;
295      }
296    }
297    return false;
298  }
299  const onCopySuccess = function(e) {
300    // button target
301    const button = e.trigger;
302    // don't keep focus
303    button.blur();
304    // flash "checked"
305    button.classList.add('code-copy-button-checked');
306    var currentTitle = button.getAttribute("title");
307    button.setAttribute("title", "Copied!");
308    let tooltip;
309    if (window.bootstrap) {
310      button.setAttribute("data-bs-toggle", "tooltip");
311      button.setAttribute("data-bs-placement", "left");
312      button.setAttribute("data-bs-title", "Copied!");
313      tooltip = new bootstrap.Tooltip(button, 
314        { trigger: "manual", 
315          customClass: "code-copy-button-tooltip",
316          offset: [0, -8]});
317      tooltip.show();    
318    }
319    setTimeout(function() {
320      if (tooltip) {
321        tooltip.hide();
322        button.removeAttribute("data-bs-title");
323        button.removeAttribute("data-bs-toggle");
324        button.removeAttribute("data-bs-placement");
325      }
326      button.setAttribute("title", currentTitle);
327      button.classList.remove('code-copy-button-checked');
328    }, 1000);
329    // clear code selection
330    e.clearSelection();
331  }
332  const getTextToCopy = function(trigger) {
333      const codeEl = trigger.previousElementSibling.cloneNode(true);
334      for (const childEl of codeEl.children) {
335        if (isCodeAnnotation(childEl)) {
336          childEl.remove();
337        }
338      }
339      return codeEl.innerText;
340  }
341  const clipboard = new window.ClipboardJS('.code-copy-button:not([data-in-quarto-modal])', {
342    text: getTextToCopy
343  });
344  clipboard.on('success', onCopySuccess);
345  if (window.document.getElementById('quarto-embedded-source-code-modal')) {
346    const clipboardModal = new window.ClipboardJS('.code-copy-button[data-in-quarto-modal]', {
347      text: getTextToCopy,
348      container: window.document.getElementById('quarto-embedded-source-code-modal')
349    });
350    clipboardModal.on('success', onCopySuccess);
351  }
352    var localhostRegex = new RegExp(/^(?:http|https):\/\/localhost\:?[0-9]*\//);
353    var mailtoRegex = new RegExp(/^mailto:/);
354      var filterRegex = new RegExp("https:\/\/pietrostefani\.com");
355    var isInternal = (href) => {
356        return filterRegex.test(href) || localhostRegex.test(href) || mailtoRegex.test(href);
357    }
358    // Inspect non-navigation links and adorn them if external
359 	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)');
360    for (var i=0; i<links.length; i++) {
361      const link = links[i];
362      if (!isInternal(link.href)) {
363        // undo the damage that might have been done by quarto-nav.js in the case of
364        // links that we want to consider external
365        if (link.dataset.originalHref !== undefined) {
366          link.href = link.dataset.originalHref;
367        }
368      }
369    }
370  function tippyHover(el, contentFn, onTriggerFn, onUntriggerFn) {
371    const config = {
372      allowHTML: true,
373      maxWidth: 500,
374      delay: 100,
375      arrow: false,
376      appendTo: function(el) {
377          return el.parentElement;
378      },
379      interactive: true,
380      interactiveBorder: 10,
381      theme: 'quarto',
382      placement: 'bottom-start',
383    };
384    if (contentFn) {
385      config.content = contentFn;
386    }
387    if (onTriggerFn) {
388      config.onTrigger = onTriggerFn;
389    }
390    if (onUntriggerFn) {
391      config.onUntrigger = onUntriggerFn;
392    }
393    window.tippy(el, config); 
394  }
395  const noterefs = window.document.querySelectorAll('a[role="doc-noteref"]');
396  for (var i=0; i<noterefs.length; i++) {
397    const ref = noterefs[i];
398    tippyHover(ref, function() {
399      // use id or data attribute instead here
400      let href = ref.getAttribute('data-footnote-href') || ref.getAttribute('href');
401      try { href = new URL(href).hash; } catch {}
402      const id = href.replace(/^#\/?/, "");
403      const note = window.document.getElementById(id);
404      if (note) {
405        return note.innerHTML;
406      } else {
407        return "";
408      }
409    });
410  }
411  const xrefs = window.document.querySelectorAll('a.quarto-xref');
412  const processXRef = (id, note) => {
413    // Strip column container classes
414    const stripColumnClz = (el) => {
415      el.classList.remove("page-full", "page-columns");
416      if (el.children) {
417        for (const child of el.children) {
418          stripColumnClz(child);
419        }
420      }
421    }
422    stripColumnClz(note)
423    if (id === null || id.startsWith('sec-')) {
424      // Special case sections, only their first couple elements
425      const container = document.createElement("div");
426      if (note.children && note.children.length > 2) {
427        container.appendChild(note.children[0].cloneNode(true));
428        for (let i = 1; i < note.children.length; i++) {
429          const child = note.children[i];
430          if (child.tagName === "P" && child.innerText === "") {
431            continue;
432          } else {
433            container.appendChild(child.cloneNode(true));
434            break;
435          }
436        }
437        if (window.Quarto?.typesetMath) {
438          window.Quarto.typesetMath(container);
439        }
440        return container.innerHTML
441      } else {
442        if (window.Quarto?.typesetMath) {
443          window.Quarto.typesetMath(note);
444        }
445        return note.innerHTML;
446      }
447    } else {
448      // Remove any anchor links if they are present
449      const anchorLink = note.querySelector('a.anchorjs-link');
450      if (anchorLink) {
451        anchorLink.remove();
452      }
453      if (window.Quarto?.typesetMath) {
454        window.Quarto.typesetMath(note);
455      }
456      if (note.classList.contains("callout")) {
457        return note.outerHTML;
458      } else {
459        return note.innerHTML;
460      }
461    }
462  }
463  for (var i=0; i<xrefs.length; i++) {
464    const xref = xrefs[i];
465    tippyHover(xref, undefined, function(instance) {
466      instance.disable();
467      let url = xref.getAttribute('href');
468      let hash = undefined; 
469      if (url.startsWith('#')) {
470        hash = url;
471      } else {
472        try { hash = new URL(url).hash; } catch {}
473      }
474      if (hash) {
475        const id = hash.replace(/^#\/?/, "");
476        const note = window.document.getElementById(id);
477        if (note !== null) {
478          try {
479            const html = processXRef(id, note.cloneNode(true));
480            instance.setContent(html);
481          } finally {
482            instance.enable();
483            instance.show();
484          }
485        } else {
486          // See if we can fetch this
487          fetch(url.split('#')[0])
488          .then(res => res.text())
489          .then(html => {
490            const parser = new DOMParser();
491            const htmlDoc = parser.parseFromString(html, "text/html");
492            const note = htmlDoc.getElementById(id);
493            if (note !== null) {
494              const html = processXRef(id, note);
495              instance.setContent(html);
496            } 
497          }).finally(() => {
498            instance.enable();
499            instance.show();
500          });
501        }
502      } else {
503        // See if we can fetch a full url (with no hash to target)
504        // This is a special case and we should probably do some content thinning / targeting
505        fetch(url)
506        .then(res => res.text())
507        .then(html => {
508          const parser = new DOMParser();
509          const htmlDoc = parser.parseFromString(html, "text/html");
510          const note = htmlDoc.querySelector('main.content');
511          if (note !== null) {
512            // This should only happen for chapter cross references
513            // (since there is no id in the URL)
514            // remove the first header
515            if (note.children.length > 0 && note.children[0].tagName === "HEADER") {
516              note.children[0].remove();
517            }
518            const html = processXRef(null, note);
519            instance.setContent(html);
520          } 
521        }).finally(() => {
522          instance.enable();
523          instance.show();
524        });
525      }
526    }, function(instance) {
527    });
528  }
529      let selectedAnnoteEl;
530      const selectorForAnnotation = ( cell, annotation) => {
531        let cellAttr = 'data-code-cell="' + cell + '"';
532        let lineAttr = 'data-code-annotation="' +  annotation + '"';
533        const selector = 'span[' + cellAttr + '][' + lineAttr + ']';
534        return selector;
535      }
536      const selectCodeLines = (annoteEl) => {
537        const doc = window.document;
538        const targetCell = annoteEl.getAttribute("data-target-cell");
539        const targetAnnotation = annoteEl.getAttribute("data-target-annotation");
540        const annoteSpan = window.document.querySelector(selectorForAnnotation(targetCell, targetAnnotation));
541        const lines = annoteSpan.getAttribute("data-code-lines").split(",");
542        const lineIds = lines.map((line) => {
543          return targetCell + "-" + line;
544        })
545        let top = null;
546        let height = null;
547        let parent = null;
548        if (lineIds.length > 0) {
549            //compute the position of the single el (top and bottom and make a div)
550            const el = window.document.getElementById(lineIds[0]);
551            top = el.offsetTop;
552            height = el.offsetHeight;
553            parent = el.parentElement.parentElement;
554          if (lineIds.length > 1) {
555            const lastEl = window.document.getElementById(lineIds[lineIds.length - 1]);
556            const bottom = lastEl.offsetTop + lastEl.offsetHeight;
557            height = bottom - top;
558          }
559          if (top !== null && height !== null && parent !== null) {
560            // cook up a div (if necessary) and position it 
561            let div = window.document.getElementById("code-annotation-line-highlight");
562            if (div === null) {
563              div = window.document.createElement("div");
564              div.setAttribute("id", "code-annotation-line-highlight");
565              div.style.position = 'absolute';
566              parent.appendChild(div);
567            }
568            div.style.top = top - 2 + "px";
569            div.style.height = height + 4 + "px";
570            div.style.left = 0;
571            let gutterDiv = window.document.getElementById("code-annotation-line-highlight-gutter");
572            if (gutterDiv === null) {
573              gutterDiv = window.document.createElement("div");
574              gutterDiv.setAttribute("id", "code-annotation-line-highlight-gutter");
575              gutterDiv.style.position = 'absolute';
576              const codeCell = window.document.getElementById(targetCell);
577              const gutter = codeCell.querySelector('.code-annotation-gutter');
578              gutter.appendChild(gutterDiv);
579            }
580            gutterDiv.style.top = top - 2 + "px";
581            gutterDiv.style.height = height + 4 + "px";
582          }
583          selectedAnnoteEl = annoteEl;
584        }
585      };
586      const unselectCodeLines = () => {
587        const elementsIds = ["code-annotation-line-highlight", "code-annotation-line-highlight-gutter"];
588        elementsIds.forEach((elId) => {
589          const div = window.document.getElementById(elId);
590          if (div) {
591            div.remove();
592          }
593        });
594        selectedAnnoteEl = undefined;
595      };
596        // Handle positioning of the toggle
597    window.addEventListener(
598      "resize",
599      throttle(() => {
600        elRect = undefined;
601        if (selectedAnnoteEl) {
602          selectCodeLines(selectedAnnoteEl);
603        }
604      }, 10)
605    );
606    function throttle(fn, ms) {
607    let throttle = false;
608    let timer;
609      return (...args) => {
610        if(!throttle) { // first call gets through
611            fn.apply(this, args);
612            throttle = true;
613        } else { // all the others get throttled
614            if(timer) clearTimeout(timer); // cancel #2
615            timer = setTimeout(() => {
616              fn.apply(this, args);
617              timer = throttle = false;
618            }, ms);
619        }
620      };
621    }
622      // Attach click handler to the DT
623      const annoteDls = window.document.querySelectorAll('dt[data-target-cell]');
624      for (const annoteDlNode of annoteDls) {
625        annoteDlNode.addEventListener('click', (event) => {
626          const clickedEl = event.target;
627          if (clickedEl !== selectedAnnoteEl) {
628            unselectCodeLines();
629            const activeEl = window.document.querySelector('dt[data-target-cell].code-annotation-active');
630            if (activeEl) {
631              activeEl.classList.remove('code-annotation-active');
632            }
633            selectCodeLines(clickedEl);
634            clickedEl.classList.add('code-annotation-active');
635          } else {
636            // Unselect the line
637            unselectCodeLines();
638            clickedEl.classList.remove('code-annotation-active');
639          }
640        });
641      }
642  const findCites = (el) => {
643    const parentEl = el.parentElement;
644    if (parentEl) {
645      const cites = parentEl.dataset.cites;
646      if (cites) {
647        return {
648          el,
649          cites: cites.split(' ')
650        };
651      } else {
652        return findCites(el.parentElement)
653      }
654    } else {
655      return undefined;
656    }
657  };
658  var bibliorefs = window.document.querySelectorAll('a[role="doc-biblioref"]');
659  for (var i=0; i<bibliorefs.length; i++) {
660    const ref = bibliorefs[i];
661    const citeInfo = findCites(ref);
662    if (citeInfo) {
663      tippyHover(citeInfo.el, function() {
664        var popup = window.document.createElement('div');
665        citeInfo.cites.forEach(function(cite) {
666          var citeDiv = window.document.createElement('div');
667          citeDiv.classList.add('hanging-indent');
668          citeDiv.classList.add('csl-entry');
669          var biblioDiv = window.document.getElementById('ref-' + cite);
670          if (biblioDiv) {
671            citeDiv.innerHTML = biblioDiv.innerHTML;
672          }
673          popup.appendChild(citeDiv);
674        });
675        return popup.innerHTML;
676      });
677    }
678  }
679});
680</script>
680
681</div> <!-- /content -->
682<footer class="footer">
683  <div class="nav-footer">
684    <div class="nav-footer-left">
685<p>© 2026 Elisabetta Pietrostefani</p>
686</div>   
687    <div class="nav-footer-center">
688      &nbsp;
689    </div>
690    <div class="nav-footer-right">
691<p><i class="bi bi-code-slash" aria-hidden="true"></i> Built with Quarto</p>
692</div>
693  </div>
694</footer>
695
696
697
698
699<script src="site_libs/quarto-html/zenscroll-min.js"></script>
699
700</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.