{
  "schema": "factoidal-closure-bench/1",
  "timestamp": "2026-08-02T22:30:47Z",
  "commit": "175da4e8ad144a60d40007736e5e9d43e17946c6",
  "platform": "linux-x86_64",
  "binary": "/home/user/factoidal/bin/linux-x86_64/factoidal",
  "binary_sha256": "fdfeb71a786bd3ff7e7d93327e29b13770055339f79c75b4acd35f48d2a3b008",
  "regime": "RDFS",
  "runs_per_measurement": 3,
  "cap_seconds_per_run": 120.0,
  "vocab_cap_seconds_per_run": 400.0,
  "note": "End-to-end: read + parse + closure + serialize. There is no closure-only entry point in the committed CLI, so parse cost is included; tools/bench-parse-serialize.sh measures the parse component separately. Wall and CPU are reported separately because the OWL cap-escape family is budgeted in CPU seconds.",
  "shape_summary": {
    "chain": "linear subClassOf chain + 1 individual (rdfs11 worst case)",
    "tree": "balanced binary class tree, depth log2(n) (rdfs11, small answer)",
    "diamond": "layered DAG, 2 parents per class (duplicate derivations)",
    "wideflat": "n individuals, depth-3 hierarchy (rdfs9 / rdfs4a / rdfs4b)",
    "dense": "n properties with domain/range/subPropertyOf (rdfs2 / rdfs3 / rdfs7)"
  },
  "shape_documentation": {
    "chain": "C0 subClassOf C1 subClassOf ... subClassOf Cn, plus one typed individual. The rdfs11 (subClassOf transitivity) worst case: the transitive closure genuinely has n(n-1)/2 edges, so any exponent above 2 in TIME is work the engine did not need to do.",
    "tree": "Balanced binary class hierarchy, depth log2(n), one typed individual at the deepest leaf. Same rule as `chain` (rdfs11) but with an O(n log n) answer instead of O(n^2) -- separates 'the answer is big' from 'the engine is slow'.",
    "diamond": "Layered DAG, width 4, every class subClassOf two classes in the next layer up. Every derived edge is re-derived along several paths, so this is the duplicate-derivation case that semi-naive evaluation and emit-once both target.",
    "wideflat": "n individuals typed at the bottom of a depth-3 hierarchy. The rdfs9 (subClassOf + type) and rdfs4a/rdfs4b (everything is an rdfs:Resource) case: many facts, almost no schema. Should be linear; if it is not, the constant factors are the problem.",
    "dense": "n properties, each with rdfs:domain, rdfs:range and a subPropertyOf to a shared super-property, plus one instance triple each. The rdfs2 (domain), rdfs3 (range) and rdfs7 (subPropertyOf) case -- broad schema, shallow recursion."
  },
  "cases": [
    {
      "status": "ok",
      "output_triples": 309,
      "wall_s_median": 0.0126,
      "wall_s_min": 0.0116,
      "wall_s_max": 0.0137,
      "cpu_s_median": 0.0132,
      "cpu_s_min": 0.0124,
      "cpu_s_max": 0.0142,
      "peak_rss_kb": 35260,
      "runs": 3,
      "kind": "shape",
      "case": "chain",
      "n": 20,
      "input_triples": 21,
      "expansion_ratio": 14.714
    },
    {
      "status": "ok",
      "output_triples": 979,
      "wall_s_median": 0.0321,
      "wall_s_min": 0.0318,
      "wall_s_max": 0.0342,
      "cpu_s_median": 0.0322,
      "cpu_s_min": 0.0322,
      "cpu_s_max": 0.0349,
      "peak_rss_kb": 35260,
      "runs": 3,
      "kind": "shape",
      "case": "chain",
      "n": 40,
      "input_triples": 41,
      "expansion_ratio": 23.878
    },
    {
      "status": "ok",
      "output_triples": 3519,
      "wall_s_median": 0.1187,
      "wall_s_min": 0.1162,
      "wall_s_max": 0.1383,
      "cpu_s_median": 0.1185,
      "cpu_s_min": 0.1159,
      "cpu_s_max": 0.1383,
      "peak_rss_kb": 35260,
      "runs": 3,
      "kind": "shape",
      "case": "chain",
      "n": 80,
      "input_triples": 81,
      "expansion_ratio": 43.444
    },
    {
      "status": "ok",
      "output_triples": 13399,
      "wall_s_median": 0.6457,
      "wall_s_min": 0.6411,
      "wall_s_max": 0.8192,
      "cpu_s_median": 0.6426,
      "cpu_s_min": 0.6372,
      "cpu_s_max": 0.8175,
      "peak_rss_kb": 35504,
      "runs": 3,
      "kind": "shape",
      "case": "chain",
      "n": 160,
      "input_triples": 161,
      "expansion_ratio": 83.224
    },
    {
      "status": "ok",
      "output_triples": 949,
      "wall_s_median": 0.028,
      "wall_s_min": 0.0268,
      "wall_s_max": 0.0298,
      "cpu_s_median": 0.0283,
      "cpu_s_min": 0.0271,
      "cpu_s_max": 0.0303,
      "peak_rss_kb": 35260,
      "runs": 3,
      "kind": "shape",
      "case": "tree",
      "n": 128,
      "input_triples": 128,
      "expansion_ratio": 7.414
    },
    {
      "status": "ok",
      "output_triples": 2103,
      "wall_s_median": 0.0665,
      "wall_s_min": 0.0649,
      "wall_s_max": 0.0666,
      "cpu_s_median": 0.0669,
      "cpu_s_min": 0.0653,
      "cpu_s_max": 0.0671,
      "peak_rss_kb": 35260,
      "runs": 3,
      "kind": "shape",
      "case": "tree",
      "n": 256,
      "input_triples": 256,
      "expansion_ratio": 8.215
    },
    {
      "status": "ok",
      "output_triples": 4665,
      "wall_s_median": 0.168,
      "wall_s_min": 0.1671,
      "wall_s_max": 0.1705,
      "cpu_s_median": 0.168,
      "cpu_s_min": 0.1668,
      "cpu_s_max": 0.1702,
      "peak_rss_kb": 35260,
      "runs": 3,
      "kind": "shape",
      "case": "tree",
      "n": 512,
      "input_triples": 512,
      "expansion_ratio": 9.111
    },
    {
      "status": "ok",
      "output_triples": 10299,
      "wall_s_median": 0.4476,
      "wall_s_min": 0.4401,
      "wall_s_max": 0.5044,
      "cpu_s_median": 0.4468,
      "cpu_s_min": 0.4397,
      "cpu_s_max": 0.5037,
      "peak_rss_kb": 35260,
      "runs": 3,
      "kind": "shape",
      "case": "tree",
      "n": 1024,
      "input_triples": 1024,
      "expansion_ratio": 10.058
    },
    {
      "status": "ok",
      "output_triples": 494,
      "wall_s_median": 0.0198,
      "wall_s_min": 0.0184,
      "wall_s_max": 0.0199,
      "cpu_s_median": 0.0201,
      "cpu_s_min": 0.019,
      "cpu_s_max": 0.0203,
      "peak_rss_kb": 35260,
      "runs": 3,
      "kind": "shape",
      "case": "diamond",
      "n": 32,
      "input_triples": 57,
      "expansion_ratio": 8.667
    },
    {
      "status": "ok",
      "output_triples": 1966,
      "wall_s_median": 0.0632,
      "wall_s_min": 0.0624,
      "wall_s_max": 0.0667,
      "cpu_s_median": 0.0636,
      "cpu_s_min": 0.0627,
      "cpu_s_max": 0.0665,
      "peak_rss_kb": 35260,
      "runs": 3,
      "kind": "shape",
      "case": "diamond",
      "n": 64,
      "input_triples": 121,
      "expansion_ratio": 16.248
    },
    {
      "status": "ok",
      "output_triples": 7982,
      "wall_s_median": 0.3096,
      "wall_s_min": 0.3096,
      "wall_s_max": 0.3162,
      "cpu_s_median": 0.3095,
      "cpu_s_min": 0.3084,
      "cpu_s_max": 0.3156,
      "peak_rss_kb": 35260,
      "runs": 3,
      "kind": "shape",
      "case": "diamond",
      "n": 128,
      "input_triples": 249,
      "expansion_ratio": 32.056
    },
    {
      "status": "ok",
      "output_triples": 18094,
      "wall_s_median": 0.8336,
      "wall_s_min": 0.8027,
      "wall_s_max": 0.8496,
      "cpu_s_median": 0.8315,
      "cpu_s_min": 0.8009,
      "cpu_s_max": 0.8464,
      "peak_rss_kb": 42288,
      "runs": 3,
      "kind": "shape",
      "case": "diamond",
      "n": 192,
      "input_triples": 377,
      "expansion_ratio": 47.995
    },
    {
      "status": "ok",
      "output_triples": 2044,
      "wall_s_median": 0.056,
      "wall_s_min": 0.0541,
      "wall_s_max": 0.0575,
      "cpu_s_median": 0.0562,
      "cpu_s_min": 0.0545,
      "cpu_s_max": 0.0573,
      "peak_rss_kb": 35260,
      "runs": 3,
      "kind": "shape",
      "case": "wideflat",
      "n": 500,
      "input_triples": 502,
      "expansion_ratio": 4.072
    },
    {
      "status": "ok",
      "output_triples": 4044,
      "wall_s_median": 0.1132,
      "wall_s_min": 0.11,
      "wall_s_max": 0.1154,
      "cpu_s_median": 0.1125,
      "cpu_s_min": 0.1098,
      "cpu_s_max": 0.1151,
      "peak_rss_kb": 35260,
      "runs": 3,
      "kind": "shape",
      "case": "wideflat",
      "n": 1000,
      "input_triples": 1002,
      "expansion_ratio": 4.036
    },
    {
      "status": "ok",
      "output_triples": 8044,
      "wall_s_median": 0.2314,
      "wall_s_min": 0.2251,
      "wall_s_max": 0.2336,
      "cpu_s_median": 0.2305,
      "cpu_s_min": 0.2242,
      "cpu_s_max": 0.2329,
      "peak_rss_kb": 35260,
      "runs": 3,
      "kind": "shape",
      "case": "wideflat",
      "n": 2000,
      "input_triples": 2002,
      "expansion_ratio": 4.018
    },
    {
      "status": "ok",
      "output_triples": 16044,
      "wall_s_median": 0.4905,
      "wall_s_min": 0.4861,
      "wall_s_max": 0.572,
      "cpu_s_median": 0.4883,
      "cpu_s_min": 0.4837,
      "cpu_s_max": 0.5687,
      "peak_rss_kb": 35504,
      "runs": 3,
      "kind": "shape",
      "case": "wideflat",
      "n": 4000,
      "input_triples": 4002,
      "expansion_ratio": 4.009
    },
    {
      "status": "ok",
      "output_triples": 2803,
      "wall_s_median": 0.0843,
      "wall_s_min": 0.0835,
      "wall_s_max": 0.0868,
      "cpu_s_median": 0.0841,
      "cpu_s_min": 0.0837,
      "cpu_s_max": 0.0867,
      "peak_rss_kb": 35260,
      "runs": 3,
      "kind": "shape",
      "case": "dense",
      "n": 250,
      "input_triples": 1000,
      "expansion_ratio": 2.803
    },
    {
      "status": "ok",
      "output_triples": 5553,
      "wall_s_median": 0.176,
      "wall_s_min": 0.1714,
      "wall_s_max": 0.1782,
      "cpu_s_median": 0.1763,
      "cpu_s_min": 0.1717,
      "cpu_s_max": 0.1778,
      "peak_rss_kb": 35260,
      "runs": 3,
      "kind": "shape",
      "case": "dense",
      "n": 500,
      "input_triples": 2000,
      "expansion_ratio": 2.776
    },
    {
      "status": "ok",
      "output_triples": 11053,
      "wall_s_median": 0.3897,
      "wall_s_min": 0.385,
      "wall_s_max": 0.3906,
      "cpu_s_median": 0.3836,
      "cpu_s_min": 0.3808,
      "cpu_s_max": 0.388,
      "peak_rss_kb": 35260,
      "runs": 3,
      "kind": "shape",
      "case": "dense",
      "n": 1000,
      "input_triples": 4000,
      "expansion_ratio": 2.763
    },
    {
      "status": "ok",
      "output_triples": 22053,
      "wall_s_median": 0.933,
      "wall_s_min": 0.8763,
      "wall_s_max": 0.9664,
      "cpu_s_median": 0.8978,
      "cpu_s_min": 0.8724,
      "cpu_s_max": 0.9638,
      "peak_rss_kb": 42288,
      "runs": 3,
      "kind": "shape",
      "case": "dense",
      "n": 2000,
      "input_triples": 8000,
      "expansion_ratio": 2.757
    },
    {
      "status": "ok",
      "output_triples": 422,
      "wall_s_median": 0.0255,
      "wall_s_min": 0.0227,
      "wall_s_max": 0.0272,
      "cpu_s_median": 0.0261,
      "cpu_s_min": 0.023,
      "cpu_s_max": 0.0277,
      "peak_rss_kb": 35260,
      "runs": 3,
      "kind": "vocabulary",
      "case": "skos",
      "path": "third_party/vocabularies/skos.rdf",
      "description": "SKOS Core, W3C Recommendation vocabulary (254 triples)",
      "input_triples": 254,
      "expansion_ratio": 1.661
    },
    {
      "status": "ok",
      "output_triples": 863,
      "wall_s_median": 0.0388,
      "wall_s_min": 0.0368,
      "wall_s_max": 0.0396,
      "cpu_s_median": 0.0391,
      "cpu_s_min": 0.0372,
      "cpu_s_max": 0.0401,
      "peak_rss_kb": 35260,
      "runs": 3,
      "kind": "vocabulary",
      "case": "foaf",
      "path": "third_party/vocabularies/foaf.rdf",
      "description": "FOAF 0.99 specification RDF (635 triples)",
      "input_triples": 635,
      "expansion_ratio": 1.359
    },
    {
      "status": "ok",
      "output_triples": 1272,
      "wall_s_median": 0.0548,
      "wall_s_min": 0.054,
      "wall_s_max": 0.0555,
      "cpu_s_median": 0.0551,
      "cpu_s_min": 0.0542,
      "cpu_s_max": 0.0559,
      "peak_rss_kb": 35260,
      "runs": 3,
      "kind": "vocabulary",
      "case": "dcterms",
      "path": "third_party/vocabularies/dublin_core_terms.ttl",
      "description": "DCMI Metadata Terms (700 triples)",
      "input_triples": 700,
      "expansion_ratio": 1.817
    },
    {
      "status": "ok",
      "output_triples": 29275,
      "wall_s_median": 1.977,
      "wall_s_min": 1.9182,
      "wall_s_max": 2.1501,
      "cpu_s_median": 1.9728,
      "cpu_s_min": 1.9117,
      "cpu_s_max": 2.1435,
      "peak_rss_kb": 68912,
      "runs": 3,
      "kind": "vocabulary",
      "case": "schemaorg",
      "path": "third_party/vocabularies/schemaorg-30.0-current-https.ttl",
      "description": "schema.org 30.0, RDFS/OWL Turtle distribution (17,949 triples)",
      "input_triples": 17949,
      "expansion_ratio": 1.631
    },
    {
      "status": "ok",
      "output_triples": 508139,
      "wall_s_median": 87.0932,
      "wall_s_min": 86.962,
      "wall_s_max": 90.2858,
      "cpu_s_median": 86.9452,
      "cpu_s_min": 86.8571,
      "cpu_s_max": 90.1712,
      "peak_rss_kb": 1203380,
      "runs": 3,
      "kind": "vocabulary",
      "case": "qudt",
      "path": "third_party/qudt/QUDT-all-in-one-OWL.ttl",
      "description": "QUDT 3.4.0 all-in-one OWL, already vendored (130,404 triples)",
      "input_triples": 130404,
      "expansion_ratio": 3.897
    }
  ],
  "scaling": [
    {
      "shape": "chain",
      "n_from": 20,
      "n_to": 160,
      "exponent_wall": 1.892,
      "exponent_cpu": 1.87,
      "exponent_output": 1.816,
      "fit": "log-log least squares of the median over the n sweep"
    },
    {
      "shape": "tree",
      "n_from": 128,
      "n_to": 1024,
      "exponent_wall": 1.333,
      "exponent_cpu": 1.327,
      "exponent_output": 1.147,
      "fit": "log-log least squares of the median over the n sweep"
    },
    {
      "shape": "diamond",
      "n_from": 32,
      "n_to": 192,
      "exponent_wall": 2.097,
      "exponent_cpu": 2.087,
      "exponent_output": 2.011,
      "fit": "log-log least squares of the median over the n sweep"
    },
    {
      "shape": "wideflat",
      "n_from": 500,
      "n_to": 4000,
      "exponent_wall": 1.042,
      "exponent_cpu": 1.039,
      "exponent_output": 0.991,
      "fit": "log-log least squares of the median over the n sweep"
    },
    {
      "shape": "dense",
      "n_from": 250,
      "n_to": 2000,
      "exponent_wall": 1.155,
      "exponent_cpu": 1.137,
      "exponent_output": 0.992,
      "fit": "log-log least squares of the median over the n sweep"
    }
  ],
  "variance": {
    "metric": "per-case (max - min) / median, as a percentage, over the runs of this invocation",
    "wall_spread_pct_max": 27.58,
    "wall_spread_pct_median": 6.8,
    "cpu_spread_pct_max": 28.06,
    "cpu_spread_pct_median": 5.97,
    "cases_with_multiple_runs": 25
  }
}
