{
"cells": [
{
"cell_type": "markdown",
"id": "7b70642d",
"metadata": {},
"source": "# Benchmarks: OSCAR\n\n*The compiled C++ of OSCAR, called from the R package, against the batched port on the CPU and on the GPU.*\n\nOSCAR (Dome & Wills, 2026) is the model of the participant-level run in [oscar/](https://github.com/lenarddome/psp-torch/blob/main/notebooks/oscar/README.md): a small network learning the inverse base-rate design trial by trial, one PSP search per participant. Its reference implementation is C++ with RcppArmadillo, called from R once per parameter set by `pspGlobal()`; the port, `psp.models.oscar`, runs a whole batch of parameter sets, and of participants, in one call. This notebook compares three builds:\n\n- **R + C++**: psp 1.0.6 from CRAN, OSCAR compiled from [`benchmarks/oscar/tmp-models`](https://github.com/lenarddome/psp-torch/tree/main/benchmarks/oscar/tmp-models) with `Rcpp::sourceCpp()`, run with the routine's own `evaluate()` and `discretize()` (`convert.R`, `imac.R`), the participants spread over worker processes as `psp.R` does;\n- **torch CPU float64** and **torch GPU float32**: `notebooks/oscar/run_oscar.py`, every participant's search advancing in lockstep with `PSPLockstep()`.\n\nTwo measurements: the cost of one call of the model, by the number of parameter sets it carries, and the whole routine for 14 participants. The scripts are in [`benchmarks/oscar`](https://github.com/lenarddome/psp-torch/tree/main/benchmarks/oscar) (`run.py` runs everything); this notebook only reads their results."
},
{
"cell_type": "code",
"execution_count": 1,
"id": "b1da2e3c",
"metadata": {
"execution": {
"iopub.execute_input": "2026-10-15T15:58:14.299788Z",
"iopub.status.busy": "2026-10-15T15:58:14.299675Z",
"iopub.status.idle": "2026-10-15T15:58:15.388473Z",
"shell.execute_reply": "2026-10-15T15:58:15.387863Z"
}
},
"outputs": [],
"source": [
"import os\n",
"import platform\n",
"import subprocess\n",
"from pathlib import Path\n",
"import numpy as np\n",
"import pandas as pd\n",
"import torch\n",
"from IPython.display import Markdown, display\n",
"import matplotlib.pyplot as plt\n",
"from figure_style import figures, titled\n",
"\n",
"show = figures(\"benchmarks-oscar\")\n",
"\n",
"grey, muted = \"#6c757d\", \"#6c757d\"\n",
"# the port's builds; R + C++ is the grey reference, drawn as dashed lines or grey bars\n",
"colours = {\"cpu float64\": \"#eb6834\", \"cuda float32\": \"#2a78d6\", \"cuda float64\": \"#1baf7a\"}\n",
"\n",
"\n",
"def us(v):\n",
" return f\"{v / 1000:,.2f} ms\" if v >= 1000 else f\"{v:,.1f} µs\"\n",
"\n",
"\n",
"def times(v):\n",
" return f\"{v:,.0f}×\" if v >= 10 else f\"{v:.2g}×\"\n",
"\n",
"\n",
"results = Path(\"../benchmarks/oscar/results\")\n"
]
},
{
"cell_type": "markdown",
"id": "c172659e",
"metadata": {},
"source": "## One call of the model\n\nThe first participant's 112 trials, with parameter sets drawn uniformly within the bounds of the routine. R calls the compiled `OSCAR()` once per parameter set, as `pspGlobal()` calls the model; the routine's `evaluate()` adds what happens around it in R: a fresh random initial state, and the data.table reduction to the mean P(rare) at test. The port's `evaluate()` does all of that for a whole batch in one call; its time includes `discretize()`."
},
{
"cell_type": "code",
"execution_count": 2,
"id": "64b41910",
"metadata": {
"execution": {
"iopub.execute_input": "2026-10-15T15:58:15.389688Z",
"iopub.status.busy": "2026-10-15T15:58:15.389530Z",
"iopub.status.idle": "2026-10-15T15:58:15.405669Z",
"shell.execute_reply": "2026-10-15T15:58:15.405325Z"
}
},
"outputs": [
{
"data": {
"text/html": [
"
"
],
"text/plain": [
"build cpu float64 cuda float32 cuda float64 \\\n",
"parameter sets per call \n",
"1 82.57 ms 232.44 ms 230.44 ms \n",
"4 22.30 ms 59.04 ms 59.24 ms \n",
"16 6.70 ms 14.82 ms 14.89 ms \n",
"64 2.47 ms 3.74 ms 3.73 ms \n",
"256 1.32 ms 940.3 µs 936.6 µs \n",
"1024 1.03 ms 235.6 µs 233.4 µs \n",
"4096 379.3 µs 59.1 µs 125.0 µs \n",
"16384 312.6 µs 20.3 µs 118.0 µs \n",
"\n",
"build vs R evaluate(), cpu float64 \\\n",
"parameter sets per call \n",
"1 0.065× \n",
"4 0.24× \n",
"16 0.8× \n",
"64 2.2× \n",
"256 4.1× \n",
"1024 5.2× \n",
"4096 14× \n",
"16384 17× \n",
"\n",
"build vs R evaluate(), cuda float32 \\\n",
"parameter sets per call \n",
"1 0.023× \n",
"4 0.091× \n",
"16 0.36× \n",
"64 1.4× \n",
"256 5.7× \n",
"1024 23× \n",
"4096 91× \n",
"16384 264× \n",
"\n",
"build vs R evaluate(), cuda float64 \n",
"parameter sets per call \n",
"1 0.023× \n",
"4 0.091× \n",
"16 0.36× \n",
"64 1.4× \n",
"256 5.7× \n",
"1024 23× \n",
"4096 43× \n",
"16384 45× "
]
},
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"fig, ax = plt.subplots(figsize=(8, 4.8))\n",
"for b, colour in colours.items():\n",
" ax.plot(per_eval.index, per_eval[b], \"-o\", color=colour, linewidth=2, markersize=6,\n",
" markeredgecolor=\"white\", label=f\"torch {b}, one batched call\")\n",
"for what, style in [(\"evaluate()\", \"--\"), (\"OSCAR() alone\", \":\")]:\n",
" ax.axhline(r_us[what], color=grey, linestyle=style, linewidth=1.6)\n",
" ax.annotate(f\"R + C++ {what}: {us(r_us[what])}\", xy=(per_eval.index.max(), r_us[what]),\n",
" xytext=(0, 4), textcoords=\"offset points\", color=muted, fontsize=9.5, ha=\"right\", va=\"bottom\")\n",
"ax.set_xscale(\"log\", base=4)\n",
"ax.set_yscale(\"log\")\n",
"ax.xaxis.set_major_formatter(lambda v, _: f\"{v:,.0f}\")\n",
"ax.yaxis.set_major_formatter(lambda v, _: f\"{v / 1000:g} ms\" if v >= 1000 else f\"{v:g} µs\")\n",
"ax.set_xlabel(\"parameter sets per call\")\n",
"ax.legend(loc=\"lower left\", fontsize=9.5)\n",
"titled(ax, \"Time per evaluation of OSCAR, log scales\",\n",
" \"lower is faster; one participant, 112 trials; R makes one call per parameter set\")\n",
"show(fig, \"model-per-evaluation\")\n",
"table = per_eval.map(us)\n",
"for b in colours:\n",
" table[f\"vs R evaluate(), {b}\"] = (r_us[\"evaluate()\"] / per_eval[b]).map(times)\n",
"table.rename_axis(\"parameter sets per call\")"
]
},
{
"cell_type": "code",
"execution_count": 4,
"id": "5667abce",
"metadata": {
"execution": {
"iopub.execute_input": "2026-10-15T15:58:16.124838Z",
"iopub.status.busy": "2026-10-15T15:58:16.124728Z",
"iopub.status.idle": "2026-10-15T15:58:16.128825Z",
"shell.execute_reply": "2026-10-15T15:58:16.128476Z"
}
},
"outputs": [
{
"data": {
"text/markdown": "\nA call of the port has a large fixed cost: 82.57 ms on the CPU and 232.44 ms on the GPU for a single parameter set, against 2.27 ms for one call of the C++. On the GPU a call costs about the same up to 4,096 parameter sets; on the CPU it grows, but far more slowly than the batch (338.12 ms for 256). OSCAR runs its 112 trials in order, and on every trial the port runs the ten recurrent attention shifts in order (for every row, keeping the result only where the trial learns), so one call is some 1,200 steps one after another, each a handful of tensor operations. Every operation costs a fixed amount of dispatch on the CPU and a kernel launch on the GPU, whether it works on one parameter set or on thousands. The C++ does the same steps without that overhead, which is why it wins for a single parameter set by a factor of 36 on the CPU.\n\nThe batch pays that fixed cost once for every parameter set it carries. The port beats R's `evaluate()` from 64 parameter sets per call on the CPU and from 64 on the GPU, and at 16,384 it is 17× faster on the CPU, 45× on the GPU in float64 and 264× in float32. Below a few thousand parameter sets the GPU's time is launches, not arithmetic, so float32 and float64 cost the same there (their lines coincide); above it, the card's slow double precision shows.\n",
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"def crossover(b):\n",
" faster = per_eval.index[per_eval[b] < r_us[\"evaluate()\"]]\n",
" return int(faster.min()) if len(faster) else None\n",
"\n",
"\n",
"single = per_call.loc[1]\n",
"gpu_flat = int(per_call.index[per_call[\"cuda float32\"] < 1.1 * single[\"cuda float32\"]].max())\n",
"largest = per_eval.index.max()\n",
"display(Markdown(f'''\n",
"A call of the port has a large fixed cost: {us(1e6 * single[\"cpu float64\"])} on the CPU and {us(1e6 * single[\"cuda float32\"])} on the GPU for a single parameter set, against {us(r_us[\"OSCAR() alone\"])} for one call of the C++. On the GPU a call costs about the same up to {gpu_flat:,} parameter sets; on the CPU it grows, but far more slowly than the batch ({us(1e6 * per_call.loc[256, \"cpu float64\"])} for 256). OSCAR runs its 112 trials in order, and on every trial the port runs the ten recurrent attention shifts in order (for every row, keeping the result only where the trial learns), so one call is some 1,200 steps one after another, each a handful of tensor operations. Every operation costs a fixed amount of dispatch on the CPU and a kernel launch on the GPU, whether it works on one parameter set or on thousands. The C++ does the same steps without that overhead, which is why it wins for a single parameter set by a factor of {single[\"cpu float64\"] / (r_us[\"OSCAR() alone\"] / 1e6):.0f} on the CPU.\n",
"\n",
"The batch pays that fixed cost once for every parameter set it carries. The port beats R's `evaluate()` from {crossover(\"cpu float64\")} parameter sets per call on the CPU and from {crossover(\"cuda float32\")} on the GPU, and at {largest:,} it is {times(r_us[\"evaluate()\"] / per_eval.loc[largest, \"cpu float64\"])} faster on the CPU, {times(r_us[\"evaluate()\"] / per_eval.loc[largest, \"cuda float64\"])} on the GPU in float64 and {times(r_us[\"evaluate()\"] / per_eval.loc[largest, \"cuda float32\"])} in float32. Below a few thousand parameter sets the GPU's time is launches, not arithmetic, so float32 and float64 cost the same there (their lines coincide); above it, the card's slow double precision shows.\n",
"'''))"
]
},