{
  "cells": [
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "# Why market-size estimates disagree: calculation notebook\n\n",
        "New Eruditions • research checked 30 September 2026 (Asia/Singapore) • Article 01 supporting calculation record.\n\n",
        "This notebook reproduces our arithmetic from printed public values; it does not reproduce either analyst's model. Source IDs refer to `sources.json` and the source dossier. Every record carries its formula, inputs, assumption, status and reader-facing rounding. Exact decimal intermediates are computational values, not claims of empirical precision.\n\n",
        "Important: C08 is deliberately retained as a rejected inference. Synergy's 30% FX-adjusted growth cannot be applied directly to its printed dollar total to recover a nominal baseline. C14–C16 vendor amounts and intervals are diagnostics under stated share/rounding assumptions. Neither intervals nor differences are confidence measures.\n\n",
        "Run the cell below with Python 3 (standard library only). It saves calculation-results.json and .csv beside the script or in the notebook's working directory. This saved notebook includes execution output from the bundled Python runtime.\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 1,
      "metadata": {},
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "C01 | Printed-total gap | $8.2bn | DERIVED\n",
            "C02 | Gap relative to Omdia | about 7.4% | DERIVED\n",
            "C03 | Gap relative to Synergy | about 6.9% | DERIVED\n",
            "C04 | Symmetric percentage difference | about 7.1% | DERIVED\n",
            "C05a | Gap lower rounding bound | $8.1bn boundary | SENSITIVITY\n",
            "C05b | Gap upper rounding bound | $8.3bn boundary | SENSITIVITY\n",
            "C06 | Omdia conditional prior-year level | about $86.0bn | CONDITIONAL\n",
            "C07a | Omdia implied prior lower bound | about $85.6bn | CONDITIONAL\n",
            "C07b | Omdia implied prior upper bound | about $86.3bn | CONDITIONAL\n",
            "C08 | Rejected Synergy reverse-growth calculation | $91.6bn mechanically, rejected as baseline | REJECTED INFERENCE\n",
            "C09 | Synergy rough prior from printed dollar increment | about $90.1bn | CONDITIONAL\n",
            "C10 | Change between Synergy release vintages | about 31.5% | CROSS-VINTAGE\n",
            "C11 | Dollar change across release vintages | $28.5bn | CROSS-VINTAGE\n",
            "C12 | Annual average quarter, not Q4 | about $104.8bn | ILLUSTRATION\n",
            "C13 | Q4 annualized scale, not full-year revenue | $476.4bn annualized | ILLUSTRATION\n",
            "C14S | Amazon: implied S eligible amount | about $33.3bn | DERIVED\n",
            "C14S-low | Amazon: S rounding low | $32.74bn boundary | SENSITIVITY\n",
            "C14S-high | Amazon: S rounding high | $33.96bn boundary | SENSITIVITY\n",
            "C14O | Amazon: implied O eligible amount | about $35.5bn | DERIVED\n",
            "C14O-low | Amazon: O rounding low | $34.92bn boundary | SENSITIVITY\n",
            "C14O-high | Amazon: O rounding high | $36.06bn boundary | SENSITIVITY\n",
            "C14P | Amazon: Synergy share if Omdia numerator unchanged | about 29.8% | COUNTERFACTUAL\n",
            "C15S | Microsoft: implied S eligible amount | about $25.0bn | DERIVED\n",
            "C15S-low | Microsoft: S rounding low | $24.41bn boundary | SENSITIVITY\n",
            "C15S-high | Microsoft: S rounding high | $25.62bn boundary | SENSITIVITY\n",
            "C15O | Microsoft: implied O eligible amount | about $24.4bn | DERIVED\n",
            "C15O-low | Microsoft: O rounding low | $23.83bn boundary | SENSITIVITY\n",
            "C15O-high | Microsoft: O rounding high | $24.96bn boundary | SENSITIVITY\n",
            "C15P | Microsoft: Synergy share if Omdia numerator unchanged | about 20.5% | COUNTERFACTUAL\n",
            "C16S | Google: implied S eligible amount | about $16.7bn | DERIVED\n",
            "C16S-low | Google: S rounding low | $16.07bn boundary | SENSITIVITY\n",
            "C16S-high | Google: S rounding high | $17.28bn boundary | SENSITIVITY\n",
            "C16O | Google: implied O eligible amount | about $13.3bn | DERIVED\n",
            "C16O-low | Google: O rounding low | $12.75bn boundary | SENSITIVITY\n",
            "C16O-high | Google: O rounding high | $13.87bn boundary | SENSITIVITY\n",
            "C16P | Google: Synergy share if Omdia numerator unchanged | about 11.2% | COUNTERFACTUAL\n",
            "C17 | AWS company segment unit normalization | $35.579bn | DERIVED\n",
            "C18S | AWS segment minus Synergy implied amount | about $2.2bn | DIAGNOSTIC\n",
            "C18O | AWS segment minus Omdia implied amount | about $0.1bn | DIAGNOSTIC\n",
            "C19S | Sum of Synergy full-market top-three shares | about 63% | DERIVED\n",
            "C19O | Sum of Omdia full-market top-three shares | about 66% | DERIVED\n",
            "C20 | Publication-date interval | 49 days | DERIVED\n",
            "Verified 42 calculation records; wrote JSON and CSV.\n"
          ]
        }
      ],
      "source": [
        "\"\"\"Reproduce the New Eruditions public-release comparison.\n",
        "Standard library only. Run: python calculations.py\n",
        "This verifies arithmetic, not either analyst's proprietary model.\n",
        "\"\"\"\n",
        "from decimal import Decimal, getcontext\n",
        "from datetime import date\n",
        "from pathlib import Path\n",
        "import json\n",
        "import csv\n",
        "\n",
        "getcontext().prec = 28\n",
        "D = Decimal\n",
        "S = D(\"119.1\")  # S1 Q4 2025 body, billion dollars\n",
        "O = D(\"110.9\")  # S2 Q4 2025, US$ billion\n",
        "sy_prior = D(\"90.6\")  # S8 original Q4 2024 release, older vintage\n",
        "aws_million = D(\"35579\")  # S9 company segment disclosure, millions\n",
        "rows = []\n",
        "\n",
        "def add(cid, name, formula, inputs, result, assumption, display, status=\"DERIVED\"):\n",
        "    rows.append(dict(id=cid, name=name, formula=formula, source_inputs=inputs,\n",
        "                     result=str(result), assumption=assumption, display=display, status=status))\n",
        "    return result\n",
        "\n",
        "common = \"Use printed body values; treat S1 $ as USD. Rounded estimates, not exact census values.\"\n",
        "gap = add(\"C01\", \"Printed-total gap\", \"S - O\", \"S1:119.1; S2:110.9\", S-O, common, \"$8.2bn\")\n",
        "pct_o = add(\"C02\", \"Gap relative to Omdia\", \"(S-O)/O*100\", \"C01; S2:110.9\", gap/O*100, common, \"about 7.4%\")\n",
        "pct_s = add(\"C03\", \"Gap relative to Synergy\", \"(S-O)/S*100\", \"C01; S1:119.1\", gap/S*100, common, \"about 6.9%\")\n",
        "sym = add(\"C04\", \"Symmetric percentage difference\", \"(S-O)/((S+O)/2)*100\", \"S1; S2\", gap/((S+O)/2)*100, \"Mean is an arithmetic denominator, not a best estimate.\", \"about 7.1%\")\n",
        "\n",
        "rounding = \"Sensitivity only: assume nearest $0.1bn rounding, independently; actual rounding rules undisclosed. Bounds are not confidence intervals.\"\n",
        "low_s, high_s = S-D(\".05\"), S+D(\".05\")\n",
        "low_o, high_o = O-D(\".05\"), O+D(\".05\")\n",
        "add(\"C05a\", \"Gap lower rounding bound\", \"(S-.05)-(O+.05)\", \"S1; S2\", low_s-high_o, rounding, \"$8.1bn boundary\", \"SENSITIVITY\")\n",
        "add(\"C05b\", \"Gap upper rounding bound\", \"(S+.05)-(O-.05)\", \"S1; S2\", high_s-low_o, rounding, \"$8.3bn boundary\", \"SENSITIVITY\")\n",
        "add(\"C06\", \"Omdia conditional prior-year level\", \"O/(1+.29)\", \"S2:110.9;29%\", O/D(\"1.29\"),\n",
        "    \"29% assumed exact and same currency/coverage/vintage basis as level. Omdia does not disclose full FX policy.\", \"about $86.0bn\", \"CONDITIONAL\")\n",
        "growth_rounding = \"Assume nearest $0.1bn and nearest whole percentage-point growth, plus same-basis growth. Sensitivity, not source observation.\"\n",
        "add(\"C07a\", \"Omdia implied prior lower bound\", \"(O-.05)/(1+.295)\", \"S2\", low_o/D(\"1.295\"), growth_rounding, \"about $85.6bn\", \"CONDITIONAL\")\n",
        "add(\"C07b\", \"Omdia implied prior upper bound\", \"(O+.05)/(1+.285)\", \"S2\", high_o/D(\"1.285\"), growth_rounding, \"about $86.3bn\", \"CONDITIONAL\")\n",
        "add(\"C08\", \"Rejected Synergy reverse-growth calculation\", \"S/(1+.30)\", \"S1:119.1;30%\", S/D(\"1.30\"),\n",
        "    \"NOT a valid nominal Q4 2024 estimate: S1 30% backs out FX effects and no level bridge is published.\", \"$91.6bn mechanically, rejected as baseline\", \"REJECTED INFERENCE\")\n",
        "add(\"C09\", \"Synergy rough prior from printed dollar increment\", \"S-29\", \"S1:119.1;29bn increase\", S-D(\"29\"),\n",
        "    \"Treat rounded $29bn increment as central value. Not an exact baseline or confirmed revision.\", \"about $90.1bn\", \"CONDITIONAL\")\n",
        "add(\"C10\", \"Change between Synergy release vintages\", \"(S/90.6-1)*100\", \"S1:119.1; S8:90.6\", (S/sy_prior-1)*100,\n",
        "    \"Older printed baseline. Cross-vintage dollar arithmetic; not source-reported 2026 FX-adjusted growth.\", \"about 31.5%\", \"CROSS-VINTAGE\")\n",
        "add(\"C11\", \"Dollar change across release vintages\", \"S-90.6\", \"S1; S8\", S-sy_prior,\n",
        "    \"Older printed baseline; discrepancy with rounded $29bn is not proof of revision.\", \"$28.5bn\", \"CROSS-VINTAGE\")\n",
        "add(\"C12\", \"Annual average quarter, not Q4\", \"419/4\", \"S1 full-year:419\", D(\"419\")/4,\n",
        "    \"Arithmetic average of four quarters, not a substitute for observed Q4.\", \"about $104.8bn\", \"ILLUSTRATION\")\n",
        "add(\"C13\", \"Q4 annualized scale, not full-year revenue\", \"S*4\", \"S1:119.1\", S*4,\n",
        "    \"Assume Q4 pace repeated for four quarters; not a forecast or observed annual total.\", \"$476.4bn annualized\", \"ILLUSTRATION\")\n",
        "\n",
        "shares = {\"Amazon\": (D(\"28\"), D(\"32\")), \"Microsoft\": (D(\"21\"), D(\"22\")), \"Google\": (D(\"14\"), D(\"12\"))}\n",
        "vendor_ranges = {}\n",
        "for idx, (vendor, (ss, os)) in enumerate(shares.items(), start=14):\n",
        "    for tag, total, sh, low, high in [(\"S\", S, ss, low_s, high_s), (\"O\", O, os, low_o, high_o)]:\n",
        "        implied = total*sh/100\n",
        "        add(f\"C{idx}{tag}\", f\"{vendor}: implied {tag} eligible amount\", \"total*share/100\",\n",
        "            f\"{'S1' if tag=='S' else 'S2'}:{total};share:{sh}%\", implied,\n",
        "            \"Rounded share applied to its own full-market total; inferred eligible amount, not disclosed company revenue.\",\n",
        "            f\"about ${implied.quantize(D('.1'))}bn\")\n",
        "        lo = low*(sh-D(\".5\"))/100\n",
        "        hi = high*(sh+D(\".5\"))/100\n",
        "        vendor_ranges[(vendor,tag)] = (lo,hi)\n",
        "        for edge, value in [(\"low\",lo),(\"high\",hi)]:\n",
        "            add(f\"C{idx}{tag}-{edge}\", f\"{vendor}: {tag} rounding {edge}\",\n",
        "                \"(total +/- .05)*(share +/- .5)/100\",\n",
        "                f\"{'S1' if tag=='S' else 'S2'}\", value,\n",
        "                rounding+\" Also assume nearest whole percent share rounding.\",\n",
        "                f\"${value.quantize(D('.01'))}bn boundary\", \"SENSITIVITY\")\n",
        "    predicted = O*os/S\n",
        "    add(f\"C{idx}P\", f\"{vendor}: Synergy share if Omdia numerator unchanged\",\n",
        "        \"O*O_share/S\", f\"S1 total; S2 total and {vendor} share\", predicted,\n",
        "        \"Counterfactual: all vendor numerator values unchanged; only denominator differs. Not actual normalized share.\",\n",
        "        f\"about {predicted.quantize(D('.1'))}%\", \"COUNTERFACTUAL\")\n",
        "\n",
        "aws = add(\"C17\", \"AWS company segment unit normalization\", \"35579/1000\", \"S9:35579 million\", aws_million/1000,\n",
        "          \"Company segment total; scope equivalence to analyst numerator not established.\", \"$35.579bn\")\n",
        "add(\"C18S\", \"AWS segment minus Synergy implied amount\", \"35.579-119.1*.28\", \"S9; S1\", aws-S*D(\".28\"),\n",
        "    \"Scope diagnostic only; cannot label difference omitted AWS revenue or estimation error.\", \"about $2.2bn\", \"DIAGNOSTIC\")\n",
        "add(\"C18O\", \"AWS segment minus Omdia implied amount\", \"35.579-110.9*.32\", \"S9; S2\", aws-O*D(\".32\"),\n",
        "    \"Near match after rounding is not proof Omdia uses full AWS segment revenue.\", \"about $0.1bn\", \"DIAGNOSTIC\")\n",
        "add(\"C19S\", \"Sum of Synergy full-market top-three shares\", \"28+21+14\", \"S1 shares\", D(\"28\")+D(\"21\")+D(\"14\"),\n",
        "    \"Sum of rounded shares; S1 separately says 68% in public IaaS/PaaS submarket.\", \"about 63%\")\n",
        "add(\"C19O\", \"Sum of Omdia full-market top-three shares\", \"32+22+12\", \"S2 shares; S17 chart\", D(\"32\")+D(\"22\")+D(\"12\"),\n",
        "    \"Sum of rounded shares; consistent with S17.\", \"about 66%\")\n",
        "add(\"C20\", \"Publication-date interval\", \"2026-03-26 minus 2026-02-05\", \"S1; S2\", D((date(2026,3,26)-date(2026,2,5)).days),\n",
        "    \"49 elapsed days; no inference about causal revisions or missing earnings.\", \"49 days\")\n",
        "\n",
        "# Arithmetic consistency and counterfactual checks; these do not validate analyst models.\n",
        "assert gap == D(\"8.2\")\n",
        "assert S*D(\".28\") == D(\"33.348\")\n",
        "assert O*D(\".32\") == D(\"35.488\")\n",
        "assert S*D(\".14\") == D(\"16.674\")\n",
        "assert O*D(\".12\") == D(\"13.308\")\n",
        "assert aws == D(\"35.579\")\n",
        "assert vendor_ranges[(\"Amazon\",\"S\")][1] < vendor_ranges[(\"Amazon\",\"O\")][0]\n",
        "assert vendor_ranges[(\"Google\",\"O\")][1] < vendor_ranges[(\"Google\",\"S\")][0]\n",
        "assert low_s-high_o > 0\n",
        "assert len({r[\"id\"] for r in rows}) == len(rows)\n",
        "\n",
        "if __name__ == \"__main__\":\n",
        "    output = Path(__file__).resolve().parent if \"__file__\" in globals() else Path.cwd()\n",
        "    (output/\"calculation-results.json\").write_text(json.dumps(rows,indent=2), encoding=\"utf-8\")\n",
        "    with (output/\"calculation-results.csv\").open(\"w\",newline=\"\",encoding=\"utf-8-sig\") as f:\n",
        "        writer=csv.DictWriter(f, fieldnames=list(rows[0]))\n",
        "        writer.writeheader()\n",
        "        writer.writerows(rows)\n",
        "    for row in rows:\n",
        "        print(row[\"id\"]+\" | \"+row[\"name\"]+\" | \"+row[\"display\"]+\" | \"+row[\"status\"])\n",
        "    print(f\"Verified {len(rows)} calculation records; wrote JSON and CSV.\")\n"
      ]
    }
  ],
  "metadata": {
    "kernelspec": {
      "display_name": "Python 3",
      "language": "python",
      "name": "python3"
    },
    "language_info": {
      "name": "python",
      "version": "3"
    }
  },
  "nbformat": 4,
  "nbformat_minor": 5
}