"Pricing Risk at a Boundary" Romain Fillon
This package recomputes every number, figure and table of the paper from its inputs, with one
command (bash run_all.sh). The manuscript itself is not part of this repository: values.tex
(written as 02_output/values/values_generated.tex), the table files (02_output/tables/) and
the figures (02_output/figures/) are its inputs, and the run writes them all.
The paper prices the risk of crossing a climate tipping threshold. The code solves the pricing problem numerically (boundary-value problems and closed forms), calibrates it to three climate elements by Monte Carlo over the published ranges of their inputs, estimates the recovery rate of the Atlantic overturning circulation (AMOC) from an observed sea-surface temperature record, and measures by simulation what that record can and cannot establish.
The paper displays 5 figures and 4 tables. Numbers are as LaTeX prints them; labels are those of the manuscript, as listed in 02_output/paper_manifest.json.
| Exhibit | Label | File | Produced by | Inputs |
|---|---|---|---|---|
| Figure 1 | fig:two_boundaries |
02_output/figures/fig_intro_two_boundaries.pdf |
01_code/03_figures/fig_intro_two_boundaries.py |
no data (closed forms) |
| Figure 2 | fig:record_power |
02_output/figures/fig_record_power.pdf |
01_code/03_figures/fig_record_power.py |
record-study outputs (the study reads the AMOC series) |
| Figure 3 | fig:bifurcation_intro |
02_output/figures/fig_bifurcation_intro.pdf |
01_code/03_figures/fig_bifurcation_intro.py |
no data (closed forms) |
| Table 1 | tab:geometries |
typed in the manuscript | — | no computed number |
| Figure 4 | fig:crossover |
02_output/figures/fig_crossover.pdf |
01_code/03_figures/fig_crossover.py |
AMOC series, via the recovery-rate estimate |
| Table 2 | tab:disagreements |
02_output/tables/disagreements.tex |
01_code/04_tables_values/make_tables_values.py |
cells are macros of values.tex; some cells need the AMOC series |
| Figure 5 | fig:forest_tc |
02_output/figures/fig_forest_tc.pdf |
01_code/03_figures/fig_forest_tc.py |
RCMIP emission paths; literature constants |
| Table 3 | tab:eps_dyn |
02_output/tables/eps_dyn.tex |
01_code/04_tables_values/make_tables_values.py |
cells are macros of values.tex; some cells need the AMOC series |
| Table 4 | tab:inputs |
typed in the manuscript | — | 26 macros of values.tex |
Every number the text quotes is a macro of values.tex (242 macros), written as 02_output/values/values_generated.tex by 01_code/04_tables_values/make_tables_values.py from 02_output/computed.json (the printed results of the scripts, collected by collect_computed.py) and from 01_code/inputs_literature.py (the sourced constants). Each macro carries, as a comment on its own line, the script and the inputs it came from; section 3 groups them by script.
The generated sections of this README (between <!-- BEGIN GENERATED ... --> markers) are
written by 01_code/04_tables_values/make_inventory.py at every run, from what the paper
displays (02_output/paper_manifest.json, see section 3) and the run's outputs; a hand edit
there is overwritten by the next run.
The author has legitimate access to and permission to use all the data used in this manuscript. The one dataset whose host publishes no licence (the AMOC series below) is not redistributed; the package contains a script that downloads it from its publisher. The one third-party dataset that is redistributed (the RCMIP extract) is redistributed under its own licence, CC BY-SA 4.0.
| Data | Source and citation | Licence | In the package | Read by |
|---|---|---|---|---|
| AMOC SST fingerprint: subpolar-gyre sea-surface temperature index, annual, 1871–2016 | Caesar, L., S. Rahmstorf, A. Robinson, G. Feulner and V. Saba (2018), "Observed fingerprint of a weakening Atlantic Ocean overturning circulation", Nature 556, 191–196, doi:10.1038/s41586-018-0006-5; file served by the Potsdam Institute for Climate Impact Research (PIK). Derived by those authors from HadISST: Rayner, N. A., et al. (2003), J. Geophys. Res. 108(D14), 4407, doi:10.1029/2002JD002670 | None published by the host | No. Downloaded once, before the run, by 00_data/amoc/fetch_pik_sg_index.py |
01_code/01_calibration/ews_calibration.py; 01_code/05_record_study/identification.py |
| CO2 emission paths SSP2-4.5 and SSP3-7.0, 2010–2500 | Nicholls, Z. and J. Lewis (2021), Reduced Complexity Model Intercomparison Project (RCMIP) protocol v5.1.0, Zenodo, doi:10.5281/zenodo.4589756; Nicholls, Z. R. J., et al. (2020), Geosci. Model Dev. 13, 5175–5190, doi:10.5194/gmd-13-5175-2020; scenarios and extensions of Meinshausen, M., et al. (2020), Geosci. Model Dev. 13, 3571–3605, doi:10.5194/gmd-13-3571-2020 | CC BY-SA 4.0 | Yes, a two-row extract, 00_data/emissions/rcmip_co2_world_ssp245_ssp370.csv, with its checksums and the script that rebuilds it from the published file (extract_rcmip.py) |
01_code/01_calibration/emission_paths.py |
| Outputs of the record-detectability study (eight JSON files) | This paper: written by the scripts of 01_code/05_record_study/ |
Same as the code | Yes, 00_data/record_study/; recomputed by the default run, or reused with RECORD_STUDY=cached |
01_code/01_calibration/record_detectability.py (through 02_output/record_study/) |
| Values taken from publications | See the table below | — | Yes, as constants with their citations in 01_code/inputs_literature.py |
the calibration scripts |
The series is the file
https://www.pik-potsdam.de/~caesar/AMOC_slowdown/sg_index_hadisst.txt
of 1 638 bytes: one header line (# for the years 1871-2016 in K) and 146 annual values. The
host page publishes no licence, copyright notice or conditions of use, so the package does
not redistribute the file. A replicator downloads it once, before the run:
python3 00_data/amoc/fetch_pik_sg_index.py
The script writes the bytes unchanged to 00_data/amoc/sg_index_hadisst.txt and refuses them
unless their md5 is the one the paper was computed on, c48516162322edebaaf113b2841f93be
(recorded in 00_data/amoc/PROVENANCE.md). The scripts that read the file check the md5 again
and stop with an explicit message if the file is missing or different. This download is the
package's only external dependency.
If the URL stops resolving, the index can be rebuilt from HadISST with the subpolar-gyre region
definition of Caesar et al. (2018). That reconstruction is not part of the package; a rebuilt
series will have a different md5, and should match the summary statistics
ews_calibration.py prints for the series itself: 146 values, variance of the detrended annual
means 0.0683 K², lag-one autocorrelation 0.6106.
36 of the 199 computed macros in values.tex carry [requires network], alongside 43 sourced literature constants (242 macros in the file).
Those macros cannot be recomputed without the series. In the default mode the record study also
needs it (identification.py, then calib82.py); with RECORD_STUDY=cached the study's shipped
outputs are used instead, and the \rec* macros are recomputed from them without the series.
00_data/emissions/rcmip_co2_world_ssp245_ssp370.csv is an adaptation (two rows,
Emissions|CO2, World, scenarios ssp245 and ssp370, values unchanged) of
rcmip-emissions-annual-means-v5-1-0.csv from the RCMIP protocol v5.1.0 by Zebedee Nicholls and
Jared Lewis (doi:10.5281/zenodo.4589756), licensed under the Creative Commons
Attribution-ShareAlike 4.0 International licence
(https://creativecommons.org/licenses/by-sa/4.0/). The extract remains under CC BY-SA 4.0,
and is not covered by the licence of the code. The published file (48 MB) is not shipped;
00_data/emissions/extract_rcmip.py rebuilds the extract from it and checks its md5. Details
in 00_data/emissions/PROVENANCE.md.
Every such value is a constant of 01_code/inputs_literature.py, with its citation and, where
the source has one, the table or section it is read from. The table below groups them by source;
the citation strings in that file are the reference.
| Source | Values | Where in the source |
|---|---|---|
| Armstrong McKay, D. I., et al. (2022), "Exceeding 1.5°C global warming could trigger multiple climate tipping points", Science 377, eabn7950, doi:10.1126/science.abn7950 | Thresholds ΔT* (central, low and high ends) and timescales T (central and range) of the AMOC, the Amazon and the West Antarctic ice sheet | Table 1 |
| IPCC (2021), Climate Change 2021: The Physical Science Basis, Working Group I contribution to the Sixth Assessment Report, Cambridge University Press, doi:10.1017/9781009157896 | Transient climate response to cumulative CO2 emissions (TCRE): central 0.45, likely range 0.27–0.63 °C per 1000 GtCO2 | Summary for Policymakers, D.1.1 |
| Forster, P. M., et al. (2024), "Indicators of Global Climate Change 2023", Earth Syst. Sci. Data 16, 2625–2658 | Observed warming above pre-industrial, 2014–2023 average, 1.19 [1.06 to 1.30] °C, rounded to 1.2 | as cited in inputs_literature.py |
| Friedlingstein, P., et al. (2023), "Global Carbon Budget 2023", Earth Syst. Sci. Data 15, 5301–5369 | Present global CO2 emissions, fossil and land use, about 40 GtCO2 per year | as cited in inputs_literature.py |
| Dietz, S., J. Rising, T. Stoerk and G. Wagner (2021), "Economic impacts of tipping points in the climate system", PNAS 118(34), e2103081118 | Baseline SCC and the increase due to tipping points (Amazon, all elements) | Table 2 |
| Hill, E. A., et al. (2023), The Cryosphere 17, 3739–3759, doi:10.5194/tc-17-3739-2023 | Relaxation time of the West Antarctic ice sheet's grounding-line flux, 10 to 20 years | Section 4.1 |
| Boulton, C. A., T. M. Lenton and N. Boers (2022), Nature Climate Change 12, 271–278 | Recovery time of the Amazon vegetation index | Methods |
| Fuss, S., et al. (2018), Environ. Res. Lett. 13, 063002 | Costs of direct air capture (backstop range) | as cited in inputs_literature.py |
| Howard, P. H. and T. Sterner (2017), Environ. Resource Econ. 68(1), 197–225 | Ratio of their SCC to DICE-2013R | Abstract |
| Hambel, C., F. van der Ploeg and T. van den Bremer, replication package, Zenodo 20075290 | Calibration constants of their tipping model, read from the printed output of their code (no code of theirs is included here) | Code_Parameters.m, Code_Initiation.m, as printed by MakeTable1.m |
Constants marked "modelling choice" in inputs_literature.py (the discount rate, prior widths,
the number of Monte-Carlo draws) are the author's and are stated there.
- Python 3.14.3 (CPython, 64-bit).
- The complete environment, with every package at its exact version, is
requirements-lock.txt(14 packages). Use it to reproduce the outputs.01_code/requirements.txtlists only the four direct dependencies (numpy 2.4.4, scipy 1.17.1, matplotlib 3.10.8, pandas 3.0.1), at the same versions. - Bash, to run
run_all.sh. On Windows, Git Bash. - No LaTeX. Step 5/5 compiles the manuscript only when a
manuscript/directory sits next to the package, which is not the case in this repository; the step is skipped and says so.
- Windows 11 Pro, Git Bash, Python 3.14.3 (the author's machine, and a fresh clone in a
fresh virtual environment built from
requirements-lock.txt).
No other system has been tested. Nothing in the code is specific to Windows; on Linux and macOS
run_all.sh calls python3 by default.
Intel Core i7-1165G7 (4 cores, 8 threads, 2.8 GHz), 32 GB of RAM. The record study uses 6 worker processes. Disk: about 60 MB for the package and its outputs.
Measured on the hardware below, from a fresh clone, wall clock of run_all.sh:
| Mode | Command | Runtime |
|---|---|---|
| Full recomputation (default) | bash run_all.sh |
1 h 25 min to 2 h 11 min (5,114 s and 7,854 s, two runs) |
| Record study reused | RECORD_STUDY=cached bash run_all.sh |
9 min (549 s) |
The record study accounts for almost all of the difference: its eight scripts took 4,622 s and
7,239 s in the two full runs (puissance.py 1,292–2,200 s, mle_ditlevsen.py 822–1,413 s,
calib82.py 791–1,254 s, identification.py 572–1,169 s, horizon_np.py 649–705 s,
horizon_attente.py about 460 s, the other two under 30 s each). The longest script outside it
is noise_reversal_frontier.py (7 to 8 min). The faster full run is the clean-room run, in a
fresh virtual environment built from requirements-lock.txt, with nothing else running.
The two modes write the same values.tex, the same computed.json and the same tables, byte
for byte; run_all.sh prints its per-step wall clock at the end.
run_all.sh is the single entry point. It runs, in order:
- Step 1/5, generators. Every script that produces a number, a figure or a study output is
run once, and its standard output is captured in
02_output/values/raw_runs/<key>.out. In dependency order: the closed-form figures; the Monte-Carlo calibration (calibration_ci.py,eps_inf_ci.py,fig_forest_tc.py); the ceiling (bhp_bound.py); the record study (01_code/05_record_study/, eight scripts, or a copy of their shipped outputs withRECORD_STUDY=cached) and its reader (record_detectability.py,fig_record_power.py);crossover.py; the AMOC recovery rate (ews_calibration.py) and the four scripts that read it (reduced_form_scc.py,noise_reversal_frontier.py,fig_crossover.py,moving_budget.py); the numerical validation (validation_bvp.py). - Step 2/5.
collect_computed.pyparses the captured outputs into02_output/computed.json. It runs nothing; a missing capture stops it. - Step 3/5.
make_tables_values.pywritesvalues.tex(as02_output/values/values_generated.tex), the two table files (02_output/tables/) and02_output/values/VALUES_DIFF.md(a per-macro comparison with the previousvalues.tex);make_inventory.pywrites the generated sections of this README. - Step 4/5.
check_exhibits.pychecks that every file the paper includes exists and was written by this run. - Step 5/5. Compiles the manuscript, when it is present (see below); skipped otherwise.
The run exits non-zero if any step fails, and its last lines name the failed steps, the verdict of the record-study comparison and the time each step took. If step 2/5 or 3/5 fails, the run stops there with a non-zero code and writes nothing more, so that a failed run cannot leave behind the outputs of an earlier one under the appearance of a success.
With or without the manuscript. The manuscript is not part of this repository. What the
code needs to know about it (the title, the figures and tables it displays, with their labels
and sections, and the macros it cites) is in 02_output/paper_manifest.json, a file generated
from paper.tex by 01_code/04_tables_values/paper_manifest.py and never edited by hand. The
mode is set by the presence of the manuscript/ directory as a whole, never by a single file:
- Without
manuscript/(this repository): the run printsmanuscript/ not present: using 02_output/paper_manifest.json; step 4/5 checks the exhibits under02_output/;VALUES_DIFF.mdcompares with the committed02_output/values/values_generated.tex; step 5/5 is skipped. - With
manuscript/(the author's working copy): the run also copiesvalues.tex, the tables and the figures intomanuscript/, rewrites the manifest frompaper.tex, checks that the two copies of each file are identical byte for byte, and compilesmanuscript/paper.pdf.
The outputs under 02_output/ are the same in both modes.
| Path | Contents |
|---|---|
run_all.sh |
The single entry point |
requirements-lock.txt |
The complete Python environment, exact versions |
00_data/amoc/ |
The script that downloads the AMOC series, and its provenance; the series itself is not shipped |
00_data/emissions/ |
The RCMIP extract (CC BY-SA 4.0), its provenance and the script that rebuilds it |
00_data/record_study/ |
The shipped outputs of the record study, and their provenance |
01_code/01_calibration/ |
Calibration: Monte Carlo, the AMOC recovery rate, the reduced-form level, the record-study reader |
01_code/02_solvers/ |
The boundary-value problems and the price |
01_code/03_figures/ |
The five figures |
01_code/04_tables_values/ |
computed.json, values.tex, the table files, the paper manifest, this README's generated sections |
01_code/05_record_study/ |
The record-detectability study |
02_output/ |
Everything the run writes, including the inputs of the manuscript (values/values_generated.tex, tables/, the five figures in figures/) and paper_manifest.json |
| Script | Role | Needs |
|---|---|---|
01_code/01_calibration/annual_mean_ou.py |
module: annual means -> continuous OU parameters (imported by ews_calibration.py and the record study) | none (self-contained) |
01_code/01_calibration/bhp_bound.py |
the ceiling of ssec:ceiling under the floored hazard (eq:ceiling_body) | none (self-contained) |
01_code/01_calibration/calibration_ci.py |
Monte Carlo over the calibration inputs: budgets M* and their intervals | none (self-contained) |
01_code/01_calibration/crossover.py |
which disagreement moves the price (ssec:which_parameter): the \xover* macros | none (self-contained) |
01_code/01_calibration/emission_paths.py |
module: the deadline bound on SSP2-4.5 and SSP3-7.0 (RCMIP extract) | RCMIP extract (00_data/emissions/) |
01_code/01_calibration/eps_dyn.py |
module: the lower edge eps_dyn of the fixed-budget regime and the factor F (ssec:window) | none (self-contained) |
01_code/01_calibration/eps_inf_ci.py |
Monte Carlo: the deadline bound t_c of each element | none (self-contained) |
01_code/01_calibration/ews_calibration.py |
reads the AMOC series: recovery rate, variance and noise of the overturning circulation | AMOC series |
01_code/01_calibration/phi_fold.py |
module: the fold amplitude Phi of app:amp | none (self-contained) |
01_code/01_calibration/record_detectability.py |
reads the record-study outputs; the \rec* macros | record-study outputs (02_output/record_study/) |
01_code/01_calibration/reduced_form_scc.py |
the reduced-form price level (diagnostic macros) | AMOC series, via ews_calibration.py |
01_code/02_solvers/moving_budget.py |
the price while the budget is being spent (ssec:window, app:additivity) | AMOC series, via ews_calibration.py |
01_code/02_solvers/noise_reversal_frontier.py |
BVP: where the noise reversal of the theorem (ssec:gen_thm) ends | AMOC series, via ews_calibration.py |
01_code/02_solvers/paper2_all_bifurcations.py |
module: the BVP solvers of the three geometries (imported by validation_bvp.py) | none (self-contained) |
01_code/02_solvers/price.py |
module: the price at fixed state, eq:gen_scc, and its leading law | none (self-contained) |
01_code/02_solvers/validation_bvp.py |
BVP: the numerical validation of app:solver | none (self-contained) |
01_code/03_figures/fig_bifurcation_intro.py |
Figure fig:bifurcation_intro | none (self-contained) |
01_code/03_figures/fig_crossover.py |
Figure fig:crossover (imports crossover.py and eps_dyn.py) | AMOC series, via ews_calibration.py |
01_code/03_figures/fig_forest_tc.py |
Figure fig:forest_tc and the deadline macros on the emission paths | RCMIP extract (00_data/emissions/) |
01_code/03_figures/fig_intro_two_boundaries.py |
Figure fig:two_boundaries | none (self-contained) |
01_code/03_figures/fig_record_power.py |
Figure fig:record_power (imports record_detectability.compute()) | record-study outputs (02_output/record_study/) |
01_code/04_tables_values/collect_computed.py |
step 2/5: collects the printed results into computed.json | none (self-contained) |
01_code/04_tables_values/make_inventory.py |
step 3/5: writes the generated sections of this README | none (self-contained) |
01_code/04_tables_values/make_tables_values.py |
step 3/5: writes values.tex, the two table files and VALUES_DIFF.md | none (self-contained) |
01_code/04_tables_values/paper_manifest.py |
step 3/5: what the paper displays, written to 02_output/paper_manifest.json from manuscript/ when present, read from it otherwise | none (self-contained) |
01_code/05_record_study/calib82.py |
record study: that test's false-rejection rate on the record -> calib82.json | AMOC series, via identification.py |
01_code/05_record_study/compare_shipped.py |
control: recomputed study outputs against 00_data/record_study/ | none (self-contained) |
01_code/05_record_study/estimateurs.py |
record study: trend, level and ramp statistics -> estimateurs.json | none (self-contained) |
01_code/05_record_study/fenetres.py |
record study: the level statistic by window width -> fenetres.json | none (self-contained) |
01_code/05_record_study/horizon_attente.py |
record study: the bound while waiting -> horizon_attente.json | none (self-contained) |
01_code/05_record_study/horizon_np.py |
record study: the Neyman-Pearson bound -> horizon_np.json | none (self-contained) |
01_code/05_record_study/identification.py |
record study: joint region of the two trends on the AMOC record -> identification.json | AMOC series |
01_code/05_record_study/mle_ditlevsen.py |
record study: the Ditlevsen-Ditlevsen likelihood test -> mle_ditlevsen.json | none (self-contained) |
01_code/05_record_study/puissance.py |
record study: power of the trend estimators -> puissance.json | none (self-contained) |
01_code/05_record_study/record_pipeline.py |
module: the record study's trend estimators, the AMOC reader and the output paths | none (self-contained) |
01_code/check_exhibits.py |
control (step 4/5): every exhibit paper.tex displays was produced by this run | none (self-contained) |
01_code/inputs_literature.py |
module: the sourced constants, each with its citation | literature constants |
01_code/tcre_draw.py |
module: the TCRE draw shared by the three Monte-Carlo scripts | none (self-contained) |
| Produced by | Macros | of which [requires network] | Needs |
|---|---|---|---|
01_code/01_calibration/bhp_bound.py |
11 | 0 | none (self-contained) |
01_code/01_calibration/calibration_ci.py |
6 | 0 | none (self-contained) |
01_code/01_calibration/crossover.py |
6 | 0 | none (self-contained) |
01_code/01_calibration/eps_inf_ci.py |
3 | 0 | none (self-contained) |
01_code/01_calibration/ews_calibration.py |
5 | 5 | AMOC series |
01_code/01_calibration/record_detectability.py |
53 | 0 | record-study outputs (02_output/record_study/) |
01_code/01_calibration/reduced_form_scc.py |
2 | 2 | AMOC series, via ews_calibration.py |
01_code/02_solvers/moving_budget.py |
8 | 8 | AMOC series, via ews_calibration.py |
01_code/02_solvers/noise_reversal_frontier.py |
2 | 2 | AMOC series, via ews_calibration.py |
01_code/02_solvers/validation_bvp.py |
30 | 7 | none (self-contained) |
01_code/03_figures/fig_forest_tc.py |
25 | 0 | RCMIP extract (00_data/emissions/) |
01_code/04_tables_values/collect_computed.py |
48 | 12 | closed forms and sourced constants |
01_code/inputs_literature.py |
43 | 0 | literature constants |
From a fresh clone, at the root of the package:
-
Get the AMOC series (once; the only step that uses the network):
python3 00_data/amoc/fetch_pik_sg_index.pyIt prints the md5 and writes
00_data/amoc/sg_index_hadisst.txt, or stops if the file PIK serves differs from the one the paper used. On Windows,python3may be the Microsoft Store alias rather than an interpreter; call the Python 3.14 of your installation by its path in steps 1 and 2 if so. -
Create the Python environment:
python3 -m venv .venv .venv/bin/python -m pip install -r requirements-lock.txtOn Windows, the interpreter of the environment is
.venv/Scripts/python.exe. -
Run the package, with the interpreter of that environment:
PYTHON=.venv/bin/python bash run_all.shOn Windows (Git Bash):
PYTHON=.venv/Scripts/python.exe bash run_all.sh. To skip the recomputation of the record study, addRECORD_STUDY=cachedin front of the command. -
Check the result. The run ends with
Failed steps: none, and with the number of the eight recomputed record-study outputs identical to the shipped ones.02_output/values/VALUES_DIFF.mdcompares every regenerated macro with the committedvalues.tex(a clean reproduction reports0 substantive), andgit statusshows whether any generated file changed: a clean reproduction changes none. -
The paper.
values.tex(02_output/values/values_generated.tex), the table files (02_output/tables/) and the figures (02_output/figures/) are the inputs of the manuscript, which is not part of this repository. Step 5/5 is skipped and says so.
Figures are reproduced to the byte. run_all.sh sets SOURCE_DATE_EPOCH=1767225600
(2026-01-01 00:00:00 UTC, a fixed constant rather than the date of any run), which matplotlib
writes as the creation date of every PDF instead of the time of the run. A figure script run by
hand without it draws the same picture but writes the current date, and so different bytes.
Every random draw is seeded, so a rerun returns the same numbers:
01_code/01_calibration/calibration_ci.py,01_code/01_calibration/eps_inf_ci.pyand01_code/03_figures/fig_forest_tc.py:np.random.seed(42), set once before the draws;01_code/tcre_draw.pydraws right after it.- The record study,
01_code/05_record_study/: onenumpy.random.default_rngseed per simulated cell, stated in each script's header (identification.py42,puissance.py1, 2, …,mle_ditlevsen.py6000+,calib82.py8000+,estimateurs.py1300+,fenetres.py2000+,horizon_np.py5000+,horizon_attente.py7000+). The cells run on 6 worker processes; each cell carries its own seed, so the results do not depend on the number of processes. - No other script draws random numbers (the solvers,
ews_calibration.pyand the figures are deterministic).
- Code. The code of this package (
01_code/,run_all.shand the scripts under00_data/) is released under the MIT licence; seeLICENSE. - The RCMIP extract,
00_data/emissions/rcmip_co2_world_ssp245_ssp370.csv, is redistributed under its own licence, CC BY-SA 4.0, and not under the MIT licence. Its attribution and licence notice are in00_data/emissions/PROVENANCE.mdand in section 1 ("The RCMIP extract"). - The AMOC series of Caesar et al. (2018) is not redistributed: its host publishes no
licence.
00_data/amoc/fetch_pik_sg_index.pydownloads it from its publisher; see section 1 ("The AMOC series").