
{
"cell_type": "markdown",
"id": "f15835c1",
"metadata": {},
"source": "## The participant-level routine\n\nThe routine of `psp.R` with reduced settings: the first 14 participants, 100 random starting points (one matrix shared by every participant, as `psp.R` draws it), radius 1, population 1,000,000 (so every pattern keeps proposing until the cap), 200 iterations, seed 2026.\n\n- **R + C++** runs `pspGlobal()` once per participant, the participants spread over 14 forked worker processes: `psp.R` uses foreach over `detectCores() - 2` cores, which is 14 on this machine, so every worker runs one participant. Its time is the wall clock of the whole parallel run.\n- **The port** runs `run_oscar.py --no-save` in one process: every participant's search advances in lockstep, and each iteration evaluates the proposals of all 14 participants in one batched call. Its time is the wall clock of that process, including Python's start-up, loading the data and initialising CUDA."
},
{
"cell_type": "code",
"execution_count": 5,
"id": "7e565b02",
"metadata": {
"execution": {
"iopub.execute_input": "2026-10-15T15:58:16.129870Z",
"iopub.status.busy": "2026-10-15T15:58:16.129770Z",
"iopub.status.idle": "2026-10-15T15:58:16.508256Z",
"shell.execute_reply": "2026-10-15T15:58:16.507852Z"
}
},
"outputs": [
{
"data": {
"image/png": "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W265xfr/2YKCgjR48OAqeZ4d8Dp58qR27Nihbt26KSsrS9u2bXO4TFdvd+3bt0//93//p9mzZztNVx25ubkey8sTnn76aX3yySfVmufBBx/Uiy++aP1ssVh09OhRh+k7deqk2NjYGpextiwWi9OgXqdOndy6SehqsOezt4E/bRdHwS6TyaS3335bt956a52Uw6j69+/vcJqrp0MHDhzocJqrp18LCwurfOeqXnlCTk6OioqKFBoaWuu8fNX+IJc3jBs1auR0en2of+667LLL3E7rz3WagJct2oBn+XPdl6rXjo0qPT1dt99+e5Xv7777bl188cU+KJFnuKoTUvlDQsHBwSopKbE73Vm98bdrOiPXVX+6vqmNhlbnvHE+9JYJEybosccek8VicZjGbDZr//792r9/v80bh5GRkRo5cqQmT56sK6+80u/Oo0Bdot8HAKgD7dq1U8uWLR1Or/wmlr2AV9++fRUZGWnznaMgWsX8S5cudfpDyVnAa+3atRo0aJBHf6RKcloeozp16pRKS0sdTk9KSqrD0lSVlZVVpbuIylz9wHc3XUZGhs1nf98ukgh2ualNmzYOp4WEhDid19lbXM7qpSOu6rOneOptVF+1P0gdO3Z0Ot1V3bXHaPXPXeecc47baanTxuGqDdTkRlh9bQPu8Pe6X512bFS33367Tpw4YfNdly5d9O9//9tHJfIMd+qOyWRy+qBQVlaW3e/98ZrOyHXVCNc37mhodc4b50Nv6d69u2688cYazZuXl6cff/xR119/vbp06aKFCxd6uHSAcfCGFwDUkREjRujTTz+1O23fvn1KS0tTcHCw3bdR7AWnhgwZYvepq6VLl+qPf/yj0y5nHOUplT89deWVV7q84E5MTFTbtm2r9B+9YsUKh0+C1Ueunvjy9Q9oV+Vz96avq3RnL8fft4skff7555o8ebJflMWfObvYDQpy/lPS2VOujvrod6aunrD01A1dX7U/SDExMU6nu6q79hit/rnL2XhKZ/PnOu3OzbCaHHeMylUbcNRVrTP1tQ24w5/rvlS9dmxEhYWF+uabb6p8f9ttt2n16tUO53M17s/+/ftteswICAio8y6C3e2CzFndsVdv/PWazsh11QjXN+5oaHXOG+dDb3r77bd14sQJzZs3r8Z57N+/X5dcconmzZtX666GASMi4AUAdcRZwEsqf8vL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9Xa53jR27FgdOXJEgYGBKi0t9XVxAAAAPIqAFwAAAAAA8Eupqanq2bOn8vLyrN/NmjVLV199db1cLgAAAGqOgJeBlJSU6uNPv7B+nnLjtTKZGIbNCHJyc7Vl2w4dOZKm/PwCmc1mp+mvnXilwsPD6qh0AAAAAOCfbrvtNpugU31fLgAAAGqOgJeBlJaWatbsb62fb7phkg9LA3eYzWZ9/Nkszf7mexUVF7s93+WXXULA63ens7O1Zet2nczMUk5OrqKjoxQfF6d2bVurZYvmtc5/X+oB/bp0uc13N153jYKDOTwCAAAAvvTOO+9o4cKFMplMio6OtulesD4uty50795dCQkJCgriegcAANQ/hviFc/TYcc2bv1CSFB8fp8svvdjHJQLcM/OLr/TZrNm+Lkad++Djz6xvsV036SqFhYZWO4/de/bq/Y8/1eat2x2+EZeU2ESXXHSBJl4xvkblLC0t1b9feU0HDh6y+f7aiVcS8AIAAAB8KC0tTX/5y18kSffee68WLVqkTZs21dvl1pWffvrJ10UAAADwGkPc0T2RkWF9s6l92zYEvGAI+QUF+vqb76yf4+PiNGTQAMXHN1KgKbBK+g9nfiaz2VKXRfSaWbO/tQaprpxwabUCXhaLRe99OFOzv/3O5fY4nn5CGzZurnHA67NZs6sEuwAAAAD43l133aVTp06pffv2evrppzV06NB6s9yNGzdKkkJCQtStWzebaRkZGcrIyFDz5s0VExPjNJ/CwkKl7tunwKAgRXfp5NZDe9u3b1dxcbECAgLUu3fvapcvMzNTx48fV0xMjJo3b66AgACXywQAAKgrhgh4AUa0c9ceFRYWSZKioiL1xisvKCYm2mH6D2d+Lql+BLxq47W33tWP83+2+a5D+3bq2qWTYmNiVFpWqhMnTiplX2qtglWpBw7qi6/nSJKaJiXq2PH02hQbAAAAgId8/vnn+uabbyRJ06ZNU0RERL1abp8+fSRJLVq00OHDh5Wbm6t//etf+vDDD3X06FFrum7duumRRx7R9ddfbzP/zJkz9b///U+rVq2yfhcXF6cpU6boySefVHS04+vOsWPH6siRIwoMDFRpaalb5SssLNS///1vvffee9q/f781XWJiom688UY99thjatSoUXU3AwAAgMcR8AK8JP1EhvX/Lp06Og12odyP83+2CXYlt2+r++76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JkmPPvqopk6davW59PR0TZgwQTt37tS7777rtGMCAAAAAABAovsCUE0KCwuNZT8HhvQ730VHRdoMu8p079pZN1w30ljfn5Coo0ezrJYddEl/vTtruoYNGWw17CpTq1aEnn1iogIDAozH/l2xqgq1B86c8r2G+vbta7d8v379jOUtW7ac0jH9/f2N5bK5w2zJzs4uHc70uNjY2FM67sk++OADI+yqVauWBg0apBEjRqh169ZGmdzcXN19992KjY01wi5vb2/16tVLV199tS666CKL95qXX35ZGzdudEr9PvroIyPsCg4OVv/+/XX11VerZ8+e8vQ8cY/Re++9p99//90pxwQAAAAAAEApp/Xw+vvfFfp72QplZWUbjx1OTtazL02zWn7MA/coODjI6nNZWdlat3GTdu3eo6NHs2WWWaEhIWrRvKm6dupY6Xblbd+5S1/P/1FS6YX0224aJUnKy8vX6nXrtWv3HmVkHlV+foF6dOusQZdav/P8SHKyNm7eon37E5WVdaIuYWGhahXTQm1axVRpPg6TyaTYuG3asGmzUtPSVVJSoojwMLVv20bdunSu9iHUTvV89u1P1Nx5X0mSGtSvq7tuv8XusT774hvF79svSbp2xDC1bhVjZwspNTVNy1b+p8QDB5WTm6vQkBBFRTZS7549FBIcXMWzPSEh8aA2xcZq3/4Dyj52TL6+PgoLLT3nTh3ayc/Pdm8FR8Vu2arvF/wqSUo6fOTE43FbK/wttGvTSlcPH3rKxyosLFRs3DbFxm1VekamCgoKFBwUrKjIBurauZMa1K9X5X2ezuuUkHhQH3/2hSTJbD4xNONrM+dYXOgtM2zIYHXq0K7KdZRUYbujWVkKCanYPsLDwxzeZ2hoiPr26alfF/4hSUo4cPCU6gZUp0OHDik7+8TnrK05q6yVKevpVVXl95Gamqq///7bIkg72bfffmuxvm3btlM67sm2bNkiHx8fvf7667r77rstPq++/fZb3XDDDSouLtaOHTt00UUXKS8vTzfddJNef/111a5d2ygbHx+vyy+/XDt37pTJZNI777yjt95667Trt3nzZnl6euqFF17Q6NGjLYZx3LNnj4YNG6atW7dKkmbPnq3Bgwef9jEBAAAAAABQymmBV+LBg1q1eq3FY7m5eRUeK1P4f/+r8Fh+fr4+//Jb/fTrQos7w8vz9vbSsCGDdeOoa+RrYz6Q9IxM49g5OTkym81a8OtCffzZF8ZcPWVq14qosP3effv18Wdfas26DZUeQ5IC/P01+oG71afXhTbLSdKOnbs1/c23lGjlQvp3P/6iyEYNNWn8GDWOjrS7r6o63fPJys4yXs/mzZo6dMyt23do4+bS3gQD+vWxWbaoqFiffvGVvv/pV5WUlFR4/u33P9L111ytUdeMcOjYUmno8s/ylfr+x1+0c/eeSssFBQbq2quHa+RVQ097TpWU1DSrbT41LV2paZa9Iry97fdmqszvi5fosy++UXpGRqVlel3QXXf97xbVq1vH5r6c9TplZ2dbPfe16zda3V/PC7rZrJct+QX5FuvWwq5TUT4kLDjpfQI4G5TvXeXp6WkR4lSmQYMGxnKGjfcMW5o2barWrVsbwdXtt9+uRYsWWQ3cVq5cqUceecTisVM9rjUffvih1XnLrrnmGi1dulRz5syRVDpk4dVXX63PPvusQtmmTZvqrbfe0iWXXCJJWrp0qdPq98477+iOO+6o8HizZs00b948derUSZL0119/yWw2M5cXAAAAAACAk5w1c3gdzcrSk8+9rF27422WKyws0rffL1Bs3DY9M3miQ729JOmdDz7RT784NnzQ0n+Waebsd1RYaD10Ky8nN7dCkGHN+o2b9dzL01RcXDHMKZN44KAmPvGMZr/+impZCeFOVXWcjzMVFxfrxamv678162yUKdFnX36jI8kplZY52bQZs7X0n2V2y2UfO6YP536uvfv3a8KYBx3ef00wmUya9fb7+n3xErtlV/y3RnHbduiZKRMV07xZpeVc8XVa/OffxnKrmBan1fuvvIyMTGM5IsLx3mHAmXLs2DFj2dGhUssPR1i+d1hVPf300xo1qrS39L59+9ShQweNHDlSPXv2VEhIiNLS0rR06VL9/PPPKikpUcOGDXXw4MHTPm55HTp0sBp2lRk+fLgReEnSK6+8UmnZ/v37Kzg4WFlZWdq1a5dKSkqq1GPbmnbt2lkNu8p07NjRCA6PHTumAwcOKDLS+Te5AAAAAAAAnI+cFnj169NLTZs01v6ERH0672tJUt06tfV/d9xqtXz5oMpsNuuV6W9ahF21IsLVv28fRUU1kpvctC8hQUv/Xqa09NK7xHfs3K2pM2bp2SmP2b07eufueMXGld6VXr9eXfXt3VONGjUwLhbW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",
"text/plain": [
"
"
],
"text/plain": [
" minutes, all participants speed-up against R \\\n",
"R + C++ 7.4 1× \n",
"torch cpu float64 4.4 1.7× \n",
"torch cuda float32 0.9 8.6× \n",
"\n",
" evaluations per second regions per participant \\\n",
"R + C++ 1,111 198–216, median 204 \n",
"torch cpu float64 1,864 194–215, median 205 \n",
"torch cuda float32 9,706 196–220, median 208 \n",
"\n",
" evaluations per participant \n",
"R + C++ 35,417 \n",
"torch cpu float64 34,916 \n",
"torch cuda float32 35,461 "
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"def keys_torch(directory):\n",
" # every inequality matrix a run found, as the upper triangle in column-major order (as compare.R writes R's)\n",
" rows = []\n",
" for f in sorted((directory / \"patterns\").glob(\"OSCAR_4.*.npz\")):\n",
" z = np.load(f)\n",
" for m, c in zip(z[\"ordinal_patterns\"], z[\"ordinal_counts\"], strict=True):\n",
" rows.append({\"ppt\": f.stem.split(\".\", 1)[1], \"count\": int(c),\n",
" \"key\": \",\".join(str(int(m[i, j])) for j in range(5) for i in range(j))})\n",
" return pd.DataFrame(rows)\n",
"\n",
"\n",
"r_wall = pd.read_csv(results / \"psp_r\" / \"wall.csv\").iloc[0]\n",
"runs = {\"R + C++\": (float(r_wall.wall_seconds), pd.read_csv(results / \"psp_r\" / \"summary.csv\"),\n",
" pd.read_csv(results / \"psp_r\" / \"patterns.csv\"))}\n",
"for _, w in pd.read_csv(results / \"psp_torch_wall.csv\").iterrows():\n",
" d = results / f\"psp_torch_{w['device']}_{w['dtype']}\"\n",
" runs[f\"torch {w['device']} {w['dtype']}\"] = (float(w[\"wall_seconds\"]), pd.read_csv(d / \"tracking.csv\"), keys_torch(d))\n",
"run_colours = {name: grey if name == \"R + C++\" else colours[name.removeprefix(\"torch \")] for name in runs}\n",
"n_ppt = int(r_wall.participants)\n",
"r_seconds = runs[\"R + C++\"][0]\n",
"\n",
"fig, ax = plt.subplots(figsize=(8, 2.8))\n",
"names = list(runs)[::-1]\n",
"minutes = [runs[n][0] / 60 for n in names]\n",
"ax.barh(names, minutes, color=[run_colours[n] for n in names], height=0.6)\n",
"for y, m in enumerate(minutes):\n",
" ax.text(m + max(minutes) * 0.01, y, f\"{m:.1f} min\", va=\"center\", fontsize=10.5)\n",
"ax.grid(axis=\"y\", visible=False)\n",
"ax.set_xlim(0, max(minutes) * 1.15)\n",
"ax.xaxis.set_major_formatter(lambda v, _: f\"{v:g} min\")\n",
"titled(ax, f\"Wall-clock time of the routine for {n_ppt} participants\",\n",
" \"lower is faster; R in parallel processes, the port all participants in one\")\n",
"show(fig, \"routine-wall-clock\")\n",
"pd.DataFrame({\n",
" name: {\n",
" \"minutes, all participants\": f\"{seconds / 60:.1f}\",\n",
" \"speed-up against R\": times(r_seconds / seconds),\n",
" \"evaluations per second\": f\"{summary.evaluations.sum() / seconds:,.0f}\",\n",
" \"regions per participant\": f\"{summary.patterns.min()}–{summary.patterns.max()}, median {summary.patterns.median():.0f}\",\n",
" \"evaluations per participant\": f\"{summary.evaluations.median():,.0f}\",\n",
" }\n",
" for name, (seconds, summary, _) in runs.items()\n",
"}).T"
]
},
{
"cell_type": "code",
"execution_count": 6,
"id": "9936ffcd",
"metadata": {
"execution": {
"iopub.execute_input": "2026-10-15T15:58:16.509432Z",
"iopub.status.busy": "2026-10-15T15:58:16.509322Z",
"iopub.status.idle": "2026-10-15T15:58:16.512431Z",
"shell.execute_reply": "2026-10-15T15:58:16.512157Z"
}
},
"outputs": [
{
"data": {
"text/markdown": "\nEach R participant took a median of 419 s in the parallel run. The same 35,417 evaluations at the 5.36 ms of a lone `evaluate()` would take 190 s, so with 14 workers on 16 hardware threads (8 cores) each R process ran 2.2 times slower than alone: the workers compete for the cores. That is the routine as `psp.R` runs it on this machine. The port's CPU run is one process using torch's own threads (8 here) inside each operation.\n",
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"r_summary = runs[\"R + C++\"][1]\n",
"lone = r_summary.evaluations.median() * r_us[\"evaluate()\"] / 1e6\n",
"display(Markdown(f'''\n",
"Each R participant took a median of {r_summary.seconds.median():.0f} s in the parallel run. The same {r_summary.evaluations.median():,.0f} evaluations at the {us(r_us[\"evaluate()\"])} of a lone `evaluate()` would take {lone:.0f} s, so with {int(r_wall.workers)} workers on {os.cpu_count()} hardware threads ({os.cpu_count() // 2} cores) each R process ran {r_summary.seconds.median() / lone:.1f} times slower than alone: the workers compete for the cores. That is the routine as `psp.R` runs it on this machine. The port's CPU run is one process using torch's own threads ({torch.get_num_threads()} here) inside each operation.\n",
"'''))"
]
},
{
"cell_type": "markdown",
"id": "a1986e04",
"metadata": {},
"source": "### How large are the batches of a real run?\n\nThe single-call measurements above predict the routine only if we know how many parameter sets a call of the routine carries. In a PSP run that is the number of patterns still filling, summed over the participants: iteration 0 evaluates every starting point of every participant, and every later iteration one proposal per pattern found so far. With a population of a million, no pattern ever fills, so every pattern proposes on every iteration."
},
{
"cell_type": "code",
"execution_count": 7,
"id": "c9539f49",
"metadata": {
"execution": {
"iopub.execute_input": "2026-10-15T15:58:16.513545Z",
"iopub.status.busy": "2026-10-15T15:58:16.513447Z",
"iopub.status.idle": "2026-10-15T15:58:16.517766Z",
"shell.execute_reply": "2026-10-15T15:58:16.517387Z"
}
},
"outputs": [
{
"data": {
"text/markdown": "\nIteration 0 evaluates 1,400 parameter sets (14 participants × 100 starting points); by the last iteration the participants hold 2,903 patterns between them, so the last call carries 2,903, and on average a call carried 2,498. At that batch size the curve above puts one evaluation of the model alone at about 541.4 µs on the CPU and 96.8 µs on the GPU in float32. The whole routine, divided by the evaluations it made, cost 536.4 µs and 103.0 µs per evaluation: almost all of a run is the model, and proposing, discretizing and the pattern stores add little.\n\nR's single-process cost is 5.36 ms per evaluation, but its 14 processes together made one evaluation every 900.1 µs: running the participants in parallel bought 6.0× on 8 cores. Against that parallel R, the port's batched call is what remains of its advantage: 1.7× on the CPU in one process, and 8.6× on the GPU.\n\nThe batch grows with the number of participants run together. 14 participants with about 200 patterns each give a few thousand parameter sets per call; all 354 participants of the dataset would give some 70,000, where the GPU's lead per evaluation is largest, while R's processes would still share the same 8 cores.\n",
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"seconds, tracking, _ = runs[\"torch cuda float32\"]\n",
"iterations = int(tracking.iterations.max())\n",
"per_iteration = tracking.evaluations.sum() / iterations\n",
"start = 100 * n_ppt\n",
"final = tracking.patterns.sum()\n",
"\n",
"\n",
"def model_us(b, batch):\n",
" # time per evaluation of one call at `batch` parameter sets, interpolated on the log-log curve above\n",
" return float(np.exp(np.interp(np.log(batch), np.log(per_eval.index), np.log(per_eval[b]))))\n",
"\n",
"\n",
"def routine_us(name):\n",
" seconds, summary, _ = runs[name]\n",
" return 1e6 * seconds / summary.evaluations.sum()\n",
"\n",
"\n",
"display(Markdown(f'''\n",
"Iteration 0 evaluates {start:,} parameter sets ({n_ppt} participants × 100 starting points); by the last iteration the participants hold {final:,} patterns between them, so the last call carries {final:,}, and on average a call carried {per_iteration:,.0f}. At that batch size the curve above puts one evaluation of the model alone at about {us(model_us(\"cpu float64\", per_iteration))} on the CPU and {us(model_us(\"cuda float32\", per_iteration))} on the GPU in float32. The whole routine, divided by the evaluations it made, cost {us(routine_us(\"torch cpu float64\"))} and {us(routine_us(\"torch cuda float32\"))} per evaluation: almost all of a run is the model, and proposing, discretizing and the pattern stores add little.\n",
"\n",
"R's single-process cost is {us(r_us[\"evaluate()\"])} per evaluation, but its {int(r_wall.workers)} processes together made one evaluation every {us(routine_us(\"R + C++\"))}: running the participants in parallel bought {r_us[\"evaluate()\"] / routine_us(\"R + C++\"):.1f}× on {os.cpu_count() // 2} cores. Against that parallel R, the port's batched call is what remains of its advantage: {times(r_seconds / runs[\"torch cpu float64\"][0])} on the CPU in one process, and {times(r_seconds / seconds)} on the GPU.\n",
"\n",
"The batch grows with the number of participants run together. {n_ppt} participants with about 200 patterns each give a few thousand parameter sets per call; all 354 participants of the dataset would give some 70,000, where the GPU's lead per evaluation is largest, while R's processes would still share the same {os.cpu_count() // 2} cores.\n",
"'''))"
]
},
{
"cell_type": "markdown",
"id": "0f7a57ca",
"metadata": {},
"source": "### Do the builds find the same regions?\n\nThe model draws its initial state at random on every evaluation, and R and torch use different random numbers, so no two runs take the same path. Per participant, the inequality matrices each port build shares with R:"
},
{
"cell_type": "code",
"execution_count": 8,
"id": "557f67f4",
"metadata": {
"execution": {
"iopub.execute_input": "2026-10-15T15:58:16.518590Z",
"iopub.status.busy": "2026-10-15T15:58:16.518494Z",
"iopub.status.idle": "2026-10-15T15:58:16.604728Z",
"shell.execute_reply": "2026-10-15T15:58:16.604270Z"
}
},
"outputs": [
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
"
\n",
"
\n",
"
matrices shared with R, median
\n",
"
found by R only, median
\n",
"
found by the port only, median
\n",
"
evaluations in shared matrices, worst participant
\n",
"
\n",
"
\n",
"
build
\n",
"
\n",
"
\n",
"
\n",
"
\n",
"
\n",
" \n",
" \n",
"
\n",
"
torch cpu float64
\n",
"
196
\n",
"
8
\n",
"
6
\n",
"
R 99.7%, port 99.9%
\n",
"
\n",
"
\n",
"
torch cuda float32
\n",
"
198
\n",
"
6
\n",
"
9
\n",
"
R 99.9%, port 99.7%
\n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" matrices shared with R, median found by R only, median \\\n",
"build \n",
"torch cpu float64 196 8 \n",
"torch cuda float32 198 6 \n",
"\n",
" found by the port only, median \\\n",
"build \n",
"torch cpu float64 6 \n",
"torch cuda float32 9 \n",
"\n",
" evaluations in shared matrices, worst participant \n",
"build \n",
"torch cpu float64 R 99.7%, port 99.9% \n",
"torch cuda float32 R 99.9%, port 99.7% "
]
},
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"r_keys = runs[\"R + C++\"][2]\n",
"rows = []\n",
"for name, (_, _, keys) in list(runs.items())[1:]:\n",
" for ppt, mine in keys.groupby(\"ppt\"):\n",
" theirs = r_keys[r_keys.ppt == ppt]\n",
" shared = set(mine.key) & set(theirs.key)\n",
" rows.append({\n",
" \"build\": name, \"ppt\": ppt, \"shared\": len(shared),\n",
" \"R only\": len(set(theirs.key) - shared), \"torch only\": len(set(mine.key) - shared),\n",
" \"R\": theirs[theirs.key.isin(shared)][\"count\"].sum() / theirs[\"count\"].sum(),\n",
" \"torch\": mine[mine.key.isin(shared)][\"count\"].sum() / mine[\"count\"].sum(),\n",
" })\n",
"overlap = pd.DataFrame(rows)\n",
"summary = overlap.groupby(\"build\").agg(\n",
" shared=(\"shared\", \"median\"), r_only=(\"R only\", \"median\"), torch_only=(\"torch only\", \"median\"),\n",
" r_worst=(\"R\", \"min\"), torch_worst=(\"torch\", \"min\"))\n",
"pd.DataFrame({\n",
" \"matrices shared with R, median\": summary.shared.map(\"{:.0f}\".format),\n",
" \"found by R only, median\": summary.r_only.map(\"{:.0f}\".format),\n",
" \"found by the port only, median\": summary.torch_only.map(\"{:.0f}\".format),\n",
" \"evaluations in shared matrices, worst participant\": [f\"R {r.r_worst:.1%}, port {r.torch_worst:.1%}\" for _, r in summary.iterrows()],\n",
"})"
]
},
{
"cell_type": "markdown",
"id": "6e25f6a4",
"metadata": {},
"source": "The matrices only one build found are the rare ones, holding one or a few evaluations each: practically every evaluation of either run falls in a matrix both found. The port finds the same partition as the C++, at a fraction of the time. That the two implementations compute the same model is checked separately, to 1e-10 on the trial-by-trial output, by `tests/test_oscar.py` and [oscar/try_oscar.py](https://github.com/lenarddome/psp-torch/blob/main/notebooks/oscar/try_oscar.py).\n\n## How this was measured"
},
{
"cell_type": "code",
"execution_count": 9,
"id": "d874c42e",
"metadata": {
"execution": {
"iopub.execute_input": "2026-10-15T15:58:16.605774Z",
"iopub.status.busy": "2026-10-15T15:58:16.605655Z",
"iopub.status.idle": "2026-10-15T15:58:16.842912Z",
"shell.execute_reply": "2026-10-15T15:58:16.842509Z"
}
},
"outputs": [
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
"
\n",
"
\n",
"
\n",
"
\n",
"
\n",
"
Environment
\n",
"
\n",
"
\n",
" \n",
" \n",
"
\n",
"
CPU
\n",
"
AMD Ryzen 7 5800X 8-Core Processor, 16 threads
\n",
"
\n",
"
\n",
"
GPU
\n",
"
NVIDIA GeForce RTX 3060
\n",
"
\n",
"
\n",
"
System
\n",
"
Linux 7.0.0-38-generic
\n",
"
\n",
"
\n",
"
torch
\n",
"
2.11.0+cu128, 8 threads
\n",
"
\n",
"
\n",
"
Python
\n",
"
3.14.4
\n",
"
\n",
"
\n",
"
R
\n",
"
R version 4.5.2 (2025-10-31)
\n",
"
\n",
"
\n",
"
R package
\n",
"
psp 1.0.6 (CRAN), OSCAR compiled with Rcpp::so...
\n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" \n",
"Environment \n",
"CPU AMD Ryzen 7 5800X 8-Core Processor, 16 threads\n",
"GPU NVIDIA GeForce RTX 3060\n",
"System Linux 7.0.0-38-generic\n",
"torch 2.11.0+cu128, 8 threads\n",
"Python 3.14.4\n",
"R R version 4.5.2 (2025-10-31)\n",
"R package psp 1.0.6 (CRAN), OSCAR compiled with Rcpp::so..."
]
},
"execution_count": 9,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"def r_version():\n",
" try:\n",
" return subprocess.run([\"Rscript\", \"-e\", \"cat(R.version.string)\"], capture_output=True, text=True,\n",
" timeout=60).stdout.strip() or \"not found\"\n",
" except OSError:\n",
" return \"not found\"\n",
"\n",
"\n",
"def cpu_name():\n",
" try:\n",
" return next(line.split(\":\", 1)[1].strip() for line in open(\"/proc/cpuinfo\") if line.startswith(\"model name\"))\n",
" except (OSError, StopIteration):\n",
" return platform.processor() or \"unknown\"\n",
"\n",
"\n",
"pd.DataFrame({\"\": {\n",
" \"CPU\": f\"{cpu_name()}, {os.cpu_count()} threads\",\n",
" \"GPU\": torch.cuda.get_device_name(0) if torch.cuda.is_available() else \"none\",\n",
" \"System\": f\"{platform.system()} {platform.release()}\",\n",
" \"torch\": f\"{torch.__version__}, {torch.get_num_threads()} threads\",\n",
" \"Python\": platform.python_version(),\n",
" \"R\": r_version(),\n",
" \"R package\": \"psp 1.0.6 (CRAN), OSCAR compiled with Rcpp::sourceCpp() at R's default -O2\",\n",
"}}).rename_axis(\"Environment\")"
]
},