From 6d156f98c42d18577e34039a083d57d60aa53582 Mon Sep 17 00:00:00 2001 From: administrator Date: Mon, 13 Jul 2026 00:19:02 -0400 Subject: [PATCH] feat(docs): add management summary link in evaluation documents - include link to one-page executive summary in README - update dashboard section in evaluation HTML to reference summary - revise report metadata to reflect additional CSV tables generated --- README.md | 5 + docs/research/Tribology_Storage_Decision.html | 258 ++++++++++++++++++ .../Tribology_Storage_Decision_Facts.html | 131 +++++++++ .../Tribology_Storage_Evaluation.html | 4 +- out/.done/11.ok | 2 +- out/report/tables/t6_projected_all_scales.csv | 106 +++++++ out/report/tables/t7_hardware_all_scales.csv | 16 ++ report.py | 21 +- 8 files changed, 538 insertions(+), 5 deletions(-) create mode 100644 docs/research/Tribology_Storage_Decision.html create mode 100644 docs/research/Tribology_Storage_Decision_Facts.html create mode 100644 out/report/tables/t6_projected_all_scales.csv create mode 100644 out/report/tables/t7_hardware_all_scales.csv diff --git a/README.md b/README.md index b304a08..f96619d 100644 --- a/README.md +++ b/README.md @@ -14,6 +14,11 @@ and inter-lab exchange. **Results - interactive, single-file HTML (open in a browser or download and share):** +- **[Storage Decision](https://git.boskadoff.com/Public/LabDataStorageEvaluation/raw/branch/master/docs/research/Tribology_Storage_Decision.html)** - + one-page executive summary: the problem, the verdict (relational vs graph + database), and what it costs - written for management, every claim linked + to the full study + (source: [docs/research/Tribology_Storage_Decision.html](docs/research/Tribology_Storage_Decision.html)). - **[Storage Format Evaluation](https://git.boskadoff.com/Public/LabDataStorageEvaluation/raw/branch/master/docs/research/Tribology_Storage_Evaluation.html)** - the full study results: dashboard, measured matrix, projections to 6 TB, hardware bill of materials, weighted scoring and verdict diff --git a/docs/research/Tribology_Storage_Decision.html b/docs/research/Tribology_Storage_Decision.html new file mode 100644 index 0000000..9a07b43 --- /dev/null +++ b/docs/research/Tribology_Storage_Decision.html @@ -0,0 +1,258 @@ + + + + + +Storage Decision - Executive Summary + + + + + + + +
+ +
+ Storage Decision + Executive summary · laboratory measurement data +
+ +
+ +
+ +

Which database should hold the laboratory's data?

+ +
+
+
THE PROBLEM
+

600 GB of laboratory data today.
6 TB within a few years.
It needs one working database.

+
+
+
THE CANDIDATES
+

Relational (PostgreSQL)
vs
Graph (RDF triplestore).

+
+
+ +
+
+
+

Decision: Relational vs Graph (RDF):

+ + + + + + + + + + + + + + + + + + + + + + + + + +
Relational (PostgreSQL)Graph (RDF)
Average report, today~6 seconds~1.6 hours
Average report at 6 TB~30 seconds~12 hours
Hardware at 6 TBone ordinary servera 14-server cluster
Ontologyremains accessible with Relational (PostgreSQL)
+
+
+ +
+
faster on the average everyday report
+
hardware at 6 TB: $33.6k for PGSQL server instead of a $527.7k RDF cluster
+
servers needed at 6 TB
+
+ +
+

Side by side

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Relational (PostgreSQL)
✓ recommended
Graph (RDF triplestore)
✗ rejected at scale
Average report, todayat 600 GBabout 6 secondsabout 1.6 hours; 3 of 7 tasks need more than a daydetails →
Average report at 6 TBthe 3-year horizonabout 30 secondsabout 12 hours; 5 of 7 tasks need a day or moredetails →
Servers needed todayat 600 GBone standard server, $10.5kalready two servers with 1.4 TB of memory, $58.7kdetails →
Servers at 6 TBstill one server, $33.6ka 14-server cluster, $527.7kdetails →
Disk for the same dataat 6 TB21 TB91 TB - the graph form stores the same data 4.4x biggerdetails →
+
+ +
+

Average everyday report

+
+
+

Today · 600 GB

+
+
PostgreSQL
+ +
+
+
Graph (RDF)
+ +
+
+
+

In a few years · 6 TB

+
+
PostgreSQL
+ +
+
+
Graph (RDF)
+ +
+
+
+

Bars are to scale within each panel - the blue bar is real, it is just that small. An everyday report that takes hours is a report nobody runs.

+
+ +
+

What about the other formats?

+

CSV stays exactly where it belongs - the raw archive coming off the instruments (best compression, byte-reproducible). JSON-LD stays the exchange format for sending data between laboratories. Neither is a working database, so neither was a candidate. SQLite is excellent for a single user up to ~600 GB but does not scale to the shared 6 TB horizon.

+

And the ontology? It survives intact: semantic, ontology-style access is provided as a virtual layer on top of PostgreSQL (e.g. Ontop OBDA) - the graph view without the graph database's cost.

+
+ +
+

Recommended next steps

+
    +
  1. Adopt PostgreSQL as the system of record for laboratory measurement data; keep the raw CSV archive as the source of truth for reprocessing.
  2. +
  3. Provide ontology and semantic queries as a virtual RDF layer over PostgreSQL - no data is copied into a triplestore.
  4. +
  5. Revisit hardware once volume approaches 6 TB: the measured plan is one 16-core server with 551 GB RAM (~$33.6k at July 2026 prices).
  6. +
+
+ +
+ Figures at 600 GB and 6 TB are model projections calibrated on a measured benchmark (7 everyday retrieval tasks x 5 storage formats, every result checksum-validated); the "average report" is the geometric mean of the seven tasks, the same averaging the study's scoring uses. Method, raw data and hardware price sources: facts ledger (every number traced to its artifact) · full interactive study · git.boskadoff.com/Public/LabDataStorageEvaluation.
+ Study: Mary Goncharenko (Tribology Laboratory, University of Florida; internship at Sandia National Laboratories), with the technical assistance of Vasiliy Goncharenko (SoftCreator, LLC). +
+ +
+ + diff --git a/docs/research/Tribology_Storage_Decision_Facts.html b/docs/research/Tribology_Storage_Decision_Facts.html new file mode 100644 index 0000000..04c9676 --- /dev/null +++ b/docs/research/Tribology_Storage_Decision_Facts.html @@ -0,0 +1,131 @@ + + + + + +Decision Facts Ledger - Storage Decision + + + + + + + +
+ +
+ Decision Facts Ledger + Every fact on the Storage Decision page · value, formula, source +
+ +
+ +
+ +

Decision Facts Ledger

+

Every number shown on the Storage Decision executive summary, traced to the artifact that proves it. All source files are committed in the public repository and regenerate deterministically from seed 20260711. Projection tables carry one row per format x task x scale; "geometric mean" is the same averaging the study's scoring uses.

+

Sources: t6 = t6_projected_all_scales.csv · t7 = t7_hardware_all_scales.csv · t1 = t1_storage_footprint.csv · prices = hw_prices.yaml · spec = 10_extrapolation_model.md

+ +

Premises

+
+ + + + +
IDFact on the pageExact valueHow obtainedSource
P1"600 GB of laboratory data today"600 GBThe laboratory's current operational volume; also the first extrapolation scale of the study (scale_gb = 600).spec, t6
P2"6 TB within a few years"6,000 GBThe largest extrapolation scale of the study (scale_gb = 6000), the growth horizon.spec, t6
+
+ +

Performance (average everyday report)

+
+ + + + + + + + +
IDFact on the pageExact valueHow obtainedSource
F1PostgreSQL, average report today: "~6 seconds"5.66 sGeometric mean of the 7 projected_wall_s values where format = PostgreSQL, scale_gb = 600.t6
F2PostgreSQL, average report at 6 TB: "~30 seconds"29.6 sGeometric mean, format = PostgreSQL, scale_gb = 6000.t6
F3Graph (RDF), average report today: "~1.6 hours"5,902 s = 1.64 hGeometric mean, format = RDF triplestore, scale_gb = 600.t6
F4Graph (RDF), average report at 6 TB: "~12 hours"43,157 s = 11.99 hGeometric mean, format = RDF triplestore, scale_gb = 6000.t6
F5"3 of 7 tasks need more than a day" (RDF, today)q3 2.1 d · q5 2.8 d · q7 1.9 dCount of RDF rows at scale_gb = 600 with projected_wall_s > 86,400.t6
F6"5 of 7 tasks need a day or more" (RDF, 6 TB)q2, q3, q4, q5, q7Count of RDF rows at scale_gb = 6000 with projected_wall_s >= 86,400.t6
+
+ +

Hardware and cost

+
+ + + + + + + +
IDFact on the pageExact valueHow obtainedSource
F7"one standard server, $10.5k" (PostgreSQL, today)$10,500 · 1 nodeRow format = PostgreSQL, scale_gb = 600: est_cost_usd, nodes; bill of materials in the configuration column.t7
F8"already two servers with 1.4 TB of memory, $58.7k" (RDF, today)$58,740 · 2 nodes · 1,404.1 GB RAMRow format = RDF triplestore, scale_gb = 600: est_cost_usd, nodes, ram_gb.t7
F9"still one server, $33.6k" / "one 16-core server with 551 GB RAM" (PostgreSQL, 6 TB)$33,586 · 1 node · 16 cores · 551.3 GBRow format = PostgreSQL, scale_gb = 6000: est_cost_usd, nodes, cores, ram_gb.t7
F10"a 14-server cluster, $527.7k" (RDF, 6 TB)$527,732 · 14 nodesRow format = RDF triplestore, scale_gb = 6000: est_cost_usd, nodes.t7
F11"July 2026 prices"as_of 2026-07-11Street prices with per-component source URLs recorded in the operator-editable price file.prices
+
+ +

Storage

+
+ + + + + +
IDFact on the pageExact valueHow obtainedSource
F12"21 TB" disk (PostgreSQL, 6 TB)20.855 TBRow format = PostgreSQL, scale_gb = 6000: disk_tb (includes 30% free-space headroom).t7
F13"91 TB" disk (RDF, 6 TB)91.268 TBRow format = RDF triplestore, scale_gb = 6000: disk_tb.t7
F14"stores the same data 4.4x bigger"11.70 / 2.67 = 4.38Ratio of the measured working-footprint coefficients vs raw CSV (RDF 11.70x over PostgreSQL 2.67x).t1
+
+ +

Headline figures

+
+ + + + + +
IDFact on the pageExact valueHow obtainedSource
K1"1,000x faster on the average everyday report"1,043x today · 1,459x at 6 TBF3 / F1 = 5,902 / 5.66; F4 / F2 = 43,157 / 29.6. Stated conservatively as 1,000x.t6
K2"$494k saved" (hardware at 6 TB)$494,146F10 - F9 = 527,732 - 33,586.t7
K3"1 vs 14 servers needed at 6 TB"nodes: 1 vs 14nodes column, rows PostgreSQL/6000 and RDF triplestore/6000.t7
+
+ +

Notes

+
+ + + + +
IDFact on the pageExact valueHow obtainedSource
N1"SQLite is excellent for a single user up to ~600 GB"all 7 tasks OK at 600 GB; q5 = 1.6 h, q7 = 1.5 h at 1.2 TBSQLite rows in t6: every flag OK at scale_gb = 600; its single-threaded full scans exceed the 1-hour bound from scale_gb = 1200.t6
N2Method behind every projected numbermeasured 35-cell benchmarkScaling laws calibrated on the measured corpus; every measured run checksum-validated. Full methodology and measured medians in the interactive study.full study
+
+ +
+ Part of the LabDataStorageEvaluation study · run of 2026-07-11, seed 20260711 · canonical source: git.boskadoff.com/Public/LabDataStorageEvaluation.
+ Study: Mary Goncharenko (Tribology Laboratory, University of Florida; internship at Sandia National Laboratories), with the technical assistance of Vasiliy Goncharenko (SoftCreator, LLC). +
+ +
+ + diff --git a/docs/research/Tribology_Storage_Evaluation.html b/docs/research/Tribology_Storage_Evaluation.html index 8151972..8ef65f1 100644 --- a/docs/research/Tribology_Storage_Evaluation.html +++ b/docs/research/Tribology_Storage_Evaluation.html @@ -151,7 +151,7 @@

Dashboard

-

A 141.8 MiB physically plausible CSV corpus (the canonical raw format) was converted into four other storage formats and benchmarked on seven laboratory retrieval scenarios with subprocess-isolated resource metering; results were extrapolated to 600 GB, 1.2 TB and 6 TB. Every measured run validated its rows against canonical results (PostgreSQL cross-validated with SQLite, tolerance 1e-9).

+

A 141.8 MiB physically plausible CSV corpus (the canonical raw format) was converted into four other storage formats and benchmarked on seven laboratory retrieval scenarios with subprocess-isolated resource metering; results were extrapolated to 600 GB, 1.2 TB and 6 TB. Every measured run validated its rows against canonical results (PostgreSQL cross-validated with SQLite, tolerance 1e-9). Short on time? The one-page management summary is Storage Decision.

Benchmark cells
35 / 35
OK; 0 invalid, 0 timeouts
Corpus
141.8 MiB
8,718 CSV files, byte-reproducible
@@ -450,7 +450,7 @@

Data statement

The measurement corpus is simulated: physically plausible models of a Pt-Au LDRD tribology study context at Sandia National Laboratories, generated from a fixed random seed. It contains no experimental measurements and no export-controlled data. Hardware prices cited in the cost model are public street prices retrieved 2026-07-11 (sources in the Hardware & Cost section).

-

Related study in the same repository: Foreign-Key Architecture Study.

+

Companion pages in the same repository: Storage Decision (one-page executive summary) · Foreign-Key Architecture Study.

Standalone distributable file. If you received this document outside the repository, the canonical source is git.boskadoff.com/Public/LabDataStorageEvaluation.
diff --git a/out/.done/11.ok b/out/.done/11.ok index ccb2f2a..2730276 100644 --- a/out/.done/11.ok +++ b/out/.done/11.ok @@ -1,7 +1,7 @@ task: '11' status: ok charts: 14 -tables: 5 +tables: 7 report_bytes: 16091 winner_600gb: pg prices_as_of: 2026-07-11 diff --git a/out/report/tables/t6_projected_all_scales.csv b/out/report/tables/t6_projected_all_scales.csv new file mode 100644 index 0000000..61543d6 --- /dev/null +++ b/out/report/tables/t6_projected_all_scales.csv @@ -0,0 +1,106 @@ +format,query,scale_gb,projected_wall_s,projected_wall,flag +CSV,q1,600,0.06,0.06 s,OK +CSV,q1,1200,0.06,0.06 s,OK +CSV,q1,6000,0.06,0.06 s,OK +CSV,q2,600,428.301,7.1 min,OK +CSV,q2,1200,856.543,14.3 min,OK +CSV,q2,6000,4282.474,71.4 min,IMPRACTICAL +CSV,q3,600,4408.0,73.5 min,IMPRACTICAL +CSV,q3,1200,8815.94,2.4 h,IMPRACTICAL +CSV,q3,6000,44079.46,12.2 h,IMPRACTICAL +CSV,q4,600,2643.775,44.1 min,OK +CSV,q4,1200,5287.489,88.1 min,IMPRACTICAL +CSV,q4,6000,26437.206,7.3 h,IMPRACTICAL +CSV,q5,600,4176.725,69.6 min,IMPRACTICAL +CSV,q5,1200,8353.391,2.3 h,IMPRACTICAL +CSV,q5,6000,41766.715,11.6 h,IMPRACTICAL +CSV,q6,600,870.266,14.5 min,OK +CSV,q6,1200,1740.472,29.0 min,OK +CSV,q6,6000,8702.119,2.4 h,IMPRACTICAL +CSV,q7,600,4897.995,81.6 min,IMPRACTICAL +CSV,q7,1200,9795.931,2.7 h,IMPRACTICAL +CSV,q7,6000,48979.414,13.6 h,IMPRACTICAL +JSON-LD,q1,600,0.111,0.11 s,OK +JSON-LD,q1,1200,0.111,0.11 s,OK +JSON-LD,q1,6000,0.111,0.11 s,OK +JSON-LD,q2,600,5519.622,92.0 min,IMPRACTICAL +JSON-LD,q2,1200,11039.133,3.1 h,IMPRACTICAL +JSON-LD,q2,6000,55195.222,15.3 h,IMPRACTICAL +JSON-LD,q3,600,39673.993,11.0 h,IMPRACTICAL +JSON-LD,q3,1200,79347.876,22.0 h,IMPRACTICAL +JSON-LD,q3,6000,396738.933,4.6 d,FAIL +JSON-LD,q4,600,39597.306,11.0 h,IMPRACTICAL +JSON-LD,q4,1200,79194.5,22.0 h,IMPRACTICAL +JSON-LD,q4,6000,395972.054,4.6 d,FAIL +JSON-LD,q5,600,39760.772,11.0 h,IMPRACTICAL +JSON-LD,q5,1200,79521.432,22.1 h,IMPRACTICAL +JSON-LD,q5,6000,397606.717,4.6 d,FAIL +JSON-LD,q6,600,39076.231,10.9 h,IMPRACTICAL +JSON-LD,q6,1200,78152.351,21.7 h,IMPRACTICAL +JSON-LD,q6,6000,390761.312,4.5 d,FAIL +JSON-LD,q7,600,40228.164,11.2 h,IMPRACTICAL +JSON-LD,q7,1200,80456.218,22.3 h,IMPRACTICAL +JSON-LD,q7,6000,402280.643,4.7 d,FAIL +SQLite,q1,600,0.062,0.06 s,OK +SQLite,q1,1200,0.063,0.06 s,OK +SQLite,q1,6000,0.063,0.06 s,OK +SQLite,q2,600,1.271,1.27 s,OK +SQLite,q2,1200,2.482,2.48 s,OK +SQLite,q2,6000,12.169,12 s,OK +SQLite,q3,600,339.238,5.7 min,OK +SQLite,q3,1200,699.328,11.7 min,OK +SQLite,q3,6000,3739.195,62.3 min,IMPRACTICAL +SQLite,q4,600,0.06,0.06 s,OK +SQLite,q4,1200,0.06,0.06 s,OK +SQLite,q4,6000,0.06,0.06 s,OK +SQLite,q5,600,2847.603,47.5 min,OK +SQLite,q5,1200,5695.146,94.9 min,IMPRACTICAL +SQLite,q5,6000,28475.49,7.9 h,IMPRACTICAL +SQLite,q6,600,5.18,5.18 s,OK +SQLite,q6,1200,10.615,11 s,OK +SQLite,q6,6000,56.5,56 s,OK +SQLite,q7,600,2619.558,43.7 min,OK +SQLite,q7,1200,5239.055,87.3 min,IMPRACTICAL +SQLite,q7,6000,26195.034,7.3 h,IMPRACTICAL +PostgreSQL,q1,600,0.222,0.22 s,OK +PostgreSQL,q1,1200,0.222,0.22 s,OK +PostgreSQL,q1,6000,0.222,0.22 s,OK +PostgreSQL,q2,600,0.221,0.22 s,OK +PostgreSQL,q2,1200,0.221,0.22 s,OK +PostgreSQL,q2,6000,0.221,0.22 s,OK +PostgreSQL,q3,600,3.42,3.42 s,OK +PostgreSQL,q3,1200,6.817,6.82 s,OK +PostgreSQL,q3,6000,35.495,35 s,OK +PostgreSQL,q4,600,10.715,11 s,OK +PostgreSQL,q4,1200,21.209,21 s,OK +PostgreSQL,q4,6000,105.162,105 s,OK +PostgreSQL,q5,600,222.111,3.7 min,OK +PostgreSQL,q5,1200,444.001,7.4 min,OK +PostgreSQL,q5,6000,2219.125,37.0 min,OK +PostgreSQL,q6,600,4.06,4.06 s,OK +PostgreSQL,q6,1200,8.137,8.14 s,OK +PostgreSQL,q6,6000,42.55,43 s,OK +PostgreSQL,q7,600,114.849,115 s,OK +PostgreSQL,q7,1200,229.477,3.8 min,OK +PostgreSQL,q7,6000,1146.503,19.1 min,OK +RDF triplestore,q1,600,0.113,0.11 s,OK +RDF triplestore,q1,1200,0.113,0.11 s,OK +RDF triplestore,q1,6000,0.113,0.11 s,OK +RDF triplestore,q2,600,10866.789,3.0 h,IMPRACTICAL +RDF triplestore,q2,1200,21733.465,6.0 h,IMPRACTICAL +RDF triplestore,q2,6000,108666.874,30.2 h,FAIL +RDF triplestore,q3,600,185722.881,2.1 d,FAIL +RDF triplestore,q3,1200,371445.649,4.3 d,FAIL +RDF triplestore,q3,6000,1857227.792,21.5 d,FAIL +RDF triplestore,q4,600,79559.375,22.1 h,IMPRACTICAL +RDF triplestore,q4,1200,159118.636,44.2 h,FAIL +RDF triplestore,q4,6000,795592.727,9.2 d,FAIL +RDF triplestore,q5,600,240054.647,2.8 d,FAIL +RDF triplestore,q5,1200,480109.181,5.6 d,FAIL +RDF triplestore,q5,6000,2400545.453,27.8 d,FAIL +RDF triplestore,q6,600,352.729,5.9 min,OK +RDF triplestore,q6,1200,727.088,12.1 min,OK +RDF triplestore,q6,6000,3887.402,64.8 min,IMPRACTICAL +RDF triplestore,q7,600,163225.475,45.3 h,FAIL +RDF triplestore,q7,1200,326450.837,3.8 d,FAIL +RDF triplestore,q7,6000,1632253.733,18.9 d,FAIL diff --git a/out/report/tables/t7_hardware_all_scales.csv b/out/report/tables/t7_hardware_all_scales.csv new file mode 100644 index 0000000..8889298 --- /dev/null +++ b/out/report/tables/t7_hardware_all_scales.csv @@ -0,0 +1,16 @@ +format,scale_gb,configuration,disk_tb,ram_gb,cores,nodes,ram_modules,nvme_drives,base_usd,ram_usd,disk_usd,extra_nodes_usd,est_cost_usd +CSV,600,1 x 1U Supermicro AS-1015CS-TNR (16 cores); 1 x 64 GB DDR5 ECC RDIMM; 1 x 7.68 TB NVMe U.2,0.78,16.0,16,1,1,1,4618,1887,3995,0,10500 +CSV,1200,1 x 1U Supermicro AS-1015CS-TNR (16 cores); 1 x 64 GB DDR5 ECC RDIMM; 1 x 7.68 TB NVMe U.2,1.56,16.0,16,1,1,1,4618,1887,3995,0,10500 +CSV,6000,1 x 1U Supermicro AS-1015CS-TNR (16 cores); 1 x 64 GB DDR5 ECC RDIMM; 2 x 7.68 TB NVMe U.2,7.8,16.0,16,1,1,2,4618,1887,7990,0,14495 +JSON-LD,600,1 x 1U Supermicro AS-1015CS-TNR (16 cores); 1 x 64 GB DDR5 ECC RDIMM; 1 x 7.68 TB NVMe U.2,1.633,16.0,16,1,1,1,4618,1887,3995,0,10500 +JSON-LD,1200,1 x 1U Supermicro AS-1015CS-TNR (16 cores); 1 x 64 GB DDR5 ECC RDIMM; 1 x 7.68 TB NVMe U.2,3.267,16.0,16,1,1,1,4618,1887,3995,0,10500 +JSON-LD,6000,1 x 1U Supermicro AS-1015CS-TNR (16 cores); 1 x 64 GB DDR5 ECC RDIMM; 3 x 7.68 TB NVMe U.2,16.334,16.0,16,1,1,3,4618,1887,11985,0,18490 +SQLite,600,1 x 1U Supermicro AS-1015CS-TNR (16 cores); 1 x 64 GB DDR5 ECC RDIMM; 1 x 7.68 TB NVMe U.2,0.647,21.0,16,1,1,1,4618,1887,3995,0,10500 +SQLite,1200,1 x 1U Supermicro AS-1015CS-TNR (16 cores); 1 x 64 GB DDR5 ECC RDIMM; 1 x 7.68 TB NVMe U.2,1.295,38.0,16,1,1,1,4618,1887,3995,0,10500 +SQLite,6000,1 x 1U Supermicro AS-1015CS-TNR (16 cores); 3 x 64 GB DDR5 ECC RDIMM; 1 x 7.68 TB NVMe U.2,6.475,173.9,16,1,3,1,4618,5661,3995,0,14274 +PostgreSQL,600,1 x 1U Supermicro AS-1015CS-TNR (16 cores); 1 x 64 GB DDR5 ECC RDIMM; 1 x 7.68 TB NVMe U.2,2.086,58.7,16,1,1,1,4618,1887,3995,0,10500 +PostgreSQL,1200,1 x 1U Supermicro AS-1015CS-TNR (16 cores); 2 x 64 GB DDR5 ECC RDIMM; 1 x 7.68 TB NVMe U.2,4.171,113.5,16,1,2,1,4618,3774,3995,0,12387 +PostgreSQL,6000,1 x 1U Supermicro AS-1015CS-TNR (16 cores); 9 x 64 GB DDR5 ECC RDIMM; 3 x 7.68 TB NVMe U.2,20.855,551.3,16,1,9,3,4618,16983,11985,0,33586 +RDF triplestore,600,2 x 1U Supermicro AS-1015CS-TNR (16 cores); 22 x 64 GB DDR5 ECC RDIMM; 2 x 7.68 TB NVMe U.2,9.127,1404.1,16,2,22,2,4618,41514,7990,4618,58740 +RDF triplestore,1200,3 x 1U Supermicro AS-1015CS-TNR (16 cores); 44 x 64 GB DDR5 ECC RDIMM; 3 x 7.68 TB NVMe U.2,18.254,2808.3,16,3,44,3,4618,83028,11985,9236,108867 +RDF triplestore,6000,14 x 1U Supermicro AS-1015CS-TNR (16 cores); 220 x 64 GB DDR5 ECC RDIMM; 12 x 7.68 TB NVMe U.2,91.268,14041.3,16,14,220,12,4618,415140,47940,60034,527732 diff --git a/report.py b/report.py index ea56212..e52383c 100644 --- a/report.py +++ b/report.py @@ -3,8 +3,9 @@ Aggregates the measured matrix (task 09), the projections (task 10) and the process diagrams (task 02) into the final decision document. Writes 14 PNG charts (150 dpi) under ./out/report/charts/ with the exact names fixed in -README.md, five CSV tables under ./out/report/tables/, and -./out/report/REPORT.md. +README.md, seven CSV tables under ./out/report/tables/ (t6/t7 carry every +projection and hardware row for all three scales - they are the committed +proof artifacts the executive summary links to), and ./out/report/REPORT.md. Chart readability contract (owner feedback 2026-07-11): linear scales with actual units everywhere (panels instead of log axes when magnitudes clash), @@ -636,6 +637,22 @@ def main() -> int: money(sizing[(fmt, REPORT_SCALE_GB)]["est_cost_usd"])] for fmt in FORMATS], ) + tables["t6_projected_all_scales"] = ( + ["format", "query", "scale_gb", "projected_wall_s", "projected_wall", "flag"], + [[FMT_NAMES[fmt], f"q{qn}", s, proj[(fmt, qn, s)][0], human_time(proj[(fmt, qn, s)][0]), proj[(fmt, qn, s)][1]] + for fmt in FORMATS for qn in QUERY_NUMBERS for s in SCALES_GB], + ) + tables["t7_hardware_all_scales"] = ( + ["format", "scale_gb", "configuration", "disk_tb", "ram_gb", "cores", "nodes", + "ram_modules", "nvme_drives", "base_usd", "ram_usd", "disk_usd", "extra_nodes_usd", "est_cost_usd"], + [[FMT_NAMES[fmt], s, config_string(sizing[(fmt, s)], prices), + sizing[(fmt, s)]["disk_tb"], sizing[(fmt, s)]["ram_gb"], + sizing[(fmt, s)]["cores"], sizing[(fmt, s)]["nodes"], + sizing[(fmt, s)]["ram_modules"], sizing[(fmt, s)]["nvme_drives"], + round(sizing[(fmt, s)]["base_usd"]), round(sizing[(fmt, s)]["ram_usd"]), + round(sizing[(fmt, s)]["disk_usd"]), round(sizing[(fmt, s)]["extra_nodes_usd"]), + round(sizing[(fmt, s)]["est_cost_usd"])] for fmt in FORMATS for s in SCALES_GB], + ) scoreboards = build_scoreboards(medians, proj, sizes, sizing) tables["t5_weighted_scores"] = ( ["scale", "format", "search_pts", "ram_pts", "disk_pts", "total"], -- 2.53.0.windows.2