SPB Git

spb/wp44_uqo

Public

WP44: Appendices A (taxonomy), E (data dictionary), H (reproducibility) by Agent L

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Simon-Pierre Boucher committed (Nov 3, 2026) parent 05bf3a4 Browse files

11 changed files +2,944 −6

added agents/briefs/WRITER_APPENDICES_BC.md +22 −0
@@ -0,0 +1,22 @@
1+# Brief — Appendix B (search strategies and sources) and Appendix C (mathematical derivations) — files manuscript/appendices/appB_search_and_sources.tex, appC_derivations.tex
2+
3+Follow agents/briefs/WRITER_COMMON.md. Files start with \section{...} (inside \begin{appendices}).
4+- Appendix B (≈ 8–12 pages): the exact acquisition procedures as executed — read ingestion/*.py, data/raw/README.md,
5+ reports/PHASE0_FEASIBILITY.md, RESEARCH_PLAN.md §2–3, manuscript/sections/part03_data.tex (do not repeat its prose; this
6+ appendix is the operational record). For each source: endpoint/bucket, release/version, filters (OpenAlex field 17 rule,
7+ year range, id-set second pass, API increment slicing by day × primary-CS/non-CS, arXiv OAI set and windows, ACL export, DBLP
8+ dump + DTD), rate limits and budgets, licence, integrity checks (manifest totals, SHA-256 per file, MD5), what was NOT
9+ obtained (Semantic Scholar, OpenAlex key, full texts), and the equivalent of a PRISMA-S search record. Include a table of
10+ exclusion codes E1–E7 with their SQL predicates paraphrased, the keep/hard-exclude type lists and the generic-deposit list
11+ (from systematic_review/define_corpus.py), and the linkage cascade with its thresholds.
12+- Appendix C (≈ 10–14 pages): derivations and proofs referenced by Part IV (manuscript/sections/part04_methodology.tex — read it
13+ first and match its notation): (i) the ITS model as a regression with the HAC covariance estimator and the placebo p-value
14+ as a rank statistic; (ii) Bai–Perron dynamic programme: SSR additivity, the recursion, complexity O(n² m), BIC and LWZ
15+ criteria as implemented in econometrics/structural_change.py; (iii) PELT cost and pruning condition, penalty 2σ² log n;
16+ (iv) BOCPD: Normal–Inverse-Gamma conjugate updates, Student-t predictive, run-length recursion, the fact that with a
17+ constant hazard the mass on r=0 equals H (hence the MAP-run-length detection statistic used in the code); (v) Gini as a
18+ rank formula and its equivalence with the Lorenz definition; (vi) Rao–Stirling and Leinster–Cobbold (q=2) identity;
19+ (vii) Newman–Girvan modularity for directed weighted graphs; (viii) Krippendorff's α with MASI distance; (ix) the
20+ multi-label score rule and the tie-break as a total order; (x) the emerging-topic label and why the feature construction
21+ is look-ahead-free (formal statement in terms of filtrations). Derivations must be correct and self-contained; cite the
22+ original sources (verify any new citation; most keys exist in manuscript/references.bib and references_part04.bib — reuse them).
modified manuscript/appendices/appA_taxonomy.tex +684 −1
@@ -1 +1,684 @@
1−% appA_taxonomy — to be written (Phase 7) 1+% ============================================================================
2+% Appendix A — The ontology of computer-science research (taxonomy)
3+% Written by Agent L (appendices A/E/H instance), 2026-11-03.
4+% Sources of truth: taxonomy/ONTOLOGY.md (hand-written §1–§3 and generated tables), taxonomy/ontology.yaml (v1.0,
5+% 2026-11-03), taxonomy/topic_map.csv, taxonomy/classify.py, taxonomy/VALIDATION.md. Counts in this appendix are
6+% properties of the ontology (numbers of signals, mapped topics and venues), computed from ontology.yaml; they are
7+% not corpus results. Validation results are reported in Part IX.
8+% ============================================================================
9+
10+\section{The Ontology of Computer-Science Research}
11+\label{app:taxonomy}
12+
13+This appendix documents the classification scheme that assigns every eligible work of the corpus to one or
14+more of the forty research categories listed in the mandate (Section~\ref{sec:m-classification} describes the
15+scoring rule and its validation design). The scheme is an \emph{extensible hierarchical ontology} rather than a
16+flat keyword list: forty leaf categories are grouped into eight areas, a small set of parent--child edges records
17+where a leaf specialises another leaf, and a denser set of ``related'' edges records thematic adjacency. The
18+mapping from bibliographic signals to leaves is data, not prose. It lives in one Python module per area
19+(\texttt{taxonomy/src/*.py}), is validated and serialised by \texttt{taxonomy/build\_ontology.py} into the
20+machine-readable file \texttt{taxonomy/ontology.yaml} (version~1.0, built on 2026-11-03 from the OpenAlex topic
21+export of 2026-10-14 and the DBLP stream table of 2018--2026) and into an audit table of OpenAlex topics
22+(\texttt{taxonomy/topic\_map.csv}). Everything stated below is derived from those files; the tables were
23+regenerated from the YAML file rather than transcribed, and the counts they contain are properties of the
24+ontology itself (how many topics, venues and patterns point to a category), not statistics of the corpus. The
25+agreement of the rules with independent raters on the stratified validation sample is reported in Part~IX and is
26+deliberately not anticipated here.
27+
28+\subsection{Structure: areas, leaves and edges}
29+\label{app:taxonomy-structure}
30+
31+The ontology has three levels. The eight areas of Table~\ref{tab:appA-areas} are an organisational device for the
32+manuscript (they correspond to the disciplinary reviews of Parts~V--VII and to the area-level flow statistics of
33+Part~VIII); classification operates on leaves only, and every leaf belongs to exactly one area. The forty leaves
34+are numbered as in the mandate (Table~\ref{tab:appA-leaves}). Seven \texttt{parent\_\allowbreak of}/\texttt{child\_\allowbreak of}
35+edges record genuine specialisation:
36+\texttt{foundation\_\allowbreak models} $\rightarrow$ \texttt{llm} and \texttt{multimodal\_\allowbreak ai};
37+\texttt{programming\_\allowbreak languages} $\rightarrow$ \texttt{compilers};
38+\texttt{distributed\_\allowbreak computing} $\rightarrow$ \texttt{cloud\_\allowbreak computing} and \texttt{edge\_\allowbreak computing};
39+\texttt{computer\_\allowbreak architecture} $\rightarrow$ \texttt{ai\_\allowbreak accelerators};
40+\texttt{privacy\_\allowbreak preserving\_\allowbreak computation} $\rightarrow$ \texttt{federated\_\allowbreak learning}.
41+These edges have one operational consequence, the tie-breaking rule for the primary category (a child wins
42+over its parent at equal score), and one interpretive consequence: a work carrying both labels is not
43+double-counted as evidence of convergence between distinct fields, since the two labels are nested by
44+construction. The \texttt{related} edges (236 directed entries in the YAML file, 144 distinct unordered pairs)
45+carry no weight in classification; they document which categories the ontology's author expected to share
46+works, and they are used in Part~IX only to separate expected from unexpected co-classification.
47+
48+\begin{table}[htbp]
49+\begin{singlespace}
50+\centering
51+\caption{The eight areas and their leaves (\texttt{ontology.yaml}, \texttt{areas}).}
52+\label{tab:appA-areas}
53+\small
54+\begin{tabularx}{\textwidth}{p{3.3cm} p{3.9cm} c X}
55+\toprule
56+Area id & Name & Leaves & Leaf identifiers \\
57+\midrule
58+\texttt{ai\_\allowbreak ml} & Artificial Intelligence and Machine Learning & 9 &
59+ \texttt{llm}, \texttt{foundation\_\allowbreak models}, \texttt{multimodal\_\allowbreak ai}, \texttt{generative\_\allowbreak ai}, \texttt{ai\_\allowbreak agents},
60+ \texttt{reinforcement\_\allowbreak learning}, \texttt{ml\_\allowbreak theory}, \texttt{deep\_\allowbreak learning\_\allowbreak architectures}, \texttt{ai\_\allowbreak safety} \\
61+\texttt{perception\_\allowbreak interaction} & Perception, Language, Robotics and Interaction & 6 &
62+ \texttt{computer\_\allowbreak vision}, \texttt{nlp}, \texttt{speech\_\allowbreak audio}, \texttt{robotics}, \texttt{hci}, \texttt{computer\_\allowbreak graphics} \\
63+\texttt{software\_\allowbreak pl} & Software, Programming Languages and Formal Methods & 4 &
64+ \texttt{software\_\allowbreak engineering}, \texttt{programming\_\allowbreak languages}, \texttt{compilers}, \texttt{formal\_\allowbreak verification} \\
65+\texttt{theory} & Theory of Computation & 2 & \texttt{algorithms}, \texttt{computational\_\allowbreak complexity} \\
66+\texttt{data\_\allowbreak distributed} & Data, Information and Distributed Systems & 6 &
67+ \texttt{database\_\allowbreak systems}, \texttt{information\_\allowbreak retrieval}, \texttt{distributed\_\allowbreak computing}, \texttt{cloud\_\allowbreak computing},
68+ \texttt{edge\_\allowbreak computing}, \texttt{computer\_\allowbreak networks} \\
69+\texttt{security\_\allowbreak privacy} & Security, Privacy and Trust & 5 &
70+ \texttt{cybersecurity}, \texttt{applied\_\allowbreak cryptography}, \texttt{blockchain}, \texttt{privacy\_\allowbreak preserving\_\allowbreak computation},
71+ \texttt{federated\_\allowbreak learning} \\
72+\texttt{hardware\_\allowbreak emerging} & Hardware, Architecture and Emerging Computing & 5 &
73+ \texttt{computer\_\allowbreak architecture}, \texttt{ai\_\allowbreak accelerators}, \texttt{operating\_\allowbreak systems}, \texttt{quantum\_\allowbreak computing},
74+ \texttt{sustainable\_\allowbreak computing} \\
75+\texttt{computational\_\allowbreak science} & Computational Science and Discovery & 3 &
76+ \texttt{scientific\_\allowbreak computing}, \texttt{computational\_\allowbreak biology}, \texttt{autonomous\_\allowbreak scientific\_\allowbreak discovery} \\
77+\bottomrule
78+\end{tabularx}
79+\end{singlespace}
80+\end{table}
81+
82+Two features of the grouping deserve comment because they are choices, not facts. First, \texttt{ai\_\allowbreak safety}
83+is placed under the AI area rather than under security and privacy, although adversarial robustness and
84+backdoors are scored in both \texttt{ai\_\allowbreak safety} and \texttt{cybersecurity}; the ontology treats safety as a
85+property of learning systems, with security as the adjacent field. Second, \texttt{computer\_\allowbreak graphics} sits in
86+the perception area next to vision and HCI rather than in a visual-computing area of its own, and
87+\texttt{federated\_\allowbreak learning} sits under privacy rather than under distributed computing, which reflects the
88+definitional emphasis of the leaf (training without centralising raw data) rather than its algorithmic
89+kinship. Readers who would group the leaves differently can do so from the leaf-level tables of Part~IX
90+without re-running anything, because areas are never used in scoring.
91+
92+\subsection{The forty categories}
93+\label{app:taxonomy-leaves}
94+
95+Table~\ref{tab:appA-leaves} reproduces the definition of each leaf exactly as it is given to the classifier's
96+author and to the validation raters (the raters receive these definitions and nothing else about the rules).
97+Each definition states the object of the category, lists its typical sub-topics and names the neighbouring
98+category to which excluded work belongs; the latter clause is what makes the definitions a partition rather than
99+a list of keywords, and it is the part most often invoked in the ambiguity decisions of
100+Section~\ref{app:taxonomy-ambiguities}. Identifiers are those of the YAML file; numbers are those of the
101+mandate.
102+
103+\begin{singlespace}
104+\begin{small}
105+\begin{longtable}{@{}r p{3.4cm} p{10.6cm}@{}}
106+\caption{The forty leaf categories: identifier, area and definition (\texttt{ontology.yaml}, \texttt{categories[].definition}). Parent/child edges are given under the identifier.}
107+\label{tab:appA-leaves}\\
108+\toprule
109+No. & Category & Definition \\
110+\midrule
111+\endfirsthead
112+\caption[]{The forty leaf categories (continued).}\\
113+\toprule
114+No. & Category & Definition \\
115+\midrule
116+\endhead
117+\midrule
118+\multicolumn{3}{r}{\footnotesize continued on next page}\\
119+\endfoot
120+\bottomrule
121+\endlastfoot
122+1 & \textbf{Large Language Models}\newline {\footnotesize \texttt{llm}\newline area \texttt{ai\_\allowbreak ml}; child of \texttt{foundation\_\allowbreak models}} & Research whose object is a transformer-based language model trained at scale: pre-training, instruction tuning, prompting and in-context learning, reasoning, retrieval augmentation, efficient inference, evaluation and benchmarks of LLMs. Excludes classical NLP tasks solved with small task-specific models (nlp) and non-language foundation models (foundation\_models). \\[2pt]
123+2 & \textbf{Foundation Models}\newline {\footnotesize \texttt{foundation\_\allowbreak models}\newline area \texttt{ai\_\allowbreak ml}; parent of \texttt{llm}, \texttt{multimodal\_\allowbreak ai}} & Large pre-trained models intended for adaptation to many downstream tasks in any modality: scaling laws, pre-training objectives, self-supervised representation learning at scale, transfer, fine-tuning and adapter methods, model releases and their evaluation. Language-specific work is llm (a child); vision-language work is multimodal\_ai (a child). \\[2pt]
124+3 & \textbf{Multimodal AI}\newline {\footnotesize \texttt{multimodal\_\allowbreak ai}\newline area \texttt{ai\_\allowbreak ml}; child of \texttt{foundation\_\allowbreak models}} & Models and systems that jointly process two or more modalities (vision-language, audio-visual, video-text, 3D-language, sensors with language): vision-language models and multimodal LLMs, captioning, visual question answering, cross-modal retrieval and grounding. Unimodal vision is computer\_vision; pure speech is speech\_audio. \\[2pt]
125+4 & \textbf{Generative AI}\newline {\footnotesize \texttt{generative\_\allowbreak ai}\newline area \texttt{ai\_\allowbreak ml}} & Models that synthesise new content (images, video, audio, 3D, text, code, molecules) and their training, sampling, evaluation, detection and misuse: GANs, VAEs, diffusion and flow models, autoregressive generators, text-to-X synthesis, deepfakes and AI-generated-content detection. LLM text generation as such is llm unless the contribution concerns the generative model or its outputs' authenticity. \\[2pt]
126+5 & \textbf{AI Agents and Autonomous Systems}\newline {\footnotesize \texttt{ai\_\allowbreak agents}\newline area \texttt{ai\_\allowbreak ml}} & Software agents that perceive, decide and act with some autonomy: LLM-based agents and tool use, multi-agent systems, planning and automated reasoning for acting, agent architectures, negotiation, agentic workflows and benchmarks, embodied agents in simulated environments. Physical robots are robotics; RL algorithms as such are reinforcement\_learning. \\[2pt]
127+6 & \textbf{Reinforcement Learning}\newline {\footnotesize \texttt{reinforcement\_\allowbreak learning}\newline area \texttt{ai\_\allowbreak ml}} & Learning to act from reward signals: value- and policy-based methods, model-based RL, offline and inverse RL, multi-agent RL, bandits, exploration, reward design, RL from human feedback, and RL theory. Applications to robot control are shared with robotics. \\[2pt]
128+7 & \textbf{Machine Learning Theory}\newline {\footnotesize \texttt{ml\_\allowbreak theory}\newline area \texttt{ai\_\allowbreak ml}} & Statistical and computational learning theory and principled ML methodology: generalisation and sample complexity, optimisation theory for learning, kernel and Bayesian methods, probabilistic models, causal inference, online learning, PAC learning, interpretability and fairness as formal problems. Architecture engineering is deep\_learning\_architectures. \\[2pt]
129+8 & \textbf{Deep Learning Architectures}\newline {\footnotesize \texttt{deep\_\allowbreak learning\_\allowbreak architectures}\newline area \texttt{ai\_\allowbreak ml}} & Design, training and compression of neural network architectures as such: CNNs, RNNs, transformers and attention, graph neural networks, state-space models, normalisation and optimisers in practice, neural architecture search, pruning, quantisation and distillation, neuromorphic and spiking networks as models. Task-specific results go to the application category; hardware goes to ai\_accelerators. \\[2pt]
130+9 & \textbf{Computer Vision}\newline {\footnotesize \texttt{computer\_\allowbreak vision}\newline area \texttt{perception\_\allowbreak interaction}} & Extracting information from images, video and 3D data: recognition, detection, segmentation, tracking, pose, depth and 3D reconstruction, image restoration and enhancement, medical and remote-sensing image analysis, visual representation learning. Image synthesis is generative\_ai; vision-language is multimodal\_ai; rendering is computer\_graphics. \\[2pt]
131+10 & \textbf{Natural Language Processing}\newline {\footnotesize \texttt{nlp}\newline area \texttt{perception\_\allowbreak interaction}} & Computational processing of human language: machine translation, parsing and tagging, information extraction, sentiment and text classification, summarisation, question answering, dialogue, text mining, computational linguistics, low-resource and multilingual NLP, NLP evaluation and resources. LLM-centred work is llm (also classified here when the task framing dominates). \\[2pt]
132+11 & \textbf{Speech and Audio Computing}\newline {\footnotesize \texttt{speech\_\allowbreak audio}\newline area \texttt{perception\_\allowbreak interaction}} & Processing and generation of speech, music and general audio: speech recognition and synthesis, speaker and language recognition, enhancement and separation, spoken language understanding, music information retrieval and generation, audio event detection, neural audio codecs. Text-only dialogue is nlp. \\[2pt]
133+12 & \textbf{Robotics}\newline {\footnotesize \texttt{robotics}\newline area \texttt{perception\_\allowbreak interaction}} & Machines that sense and act in the physical world: manipulation, locomotion, motion and path planning, SLAM and localisation, robot learning, human-robot interaction, autonomous vehicles and drones as robotic systems, soft and swarm robotics, teleoperation. RL algorithms are reinforcement\_learning; robotic process automation and surgical-outcome studies are excluded. \\[2pt]
134+13 & \textbf{Human-Computer Interaction}\newline {\footnotesize \texttt{hci}\newline area \texttt{perception\_\allowbreak interaction}} & Design, evaluation and understanding of interactive systems and their users: user studies and usability, interaction techniques, VR/AR/XR, accessibility and assistive technology, CSCW and social computing, human-AI interaction, ubiquitous and wearable computing, affective computing. Rendering is computer\_graphics; physical robots are robotics. \\[2pt]
135+14 & \textbf{Software Engineering}\newline {\footnotesize \texttt{software\_\allowbreak engineering}\newline area \texttt{software\_\allowbreak pl}} & How software is specified, built, tested, maintained and studied: requirements, architecture, testing and debugging, program repair, mining software repositories, empirical studies of developers, DevOps, model-driven engineering, open-source ecosystems, and AI-assisted software development. Language design is programming\_languages; proofs of correctness are formal\_verification. \\[2pt]
136+15 & \textbf{Programming Languages}\newline {\footnotesize \texttt{programming\_\allowbreak languages}\newline area \texttt{software\_\allowbreak pl}; parent of \texttt{compilers}} & Design, semantics, type systems and implementation principles of programming languages: type theory, operational and denotational semantics, functional and logic programming, effects, concurrency models, memory safety, domain-specific languages, program analysis as a language problem. Code generation and optimisation pipelines are compilers (a child); machine-checked correctness is formal\_verification. \\[2pt]
137+16 & \textbf{Compilers}\newline {\footnotesize \texttt{compilers}\newline area \texttt{software\_\allowbreak pl}; child of \texttt{programming\_\allowbreak languages}} & Translation and optimisation of programs for execution: compiler construction, intermediate representations, optimisation passes, code generation, JIT compilation, auto-vectorisation and parallelisation, polyhedral methods, high-level synthesis, and compilers for machine-learning workloads and accelerators. A child of programming\_languages. \\[2pt]
138+17 & \textbf{Formal Verification}\newline {\footnotesize \texttt{formal\_\allowbreak verification}\newline area \texttt{software\_\allowbreak pl}} & Mathematically rigorous establishment of system properties: model checking, theorem proving and proof assistants, SAT/SMT solving and automated reasoning, deductive and runtime verification, verified software and hardware, formal semantics as a verification tool, verification of neural networks, smart contracts and protocols, automata and temporal logics. Language semantics as design is programming\_languages. \\[2pt]
139+18 & \textbf{Algorithms and Data Structures}\newline {\footnotesize \texttt{algorithms}\newline area \texttt{theory}} & Design and analysis of algorithms and data structures: graph, string, geometric, approximation, randomized, online, streaming, parallel and parameterized algorithms, combinatorial optimisation and metaheuristics, algorithmic game theory, algorithm engineering, and the combinatorics that underpins them. Lower bounds and hardness as such are computational\_complexity; numerical algorithms are scientific\_computing. \\[2pt]
140+19 & \textbf{Computational Complexity}\newline {\footnotesize \texttt{computational\_\allowbreak complexity}\newline area \texttt{theory}} & The intrinsic difficulty of computational problems: complexity classes and their separations, hardness of approximation, circuit, proof, communication and query complexity, fine-grained and parameterized complexity, pseudorandomness and derandomization, computability and automata theory, algebraic complexity, and quantum complexity. Algorithm design is algorithms; cryptographic hardness assumptions are applied\_cryptography. \\[2pt]
141+20 & \textbf{Database Systems}\newline {\footnotesize \texttt{database\_\allowbreak systems}\newline area \texttt{data\_\allowbreak distributed}} & Storage, querying and management of structured and semi-structured data: query processing and optimisation, transactions and concurrency control, indexing and storage engines, data integration, cleaning and provenance, big-data processing frameworks, data mining as a data-management problem, learned database components, vector and graph databases. Ranking of unstructured documents is information\_retrieval. \\[2pt]
142+21 & \textbf{Information Retrieval}\newline {\footnotesize \texttt{information\_\allowbreak retrieval}\newline area \texttt{data\_\allowbreak distributed}} & Finding and ranking relevant information for a user need: search engines and ranking models, dense and sparse retrieval, recommender systems, query understanding, evaluation and test collections, web search and mining, scholarly and digital-library retrieval, retrieval components of RAG systems. Structured query processing is database\_systems; text understanding tasks are nlp. \\[2pt]
143+22 & \textbf{Distributed Computing}\newline {\footnotesize \texttt{distributed\_\allowbreak computing}\newline area \texttt{data\_\allowbreak distributed}; parent of \texttt{cloud\_\allowbreak computing}, \texttt{edge\_\allowbreak computing}} & Computation across multiple processors or machines: distributed algorithms and consensus, fault tolerance and replication, parallel programming and HPC systems software, cluster and grid resource management, distributed storage and middleware, distributed and parallel ML training systems. Cloud service models are cloud\_computing and edge placement is edge\_computing (both children). \\[2pt]
144+23 & \textbf{Cloud Computing}\newline {\footnotesize \texttt{cloud\_\allowbreak computing}\newline area \texttt{data\_\allowbreak distributed}; child of \texttt{distributed\_\allowbreak computing}} & Computing delivered as elastic, multi-tenant, on-demand services: IaaS/PaaS/SaaS and serverless, virtualisation and containers, resource provisioning and auto-scaling, SLAs and pricing, cloud-native architectures, data-centre resource management, cloud security and migration. A child of distributed\_computing; placement at the network edge is edge\_computing. \\[2pt]
145+24 & \textbf{Edge Computing}\newline {\footnotesize \texttt{edge\_\allowbreak computing}\newline area \texttt{data\_\allowbreak distributed}; child of \texttt{distributed\_\allowbreak computing}} & Computation placed near data sources and users: edge/fog/MEC architectures, computation offloading, on-device and TinyML inference, edge-cloud collaboration and split computing, IoT platforms as computing substrates, latency-critical edge services, edge caching and orchestration. Radio access and protocols are computer\_networks; model compression as such is deep\_learning\_architectures or ai\_accelerators. \\[2pt]
146+25 & \textbf{Computer Networks}\newline {\footnotesize \texttt{computer\_\allowbreak networks}\newline area \texttt{data\_\allowbreak distributed}} & Design, protocols, measurement and performance of communication networks: Internet architecture and transport, routing, wireless and mobile networks, 5G/6G and software-defined networking, network management, sensor and vehicular networks, content delivery and caching, network coding and information theory applied to networking. Physical-layer signal processing is included only when framed as networking. \\[2pt]
147+26 & \textbf{Cybersecurity}\newline {\footnotesize \texttt{cybersecurity}\newline area \texttt{security\_\allowbreak privacy}} & Protecting computing systems, networks, software and users from attack: vulnerability discovery and exploitation, malware and intrusion detection, authentication and access control, system and hardware security, web and mobile security, digital forensics, security of AI systems, security operations and human factors of security. Cryptographic primitives and protocols are applied\_cryptography; data-protection techniques are privacy\_preserving\_computation. \\[2pt]
148+27 & \textbf{Applied Cryptography}\newline {\footnotesize \texttt{applied\_\allowbreak cryptography}\newline area \texttt{security\_\allowbreak privacy}} & Design, analysis, implementation and deployment of cryptographic primitives and protocols: symmetric and public-key schemes, hash functions, signatures, key exchange, post-quantum cryptography, zero-knowledge proofs, secure multi-party computation and homomorphic encryption as primitives, cryptanalysis, side-channel-resistant implementations, cryptographic hardware, provable security, quantum key distribution. Deployment of these primitives for data protection is privacy\_preserving\_computation; ledgers are blockchain. \\[2pt]
149+28 & \textbf{Blockchain Systems}\newline {\footnotesize \texttt{blockchain}\newline area \texttt{security\_\allowbreak privacy}} & Distributed ledgers and the systems built on them: consensus for permissioned and permissionless chains, smart contracts and their security, scalability (sharding, layer-2, rollups), cryptocurrencies and DeFi mechanisms, blockchain applications and governance, measurement of blockchain ecosystems. Generic BFT consensus theory is shared with distributed\_computing; primitives are applied\_cryptography. \\[2pt]
150+29 & \textbf{Computer Architecture}\newline {\footnotesize \texttt{computer\_\allowbreak architecture}\newline area \texttt{hardware\_\allowbreak emerging}; parent of \texttt{ai\_\allowbreak accelerators}} & Organisation and design of processors, memory systems and digital hardware: microarchitecture, caches and memory hierarchies, interconnects and networks-on-chip, FPGAs and reconfigurable computing, embedded and real-time systems, hardware/software co-design, electronic design automation, VLSI and low-power design, processing-in-memory. Accelerators specialised for ML are ai\_accelerators (a child); kernels are operating\_systems. \\[2pt]
151+30 & \textbf{Accelerators and AI Hardware}\newline {\footnotesize \texttt{ai\_\allowbreak accelerators}\newline area \texttt{hardware\_\allowbreak emerging}; child of \texttt{computer\_\allowbreak architecture}} & Hardware and hardware-aware software for efficient machine-learning computation: GPU/TPU/NPU design and programming, ASIC and FPGA DNN accelerators, neuromorphic and spiking hardware, in-memory and analog/photonic computing for AI, quantisation and sparsity exploited by hardware, efficient LLM inference and serving systems, ML compilers' hardware mapping, benchmarks such as MLPerf. A child of computer\_architecture. \\[2pt]
152+31 & \textbf{Operating Systems}\newline {\footnotesize \texttt{operating\_\allowbreak systems}\newline area \texttt{hardware\_\allowbreak emerging}} & System software that manages hardware and provides execution abstractions: kernels and drivers, scheduling, memory management, file and storage systems, virtualisation and containers, OS security and isolation, I/O and networking stacks, real-time and embedded OS, systems support for new hardware (persistent memory, CXL, SmartNICs). Distributed coordination is distributed\_computing; hardware design is computer\_architecture. \\[2pt]
153+32 & \textbf{Quantum Computing}\newline {\footnotesize \texttt{quantum\_\allowbreak computing}\newline area \texttt{hardware\_\allowbreak emerging}} & Computation and information processing exploiting quantum mechanics: quantum algorithms and complexity, quantum error correction and fault tolerance, qubit hardware platforms and control, quantum software, compilers and simulators, variational and NISQ algorithms, quantum machine learning, quantum communication and key distribution, quantum networking. Quantum physics without a computational or information-processing framing is out of scope; post-quantum cryptography is applied\_cryptography. \\[2pt]
154+33 & \textbf{Scientific Computing}\newline {\footnotesize \texttt{scientific\_\allowbreak computing}\newline area \texttt{computational\_\allowbreak science}} & Numerical and computational methods and software for mathematical models of science and engineering: numerical linear algebra, discretisation of differential equations, solvers and preconditioners, simulation frameworks, uncertainty quantification, reduced-order and surrogate models, scientific machine learning (PINNs, neural operators), high-performance scientific software and performance portability, mathematical software, computational physics/chemistry/engineering tooling. Domain biology is computational\_biology; parallel systems software is distributed\_computing. \\[2pt]
155+34 & \textbf{Computational Biology}\newline {\footnotesize \texttt{computational\_\allowbreak biology}\newline area \texttt{computational\_\allowbreak science}} & Computational methods for biological and biomedical data: bioinformatics and genomics, protein structure and design, molecular modelling and computational drug discovery, single-cell and multi-omics analysis, systems and synthetic biology, biomedical text mining, computational neuroscience, biomedical and health informatics methods, DNA/molecular computing. Medical image analysis is shared with computer\_vision; numerical methods as such are scientific\_computing. \\[2pt]
156+35 & \textbf{Computer Graphics}\newline {\footnotesize \texttt{computer\_\allowbreak graphics}\newline area \texttt{perception\_\allowbreak interaction}} & Synthesis and manipulation of visual content from models: rendering, geometry processing and modelling, animation and simulation for graphics, neural rendering and 3D representations, visualisation, procedural content, game and VR engines. Image understanding is computer\_vision; pixel-space generative models are generative\_ai; user studies of VR are hci. \\[2pt]
157+36 & \textbf{Privacy-Preserving Computation}\newline {\footnotesize \texttt{privacy\_\allowbreak preserving\_\allowbreak computation}\newline area \texttt{security\_\allowbreak privacy}; parent of \texttt{federated\_\allowbreak learning}} & Computing on, releasing or sharing data while limiting what is learned about individuals: differential privacy, homomorphic encryption, secure multi-party computation and TEEs applied to data analysis and ML, anonymisation and synthetic data, private information retrieval, privacy attacks on models and their defences, machine unlearning, privacy engineering and regulation (GDPR). Federated learning is a child; cryptographic constructions as such are applied\_cryptography. \\[2pt]
158+37 & \textbf{Federated Learning}\newline {\footnotesize \texttt{federated\_\allowbreak learning}\newline area \texttt{security\_\allowbreak privacy}; child of \texttt{privacy\_\allowbreak preserving\_\allowbreak computation}} & Training models across multiple clients or institutions without centralising their raw data: federated averaging and optimisation under heterogeneity, communication efficiency, client selection, personalisation, secure aggregation and privacy of federated systems, robustness to malicious clients, vertical and cross-silo federated learning, federated fine-tuning of foundation models, decentralised/gossip learning. A child of privacy\_preserving\_computation; also linked to distributed\_computing and edge\_computing. \\[2pt]
159+38 & \textbf{AI Safety and Alignment}\newline {\footnotesize \texttt{ai\_\allowbreak safety}\newline area \texttt{ai\_\allowbreak ml}} & Making AI systems safe, aligned, robust, fair, interpretable and governable: alignment and preference learning framed as a safety problem, red-teaming and jailbreaks, adversarial robustness and backdoors, hallucination and truthfulness, bias and fairness, mechanistic interpretability, evaluation of dangerous capabilities, AI governance and regulation. Generic system security is cybersecurity; XAI as a statistical method only is ml\_theory. \\[2pt]
160+39 & \textbf{Sustainable Computing}\newline {\footnotesize \texttt{sustainable\_\allowbreak computing}\newline area \texttt{hardware\_\allowbreak emerging}} & The energy, carbon, water and material footprint of computing and how to reduce it: energy-efficient and carbon-aware systems, data-centre energy and cooling, Green AI and the cost of training and inference, life-cycle and embodied carbon of hardware, green software engineering and networking, energy harvesting and intermittent computing, computing for sustainability when the object studied is the computing system. Generic low-power circuit design is computer\_architecture; energy-efficient communication is computer\_networks. \\[2pt]
161+40 & \textbf{Autonomous Scientific Discovery}\newline {\footnotesize \texttt{autonomous\_\allowbreak scientific\_\allowbreak discovery}\newline area \texttt{computational\_\allowbreak science}} & AI and automation systems that perform or substantially drive the scientific process: AI scientist and research-agent systems, automated hypothesis generation and literature synthesis, self-driving laboratories and closed-loop experimentation, AI-driven discovery of materials, molecules, equations, algorithms or theorems, autonomous experimental design, benchmarks for research agents, and the epistemology and evaluation of machine-generated science. Using ML inside a scientific pipeline without autonomy is scientific\_computing or computational\_biology; LLM agents in general are ai\_agents. \\[2pt]
162+\end{longtable}
163+\end{small}
164+\end{singlespace}
165+
166+\subsection{Signal types and the assignment rule}
167+\label{app:taxonomy-rule}
168+
169+Every leaf lists weighted signals of five types, and the five types are the only evidence the classifier ever
170+sees. (i)~\emph{OpenAlex topics}: the up-to-three topic identifiers that OpenAlex attaches to a work, drawn
171+from any of the 26 OpenAlex fields and not only from field~17; a topic may appear under several leaves with
172+different weights. (ii)~\emph{OpenAlex subfields}: a coarse fallback used by 21 leaf--subfield entries over
173+eleven subfields (the ten field-17 subfields and subfield~1312, Molecular Biology, for computational biology),
174+always with a small weight. (iii)~\emph{arXiv categories}: the primary category and cross-lists of the linked
175+arXiv record, 162 entries over 49 distinct categories, namely
176+\texttt{cs.AI}, \texttt{cs.AR}, \texttt{cs.CC}, \texttt{cs.CE}, \texttt{cs.CG}, \texttt{cs.CL}, \texttt{cs.CR}, \texttt{cs.CV}, \texttt{cs.CY}, \texttt{cs.DB}, \texttt{cs.DC}, \texttt{cs.DL}, \texttt{cs.DM}, \texttt{cs.DS}, \texttt{cs.ET}, \texttt{cs.FL}, \texttt{cs.GR}, \texttt{cs.GT}, \texttt{cs.HC}, \texttt{cs.IR}, \texttt{cs.IT}, \texttt{cs.LG}, \texttt{cs.LO}, \texttt{cs.MA}, \texttt{cs.MM}, \texttt{cs.MS}, \texttt{cs.NA}, \texttt{cs.NE}, \texttt{cs.NI}, \texttt{cs.OS}, \texttt{cs.PF}, \texttt{cs.PL}, \texttt{cs.RO}, \texttt{cs.SD}, \texttt{cs.SE}, \texttt{cs.SI}, \texttt{cs.SY}, \texttt{eess.AS}, \texttt{eess.IV}, \texttt{eess.SP}, \texttt{eess.SY}, \texttt{math.IT}, \texttt{math.OC}, \texttt{math.ST}, \texttt{physics.comp-ph}, \texttt{q-bio.GN}, \texttt{q-bio.QM}, \texttt{quant-ph}, \texttt{stat.ML}. (iv)~\emph{DBLP streams}: the venue stream (journal or conference series,
177+the prefix of the DBLP key) of the linked DBLP record, 1{,}320 entries over 771 distinct streams.
178+(v)~\emph{Keyword patterns}: 273 regular expressions matched, in the present version of the ontology without
179+exception, on the concatenation of title and abstract (the YAML schema allows title-only and abstract-only
180+patterns, but none is used); 24 exclusion patterns veto a leaf when they match the same text.
181+
182+The rule itself is the one written out in equations~\eqref{eq:score} and~\eqref{eq:assign}: within each
183+signal type the weights of the matched signals are summed and capped at~1.0; the capped values of the five
184+types are summed; the leaf is assigned when the total reaches the threshold $\theta = 1.0$ and no exclusion
185+pattern matches; the primary leaf is the argmax, ties going to the child before the parent and then to the
186+lower category number. The weights are therefore to be read on a scale where 1.0 means ``this signal alone
187+suffices''. Table~\ref{tab:appA-signals} reports, for each leaf, how many signals of each type it lists and
188+how many of them carry weight~1.0; Table~\ref{tab:appA-area-signals} aggregates the same counts by area.
189+Three regularities are visible. First, every one of the forty leaves has at least one keyword pattern of
190+weight 1.0 (106 of the 273 patterns are at 1.0, the rest spread between 0.2 and 0.9), so that a title or
191+abstract naming the object of the category assigns it without metadata support; the build script refuses to
192+serialise an ontology in which this is false for the thirteen categories that the design singles out (the
193+six AI categories that OpenAlex topics do not separate and seven small categories without a topic or venue of
194+their own), and in version~1.0 the property happens to hold for all forty. Second, the number of topic
195+signals varies by an order of magnitude across leaves, from 4 for \texttt{compilers},
196+\texttt{reinforcement\_\allowbreak learning} and \texttt{federated\_\allowbreak learning} to 45 for \texttt{computer\_\allowbreak networks} and 44 for \texttt{computer\_\allowbreak vision}; this
197+mirrors the granularity of the OpenAlex topic model, which has many clusters for networking and vision and
198+none for federated learning, and not the importance of the categories. Third, venue signals are dense (291 of
199+the 1{,}320 stream entries are at weight 1.0, almost all for single-purpose venues) but concentrated on the
200+systems, networking and theory leaves, where the DBLP venue structure is informative, and sparse for the
201+post-2022 AI leaves, where the same few venues host everything.
202+
203+\begin{singlespace}
204+\begin{footnotesize}
205+\begin{longtable}{@{}r p{4.3cm} r r r r r r r r r r@{}}
206+\caption{Signals per category in \texttt{ontology.yaml}: number of weighted OpenAlex topics (T), of which with weight 1.0 (T$_1$); OpenAlex subfields (F); arXiv categories (X); DBLP streams (D), of which with weight 1.0 (D$_1$); keyword patterns (K), of which with weight 1.0 (K$_1$); exclusion patterns (Z); related edges (R). Computed from the YAML file.}
207+\label{tab:appA-signals}\\
208+\toprule
209+No. & Category & T & T$_1$ & F & X & D & D$_1$ & K & K$_1$ & Z & R \\
210+\midrule
211+\endfirsthead
212+\caption[]{Signals per category (continued).}\\
213+\toprule
214+No. & Category & T & T$_1$ & F & X & D & D$_1$ & K & K$_1$ & Z & R \\
215+\midrule
216+\endhead
217+\midrule
218+\multicolumn{12}{r}{continued on next page}\\
219+\endfoot
220+\bottomrule
221+\endlastfoot
222+1 & \texttt{llm} & 6 & 1 & 1 & 3 & 12 & 0 & 12 & 3 & 0 & 5 \\
223+2 & \texttt{foundation\_\allowbreak models} & 5 & 0 & 1 & 4 & 8 & 0 & 10 & 2 & 0 & 5 \\
224+3 & \texttt{multimodal\_\allowbreak ai} & 5 & 1 & 1 & 4 & 15 & 0 & 9 & 4 & 1 & 5 \\
225+4 & \texttt{generative\_\allowbreak ai} & 5 & 1 & 0 & 6 & 9 & 0 & 11 & 4 & 2 & 6 \\
226+5 & \texttt{ai\_\allowbreak agents} & 5 & 1 & 1 & 2 & 12 & 3 & 9 & 5 & 1 & 5 \\
227+6 & \texttt{reinforcement\_\allowbreak learning} & 4 & 1 & 0 & 5 & 8 & 0 & 9 & 3 & 1 & 5 \\
228+7 & \texttt{ml\_\allowbreak theory} & 20 & 1 & 1 & 4 & 51 & 2 & 11 & 1 & 0 & 6 \\
229+8 & \texttt{deep\_\allowbreak learning\_\allowbreak architectures} & 11 & 2 & 1 & 4 & 21 & 0 & 12 & 1 & 1 & 6 \\
230+9 & \texttt{computer\_\allowbreak vision} & 44 & 9 & 1 & 2 & 58 & 13 & 10 & 3 & 0 & 6 \\
231+10 & \texttt{nlp} & 22 & 4 & 1 & 2 & 29 & 13 & 8 & 2 & 0 & 5 \\
232+11 & \texttt{speech\_\allowbreak audio} & 10 & 3 & 1 & 4 & 16 & 5 & 5 & 3 & 0 & 4 \\
233+12 & \texttt{robotics} & 23 & 6 & 0 & 3 & 41 & 27 & 4 & 1 & 2 & 5 \\
234+13 & \texttt{hci} & 24 & 4 & 1 & 3 & 44 & 22 & 10 & 1 & 0 & 6 \\
235+14 & \texttt{software\_\allowbreak engineering} & 20 & 7 & 1 & 1 & 39 & 18 & 5 & 3 & 0 & 6 \\
236+15 & \texttt{programming\_\allowbreak languages} & 6 & 1 & 0 & 3 & 22 & 6 & 6 & 3 & 0 & 4 \\
237+16 & \texttt{compilers} & 4 & 0 & 0 & 5 & 25 & 2 & 5 & 3 & 0 & 5 \\
238+17 & \texttt{formal\_\allowbreak verification} & 10 & 1 & 0 & 4 & 43 & 10 & 7 & 5 & 0 & 6 \\
239+18 & \texttt{algorithms} & 35 & 2 & 1 & 7 & 68 & 9 & 10 & 2 & 0 & 6 \\
240+19 & \texttt{computational\_\allowbreak complexity} & 9 & 0 & 1 & 7 & 28 & 2 & 7 & 5 & 1 & 5 \\
241+20 & \texttt{database\_\allowbreak systems} & 21 & 1 & 1 & 1 & 36 & 9 & 5 & 2 & 1 & 5 \\
242+21 & \texttt{information\_\allowbreak retrieval} & 20 & 2 & 1 & 3 & 29 & 5 & 6 & 3 & 0 & 5 \\
243+22 & \texttt{distributed\_\allowbreak computing} & 16 & 2 & 1 & 4 & 51 & 15 & 7 & 3 & 1 & 8 \\
244+23 & \texttt{cloud\_\allowbreak computing} & 11 & 2 & 0 & 4 & 29 & 5 & 5 & 2 & 1 & 6 \\
245+24 & \texttt{edge\_\allowbreak computing} & 13 & 1 & 0 & 4 & 38 & 1 & 5 & 2 & 1 & 7 \\
246+25 & \texttt{computer\_\allowbreak networks} & 45 & 9 & 1 & 4 & 96 & 42 & 5 & 1 & 0 & 5 \\
247+26 & \texttt{cybersecurity} & 34 & 7 & 0 & 1 & 29 & 16 & 6 & 2 & 1 & 8 \\
248+27 & \texttt{applied\_\allowbreak cryptography} & 14 & 3 & 0 & 4 & 29 & 9 & 6 & 3 & 0 & 6 \\
249+28 & \texttt{blockchain} & 6 & 1 & 0 & 3 & 19 & 3 & 4 & 2 & 1 & 5 \\
250+29 & \texttt{computer\_\allowbreak architecture} & 21 & 4 & 1 & 5 & 59 & 6 & 4 & 2 & 1 & 7 \\
251+30 & \texttt{ai\_\allowbreak accelerators} & 11 & 1 & 0 & 5 & 44 & 1 & 5 & 3 & 1 & 7 \\
252+31 & \texttt{operating\_\allowbreak systems} & 12 & 0 & 0 & 5 & 39 & 6 & 4 & 2 & 1 & 6 \\
253+32 & \texttt{quantum\_\allowbreak computing} & 16 & 2 & 0 & 6 & 27 & 4 & 3 & 2 & 1 & 5 \\
254+33 & \texttt{scientific\_\allowbreak computing} & 41 & 4 & 1 & 6 & 57 & 10 & 4 & 2 & 0 & 8 \\
255+34 & \texttt{computational\_\allowbreak biology} & 34 & 3 & 1 & 3 & 60 & 12 & 3 & 2 & 0 & 7 \\
256+35 & \texttt{computer\_\allowbreak graphics} & 15 & 2 & 1 & 4 & 21 & 8 & 9 & 2 & 0 & 5 \\
257+36 & \texttt{privacy\_\allowbreak preserving\_\allowbreak computation} & 13 & 1 & 0 & 4 & 26 & 1 & 5 & 3 & 1 & 7 \\
258+37 & \texttt{federated\_\allowbreak learning} & 4 & 0 & 0 & 4 & 15 & 0 & 5 & 2 & 1 & 6 \\
259+38 & \texttt{ai\_\allowbreak safety} & 8 & 1 & 0 & 5 & 13 & 4 & 14 & 7 & 1 & 7 \\
260+39 & \texttt{sustainable\_\allowbreak computing} & 11 & 2 & 0 & 6 & 28 & 2 & 4 & 2 & 1 & 7 \\
261+40 & \texttt{autonomous\_\allowbreak scientific\_\allowbreak discovery} & 12 & 0 & 0 & 8 & 26 & 0 & 4 & 3 & 1 & 8 \\
262+\midrule
263+& Total (entries) & 646 & 93 & 21 & 162 & 1320 & 291 & 273 & 106 & 24 & 236 \\
264+\end{longtable}
265+\end{footnotesize}
266+\end{singlespace}
267+
268+\begin{table}[htbp]
269+\begin{singlespace}
270+\centering
271+\caption{Signal entries aggregated by area (sums of the rows of Table~\ref{tab:appA-signals}; a topic or venue mapped to several leaves of the same area is counted once per leaf).}
272+\label{tab:appA-area-signals}
273+\small
274+\begin{tabular}{l r r r r r}
275+\toprule
276+Area & Leaves & Topic entries & arXiv entries & DBLP entries & Keyword patterns \\
277+\midrule
278+\texttt{ai\_\allowbreak ml} & 9 & 69 & 37 & 149 & 97 \\
279+\texttt{perception\_\allowbreak interaction} & 6 & 138 & 18 & 209 & 46 \\
280+\texttt{software\_\allowbreak pl} & 4 & 40 & 13 & 129 & 23 \\
281+\texttt{theory} & 2 & 44 & 14 & 96 & 17 \\
282+\texttt{data\_\allowbreak distributed} & 6 & 126 & 20 & 279 & 33 \\
283+\texttt{security\_\allowbreak privacy} & 5 & 71 & 16 & 118 & 26 \\
284+\texttt{hardware\_\allowbreak emerging} & 5 & 71 & 27 & 197 & 20 \\
285+\texttt{computational\_\allowbreak science} & 3 & 87 & 17 & 143 & 11 \\
286+\bottomrule
287+\end{tabular}
288+\end{singlespace}
289+\end{table}
290+
291+The weight scale has a second consequence that the reader of Part~IX must keep in mind. A signal with weight
292+below 1.0 can only contribute through corroboration by a signal of \emph{another} type, because repetitions
293+within a type are capped. The design relies on this in both directions: a general machine-learning venue at
294+0.3 and the \texttt{cs.LG} category at 0.2 never assign \texttt{ml\_\allowbreak theory} by themselves, whereas a 0.6 topic
295+and a 0.4 arXiv category do reach the threshold. One discrepancy between the documentation and the
296+implementation of the within-type aggregation (maximum versus sum over matched topics of the same leaf) is
297+recorded in Section~\ref{sec:m-score}; the implemented rule, the sum, is the one described here and the one
298+fixed by the unit tests.
299+
300+\subsection{Coverage of the OpenAlex topic vocabulary}
301+\label{app:taxonomy-openalex}
302+
303+The OpenAlex export of 2026-10-14 contains 4{,}516 topics, 302 of them in field~17 (Computer Science). The
304+ontology maps 240 of the 302 (79.5\,\%) to at least one leaf and leaves 62 unmapped with an explicit reason
305+each (Section~\ref{app:taxonomy-unmapped}). Table~\ref{tab:appA-subfields} breaks the field-17 coverage down
306+by subfield. Coverage is complete for Computer Vision and Pattern Recognition, Hardware and Architecture,
307+Human--Computer Interaction, Signal Processing and Software, and nearly complete for Computational Theory and
308+Mathematics; it is lowest for Information Systems (45 of 78), the subfield into which OpenAlex places most of
309+its educational-technology and media clusters, and for Artificial Intelligence (61 of 77), where the unmapped
310+topics are physical-science, generic residual or empty clusters rather than AI research.
311+
312+\begin{table}[htbp]
313+\begin{singlespace}
314+\centering
315+\caption{Coverage of the OpenAlex field~17 (Computer Science) topics by subfield: number of topics in the 2026-10-14 export, mapped to at least one category, and left unmapped with a stated reason (Table~\ref{tab:appA-unmapped}).}
316+\label{tab:appA-subfields}
317+\small
318+\begin{tabular}{l l r r r}
319+\toprule
320+Subfield & Name & Topics & Mapped & Unmapped \\
321+\midrule
322+1702 & Artificial Intelligence & 77 & 61 & 16 \\
323+1703 & Computational Theory and Mathematics & 24 & 23 & 1 \\
324+1704 & Computer Graphics and Computer-Aided Design & 4 & 3 & 1 \\
325+1705 & Computer Networks and Communications & 43 & 35 & 8 \\
326+1706 & Computer Science Applications & 10 & 7 & 3 \\
327+1707 & Computer Vision and Pattern Recognition & 35 & 35 & 0 \\
328+1708 & Hardware and Architecture & 8 & 8 & 0 \\
329+1709 & Human-Computer Interaction & 8 & 8 & 0 \\
330+1710 & Information Systems & 78 & 45 & 33 \\
331+1711 & Signal Processing & 10 & 10 & 0 \\
332+1712 & Software & 5 & 5 & 0 \\
333+\midrule
334+& Field 17 total & 302 & 240 & 62 \\
335+\bottomrule
336+\end{tabular}
337+\end{singlespace}
338+\end{table}
339+
340+Topics outside field~17 matter because computer-science work is frequently assigned a primary topic from
341+Engineering, Mathematics, Physics or the life sciences, and because several leaves (computational biology,
342+scientific computing, quantum computing, speech and audio, robotics) have their natural OpenAlex home outside
343+field~17. The ontology therefore maps 170 further topics from eighteen other fields
344+(Table~\ref{tab:appA-fields}), Engineering (71) and Mathematics (20) being the largest contributors, for a
345+total of 410 distinct mapped topics and 646 topic--leaf weights. These adjacent topics were selected by
346+reading the OpenAlex keyword lists of about 120 candidate topics named in the area modules; the remaining
347+roughly 4{,}000 topics of the export were not inspected, which is the main known gap of the mapping
348+(Section~\ref{app:taxonomy-limits}). Of the 410 mapped topics, 146 point to more than one leaf, up to six for
349+the broadest clusters (for instance T10054, \emph{Parallel Computing and Optimization Techniques}, scores in
350+\texttt{computer\_\allowbreak architecture} at 0.8, \texttt{compilers} and \texttt{distributed\_\allowbreak computing} at 0.6,
351+\texttt{scientific\_\allowbreak computing} at 0.4, \texttt{ai\_\allowbreak accelerators} at 0.3 and \texttt{operating\_\allowbreak systems} at
352+0.2). The full audit list of multiply mapped topics is the last generated section of \texttt{ONTOLOGY.md};
353+it is the first place to look when a co-classification pattern in Part~IX seems suspicious, because a topic
354+mapped to two leaves at weight 1.0 produces that pair mechanically.
355+
356+\begin{table}[htbp]
357+\begin{singlespace}
358+\centering
359+\caption{Distinct OpenAlex topics mapped to at least one category, by OpenAlex field of the topic (\texttt{topic\_map.csv}).}
360+\label{tab:appA-fields}
361+\small
362+\begin{tabular}{r l r}
363+\toprule
364+Field & Name & Mapped topics \\
365+\midrule
366+17 & Computer Science & 240 \\
367+22 & Engineering & 71 \\
368+26 & Mathematics & 20 \\
369+13 & Biochemistry, Genetics and Molecular Biology & 18 \\
370+31 & Physics and Astronomy & 15 \\
371+33 & Social Sciences & 10 \\
372+18 & Decision Sciences & 8 \\
373+27 & Medicine & 6 \\
374+12 & Arts and Humanities & 5 \\
375+28 & Neuroscience & 4 \\
376+23 & Environmental Science & 3 \\
377+19 & Earth and Planetary Sciences & 2 \\
378+32 & Psychology & 2 \\
379+11 & Agricultural and Biological Sciences & 1 \\
380+14 & Business, Management and Accounting & 1 \\
381+20 & Economics, Econometrics and Finance & 1 \\
382+21 & Energy & 1 \\
383+25 & Materials Science & 1 \\
384+36 & Health Professions & 1 \\
385+\midrule
386+& All fields & 410 \\
387+\bottomrule
388+\end{tabular}
389+\end{singlespace}
390+\end{table}
391+
392+\subsection{Coverage of the DBLP venue vocabulary}
393+\label{app:taxonomy-dblp}
394+
395+DBLP streams are the venue signal. The stream table from which the mapping was built lists every DBLP
396+journal or conference series with at least one hundred records in 2018--2026 (3{,}569 streams); the ontology
397+maps 771 of them. Measured on the DBLP records of 2018--2026 and excluding CoRR (the arXiv mirror stream,
398+which carries no venue information), the mapped streams cover 2{,}017{,}910 of 3{,}319{,}884 records
399+(60.8\,\%). Among the 599 largest streams, 496 are mapped (82.8\,\%); the 103 unmapped large streams
400+(Table~\ref{tab:appA-dblp-unmapped} lists the 25 largest) are of two kinds. Some are out of scope for the
401+forty categories although DBLP indexes them: control theory (\emph{IEEE Transactions on Automatic Control},
402+\emph{Automatica}, \emph{IEEE Control Systems Letters}), instrumentation and industrial electronics,
403+geo-information, agriculture, production research, information-systems and engineering-education
404+conferences (HICSS, AMCIS, ICIS, FIE). Others are too generic to be a category signal at any weight, the
405+largest being \emph{IEEE Access} with 108{,}838 records, followed by \emph{Information}, \emph{Complexity},
406+\emph{Systems} and \emph{PeerJ Computer Science}; works published there are classified from their topics,
407+arXiv categories and text alone. A record in an unmapped stream is therefore not excluded from the corpus
408+(scope is defined in Part~III, not here); it simply receives no venue evidence. Because weights are assigned
409+per stream, workshop volumes that share a stream key with a flagship conference inherit the flagship's
410+weight, a known coarseness of the venue signal.
411+
412+\begin{table}[htbp]
413+\begin{singlespace}
414+\centering
415+\caption{The 25 largest DBLP streams (2018--2026 records, CoRR excluded) deliberately left unmapped, out of 103 unmapped streams among the 599 largest (\texttt{ONTOLOGY.md}, generated section ``DBLP coverage'').}
416+\label{tab:appA-dblp-unmapped}
417+\small
418+\begin{tabular}{l r l}
419+\toprule
420+Stream & Records & Venue \\
421+\midrule
422+\texttt{journals/access} & 108,838 & IEEE Access \\
423+\texttt{journals/tim} & 13,470 & IEEE Trans. Instrum. Meas. \\
424+\texttt{journals/tie} & 10,844 & IEEE Trans. Ind. Electron. \\
425+\texttt{conf/hicss} & 7,816 & HICSS \\
426+\texttt{conf/iecon} & 7,727 & IECON \\
427+\texttt{journals/cea} & 7,291 & Comput. Electron. Agric. \\
428+\texttt{conf/smc} & 6,048 & SMC \\
429+\texttt{journals/complexity} & 5,786 & Complex. \\
430+\texttt{journals/ress} & 5,732 & Reliab. Eng. Syst. Saf. \\
431+\texttt{journals/tac} & 5,687 & IEEE Trans. Autom. Control. \\
432+\texttt{journals/information} & 5,621 & Inf. \\
433+\texttt{journals/taes} & 5,543 & IEEE Trans. Aerosp. Electron. Syst. \\
434+\texttt{journals/jfi} & 5,432 & J. Frankl. Inst. \\
435+\texttt{journals/ijgi} & 5,118 & ISPRS Int. J. Geo Inf. \\
436+\texttt{journals/automatica} & 4,727 & Autom. \\
437+\texttt{conf/eucc} & 4,160 & ECC \\
438+\texttt{conf/iccsa} & 3,817 & ICCSA (4) \\
439+\texttt{conf/fie} & 3,807 & FIE \\
440+\texttt{conf/amcis} & 3,798 & AMCIS \\
441+\texttt{journals/peerj-cs} & 3,768 & PeerJ Comput. Sci. \\
442+\texttt{journals/systems} & 3,667 & Syst. \\
443+\texttt{journals/csysl} & 3,647 & IEEE Control. Syst. Lett. \\
444+\texttt{journals/aei} & 3,628 & Adv. Eng. Informatics \\
445+\texttt{journals/ijpr} & 3,591 & Int. J. Prod. Res. \\
446+\texttt{journals/sj} & 3,558 & IEEE Syst. J. \\
447+\bottomrule
448+\end{tabular}
449+\end{singlespace}
450+\end{table}
451+
452+\subsection{Unmapped field-17 topics and the reasons}
453+\label{app:taxonomy-unmapped}
454+
455+OpenAlex places in field~17 a number of clusters that are not computer-science research. The ontology leaves
456+62 field-17 topics unmapped and records a reason for each; Table~\ref{tab:appA-reasons} groups the reasons
457+into eight codes and Table~\ref{tab:appA-unmapped} lists the topics. The dominant case, 29 topics, is
458+education and e-learning research (pedagogy, learning outcomes, teacher development, educational
459+technology studied as an intervention rather than as software); such work is not one of the forty categories,
460+and educational technology \emph{as software} is still captured through software-engineering and HCI venues
461+and keywords when the contribution is technical. Nine topics are physical-science or engineering clusters
462+without computing content (sensor instrumentation, photovoltaics, geochemistry, seismology, nonlinear
463+dynamics, control theory, transportation safety, chemical and environmental engineering). Five are generic
464+residual labels (``Computer Science and Engineering'', ``Diverse Interdisciplinary Research Studies'',
465+``Mathematics, Computing, and Information Processing'', ``Statistical and Computational Modeling'',
466+``Advanced Technologies and Applied Computing'') whose keyword lists carry no specific content; works bearing
467+them reach categories through their other topics, venue, arXiv category and text. Four are media,
468+communication, literary or philosophical clusters, four are out-of-scope disciplines (psychiatry, economic
469+growth, cognitive science, pandemic health care), one is the history of computing (kept out of the
470+research-category map but relevant to Part~II), one is the small cognitive-informatics cluster that has no
471+counterpart among the forty leaves and was not forced into \texttt{ai\_\allowbreak agents}, and nine are residual topics
472+with zero works in the export. The works column of Table~\ref{tab:appA-unmapped} is the OpenAlex
473+\texttt{works\_\allowbreak count} of the topic over all years and fields; it is reported to show the scale of what is set
474+aside (the education cluster alone exceeds one million works, the media cluster T13745 alone 204{,}789) and is
475+not a count of corpus records. The hand-written design note of \texttt{ONTOLOGY.md} speaks of 63 unmapped
476+clusters; the generated tables, which are authoritative, list 62.
477+
478+\begin{table}[htbp]
479+\begin{singlespace}
480+\centering
481+\caption{Reason codes for the unmapped field~17 topics (Table~\ref{tab:appA-unmapped}), with the number of topics and the sum of their OpenAlex \texttt{works\_\allowbreak count}.}
482+\label{tab:appA-reasons}
483+\small
484+\begin{tabularx}{\textwidth}{c X r r}
485+\toprule
486+Code & Reason recorded in the ontology & Topics & Works (sum) \\
487+\midrule
488+E & Education / e-learning research; not a CS research category; technical ed-tech captured elsewhere & 29 & 1{,}027{,}591 \\
489+P & Physical-science or engineering cluster without computing contribution, placed in field~17 by OpenAlex & 9 & 352{,}761 \\
490+Z & Residual OpenAlex topic with zero works in the export; nothing to map & 9 & 0 \\
491+G & Generic, uninformative residual label; works reach categories through other signals & 5 & 30{,}206 \\
492+M & Media, communication, cultural, literary or philosophy-of-science cluster; not CS research & 4 & 275{,}159 \\
493+O & Out-of-scope discipline (psychiatry, economics, cognitive science, pandemic health care) & 4 & 33{,}228 \\
494+H & History of computing technologies (history of science); background for Part~II only & 1 & 72{,}582 \\
495+C & Cognitive informatics / brain informatics; idiosyncratic cluster with no counterpart among the leaves & 1 & 13{,}053 \\
496+\midrule
497+& Total & 62 & 1{,}804{,}580 \\
498+\bottomrule
499+\end{tabularx}
500+\end{singlespace}
501+\end{table}
502+
503+\begin{singlespace}
504+\begin{footnotesize}
505+\begin{longtable}{@{}l p{7.4cm} l r l@{}}
506+\caption{The 62 OpenAlex field~17 topics left unmapped, with the subfield, the number of works of the topic in the 2026-10-14 topic export (all years, all fields) and the reason code of Table~\ref{tab:appA-reasons}.}
507+\label{tab:appA-unmapped}\\
508+\toprule
509+Topic & Name & Subfield & Works & Reason \\
510+\midrule
511+\endfirsthead
512+\caption[]{Unmapped field~17 topics (continued).}\\
513+\toprule
514+Topic & Name & Subfield & Works & Reason \\
515+\midrule
516+\endhead
517+\midrule
518+\multicolumn{5}{r}{continued on next page}\\
519+\endfoot
520+\bottomrule
521+\endlastfoot
522+T13745 & Media and Digital Communication & 1705 & 204,789 & M \\
523+T14496 & Educational Technology and E-Learning & 1710 & 163,032 & E \\
524+T14516 & English Language Learning and Teaching & 1710 & 107,202 & E \\
525+T14430 & Higher Education and Teaching Methods & 1710 & 103,711 & E \\
526+T12797 & History of Computing Technologies & 1706 & 72,582 & H \\
527+T12564 & Sensor Technology and Measurement Systems & 1705 & 71,005 & P \\
528+T11276 & Solar Radiation and Photovoltaics & 1702 & 70,601 & P \\
529+T14455 & Technology and Education Systems & 1705 & 70,588 & E \\
530+T12157 & Geochemistry and Geologic Mapping & 1702 & 69,914 & P \\
531+T12171 & Open Education and E-Learning & 1706 & 66,332 & E \\
532+T14498 & Educational Technology in Learning & 1710 & 63,096 & E \\
533+T14216 & Multimedia Learning Systems & 1710 & 62,005 & E \\
534+T11187 & Nonlinear Dynamics and Pattern Formation & 1705 & 61,626 & P \\
535+T14103 & Educational Management and Quality & 1710 & 57,729 & E \\
536+T11370 & Mobile Learning in Education & 1710 & 55,961 & E \\
537+T12408 & Educational Innovations and Challenges & 1710 & 53,673 & E \\
538+T12395 & Educational Innovations and Technology & 1710 & 45,138 & E \\
539+T14025 & Educational Technology and Assessment & 1710 & 37,519 & E \\
540+T13602 & Educational Methods and Media Use & 1710 & 35,313 & E \\
541+T13194 & ICT in Developing Communities & 1710 & 32,298 & M \\
542+T13615 & Transportation Systems and Safety & 1704 & 26,785 & P \\
543+T14215 & Chemical and Environmental Engineering Research & 1710 & 25,315 & P \\
544+T13018 & Seismology and Earthquake Studies & 1702 & 23,104 & P \\
545+T13081 & Digital Education and Society & 1710 & 22,995 & E \\
546+T14029 & Thoreau and American Literature & 1710 & 19,567 & M \\
547+T13386 & Educational Methods and Teacher Development & 1710 & 19,565 & E \\
548+T14345 & Scientific Research and Philosophical Inquiry & 1710 & 18,505 & M \\
549+T13016 & Innovative Educational Technologies & 1710 & 16,953 & E \\
550+T13674 & Computer Science and Engineering & 1702 & 16,620 & G \\
551+T13559 & Edcuational Technology Systems & 1702 & 16,507 & E \\
552+T14381 & Psychiatry, Mental Health, Neuroscience & 1702 & 15,800 & O \\
553+T14519 & Innovations in Education and Learning Technologies & 1710 & 14,509 & E \\
554+T13062 & Cognitive Computing and Networks & 1702 & 13,053 & C \\
555+T13867 & Economic Growth and Development & 1710 & 9,780 & O \\
556+T13898 & Diverse Interdisciplinary Research Studies & 1702 & 6,495 & G \\
557+T14246 & E-Learning and Knowledge Management & 1706 & 6,373 & E \\
558+T13523 & Mathematics, Computing, and Information Processing & 1703 & 6,343 & G \\
559+T12805 & Cognitive Science and Mapping & 1702 & 5,430 & O \\
560+T13935 & Mathematical Control Systems and Analysis & 1702 & 4,409 & P \\
561+T14409 & Educational Systems and Policies & 1710 & 3,650 & E \\
562+T13565 & Education and Learning Interventions & 1710 & 2,867 & E \\
563+T14071 & Healthcare during COVID-19 Pandemic & 1710 & 2,218 & O \\
564+T14403 & Educational Challenges and Innovations & 1710 & 1,150 & E \\
565+T13482 & Engineering Education and Technology & 1710 & 765 & E \\
566+T14351 & Statistical and Computational Modeling & 1702 & 731 & G \\
567+T13932 & Education, Technology, and Economics & 1710 & 577 & E \\
568+T13873 & Educational Methods and Technology & 1710 & 329 & E \\
569+T13676 & Educational and Technological Research & 1710 & 52 & E \\
570+T13345 & Advanced Technologies and Applied Computing & 1705 & 17 & G \\
571+T14387 & Environmental Engineering and Cultural Studies & 1710 & 2 & P \\
572+T13514 & Experience-Based Knowledge Management & 1702 & 0 & Z \\
573+T13567 & AI and Multimedia in Education & 1702 & 0 & E \\
574+T13693 & Smart Systems and Machine Learning & 1705 & 0 & Z \\
575+T13748 & Advanced Statistical Modeling Techniques & 1705 & 0 & Z \\
576+T13836 & Educational Research and Pedagogy & 1705 & 0 & E \\
577+T13964 & Educational Technology and Optimization & 1710 & 0 & E \\
578+T14064 & Organizational and Employee Performance & 1702 & 0 & Z \\
579+T14155 & Advanced Technology in Applications & 1710 & 0 & Z \\
580+T14174 & Artificial Intelligence and Decision Support Systems & 1710 & 0 & Z \\
581+T14175 & Intuitionistic Fuzzy Systems Applications & 1702 & 0 & Z \\
582+T14413 & Advanced Technologies in Various Fields & 1702 & 0 & Z \\
583+T14431 & Diverse Research and Applications & 1710 & 0 & Z \\
584+\end{longtable}
585+\end{footnotesize}
586+\end{singlespace}
587+
588+\subsection{Known ambiguities and the decisions taken}
589+\label{app:taxonomy-ambiguities}
590+
591+Forty categories drawn up for a mandate are not a partition of the literature, and several pairs or triples
592+overlap by construction. The ontology's author resolved each overlap by a stated rule rather than by leaving
593+it to the weights; the rules are recorded here verbatim in substance, because they determine how the
594+multi-label statistics of Part~IX must be read.
595+
596+\paragraph{Large language models, foundation models, generative AI and NLP.}
597+\texttt{foundation\_\allowbreak models} is the parent concept (any modality, adaptation-oriented); \texttt{llm} is its
598+language child and the home of the ChatGPT/GPT/LLaMA-era literature; \texttt{generative\_\allowbreak ai} concerns the
599+generative model and its outputs (diffusion, GANs, text-to-X synthesis, deepfakes and detection), not text
600+generation by LLMs as such; \texttt{nlp} keeps task-framed language work. Multi-label assignment is expected
601+and intended: an instruction-tuning paper scores in \texttt{llm} and \texttt{nlp}, a diffusion language model
602+in \texttt{llm} and \texttt{generative\_\allowbreak ai}. The OpenAlex topic T10028, labelled ``Topic Modeling'', is in
603+fact the cluster hosting BERT, pre-trained language models and retrieval-augmented generation and is weighted
604+1.0 for \texttt{llm}; a reader who consults the OpenAlex label alone would misjudge this choice.
605+
606+\paragraph{Agents, reinforcement learning and robotics.}
607+Software autonomy (LLM agents, multi-agent systems, planning) is \texttt{ai\_\allowbreak agents}; learning from reward
608+is \texttt{reinforcement\_\allowbreak learning}; physical embodiment is \texttt{robotics}. The word ``agent'' never
609+counts on its own: the patterns require a computing qualifier (``LLM agent'', ``autonomous agent'',
610+``multi-agent system'') and an exclusion vetoes chemical, medical, commercial and other non-computing
611+senses (reagent, contrast agent, real-estate agent).
612+
613+\paragraph{AI safety, cybersecurity and the statistical side of interpretability.}
614+Adversarial examples, backdoors and prompt injection score in both \texttt{ai\_\allowbreak safety} and
615+\texttt{cybersecurity} at 0.8, so that either a second signal or the text decides; fairness and governance
616+belong to \texttt{ai\_\allowbreak safety}; explainability as a statistical method is \texttt{ml\_\allowbreak theory} (0.5), whereas
617+interpretability of large models as a safety practice is \texttt{ai\_\allowbreak safety} (1.0).
618+
619+\paragraph{Cloud, distributed and edge computing.}
620+\texttt{distributed\_\allowbreak computing} is the parent (algorithms, HPC systems software, consensus);
621+\texttt{cloud\_\allowbreak computing} is the service model (virtualisation, serverless, data-centre resource management);
622+\texttt{edge\_\allowbreak computing} is placement near users and devices (offloading, multi-access edge computing,
623+on-device inference). Internet-of-things topics are shared between \texttt{edge\_\allowbreak computing} and
624+\texttt{computer\_\allowbreak networks}.
625+
626+\paragraph{Cryptography, security and privacy.}
627+Primitives and protocols are \texttt{applied\_\allowbreak cryptography}; attacks, defences and systems hardening are
628+\texttt{cybersecurity}; using cryptography or statistics to protect data is
629+\texttt{privacy\_\allowbreak preserving\_\allowbreak computation}, whose child \texttt{federated\_\allowbreak learning} has no OpenAlex topic
630+and no venue of its own and is carried by keywords. The topic T10764 (``Privacy-Preserving Technologies in
631+Data'') hosts both the parent (1.0) and the child (0.7).
632+
633+\paragraph{Architecture, accelerators and operating systems.}
634+Accelerators are a child of architecture and include efficient-inference \emph{systems} (serving engines,
635+attention kernels, quantisation for hardware); operating systems have no OpenAlex topic and are carried by
636+the OSDI, SOSP, EuroSys, USENIX ATC and FAST streams, by \texttt{cs.OS} and by kernel and file-system keywords.
637+
638+\paragraph{Quantum computing and quantum physics.}
639+Only computing and information-processing framings count. Physics topics on qubit platforms are weighted
640+0.2--0.3, and an anchored exclusion removes texts about quantum dots, quantum chemistry, quantum field theory
641+and similar physical senses whenever no computing term (qubit, quantum algorithm, error correction, QKD,
642+NISQ, \ldots) appears anywhere in the title or abstract.
643+
644+\paragraph{Scientific computing, computational biology and autonomous discovery.}
645+A numerical method is \texttt{scientific\_\allowbreak computing}; a biological object is \texttt{computational\_\allowbreak biology};
646+AI that drives the scientific process itself (AI-scientist systems, self-driving laboratories, automated
647+hypothesis generation, AI-discovered algorithms or theorems) is \texttt{autonomous\_\allowbreak scientific\_\allowbreak discovery},
648+which is keyword-driven and vetoed when no AI or automation term is present.
649+
650+\paragraph{Algorithms and complexity.}
651+STOC, FOCS and ICALP are shared; ECCC, \emph{ToCT} and \texttt{cs.CC} are complexity-only. Metaheuristics and
652+evolutionary computation are counted as \texttt{algorithms} at 0.5--0.6 because the corpus is expected to
653+contain many such works and no other leaf claims them.
654+
655+\paragraph{Education, media and other field-17 residues.}
656+As documented in Section~\ref{app:taxonomy-unmapped}, the educational, media, physical-science and generic
657+clusters that OpenAlex places in field~17 are left unmapped, with four exceptions mapped at low weight; this
658+is a deliberate narrowing of ``computer science'' relative to the OpenAlex field, and its effect on corpus
659+scope is examined in Part~III, where scope is defined by DBLP membership and OpenAlex primary field rather
660+than by the ontology.
661+
662+\subsection{Limitations of the mapping and the validation design}
663+\label{app:taxonomy-limits}
664+
665+The weights are expert priors set by reading keyword lists and venue scopes, not parameters fitted to
666+labelled data, and the ontology's own documentation says so. Three limitations follow and are repeated here
667+because they bound what the classification can show. Venue weights are per DBLP stream, so a workshop sharing
668+a stream key with its main conference inherits the main conference's weight. OpenAlex keyword lists were read
669+in full for the 302 field-17 topics and for about 120 CS-adjacent topics named in the area modules, but not for
670+the remaining roughly 4{,}000 topics; relevant clusters from Medicine or Materials Science may be missing and
671+are to be added when the corpus reveals them, through an amendment. And keyword patterns on abstracts fire on
672+mentions as well as on contributions, a failure mode discussed with the others in
673+Section~\ref{sec:m-classification}.
674+
675+The ontology was validated, after the classification run, on a stratified sample whose design is fixed in
676+\texttt{taxonomy/VALIDATION.md}: fifty eligible works with an abstract per rule-assigned primary category
677+(forty strata) plus two hundred works to which the rules assigned no category, drawn with seed~44; two
678+independent LLM raters that never see the rule-based assignment and receive only the definitions of
679+Table~\ref{tab:appA-leaves} with the title, abstract, venue and year of each work; the principal investigator
680+as third rater on a 200-work subsample (checkpoint H-2). The pre-specified decision rule is that a category
681+with consensus $F_1 < 0.60$ triggers a mapping revision, logged as a protocol amendment, and a re-run of the
682+classification. The agreement statistics, the per-category precision and recall, the list of categories that
683+met or failed the decision rule, and any amendment that resulted are reported in Part~IX; nothing about them
684+is asserted in this appendix.
modified manuscript/appendices/appB_search_and_sources.tex +613 −1
@@ -1 +1,613 @@
1−% appB_search_and_sources — to be written (Phase 7) 1+% ============================================================================
2+% Appendix B — Search strategies, sources and acquisition record
3+% Written by Agent L (Appendices B/C instance), 2026-11-03. Operational record
4+% of what ingestion/*.py, systematic_review/define_corpus.py and the runbook
5+% actually did; Part III gives the rationale and must not be repeated here.
6+% Corpus numbers only through macros of tables/numbers.tex; sizes, hashes,
7+% dates, file counts and parameter values are provenance identifiers and are
8+% typed from data/raw/README.md, reports/PHASE0_FEASIBILITY.md and the ledgers.
9+% ============================================================================
10+
11+\section{Search strategies, sources and acquisition record}
12+\label{sec:appB}
13+
14+This appendix is the operational counterpart of Part~III\@. Part~III explains
15+why four bibliographic sources were combined and what each contributes; the
16+present appendix records, source by source, the endpoint or bucket that was
17+read, the release or version that was read, the filters that were applied,
18+the rate limits and budgets under which the reading took place, the licence
19+of the material, the integrity checks performed on arrival, and what was
20+sought but not obtained. It then gives the reporting items of the PRISMA-S
21+extension for literature searches \citep{rethlefsen2021prismas} in the form
22+they take for a scope-filtered mapping study, the exclusion codes of the
23+eligibility stage with their predicates, the type and platform lists on which
24+those predicates depend, and the record-linkage cascade with its thresholds.
25+Every statement below can be checked against the scripts in
26+\texttt{ingestion/} and \texttt{systematic\_review/}, the runbook
27+(\texttt{reproducibility/RUNBOOK.md}) and the provenance note
28+\texttt{data/raw/README.md}; where a count is a property of the corpus it is
29+rendered by a macro of \texttt{tables/numbers.tex}, and where no macro exists
30+the value is marked pending rather than typed.
31+
32+\subsection{Acquisition at a glance}
33+\label{sec:appB-glance}
34+
35+Table~\ref{tab:appB-acq} lists the five acquisitions in the order of the
36+runbook. All were performed from the compute node \texttt{M3U96b} between the
37+evening of 2~November and 3~November~2026 (Eastern Time), with no credential
38+of any kind: the OpenAlex key, the Semantic Scholar key and the Kaggle
39+credentials were tested as absent before the first download
40+(\texttt{reports/PHASE0\_FEASIBILITY.md}, §2). The absence of credentials is
41+not incidental. It determined the choice of the snapshot over the API for
42+OpenAlex (decision D1 of the plan), it excluded Semantic Scholar (D3), and it
43+capped the post-snapshot increment at the public daily budget
44+(Section~\ref{sec:appB-increment}).
45+
46+\begin{table}[htbp]
47+\centering\footnotesize
48+\caption{Acquisitions performed for the WP44 corpus, in runbook order.}
49+\label{tab:appB-acq}
50+\begin{tabularx}{\textwidth}{>{\raggedright\arraybackslash}p{1.8cm}>{\raggedright\arraybackslash}X>{\raggedright\arraybackslash}p{2.2cm}>{\raggedright\arraybackslash}p{4.0cm}}
51+\toprule
52+Source & Object read & Obtained & Integrity record \\
53+\midrule
54+OpenAlex works & public snapshot, release 2026-10-14, \texttt{data/jsonl/works/}, 1{,}898 part files, 675{,}298{,}563{,}638 bytes gzip & 2026-11-02 21:19 to 23:05 ET, HTTPS, 8 parallel streams & manifest copy; content length and SHA-256 per file in \texttt{works/ledger.sqlite}; 1{,}898/1{,}898 done, 0 malformed lines; record total equal to the manifest total \\
55+OpenAlex entities & snapshots of topics, subfields, fields, domains, sources, institutions, publishers, funders, concepts & 2026-11-02 & \texttt{entities\_ledger.json}: content length and SHA-256 per file \\
56+OpenAlex API & works with any CS topic and publication date 2026-10-01 to 2026-11-02, by day and by primary field & 2026-11-03 onward, within the public budget & \texttt{api\_increment/}\allowbreak\texttt{ledger.json}: calls, cost, records and pages per slice; raw pages kept verbatim \\
57+DBLP & \texttt{dblp.xml.gz} dated 2026-11-02 22:39 UTC, 1{,}116{,}270{,}104 bytes, with \texttt{dblp.dtd} and \texttt{dblp.xml.gz.md5} & 2026-11-02 & published MD5 \texttt{ff1c424c3b4cef36}\allowbreak\texttt{582f647c36df27c0} verified on the whole file before parsing; parse report with size, MD5 of the first GiB, counts by type and year \\
58+arXiv & OAI-PMH, set \texttt{cs}, metadata prefix \texttt{arXiv}, datestamps 2018-01-01 to 2026-11-02 & 2026-11-02 to 03 & \texttt{harvest\_state.json} (pages, records, seconds per window); 758 raw XML pages kept; \texttt{arxiv\_parse\_}\allowbreak\texttt{report.json} \\
59+ACL Anthology & \texttt{anthology+abstracts.bib.gz}, 46{,}723{,}382 bytes & 2026-11-02 & SHA-256 \texttt{44c3f7e907f221b740}\allowbreak\texttt{bea09069818a3d7c0d}\allowbreak\texttt{fd88b2da3b750d9f02}\allowbreak\texttt{955efc58b3}; \texttt{acl\_parse\_}\allowbreak\texttt{report.json} \\
60+\bottomrule
61+\end{tabularx}
62+\end{table}
63+
64+\subsection{OpenAlex works snapshot}
65+\label{sec:appB-openalex}
66+
67+\paragraph{Bucket, release and manifest.}
68+The works entity of the OpenAlex snapshot \citep{priem2022openalex} is
69+distributed as gzip-compressed JSON Lines files in the public S3 bucket
70+\texttt{s3://openalex/} under the prefix \texttt{data/jsonl/works/}, partitioned by the date at which the
71+records were last updated (\texttt{updated\_date=YYYY-MM-DD/}\allowbreak\texttt{part\_NNNN.gz}).
72+The release read is the one whose \texttt{manifest.json} carries the date
73+2026-10-14; the manifest lists 1{,}898 part files with, for each, its URL,
74+its content length in bytes and its record count, together with the totals
75+(\LinkSlimTotal{} works, 675{,}298{,}563{,}638 bytes). A copy of the manifest
76+is kept as \texttt{data/raw/openalex/works\_manifest\_2026-10-14.json} and is
77+the reference against which the ledger is checked. No AWS client was
78+installed on the node; the bucket is public and each object was fetched over
79+HTTPS from \url{https://openalex.s3.amazonaws.com/} with \texttt{curl}
80+(\texttt{-L --retry 5 --retry-delay 3 --retry-all-errors -C -}, the last
81+option resuming an interrupted transfer), up to five outer attempts per file
82+with a linearly increasing pause, and the transfer was accepted only when the
83+byte count on disk equalled the content length in the manifest. The measured
84+single-stream throughput from the node was about 71~MB/s and the aggregate
85+over eight streams about 110~MB/s, which fixed the worker count at eight and
86+the wall time at one hour and forty-six minutes for the whole bucket
87+(\texttt{ingestion/openalex\_snapshot.py --workers 8}).
88+
89+\paragraph{Filter applied on the stream (pass 1).}
90+Each part file was decompressed in memory and parsed line by line
91+(\texttt{orjson}); a line that failed to parse was counted as malformed and
92+skipped, and the count of such lines (zero for every file) is in the ledger.
93+For every parsed work $w$ the script evaluated the predicate
94+\begin{equation}
95+ \mathrm{CS}(w) \;=\; \Bigl[\exists\, \theta \in \mathrm{topics}(w) :
96+ \mathrm{field}(\theta) = \text{\texttt{fields/17}}\Bigr]
97+ \;\vee\; \Bigl[\mathrm{field}\bigl(\mathrm{primary\_topic}(w)\bigr) = \text{\texttt{fields/17}}\Bigr],
98+ \label{eq:appB-csfilter}
99+\end{equation}
100+that is, whether any of the up to three topics attached to the record, or its
101+primary topic, belongs to the OpenAlex field with identifier~17
102+(\emph{Computer Science}; \citealp{openalex2024topics}), and kept the
103+\emph{complete} JSON record when $\mathrm{CS}(w)$ held and
104+\texttt{publication\_year} lay in $[2018, 2026]$. Records flagged
105+\texttt{is\_xpac} (OpenAlex's expansion of coverage from non-Crossref
106+sources) were kept at this stage with their flag, so that the exclusion could
107+be applied later by the eligibility predicate rather than silently at
108+ingestion. The retained records were re-compressed with Zstandard (level~6)
109+into one file per part, \texttt{works/cs/}\allowbreak\texttt{updated\_date=X\_\_part\_NNNN.jsonl.zst},
110+about 20~GB in total for
111+\PrismaIdentifiedOpenalexCsTopicTwoZeroOneEightTwoZeroTwoSixPassOne{}
112+records. No text search of any kind was performed: the scope of the OpenAlex
113+layer is defined entirely by the topic classifier's field assignment, which is
114+the search strategy appropriate to a field-level mapping and whose
115+consequences are discussed in Part~III\@.
116+
117+\paragraph{Slim table of every work.}
118+In the same pass the script wrote, for \emph{every} work in the snapshot
119+regardless of field or year, one row of a slim Parquet table with the
120+following columns: OpenAlex identifier (as an integer), DOI (lower-cased,
121+prefix removed), publication year and date, type, \texttt{cited\_by\_count},
122+primary topic, subfield, field and domain identifiers, the value of
123+$\mathrm{CS}(w)$, the XPAC, open-access and retraction flags, language,
124+primary source identifier, number of referenced works, number of authors,
125+whether an abstract is present, and FWCI\@. The 1{,}898 per-part files were
126+later concatenated into \texttt{compact/slim\_all\_works.parquet}
127+(\LinkSlimTotal{} rows). The slim table is what allows a reference from a
128+computer-science work to a work in another field to be typed and dated
129+(Part~IV), and it is also what made the second pass of
130+Section~\ref{sec:appB-pass2} possible without re-reading the bucket for a
131+search.
132+
133+\paragraph{Integrity and provenance.}
134+Before parsing, the SHA-256 digest of the gzip bytes of each part file was
135+computed and written, with the file's URL, content length, manifest record
136+count, parsed record count, retained record count, malformed-line count,
137+download and total times, attempt count and timestamps, to a SQLite ledger
138+(\texttt{works/ledger.sqlite}, table \texttt{files}); a second table
139+(\texttt{runs}) records the manifest date and totals, the worker count, the
140+host name and the command line of every invocation. The ledger makes the job
141+resumable (a file with status \texttt{done} is never re-read) and is the
142+provenance record of the raw layer. The raw \texttt{.gz} files were deleted
143+after a successful parse (decision D6 of the plan): the snapshot is a public,
144+versioned release, the manifest and the per-file digests permit an
145+independent party to re-download and verify any part, and keeping 675~GB of
146+compressed JSON on the node would have precluded the rest of the pipeline.
147+Three checks were made at the end of the pass and are recorded in
148+\texttt{data/raw/README.md}: all 1{,}898 files have status \texttt{done}; the
149+sum of parsed records over files equals the manifest total; and the sum of
150+malformed lines is zero. The OpenAlex snapshot is released under CC0~1.0
151+(\texttt{LICENSE.txt} in the bucket, copied next to the manifest), which
152+permits redistribution of derived record-level data.
153+
154+\paragraph{Entity snapshots.}
155+The smaller entity snapshots were downloaded from the same bucket by
156+\texttt{ingestion/}\allowbreak\texttt{openalex\_entities.py}, using each
157+entity's own manifest, with the same length check and SHA-256 ledger
158+(\texttt{entities\_ledger.json}). The manifests list 4{,}516 topics,
159+252 subfields, 26 fields, 4 domains, 268{,}629 sources, 143{,}455 institutions,
160+10{,}713 publishers, 41{,}799 funders and 65{,}026 concepts; the topics
161+snapshot was flattened to \texttt{topics\_flat.csv} (identifier, name,
162+subfield, field, domain, works count, keywords, description) and is the
163+vocabulary over which the ontology of Appendix~A maps OpenAlex topics to
164+categories. The authors entity was not downloaded, because the authorship
165+blocks embedded in each work record already carry the author identifier,
166+display name, ORCID, position and institutions; the keywords entity
167+(1{,}881{,}723 entries in its manifest) was not downloaded either, the
168+per-work keyword lists being embedded as well.
169+
170+\subsection{Second snapshot pass by identifier set}
171+\label{sec:appB-pass2}
172+
173+The first pass retains what OpenAlex calls computer science. The record
174+linkage of Section~\ref{sec:appB-linkage} showed that
175+\LinkDblpUnlinkedWithDoiInSlim{} DBLP records of 2018--2026 have a DOI that
176+exists in the slim table of all works but not in the retained subset, that is,
177+works indexed by DBLP that OpenAlex labels with no computer-science topic.
178+Rather than accept OpenAlex's boundary, the pipeline reads the bucket a
179+second time in \emph{identifier-set mode}. The linkage script writes
180+the list \texttt{data/metadata/needed\_oa\_ids.csv} of OpenAlex identifiers to
181+recover (\LinkNeededOaIdsSecondPassDblpDoi{} reached through a DBLP DOI and
182+\LinkNeededOaIdsSecondPassArxivDoi{} through an arXiv DOI), and
183+\texttt{openalex\_snapshot.py --id-list} streams every part file again,
184+keeping exactly the records whose identifier is in the set and writing no slim
185+rows. The identifier set is loaded in each worker process (macOS uses the
186+\texttt{spawn} start method, so module globals are rebuilt per worker), the
187+same download, length and SHA-256 discipline applies, and the output lands in
188+\texttt{works\_pass2/cs/} with its own ledger. The recovered records are
189+normalised with the suffix \texttt{\_p2} and the linkage is rerun on the
190+union of both passes (\texttt{ingestion/run\_pass2\_chain.sh}). The second
191+pass costs the same bandwidth as the first---about one hour and fifty minutes
192+of streaming---because an identifier lookup cannot be pushed to the bucket;
193+the price was accepted because the alternative, fetching the identifiers one
194+by one through the API, would have exceeded the public budget by two orders of
195+magnitude. The PRISMA counts of Part~III were generated from the first pass
196+(\PrismaIdentifiedOpenalexTotalRecordsLoaded{} records loaded); the second
197+pass adds its records to $\mathcal{W}_0$ when it completes and the counts are
198+regenerated by the same scripts, so the identification total in the final
199+PRISMA figure is \pending{PrismaIdentifiedOpenalexTotalRecordsLoaded after the second pass}
200+rather than the first-pass value quoted here.
201+
202+\subsection{OpenAlex API increment}
203+\label{sec:appB-increment}
204+
205+The snapshot ends on 14~October 2026 and the observation window on
206+2~November 2026. The gap was covered by the REST API
207+(\texttt{https://api.openalex.org/works}) without a key. Two constraints of the
208+unkeyed API shaped the harvest and are recorded here because they bound what
209+the increment can contain. First, cursor paging requires a key, so the
210+harvest used basic page numbering, which the API caps at 10{,}000 results per
211+filter expression; the harvest is therefore \emph{sliced}, one request series
212+per publication day $d$ and per primary-field class, with the filter
213+\begin{quote}\ttfamily
214+topics.field.id:17, from\_publication\_date:$d$, to\_publication\_date:$d$,
215+primary\_topic.field.id:17 \quad (slice ``cs\_primary'')\\
216+topics.field.id:17, from\_publication\_date:$d$, to\_publication\_date:$d$,
217+primary\_topic.field.id:!17 \quad (slice ``cs\_secondary'')
218+\end{quote}
219+for every day from 2026-10-01 to 2026-11-02 (the start was placed two weeks
220+before the snapshot date to absorb records that OpenAlex back-dates), 200
221+results per page, a \texttt{select} list of the fields used by the
222+normaliser (identifiers, dates, type, language, locations, open access,
223+authorships, topics, keywords, referenced works, citation counts, abstract
224+inverted index, flags, FWCI, funders, indexed-in, full-text flag, APC), the
225+polite-pool \texttt{mailto} parameter and a descriptive user agent. A slice
226+whose reported \texttt{count} exceeds 10{,}000 is marked \texttt{truncated} in
227+the ledger; the two-way split by primary field was chosen because a single
228+day of computer-science output in 2026 can exceed the cap while each half
229+rarely does. Second, the unkeyed API is metered: list-and-filter calls are
230+charged at about \$0.0001 each against a shared budget of \$0.10 per day,
231+and the script stops at \$0.085 per day (a margin for the free single-record
232+lookups used for reference verification), sleeps 0.12~s between calls, and
233+halts on HTTP~429, 403 or any 5xx response so that the next day's run resumes
234+from the ledger. Every page is stored verbatim as
235+\texttt{api\_increment/pages/<day>\_<slice>/page\_NNNN.json}; the ledger
236+(\texttt{api\_increment/ledger.json}) records per slice the pages, records,
237+reported count, completion and truncation flags, and globally the number of
238+calls and the cost. At the time of writing the harvest had used the budget
239+of several consecutive days and was not complete; its totals
240+(\pending{IncrementApiCalls}, \pending{IncrementRecordsRetrieved},
241+\pending{IncrementTruncatedSlices}) will be reported from the ledger when the
242+last slice closes. The conversion step (\texttt{ingest\_api\_increment.py})
243+rewrites the pages into the same \texttt{.jsonl.zst} part format as the
244+snapshot filter (\texttt{works\_pass3/}), skipping any work whose identifier
245+is already in the pass-1 or pass-2 tables and writing an
246+\texttt{increment\_report.json} (pages, new works, works already present); the
247+number of works added by the increment is \pending{IncrementNewWorks}. Two
248+limitations follow from the design and are not recoverable from the ledger: a
249+truncated slice loses the records beyond the 10{,}000th in the API's default
250+ordering, and a record created after 2~November 2026 with a publication date
251+inside the window is absent whatever its date. Both affect only the last
252+weeks of a window that is already treated as right-censored (Part~III), so no
253+analysis depends on them.
254+
255+\subsection{DBLP}
256+\label{sec:appB-dblp}
257+
258+\paragraph{Dump and version.}
259+DBLP \citep{ley2002dblp, ley2009dblp} publishes its whole database as a
260+single XML file. The file read is \texttt{dblp.xml.gz} as served on
261+2~November 2026 (file timestamp 22:39 UTC), 1{,}116{,}270{,}104 bytes, together
262+with the document type definition \texttt{dblp.dtd} and the published
263+checksum file \texttt{dblp.xml.gz.md5}. The MD5 of the whole file,
264+\texttt{ff1c424c3b4cef36582f647c36df27c0}, was computed and compared with the
265+published value before parsing; the parse report additionally stores the file
266+size and an MD5 of the first gibibyte as a quick identity check for later
267+sessions. DBLP is released under the Open Data Commons Attribution licence
268+(ODC-BY~1.0), which permits the redistribution of derived data with
269+attribution. The download from \texttt{dblp.org} proceeded at about 12~MB/s,
270+the slowest link of the whole acquisition.
271+
272+\paragraph{Parsing rule.}
273+The DTD matters: DBLP titles use XML entities for accented characters, and a
274+parser that does not resolve them against \texttt{dblp.dtd} corrupts titles
275+and therefore the title-based linkage. The parser
276+(\texttt{ingestion/dblp\_parse.py}) is \texttt{lxml.etree.iterparse} over the
277+gzip stream with \texttt{load\_dtd=True}, \texttt{resolve\_entities=True} and
278+\texttt{huge\_tree=True}, run from the directory containing the DTD because
279+the dump references it relatively. It emits one row per record of the types
280+\textit{article}, \textit{inproceedings}, \textit{proceedings}, \textit{book},
281+\textit{incollection}, \textit{phdthesis}, \textit{mastersthesis} and
282+\textit{data}; person records (\texttt{www}) are consumed and discarded. For
283+each record it keeps the key, type, modification date, publication-type
284+attribute, title (concatenated text of the title element, so that embedded
285+markup such as subscripts is flattened), year, author names and DBLP person
286+identifiers, editors, journal, booktitle, volume, number, pages, publisher,
287+series, the DOI (taken from the first electronic-edition URL beginning with
288+\texttt{https://doi.org/}, lower-cased), the full list of electronic-edition
289+URLs, the URL, the cross-reference to the proceedings record, and the
290+\emph{stream}, the part of the key before its last slash
291+(\texttt{journals/tocs}, \texttt{conf/nips}), which is DBLP's venue identifier
292+and the unit on which the ontology's venue signals are defined. All years are
293+parsed; counts by type and by year for the entire archive are written to
294+\texttt{dblp\_parse\_report.json}, and the records of 2018--2026
295+(\LinkDblpTwoZeroOneEightTwoZeroTwoSix{} after the type restriction of the
296+linkage step) are the ones that enter the corpus. The total number of
297+publication records in the dump is \pending{DblpParsedRecords}. A second
298+script (\texttt{dblp\_streams.py}) lists the streams with at least one hundred
299+records of type article or inproceedings in 2018--2026, with their first and
300+last years and a sample journal or booktitle name; this list
301+(\texttt{taxonomy/dblp\_streams\_2018\_2026.csv}) is the input of the
302+venue-to-category mapping and is not itself a corpus filter.
303+
304+\subsection{arXiv}
305+\label{sec:appB-arxiv}
306+
307+\paragraph{Protocol and windows.}
308+arXiv \citep{ginsparg2011arxiv} metadata were harvested through its OAI-PMH
309+endpoint \texttt{https://oaipmh.arxiv.org/oai} with the verb
310+\texttt{ListRecords}, the set \texttt{cs} and the metadata prefix
311+\texttt{arXiv}, which returns arXiv's own schema (identifier, dates, title,
312+abstract, authors with forenames and keynames, categories, comments, journal
313+reference, DOI, licence, report number, MSC and ACM classes). The harvest was
314+sliced into calendar-month windows on the OAI \texttt{from}/\texttt{until}
315+parameters from 2018-01-01 to 2026-11-02; each window was walked with the
316+resumption token until exhausted, and every response page was written
317+verbatim to \texttt{raw/<window>/page\_NNNN.xml} before being parsed, so that
318+the Parquet table can be rebuilt from the raw pages
319+(\texttt{--parse-only}) without touching the network. The harvester waited
320+3.5~s between requests, honoured the \texttt{Retry-After} header on HTTP~503
321+(arXiv's flow-control response), waited thirty seconds on other errors, and
322+gave up a window after twelve consecutive failures (none occurred). The
323+state file \texttt{harvest\_state.json} records, per window, the number of
324+pages, of records and of seconds, and the harvest of the 107 windows produced
325+758 pages in about one hour.
326+
327+\paragraph{Datestamp semantics and deduplication.}
328+A point about OAI-PMH that affects the counts must be stated. The
329+\texttt{from}/\texttt{until} parameters select on the record's
330+\emph{datestamp}, which is the date of its last modification, not on its
331+submission date. A monthly window therefore contains every record touched in
332+that month, including old e-prints whose metadata were edited, and a record
333+edited in two months appears in two windows. The parser keeps, for each arXiv
334+identifier, the occurrence with the latest datestamp, skips records whose
335+header carries \texttt{status="deleted"}, normalises whitespace in titles and
336+abstracts, lower-cases the DOI, takes the first listed category as the
337+primary category, and records the set specifications. The result is
338+\LinkArxivCsRecords{} distinct records, of which
339+\LinkArxivCreatedTwoZeroOneEightTwoZeroTwoSix{} have a \texttt{created} date
340+(first submission) in 2018--2026; the difference consists of older e-prints
341+modified during the window, which are kept in the table for linkage but do
342+not belong to the observation window. The \texttt{created} date is the one
343+used as $d_{\mathrm{arx}}(w)$ in Part~IV\@. arXiv's metadata are offered for
344+reuse under its metadata terms; the e-prints themselves were not downloaded
345+in the acquisition described here.
346+
347+\subsection{ACL Anthology}
348+\label{sec:appB-acl}
349+
350+The ACL Anthology \citep{radev2013aclanthology, acl2024anthology}
351+distributes its complete bibliography as a BibTeX export. The variant with
352+abstracts (\texttt{anthology+}\allowbreak\texttt{abstracts.bib.gz}) was downloaded on
353+2~November 2026 (46{,}723{,}382 bytes; SHA-256 in
354+Table~\ref{tab:appB-acq}). BibTeX is not a regular language, so the parser
355+(\texttt{ingestion/acl\_parse.py}) walks the text by brace depth: it locates
356+each \texttt{@type\{} header, finds the matching closing brace, splits the
357+body at its first comma into the citation key (which is the Anthology
358+identifier, for instance \texttt{P19-1001} or \texttt{2023.acl-long.1}) and
359+the field list, and reads each field as a braced, quoted or bare value with
360+nested braces allowed. Fifteen fields are kept (title, author, editor,
361+booktitle, journal, month, year, address, publisher, URL, DOI, pages,
362+abstract, volume, number); braces inside values are removed and whitespace
363+normalised. Entries of type \texttt{comment}, \texttt{string} and
364+\texttt{preamble} are skipped. The export is released under CC~BY~4.0. The
365+number of entries parsed is \pending{AclParsedEntries}; the linkage step uses
366+only the \textit{inproceedings} and \textit{article} entries
367+(\LinkAclRecords{}), of which \LinkAclTwoZeroOneEightTwoZeroTwoSix{} fall in
368+2018--2026. The Anthology's role is a coverage check for natural-language
369+processing venues rather than a corpus source in its own right; an ACL entry
370+with no OpenAlex counterpart is counted in the linkage report but is never a
371+work of the corpus.
372+
373+\subsection{What was sought and not obtained}
374+\label{sec:appB-notobtained}
375+
376+The mandate lists sources beyond the four used, and the integrity rules
377+require that inaccessible data be recorded rather than worked around. The
378+record is as follows.
379+
380+\begin{description}
381+ \item[Semantic Scholar Academic Graph.] An anonymous request to the
382+ endpoint \texttt{graph/v1/paper/} for \texttt{arXiv:2303.08774} returned HTTP~429 with the
383+ instruction to apply for a key, and the datasets endpoint requires a key
384+ outright \citep{kinney2023s2ag}. No key was requested because the project
385+ rule is not to assume credentials and because applying would have made the
386+ acquisition depend on an approval outside the project's control. The
387+ consequence is the absence of the influential-citation and citation-intent
388+ signals from every analysis, stated wherever it matters.
389+ \item[OpenAlex API key.] A free key raises the daily budget from \$0.10 to
390+ \$1 and enables cursor paging. Obtaining it requires the principal
391+ investigator to confirm an e-mail; this was not done without instruction,
392+ and the increment of Section~\ref{sec:appB-increment} was run under the
393+ unkeyed budget. The snapshot route does not depend on the key.
394+ \item[Full texts.] No full text was downloaded during corpus construction.
395+ Abstracts come from the OpenAlex inverted index (and from arXiv and the
396+ Anthology for their records). The plan reserves lawful full-text access
397+ (arXiv e-prints at one request per three seconds, open-access locations)
398+ for at most 10{,}000 high-priority works in a later phase; the
399+ knowledge-graph extraction of Part~IV is abstract-based and labelled as
400+ such.
401+ \item[Crossref.] The REST API was reached (\texttt{works?filter=}\allowbreak\texttt{from-pub-date:2022-11-30\&rows=0}
402+ returned a count for all fields) and is used for the verification of every
403+ DOI cited in the manuscript and for sample cross-checks of types and
404+ citation counts; it was not used as a corpus source, OpenAlex already
405+ carrying its metadata.
406+ \item[Other sources listed in the mandate.] Kaggle arXiv snapshot,
407+ Microsoft Academic Graph, Papers with Code, institutional repositories: no Kaggle credentials were configured and
408+ OAI-PMH made the snapshot unnecessary; the Microsoft Academic Graph was
409+ discontinued in 2021; benchmark and code repositories are scoped to the
410+ reproducibility analyses of a later phase and are not bibliographic
411+ sources; institutional repositories enter only through OpenAlex's
412+ indexing of them, which the generic-deposit rule of
413+ Section~\ref{sec:appB-exclusions} then restricts.
414+\end{description}
415+
416+\subsection{PRISMA-S search record}
417+\label{sec:appB-prismas}
418+
419+PRISMA-S \citep{rethlefsen2021prismas} is written for keyword searches of
420+bibliographic databases. A scope-filtered mapping has no search string, but
421+its sixteen items can still be answered, and answering them makes explicit
422+which items have no counterpart. Table~\ref{tab:appB-prismas} gives the
423+record; the PRISMA~2020 flow itself \citep{page2021prisma, haddaway2022prismaflow}
424+is Figure~\ref{fig:prisma} and Table~\ref{tab:prisma} of Part~III\@.
425+
426+\begin{table}[htbp]
427+\centering\footnotesize
428+\caption{PRISMA-S items answered for the WP44 corpus.}
429+\label{tab:appB-prismas}
430+\begin{tabularx}{\textwidth}{>{\raggedright\arraybackslash}p{0.5cm}>{\raggedright\arraybackslash}p{3.2cm}>{\raggedright\arraybackslash}X}
431+\toprule
432+No. & Item & This study \\
433+\midrule
434+1 & Database names & OpenAlex (works and entity snapshots), DBLP, arXiv, ACL Anthology; Crossref for verification only. \\
435+2 & Multi-database searching & Each source read in full under its own scope filter; no interface or vendor platform (direct bucket, dump and OAI access). \\
436+3 & Study registries & Not applicable. \\
437+4 & Online resources and browsing & None. \\
438+5 & Citation searching & None for identification; OpenAlex reference lists are analysed but do not add records to the corpus. \\
439+6 & Contacts & None. \\
440+7 & Other methods & None. \\
441+8 & Full search strategies & OpenAlex: predicate~\eqref{eq:appB-csfilter} with publication year 2018--2026, then identifier-set recovery of DBLP- and arXiv-linked works (Section~\ref{sec:appB-pass2}), then the API filter of Section~\ref{sec:appB-increment}. DBLP: whole dump, record types listed in Section~\ref{sec:appB-dblp}, years 2018--2026 at linkage. arXiv: OAI set \texttt{cs}, datestamps 2018-01-01 to 2026-11-02, \texttt{created} in 2018--2026 at linkage. ACL: whole export, types inproceedings and article, years 2018--2026 at linkage. \\
442+9 & Limits and restrictions & Year window only; no language, type or country restriction at search time (types are an eligibility criterion, Section~\ref{sec:appB-exclusions}). \\
443+10 & Search filters & None beyond the scope predicates; the OpenAlex topic classifier is the instrument that defines ``computer science'' on that layer and its properties are discussed in Part~III\@. \\
444+11 & Prior work & No search strategy was reused from a prior review. \\
445+12 & Updates & One update by API increment to 2026-11-02; no further update is planned for this version. \\
446+13 & Dates of searches & OpenAlex snapshot released 2026-10-14, read 2026-11-02; DBLP dump 2026-11-02; arXiv harvest 2026-11-02 to 03; ACL export 2026-11-02; API increment from 2026-11-03. \\
447+14 & Peer review of the search & No librarian review; the strategy is preregistered in \texttt{protocol/PROTOCOL.md} (P3) and audited by the independent agents of Phase~8. \\
448+15 & Total records & OpenAlex \PrismaIdentifiedOpenalexCsTopicTwoZeroOneEightTwoZeroTwoSixPassOne{} (pass 1); DBLP \PrismaIdentifiedDblpTwoZeroOneEightTwoZeroTwoSix{}; arXiv \PrismaIdentifiedArxivCsTwoZeroOneEightTwoZeroTwoSix{}; ACL \PrismaIdentifiedAclTwoZeroOneEightTwoZeroTwoSix{} (all 2018--2026). \\
449+16 & Deduplication & Deterministic record linkage across sources (Section~\ref{sec:appB-linkage}) and preprint--publication merging within OpenAlex (Part~III, Part~IV); OpenAlex works are the counting unit; \PrismaExcludedEFiveDuplicate{} preprint members of merged pairs are flagged E5. \\
450+\bottomrule
451+\end{tabularx}
452+\end{table}
453+
454+\subsection{Exclusion codes and their predicates}
455+\label{sec:appB-exclusions}
456+
457+The eligibility stage (\texttt{systematic\_review/define\_corpus.py}) computes
458+seven exclusion flags and two membership flags as columns of the table
459+\texttt{corpus\_works}, each a SQL expression over the normalised OpenAlex
460+record and the linkage tables. Table~\ref{tab:appB-codes} paraphrases the
461+predicates. Three lists on which they depend are reproduced verbatim from the
462+script, because their content is the substance of the type rule and of
463+amendment A-002.
464+
465+\begin{itemize}
466+ \item $T_{\mathrm{keep}}$ (types kept without further condition):
467+ \texttt{article}, \texttt{conference-}\allowbreak\texttt{paper}, \texttt{preprint},
468+ \texttt{book-}\allowbreak\texttt{chapter}, \texttt{book}, \texttt{dissertation},
469+ \texttt{report}, \texttt{review}, \texttt{software-}\allowbreak\texttt{paper}.
470+ \item $T_{\mathrm{hard}}$ (types excluded even for DBLP-linked records):
471+ \texttt{editorial}, \texttt{erratum}, \texttt{retraction},
472+ \texttt{peer-}\allowbreak\texttt{review}, \texttt{paratext}, \texttt{conference-}\allowbreak\texttt{abstract},
473+ \texttt{reference-}\allowbreak\texttt{entry}, \texttt{dataset}, \texttt{software},
474+ \texttt{supplementary-}\allowbreak\texttt{materials}, \texttt{libguides}, \texttt{letter},
475+ \texttt{grant}, \texttt{standard}.
476+ \item $\mathcal{G}$ (generic deposit platforms, matched on the primary
477+ source's display name): ``Zenodo (CERN European Organization for Nuclear
478+ Research)'' and ``Zenodo''; ``Figshare''; ``Institutional Repositories
479+ DataBase (IRDB)''; ``LA Referencia (Red Federada de Repositorios
480+ Institucionales de Publicaciones Cient\'{\i}ficas)''; ``Dialnet (Universidad de
481+ la Rioja)''; ``DOAJ (DOAJ: Directory of Open Access Journals)''; ``OSTI OAI
482+ (U.S. Department of Energy Office of Scientific and Technical
483+ Information)''.
484+\end{itemize}
485+
486+\begin{table}[htbp]
487+\centering\footnotesize
488+\caption{Exclusion and membership codes of \texttt{define\_corpus.py}, with their predicates paraphrased from SQL. $w$ is an OpenAlex record; \textit{in\_dblp}, \textit{in\_acl} and \textit{arxiv\_linked} are read from the link tables; $t_0$ = 2018-01-01, $t_1$ = 2026-11-02.}
489+\label{tab:appB-codes}
490+\begin{tabularx}{\textwidth}{>{\raggedright\arraybackslash}p{0.9cm}>{\raggedright\arraybackslash}p{3.4cm}>{\raggedright\arraybackslash}X>{\raggedright\arraybackslash}p{1.9cm}}
491+\toprule
492+Code & Column & Predicate (true = flagged) & Marginal count \\
493+\midrule
494+E1 & \texttt{e1\_outside\_window} & \texttt{publication\_date} is null, or $< t_0$, or $> t_1$ & \PrismaExcludedEOneOutsideWindow{} \\
495+E2 & \texttt{e2\_type} & $\tau(w) \notin T_{\mathrm{keep}}$ and not (\textit{in\_dblp} and $\tau(w) \notin T_{\mathrm{hard}}$); a null type counts as outside $T_{\mathrm{keep}}$ & \PrismaExcludedETwoType{} \\
496+E3 & \texttt{e3\_xpac} & \texttt{is\_xpac} and not \textit{in\_dblp} & \PrismaExcludedEThreeXpac{} \\
497+--- & \texttt{xpac\_kept\_dblp} & \texttt{is\_xpac} and \textit{in\_dblp} (kept, flagged) & \PrismaExcludedXpacKeptDblp{} \\
498+E4 & \texttt{e4\_no\_title} & title null or empty after trimming & \PrismaExcludedEFourNoTitle{} \\
499+E5 & \texttt{e5\_duplicate} & $w$ is the preprint member of a surviving preprint--published pair (Part~IV, eq.~\eqref{eq:duppair}) & \PrismaExcludedEFiveDuplicate{} \\
500+E6 & \texttt{e6\_retracted} & \texttt{is\_retracted} (flag only; not part of eligibility) & \PrismaExcludedESixRetracted{} \\
501+E7 & \texttt{e7\_generic\_deposit} & primary source name $\in \mathcal{G}$ and not \textit{in\_dblp} and no linked arXiv record & \pending{PrismaExcludedESevenGenericDeposit} \\
502+core & \texttt{cs\_core} & \textit{in\_dblp} or \texttt{cs\_primary} or (\texttt{cs\_any} and linked arXiv primary category begins with \texttt{cs.}) & \PrismaCsCoreEligible{} eligible \\
503+pen. & \texttt{cs\_penumbra} & \texttt{cs\_any} and not \texttt{cs\_core} & \PrismaCsPenumbraEligibleOtherwise{} otherwise eligible \\
504+\midrule
505+--- & \texttt{eligible} & $\neg$E1 $\wedge$ $\neg$E2 $\wedge$ $\neg$E3 $\wedge$ $\neg$E4 $\wedge$ $\neg$E5 $\wedge$ $\neg$E7 $\wedge$ core & \PrismaCsCoreEligible{} \\
506+\bottomrule
507+\end{tabularx}
508+\end{table}
509+
510+Three further columns are derived in the same statement and are used
511+throughout the manuscript. The first date, \texttt{first\_date}, is the least
512+of the publication date, the merged preprint's date and the arXiv creation
513+date, except that a publication date falling on 1~January is treated as
514+year-only precision and is overridden by either of the other two when
515+available; \texttt{date\_precision} is \texttt{year} when the date falls on
516+1~January and no finer date exists, \texttt{month} otherwise; and
517+\texttt{period} is \texttt{pre}, \texttt{baseline}, \texttt{post} or
518+\texttt{future} according to whether the first date precedes $t_0$, lies in
519+$[t_0, \text{2022-11-30})$, in $[\text{2022-11-30}, t_1]$, or after $t_1$.
520+The PRISMA counts are computed twice, marginally (the column of
521+Table~\ref{tab:appB-codes}) and sequentially in the order E1, E2, E3, E4, E5,
522+E7, and the script asserts that the loaded total equals the sum of the
523+sequential exclusions and the after-exclusion count
524+(\PrismaAfterExclusions{}); the macro set of Part~III reports both. The E6 and
525+penumbra rows are not exclusions and do not enter the sum. The numbering
526+conflict between the protocol's E7 (penumbra) and the code's E7
527+(generic deposit) is resolved by amendment A-005 in favour of the code.
528+
529+\subsection{Record-linkage cascade and thresholds}
530+\label{sec:appB-linkage}
531+
532+Part~IV states the cascade in prose; Table~\ref{tab:appB-cascade} gives it as
533+executed, step by step, with every threshold. The normalised title
534+$\eta(\cdot)$ lower-cases and deletes every character outside $[a$--$z0$--$9]$;
535+``unique'' means that the normalised title occurs exactly once on that side
536+among the records still unlinked at that step (for OpenAlex in the arXiv and
537+ACL cascades, unique among all OpenAlex records, the exclusion of already
538+linked identifiers being applied to the pair instead); the length condition
539+is on the raw title for DBLP and OpenAlex and on the normalised title for
540+arXiv and ACL\@. The DBLP title step adds a first-author check that the other
541+cascades do not have: the last whitespace-separated token of the first
542+author's name on each side must coincide when both are present. Each link
543+carries its method label, which is the stratum of the precision sample of
544+Part~IV; the counts per method are in \texttt{data/metadata/linkage\_report.json}
545+and Table~\ref{tab:linkage}.
546+
547+\begin{table}[htbp]
548+\centering\footnotesize
549+\caption{The deterministic linkage cascade of \texttt{ingestion/link\_sources.py}. Steps within a cascade apply only to records unlinked by the previous steps.}
550+\label{tab:appB-cascade}
551+\begin{tabularx}{\textwidth}{>{\raggedright\arraybackslash}p{1.6cm}>{\raggedright\arraybackslash}p{1.4cm}>{\raggedright\arraybackslash}X>{\raggedright\arraybackslash}p{1.8cm}}
552+\toprule
553+Cascade & Step & Join condition and thresholds & Method label \\
554+\midrule
555+\multirow{3}{*}{DBLP--OA}
556+ & 1 & equal lower-cased DOI; all matching pairs kept (many-to-many allowed) & \texttt{doi} \\
557+ & 2 & equal arXiv identifier (DBLP: parsed from \texttt{ee} URLs by \texttt{arxiv.org/abs/([\^{} ]+)}; both sides stripped of \texttt{v[0-9]+\$}); both records unlinked & \texttt{arxiv} \\
558+ & 3 & equal $\eta$, raw title $\ge 25$ characters, $\eta$ unique on both sides, $|y_{\mathrm{DBLP}} - y_{\mathrm{OA}}| \le 1$, first-author surnames equal when both present & \texttt{title\_year} \\
559+\midrule
560+\multirow{3}{*}{arXiv--OA}
561+ & 1 & equal arXiv identifier (OpenAlex side: \texttt{ids.arxiv}, else DOI prefix \texttt{10.48550/arxiv.}, else \texttt{arxiv.org/abs|pdf/} in any location URL); all pairs kept & \texttt{arxiv\_id} \\
562+ & 2 & equal lower-cased DOI; arXiv record unlinked & \texttt{doi} \\
563+ & 3 & equal $\eta$, $|\eta| \ge 25$, unique on both sides, $|y_{\mathrm{created}} - y_{\mathrm{OA}}| \le 2$, OpenAlex record unlinked & \texttt{title\_year} \\
564+\midrule
565+\multirow{3}{*}{ACL--OA}
566+ & 1 & equal lower-cased DOI & \texttt{doi} \\
567+ & 2 & Anthology identifier equal to the segment after \texttt{aclanthology.org/} in any OpenAlex landing-page URL (with or without trailing slash); ACL record unlinked & \texttt{url} \\
568+ & 3 & equal $\eta$, $|\eta| \ge 25$, unique on both sides, $|y_{\mathrm{ACL}} - y_{\mathrm{OA}}| \le 1$, OpenAlex record unlinked & \texttt{title\_year} \\
569+\bottomrule
570+\end{tabularx}
571+\end{table}
572+
573+The record types admitted on the DBLP side are \textit{article},
574+\textit{inproceedings}, \textit{incollection}, \textit{book},
575+\textit{phdthesis} and \textit{data} with year 2018--2026; on the ACL side
576+\textit{inproceedings} and \textit{article}; on the arXiv side every record
577+of the harvest, the year condition being applied through the \texttt{created}
578+year in the title step only. The linkage runs inside one DuckDB database
579+with 24 threads and a 60~GB memory limit and completes in about ten seconds
580+on the compacted tables, which is why it was possible to rerun it after each
581+amendment rather than patch its output. The precision sample of 500 pairs
582+(250 DOI, 200 title--year, 50 arXiv, the last stratum empty for the reason
583+given in Part~IV) is drawn by \texttt{systematic\_review/linkage\_sample.py}
584+with seed 44, and its automatic agreement checks (title similarity at least
585+0.9, year difference at most one, first-author surname agreement) are the
586+interim figure until the principal investigator's review (checkpoint H-1).
587+
588+\subsection{Reproducing the acquisition}
589+\label{sec:appB-repro}
590+
591+The acquisition can be repeated from the runbook in six commands, in the
592+order of Table~\ref{tab:appB-acq}, on a machine with Python~3.12 and the
593+locked environment of \texttt{reproducibility/environment\_M3U96b.txt}:
594+\begin{enumerate}
595+ \item \texttt{openalex\_snapshot.py} with the manifest copy (then once more with \texttt{--id-list});
596+ \item \texttt{openalex\_entities.py};
597+ \item \texttt{dblp\_parse.py};
598+ \item \texttt{arxiv\_oai.py};
599+ \item \texttt{acl\_parse.py};
600+ \item \texttt{openalex\_api\_increment.py}, followed by \texttt{ingest\_api\_increment.py}.
601+\end{enumerate}
602+Two of these are not exactly repeatable and the reader should know which.
603+The OpenAlex bucket retains only recent releases, so a later reader must
604+either locate the 2026-10-14 release or accept that a newer release will
605+differ in record counts and in the nightly-recomputed fields (citation
606+counts, FWCI); the per-file digests in the ledger allow a reader with the
607+same release to prove identity, and a reader with a different release to
608+quantify the difference by record count. The arXiv OAI feed is likewise
609+live: a re-harvest of the same datestamp windows returns records as they now
610+are, and the raw pages archived with the project are the only way to recover
611+the state of 2--3~November 2026. The DBLP dump and the ACL export are dated
612+files whose hashes are published here, and a copy of each is kept with the
613+project's raw layer.
modified manuscript/appendices/appC_derivations.tex +419 −1
@@ -1 +1,419 @@
1−% appC_derivations — to be written (Phase 7) 1+% ============================================================================
2+% Appendix C — Mathematical derivations
3+% Written by Agent L (Appendices B/C instance), 2026-11-03. Derivations and
4+% proofs referenced by Part IV (sections/part04_methodology.tex); notation
5+% follows Part IV. Each derivation is checked against the implementation in
6+% econometrics/structural_change.py, bibliometrics/03_citation_impact.py,
7+% bibliometrics/04_diversity_cagr.py, knowledge_graph/02_category_flows.py,
8+% taxonomy/classify.py, taxonomy/validate_sample.py and
9+% experiments/emerging_detection.py; where the code and the usual textbook
10+% convention differ, the code's convention is stated and the difference noted.
11+% ============================================================================
12+
13+\section{Mathematical derivations}
14+\label{sec:appC}
15+
16+Part~IV defines the statistics of this study and states their properties;
17+this appendix supplies the derivations behind those statements, in the order
18+in which Part~IV uses them. Each subsection fixes the object as implemented,
19+derives the property that the main text relies on, and records any point at
20+which the implementation departs from the convention of the cited source.
21+The derivations are elementary and self-contained; their purpose is not
22+novelty but the assurance that the quantities tabulated in Part~IX are what
23+the text says they are. Throughout, $n$ is the length of a monthly series,
24+$y_t = \log(N_t + 1)$ its logarithm, and $\mathbf{1}[\cdot]$ the indicator
25+function.
26+
27+\subsection{The interrupted time series as a linear regression}
28+\label{sec:appC-its}
29+
30+\paragraph{Design matrix.}
31+Equation~\eqref{eq:its} of Part~IV is the linear model $y = X\beta +
32+\varepsilon$ with $y \in \R^n$ and $X \in \R^{n \times 15}$ whose columns
33+are, for $t = 0, \dots, n-1$ and event index $t_e$,
34+\begin{equation}
35+ x_t \;=\; \bigl(1,\; t,\; \mathbf{1}[t \ge t_e],\; (t - t_e)\,\mathbf{1}[t \ge t_e],\;
36+ \mathbf{1}[\mathrm{month}(t) = 2],\; \dots,\; \mathbf{1}[\mathrm{month}(t) = 12]\bigr)^{\top},
37+ \label{eq:appC-design}
38+\end{equation}
39+exactly the data frame built by \texttt{\_design()} in
40+\texttt{econometrics/structural\_change.py} (columns \texttt{const},
41+\texttt{t}, \texttt{post}, \texttt{t\_post}, \texttt{m2}, \dots,
42+\texttt{m12}). The post-event trend is centred at $t_e$ rather than at zero
43+so that $\beta_2$ is the level change \emph{at} the event month and not the
44+extrapolated intercept difference at $t = 0$; with an uncentred post-trend
45+the two parametrisations are related by $\beta_2^{\mathrm{unc}} = \beta_2 -
46+\beta_3 t_e$, and only the centred one has the interpretation used in the
47+text. The eleven month dummies are linearly independent of the constant
48+because January is omitted; the full-column-rank condition requires at least
49+one observation in every month of the year, satisfied by any series of
50+twelve months or more, and at least one post-event month with $t > t_e$,
51+guaranteed by the driver's rule that twelve months follow every event.
52+The ordinary least-squares estimator is $\hat\beta = (X^{\top}X)^{-1}
53+X^{\top}y$ and the residuals $\hat\varepsilon = y - X\hat\beta$.
54+
55+\paragraph{The HAC covariance estimator.}
56+Under the assumption that $\varepsilon_t$ is a stationary, serially
57+correlated and possibly heteroskedastic sequence with
58+$\E[x_t \varepsilon_t] = 0$, the asymptotic covariance of $\sqrt{n}(\hat\beta
59+- \beta)$ is $Q^{-1}\Omega Q^{-1}$ with $Q = \lim n^{-1}X^{\top}X$ and
60+$\Omega = \sum_{\ell=-\infty}^{\infty} \Gamma_\ell$, where
61+$\Gamma_\ell = \E[x_t \varepsilon_t \varepsilon_{t-\ell} x_{t-\ell}^{\top}]$
62+is the autocovariance of the score at lag $\ell$. The estimator of
63+\citet{newey1987hac} replaces the infinite sum by a kernel-weighted finite
64+one,
65+\begin{equation}
66+ \hat\Omega_L \;=\; \hat\Gamma_0 + \sum_{\ell=1}^{L} w_\ell\,\bigl(\hat\Gamma_\ell + \hat\Gamma_\ell^{\top}\bigr),
67+ \qquad
68+ \hat\Gamma_\ell = \frac{1}{n}\sum_{t=\ell}^{n-1} \hat\varepsilon_t \hat\varepsilon_{t-\ell}\, x_t x_{t-\ell}^{\top},
69+ \qquad
70+ w_\ell = 1 - \frac{\ell}{L+1},
71+ \label{eq:appC-nw}
72+\end{equation}
73+and the variance estimate is $\hat V = n\,(X^{\top}X)^{-1} \hat\Omega_L
74+(X^{\top}X)^{-1}$, which is the expression of Part~IV once the factors of
75+$n$ are absorbed into the un-normalised $\hat\Gamma_\ell$. The Bartlett
76+weights $w_\ell$ are what make $\hat\Omega_L$ positive semi-definite for every
77+sample: $\hat\Omega_L$ can be written as $\frac{1}{n(L+1)}\sum_{t}
78+\bigl(\sum_{s=t-L}^{t} \hat u_s\bigr)\bigl(\sum_{s=t-L}^{t} \hat u_s\bigr)^{\top}$
79+up to end effects, with $\hat u_s = x_s \hat\varepsilon_s$, a sum of outer
80+products, whereas the truncated sum with $w_\ell \equiv 1$ is not guaranteed
81+to be positive semi-definite. The implementation calls
82+\texttt{statsmodels} with \texttt{cov\_type="HAC"} and \texttt{maxlags=6}, so
83+$L = 6$ and $w_\ell = 1 - \ell/7$ as stated in Part~IV, without the
84+small-sample degrees-of-freedom correction and with $p$-values from the
85+normal approximation to the $t$-ratio, which is the library's default for
86+robust covariances. With $n$ of the order of one hundred and fourteen
87+regressors, the difference between the normal and the $t_{n-15}$ reference
88+distribution is immaterial at the magnitudes of the $t$-statistics reported;
89+what matters is the placebo rank of the next paragraph, which does not
90+depend on any reference distribution.
91+
92+\paragraph{The placebo $p$-value as a rank statistic.}
93+Let $\mathcal{T}' = \{t' : 24 \le t' \le n - 13\}$ be the candidate event
94+indices (the implementation's \texttt{min\_pre = 24} and
95+\texttt{min\_post = 12}) and, for each $t' \in \mathcal{T}'$, let
96+$t^{(2)}_{t'} = \hat\beta_2(t') / \widehat{\mathrm{se}}(\hat\beta_2(t'))$ be
97+the HAC $t$-ratio of the level change when the model
98+\eqref{eq:appC-design} is fitted with $t_e = t'$. The placebo value of the
99+true event $t_e \in \mathcal{T}'$ is
100+\begin{equation}
101+ p^{\mathrm{plac}} \;=\; \frac{1}{|\mathcal{T}'|}\sum_{t' \in \mathcal{T}'}
102+ \mathbf{1}\bigl[\,|t^{(2)}_{t'}| \ge |t^{(2)}_{t_e}|\,\bigr]
103+ \;=\; \frac{\mathrm{rank}\bigl(|t^{(2)}_{t_e}|\bigr)}{|\mathcal{T}'|},
104+\end{equation}
105+where $\mathrm{rank}$ is the descending rank of the true event's absolute
106+$t$-ratio among the $|\mathcal{T}'|$ values, ties counted as not better
107+(\texttt{>=}). Three properties follow directly. Because $t_e \in
108+\mathcal{T}'$, the sum contains the term $t' = t_e$, so $p^{\mathrm{plac}}
109+\ge 1/|\mathcal{T}'|$, which for the default window ($n = 101$, hence
110+$|\mathcal{T}'| = 65$) is about $0.015$: a placebo rank cannot be smaller,
111+however large the true statistic, and a reported value of $1/|\mathcal{T}'|$
112+means ``largest of all candidate dates'', not ``significant at that level''.
113+Because the statistic is a rank, it is invariant to any monotone
114+transformation of the $|t|$-ratios and in particular does not depend on the
115+HAC bandwidth through anything but the ordering it induces. And if the
116+candidate dates were exchangeable under a null hypothesis of no break
117+anywhere, $p^{\mathrm{plac}}$ would be a valid permutation-type $p$-value
118+with $P(p^{\mathrm{plac}} \le \alpha) \le \alpha$; they are not exchangeable,
119+since all $|\mathcal{T}'|$ regressions share the same $n$ observations and
120+adjacent candidates give nearly identical fits, so the value is reported as
121+a rank and read as such. The same construction gives the placebo rank of
122+the slope change from $t^{(3)}_{t'}$. The driver additionally computes the
123+rank restricted to the baseline candidates $\{t' < t_e\}$, which answers the
124+protocol's original question (is the reference date special relative to the
125+pre-period?) and is reported next to the full-range rank.
126+
127+\subsection{Bai--Perron multiple breaks by dynamic programming}
128+\label{sec:appC-bp}
129+
130+\paragraph{Segment costs and additivity.}
131+For a segment $[i, j)$ of the series with $j - i \ge h$, define
132+\begin{equation}
133+ S(i, j) \;=\; \min_{a, b \in \R}\ \sum_{t=i}^{j-1} (y_t - a - b\,t)^2,
134+ \label{eq:appC-segcost}
135+\end{equation}
136+the residual sum of squares of a linear trend fitted to the segment alone
137+(the implementation solves the two-parameter least-squares problem for each
138+segment with \texttt{numpy.linalg.lstsq}; with \texttt{trend=False} the
139+regressor $t$ is dropped and $S(i,j)$ is the centred sum of squares). The
140+model with $m$ breaks $0 < \tau_1 < \dots < \tau_m < n$ assigns its own
141+$(a, b)$ to each of the $m+1$ segments $[\tau_{k-1}, \tau_k)$ with
142+$\tau_0 = 0$ and $\tau_{m+1} = n$. Because the parameters of different
143+segments are distinct and each observation enters exactly one segment, the
144+residual sum of squares of the whole model separates,
145+\begin{equation}
146+ \mathrm{SSR}(\tau_1, \dots, \tau_m) \;=\; \sum_{k=1}^{m+1} S(\tau_{k-1}, \tau_k),
147+ \label{eq:appC-additive}
148+\end{equation}
149+and the global minimisation over $\tau$ decomposes: the optimal partition of
150+the first $j$ observations into $m+1$ segments contains, as its first $m$
151+segments, an optimal partition of the first $\tau_m$ observations into $m$
152+segments. This is the principle of optimality, and it is the only property of
153+the cost that the dynamic programme uses; it holds for any cost that is a
154+sum over segments of a function of the segment alone, which is why the same
155+recursion serves the piecewise-constant model of Section~\ref{sec:appC-pelt}.
156+It fails for a model with parameters shared across segments (a common slope,
157+or the seasonal dummies of the ITS), which is why the segmented regression
158+carries no seasonal terms and the series is seasonally adjusted beforehand
159+by subtracting the baseline-period month means
160+(\texttt{run\_structural\_change.py}).
161+
162+\paragraph{The recursion.}
163+Let $C_m(j)$ be the minimum of \eqref{eq:appC-additive} over partitions of
164+observations $0, \dots, j-1$ into $m+1$ admissible segments. Then
165+\begin{equation}
166+ C_0(j) = S(0, j), \qquad
167+ C_m(j) = \min_{\,mh \le i \le j-h} \bigl\{ C_{m-1}(i) + S(i, j) \bigr\},
168+ \qquad j \ge (m+1)h,
169+ \label{eq:appC-dp}
170+\end{equation}
171+the lower limit of $i$ ensuring that $m$ segments of length at least $h$
172+fit before the last break and the upper limit that the last segment has
173+length at least $h$. The argument minimiser $i^{\ast}_m(j)$ is stored, and
174+the breaks of the $m$-break solution for the full series are recovered
175+backward: $\tau_m = i^{\ast}_m(n)$, $\tau_{m-1} = i^{\ast}_{m-1}(\tau_m)$,
176+and so on, which is what the dictionary \texttt{B[m][j]} of the
177+implementation accumulates forward instead. This is the dynamic programme
178+that \citet{bai2003computation} propose for the global minimiser of
179+\citet{bai1998breaks}; the earlier literature used it for the
180+piecewise-constant case, and its correctness requires nothing beyond
181+\eqref{eq:appC-additive} and the induction on $m$: if $C_{m-1}(i)$ is the
182+true minimum for every $i$, then any partition of $[0, j)$ into $m+1$
183+segments has a last segment $[i, j)$ and a prefix partition of cost at least
184+$C_{m-1}(i)$, so its cost is at least the right-hand side of
185+\eqref{eq:appC-dp}, which is attained.
186+
187+\paragraph{Complexity.}
188+The table of segment costs has one entry per admissible pair $(i, j)$, that
189+is $\binom{n-h+1}{2} + O(n)$ entries, of order $n^2/2$. The recursion
190+\eqref{eq:appC-dp} evaluates, for each $m \le M$ and each $j$, a minimum over
191+at most $n$ candidates, so its cost is $O(n^2 M)$ operations; the
192+back-tracking costs $O(M)$. The implementation fills the cost table by
193+solving each segment's least-squares problem independently, at a cost
194+proportional to the segment length, so the table costs $O(n^3)$ rather than
195+the $O(n^2)$ obtainable by updating running sums as in
196+\citet{bai2003computation}; for $n$ of the order of one hundred, as here,
197+the difference is a fraction of a second and the simpler code was preferred
198+for its transparency. Trimming enters only through the admissibility
199+condition $j - i \ge h$; with $h = \max\{8, \lfloor 0.15\,n \rfloor\}$ and
200+$M = 3$, the default window of $n = 101$ months gives $h = 15$ and a
201+feasible region $(m+1)h \le n$ for every $m \le 3$, so all four candidate
202+models exist.
203+
204+\paragraph{Information criteria as implemented.}
205+For $m = 0, \dots, M$ let $\mathrm{SSR}_m = C_m(n)$ and let $p_m = k(m+1) +
206+m$ be the parameter count, with $k = 2$ for the trend model ($k = 1$ for the
207+mean model): one intercept and one slope per segment, plus the $m$ break
208+positions, counted as parameters by convention. The two criteria computed by
209+the code are
210+\begin{align}
211+ \mathrm{BIC}(m) &= n \log\frac{\mathrm{SSR}_m}{n} + p_m \log n, \label{eq:appC-bic}\\
212+ \mathrm{LWZ}(m) &= n \log\frac{\mathrm{SSR}_m}{n - p_m} + p_m\, c_0\, (\log n)^{2.1}, \qquad c_0 = 0.299, \label{eq:appC-lwz}
213+\end{align}
214+and the selected number of breaks is $\hat m = \arg\min_m$ of each. The BIC
215+form \eqref{eq:appC-bic} is the Gaussian log-likelihood, maximised over the
216+error variance, in which $-2\log\hat L = n\log(\mathrm{SSR}/n) + \text{const}$,
217+plus the Schwarz penalty $p \log n$ \citep{schwarz1978bic}; the two
218+differences from a textbook BIC are that the break positions are counted
219+among the parameters and that the constant and the segment variances are
220+treated as common, both as in \citet{bai2003computation}. The LWZ form
221+\eqref{eq:appC-lwz} is the modified Schwarz criterion of
222+\citet{liu1997segmented}, whose penalty grows as $(\log n)^{2+\delta_0}$ with
223+$\delta_0 = 0.1$ and whose variance estimate divides by $n - p_m$; the
224+constant $c_0 = 0.299$ is the value they recommend and the one used in the
225+simulations of \citet{bai2003computation}, which find that LWZ selects fewer
226+spurious breaks than BIC under serial correlation at the cost of some
227+power. The comparison across $m$ is legitimate because every $\mathrm{SSR}_m$
228+is a global minimum over the same observations and the same admissible
229+region; a sequential procedure that fixed earlier breaks before adding the
230+next would not have this property and would need the sup-$F$ machinery that
231+is not implemented. Neither criterion yields a confidence set for the break
232+dates; the text reports the agreement of the two selections and the
233+sensitivity to the truncation month instead.
234+
235+\subsection{PELT: cost, penalty and pruning}
236+\label{sec:appC-pelt}
237+
238+\paragraph{Objective.}
239+With the $\ell_2$ cost $\mathcal{C}(y_{i:j}) = \sum_{t=i}^{j-1} (y_t -
240+\bar y_{i:j})^2$ for a segment $[i,j)$ and a penalty $\lambda > 0$ per
241+changepoint, the problem of equation~\eqref{eq:pelt} of Part~IV is
242+\begin{equation}
243+ F(n) \;=\; \min_{m,\ \tau_1 < \dots < \tau_m}\ \Bigl\{ \sum_{k=1}^{m+1} \mathcal{C}(y_{\tau_{k-1}:\tau_k}) + \lambda m \Bigr\},
244+ \label{eq:appC-peltobj}
245+\end{equation}
246+and, by the same additivity argument as in Section~\ref{sec:appC-bp}, it
247+satisfies the optimal-partitioning recursion of \citet{jackson2005optimal},
248+\begin{equation}
249+ F(0) = -\lambda, \qquad F(j) \;=\; \min_{0 \le i < j}\ \bigl\{ F(i) + \mathcal{C}(y_{i:j}) + \lambda \bigr\},
250+ \label{eq:appC-op}
251+\end{equation}
252+where the number of breaks is not fixed in advance but chosen by the
253+penalty; the convention $F(0) = -\lambda$ cancels the penalty charged to the
254+first segment. Solving \eqref{eq:appC-op} for all $j$ costs $O(n^2)$ cost
255+evaluations.
256+
257+\paragraph{The pruning condition.}
258+\citet{killick2012pelt} observe that if there exists a constant $K$ such that
259+for all $i < j < l$
260+\begin{equation}
261+ \mathcal{C}(y_{i:j}) + \mathcal{C}(y_{j:l}) + K \;\le\; \mathcal{C}(y_{i:l}),
262+ \label{eq:appC-Kcond}
263+\end{equation}
264+then any candidate $i$ for which
265+\begin{equation}
266+ F(i) + \mathcal{C}(y_{i:j}) + K \;\ge\; F(j)
267+ \label{eq:appC-prune}
268+\end{equation}
269+can never be the last changepoint before any later $l > j$ and may be
270+discarded from the candidate set. The proof is two lines. For $l > j$, by
271+\eqref{eq:appC-Kcond} and \eqref{eq:appC-prune},
272+$F(i) + \mathcal{C}(y_{i:l}) + \lambda \ge F(i) + \mathcal{C}(y_{i:j}) +
273+\mathcal{C}(y_{j:l}) + K + \lambda \ge F(j) + \mathcal{C}(y_{j:l}) +
274+\lambda$, so the partition that places a changepoint at $j$ after the
275+optimal prefix of $[0,j)$ is at least as good as any that ends its last
276+segment at $i$; hence $i$ never needs to be examined again. For the
277+$\ell_2$ cost, \eqref{eq:appC-Kcond} holds with $K = 0$, because adding a
278+split point to a segment can only reduce its residual sum of squares (the
279+split model nests the unsplit one). The recursion with pruning examines, at
280+each $j$, only the candidates not yet discarded; under the regularity
281+conditions of \citeauthor{killick2012pelt} (changepoints whose number grows
282+linearly with $n$) the expected number of surviving candidates is bounded and
283+the total cost is linear in $n$, whence the name. For a short series with
284+few changes, as here, the pruning saves little and the method is simply an
285+exact solution of \eqref{eq:appC-peltobj}; the point of using it is
286+exactness at a given penalty, not speed. The implementation
287+(\texttt{ruptures.Pelt}, \citealp{truong2020ruptures}) is called with
288+\texttt{model="l2"}, \texttt{min\_size=6} and \texttt{jump=1}, the last two
289+restricting segments to at least six months and allowing a changepoint at
290+every index; the library returns the segment end points including $n$, which
291+the wrapper drops.
292+
293+\paragraph{The penalty $2\sigma^2 \log n$.}
294+Suppose the observations are independent Gaussian with piecewise-constant
295+mean and a common variance $\sigma^2$. Twice the negative log-likelihood of
296+a partition, up to a constant, is $\sigma^{-2}\sum_k \mathcal{C}(y_{\tau_{k-1}:\tau_k})$.
297+Each additional changepoint adds two parameters, a segment mean and a
298+position, so the Schwarz criterion in this scale adds $2\log n$ per
299+changepoint. Multiplying through by $\sigma^2$ to express the criterion in
300+the units of the cost gives
301+\begin{equation}
302+ \sum_k \mathcal{C}(y_{\tau_{k-1}:\tau_k}) + 2\sigma^2 \log n \cdot m,
303+\end{equation}
304+which is \eqref{eq:appC-peltobj} with $\lambda = 2\sigma^2\log n$. The
305+implementation replaces $\sigma^2$ by the sample variance of the whole
306+series, $\widehat{\mathrm{Var}}(y) = n^{-1}\sum_t (y_t - \bar y)^2$
307+(\texttt{numpy.var}, population form). This is the conservative choice
308+discussed in Part~IV: in a series with a trend or with genuine level
309+shifts, the overall variance exceeds the within-segment variance, so the
310+penalty is larger than the within-segment Schwarz penalty and fewer
311+changepoints are declared. \citet{yao1988schwarz} proves that the Schwarz
312+criterion, with a known or consistently estimated $\sigma^2$, selects the
313+true number of changes with probability tending to one in the
314+piecewise-constant Gaussian model; the result does not extend to a series
315+whose mean is a trend, for which a piecewise-constant fit must spend
316+changepoints to track the slope, and the PELT dates of this study are read
317+with that in mind.
318+
319+\subsection{Bayesian online changepoint detection}
320+\label{sec:appC-bocpd}
321+
322+\paragraph{Conjugate updates.}
323+Within a run the observations are modelled as
324+$y \mid \mu, \sigma^2 \sim \mathcal{N}(\mu, \sigma^2)$ with the
325+Normal--Inverse-Gamma prior
326+$\mu \mid \sigma^2 \sim \mathcal{N}(\mu_0, \sigma^2/\kappa_0)$,
327+$\sigma^2 \sim \mathrm{IG}(\alpha_0, \beta_0)$, whose joint density is
328+proportional to
329+\begin{equation}
330+ (\sigma^2)^{-\alpha_0 - 3/2} \exp\Bigl\{ -\frac{\beta_0}{\sigma^2} - \frac{\kappa_0 (\mu - \mu_0)^2}{2\sigma^2} \Bigr\}.
331+\end{equation}
332+Multiplying by the likelihood of one observation $y$, proportional to
333+$(\sigma^2)^{-1/2}\exp\{-(y-\mu)^2/(2\sigma^2)\}$, and completing the square
334+in $\mu$,
335+\begin{equation}
336+ \kappa_0 (\mu - \mu_0)^2 + (y - \mu)^2
337+ \;=\; (\kappa_0 + 1)\Bigl(\mu - \frac{\kappa_0\mu_0 + y}{\kappa_0 + 1}\Bigr)^2 + \frac{\kappa_0 (y - \mu_0)^2}{\kappa_0 + 1},
338+\end{equation}
339+shows that the posterior is again Normal--Inverse-Gamma with
340+\begin{equation}
341+ \mu_1 = \frac{\kappa_0 \mu_0 + y}{\kappa_0 + 1}, \quad
342+ \kappa_1 = \kappa_0 + 1, \quad
343+ \alpha_1 = \alpha_0 + \tfrac12, \quad
344+ \beta_1 = \beta_0 + \frac{\kappa_0 (y - \mu_0)^2}{2(\kappa_0 + 1)},
345+ \label{eq:appC-nigupdate}
346+\end{equation}
347+which are the four one-step updates of the implementation
348+(\texttt{mu\_new}, \texttt{kappa\_new}, \texttt{alpha\_new},
349+\texttt{beta\_new}). Applying \eqref{eq:appC-nigupdate} $r$ times and
350+collecting terms gives the batch form quoted in Part~IV, with
351+$\kappa_r = \kappa_0 + r$, $\mu_r = (\kappa_0\mu_0 + r\bar y)/\kappa_r$,
352+$\alpha_r = \alpha_0 + r/2$ and
353+$\beta_r = \beta_0 + \tfrac12\sum_{i \le r}(y_i - \bar y)^2 + \kappa_0 r (\bar y - \mu_0)^2 / (2\kappa_r)$;
354+the equality of the two forms is a matter of algebra (induction on $r$) and
355+is the reason the online recursion can be trusted to reproduce the batch
356+posterior.
357+
358+\paragraph{Student-$t$ predictive.}
359+The predictive density of the next observation integrates the Gaussian
360+likelihood against the current Normal--Inverse-Gamma posterior. Integrating
361+$\mu$ first gives $y \mid \sigma^2 \sim \mathcal{N}(\mu_r, \sigma^2 (1 +
362+1/\kappa_r))$; integrating $\sigma^2 \sim \mathrm{IG}(\alpha_r, \beta_r)$
363+against this scale mixture of normals gives
364+\begin{equation}
365+ p(y \mid r) \;=\; \int \mathcal{N}\Bigl(y;\ \mu_r,\ \sigma^2\frac{\kappa_r + 1}{\kappa_r}\Bigr)\,\mathrm{IG}(\sigma^2; \alpha_r, \beta_r)\, d\sigma^2
366+ \;=\; t_{2\alpha_r}\Bigl( y;\ \mu_r,\ \frac{\beta_r(\kappa_r + 1)}{\alpha_r \kappa_r} \Bigr),
367+ \label{eq:appC-student}
368+\end{equation}
369+a Student-$t$ density with $2\alpha_r$ degrees of freedom, location $\mu_r$
370+and squared scale $\beta_r(\kappa_r+1)/(\alpha_r\kappa_r)$: the standard
371+result that a normal with inverse-gamma mixing on the variance is a
372+$t$ with degrees of freedom twice the shape and scale equal to the
373+rate over the shape times the normal's variance factor. The code evaluates
374+\eqref{eq:appC-student} through \texttt{scipy.stats.t.pdf} with
375+\texttt{df = 2*alpha} and \texttt{scale = sqrt(beta*(kappa+1)/(alpha*kappa))},
376+vectorised over the run lengths.
377+
378+\paragraph{Run-length recursion and the mass on $r = 0$.}
379+Let $R_t(r) = P(r_t = r \mid y_{1:t})$ be the filtered run-length posterior
380+after $t$ observations, with $R_0(0) = 1$, and let $\pi_t(r) = p(y_{t+1} \mid
381+r_t = r, y_{1:t})$ be the predictive \eqref{eq:appC-student} evaluated with
382+the hyperparameters of the run of length $r$ ending at $t$. With a constant
383+hazard $H$ (a geometric prior on run lengths), the joint recursion of
384+\citet{adams2007bocpd} is, for the growth and the change moves,
385+\begin{equation}
386+ \tilde R_{t+1}(r+1) = R_t(r)\,\pi_t(r)\,(1 - H), \qquad
387+ \tilde R_{t+1}(0) = \sum_{r=0}^{t} R_t(r)\,\pi_t(r)\, H,
388+ \label{eq:appC-rl}
389+\end{equation}
390+followed by normalisation, $R_{t+1}(r) = \tilde R_{t+1}(r) / \sum_{r'}
391+\tilde R_{t+1}(r')$. Write $Z_t = \sum_{r} R_t(r)\pi_t(r)$ for the marginal
392+predictive likelihood of $y_{t+1}$. Then $\sum_{r \ge 1}\tilde R_{t+1}(r) =
393+(1-H) Z_t$ and $\tilde R_{t+1}(0) = H Z_t$, so the normaliser is $Z_t$ and
394+\begin{equation}
395+ R_{t+1}(0) \;=\; \frac{H Z_t}{H Z_t + (1-H) Z_t} \;=\; H \qquad \text{for every } t .
396+ \label{eq:appC-r0}
397+\end{equation}
398+The filtered probability that a changepoint occurs \emph{at} the current
399+step therefore equals the prior hazard identically, whatever the data: the
400+run-length posterior carries information about where the last change was
401+only through the relative masses at $r \ge 1$, which are reweighted by the
402+predictive likelihoods, and not through the mass at $r = 0$, which the
403+constant hazard fixes. This is why the detection statistics of Part~IV are
404+not $R_t(0)$. The first, $P(r_t \le 3 \mid y_{1:t}) = \sum_{r=0}^{3} R_t(r)$,
405+is $H$ plus the mass on runs of length one to three, that is, on changes
406+that occurred one to three months earlier and have since accumulated
407+evidence; its value exceeds $H$ only when the recent observations are
408+better explained by a fresh run than by the continuation of the old one. The
409+second is the maximum-a-posteriori run length $\hat r_t = \arg\max_r R_t(r)$,
410+whose resets from a value above twelve to a value at most two are the
411+online detector's changepoints. The implementation keeps the full
412+$(n+1)\times(n+1)$ matrix $R$, adds $10^{-300}$ to the normaliser against
413+underflow, and initialises $\mu_0$ and $\beta_0$ from the first six
414+observations with $\kappa_0 = \alpha_0 = 1$; the prior mean run length
415+$1/H = 60$ months is the only tuning constant. The recursion is the filtered
416+one; the smoothed posterior of \citet{fearnhead2006exact} would require a
417+backward pass and answers the retrospective question that the offline
418+methods of Sections~\ref{sec:appC-bp} and~\ref{sec:appC-pelt} already
419+address.
modified manuscript/appendices/appE_data_dictionary.tex +814 −1
Large diff (815 lines) is not loaded by default to keep the page fast.Load diff
modified manuscript/appendices/appH_reproducibility.tex +315 −1
Large diff (316 lines) is not loaded by default to keep the page fast.Load diff
modified manuscript/merge_bibs.py +1 −1
Large diff (8 lines) is not loaded by default to keep the page fast.Load diff
added manuscript/references_appAEH.bib +5 −0
Large diff (5 lines) is not loaded by default to keep the page fast.Load diff
added manuscript/references_appBC.bib +59 −0
Large diff (59 lines) is not loaded by default to keep the page fast.Load diff
added manuscript/references_verification_appAEH.csv +6 −0
Large diff (6 lines) is not loaded by default to keep the page fast.Load diff
added manuscript/references_verification_appBC.csv +6 −0
Large diff (7 lines) is not loaded by default to keep the page fast.Load diff
Menu

Theme