feat(report): update extrapolation parameters and scoring in README

- revise hardware prices and parameters in extrapolate.py
- enhance scoring details in README for task 11
- clarify projected scoreboard values and sources
- improve chart readability and scoring methodology in report.py
- add new utility functions for formatting and reading hardware prices
This commit is contained in:
administrator
2026-07-11 23:57:41 -04:00
parent af91629f71
commit 35d2bdadbd
4 changed files with 275 additions and 147 deletions

View File

@@ -79,15 +79,29 @@ LAWS = {
("csv", 7): "scan", ("json", 7): "scan", ("sqlite", 7): "scan", ("pg", 7): "scan_parallel", ("rdf", 7): "scan",
}
HW_PRICES_DEFAULT = """# Hardware cost parameters for extrapolation (task 10) - June 2026 defaults.
HW_PRICES_DEFAULT = """# Hardware cost parameters for extrapolation (task 10).
# Street prices retrieved 2026-07-11 from the sources below (server DRAM is
# in a documented 2025-2026 price surge - see market_context). The cost
# model buys whole components: 64 GB RDIMM modules and 7.68 TB NVMe drives.
# Operator-editable; re-run extrapolate.py after changes (code-config-yaml).
ram_usd_per_gb: 14.0
nvme_usd_per_tb: 250.0
server_16_core_usd: 6000.0
server_32_core_usd: 10000.0
extra_node_usd: 6000.0
as_of: "2026-07-11"
ram_module_gb: 64
ram_module_usd: 1887.0 # A-Tech 64GB (2x32GB) DDR5-5600 ECC RDIMM
nvme_drive_tb: 7.68
nvme_drive_usd: 3995.0 # Cloud Ninjas NEW 7.68TB NVMe U.2 1DWPD (Dell 14-16G)
server_16_core_usd: 4618.0 # Supermicro AS-1015CS-TNR 1U (EPYC 9004/9005), Broadberry starting config
server_32_core_usd: 6272.0 # Supermicro AS-1115CS-TNR 1U, Broadberry starting config
extra_node_usd: 4618.0 # one additional entry 1U node (AS-1015CS-TNR chassis)
sources:
ram: https://atechmemory.com/collections/ddr5-memory-ram
nvme: https://cloudninjas.com/products/new-7-68tb-nvme-u-2-1dwpd-sie-2-5-enterprise-solid-state-drive-for-14th-15th-16th-gen-dell
servers: https://www.broadberry.com/amd-epyc-9004-supermicro-servers
market_context: https://www.techpowerup.com/342331/server-dram-pricing-jumps-50-only-70-of-orders-getting-filled
"""
HW_PRICE_KEYS = ("ram_usd_per_gb", "nvme_usd_per_tb", "server_16_core_usd", "server_32_core_usd", "extra_node_usd")
HW_PRICE_KEYS = (
"as_of", "ram_module_gb", "ram_module_usd", "nvme_drive_tb", "nvme_drive_usd",
"server_16_core_usd", "server_32_core_usd", "extra_node_usd", "sources",
)
def read_medians(path: Path) -> dict[tuple[str, int], float]:
@@ -222,7 +236,8 @@ def main() -> int:
with open(bench_dir / "hardware_sizing.csv", "w", encoding="ascii", newline="") as fh:
writer = csv.writer(fh)
writer.writerow(["format", "scale_gb", "disk_tb", "ram_gb", "cores", "nodes", "est_cost_usd"])
writer.writerow(["format", "scale_gb", "disk_tb", "ram_gb", "cores", "nodes",
"est_cost_usd", "ram_modules", "nvme_drives", "base_usd", "ram_usd", "disk_usd", "extra_nodes_usd"])
for scale_gb in SCALES_GB:
r = scale_gb * 1e9 / csv_bytes
for fmt in FORMATS:
@@ -238,11 +253,17 @@ def main() -> int:
ram_gb = max(MIN_RAM_GB, RDF_HOT_FRACTION * fmt_bytes / 1e9)
cores = pick_pg_cores(medians, overhead, r, n0) if fmt == "pg" else CORE_OPTIONS[0]
nodes = max(1, math.ceil(ram_gb / NODE_RAM_CEILING_GB))
server_usd = prices["server_16_core_usd"] if cores == 16 else prices["server_32_core_usd"]
cost = (server_usd + ram_gb * prices["ram_usd_per_gb"]
+ disk_tb * prices["nvme_usd_per_tb"]
+ (nodes - 1) * prices["extra_node_usd"])
writer.writerow([fmt, scale_gb, round(disk_tb, 3), round(ram_gb, 1), cores, nodes, round(cost)])
# bill of materials: whole RDIMM modules and whole NVMe drives
ram_modules = math.ceil(ram_gb / prices["ram_module_gb"])
nvme_drives = math.ceil(disk_tb / prices["nvme_drive_tb"])
base_usd = prices["server_16_core_usd"] if cores == 16 else prices["server_32_core_usd"]
ram_usd = ram_modules * prices["ram_module_usd"]
disk_usd = nvme_drives * prices["nvme_drive_usd"]
extra_nodes_usd = (nodes - 1) * prices["extra_node_usd"]
cost = base_usd + ram_usd + disk_usd + extra_nodes_usd
writer.writerow([fmt, scale_gb, round(disk_tb, 3), round(ram_gb, 1), cores, nodes,
round(cost), ram_modules, nvme_drives,
round(base_usd), round(ram_usd), round(disk_usd), round(extra_nodes_usd)])
entries = {
"extrapolation_rows": len(SCALES_GB) * len(FORMATS) * len(QUERY_NUMBERS),
@@ -252,6 +273,7 @@ def main() -> int:
"flags_fail": flags["FAIL"],
"pg_index_share": round(index_share, 3),
"pg_index_mb": round(pg_index_bytes / 1048576, 1),
"prices_as_of": prices["as_of"],
"note_pandas": "pandas CSV variant not measured; its RAM is O(n) - infeasible above ~10 GB (spec 10)",
}
for fmt in FORMATS: