On this page

Benchmarks

Three benchmarks, three different questions. Each number on this page comes from a file in the repository and has a command that reproduces it.

BenchmarkQuestionReproduce
ValidityDoes the data obey its own schema's keys and CHECK rules?python -m benchmarks.validity_bench
RealismHow close does it get to real data of the same kind, without seeing any?python -m benchmarks.realism_bench --seed N
The GauntletDoes it survive a reviewer running arbitrary joins and group-bys?python -m benchmarks.gauntlet

The validity and realism numbers are collected in benchmarks/results/summary.json.

Validity: zero violations, by construction#

Five SQL schemas, each generated from its DDL with nothing else configured, and checked by a pandas checker that shares no code with Misata.

Rule violations per schema (lower is better)
  • Misata from DDL
  • Faker script
  • SDV HMA
saas_billing Misata from DDL: 0 Faker script: 36,150 SDV HMA: could not runsaas_billing036,150SDV HMA: could not runorg_chart Misata from DDL: 0 Faker script: 15,014 SDV HMA: 4,807org_chart015,0144,807marketplace_m2m Misata from DDL: 0 Faker script: 42,387 SDV HMA: 5,557marketplace_m2m042,3875,557hotel_bookings Misata from DDL: 0 Faker script: 50,416 SDV HMA: 3,055hotel_bookings050,4163,055retail_chain_6_levels Misata from DDL: 0 Faker script: 24,025 SDV HMA: could not runretail_chain_6_levels024,025SDV HMA: could not run060,000
Show the numbers
SchemaMisata from DDLFaker scriptSDV HMA
saas_billing036,150could not run
org_chart015,0144,807
marketplace_m2m042,3875,557
hotel_bookings050,4163,055
retail_chain_6_levels024,025could not run

Source: benchmarks/results/summary.json, validity.totals; Misata 0.9.7, seed 7

SDV's open-source multi-table model refuses schemas with more than five tables or foreign keys more than two levels deep, so it could not run two of the five. Full results and method.

Realism: better than a script, behind a fitted model on taxis#

A classifier tries to tell generated rows from held-out real rows; 0.5 means it cannot. Blind contestants never see a real row.

Detection AUC, mean of five seeds (lower is better)
  • Olist
  • NYC taxis
misata_mimic (fitted) Olist: 0.537 NYC taxis: 0.543misata_mimic (fitted)0.5370.543misata_schema (blind) Olist: 0.629 NYC taxis: 0.75misata_schema (blind)0.6290.75sdv_copula (fitted) Olist: 0.711 NYC taxis: 0.675sdv_copula (fitted)0.7110.675faker_script (blind) Olist: 0.783 NYC taxis: 0.788faker_script (blind)0.7830.7880.50.85
Show the numbers
GeneratorOlistNYC taxis
misata_mimic (fitted)0.5370.543
misata_schema (blind)0.6290.75
sdv_copula (fitted)0.7110.675
faker_script (blind)0.7830.788

Source: benchmarks/results/summary.json, realism.datasets.*.detect_auc.mean

On Olist orders, blind Misata is harder to detect than SDV fitted on the real orders. On taxi trips it beats the Faker script but not SDV fitted on the trips, because blind fares are drawn from a generic money shape. mimic scores best and is fitted to the real rows, so it is not anonymous. Full results, every metric and the caveats.

The Gauntlet: 136 SQL assertions#

A 13-table relational schema and 136 independent SQL assertions, each a query returning the number of violating rows, run by DuckDB against the generated tables. The assertions cover keys, value domains, temporal order, status gates, parent totals that equal their child facts (including across several hops), denormalised copies, geography, arithmetic, degenerate distributions, lifecycles, missingness and late arrivals. Aggregate checks are exact to the cent, in SQL.

Gauntlet assertions that hold, out of 136
Misata 136Misata136Faker script 78Faker script780136
Show the numbers
GeneratorAssertions held
Misata136
Faker script78

Source: CHANGELOG.md, 0.9.8, "Declared values hold"

The Faker script is a careful one: foreign keys sampled from parent ids, real formats, line totals computed as quantity times price. What it does not do is build a constraint solver by hand, so aggregates, status gates, temporal order and geography consistency fail. Reproduce with python -m benchmarks.gauntlet and python -m benchmarks.gauntlet_compare --tool faker. The harness can also score SDV (--tool sdv), but no SDV score is published because it has not been run.

Reproducibility#

python -m benchmarks.golden regenerates a set of story, dict and DDL schemas and compares their misata.fingerprint hashes; CI requires the same hashes on Linux, macOS and Windows.

Prefer generating data visually?

Misata Studio lets you turn natural language prompts into relational schemas with exact outcome invariants, live preview tables, and one-click database seeding without writing code.

Last updated Edit this page.md