I'm a researcher and software developer from Tuscany, Italy, with a PhD in Computer Science from the University of Florence. I work on graph algorithms and large-scale network analysis, and I spend a lot of time with programming languages: Scheme, Smalltalk, Lua, Rust and C.
- 🌐 Homepage and blog: massimo-nocentini.github.io (RSS, books), built with my tufte.hugo theme
- 📄 Curriculum vitae et studiorum: online, LaTeX sources
- ✉️ [email protected] · [email protected]
- Graphs and networks. Research fellow at DiSIA (2024–2026, Graphs and applications, with Prof. Andrea Marino): graph models of the Bitcoin transaction network, algorithms for graphs with large diameter, and crowding estimation in public transport via temporal graphs.
- Relational and logic programming. µKanren and miniKanren in Python, Smalltalk and Scheme, plus Kanren Light, a logic programming system built on HOL Light (with Prof. Marco Maggesi).
- Combinatorics. My PhD (2019, advisor Prof. Donatella Merlini) studied Riordan arrays, generating functions and the OEIS, with symbolic and logic tools.
- Software development. Freelance since 2019 on Pharo Smalltalk and microservice architectures. Before that I spent years in industry on .NET, C# and PostgreSQL.
- A. Bernasconi, D. Di Francesco Maesa, M. Loporchio, A. Marino, M. Nocentini, L. Ricci. Systematizing Graph Models for Bitcoin and Designing Algorithms for Large-Distance Analysis, IEEE Transactions on Network Science and Engineering, 2026.
- D. Bubboloni, C. Catalano, M. Fanfani, A. Marino, P. Nesi, M. Nocentini. Public Transport Crowding Estimation via Temporal Graphs, submitted.
- M. Maggesi, M. Nocentini. Kanren Light: A Dynamically Semi-Certified Interactive Logic Programming System, miniKanren 2020 workshop (code).
- D. Merlini, M. Nocentini. Functions and Jordan canonical forms of Riordan matrices, Linear Algebra and its Applications 565, 2019.
- D. Merlini, M. Nocentini. Algebraic generating functions for languages avoiding Riordan patterns, Journal of Integer Sequences 21, 2018.
- M. Nocentini, D. Merlini. Crawling, (pretty) printing and graphing the OEIS, DiSIA working paper, 2018 (code).
Theses: PhD (defense slides), master (Patterns in Riordan arrays).
Graphs, in Rust and C
- igraph-rs: Rust bindings for igraph (post)
- webgraph-clib-rs: a C library over webgraph-rs compressed graphs; webgraph-foreign-algorithms-rs runs igraph and rustworkx algorithms on them
- avgdist-rs: a sampling algorithm to estimate the average distance in graphs with a large diameter
- utxo2webgraph-rs, utxoscope-rs: Bitcoin UTXO graphs (post)
- dag-rs: DAG algorithms (semiring DP, dominators, reachability, transitive reduction, width) on webgraph DAGs, validated on the Bitcoin Payment Graph (2.18·10⁹ nodes, 8.64·10⁹ arcs)
- coloring-bt-transactions-rs: where did a Bitcoin transaction's coins come from? Colouring transactions by the blocks they descend from (docs)
- graph-tool-rs: a work-in-progress Rust port of graph-tool, moving its runtime failures to compile time
- non-layered-tidy-trees.c: drawing non-layered tidy trees in linear time, also in Rust
- libpq-rs, judy-rs: bindings for PostgreSQL's libpq (post) and Judy arrays
Scheme and relational programming
- aux.scm: auxiliary definitions and macros for CHICKEN Scheme (streams, nondeterminism, HANSEI, monads, unit testing),
now with λProlog-style higher-order logic programming in µKanren (
(aux kanren lambda)), ports of Pie from The Little Typer and J-Bob from The Little Prover, heuristic and adversarial search ((aux search)), and the games of Land of Lisp, up to a playable Dice of Doom web app with a tunable AI and an SVG view of its search tree; its test suites are on the blog - chicken-core: CHICKEN Scheme compiled to WebAssembly, with a REPL console and a notebook in the browser
- concurrent.scm: Concurrent ML for CHICKEN Scheme (post)
- wolfram.scm: talking to the Wolfram Engine from Scheme
- microkanrenpy, microkanrenst, kanren-light: µKanren in Python, Smalltalk and OCaml/HOL Light
Pharo Smalltalk
- pharo-vm: a fork of the Pharo 12 VM with a WebAssembly port that runs stock Pharo 12–15 images in node and in the browser (console, notebook, Morphic world, Iceberg over libgit2 that commits, pushes and pulls from the page), a SimdJSONPlugin, and faster LargeIntegers (post)
- simdjson.st: a strict RFC 8259 JSON reader and writer for Pharo 15 parsed by simdjson, with NeoJSON's API (the writer's output matches NeoJSON byte for byte)
- Containers-*: persistent and classic data structures (skip lists, splay, leftist and binomial heaps, red-black sets, union-find, SBRAL, …), collected in the Booklet-DSst booklet
- srfi-41st (streams), delimcc.st (delimited continuations), FFI bindings to Lua, tree-sitter, Wolfram and poppler
Knuth, literate programming and Lua
- sgb.cweb, bdd-zdd.cweb, SAT.cweb, simpath.cweb: working through Knuth's programs (post)
- exactcover.lua (dancing links), toposort.lua, and Lua bindings for curl, cairo and PostgreSQL
- lua: Lua compiled to WebAssembly (wasm32 and wasm64), with a console and a notebook in the browser
Typesetting and books
- tufte.hugo: a Hugo theme on Tufte CSS that does in HTML what the Tufte-LaTeX classes do in TeX: sidenotes, numbered floats with margin captions, citations, cross-references, theorems, multi-chapter books with an index, print geometry, search and reveal.js slides (example site)
- Books typeset with it from proofread LaTeX transcriptions: La Bibbia di Gerusalemme, X. Léon-Dufour's Dizionario di Teologia Biblica and the Catechismo della Chiesa Cattolica with its Compendio, every biblical reference linked to its verse
- bibbia-dufour.rdf: an RDF ontology centred on the Bible verse, with SHACL shapes, SPARQL queries, a time line of every dated event and an offline explorer