
{
"cell_type": "markdown",
"id": "85cfddd8",
"metadata": {},
"source": "The results are from this machine, measured with nothing else running. To measure them again (about 15 minutes), install the R package into its own library, run the benchmark and re-execute this notebook:\n\n```sh\nRscript -e 'install.packages(\"psp\", lib = \"benchmarks/oscar/r-lib\", repos = \"https://cloud.r-project.org\")'\nuv run python benchmarks/oscar/run.py --r-library benchmarks/oscar/r-lib\nuv run python notebooks/execute.py benchmarks-oscar.ipynb\n```\n\n`--participants`, `--starts`, `--iterations` and `--workers` change the routine's settings; [benchmarks/oscar/README.md](https://github.com/lenarddome/psp-torch/blob/main/benchmarks/oscar/README.md) describes every script."
},
{
"cell_type": "markdown",
"id": "b1c9fe2a",
"metadata": {},
"source": "## References\n\nDome, L., & Wills, A. J. (2026). Errorless Irrationality: A unified computational account of the inverse base-rate effect across predictive, observational, and unsupervised procedures (arXiv:2608.06149). arXiv. [https://doi.org/10.48550/arXiv.2608.06149](https://doi.org/10.48550/arXiv.2608.06149)"
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.14.4"
}
},
"nbformat": 4,
"nbformat_minor": 5
}