diff --git a/.docker/Dockerfile b/.docker/Dockerfile index caab63bb..bf5792e4 100644 --- a/.docker/Dockerfile +++ b/.docker/Dockerfile @@ -1,5 +1,5 @@ # start with official ruby docker image as base -FROM ruby:3.1.2 +FROM ruby:3.4 # set working directory within container WORKDIR /usr/src/app diff --git a/.github/workflows/build-preview.yaml b/.github/workflows/build-preview.yaml index 7df63913..0f85b4a5 100644 --- a/.github/workflows/build-preview.yaml +++ b/.github/workflows/build-preview.yaml @@ -26,7 +26,7 @@ jobs: # runs potentially untrusted code uses: ruby/setup-ruby@v1 with: - ruby-version: "3.1" + ruby-version: "3.4" bundler-cache: true - name: Get Pages URL diff --git a/.github/workflows/build-site.yaml b/.github/workflows/build-site.yaml index 9b184db0..18c9bf75 100644 --- a/.github/workflows/build-site.yaml +++ b/.github/workflows/build-site.yaml @@ -25,7 +25,7 @@ jobs: - name: Install Ruby packages uses: ruby/setup-ruby@v1 with: - ruby-version: "3.1" + ruby-version: "3.4" bundler-cache: true - name: Get Pages URL diff --git a/Gemfile.lock b/Gemfile.lock index ee2cb121..6422535e 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,75 +1,107 @@ GEM remote: https://rubygems.org/ specs: - Ascii85 (1.1.0) - addressable (2.8.1) - public_suffix (>= 2.0.2, < 6.0) - afm (0.2.2) - async (2.8.1) - console (~> 1.10) + Ascii85 (2.0.1) + addressable (2.9.1) + public_suffix (>= 2.0.2, < 8.0) + afm (1.0.1) + async (2.46.0) + console (~> 1.29) fiber-annotation - io-event (~> 1.1) - timers (~> 4.1) + io-event (~> 1.21) + base64 (0.3.0) + benchmark (0.5.0) + bigdecimal (3.3.1) colorator (1.1.0) - concurrent-ruby (1.2.2) - console (1.23.4) + concurrent-ruby (1.3.8) + console (1.38.0) fiber-annotation - fiber-local + fiber-local (~> 1.1) json + csv (3.3.7) em-websocket (0.5.3) eventmachine (>= 0.12.9) http_parser.rb (~> 0) - ethon (0.16.0) + ethon (0.19.1) ffi (>= 1.15.0) + logger eventmachine (1.2.7) - ffi (1.15.5) - ffi (1.15.5-x64-mingw-ucrt) + eventmachine (1.2.7-x64-mingw32) + ffi (1.17.4) + ffi (1.17.4-aarch64-linux-gnu) + ffi (1.17.4-x64-mingw-ucrt) + ffi (1.17.4-x86-linux-gnu) + ffi (1.17.4-x86_64-darwin) + ffi (1.17.4-x86_64-linux-gnu) fiber-annotation (0.2.0) - fiber-local (1.0.0) + fiber-local (1.1.0) + fiber-storage + fiber-storage (1.0.1) forwardable-extended (2.6.0) gemoji (3.0.1) - google-protobuf (3.22.0) - google-protobuf (3.22.0-arm64-darwin) - google-protobuf (3.22.0-x64-mingw-ucrt) + google-protobuf (4.36.2) + bigdecimal + rake (~> 13.3) + google-protobuf (4.36.2-aarch64-linux-gnu) + bigdecimal + rake (~> 13.3) + google-protobuf (4.36.2-arm64-darwin) + bigdecimal + rake (~> 13.3) + google-protobuf (4.36.2-x64-mingw-ucrt) + bigdecimal + rake (~> 13.3) + google-protobuf (4.36.2-x86-linux-gnu) + bigdecimal + rake (~> 13.3) + google-protobuf (4.36.2-x86_64-darwin) + bigdecimal + rake (~> 13.3) + google-protobuf (4.36.2-x86_64-linux-gnu) + bigdecimal + rake (~> 13.3) hashery (2.1.2) - html-proofer (5.0.8) + html-proofer (5.2.3) addressable (~> 2.3) async (~> 2.1) + benchmark (~> 0.5) nokogiri (~> 1.13) pdf-reader (~> 2.11) rainbow (~> 3.0) typhoeus (~> 1.3) yell (~> 2.0) zeitwerk (~> 2.5) - http_parser.rb (0.8.0) - i18n (1.12.0) + http_parser.rb (0.8.1) + i18n (1.15.2) concurrent-ruby (~> 1.0) - io-event (1.4.4) - jekyll (4.3.2) + io-event (1.22.3) + jekyll (4.4.1) addressable (~> 2.4) + base64 (~> 0.2) colorator (~> 1.0) + csv (~> 3.0) em-websocket (~> 0.5) i18n (~> 1.0) jekyll-sass-converter (>= 2.0, < 4.0) jekyll-watch (~> 2.0) + json (~> 2.6) kramdown (~> 2.3, >= 2.3.1) kramdown-parser-gfm (~> 1.0) liquid (~> 4.0) - mercenary (>= 0.3.6, < 0.5) + mercenary (~> 0.3, >= 0.3.6) pathutil (~> 0.9) rouge (>= 3.0, < 5.0) safe_yaml (~> 1.0) terminal-table (>= 1.8, < 4.0) webrick (~> 1.7) - jekyll-feed (0.17.0) + jekyll-feed (0.18.0) jekyll (>= 3.7, < 5.0) - jekyll-last-modified-at (1.3.0) + jekyll-last-modified-at (1.3.2) jekyll (>= 3.7, < 5.0) - posix-spawn (~> 0.3.9) - jekyll-redirect-from (0.16.0) + jekyll-redirect-from (0.17.0) jekyll (>= 3.3, < 5.0) - jekyll-sass-converter (3.0.0) - sass-embedded (~> 1.54) + jekyll-sass-converter (3.1.0) + sass-embedded (~> 1.75) jekyll-sitemap (1.4.0) jekyll (>= 3.7, < 5.0) jekyll-spaceship (0.10.2) @@ -79,59 +111,78 @@ GEM rainbow (~> 3.0) jekyll-watch (2.2.1) listen (~> 3.0) - json (2.7.1) - kramdown (2.4.0) - rexml + json (2.21.2) + kramdown (2.5.2) + rexml (>= 3.4.4) kramdown-parser-gfm (1.1.0) kramdown (~> 2.0) liquid (4.0.4) - listen (3.8.0) + listen (3.10.1) + logger rb-fsevent (~> 0.10, >= 0.10.3) rb-inotify (~> 0.9, >= 0.9.10) + logger (1.7.0) mercenary (0.4.0) - mini_portile2 (2.8.1) - nokogiri (1.13.10) - mini_portile2 (~> 2.8.0) + mini_portile2 (2.8.9) + nokogiri (1.19.4) + mini_portile2 (~> 2.8.2) racc (~> 1.4) - nokogiri (1.13.10-arm64-darwin) + nokogiri (1.19.4-aarch64-linux-gnu) + racc (~> 1.4) + nokogiri (1.19.4-arm-linux-gnu) + racc (~> 1.4) + nokogiri (1.19.4-arm64-darwin) + racc (~> 1.4) + nokogiri (1.19.4-x64-mingw-ucrt) + racc (~> 1.4) + nokogiri (1.19.4-x86_64-darwin) + racc (~> 1.4) + nokogiri (1.19.4-x86_64-linux-gnu) racc (~> 1.4) pathutil (0.16.2) forwardable-extended (~> 2.6) - pdf-reader (2.12.0) - Ascii85 (~> 1.0) - afm (~> 0.2.1) + pdf-reader (2.16.0) + Ascii85 (>= 1.0, < 3.0, != 2.0.0) + afm (>= 0.2.1, < 2) hashery (~> 2.0) - ruby-rc4 ttfunk - posix-spawn (0.3.15) - public_suffix (5.0.1) - racc (1.6.2) + public_suffix (7.0.5) + racc (1.8.1) rainbow (3.1.1) - rake (13.1.0) + rake (13.4.2) rb-fsevent (0.11.2) - rb-inotify (0.10.1) + rb-inotify (0.11.1) ffi (~> 1.0) - rexml (3.2.5) - rouge (3.30.0) - ruby-rc4 (0.1.5) + rexml (3.4.4) + rouge (4.7.0) safe_yaml (1.0.5) - sass-embedded (1.58.3) - google-protobuf (~> 3.21) - rake (>= 10.0.0) - sass-embedded (1.58.3-arm64-darwin) - google-protobuf (~> 3.21) - sass-embedded (1.58.3-x64-mingw-ucrt) - google-protobuf (~> 3.21) + sass-embedded (1.107.0) + google-protobuf (~> 4.31) + rake (~> 13.3) + sass-embedded (1.107.0-aarch64-linux-gnu) + google-protobuf (~> 4.31) + sass-embedded (1.107.0-arm-linux-gnueabihf) + google-protobuf (~> 4.31) + sass-embedded (1.107.0-arm64-darwin) + google-protobuf (~> 4.31) + sass-embedded (1.107.0-riscv64-linux-gnu) + google-protobuf (~> 4.31) + sass-embedded (1.107.0-x64-mingw-ucrt) + google-protobuf (~> 4.31) + sass-embedded (1.107.0-x86_64-darwin) + google-protobuf (~> 4.31) + sass-embedded (1.107.0-x86_64-linux-gnu) + google-protobuf (~> 4.31) terminal-table (3.0.2) unicode-display_width (>= 1.1.1, < 3) - timers (4.3.5) - ttfunk (1.7.0) - typhoeus (1.4.1) - ethon (>= 0.9.0) - unicode-display_width (2.4.2) - webrick (1.8.1) + ttfunk (1.8.0) + bigdecimal (~> 3.1) + typhoeus (1.7.1) + ethon (>= 0.19.1, < 0.20.0) + unicode-display_width (2.6.0) + webrick (1.9.2) yell (2.2.2) - zeitwerk (2.6.13) + zeitwerk (2.8.3) PLATFORMS aarch64-linux diff --git a/_data/citations.yaml b/_data/citations.yaml index 54939adc..7d214d3a 100644 --- a/_data/citations.yaml +++ b/_data/citations.yaml @@ -1700,6 +1700,64 @@ orcid: 0009-0006-4712-570X plugin: orcid.py file: orcid.yaml +- title: "Animarium: an open, reproducible pipeline for synthetic populations of Italian\ + \ cities \u2014 from ISTAT sources to open data" + authors: + - Mirko Degli Esposti + publisher: Preprint + date: '2026-01-01' + link: https://animarium.it/preprint.pdf + type: preprint + description: Preprint presenting the Animarium system and the collection of synthetic + populations of Italian cities. + tags: + - synthetic populations + - reproducibility + - open data + plugin: sources.py + file: sources.yaml +- title: 'Animarium: Technical Report Version 1' + authors: + - Mirko Degli Esposti + publisher: Technical report v1.0, University of Bologna. arXiv:2608.27111 + date: '2026-01-01' + link: https://arxiv.org/abs/2608.27111 + type: preprint + description: Technical report on the Animarium pipeline (arXiv:2608.27111, https://doi.org/10.48550/arXiv.2608.27111). + tags: + - synthetic populations + - technical report + plugin: sources.py + file: sources.yaml +- title: Scalable Maximum Entropy Population Synthesis via Persistent Contrastive + Divergence + authors: + - Mirko Degli Esposti + publisher: Preprint, arXiv:2603.27312 + date: '2026-01-01' + link: https://arxiv.org/abs/2603.27312 + type: preprint + description: Solver, method and benchmarks for maximum-entropy population synthesis + (https://doi.org/10.48550/arXiv.2603.27312). + tags: + - synthetic populations + - maximum entropy + plugin: sources.py + file: sources.yaml +- title: 'Calibrating the Instrument: Controllability of an LLM-Driven Synthetic Population' + authors: + - Mirko Degli Esposti + publisher: Preprint, arXiv:2607.00910 + date: '2026-01-01' + link: https://arxiv.org/abs/2607.00910 + type: preprint + description: Controllability and internal validity of an LLM-driven simulation instrument + (https://doi.org/10.48550/arXiv.2607.00910). + tags: + - synthetic populations + - LLM agents + plugin: sources.py + file: sources.yaml - id: arxiv:2511.09258 title: 'Urban Complexity through Vision Intelligence: Variance, Gradients, and Correlations across Six Italian Cities' diff --git a/_data/seminars.yaml b/_data/seminars.yaml new file mode 100644 index 00000000..9c4f5edb --- /dev/null +++ b/_data/seminars.yaml @@ -0,0 +1,73 @@ +# Synthetic Populations Seminar Series (page: seminars/synthetic-populations/) +# +# To maintain the programme edit only this file. Empty values are not shown. +# - Add a talk: copy a block under "talks". Keep "id" stable (it is used in the calendar file). +# - date_confirmed: false -> no date, no calendar file; use date_options for the candidate dates. +# - online_only: true -> talk shown as online only (no venue in the calendar file). +# - start/end must carry the Europe/Rome offset (+01:00 in winter, +02:00 in summer time). +# - Teams link: fill teams_url (shown only for future seminars). +# - After a seminar: fill video_url, slides_url, paper_url (only with the speaker's approval). +# - Mailing list: fill mailing_list_url with the subscription page of the service (it replaces the email request below). +# - Until then, interest_email is the address that receives requests to be added to the announcements +# (use an alias that reaches the organisers; remove it to show "registration will open soon" instead). + +youtube_channel_url: https://www.youtube.com/@CityScienceLabBologna +mailing_list_url: "" +interest_email: syntheticpopulationsseminar@live.unibo.it + +talks: + - id: 2026-11-10-riazi + date_confirmed: true + date: 2026-11-10 + start: "2026-11-10T16:00:00+01:00" + end: "2026-11-10T17:00:00+01:00" + speaker: Maryam Riazi + affiliation: City Science Laboratory, Department of Physics and Astronomy, University of Bologna + title: "Synthetic Population for Bologna: Maximum-Entropy Approach via Persistent Contrastive Divergence on Heterogeneous ISTAT Data" + abstract: >- + Synthetic populations are needed where census microdata are unavailable and individual privacy must be preserved. This talk presents a synthetic population of 500,000 inhabitants for the Comune of Bologna, each described by 34 categorical attributes (about 2.6 × 10^19 possible profiles) and built from aggregate ISTAT tables alone. + + The population is generated with GibbsPCDSolver, a stochastic maximum-entropy solver based on Persistent Contrastive Divergence that remains tractable for a large number of attributes. The central difficulty is dealing with real-world heterogeneous data: the ISTAT tables are published at five geographical levels and contradict one another, so no joint distribution can satisfy all targets at once. A reliability-weighting scheme is proposed to handle the residual error. A further requirement is that no individual be logically impossible; a Metropolis–Hastings move that transposes an entire block of attributes in one step removes such cases, and four diagnostic tools support the analysis. + + The resulting population contains no logically impossible individual and retains full diversity, a property that reweighting methods such as raking lose and that downstream agent-based simulations of Bologna require. + teams_url: "" + video_url: "" + slides_url: "" + paper_url: https://amslaurea.unibo.it/id/eprint/39867/ + + - id: 2026-11-24-scarpa + date_confirmed: true + date: 2026-11-24 + start: "2026-11-24T16:00:00+01:00" + end: "2026-11-24T17:00:00+01:00" + speaker: Silvia Scarpa + affiliation: University of Modena and Reggio Emilia + title: Evaluating synthetic population approaches for Italian municipal-level microdata + abstract: >- + Policy evaluation at small-area level calls for fine-scale microdata, but available sources pull in opposite directions: socio-economic surveys offer rich individual and household information only at coarse geographic levels, while administrative sources give detailed local counts with limited variable depth. + + This talk addresses this trade-off by implementing and comparing deterministic (Iterative Proportional Fitting, Generalized Regression) and probabilistic (Simulated Annealing) reweighting algorithms that align survey weights with known population benchmarks. As an application, a spatially disaggregated synthetic population of the residents of the municipalities of the Emilia-Romagna region is built from the Italian EU-SILC data. The comparison highlights the trade-off between the computational efficiency of deterministic methods and the precision of probabilistic approaches, and offers practical guidance for spatial microsimulation on method fidelity, computational resources and statistical accuracy. + teams_url: "" + video_url: "" + slides_url: "" + paper_url: https://doi.org/10.1016/j.seps.2026.102547 + + - id: 2026-12-15-garrone + date_confirmed: true + online_only: true + date: 2026-12-15 + start: "2026-12-15T16:00:00+01:00" + end: "2026-12-15T17:00:00+01:00" + speaker: Roberto Garrone + affiliation: University of Milano-Bicocca; Open University of Cyprus + title: Synthetic populations as initial conditions for agent-based models + abstract: >- + Synthetic populations are usually discussed in terms of how they are generated. This talk takes a complementary perspective, focusing on their use as initial conditions for agent-based models. + + The starting point is the recent study "When Does the Seed Stop Mattering?", which compares IPF and MaxEnt using AVQ and POSAS data for 1,255 municipalities of Piedmont and Aosta Valley. The discussion centres on the relationship between local information, statistical dependencies inherited from the donor, and the accuracy of the reconstruction. + + From there, the talk turns to the initialisation of agent-based models, using AWSim as an application case to introduce an open question: which properties of the synthetic population must actually be preserved for the conclusions of a simulation to remain reliable? + teams_url: "" + video_url: "" + slides_url: "" + paper_url: "" diff --git a/_data/sources.yaml b/_data/sources.yaml index 2abb31ee..81772813 100644 --- a/_data/sources.yaml +++ b/_data/sources.yaml @@ -1,5 +1,54 @@ # New publications to add at the top +- title: "Animarium: an open, reproducible pipeline for synthetic populations of Italian cities — from ISTAT sources to open data" + authors: + - Mirko Degli Esposti + publisher: Preprint + date: '2026-01-01' + link: https://animarium.it/preprint.pdf + type: preprint + description: Preprint presenting the Animarium system and the collection of synthetic populations of Italian cities. + tags: + - synthetic populations + - reproducibility + - open data + +- title: "Animarium: Technical Report Version 1" + authors: + - Mirko Degli Esposti + publisher: "Technical report v1.0, University of Bologna. arXiv:2608.27111" + date: '2026-01-01' + link: https://arxiv.org/abs/2608.27111 + type: preprint + description: Technical report on the Animarium pipeline (arXiv:2608.27111, https://doi.org/10.48550/arXiv.2608.27111). + tags: + - synthetic populations + - technical report + +- title: Scalable Maximum Entropy Population Synthesis via Persistent Contrastive Divergence + authors: + - Mirko Degli Esposti + publisher: "Preprint, arXiv:2603.27312" + date: '2026-01-01' + link: https://arxiv.org/abs/2603.27312 + type: preprint + description: Solver, method and benchmarks for maximum-entropy population synthesis (https://doi.org/10.48550/arXiv.2603.27312). + tags: + - synthetic populations + - maximum entropy + +- title: "Calibrating the Instrument: Controllability of an LLM-Driven Synthetic Population" + authors: + - Mirko Degli Esposti + publisher: "Preprint, arXiv:2607.00910" + date: '2026-01-01' + link: https://arxiv.org/abs/2607.00910 + type: preprint + description: Controllability and internal validity of an LLM-driven simulation instrument (https://doi.org/10.48550/arXiv.2607.00910). + tags: + - synthetic populations + - LLM agents + - id: arxiv:2511.09258 title: "Urban Complexity through Vision Intelligence: Variance, Gradients, and Correlations across Six Italian Cities" authors: diff --git a/_includes/sp-population.html b/_includes/sp-population.html new file mode 100644 index 00000000..e04246cd --- /dev/null +++ b/_includes/sp-population.html @@ -0,0 +1 @@ +INDIVIDUALS · HOUSEHOLDS · CITIES diff --git a/_styles/seminars.scss b/_styles/seminars.scss new file mode 100644 index 00000000..38f780ee --- /dev/null +++ b/_styles/seminars.scss @@ -0,0 +1,26 @@ +--- +--- + +// Synthetic Populations Seminar Series page; every rule is scoped under .sp +.sp{ + --paper:#f7f6f1;--white:#fff;--ink:#172c36;--muted:#59676c;--line:#d8dedb;--accent:#b54c32;--pale:#edf1ec; + --serif:Georgia,'Times New Roman',serif;--sans:system-ui,-apple-system,BlinkMacSystemFont,'Segoe UI',sans-serif; + background:var(--paper);color:var(--ink);font:16px/1.65 var(--sans);text-align:left; + *{box-sizing:border-box} + h1,h2,h3,p{text-align:left} + a{color:inherit;text-decoration:underline;text-decoration-thickness:1px;text-underline-offset:4px} + a:hover{color:var(--accent)} + button{font:inherit} + a:focus-visible,button:focus-visible,summary:focus-visible{outline:3px solid var(--accent);outline-offset:5px} + .wrap{max-width:1200px;margin:auto;padding-inline:56px} +.action,.hero-link{text-decoration:none} + .hero{background:var(--ink);color:var(--paper);overflow:hidden;position:relative}.hero-inner{display:grid;grid-template-columns:1.5fr 1fr;gap:28px;align-items:center;min-height:465px;padding-top:48px;padding-bottom:52px}.eyebrow{font-size:11px;font-weight:650;letter-spacing:.18em;text-transform:uppercase}.hero .eyebrow{color:#d9a591;display:flex;align-items:center;gap:12px}.eyebrow-dot{width:6px;height:6px;border-radius:50%;background:currentColor;display:inline-block}.hero h1{font:normal clamp(58px,6.6vw,86px)/1.03 var(--serif);letter-spacing:-.045em;margin:23px 0}.hero-subtitle{font-size:17px;line-height:1.6;color:#d7dfdf;max-width:430px;margin:0}.hero-bottom{display:flex;align-items:center;flex-wrap:wrap;gap:12px 24px;margin-top:28px}.hero-link{font-size:13px;color:var(--paper);text-decoration:none;border-bottom:1px solid #82908f;padding-bottom:4px}.hero-link:hover{color:#e3b39e}.hero-edition{font-size:12px;color:#aabbbb}.population{position:relative;aspect-ratio:1.1;max-width:345px;justify-self:end;width:100%}.population svg{display:block;width:100%;height:100%}.art-label{font:9px var(--sans);letter-spacing:2px;fill:#a9b9b7}.info{display:grid;grid-template-columns:.9fr 1.5fr .95fr .65fr;border-bottom:1px solid var(--line);padding-block:26px;gap:26px}.info-label{font-size:10px;text-transform:uppercase;letter-spacing:.15em;color:var(--muted);margin-bottom:6px}.info-value{font-size:13px;font-weight:600;line-height:1.5}.info-sub{font-size:12px;color:var(--muted);font-weight:400} + .about{padding-block:60px;display:grid;grid-template-columns:1fr 2fr;gap:80px;border-bottom:1px solid var(--line)}.section-number{display:block;color:var(--accent);font-size:10px;letter-spacing:.16em;margin-bottom:12px}.section-title{font:normal 32px/1.15 var(--serif);letter-spacing:-.025em;margin:0}.about-copy p{font-size:15px;margin:0 0 15px}.about-copy p:last-child{margin:0}.themes{font-size:12px!important;color:var(--muted);border-left:2px solid var(--accent);padding-left:15px;margin-top:22px!important} + .programme{padding-block:57px}.section-head{display:flex;justify-content:space-between;align-items:end;gap:24px;margin-bottom:32px}.season{font-size:11px;color:var(--muted);letter-spacing:.11em;text-transform:uppercase;margin-bottom:2px}.talk{display:grid;grid-template-columns:120px 1fr;gap:35px;padding:33px 0;border-top:1px solid var(--line)}.talk:last-of-type{border-bottom:1px solid var(--line)}.talk-date{padding-top:4px}.date-day{font:normal 52px/1 var(--serif);letter-spacing:-.07em;display:block}.date-month{font-size:11px;letter-spacing:.17em;text-transform:uppercase;display:block;margin-top:10px}.date-time{color:var(--muted);font-size:12px;display:block;margin-top:5px}.date-pending{font:normal 25px/1.2 var(--serif);display:block;max-width:100px}.date-options{font-size:11px;color:var(--muted);display:block;line-height:1.65;margin-top:10px}.talk-topline{display:flex;align-items:center;gap:12px;margin-bottom:12px}.talk-number{font-size:10px;color:var(--muted);letter-spacing:.15em}.tag{font-size:9px;text-transform:uppercase;letter-spacing:.1em;padding:3px 8px;border:1px solid #c5cec7;border-radius:3px;line-height:1.4;color:var(--muted)}.tag-next{border-color:#d7ae9e;color:var(--accent);background:#f7eee7}.talk h3{font:normal clamp(23px,2.6vw,30px)/1.25 var(--serif);letter-spacing:-.02em;margin:0 0 17px;max-width:800px;text-wrap:pretty}.speaker{margin:0;font-size:15px;font-weight:650}.affiliation{display:block;color:var(--muted);font-size:12px;font-weight:400;margin-top:2px}.talk-actions{display:flex;align-items:center;flex-wrap:wrap;gap:11px 20px;margin-top:22px}.action{display:inline-flex;align-items:center;gap:8px;font-size:12px;font-weight:550;color:var(--ink);padding:8px 13px;border:1px solid #b7c3bd;border-radius:4px;background:transparent;text-decoration:none;cursor:pointer}.action:hover{border-color:var(--accent);color:var(--accent);background:#fff}.action-primary{background:var(--ink);color:white;border-color:var(--ink)}.action-primary:hover{background:#294a58;color:white;border-color:#294a58}.action svg{width:14px;height:14px;stroke:currentColor;fill:none;stroke-width:1.6}.forthcoming{color:var(--muted);font-size:11px}.pending-title{color:var(--muted)}details{margin-top:22px;font-size:14px}summary{cursor:pointer;font-size:12px;text-underline-offset:4px}details p{max-width:740px;color:var(--muted)}.programme-note{font-size:12px;color:var(--muted);margin-top:23px;max-width:780px} + .attend{background:#e9eee8;padding-block:45px}.attend-inner{display:grid;grid-template-columns:1fr 2fr;gap:80px}.attend-columns{display:grid;grid-template-columns:1fr 1fr;gap:34px}.attend h3{font-size:13px;margin:0 0 10px;font-weight:650}.attend p{font-size:13px;line-height:1.75;margin:0;color:#47594f}.small-link{display:inline-block;font-size:12px;margin-top:14px}.recordings-note{border-top:1px solid #cbd5c9;margin-top:24px;padding-top:20px;font-size:12px;color:#47594f}.icon-arrow{font-size:15px}.sr-only{position:absolute;width:1px;height:1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap} + @media(min-width:1400px){.hero-inner{min-height:490px}} + @media(max-width:800px){section{padding-inline:0}.wrap{padding-inline:28px}.hero-inner{grid-template-columns:1.45fr 1fr;min-height:390px;padding-block:38px;gap:4px}.hero h1{font-size:clamp(44px,8.5vw,65px)}.population{min-width:190px}.hero-subtitle{font-size:15px}.hero-edition{display:none}.info{gap:20px;grid-template-columns:1fr 1.3fr}.about,.attend-inner{gap:35px;grid-template-columns:1fr 2fr}.about{padding-block:43px}.talk{grid-template-columns:90px 1fr;gap:23px}.attend-columns{gap:24px}} + @media(max-width:560px){.wrap{padding-inline:22px}.hero-inner{grid-template-columns:1fr;min-height:0;padding-top:35px;padding-bottom:37px;position:relative}.hero-copy{position:relative;z-index:1}.hero h1{font-size:clamp(34px,13.5vw,66px);margin-top:22px;max-width:350px}.hero-subtitle{max-width:285px;font-size:15px}.population{position:absolute;width:190px;min-width:0;right:-70px;bottom:0;opacity:.27;pointer-events:none}.hero .eyebrow{font-size:9px;letter-spacing:.16em}.hero-bottom{margin-top:24px}.info{padding-block:22px;gap:20px 18px}.info-value{font-size:12px}.info-sub{font-size:11px}.info-label{font-size:9px}.about,.attend-inner{grid-template-columns:1fr;gap:24px}.about{padding-block:36px}.about-copy p{font-size:14px}.section-title{font-size:30px}.section-number{margin-bottom:9px}.section-head{margin-bottom:25px;flex-direction:column;align-items:start;gap:10px}.season{font-size:9px}.programme{padding-block:38px}.talk{grid-template-columns:1fr;gap:12px;padding-block:27px}.talk-date,.talk-date time{display:flex;flex-wrap:wrap;align-items:baseline;gap:2px 10px}.date-day{font-size:38px}.date-month{font-size:9px;margin-top:0}.date-time{font-size:10px;margin-top:0}.talk h3{font-size:23px;line-height:1.27}.speaker{font-size:14px}.affiliation{font-size:11px}.talk-actions{gap:10px 14px;margin-top:18px}.action{font-size:11px;padding:7px 9px}.forthcoming{font-size:10px}.talk-topline{gap:7px;flex-wrap:wrap}.talk-number{font-size:9px}.tag{font-size:8px}.date-pending{font-size:20px;max-width:none}.date-options{font-size:10px;margin-top:0}.attend{padding-block:34px}.attend-columns{grid-template-columns:1fr;gap:22px}.contact{overflow-wrap:anywhere}} + @media print{.population,.talk-actions,.hero-bottom{display:none}.hero{background:white;color:black}.hero .eyebrow,.hero-subtitle{color:black}.hero-inner{min-height:0;padding-block:20px}.hero h1{font-size:48px}.wrap{padding-inline:0}.talk{break-inside:avoid}.about,.programme{padding-block:20px}.attend{background:white}.info{padding-block:15px}} + .newsletter{padding-block:42px;border-bottom:1px solid var(--line)}.newsletter-inner{display:grid;grid-template-columns:1fr 2fr;gap:80px}.newsletter-copy p{font-size:14px;margin:0 0 15px}.newsletter-status,.newsletter-copy .newsletter-note{font-size:12px;color:var(--muted)}.newsletter-copy .action{margin-bottom:14px}[hidden]{display:none!important}@media(max-width:800px){.newsletter-inner{gap:35px}}@media(max-width:560px){.newsletter-inner{grid-template-columns:1fr;gap:24px}.newsletter{padding-block:34px}} +} diff --git a/index.md b/index.md index cefce906..0e120a53 100644 --- a/index.md +++ b/index.md @@ -5,6 +5,7 @@ The City Science Laboratory is a multidisciplinary research group within the Department of Physics and Astronomy at the University of Bologna. The Laboratory brings together expertise in physics, mathematics, and computer science to investigate the complexity of urban systems. With a focus on mobility, climate, and energy, it aims to advance sustainable and resilient cities through scientific methodologies, computational tools, and the application of artificial intelligence and deep learning algorithms, which are increasingly transforming the analysis and management of urban environments. The Laboratory collaborates with CINECA, one of Europe’s leading high- performance computing centers, on several urban Digital Twin initiatives. Among these, the Digital Twin of the City of Bologna integrates heterogeneous datasets and advanced modeling techniques to generate insights for urban planning, climate adaptation, and energy efficiency. +The Laboratory also works on synthetic populations: geographically detailed, individual-level reconstructions of real populations built from official statistics, registers and surveys, which provide the demographic and social component of urban digital twins and a basis for agent-based simulation, including agents powered by large language models. It hosts the [Synthetic Populations Seminar Series]({{ '/seminars/synthetic-populations/' | relative_url }}). Key research areas include the analysis of Urban LiDAR, Orthophotos, Satellite Data, and other Remote Sensing sources; the study of Infrastructure Morphology and Indicators; the development of Vegetation and Climate Vulnerability Indices; Building Energy Simulations; Urban Microclimate Modeling; Vehicular Mobility Modeling; and Pedestrian Dynamics and Crowd Analysis. By combining advanced computational methods with real-world applications, the City Science Laboratory fosters collaboration with public and private stakeholders to address critical urban challenges and promote evidence-based decision-making. diff --git a/research/index.md b/research/index.md index 38c0e1b8..8a1a33fc 100644 --- a/research/index.md +++ b/research/index.md @@ -24,6 +24,20 @@ We develop large-scale simulations of vehicular traffic in cities such as Bologn Using national railway data, we construct models to reproduce and predict train delay distributions. The aim is to understand systemic inefficiencies and provide data-driven insights for enhancing network reliability and punctuality. +

Synthetic Populations and Urban Digital Twins

+ +

Population Synthesis from Official Statistics

+We build geographically detailed synthetic populations, individual-level reconstructions of real populations obtained from official statistics, registers and surveys so as to reproduce selected statistical characteristics. Individuals and households provide the demographic and social component of urban digital twins, linking census and socioeconomic data to computational models of the city. + +

Maximum Entropy, Data Integration and Validation

+We develop maximum-entropy methods for population synthesis that integrate heterogeneous sources and scale to large populations, with attention to reproducibility, uncertainty and the assessment of quality and model validity. A synthetic population reproduces the constraints it is given; which further features of the real population can be recovered from the available data remains an open question that we treat explicitly. + +

Agent-Based Models, LLM Agents and Generative AI

+Synthetic populations are the starting point for agent-based simulation, including agents driven by large language models, and for generative approaches to population synthesis. We study how controllable and internally consistent such simulation instruments are, with applications to urban systems, health, economics and communication. We also address the computational challenges of generating, simulating and analysing large populations efficiently on high-performance computing systems. + +Our work is accompanied by the open [Animarium](https://animarium.it/) viewer, the [GSP](https://github.com/mirko-degli-esposti/gsp) population generation pipeline and the [Synthetic Populations Seminar Series]({{ '/seminars/synthetic-populations/' | relative_url }}). + +

Urban Energy and Vegetation

Building Energy Simulation

diff --git a/seminars/synthetic-populations/index.md b/seminars/synthetic-populations/index.md new file mode 100644 index 00000000..c218d492 --- /dev/null +++ b/seminars/synthetic-populations/index.md @@ -0,0 +1,113 @@ +--- +title: Seminars +nav: + order: 2 + tooltip: Synthetic Populations Seminar Series +description: "Synthetic Populations Seminar Series at the City Science Laboratory, University of Bologna. Methods, validation and applications. Hybrid seminars, autumn 2026." +--- + +{% include section.html size="full" %} + +{% assign sem = site.data.seminars %} +
+
+
+
+
Research seminars · Autumn 2026
+

Synthetic
Populations

+

Methods, validation and applications.

+ +
+ +
+
+
+
+
When
Tuesdays · 16:00
Europe/Rome
+
Where
Aula Teorici · First floor
Via Irnerio 46, Bologna
+
Format
In person & online
Online via Microsoft Teams
+
Language
English
+
+
+
01 / ABOUT THE SERIES

Building populations.
Studying complexity.

+
+

Synthetic populations are individual-level reconstructions of real populations, built from official aggregates, registers and surveys to reproduce selected statistical characteristics. Geographically detailed representations of individuals and households provide a foundation for studying population heterogeneity, spatial inequalities and collective behaviour, connecting demographic and socioeconomic data to computational models.

+

This seminar series explores how synthetic populations are constructed, validated and used. Methods range from statistical reconstruction and maximum-entropy modelling to deep generative approaches. Generative AI opens further possibilities both for population synthesis—integrating heterogeneous sources and modelling complex dependencies—and for simulation, combining synthetic populations with agent-based models and agents powered by large language models.

+

These developments extend across urban systems and mobility, public health and medicine, economics and finance, communication and other areas of social research. They also raise scientific and computational challenges: which features of real populations can be recovered from available data? How should uncertainty, bias and model validity be assessed? How can individual attributes and simulated behaviours remain consistent across spatial scales? And how can increasingly large and complex populations be generated, simulated and analysed efficiently using high-performance computing?

+

Bringing together perspectives from physics, statistics, computer science and the social and health sciences, the series aims to connect methodological advances with applications, with particular attention to validation, reproducibility and computational scalability.

+

Population synthesis · Maximum entropy · Reproducibility · Agent-based modelling · Generative AI

+
+
+
+
02 / SEMINARS

The programme

November — December 2026
+
+{% for t in sem.talks %} +{% assign n = forloop.index | prepend: "0" | slice: -2, 2 %} +
+
+{% if t.date_confirmed %} + +{% else %} +December{{ t.date_options | default: "Date to be confirmed" }}
Date to be confirmed
+{% endif %} +
+
+
SEMINAR {{ n }}{% unless t.date_confirmed %}Date to be confirmed{% endunless %}{% if t.online_only %}Online only{% endif %}
+

{{ t.title }}

+

{{ t.speaker }}{{ t.affiliation }}

+
+{% if t.date_confirmed %} +{% if t.teams_url != "" and t.teams_url %}Join on Teams {% endif %} +{% endif %} +{% if t.video_url != "" and t.video_url %}Watch recording {% endif %} +{% if t.slides_url != "" and t.slides_url %}Slides {% endif %} +{% if t.paper_url != "" and t.paper_url %}Related paper {% endif %} +{% if t.date_confirmed %}{% endif %} +{% if t.date_confirmed and t.teams_url == "" %}Teams link forthcoming{% endif %} +
+{% if t.abstract != "" and t.abstract %}
Read abstract

{{ t.abstract | escape | newline_to_br }}

{% endif %} +
+
+{% endfor %} +
+

Online access links will be added here before each seminar.

+
+
+
+
+
03 / JOIN US

Attend a seminar

+
+
+

In Bologna

Aula Teorici, first floor
Department of Physics and Astronomy
University of Bologna
Via Irnerio 46, Bologna, Italy

Find the venue
+

Online

Join via the Microsoft Teams link listed with each seminar. All times are given in Europe/Rome. The seminars are held in English, with discussion following the presentation.

Contact the organiser
+
+
Recordings and materials will be linked alongside each talk when available, subject to the speaker’s approval.{% if sem.youtube_channel_url != "" %} Visit our YouTube channel ↗{% endif %}
+
+
+
+
+ +
+

Series organiser: Mirko Degli Esposti · mirko.degliesposti@unibo.it

+
+ + + diff --git a/seminars/synthetic-populations/seminars.js b/seminars/synthetic-populations/seminars.js new file mode 100644 index 00000000..d3160edc --- /dev/null +++ b/seminars/synthetic-populations/seminars.js @@ -0,0 +1,55 @@ +// Progressive enhancement for the Synthetic Populations Seminar Series page. +// The programme itself is rendered at build time from _data/seminars.yaml. +(() => { + 'use strict'; + const talks = JSON.parse(document.getElementById('seminar-data').textContent); + const now = Date.now(); + const articles = [...document.querySelectorAll('.talk[data-end]')]; + + // drop links that only make sense before the seminar; mark the next one + let next = null; + articles.forEach(a => { + const ended = Date.parse(a.dataset.end) <= now; + a.querySelectorAll('[data-future]').forEach(el => { el.hidden = ended; }); + if (!ended && !next) next = a; + }); + if (next) next.querySelector('.tag-next').hidden = false; + + // calendar files (confirmed dates only) + const icalEscape = s => String(s ?? '').replace(/\\/g, '\\\\').replace(/\r?\n/g, '\\n').replace(/,/g, '\\,').replace(/;/g, '\;'); + const utc = s => new Date(s).toISOString().replace(/[-:]/g, '').replace(/\.\d{3}Z$/, 'Z'); + const fold = line => { + const out = []; let chunk = '', length = 0; + for (const ch of line) { + const bytes = new TextEncoder().encode(ch).length; + if (length + bytes > 75) { out.push(chunk); chunk = ' '; length = 1; } + chunk += ch; length += bytes; + } + out.push(chunk); + return out.join('\r\n'); + }; + document.querySelectorAll('.calendar').forEach(button => { + button.hidden = false; + button.addEventListener('click', () => { + const t = talks.find(t => t.id === button.dataset.talk); + if (!t || !t.date_confirmed) return; + const teams = /^https?:\/\//.test(t.teams_url || '') ? t.teams_url : ''; + const description = `${t.speaker} — ${t.affiliation}\nSynthetic Populations Seminar Series\nCity Science Laboratory, University of Bologna\nTime: 16:00 Europe/Rome\n${teams ? 'Teams: ' + teams : 'Check the seminar page for the Teams link.'}`; + const lines = [ + 'BEGIN:VCALENDAR', 'VERSION:2.0', 'PRODID:-//City Science Laboratory//Synthetic Populations Seminars//EN', + 'CALSCALE:GREGORIAN', 'METHOD:PUBLISH', 'BEGIN:VEVENT', + `UID:${t.id}@physycom.github.io`, `DTSTAMP:${utc(new Date().toISOString())}`, + `DTSTART:${utc(t.start)}`, `DTEND:${utc(t.end)}`, + `SUMMARY:${icalEscape(t.speaker + ': ' + t.title)}`, + `LOCATION:${icalEscape(t.online_only ? 'Online (Microsoft Teams)' : 'Aula Teorici, first floor, via Irnerio 46, Bologna, Italy')}`, + `DESCRIPTION:${icalEscape(description)}`, 'STATUS:CONFIRMED', 'END:VEVENT', 'END:VCALENDAR' + ]; + const blob = new Blob([lines.map(fold).join('\r\n') + '\r\n'], { type: 'text/calendar;charset=utf-8' }); + const url = URL.createObjectURL(blob); + const a = document.createElement('a'); + a.href = url; a.download = t.id + '.ics'; + document.body.append(a); a.click(); a.remove(); + setTimeout(() => URL.revokeObjectURL(url), 1000); + }); + }); +})();