{
 "release": "0.7.0",
 "generated": "2026-10-17",
 "theme": "column order",
 "highlights": [
  "every dataset lists its variables in an order drawn from its seed, with the true graph permuted the same way, so the column order carries nothing of the causal order",
  "GIES, exact search, CD-NOD, MultiGroupDirectLiNGAM, GFCI, GIN, and CALM measured against their reference packages",
  "GES's scoring engine measured against the 0.4.0 build on the same datasets"
 ],
 "build": "pre-release Andrey 0.7.0 build, 17 October 2026",
 "andrey_builds": [
  {
   "build": "Andrey 0.4.0",
   "solutions": [
    "andrey040.ges.numpy.parallel",
    "andrey040.ges.numpy.serial"
   ]
  },
  {
   "build": "pre-release Andrey 0.7.0 build, 17 October 2026",
   "solutions": [
    "andrey.calm.torch-cpu",
    "andrey.calm.torch-cpu.paper_schedule",
    "andrey.exact_search.numpy",
    "andrey.ges.numpy.parallel",
    "andrey.ges.numpy.serial",
    "andrey.gies.numpy",
    "andrey.multi_group_direct_lingam.numpy",
    "causal-learn.calm",
    "causal-learn.cdnod",
    "causal-learn.exact_search",
    "causal-learn.ges",
    "lingam.multi_group_direct_lingam",
    "pcalg.gies",
    "tetrad.gfci"
   ]
  },
  {
   "build": "pre-release Andrey 0.7.0 build, 18 October 2026",
   "solutions": [
    "andrey.gin.numpy",
    "causal-learn.gin",
    "tetrad.gin"
   ]
  },
  {
   "build": "pre-release Andrey 0.7.0 build, 19 October 2026",
   "solutions": [
    "andrey.cdnod.numpy"
   ]
  },
  {
   "build": "pre-release Andrey 0.7.0 build, 19 October 2026, with order-free possible-d-separation",
   "solutions": [
    "andrey.fci.numpy",
    "andrey.gfci.numpy",
    "andrey.gfci.numpy.parallel"
   ]
  }
 ],
 "andrey_source": "every method runs the build of 17 October 2026 except GIN, which ran on the build of 18 October 2026, whose GIN root test runs once per cluster member and whose search follows each column's data; CD-NOD, whose Andrey rows ran on the build of 19 October 2026, whose Meek and FCI orientation rules run in order-free rounds; and GFCI (with its FCI and parallel side rows), whose Andrey rows ran on the build of 19 October 2026 with order-free possible-d-separation, which also visits the possible-d-separation step's pairs, nodes, and subsets in a rank computed from each column's data; GIN's reference packages ran with the same harness and data on the build of 16 October 2026, Tetrad's GFCI and causal-learn's CD-NOD on the build of 17 October 2026. The 0.4.0 rows run the released Andrey 0.4.0 on the same datasets",
 "regime": {
  "GIES": {
   "name": "interventional_gauss_er",
   "description": "linear-Gaussian data that mixes observation with interventions, simulated as in Hauser and Buhlmann (2012, Section 5.2.1): a random DAG in which each pair of variables is an edge with probability 2 / (d - 1) (mean degree 2), in a uniformly random causal order; edge weights uniform on [-1, -0.1] or [0.1, 1] and error variances uniform on [0.5, 1], rescaled so every variable has unit variance without interventions; round(0.4 d) single-variable intervention targets drawn at random, each target's rows setting its variable from N(2, 0.2^2); 10 d rows, split evenly between no intervention and each target. Each fit gets the samples and the rows' intervention targets."
  },
  "Exact search": {
   "name": "linear_gauss_er",
   "description": "linear-Gaussian data on an Erdos-Renyi DAG with mean degree 2, standardized, with n = 10 d rows. The variables are listed in an order drawn from the dataset's seed, with the true graph permuted the same way, so the column order carries nothing of the causal order."
  },
  "MultiGroupDirectLiNGAM": {
   "name": "multi_group_er",
   "description": "three groups of n = 1000 rows over the same d variables: one Erdos-Renyi DAG with mean degree 2 for all groups, linear with uniform noise, weights with |w| uniform on [0.5, 2] and a random sign drawn for each group, every variable rescaled to unit variance in causal order. The groups are given side by side; the truth is the block-diagonal DAG of the groups' copies. The variables are, in every group, listed in an order drawn from the dataset's seed, with the true graph permuted the same way, so the column order carries nothing of the causal order."
  },
  "GFCI": {
   "name": "latent_gauss_er",
   "description": "linear-Gaussian data on an Erdos-Renyi DAG with mean degree 2, standardized, with one node in ten hidden and n = 10 d rows; d counts the hidden nodes, and each dataset has d - d / 10 data columns ('observed'). The truth is the PAG of the observed variables. The variables are listed in an order drawn from the dataset's seed, with the true graph permuted the same way, so the column order carries nothing of the causal order."
  },
  "GIN": {
   "name": "latent_measurement",
   "description": "m latent variables, each a cause of every later one, each measured by three observed indicators of its own; linear with uniform noise, loadings and weights with |w| uniform on [0.5, 2] and a random sign, every variable rescaled to unit variance; n = 1000 rows of the 3 m indicators. d counts the latents and their indicators ('observed' the indicators). The indicators come in a uniformly random column order, so the column order carries nothing of the clusters or the latents' order."
  },
  "CALM": {
   "name": "linear_gauss_er",
   "description": "linear-Gaussian data on an Erdos-Renyi DAG with mean degree 2, standardized, with n = 10 d rows. The variables are listed in an order drawn from the dataset's seed, with the true graph permuted the same way, so the column order carries nothing of the causal order."
  },
  "CALM, paper schedule": {
   "name": "linear_gauss_er",
   "description": "linear-Gaussian data on an Erdos-Renyi DAG with mean degree 2, standardized, with n = 10 d rows. The variables are listed in an order drawn from the dataset's seed, with the true graph permuted the same way, so the column order carries nothing of the causal order."
  },
  "CD-NOD": {
   "name": "domain_shift_er",
   "description": "a linear-Gaussian Erdos-Renyi DAG with mean degree 2, every variable rescaled to unit variance in causal order, with n = 2000 rows pooled from four domains in equal blocks; one variable in three, at least one, shifts its mean with the domain, by s k / 3 standard deviations in domain k, s uniform on [0.5, 1.5]. The truth is the CPDAG CD-NOD can identify: the domain index orients the edges it reaches. The variables are listed in an order drawn from the dataset's seed, with the true graph permuted the same way, so the column order carries nothing of the causal order."
  },
  "GES": {
   "name": "linear_gauss_er",
   "description": "linear-Gaussian data on an Erdos-Renyi DAG with mean degree 2, standardized, with n = 10 d rows. The variables are listed in an order drawn from the dataset's seed, with the true graph permuted the same way, so the column order carries nothing of the causal order."
  },
  "GES, NumPy backend, one process": {
   "name": "linear_gauss_er",
   "description": "linear-Gaussian data on an Erdos-Renyi DAG with mean degree 2, standardized, with n = 10 d rows. The variables are listed in an order drawn from the dataset's seed, with the true graph permuted the same way, so the column order carries nothing of the causal order."
  },
  "GES, NumPy backend, parallel": {
   "name": "linear_gauss_er",
   "description": "linear-Gaussian data on an Erdos-Renyi DAG with mean degree 2, standardized, with n = 10 d rows. The variables are listed in an order drawn from the dataset's seed, with the true graph permuted the same way, so the column order carries nothing of the causal order."
  }
 },
 "seeds_per_setting": [
  5,
  20
 ],
 "speed_floor_s": 0.1,
 "error_metric": "each method's own, in its entry's error_metric",
 "hardware": {
  "GIES": {
   "cpu": "AMD EPYC 7713 64-Core Processor",
   "cores_per_fit": 4
  },
  "Exact search": {
   "cpu": "AMD EPYC 7713 64-Core Processor",
   "cores_per_fit": 4
  },
  "MultiGroupDirectLiNGAM": {
   "cpu": "AMD EPYC 7713 64-Core Processor",
   "cores_per_fit": 4
  },
  "GFCI": {
   "cpu": "AMD EPYC 7713 64-Core Processor",
   "cores_per_fit": 4
  },
  "GIN": {
   "cpu": "AMD EPYC 7713 64-Core Processor",
   "cores_per_fit": 4
  },
  "CALM": {
   "cpu": "AMD EPYC 7713 64-Core Processor",
   "cores_per_fit": 4
  },
  "CALM, paper schedule": {
   "cpu": "AMD EPYC 7713 64-Core Processor",
   "cores_per_fit": 4
  },
  "CD-NOD": {
   "cpu": "AMD EPYC 7713 64-Core Processor",
   "cores_per_fit": 4
  },
  "GES": {
   "cpu": "AMD EPYC 7713 64-Core Processor",
   "cores_per_fit": 4
  },
  "GES, NumPy backend, one process": {
   "cpu": "AMD EPYC 7713 64-Core Processor",
   "cores_per_fit": 4
  },
  "GES, NumPy backend, parallel": {
   "cpu": "AMD EPYC 7713 64-Core Processor",
   "cores_per_fit": 4
  }
 },
 "threads": "every fit runs with 4 BLAS and OpenMP threads on 4 cores; a parallel mode runs 4 single-threaded worker processes; Tetrad's JVM sees 4 processors; pcalg runs in one R session",
 "packages": {
  "causal-learn": "0.1.4.8 (for GIN, with the column-index fix)",
  "lingam": "1.13.0",
  "pcalg": "2.7.12",
  "R": "4.6.1",
  "rpy2": "3.6.9",
  "tetrad": "causal-cmd 1.12.0 (tetrad-lib 7.6.3), jar SHA-1 b0e3c3fb3b0277e0a44c54dbb82f0023c4fd9e54 (GFCI); tetrad-lib 7.6.10, shaded jar SHA-1 3a160a01a8cb648c03ceb8c7d5f47e5a8a1e2283 (GIN)",
  "java": "OpenJDK 21.0.12.1+1 (Temurin)",
  "python": "3.13.11",
  "numpy": "2.5.4",
  "scipy": "1.16.3",
  "pandas": "3.0.6",
  "torch": "2.14.1+cpu",
  "blas": "scipy-openblas 0.3.34.106.0",
  "lingam environment": "python 3.12.12, numpy 2.2.6, scipy 1.13.1"
 },
 "complete": false,
 "pending_fits": 0,
 "incomplete": [
  {
   "method": "GES",
   "comparator": "causal-learn",
   "d": 200,
   "missing": "timeouts or failures"
  }
 ],
 "methods": [
  {
   "method": "GIES",
   "setting": "lambda_value=1.0",
   "solution": "andrey.gies.numpy",
   "comparator": "pcalg",
   "comparator_method": "gies",
   "comparator_setting": "score='GaussL0penIntScore', lambda_rule='0.5*log(n)', intercept=True, max_degree=None, phase=['forward', 'backward', 'turning'], iterate=True",
   "comparator_solution": "pcalg.gies",
   "regime": "interventional_gauss_er",
   "note": "pcalg's gies maximizes GaussL0penIntScore with its default penalty lambda = 0.5 log(n), BIC in log-likelihood units, the objective Andrey's gies minimizes at lambda_value=1 in deviance units, with intercept=TRUE, as Andrey centers each variable on the rows it is scored on. Both run the forward, backward, and turning phases until none improves, with no degree cap, and both return the interventional essential graph. pcalg runs in an embedded R session; its timed region holds the conversion of the rows' intervention sets into pcalg's targets and target index",
   "error_metric": "SHD between the estimated interventional essential graph and the true DAG's, under the same intervention targets: one per variable pair whose edge differs (missing, extra, or oriented differently). The empty graph's SHD is the number of true edges.",
   "hardware": "AMD EPYC 7713 64-Core Processor, 4 cores",
   "cores": 4,
   "build": "pre-release Andrey 0.7.0 build, 17 October 2026",
   "fit_protocol": "one fit at a time on an exclusive node, 4 cores per fit, 1 timed repeat and 1 warm-up fit per dataset, a 1800 s wall cap covering the warm-up and the timed fit, and a 30000 MB memory cap per fit",
   "same_graph_test": "the same essential graph: equal endpoint marks",
   "complete": true,
   "rows": [
    {
     "d": 10,
     "mean_degree": 2.0,
     "n": 100,
     "targets": 4,
     "seeds": 5,
     "fits": 5,
     "andrey_ok": 5,
     "andrey_timeouts": 0,
     "andrey_failed": 0,
     "comparator_ok": 5,
     "comparator_timeouts": 0,
     "comparator_failed": 0,
     "paired": 5,
     "andrey_s": 0.009275108001020271,
     "comparator_s": 0.016106518000015058,
     "ratio": 1.7201675744075284,
     "under_speed_floor": true,
     "same_graph": 5,
     "between_shd": 0.0,
     "andrey_shd": 2.0,
     "comparator_shd": 2.0,
     "empty_shd": 10.0,
     "andrey_shd_mean": 2.2,
     "comparator_shd_mean": 2.2,
     "empty_shd_mean": 9.4,
     "andrey_worse_than_empty": 0,
     "comparator_worse_than_empty": 0,
     "andrey_fewer_errors": 0,
     "comparator_fewer_errors": 0,
     "complete": true,
     "different_graph": []
    },
    {
     "d": 20,
     "mean_degree": 2.0,
     "n": 200,
     "targets": 8,
     "seeds": 5,
     "fits": 5,
     "andrey_ok": 5,
     "andrey_timeouts": 0,
     "andrey_failed": 0,
     "comparator_ok": 5,
     "comparator_timeouts": 0,
     "comparator_failed": 0,
     "paired": 5,
     "andrey_s": 0.017765905999112874,
     "comparator_s": 0.023400991995004006,
     "ratio": 1.378779882356117,
     "under_speed_floor": true,
     "same_graph": 5,
     "between_shd": 0.0,
     "andrey_shd": 9.0,
     "comparator_shd": 9.0,
     "empty_shd": 17.0,
     "andrey_shd_mean": 9.0,
     "comparator_shd_mean": 9.0,
     "empty_shd_mean": 18.6,
     "andrey_worse_than_empty": 0,
     "comparator_worse_than_empty": 0,
     "andrey_fewer_errors": 0,
     "comparator_fewer_errors": 0,
     "complete": true,
     "different_graph": []
    },
    {
     "d": 50,
     "mean_degree": 2.0,
     "n": 500,
     "targets": 20,
     "seeds": 5,
     "fits": 5,
     "andrey_ok": 5,
     "andrey_timeouts": 0,
     "andrey_failed": 0,
     "comparator_ok": 5,
     "comparator_timeouts": 0,
     "comparator_failed": 0,
     "paired": 5,
     "andrey_s": 0.06208112199965399,
     "comparator_s": 0.0818894689946319,
     "ratio": 1.3190719876984232,
     "under_speed_floor": true,
     "same_graph": 5,
     "between_shd": 0.0,
     "andrey_shd": 25.0,
     "comparator_shd": 25.0,
     "empty_shd": 51.0,
     "andrey_shd_mean": 25.0,
     "comparator_shd_mean": 25.0,
     "empty_shd_mean": 49.4,
     "andrey_worse_than_empty": 0,
     "comparator_worse_than_empty": 0,
     "andrey_fewer_errors": 0,
     "comparator_fewer_errors": 0,
     "complete": true,
     "different_graph": []
    },
    {
     "d": 100,
     "mean_degree": 2.0,
     "n": 1000,
     "targets": 40,
     "seeds": 5,
     "fits": 5,
     "andrey_ok": 5,
     "andrey_timeouts": 0,
     "andrey_failed": 0,
     "comparator_ok": 5,
     "comparator_timeouts": 0,
     "comparator_failed": 0,
     "paired": 5,
     "andrey_s": 0.2491297449960257,
     "comparator_s": 0.39229151100153103,
     "ratio": 1.624093287291898,
     "same_graph": 5,
     "between_shd": 0.0,
     "andrey_shd": 72.0,
     "comparator_shd": 72.0,
     "empty_shd": 96.0,
     "andrey_shd_mean": 74.0,
     "comparator_shd_mean": 74.0,
     "empty_shd_mean": 100.0,
     "andrey_worse_than_empty": 0,
     "comparator_worse_than_empty": 0,
     "andrey_fewer_errors": 0,
     "comparator_fewer_errors": 0,
     "complete": true,
     "different_graph": []
    },
    {
     "d": 200,
     "mean_degree": 2.0,
     "n": 2000,
     "targets": 80,
     "seeds": 5,
     "fits": 5,
     "andrey_ok": 5,
     "andrey_timeouts": 0,
     "andrey_failed": 0,
     "comparator_ok": 5,
     "comparator_timeouts": 0,
     "comparator_failed": 0,
     "paired": 5,
     "andrey_s": 0.9965828999993391,
     "comparator_s": 2.6529372149962,
     "ratio": 2.616895283818477,
     "same_graph": 5,
     "between_shd": 0.0,
     "andrey_shd": 181.0,
     "comparator_shd": 181.0,
     "empty_shd": 198.0,
     "andrey_shd_mean": 177.8,
     "comparator_shd_mean": 177.8,
     "empty_shd_mean": 200.2,
     "andrey_worse_than_empty": 1,
     "comparator_worse_than_empty": 1,
     "andrey_fewer_errors": 0,
     "comparator_fewer_errors": 0,
     "complete": true,
     "different_graph": []
    }
   ]
  },
  {
   "method": "Exact search",
   "setting": "search_method='astar'",
   "solution": "andrey.exact_search.numpy",
   "comparator": "causal-learn",
   "comparator_method": "bic_exact_search",
   "comparator_setting": "max_parents=None, search_method='astar', use_path_extension=True",
   "comparator_solution": "causal-learn.exact_search",
   "regime": "linear_gauss_er",
   "note": "Both run A* for a DAG with the lowest BIC, with no parent cap; causal-learn's optimal path extension does not change the optimum. Both reach the same BIC on every dataset (same_bic); where several DAGs share the optimum they may return different ones, compared through their CPDAGs. causal-learn scores the columns as given, without centering them",
   "error_metric": "SHD between the estimate's CPDAG and the true DAG's CPDAG: one per variable pair whose edge differs (missing, extra, or oriented differently); a DAG estimate is compared through its CPDAG, so DAGs of one equivalence class count as the same graph. The empty graph's SHD is the number of true edges.",
   "hardware": "AMD EPYC 7713 64-Core Processor, 4 cores",
   "cores": 4,
   "build": "pre-release Andrey 0.7.0 build, 17 October 2026",
   "fit_protocol": "one fit at a time on an exclusive node, 4 cores per fit, 1 timed repeat and 1 warm-up fit per dataset, a 1800 s wall cap covering the warm-up and the timed fit, and a 30000 MB memory cap per fit",
   "same_graph_test": "the same CPDAG: SHD 0 between the two packages' CPDAGs",
   "complete": true,
   "rows": [
    {
     "d": 5,
     "mean_degree": 2.0,
     "n": 50,
     "seeds": 5,
     "fits": 5,
     "andrey_ok": 5,
     "andrey_timeouts": 0,
     "andrey_failed": 0,
     "comparator_ok": 5,
     "comparator_timeouts": 0,
     "comparator_failed": 0,
     "paired": 5,
     "andrey_s": 0.0025462909979978576,
     "comparator_s": 0.004306410002755001,
     "ratio": 1.6739654361835732,
     "under_speed_floor": true,
     "same_graph": 5,
     "between_shd": 0.0,
     "andrey_shd": 1.0,
     "comparator_shd": 1.0,
     "empty_shd": 5.0,
     "andrey_shd_mean": 1.0,
     "comparator_shd_mean": 1.0,
     "empty_shd_mean": 5.0,
     "andrey_worse_than_empty": 0,
     "comparator_worse_than_empty": 0,
     "andrey_fewer_errors": 0,
     "comparator_fewer_errors": 0,
     "andrey_skeleton_f1": 0.9090909090909091,
     "comparator_skeleton_f1": 0.9090909090909091,
     "andrey_arrowhead_f1": 1.0,
     "comparator_arrowhead_f1": 1.0,
     "same_bic": 5,
     "bic_gap_max": 2.2737367544323206e-13,
     "complete": true,
     "different_graph": []
    },
    {
     "d": 10,
     "mean_degree": 2.0,
     "n": 100,
     "seeds": 5,
     "fits": 5,
     "andrey_ok": 5,
     "andrey_timeouts": 0,
     "andrey_failed": 0,
     "comparator_ok": 5,
     "comparator_timeouts": 0,
     "comparator_failed": 0,
     "paired": 5,
     "andrey_s": 0.1124009080012911,
     "comparator_s": 0.26099852199695306,
     "ratio": 2.3514646126941385,
     "same_graph": 5,
     "between_shd": 0.0,
     "andrey_shd": 3.0,
     "comparator_shd": 3.0,
     "empty_shd": 10.0,
     "andrey_shd_mean": 4.2,
     "comparator_shd_mean": 4.2,
     "empty_shd_mean": 10.0,
     "andrey_worse_than_empty": 0,
     "comparator_worse_than_empty": 0,
     "andrey_fewer_errors": 0,
     "comparator_fewer_errors": 0,
     "andrey_skeleton_f1": 0.9473684210526316,
     "comparator_skeleton_f1": 0.9473684210526316,
     "andrey_arrowhead_f1": 0.8571428571428571,
     "comparator_arrowhead_f1": 0.8571428571428571,
     "same_bic": 5,
     "bic_gap_max": 0.0,
     "complete": true,
     "different_graph": []
    },
    {
     "d": 15,
     "mean_degree": 2.0,
     "n": 150,
     "seeds": 5,
     "fits": 5,
     "andrey_ok": 5,
     "andrey_timeouts": 0,
     "andrey_failed": 0,
     "comparator_ok": 5,
     "comparator_timeouts": 0,
     "comparator_failed": 0,
     "paired": 5,
     "andrey_s": 6.412107228999957,
     "comparator_s": 16.503730810996785,
     "ratio": 2.573838867877251,
     "same_graph": 5,
     "between_shd": 0.0,
     "andrey_shd": 7.0,
     "comparator_shd": 7.0,
     "empty_shd": 15.0,
     "andrey_shd_mean": 6.6,
     "comparator_shd_mean": 6.6,
     "empty_shd_mean": 15.0,
     "andrey_worse_than_empty": 0,
     "comparator_worse_than_empty": 0,
     "andrey_fewer_errors": 0,
     "comparator_fewer_errors": 0,
     "andrey_skeleton_f1": 0.8823529411764706,
     "comparator_skeleton_f1": 0.8823529411764706,
     "andrey_arrowhead_f1": 0.7000000000000001,
     "comparator_arrowhead_f1": 0.7000000000000001,
     "same_bic": 5,
     "bic_gap_max": 0.0,
     "complete": true,
     "different_graph": []
    }
   ]
  },
  {
   "method": "MultiGroupDirectLiNGAM",
   "setting": "n_groups=3",
   "solution": "andrey.multi_group_direct_lingam.numpy",
   "comparator": "lingam",
   "comparator_method": "MultiGroupDirectLiNGAM",
   "comparator_setting": "n_groups=3",
   "comparator_solution": "lingam.multi_group_direct_lingam",
   "regime": "multi_group_er",
   "note": "lingam's MultiGroupDirectLiNGAM runs in its own interpreter (Python 3.12, lingam 1.13.0, NumPy 2.2.6, SciPy 1.13.1); its fit reads no random state. Both return each group's DAG side by side",
   "error_metric": "block-diagonal SHD: the sum over the three groups of the SHD between the group's estimated DAG and the true DAG, one per variable pair whose edge differs (missing, extra, or reversed). The empty graph's SHD is three times the number of true edges.",
   "hardware": "AMD EPYC 7713 64-Core Processor, 4 cores",
   "cores": 4,
   "build": "pre-release Andrey 0.7.0 build, 17 October 2026",
   "fit_protocol": "one fit at a time on an exclusive node, 4 cores per fit, 1 timed repeat and 1 warm-up fit per dataset, a 1800 s wall cap covering the warm-up and the timed fit, and a 30000 MB memory cap per fit",
   "same_graph_test": "the same DAG in every group: SHD 0 between the two packages' block-diagonal DAGs",
   "complete": true,
   "rows": [
    {
     "d": 5,
     "mean_degree": 2.0,
     "n": 1000,
     "seeds": 5,
     "fits": 5,
     "andrey_ok": 5,
     "andrey_timeouts": 0,
     "andrey_failed": 0,
     "comparator_ok": 5,
     "comparator_timeouts": 0,
     "comparator_failed": 0,
     "paired": 5,
     "andrey_s": 0.05390759000147227,
     "comparator_s": 0.09577333700144663,
     "ratio": 1.7713496559188888,
     "under_speed_floor": true,
     "same_graph": 5,
     "between_shd": 0.0,
     "andrey_shd": 0.0,
     "comparator_shd": 0.0,
     "empty_shd": 15.0,
     "andrey_shd_mean": 0.0,
     "comparator_shd_mean": 0.0,
     "empty_shd_mean": 15.0,
     "andrey_worse_than_empty": 0,
     "comparator_worse_than_empty": 0,
     "andrey_fewer_errors": 0,
     "comparator_fewer_errors": 0,
     "andrey_skeleton_f1": 1.0,
     "comparator_skeleton_f1": 1.0,
     "andrey_arrowhead_f1": 1.0,
     "comparator_arrowhead_f1": 1.0,
     "complete": true,
     "different_graph": []
    },
    {
     "d": 10,
     "mean_degree": 2.0,
     "n": 1000,
     "seeds": 5,
     "fits": 5,
     "andrey_ok": 5,
     "andrey_timeouts": 0,
     "andrey_failed": 0,
     "comparator_ok": 5,
     "comparator_timeouts": 0,
     "comparator_failed": 0,
     "paired": 5,
     "andrey_s": 0.2275087390007684,
     "comparator_s": 0.5708071850021952,
     "ratio": 2.508946194810861,
     "same_graph": 5,
     "between_shd": 0.0,
     "andrey_shd": 0.0,
     "comparator_shd": 0.0,
     "empty_shd": 30.0,
     "andrey_shd_mean": 0.4,
     "comparator_shd_mean": 0.4,
     "empty_shd_mean": 30.0,
     "andrey_worse_than_empty": 0,
     "comparator_worse_than_empty": 0,
     "andrey_fewer_errors": 0,
     "comparator_fewer_errors": 0,
     "andrey_skeleton_f1": 1.0,
     "comparator_skeleton_f1": 1.0,
     "andrey_arrowhead_f1": 1.0,
     "comparator_arrowhead_f1": 1.0,
     "complete": true,
     "different_graph": []
    },
    {
     "d": 20,
     "mean_degree": 2.0,
     "n": 1000,
     "seeds": 5,
     "fits": 5,
     "andrey_ok": 5,
     "andrey_timeouts": 0,
     "andrey_failed": 0,
     "comparator_ok": 5,
     "comparator_timeouts": 0,
     "comparator_failed": 0,
     "paired": 5,
     "andrey_s": 1.2241207040060544,
     "comparator_s": 4.0358234949962934,
     "ratio": 3.303811448724778,
     "same_graph": 5,
     "between_shd": 0.0,
     "andrey_shd": 1.0,
     "comparator_shd": 1.0,
     "empty_shd": 60.0,
     "andrey_shd_mean": 2.6,
     "comparator_shd_mean": 2.6,
     "empty_shd_mean": 60.0,
     "andrey_worse_than_empty": 0,
     "comparator_worse_than_empty": 0,
     "andrey_fewer_errors": 0,
     "comparator_fewer_errors": 0,
     "andrey_skeleton_f1": 0.9917355371900827,
     "comparator_skeleton_f1": 0.9917355371900827,
     "andrey_arrowhead_f1": 0.9917355371900827,
     "comparator_arrowhead_f1": 0.9917355371900827,
     "complete": true,
     "different_graph": []
    }
   ]
  },
  {
   "method": "GFCI",
   "setting": "alpha=0.05, indep_test='fisherz', lambda_value=1.0, score_func='local_score_BIC'",
   "solution": "andrey.gfci.numpy",
   "comparator": "Tetrad",
   "comparator_method": "GFCI",
   "comparator_setting": "alpha=0.05, indep_test='fisherz', lambda_value=1.0, score_func='local_score_BIC'",
   "comparator_solution": "tetrad.gfci",
   "regime": "latent_gauss_er",
   "note": "Tetrad is the causal-cmd 1.12.0 jar (tetrad-lib 7.6.3). Tetrad runs through a small Java driver that times the search call inside the JVM, after its warm-up searches in the same JVM; the whole process, with the JVM start, the driver's compile, and the CSV round trip, is recorded apart and not used. The JVM sees only the fit's cores. Its settings: fisher-z-test at alpha 0.05, sem-bic-score with penaltyDiscount 1 (Andrey's lambda_value), no structure prior (semBicStructurePrior 0), the standard penalty rule (semBicRule 1), no depth or path-length cap, the possible-d-separation step, the discriminating-path rule and the complete rule set R1-R10, causal-cmd's degree cap of 1,000, which no graph here reaches, and a precomputed covariance matrix, which changes its speed, not its answer. Beside each row: Andrey's FCI (Fisher-Z at alpha 0.05) on the same datasets (fci_*), the test-only search GFCI improves on; and Andrey's GFCI run with its GES step in the fit's four cores as worker processes (andrey_parallel_*), which returns the same PAG; andrey_parallel_ratio is the one-process time over the parallel time, below 1 where the parallel mode is slower. Andrey's GFCI and FCI ran on the build of 19 October 2026 with order-free possible-d-separation, whose orientation rules run in order-free rounds: every rule reads the graph as the round starts, an edge or endpoint the rules decide both ways stays undirected or a circle, and the rounds repeat to a fixed point, whose GFCI keeps every smallest separating set it finds rather than the first in column order, and whose possible-d-separation step (possible_dsep='order_free', the default) visits the pairs, the nodes of each search, and the subsets in a tie rank computed from each column's own data rather than in column order; Tetrad's fits and the empty graph ran on the build of 17 October 2026 with the same harness and data, so their records stand",
   "error_metric": "endpoint SHD between the estimated PAG and the true PAG of the observed variables: one per edge endpoint whose mark differs (tail, arrowhead, or circle), so a missing or extra edge counts its two endpoints and a reversed directed edge counts two. The empty graph's is twice the true PAG's edge count.",
   "hardware": "AMD EPYC 7713 64-Core Processor, 4 cores",
   "cores": 4,
   "build": "pre-release Andrey 0.7.0 build, 19 October 2026, with order-free possible-d-separation",
   "fit_protocol": "one fit at a time on an exclusive node, 4 cores per fit, 1 timed repeat and 1 warm-up fit per dataset, a 1800 s wall cap covering the warm-up and the timed fit, and a 30000 MB memory cap per fit",
   "same_graph_test": "the same PAG: endpoint SHD 0 between the two packages' PAGs",
   "complete": true,
   "rows": [
    {
     "d": 20,
     "mean_degree": 2.0,
     "latents": 2,
     "observed": 18,
     "n": 200,
     "seeds": 5,
     "fits": 5,
     "andrey_ok": 5,
     "andrey_timeouts": 0,
     "andrey_failed": 0,
     "comparator_ok": 5,
     "comparator_timeouts": 0,
     "comparator_failed": 0,
     "paired": 5,
     "andrey_s": 0.028631482000491815,
     "comparator_s": 0.035488031,
     "ratio": 1.2433055723583224,
     "under_speed_floor": true,
     "same_graph": 0,
     "between_shd": 8.0,
     "andrey_shd": 21.0,
     "comparator_shd": 22.0,
     "empty_shd": 48.0,
     "andrey_shd_mean": 20.4,
     "comparator_shd_mean": 22.2,
     "empty_shd_mean": 44.4,
     "andrey_worse_than_empty": 0,
     "comparator_worse_than_empty": 0,
     "andrey_fewer_errors": 4,
     "comparator_fewer_errors": 0,
     "andrey_skeleton_f1": 0.7804878048780487,
     "comparator_skeleton_f1": 0.7619047619047621,
     "andrey_arrowhead_f1": 0.6206896551724138,
     "comparator_arrowhead_f1": 0.6363636363636365,
     "fci_ok": 5,
     "fci_s": 0.006798906000767602,
     "fci_shd": 23.0,
     "fci_shd_mean": 21.2,
     "fci_worse_than_empty": 0,
     "andrey_parallel_ok": 5,
     "andrey_parallel_s": 0.03180678200078546,
     "andrey_parallel_same_graph": 5,
     "andrey_parallel_ratio": 0.9050186422219394,
     "complete": true,
     "different_graph": [
      {
       "dataset": "15fee938fe0e",
       "seed": 3,
       "between_shd": 8.0,
       "andrey_shd": 8.0,
       "comparator_shd": 10.0,
       "empty_shd": 36.0
      },
      {
       "dataset": "c79b42ba9a2f",
       "seed": 2,
       "between_shd": 9.0,
       "andrey_shd": 33.0,
       "comparator_shd": 34.0,
       "empty_shd": 48.0
      },
      {
       "dataset": "d8410295a003",
       "seed": 1,
       "between_shd": 19.0,
       "andrey_shd": 25.0,
       "comparator_shd": 30.0,
       "empty_shd": 50.0
      },
      {
       "dataset": "f72284b72157",
       "seed": 4,
       "between_shd": 8.0,
       "andrey_shd": 21.0,
       "comparator_shd": 22.0,
       "empty_shd": 50.0
      },
      {
       "dataset": "fe60cee48018",
       "seed": 0,
       "between_shd": 2.0,
       "andrey_shd": 15.0,
       "comparator_shd": 15.0,
       "empty_shd": 38.0
      }
     ]
    },
    {
     "d": 50,
     "mean_degree": 2.0,
     "latents": 5,
     "observed": 45,
     "n": 500,
     "seeds": 5,
     "fits": 5,
     "andrey_ok": 5,
     "andrey_timeouts": 0,
     "andrey_failed": 0,
     "comparator_ok": 5,
     "comparator_timeouts": 0,
     "comparator_failed": 0,
     "paired": 5,
     "andrey_s": 0.1624635699990904,
     "comparator_s": 0.297835839,
     "ratio": 1.2672175266805437,
     "same_graph": 0,
     "between_shd": 36.0,
     "andrey_shd": 30.0,
     "comparator_shd": 51.0,
     "empty_shd": 100.0,
     "andrey_shd_mean": 33.4,
     "comparator_shd_mean": 48.2,
     "empty_shd_mean": 100.0,
     "andrey_worse_than_empty": 0,
     "comparator_worse_than_empty": 0,
     "andrey_fewer_errors": 4,
     "comparator_fewer_errors": 1,
     "andrey_skeleton_f1": 0.8910891089108911,
     "comparator_skeleton_f1": 0.8085106382978723,
     "andrey_arrowhead_f1": 0.7710843373493976,
     "comparator_arrowhead_f1": 0.711111111111111,
     "fci_ok": 5,
     "fci_s": 0.069668857002398,
     "fci_shd": 46.0,
     "fci_shd_mean": 49.6,
     "fci_worse_than_empty": 0,
     "andrey_parallel_ok": 5,
     "andrey_parallel_s": 0.176099124000757,
     "andrey_parallel_same_graph": 5,
     "andrey_parallel_ratio": 0.9869230886858081,
     "complete": true,
     "different_graph": [
      {
       "dataset": "00cd8a602786",
       "seed": 2,
       "between_shd": 36.0,
       "andrey_shd": 27.0,
       "comparator_shd": 51.0,
       "empty_shd": 94.0
      },
      {
       "dataset": "5e6113d0d414",
       "seed": 4,
       "between_shd": 36.0,
       "andrey_shd": 54.0,
       "comparator_shd": 52.0,
       "empty_shd": 100.0
      },
      {
       "dataset": "895ce4b3cc86",
       "seed": 3,
       "between_shd": 12.0,
       "andrey_shd": 26.0,
       "comparator_shd": 33.0,
       "empty_shd": 106.0
      },
      {
       "dataset": "89a3fb06fa2c",
       "seed": 0,
       "between_shd": 25.0,
       "andrey_shd": 30.0,
       "comparator_shd": 44.0,
       "empty_shd": 104.0
      },
      {
       "dataset": "b6278faa4449",
       "seed": 1,
       "between_shd": 45.0,
       "andrey_shd": 30.0,
       "comparator_shd": 61.0,
       "empty_shd": 96.0
      }
     ]
    },
    {
     "d": 100,
     "mean_degree": 2.0,
     "latents": 10,
     "observed": 90,
     "n": 1000,
     "seeds": 5,
     "fits": 5,
     "andrey_ok": 5,
     "andrey_timeouts": 0,
     "andrey_failed": 0,
     "comparator_ok": 5,
     "comparator_timeouts": 0,
     "comparator_failed": 0,
     "paired": 5,
     "andrey_s": 0.5768090450001182,
     "comparator_s": 1.037353136,
     "ratio": 1.8959708339165222,
     "same_graph": 0,
     "between_shd": 78.0,
     "andrey_shd": 86.0,
     "comparator_shd": 114.0,
     "empty_shd": 218.0,
     "andrey_shd_mean": 88.6,
     "comparator_shd_mean": 123.6,
     "empty_shd_mean": 222.0,
     "andrey_worse_than_empty": 0,
     "comparator_worse_than_empty": 0,
     "andrey_fewer_errors": 5,
     "comparator_fewer_errors": 0,
     "andrey_skeleton_f1": 0.8241758241758242,
     "comparator_skeleton_f1": 0.8090909090909092,
     "andrey_arrowhead_f1": 0.7052023121387283,
     "comparator_arrowhead_f1": 0.6448598130841121,
     "fci_ok": 5,
     "fci_s": 0.19517768399964552,
     "fci_shd": 118.0,
     "fci_shd_mean": 124.2,
     "fci_worse_than_empty": 0,
     "andrey_parallel_ok": 5,
     "andrey_parallel_s": 0.6286520860012388,
     "andrey_parallel_same_graph": 5,
     "andrey_parallel_ratio": 0.8944069354095465,
     "complete": true,
     "different_graph": [
      {
       "dataset": "161e79dcd5bd",
       "seed": 4,
       "between_shd": 89.0,
       "andrey_shd": 62.0,
       "comparator_shd": 127.0,
       "empty_shd": 218.0
      },
      {
       "dataset": "49db7e61490b",
       "seed": 0,
       "between_shd": 63.0,
       "andrey_shd": 86.0,
       "comparator_shd": 113.0,
       "empty_shd": 216.0
      },
      {
       "dataset": "a87d802b4af2",
       "seed": 3,
       "between_shd": 78.0,
       "andrey_shd": 85.0,
       "comparator_shd": 114.0,
       "empty_shd": 222.0
      },
      {
       "dataset": "cd950d9c4f90",
       "seed": 1,
       "between_shd": 78.0,
       "andrey_shd": 118.0,
       "comparator_shd": 159.0,
       "empty_shd": 254.0
      },
      {
       "dataset": "dff3c40f66ca",
       "seed": 2,
       "between_shd": 49.0,
       "andrey_shd": 92.0,
       "comparator_shd": 105.0,
       "empty_shd": 200.0
      }
     ]
    },
    {
     "d": 200,
     "mean_degree": 2.0,
     "latents": 20,
     "observed": 180,
     "n": 2000,
     "seeds": 5,
     "fits": 5,
     "andrey_ok": 5,
     "andrey_timeouts": 0,
     "andrey_failed": 0,
     "comparator_ok": 5,
     "comparator_timeouts": 0,
     "comparator_failed": 0,
     "paired": 5,
     "andrey_s": 2.883846813998389,
     "comparator_s": 10.483507324,
     "ratio": 3.6484777225338805,
     "same_graph": 0,
     "between_shd": 193.0,
     "andrey_shd": 197.0,
     "comparator_shd": 325.0,
     "empty_shd": 444.0,
     "andrey_shd_mean": 209.4,
     "comparator_shd_mean": 317.6,
     "empty_shd_mean": 483.6,
     "andrey_worse_than_empty": 0,
     "comparator_worse_than_empty": 0,
     "andrey_fewer_errors": 5,
     "comparator_fewer_errors": 0,
     "andrey_skeleton_f1": 0.8194444444444444,
     "comparator_skeleton_f1": 0.7702127659574469,
     "andrey_arrowhead_f1": 0.7621483375959079,
     "comparator_arrowhead_f1": 0.6769911504424778,
     "fci_ok": 5,
     "fci_s": 0.9827383040028508,
     "fci_shd": 354.0,
     "fci_shd_mean": 341.0,
     "fci_worse_than_empty": 0,
     "andrey_parallel_ok": 5,
     "andrey_parallel_s": 3.5625205530013773,
     "andrey_parallel_same_graph": 5,
     "andrey_parallel_ratio": 0.8102679310258125,
     "complete": true,
     "different_graph": [
      {
       "dataset": "3f4d5495c823",
       "seed": 4,
       "between_shd": 178.0,
       "andrey_shd": 130.0,
       "comparator_shd": 237.0,
       "empty_shd": 432.0
      },
      {
       "dataset": "41cdb92da52d",
       "seed": 0,
       "between_shd": 197.0,
       "andrey_shd": 197.0,
       "comparator_shd": 333.0,
       "empty_shd": 442.0
      },
      {
       "dataset": "6c448272b703",
       "seed": 1,
       "between_shd": 200.0,
       "andrey_shd": 329.0,
       "comparator_shd": 436.0,
       "empty_shd": 608.0
      },
      {
       "dataset": "8ff5d98f1ca0",
       "seed": 3,
       "between_shd": 159.0,
       "andrey_shd": 134.0,
       "comparator_shd": 257.0,
       "empty_shd": 444.0
      },
      {
       "dataset": "cbbeb6c88c0f",
       "seed": 2,
       "between_shd": 193.0,
       "andrey_shd": 257.0,
       "comparator_shd": 325.0,
       "empty_shd": 492.0
      }
     ]
    }
   ]
  },
  {
   "method": "GIN",
   "setting": "alpha=0.05",
   "solution": "andrey.gin.numpy",
   "comparator": "Tetrad",
   "comparator_method": "Gin",
   "comparator_setting": "alpha=0.05, indep_test='kci'",
   "comparator_solution": "tetrad.gin",
   "regime": "latent_measurement",
   "note": "Tetrad's GIN comes from tetrad-lib 7.6.10, which no causal-cmd release bundles. Tetrad runs through a small Java driver that times the search call inside the JVM, after its warm-up searches in the same JVM; the whole process, with the JVM start, the driver's compile, and the CSV round trip, is recorded apart and not used. The JVM sees only the fit's cores. Tetrad's GIN takes a raw marginal independence test; it runs Tetrad's KCI under its defaults, a Gaussian kernel with a median-distance bandwidth and the gamma approximation, the family of the gamma-HSIC test Andrey's GIN runs, each with its own bandwidth rule, so the two can decide a test differently at alpha 0.05. Andrey's GIN ran on the build of 18 October 2026, whose root test runs once per cluster member, whose search follows each column's data rather than its position, and which builds each column's kernel matrix once per fit; the reference packages' fits ran on the build of 16 October 2026 with the same GIN harness and data (its regime draws a random column order of its own and takes no shuffle step), so their records stand. Its sizes are latent counts m = 2, 3, 4: d counts the latents and their indicators, 'observed' the 3 m indicators",
   "error_metric": "GIN returns a cluster of indicators per latent and an order of the latents, scored against the truth: cluster_ari, the adjusted Rand index of the two clusterings of the indicators (an unclustered indicator is a cluster of its own); clusters_found, the share of true clusters the estimate has exactly; order_accuracy, over the pairs of true latents whose clusters it has exactly, the share it orders as the truth does (no value when it has fewer than two); latents_found, the latents it returns. The error count, latents_missed, is the number of true latents whose indicators it does not return as one cluster. The empty graph finds no cluster: ARI 0, no cluster found, every latent missed.",
   "hardware": "AMD EPYC 7713 64-Core Processor, 4 cores",
   "cores": 4,
   "build": "pre-release Andrey 0.7.0 build, 18 October 2026",
   "fit_protocol": "one fit at a time on an exclusive node, 4 cores per fit, 1 timed repeat and 0 warm-up fits per dataset, a 1800 s wall cap covering the warm-up and the timed fit, and a 30000 MB memory cap per fit",
   "same_graph_test": "the same clusters and the same latent graph: equal structure hashes",
   "complete": true,
   "rows": [
    {
     "d": 8,
     "latents": 2,
     "observed": 6,
     "n": 1000,
     "seeds": 5,
     "fits": 5,
     "andrey_ok": 5,
     "andrey_timeouts": 0,
     "andrey_failed": 0,
     "comparator_ok": 5,
     "comparator_timeouts": 0,
     "comparator_failed": 0,
     "paired": 5,
     "andrey_s": 0.9052105270093307,
     "comparator_s": 72.10641625,
     "ratio": 79.74976880829307,
     "andrey_cluster_ari": 1.0,
     "andrey_clusters_found": 1.0,
     "andrey_order_accuracy": 1.0,
     "andrey_latents_found": 2.0,
     "andrey_latents_missed": 0.0,
     "andrey_latents_missed_mean": 0.0,
     "comparator_cluster_ari": 1.0,
     "comparator_clusters_found": 1.0,
     "comparator_order_accuracy": 1.0,
     "comparator_latents_found": 2.0,
     "comparator_latents_missed": 0.0,
     "comparator_latents_missed_mean": 0.0,
     "empty_cluster_ari": 0.0,
     "empty_clusters_found": 0.0,
     "empty_order_accuracy": null,
     "empty_latents_found": 0.0,
     "empty_latents_missed": 2.0,
     "empty_latents_missed_mean": 2.0,
     "same_graph": 3,
     "andrey_worse_than_empty": 0,
     "comparator_worse_than_empty": 0,
     "andrey_fewer_errors": 0,
     "comparator_fewer_errors": 0,
     "complete": true,
     "different_graph": [
      {
       "dataset": "40074ba26667",
       "seed": 1,
       "andrey_cluster_ari": 1.0,
       "andrey_clusters_found": 1.0,
       "andrey_order_accuracy": 1.0,
       "andrey_latents_found": 2.0,
       "comparator_cluster_ari": 1.0,
       "comparator_clusters_found": 1.0,
       "comparator_order_accuracy": 0.0,
       "comparator_latents_found": 2.0
      },
      {
       "dataset": "d39574334a7c",
       "seed": 2,
       "andrey_cluster_ari": 1.0,
       "andrey_clusters_found": 1.0,
       "andrey_order_accuracy": 1.0,
       "andrey_latents_found": 2.0,
       "comparator_cluster_ari": 1.0,
       "comparator_clusters_found": 1.0,
       "comparator_order_accuracy": 0.0,
       "comparator_latents_found": 2.0
      }
     ]
    },
    {
     "d": 12,
     "latents": 3,
     "observed": 9,
     "n": 1000,
     "seeds": 5,
     "fits": 5,
     "andrey_ok": 5,
     "andrey_timeouts": 0,
     "andrey_failed": 0,
     "comparator_ok": 5,
     "comparator_timeouts": 0,
     "comparator_failed": 0,
     "paired": 5,
     "andrey_s": 2.624784808984259,
     "comparator_s": 301.548799843,
     "ratio": 118.37343396032126,
     "andrey_cluster_ari": 1.0,
     "andrey_clusters_found": 1.0,
     "andrey_order_accuracy": 1.0,
     "andrey_latents_found": 3.0,
     "andrey_latents_missed": 0.0,
     "andrey_latents_missed_mean": 0.4,
     "comparator_cluster_ari": 1.0,
     "comparator_clusters_found": 1.0,
     "comparator_order_accuracy": 0.6666666666666666,
     "comparator_latents_found": 3.0,
     "comparator_latents_missed": 0.0,
     "comparator_latents_missed_mean": 0.4,
     "empty_cluster_ari": 0.0,
     "empty_clusters_found": 0.0,
     "empty_order_accuracy": null,
     "empty_latents_found": 0.0,
     "empty_latents_missed": 3.0,
     "empty_latents_missed_mean": 3.0,
     "same_graph": 1,
     "andrey_worse_than_empty": 0,
     "comparator_worse_than_empty": 0,
     "andrey_fewer_errors": 0,
     "comparator_fewer_errors": 0,
     "complete": true,
     "different_graph": [
      {
       "dataset": "1538da811776",
       "seed": 4,
       "andrey_cluster_ari": 1.0,
       "andrey_clusters_found": 1.0,
       "andrey_order_accuracy": 1.0,
       "andrey_latents_found": 3.0,
       "comparator_cluster_ari": 1.0,
       "comparator_clusters_found": 1.0,
       "comparator_order_accuracy": 0.6666666666666666,
       "comparator_latents_found": 3.0
      },
      {
       "dataset": "41b48bb0fec3",
       "seed": 2,
       "andrey_cluster_ari": 0.5,
       "andrey_clusters_found": 0.3333333333333333,
       "andrey_order_accuracy": null,
       "andrey_latents_found": 2.0,
       "comparator_cluster_ari": 0.5,
       "comparator_clusters_found": 0.3333333333333333,
       "comparator_order_accuracy": null,
       "comparator_latents_found": 2.0
      },
      {
       "dataset": "5b7d24b572d1",
       "seed": 1,
       "andrey_cluster_ari": 1.0,
       "andrey_clusters_found": 1.0,
       "andrey_order_accuracy": 1.0,
       "andrey_latents_found": 3.0,
       "comparator_cluster_ari": 1.0,
       "comparator_clusters_found": 1.0,
       "comparator_order_accuracy": 0.0,
       "comparator_latents_found": 3.0
      },
      {
       "dataset": "d9ccdb1cbc90",
       "seed": 0,
       "andrey_cluster_ari": 1.0,
       "andrey_clusters_found": 1.0,
       "andrey_order_accuracy": 1.0,
       "andrey_latents_found": 3.0,
       "comparator_cluster_ari": 1.0,
       "comparator_clusters_found": 1.0,
       "comparator_order_accuracy": 0.6666666666666666,
       "comparator_latents_found": 3.0
      }
     ]
    },
    {
     "d": 16,
     "latents": 4,
     "observed": 12,
     "n": 1000,
     "seeds": 5,
     "fits": 5,
     "andrey_ok": 5,
     "andrey_timeouts": 0,
     "andrey_failed": 0,
     "comparator_ok": 5,
     "comparator_timeouts": 0,
     "comparator_failed": 0,
     "paired": 5,
     "andrey_s": 5.295966318022693,
     "comparator_s": 805.313229396,
     "ratio": 146.28926151384073,
     "andrey_cluster_ari": 0.8910891089108911,
     "andrey_clusters_found": 0.75,
     "andrey_order_accuracy": 1.0,
     "andrey_latents_found": 4.0,
     "andrey_latents_missed": 1.0,
     "andrey_latents_missed_mean": 1.0,
     "comparator_cluster_ari": 0.8307692307692308,
     "comparator_clusters_found": 0.75,
     "comparator_order_accuracy": 0.6666666666666666,
     "comparator_latents_found": 3.0,
     "comparator_latents_missed": 1.0,
     "comparator_latents_missed_mean": 1.2,
     "empty_cluster_ari": 0.0,
     "empty_clusters_found": 0.0,
     "empty_order_accuracy": null,
     "empty_latents_found": 0.0,
     "empty_latents_missed": 4.0,
     "empty_latents_missed_mean": 4.0,
     "same_graph": 1,
     "andrey_worse_than_empty": 0,
     "comparator_worse_than_empty": 0,
     "andrey_fewer_errors": 1,
     "comparator_fewer_errors": 0,
     "complete": true,
     "different_graph": [
      {
       "dataset": "6414621c8fa9",
       "seed": 4,
       "andrey_cluster_ari": 0.6451612903225806,
       "andrey_clusters_found": 0.5,
       "andrey_order_accuracy": 1.0,
       "andrey_latents_found": 3.0,
       "comparator_cluster_ari": 0.6451612903225806,
       "comparator_clusters_found": 0.5,
       "comparator_order_accuracy": 0.0,
       "comparator_latents_found": 3.0
      },
      {
       "dataset": "79bd6e43dc13",
       "seed": 3,
       "andrey_cluster_ari": 0.6451612903225806,
       "andrey_clusters_found": 0.5,
       "andrey_order_accuracy": 1.0,
       "andrey_latents_found": 3.0,
       "comparator_cluster_ari": 0.6451612903225806,
       "comparator_clusters_found": 0.5,
       "comparator_order_accuracy": 0.0,
       "comparator_latents_found": 3.0
      },
      {
       "dataset": "ad0fa40f161c",
       "seed": 1,
       "andrey_cluster_ari": 0.8910891089108911,
       "andrey_clusters_found": 0.75,
       "andrey_order_accuracy": 1.0,
       "andrey_latents_found": 4.0,
       "comparator_cluster_ari": 0.8307692307692308,
       "comparator_clusters_found": 0.75,
       "comparator_order_accuracy": 0.6666666666666666,
       "comparator_latents_found": 3.0
      },
      {
       "dataset": "f24e0d5ee4ec",
       "seed": 0,
       "andrey_cluster_ari": 1.0,
       "andrey_clusters_found": 1.0,
       "andrey_order_accuracy": 0.0,
       "andrey_latents_found": 4.0,
       "comparator_cluster_ari": 0.8910891089108911,
       "comparator_clusters_found": 0.75,
       "comparator_order_accuracy": 0.6666666666666666,
       "comparator_latents_found": 4.0
      }
     ]
    }
   ]
  },
  {
   "method": "GIN",
   "setting": "alpha=0.05",
   "solution": "andrey.gin.numpy",
   "comparator": "causal-learn",
   "comparator_method": "GIN",
   "comparator_setting": "alpha=0.05, indep_test_method='hsic'",
   "comparator_solution": "causal-learn.gin",
   "regime": "latent_measurement",
   "note": "causal-learn 0.1.4.8's GIN with indep_test_method='hsic', its gamma-approximation HSIC test, the test Andrey's GIN runs, with one fix applied: in both search phases its GIN tests the residual against the column at each loop counter (range(len(...))) instead of the column of each variable it names, so it tests the wrong columns whenever the remaining variables are not the first ones; the fix indexes the data by the variable (py-why/causal-learn issue 271). A cluster it cannot order is in its graph only, read as a latent pointing into its members. Andrey's GIN ran on the build of 18 October 2026, whose root test runs once per cluster member, whose search follows each column's data rather than its position, and which builds each column's kernel matrix once per fit; the reference packages' fits ran on the build of 16 October 2026 with the same GIN harness and data (its regime draws a random column order of its own and takes no shuffle step), so their records stand. Its sizes are latent counts m = 2, 3, 4: d counts the latents and their indicators, 'observed' the 3 m indicators",
   "error_metric": "GIN returns a cluster of indicators per latent and an order of the latents, scored against the truth: cluster_ari, the adjusted Rand index of the two clusterings of the indicators (an unclustered indicator is a cluster of its own); clusters_found, the share of true clusters the estimate has exactly; order_accuracy, over the pairs of true latents whose clusters it has exactly, the share it orders as the truth does (no value when it has fewer than two); latents_found, the latents it returns. The error count, latents_missed, is the number of true latents whose indicators it does not return as one cluster. The empty graph finds no cluster: ARI 0, no cluster found, every latent missed.",
   "hardware": "AMD EPYC 7713 64-Core Processor, 4 cores",
   "cores": 4,
   "build": "pre-release Andrey 0.7.0 build, 18 October 2026",
   "fit_protocol": "one fit at a time on an exclusive node, 4 cores per fit, 1 timed repeat and 0 warm-up fits per dataset, a 1800 s wall cap covering the warm-up and the timed fit, and a 30000 MB memory cap per fit",
   "same_graph_test": "the same clusters and the same latent graph: equal structure hashes",
   "complete": true,
   "rows": [
    {
     "d": 8,
     "latents": 2,
     "observed": 6,
     "n": 1000,
     "seeds": 5,
     "fits": 5,
     "andrey_ok": 5,
     "andrey_timeouts": 0,
     "andrey_failed": 0,
     "comparator_ok": 5,
     "comparator_timeouts": 0,
     "comparator_failed": 0,
     "paired": 5,
     "andrey_s": 0.9052105270093307,
     "comparator_s": 3.4770118019996517,
     "ratio": 3.844873679826788,
     "andrey_cluster_ari": 1.0,
     "andrey_clusters_found": 1.0,
     "andrey_order_accuracy": 1.0,
     "andrey_latents_found": 2.0,
     "andrey_latents_missed": 0.0,
     "andrey_latents_missed_mean": 0.0,
     "comparator_cluster_ari": 1.0,
     "comparator_clusters_found": 1.0,
     "comparator_order_accuracy": 1.0,
     "comparator_latents_found": 2.0,
     "comparator_latents_missed": 0.0,
     "comparator_latents_missed_mean": 0.0,
     "empty_cluster_ari": 0.0,
     "empty_clusters_found": 0.0,
     "empty_order_accuracy": null,
     "empty_latents_found": 0.0,
     "empty_latents_missed": 2.0,
     "empty_latents_missed_mean": 2.0,
     "same_graph": 3,
     "andrey_worse_than_empty": 0,
     "comparator_worse_than_empty": 0,
     "andrey_fewer_errors": 0,
     "comparator_fewer_errors": 0,
     "complete": true,
     "different_graph": [
      {
       "dataset": "40074ba26667",
       "seed": 1,
       "andrey_cluster_ari": 1.0,
       "andrey_clusters_found": 1.0,
       "andrey_order_accuracy": 1.0,
       "andrey_latents_found": 2.0,
       "comparator_cluster_ari": 1.0,
       "comparator_clusters_found": 1.0,
       "comparator_order_accuracy": 0.0,
       "comparator_latents_found": 2.0
      },
      {
       "dataset": "d39574334a7c",
       "seed": 2,
       "andrey_cluster_ari": 1.0,
       "andrey_clusters_found": 1.0,
       "andrey_order_accuracy": 1.0,
       "andrey_latents_found": 2.0,
       "comparator_cluster_ari": 1.0,
       "comparator_clusters_found": 1.0,
       "comparator_order_accuracy": 0.0,
       "comparator_latents_found": 2.0
      }
     ]
    },
    {
     "d": 12,
     "latents": 3,
     "observed": 9,
     "n": 1000,
     "seeds": 5,
     "fits": 5,
     "andrey_ok": 5,
     "andrey_timeouts": 0,
     "andrey_failed": 0,
     "comparator_ok": 5,
     "comparator_timeouts": 0,
     "comparator_failed": 0,
     "paired": 5,
     "andrey_s": 2.624784808984259,
     "comparator_s": 14.64615058399977,
     "ratio": 5.579943366735479,
     "andrey_cluster_ari": 1.0,
     "andrey_clusters_found": 1.0,
     "andrey_order_accuracy": 1.0,
     "andrey_latents_found": 3.0,
     "andrey_latents_missed": 0.0,
     "andrey_latents_missed_mean": 0.4,
     "comparator_cluster_ari": 1.0,
     "comparator_clusters_found": 1.0,
     "comparator_order_accuracy": 0.6666666666666666,
     "comparator_latents_found": 3.0,
     "comparator_latents_missed": 0.0,
     "comparator_latents_missed_mean": 0.4,
     "empty_cluster_ari": 0.0,
     "empty_clusters_found": 0.0,
     "empty_order_accuracy": null,
     "empty_latents_found": 0.0,
     "empty_latents_missed": 3.0,
     "empty_latents_missed_mean": 3.0,
     "same_graph": 1,
     "andrey_worse_than_empty": 0,
     "comparator_worse_than_empty": 0,
     "andrey_fewer_errors": 0,
     "comparator_fewer_errors": 0,
     "complete": true,
     "different_graph": [
      {
       "dataset": "1538da811776",
       "seed": 4,
       "andrey_cluster_ari": 1.0,
       "andrey_clusters_found": 1.0,
       "andrey_order_accuracy": 1.0,
       "andrey_latents_found": 3.0,
       "comparator_cluster_ari": 1.0,
       "comparator_clusters_found": 1.0,
       "comparator_order_accuracy": 0.6666666666666666,
       "comparator_latents_found": 3.0
      },
      {
       "dataset": "41b48bb0fec3",
       "seed": 2,
       "andrey_cluster_ari": 0.5,
       "andrey_clusters_found": 0.3333333333333333,
       "andrey_order_accuracy": null,
       "andrey_latents_found": 2.0,
       "comparator_cluster_ari": 0.5,
       "comparator_clusters_found": 0.3333333333333333,
       "comparator_order_accuracy": null,
       "comparator_latents_found": 2.0
      },
      {
       "dataset": "5b7d24b572d1",
       "seed": 1,
       "andrey_cluster_ari": 1.0,
       "andrey_clusters_found": 1.0,
       "andrey_order_accuracy": 1.0,
       "andrey_latents_found": 3.0,
       "comparator_cluster_ari": 1.0,
       "comparator_clusters_found": 1.0,
       "comparator_order_accuracy": 0.0,
       "comparator_latents_found": 3.0
      },
      {
       "dataset": "d9ccdb1cbc90",
       "seed": 0,
       "andrey_cluster_ari": 1.0,
       "andrey_clusters_found": 1.0,
       "andrey_order_accuracy": 1.0,
       "andrey_latents_found": 3.0,
       "comparator_cluster_ari": 1.0,
       "comparator_clusters_found": 1.0,
       "comparator_order_accuracy": 0.6666666666666666,
       "comparator_latents_found": 3.0
      }
     ]
    },
    {
     "d": 16,
     "latents": 4,
     "observed": 12,
     "n": 1000,
     "seeds": 5,
     "fits": 5,
     "andrey_ok": 5,
     "andrey_timeouts": 0,
     "andrey_failed": 0,
     "comparator_ok": 5,
     "comparator_timeouts": 0,
     "comparator_failed": 0,
     "paired": 5,
     "andrey_s": 5.295966318022693,
     "comparator_s": 38.141541484999834,
     "ratio": 7.137602905412097,
     "andrey_cluster_ari": 0.8910891089108911,
     "andrey_clusters_found": 0.75,
     "andrey_order_accuracy": 1.0,
     "andrey_latents_found": 4.0,
     "andrey_latents_missed": 1.0,
     "andrey_latents_missed_mean": 1.0,
     "comparator_cluster_ari": 0.8910891089108911,
     "comparator_clusters_found": 0.75,
     "comparator_order_accuracy": 0.3333333333333333,
     "comparator_latents_found": 4.0,
     "comparator_latents_missed": 1.0,
     "comparator_latents_missed_mean": 1.0,
     "empty_cluster_ari": 0.0,
     "empty_clusters_found": 0.0,
     "empty_order_accuracy": null,
     "empty_latents_found": 0.0,
     "empty_latents_missed": 4.0,
     "empty_latents_missed_mean": 4.0,
     "same_graph": 1,
     "andrey_worse_than_empty": 0,
     "comparator_worse_than_empty": 0,
     "andrey_fewer_errors": 0,
     "comparator_fewer_errors": 0,
     "complete": true,
     "different_graph": [
      {
       "dataset": "6414621c8fa9",
       "seed": 4,
       "andrey_cluster_ari": 0.6451612903225806,
       "andrey_clusters_found": 0.5,
       "andrey_order_accuracy": 1.0,
       "andrey_latents_found": 3.0,
       "comparator_cluster_ari": 0.6451612903225806,
       "comparator_clusters_found": 0.5,
       "comparator_order_accuracy": 0.0,
       "comparator_latents_found": 3.0
      },
      {
       "dataset": "79bd6e43dc13",
       "seed": 3,
       "andrey_cluster_ari": 0.6451612903225806,
       "andrey_clusters_found": 0.5,
       "andrey_order_accuracy": 1.0,
       "andrey_latents_found": 3.0,
       "comparator_cluster_ari": 0.6451612903225806,
       "comparator_clusters_found": 0.5,
       "comparator_order_accuracy": 0.0,
       "comparator_latents_found": 3.0
      },
      {
       "dataset": "ad0fa40f161c",
       "seed": 1,
       "andrey_cluster_ari": 0.8910891089108911,
       "andrey_clusters_found": 0.75,
       "andrey_order_accuracy": 1.0,
       "andrey_latents_found": 4.0,
       "comparator_cluster_ari": 0.8910891089108911,
       "comparator_clusters_found": 0.75,
       "comparator_order_accuracy": 0.3333333333333333,
       "comparator_latents_found": 4.0
      },
      {
       "dataset": "f24e0d5ee4ec",
       "seed": 0,
       "andrey_cluster_ari": 1.0,
       "andrey_clusters_found": 1.0,
       "andrey_order_accuracy": 0.0,
       "andrey_latents_found": 4.0,
       "comparator_cluster_ari": 1.0,
       "comparator_clusters_found": 1.0,
       "comparator_order_accuracy": 0.5,
       "comparator_latents_found": 4.0
      }
     ]
    }
   ]
  },
  {
   "method": "CALM",
   "setting": "alpha=0.01, gate_threshold=0.5, h_tol=1e-08, lambda1=0.005, lr=0.01, max_outer=25, rho_init=0.001, rho_max=1e+16, rho_mult=3.0, seed=0, standardize=False, subproblem_iter=3000, tau=0.5, w_threshold=0.3",
   "solution": "andrey.calm.torch-cpu",
   "comparator": "causal-learn",
   "comparator_method": "calm",
   "comparator_setting": "alpha=0.01, h_tol=1e-08, lambda1=0.005, rho_init=1e-05, rho_mult=3.0, seed=0, standardize=False, subproblem_iter=40000, tau=0.5",
   "comparator_solution": "causal-learn.calm",
   "regime": "linear_gauss_er",
   "note": "causal-learn's calm is the CALM authors' implementation, run with its defaults, the paper's schedule: 40,000 Adam steps per round at learning rate 0.001, rho from 1e-5, up to 100 rounds, no weight threshold. Every CALM fit runs serially on torch's CPU build with the optimizer seed fixed at 0, with no warm-up fit, under a 3600 s cap, and returns a DAG, compared through its CPDAG. causal-learn stops after 100 rounds whether or not the support is acyclic, and a returned cycle would end its fit as failed; Andrey's row runs its own defaults: up to 25 rounds of up to 3,000 steps at learning rate 0.01, rho from 1e-3, and a weight threshold of 0.3; a round can end before its last step once the loss stops changing",
   "error_metric": "SHD between the estimate's CPDAG and the true DAG's CPDAG: one per variable pair whose edge differs (missing, extra, or oriented differently); a DAG estimate is compared through its CPDAG, so DAGs of one equivalence class count as the same graph. The empty graph's SHD is the number of true edges.",
   "hardware": "AMD EPYC 7713 64-Core Processor, 4 cores",
   "cores": 4,
   "build": "pre-release Andrey 0.7.0 build, 17 October 2026",
   "fit_protocol": "one fit at a time on an exclusive node, 4 cores per fit, 1 timed repeat and 0 warm-up fits per dataset, a 3600 s wall cap covering the warm-up and the timed fit, and a 30000 MB memory cap per fit",
   "same_graph_test": "the same CPDAG: SHD 0 between the two packages' CPDAGs",
   "complete": true,
   "rows": [
    {
     "d": 10,
     "mean_degree": 2.0,
     "n": 100,
     "seeds": 5,
     "fits": 5,
     "andrey_ok": 5,
     "andrey_timeouts": 0,
     "andrey_failed": 0,
     "comparator_ok": 5,
     "comparator_timeouts": 0,
     "comparator_failed": 0,
     "paired": 5,
     "andrey_s": 17.9419447260002,
     "comparator_s": 498.40563306200005,
     "ratio": 26.180390444259054,
     "same_graph": 0,
     "between_shd": 8.0,
     "andrey_shd": 6.0,
     "comparator_shd": 8.0,
     "empty_shd": 10.0,
     "andrey_shd_mean": 6.0,
     "comparator_shd_mean": 7.6,
     "empty_shd_mean": 10.0,
     "andrey_worse_than_empty": 0,
     "comparator_worse_than_empty": 1,
     "andrey_fewer_errors": 3,
     "comparator_fewer_errors": 2,
     "andrey_skeleton_f1": 0.888888888888889,
     "comparator_skeleton_f1": 0.8333333333333333,
     "andrey_arrowhead_f1": 0.4615384615384615,
     "comparator_arrowhead_f1": 0.5333333333333333,
     "complete": true,
     "different_graph": [
      {
       "dataset": "0eb8a9c5f72e",
       "seed": 4,
       "between_shd": 8.0,
       "andrey_shd": 4.0,
       "comparator_shd": 8.0,
       "empty_shd": 10.0
      },
      {
       "dataset": "67c2db92d4e7",
       "seed": 1,
       "between_shd": 6.0,
       "andrey_shd": 8.0,
       "comparator_shd": 7.0,
       "empty_shd": 10.0
      },
      {
       "dataset": "a56d117f2b72",
       "seed": 2,
       "between_shd": 8.0,
       "andrey_shd": 6.0,
       "comparator_shd": 11.0,
       "empty_shd": 10.0
      },
      {
       "dataset": "e8745f53f280",
       "seed": 3,
       "between_shd": 6.0,
       "andrey_shd": 6.0,
       "comparator_shd": 2.0,
       "empty_shd": 10.0
      },
      {
       "dataset": "e8e12e887f9d",
       "seed": 0,
       "between_shd": 12.0,
       "andrey_shd": 6.0,
       "comparator_shd": 10.0,
       "empty_shd": 10.0
      }
     ]
    },
    {
     "d": 20,
     "mean_degree": 2.0,
     "n": 200,
     "seeds": 5,
     "fits": 5,
     "andrey_ok": 5,
     "andrey_timeouts": 0,
     "andrey_failed": 0,
     "comparator_ok": 5,
     "comparator_timeouts": 0,
     "comparator_failed": 0,
     "paired": 5,
     "andrey_s": 39.70086836799965,
     "comparator_s": 817.066184329,
     "ratio": 21.916627356955765,
     "same_graph": 0,
     "between_shd": 13.0,
     "andrey_shd": 8.0,
     "comparator_shd": 12.0,
     "empty_shd": 20.0,
     "andrey_shd_mean": 7.6,
     "comparator_shd_mean": 12.0,
     "empty_shd_mean": 20.0,
     "andrey_worse_than_empty": 0,
     "comparator_worse_than_empty": 0,
     "andrey_fewer_errors": 4,
     "comparator_fewer_errors": 1,
     "andrey_skeleton_f1": 0.8947368421052632,
     "comparator_skeleton_f1": 0.8444444444444444,
     "andrey_arrowhead_f1": 0.6956521739130436,
     "comparator_arrowhead_f1": 0.6470588235294118,
     "complete": true,
     "different_graph": [
      {
       "dataset": "297729421a36",
       "seed": 0,
       "between_shd": 18.0,
       "andrey_shd": 3.0,
       "comparator_shd": 15.0,
       "empty_shd": 20.0
      },
      {
       "dataset": "43971a35b202",
       "seed": 1,
       "between_shd": 15.0,
       "andrey_shd": 11.0,
       "comparator_shd": 8.0,
       "empty_shd": 20.0
      },
      {
       "dataset": "7b3b71b75b80",
       "seed": 4,
       "between_shd": 9.0,
       "andrey_shd": 8.0,
       "comparator_shd": 11.0,
       "empty_shd": 20.0
      },
      {
       "dataset": "a668fc7e304e",
       "seed": 3,
       "between_shd": 10.0,
       "andrey_shd": 5.0,
       "comparator_shd": 12.0,
       "empty_shd": 20.0
      },
      {
       "dataset": "b40ad7e32042",
       "seed": 2,
       "between_shd": 13.0,
       "andrey_shd": 11.0,
       "comparator_shd": 14.0,
       "empty_shd": 20.0
      }
     ]
    },
    {
     "d": 50,
     "mean_degree": 2.0,
     "n": 500,
     "seeds": 5,
     "fits": 5,
     "andrey_ok": 5,
     "andrey_timeouts": 0,
     "andrey_failed": 0,
     "comparator_ok": 5,
     "comparator_timeouts": 0,
     "comparator_failed": 0,
     "paired": 5,
     "andrey_s": 58.97032229200704,
     "comparator_s": 1146.1803716070135,
     "ratio": 19.43656278375757,
     "same_graph": 0,
     "between_shd": 30.0,
     "andrey_shd": 15.0,
     "comparator_shd": 20.0,
     "empty_shd": 50.0,
     "andrey_shd_mean": 14.0,
     "comparator_shd_mean": 22.2,
     "empty_shd_mean": 50.0,
     "andrey_worse_than_empty": 0,
     "comparator_worse_than_empty": 0,
     "andrey_fewer_errors": 4,
     "comparator_fewer_errors": 0,
     "andrey_skeleton_f1": 0.9010989010989011,
     "comparator_skeleton_f1": 0.8928571428571428,
     "andrey_arrowhead_f1": 0.782608695652174,
     "comparator_arrowhead_f1": 0.7628865979381443,
     "complete": true,
     "different_graph": [
      {
       "dataset": "0ef527e3e8e4",
       "seed": 2,
       "between_shd": 36.0,
       "andrey_shd": 16.0,
       "comparator_shd": 27.0,
       "empty_shd": 50.0
      },
      {
       "dataset": "25bfa5cf3dbd",
       "seed": 1,
       "between_shd": 35.0,
       "andrey_shd": 10.0,
       "comparator_shd": 25.0,
       "empty_shd": 50.0
      },
      {
       "dataset": "641479828828",
       "seed": 4,
       "between_shd": 30.0,
       "andrey_shd": 19.0,
       "comparator_shd": 19.0,
       "empty_shd": 50.0
      },
      {
       "dataset": "6c6d2157b81c",
       "seed": 3,
       "between_shd": 26.0,
       "andrey_shd": 15.0,
       "comparator_shd": 20.0,
       "empty_shd": 50.0
      },
      {
       "dataset": "e84b0c0b0ebd",
       "seed": 0,
       "between_shd": 22.0,
       "andrey_shd": 10.0,
       "comparator_shd": 20.0,
       "empty_shd": 50.0
      }
     ]
    }
   ]
  },
  {
   "method": "CALM, paper schedule",
   "setting": "alpha=0.01, gate_threshold=0.5, h_tol=1e-08, lambda1=0.005, lr=0.001, max_outer=100, rho_init=1e-05, rho_max=1e+16, rho_mult=3.0, seed=0, standardize=False, subproblem_iter=40000, tau=0.5, w_threshold=0.0",
   "solution": "andrey.calm.torch-cpu.paper_schedule",
   "comparator": "causal-learn",
   "comparator_method": "calm",
   "comparator_setting": "alpha=0.01, h_tol=1e-08, lambda1=0.005, rho_init=1e-05, rho_mult=3.0, seed=0, standardize=False, subproblem_iter=40000, tau=0.5",
   "comparator_solution": "causal-learn.calm",
   "regime": "linear_gauss_er",
   "note": "causal-learn's calm is the CALM authors' implementation, run with its defaults, the paper's schedule: 40,000 Adam steps per round at learning rate 0.001, rho from 1e-5, up to 100 rounds, no weight threshold. Every CALM fit runs serially on torch's CPU build with the optimizer seed fixed at 0, with no warm-up fit, under a 3600 s cap, and returns a DAG, compared through its CPDAG. causal-learn stops after 100 rounds whether or not the support is acyclic, and a returned cycle would end its fit as failed; Andrey's row runs the paper's schedule, as causal-learn does, except that a round can end before its last step once the loss stops changing",
   "error_metric": "SHD between the estimate's CPDAG and the true DAG's CPDAG: one per variable pair whose edge differs (missing, extra, or oriented differently); a DAG estimate is compared through its CPDAG, so DAGs of one equivalence class count as the same graph. The empty graph's SHD is the number of true edges.",
   "hardware": "AMD EPYC 7713 64-Core Processor, 4 cores",
   "cores": 4,
   "build": "pre-release Andrey 0.7.0 build, 17 October 2026",
   "fit_protocol": "one fit at a time on an exclusive node, 4 cores per fit, 1 timed repeat and 0 warm-up fits per dataset, a 3600 s wall cap covering the warm-up and the timed fit, and a 30000 MB memory cap per fit",
   "same_graph_test": "the same CPDAG: SHD 0 between the two packages' CPDAGs",
   "complete": true,
   "rows": [
    {
     "d": 10,
     "mean_degree": 2.0,
     "n": 100,
     "seeds": 5,
     "fits": 5,
     "andrey_ok": 5,
     "andrey_timeouts": 0,
     "andrey_failed": 0,
     "comparator_ok": 5,
     "comparator_timeouts": 0,
     "comparator_failed": 0,
     "paired": 5,
     "andrey_s": 174.40724810100028,
     "comparator_s": 498.40563306200005,
     "ratio": 2.8946298675943605,
     "same_graph": 0,
     "between_shd": 8.0,
     "andrey_shd": 6.0,
     "comparator_shd": 8.0,
     "empty_shd": 10.0,
     "andrey_shd_mean": 6.6,
     "comparator_shd_mean": 7.6,
     "empty_shd_mean": 10.0,
     "andrey_worse_than_empty": 0,
     "comparator_worse_than_empty": 1,
     "andrey_fewer_errors": 3,
     "comparator_fewer_errors": 2,
     "andrey_skeleton_f1": 0.888888888888889,
     "comparator_skeleton_f1": 0.8333333333333333,
     "andrey_arrowhead_f1": 0.26666666666666666,
     "comparator_arrowhead_f1": 0.5333333333333333,
     "complete": true,
     "different_graph": [
      {
       "dataset": "0eb8a9c5f72e",
       "seed": 4,
       "between_shd": 8.0,
       "andrey_shd": 4.0,
       "comparator_shd": 8.0,
       "empty_shd": 10.0
      },
      {
       "dataset": "67c2db92d4e7",
       "seed": 1,
       "between_shd": 5.0,
       "andrey_shd": 8.0,
       "comparator_shd": 7.0,
       "empty_shd": 10.0
      },
      {
       "dataset": "a56d117f2b72",
       "seed": 2,
       "between_shd": 8.0,
       "andrey_shd": 9.0,
       "comparator_shd": 11.0,
       "empty_shd": 10.0
      },
      {
       "dataset": "e8745f53f280",
       "seed": 3,
       "between_shd": 7.0,
       "andrey_shd": 6.0,
       "comparator_shd": 2.0,
       "empty_shd": 10.0
      },
      {
       "dataset": "e8e12e887f9d",
       "seed": 0,
       "between_shd": 12.0,
       "andrey_shd": 6.0,
       "comparator_shd": 10.0,
       "empty_shd": 10.0
      }
     ]
    },
    {
     "d": 20,
     "mean_degree": 2.0,
     "n": 200,
     "seeds": 5,
     "fits": 5,
     "andrey_ok": 5,
     "andrey_timeouts": 0,
     "andrey_failed": 0,
     "comparator_ok": 5,
     "comparator_timeouts": 0,
     "comparator_failed": 0,
     "paired": 5,
     "andrey_s": 281.8481827879996,
     "comparator_s": 817.066184329,
     "ratio": 2.9471251070611517,
     "same_graph": 0,
     "between_shd": 9.0,
     "andrey_shd": 9.0,
     "comparator_shd": 12.0,
     "empty_shd": 20.0,
     "andrey_shd_mean": 9.8,
     "comparator_shd_mean": 12.0,
     "empty_shd_mean": 20.0,
     "andrey_worse_than_empty": 0,
     "comparator_worse_than_empty": 0,
     "andrey_fewer_errors": 4,
     "comparator_fewer_errors": 1,
     "andrey_skeleton_f1": 0.8947368421052632,
     "comparator_skeleton_f1": 0.8444444444444444,
     "andrey_arrowhead_f1": 0.6956521739130436,
     "comparator_arrowhead_f1": 0.6470588235294118,
     "complete": true,
     "different_graph": [
      {
       "dataset": "297729421a36",
       "seed": 0,
       "between_shd": 15.0,
       "andrey_shd": 5.0,
       "comparator_shd": 15.0,
       "empty_shd": 20.0
      },
      {
       "dataset": "43971a35b202",
       "seed": 1,
       "between_shd": 18.0,
       "andrey_shd": 14.0,
       "comparator_shd": 8.0,
       "empty_shd": 20.0
      },
      {
       "dataset": "7b3b71b75b80",
       "seed": 4,
       "between_shd": 9.0,
       "andrey_shd": 8.0,
       "comparator_shd": 11.0,
       "empty_shd": 20.0
      },
      {
       "dataset": "a668fc7e304e",
       "seed": 3,
       "between_shd": 9.0,
       "andrey_shd": 9.0,
       "comparator_shd": 12.0,
       "empty_shd": 20.0
      },
      {
       "dataset": "b40ad7e32042",
       "seed": 2,
       "between_shd": 7.0,
       "andrey_shd": 13.0,
       "comparator_shd": 14.0,
       "empty_shd": 20.0
      }
     ]
    },
    {
     "d": 50,
     "mean_degree": 2.0,
     "n": 500,
     "seeds": 5,
     "fits": 5,
     "andrey_ok": 5,
     "andrey_timeouts": 0,
     "andrey_failed": 0,
     "comparator_ok": 5,
     "comparator_timeouts": 0,
     "comparator_failed": 0,
     "paired": 5,
     "andrey_s": 472.41028615797404,
     "comparator_s": 1146.1803716070135,
     "ratio": 2.4357163695187074,
     "same_graph": 0,
     "between_shd": 18.0,
     "andrey_shd": 12.0,
     "comparator_shd": 20.0,
     "empty_shd": 50.0,
     "andrey_shd_mean": 12.4,
     "comparator_shd_mean": 22.2,
     "empty_shd_mean": 50.0,
     "andrey_worse_than_empty": 0,
     "comparator_worse_than_empty": 0,
     "andrey_fewer_errors": 4,
     "comparator_fewer_errors": 0,
     "andrey_skeleton_f1": 0.9166666666666666,
     "comparator_skeleton_f1": 0.8928571428571428,
     "andrey_arrowhead_f1": 0.8450704225352113,
     "comparator_arrowhead_f1": 0.7628865979381443,
     "complete": true,
     "different_graph": [
      {
       "dataset": "0ef527e3e8e4",
       "seed": 2,
       "between_shd": 27.0,
       "andrey_shd": 12.0,
       "comparator_shd": 27.0,
       "empty_shd": 50.0
      },
      {
       "dataset": "25bfa5cf3dbd",
       "seed": 1,
       "between_shd": 29.0,
       "andrey_shd": 13.0,
       "comparator_shd": 25.0,
       "empty_shd": 50.0
      },
      {
       "dataset": "641479828828",
       "seed": 4,
       "between_shd": 16.0,
       "andrey_shd": 19.0,
       "comparator_shd": 19.0,
       "empty_shd": 50.0
      },
      {
       "dataset": "6c6d2157b81c",
       "seed": 3,
       "between_shd": 18.0,
       "andrey_shd": 12.0,
       "comparator_shd": 20.0,
       "empty_shd": 50.0
      },
      {
       "dataset": "e84b0c0b0ebd",
       "seed": 0,
       "between_shd": 18.0,
       "andrey_shd": 6.0,
       "comparator_shd": 20.0,
       "empty_shd": 50.0
      }
     ]
    }
   ]
  },
  {
   "method": "CD-NOD",
   "setting": "alpha=0.05, indep_test='fisherz', n_domains=4",
   "solution": "andrey.cdnod.numpy",
   "comparator": "causal-learn",
   "comparator_method": "cdnod",
   "comparator_setting": "alpha=0.05, indep_test='fisherz', n_domains=4, stable=True, uc_priority=2, uc_rule=0",
   "comparator_solution": "causal-learn.cdnod",
   "regime": "domain_shift_er",
   "note": "Both run Fisher-Z at alpha 0.05 with a stable skeleton search and rebuild the domain index from the rows (four domains). Andrey orients the index's edges first and ranks the colliders by the p-values that separated their ends (collider_order='p_value', its default); causal-learn (uc_rule=0, uc_priority=2) puts a collider wherever the middle node is in no separating set, in the order it visits the triples, and skips one that would reverse an edge already directed. The two rules agree unless wrong independence decisions make two colliders conflict; then each keeps a different one, so same_graph compares two collider rules. Andrey's graph does not depend on the column order: the collider step is order-free, and so are Meek's rules. Andrey's CD-NOD ran on the build of 19 October 2026, whose orientation rules run in order-free rounds: every rule reads the graph as the round starts, an edge or endpoint the rules decide both ways stays undirected or a circle, and the rounds repeat to a fixed point; causal-learn's fits and the empty graph ran on the build of 17 October 2026 with the same harness and data, so their records stand",
   "error_metric": "SHD between the estimate and the CPDAG CD-NOD can identify, in which the domain index orients the edges it reaches: one per variable pair whose edge differs (missing, extra, or oriented differently). The empty graph's SHD is the number of true edges.",
   "hardware": "AMD EPYC 7713 64-Core Processor, 4 cores",
   "cores": 4,
   "build": "pre-release Andrey 0.7.0 build, 19 October 2026",
   "fit_protocol": "one fit at a time on an exclusive node, 4 cores per fit, 1 timed repeat and 1 warm-up fit per dataset, a 1800 s wall cap covering the warm-up and the timed fit, and a 30000 MB memory cap per fit",
   "same_graph_test": "the same graph: SHD 0 between the two packages' graphs",
   "complete": true,
   "rows": [
    {
     "d": 10,
     "mean_degree": 2.0,
     "n": 2000,
     "seeds": 20,
     "fits": 20,
     "andrey_ok": 20,
     "andrey_timeouts": 0,
     "andrey_failed": 0,
     "comparator_ok": 20,
     "comparator_timeouts": 0,
     "comparator_failed": 0,
     "paired": 20,
     "andrey_s": 0.006123743485659361,
     "comparator_s": 0.04695344099945942,
     "ratio": 7.789201766594031,
     "under_speed_floor": true,
     "same_graph": 16,
     "between_shd": 0.0,
     "andrey_shd": 1.5,
     "comparator_shd": 1.5,
     "empty_shd": 10.0,
     "andrey_shd_mean": 2.3,
     "comparator_shd_mean": 2.45,
     "empty_shd_mean": 10.0,
     "andrey_worse_than_empty": 0,
     "comparator_worse_than_empty": 0,
     "andrey_fewer_errors": 3,
     "comparator_fewer_errors": 1,
     "andrey_skeleton_f1": 0.9473684210526316,
     "comparator_skeleton_f1": 0.9473684210526316,
     "andrey_arrowhead_f1": 0.8888888888888888,
     "comparator_arrowhead_f1": 0.8888888888888888,
     "complete": true,
     "different_graph": [
      {
       "dataset": "0fd113467599",
       "seed": 19,
       "between_shd": 1.0,
       "andrey_shd": 3.0,
       "comparator_shd": 4.0,
       "empty_shd": 10.0
      },
      {
       "dataset": "7e0b5ae1f5a2",
       "seed": 15,
       "between_shd": 2.0,
       "andrey_shd": 3.0,
       "comparator_shd": 4.0,
       "empty_shd": 10.0
      },
      {
       "dataset": "96ad7bb053d0",
       "seed": 11,
       "between_shd": 2.0,
       "andrey_shd": 2.0,
       "comparator_shd": 0.0,
       "empty_shd": 10.0
      },
      {
       "dataset": "9bad215dc283",
       "seed": 14,
       "between_shd": 3.0,
       "andrey_shd": 0.0,
       "comparator_shd": 3.0,
       "empty_shd": 10.0
      }
     ]
    },
    {
     "d": 20,
     "mean_degree": 2.0,
     "n": 2000,
     "seeds": 20,
     "fits": 20,
     "andrey_ok": 20,
     "andrey_timeouts": 0,
     "andrey_failed": 0,
     "comparator_ok": 20,
     "comparator_timeouts": 0,
     "comparator_failed": 0,
     "paired": 20,
     "andrey_s": 0.016570945488638245,
     "comparator_s": 0.26278297799944994,
     "ratio": 16.030804455414955,
     "same_graph": 5,
     "between_shd": 2.0,
     "andrey_shd": 5.0,
     "comparator_shd": 5.5,
     "empty_shd": 20.0,
     "andrey_shd_mean": 5.3,
     "comparator_shd_mean": 5.65,
     "empty_shd_mean": 20.0,
     "andrey_worse_than_empty": 0,
     "comparator_worse_than_empty": 0,
     "andrey_fewer_errors": 9,
     "comparator_fewer_errors": 5,
     "andrey_skeleton_f1": 0.9633699633699633,
     "comparator_skeleton_f1": 0.9633699633699633,
     "andrey_arrowhead_f1": 0.8387096774193549,
     "comparator_arrowhead_f1": 0.8404074702886248,
     "complete": true,
     "different_graph": [
      {
       "dataset": "07aadcb3d61d",
       "seed": 19,
       "between_shd": 3.0,
       "andrey_shd": 0.0,
       "comparator_shd": 3.0,
       "empty_shd": 20.0
      },
      {
       "dataset": "0a4aa55d064a",
       "seed": 11,
       "between_shd": 1.0,
       "andrey_shd": 7.0,
       "comparator_shd": 8.0,
       "empty_shd": 20.0
      },
      {
       "dataset": "18fb99e10e12",
       "seed": 4,
       "between_shd": 1.0,
       "andrey_shd": 4.0,
       "comparator_shd": 3.0,
       "empty_shd": 20.0
      },
      {
       "dataset": "3f4a5d70bb97",
       "seed": 9,
       "between_shd": 3.0,
       "andrey_shd": 7.0,
       "comparator_shd": 4.0,
       "empty_shd": 20.0
      },
      {
       "dataset": "4109239cb9d6",
       "seed": 13,
       "between_shd": 4.0,
       "andrey_shd": 7.0,
       "comparator_shd": 7.0,
       "empty_shd": 20.0
      },
      {
       "dataset": "6e63a3287b51",
       "seed": 6,
       "between_shd": 1.0,
       "andrey_shd": 2.0,
       "comparator_shd": 3.0,
       "empty_shd": 20.0
      },
      {
       "dataset": "771a6f1f1481",
       "seed": 2,
       "between_shd": 9.0,
       "andrey_shd": 11.0,
       "comparator_shd": 10.0,
       "empty_shd": 20.0
      },
      {
       "dataset": "7f438d33b7ee",
       "seed": 10,
       "between_shd": 3.0,
       "andrey_shd": 7.0,
       "comparator_shd": 8.0,
       "empty_shd": 20.0
      },
      {
       "dataset": "807d9da3cbf1",
       "seed": 0,
       "between_shd": 2.0,
       "andrey_shd": 5.0,
       "comparator_shd": 3.0,
       "empty_shd": 20.0
      },
      {
       "dataset": "976d9a153e4e",
       "seed": 12,
       "between_shd": 2.0,
       "andrey_shd": 7.0,
       "comparator_shd": 9.0,
       "empty_shd": 20.0
      },
      {
       "dataset": "9acc1f996ec2",
       "seed": 14,
       "between_shd": 6.0,
       "andrey_shd": 4.0,
       "comparator_shd": 6.0,
       "empty_shd": 20.0
      },
      {
       "dataset": "b8bb71a0f581",
       "seed": 15,
       "between_shd": 2.0,
       "andrey_shd": 1.0,
       "comparator_shd": 3.0,
       "empty_shd": 20.0
      },
      {
       "dataset": "f58e69d0fb52",
       "seed": 16,
       "between_shd": 1.0,
       "andrey_shd": 3.0,
       "comparator_shd": 4.0,
       "empty_shd": 20.0
      },
      {
       "dataset": "f882ab3a431e",
       "seed": 18,
       "between_shd": 3.0,
       "andrey_shd": 4.0,
       "comparator_shd": 7.0,
       "empty_shd": 20.0
      },
      {
       "dataset": "feb812aa041f",
       "seed": 7,
       "between_shd": 8.0,
       "andrey_shd": 14.0,
       "comparator_shd": 12.0,
       "empty_shd": 20.0
      }
     ]
    },
    {
     "d": 50,
     "mean_degree": 2.0,
     "n": 2000,
     "seeds": 20,
     "fits": 20,
     "andrey_ok": 20,
     "andrey_timeouts": 0,
     "andrey_failed": 0,
     "comparator_ok": 20,
     "comparator_timeouts": 0,
     "comparator_failed": 0,
     "paired": 20,
     "andrey_s": 0.19960298101068474,
     "comparator_s": 6.334353905000171,
     "ratio": 31.12256066565216,
     "same_graph": 0,
     "between_shd": 9.0,
     "andrey_shd": 12.0,
     "comparator_shd": 15.5,
     "empty_shd": 50.0,
     "andrey_shd_mean": 12.9,
     "comparator_shd_mean": 16.05,
     "empty_shd_mean": 50.0,
     "andrey_worse_than_empty": 0,
     "comparator_worse_than_empty": 0,
     "andrey_fewer_errors": 14,
     "comparator_fewer_errors": 3,
     "andrey_skeleton_f1": 0.9405882352941176,
     "comparator_skeleton_f1": 0.9405882352941176,
     "andrey_arrowhead_f1": 0.8175378602833415,
     "comparator_arrowhead_f1": 0.7666996536368134,
     "complete": true,
     "different_graph": [
      {
       "dataset": "0168ba188d33",
       "seed": 17,
       "between_shd": 15.0,
       "andrey_shd": 11.0,
       "comparator_shd": 13.0,
       "empty_shd": 50.0
      },
      {
       "dataset": "131c2e64017c",
       "seed": 2,
       "between_shd": 3.0,
       "andrey_shd": 8.0,
       "comparator_shd": 10.0,
       "empty_shd": 50.0
      },
      {
       "dataset": "2f9430382645",
       "seed": 16,
       "between_shd": 9.0,
       "andrey_shd": 19.0,
       "comparator_shd": 18.0,
       "empty_shd": 50.0
      },
      {
       "dataset": "3bf915d49cec",
       "seed": 3,
       "between_shd": 13.0,
       "andrey_shd": 19.0,
       "comparator_shd": 27.0,
       "empty_shd": 50.0
      },
      {
       "dataset": "5f0fe8e1ee25",
       "seed": 7,
       "between_shd": 5.0,
       "andrey_shd": 9.0,
       "comparator_shd": 10.0,
       "empty_shd": 50.0
      },
      {
       "dataset": "695a1f7ce28e",
       "seed": 18,
       "between_shd": 10.0,
       "andrey_shd": 8.0,
       "comparator_shd": 14.0,
       "empty_shd": 50.0
      },
      {
       "dataset": "6e86c2a8f1d6",
       "seed": 14,
       "between_shd": 12.0,
       "andrey_shd": 15.0,
       "comparator_shd": 21.0,
       "empty_shd": 50.0
      },
      {
       "dataset": "704cccb5cd8c",
       "seed": 12,
       "between_shd": 5.0,
       "andrey_shd": 10.0,
       "comparator_shd": 14.0,
       "empty_shd": 50.0
      },
      {
       "dataset": "71d732a07960",
       "seed": 10,
       "between_shd": 23.0,
       "andrey_shd": 16.0,
       "comparator_shd": 26.0,
       "empty_shd": 50.0
      },
      {
       "dataset": "7611ab2253b0",
       "seed": 6,
       "between_shd": 10.0,
       "andrey_shd": 11.0,
       "comparator_shd": 19.0,
       "empty_shd": 50.0
      },
      {
       "dataset": "762b1808e94f",
       "seed": 0,
       "between_shd": 9.0,
       "andrey_shd": 20.0,
       "comparator_shd": 19.0,
       "empty_shd": 50.0
      },
      {
       "dataset": "903b2cbbec72",
       "seed": 1,
       "between_shd": 4.0,
       "andrey_shd": 8.0,
       "comparator_shd": 8.0,
       "empty_shd": 50.0
      },
      {
       "dataset": "9bd98ee8f02e",
       "seed": 9,
       "between_shd": 10.0,
       "andrey_shd": 12.0,
       "comparator_shd": 14.0,
       "empty_shd": 50.0
      },
      {
       "dataset": "a3ba72a9502c",
       "seed": 5,
       "between_shd": 6.0,
       "andrey_shd": 16.0,
       "comparator_shd": 16.0,
       "empty_shd": 50.0
      },
      {
       "dataset": "c81603cc8b1e",
       "seed": 4,
       "between_shd": 9.0,
       "andrey_shd": 15.0,
       "comparator_shd": 11.0,
       "empty_shd": 50.0
      },
      {
       "dataset": "c83f9ace1707",
       "seed": 19,
       "between_shd": 12.0,
       "andrey_shd": 6.0,
       "comparator_shd": 16.0,
       "empty_shd": 50.0
      },
      {
       "dataset": "dd9b15c0707e",
       "seed": 13,
       "between_shd": 8.0,
       "andrey_shd": 19.0,
       "comparator_shd": 19.0,
       "empty_shd": 50.0
      },
      {
       "dataset": "eb4212d3d3d4",
       "seed": 8,
       "between_shd": 9.0,
       "andrey_shd": 17.0,
       "comparator_shd": 18.0,
       "empty_shd": 50.0
      },
      {
       "dataset": "f956c6b6d799",
       "seed": 15,
       "between_shd": 7.0,
       "andrey_shd": 7.0,
       "comparator_shd": 13.0,
       "empty_shd": 50.0
      },
      {
       "dataset": "fd587a23f89b",
       "seed": 11,
       "between_shd": 8.0,
       "andrey_shd": 12.0,
       "comparator_shd": 15.0,
       "empty_shd": 50.0
      }
     ]
    }
   ]
  },
  {
   "method": "GES",
   "setting": "lambda_value=1.0, max_parents=4, score_func='local_score_BIC'",
   "solution": "andrey.ges.numpy.serial",
   "comparator": "causal-learn",
   "comparator_method": "ges",
   "comparator_setting": "lambda_value=0.5, max_parents=4, score_func='local_score_BIC'",
   "comparator_solution": "causal-learn.ges",
   "regime": "linear_gauss_er",
   "note": "causal-learn 0.1.4.8 halves its BIC penalty's scale, so its lambda_value=0.5 is Andrey's lambda_value=1, a penalty of log(n) per parameter in deviance units; both cap parents at 4 and return a CPDAG. Andrey's row runs its NumPy backend in one process",
   "error_metric": "SHD between the estimated CPDAG and the true DAG's CPDAG: one per variable pair whose edge differs (missing, extra, or oriented differently). The empty graph's SHD is the number of true edges.",
   "hardware": "AMD EPYC 7713 64-Core Processor, 4 cores",
   "cores": 4,
   "build": "pre-release Andrey 0.7.0 build, 17 October 2026",
   "fit_protocol": "one fit at a time on an exclusive node, 4 cores per fit, 1 timed repeat and 1 warm-up fit per dataset, a 1800 s wall cap covering the warm-up and the timed fit, and a 30000 MB memory cap per fit",
   "same_graph_test": "the same CPDAG: SHD 0 between the two packages' CPDAGs",
   "complete": false,
   "rows": [
    {
     "d": 50,
     "mean_degree": 2.0,
     "n": 500,
     "seeds": 5,
     "fits": 5,
     "andrey_ok": 5,
     "andrey_timeouts": 0,
     "andrey_failed": 0,
     "comparator_ok": 5,
     "comparator_timeouts": 0,
     "comparator_failed": 0,
     "paired": 5,
     "andrey_s": 0.10739187499711988,
     "comparator_s": 5.9484287209998,
     "ratio": 68.09366732916808,
     "same_graph": 5,
     "between_shd": 0.0,
     "andrey_shd": 47.0,
     "comparator_shd": 47.0,
     "empty_shd": 50.0,
     "andrey_shd_mean": 42.6,
     "comparator_shd_mean": 42.6,
     "empty_shd_mean": 50.0,
     "andrey_worse_than_empty": 0,
     "comparator_worse_than_empty": 0,
     "andrey_fewer_errors": 0,
     "comparator_fewer_errors": 0,
     "andrey_skeleton_f1": 0.7575757575757575,
     "comparator_skeleton_f1": 0.7575757575757575,
     "andrey_arrowhead_f1": 0.5470085470085471,
     "comparator_arrowhead_f1": 0.5470085470085471,
     "complete": true,
     "different_graph": []
    },
    {
     "d": 100,
     "mean_degree": 2.0,
     "n": 1000,
     "seeds": 5,
     "fits": 5,
     "andrey_ok": 5,
     "andrey_timeouts": 0,
     "andrey_failed": 0,
     "comparator_ok": 5,
     "comparator_timeouts": 0,
     "comparator_failed": 0,
     "paired": 5,
     "andrey_s": 0.2291183819999958,
     "comparator_s": 41.908708676,
     "ratio": 182.31394619683994,
     "same_graph": 5,
     "between_shd": 0.0,
     "andrey_shd": 79.0,
     "comparator_shd": 79.0,
     "empty_shd": 100.0,
     "andrey_shd_mean": 81.2,
     "comparator_shd_mean": 81.2,
     "empty_shd_mean": 100.0,
     "andrey_worse_than_empty": 0,
     "comparator_worse_than_empty": 0,
     "andrey_fewer_errors": 0,
     "comparator_fewer_errors": 0,
     "andrey_skeleton_f1": 0.7538461538461539,
     "comparator_skeleton_f1": 0.7538461538461539,
     "andrey_arrowhead_f1": 0.6635944700460829,
     "comparator_arrowhead_f1": 0.6635944700460829,
     "complete": true,
     "different_graph": []
    },
    {
     "d": 150,
     "mean_degree": 2.0,
     "n": 1500,
     "seeds": 5,
     "fits": 5,
     "andrey_ok": 5,
     "andrey_timeouts": 0,
     "andrey_failed": 0,
     "comparator_ok": 5,
     "comparator_timeouts": 0,
     "comparator_failed": 0,
     "paired": 5,
     "andrey_s": 0.5492799230000855,
     "comparator_s": 192.84484156999997,
     "ratio": 325.49505362581317,
     "same_graph": 5,
     "between_shd": 0.0,
     "andrey_shd": 140.0,
     "comparator_shd": 140.0,
     "empty_shd": 150.0,
     "andrey_shd_mean": 133.4,
     "comparator_shd_mean": 133.4,
     "empty_shd_mean": 150.0,
     "andrey_worse_than_empty": 0,
     "comparator_worse_than_empty": 0,
     "andrey_fewer_errors": 0,
     "comparator_fewer_errors": 0,
     "andrey_skeleton_f1": 0.7487437185929647,
     "comparator_skeleton_f1": 0.7487437185929647,
     "andrey_arrowhead_f1": 0.6114285714285714,
     "comparator_arrowhead_f1": 0.6114285714285714,
     "complete": true,
     "different_graph": []
    },
    {
     "d": 200,
     "mean_degree": 2.0,
     "n": 2000,
     "seeds": 5,
     "fits": 5,
     "andrey_ok": 5,
     "andrey_timeouts": 0,
     "andrey_failed": 0,
     "comparator_ok": 3,
     "comparator_timeouts": 2,
     "comparator_failed": 0,
     "paired": 3,
     "andrey_s": 1.0472117629979039,
     "comparator_s": 583.7988491900032,
     "ratio": 628.7502898333095,
     "ratio_lower_bound": 749.7457743894098,
     "ratio_is_lower_bound": true,
     "ratio_cap_s": 1800.0,
     "ratio_bound_s": 900.0,
     "same_graph": 3,
     "between_shd": 0.0,
     "andrey_shd": 199.0,
     "comparator_shd": 199.0,
     "empty_shd": 200.0,
     "andrey_shd_mean": 192.33333333333334,
     "comparator_shd_mean": 192.33333333333334,
     "empty_shd_mean": 200.0,
     "andrey_worse_than_empty": 0,
     "comparator_worse_than_empty": 0,
     "andrey_fewer_errors": 0,
     "comparator_fewer_errors": 0,
     "andrey_skeleton_f1": 0.7370370370370372,
     "comparator_skeleton_f1": 0.7370370370370372,
     "andrey_arrowhead_f1": 0.5925925925925926,
     "comparator_arrowhead_f1": 0.5925925925925926,
     "complete": false,
     "different_graph": []
    }
   ]
  },
  {
   "method": "GES, NumPy backend, one process",
   "setting": "lambda_value=1.0, max_parents=4, score_func='local_score_BIC'",
   "solution": "andrey.ges.numpy.serial",
   "comparator": "Andrey 0.4.0",
   "comparator_method": "ges, NumPy backend, one process",
   "comparator_setting": "lambda_value=1.0, max_parents=4, score_func='local_score_BIC'",
   "comparator_solution": "andrey040.ges.numpy.serial",
   "comparison": "earlier-build",
   "regime": "linear_gauss_er",
   "note": "Andrey 0.4.0's GES, the released build, runs in its own environment on the same datasets, right after the 0.7.0 build's fit of the same backend and mode; the data, the harness, the conversion, and the scoring are the 0.7.0 build's. Both builds return the same CPDAG on every dataset (same_graph), so the row measures the speed-up between the builds alone; comparison 'earlier-build' marks it as a comparison with no reference package",
   "error_metric": "SHD between the estimated CPDAG and the true DAG's CPDAG: one per variable pair whose edge differs (missing, extra, or oriented differently). The empty graph's SHD is the number of true edges.",
   "hardware": "AMD EPYC 7713 64-Core Processor, 4 cores",
   "cores": 4,
   "build": "pre-release Andrey 0.7.0 build, 17 October 2026",
   "comparator_build": "Andrey 0.4.0",
   "fit_protocol": "one fit at a time on an exclusive node, 4 cores per fit, 1 timed repeat and 1 warm-up fit per dataset, a 1800 s wall cap covering the warm-up and the timed fit, and a 30000 MB memory cap per fit",
   "same_graph_test": "the same CPDAG: SHD 0 between the two packages' CPDAGs",
   "complete": true,
   "rows": [
    {
     "d": 50,
     "mean_degree": 2.0,
     "n": 500,
     "seeds": 5,
     "fits": 5,
     "andrey_ok": 5,
     "andrey_timeouts": 0,
     "andrey_failed": 0,
     "comparator_ok": 5,
     "comparator_timeouts": 0,
     "comparator_failed": 0,
     "paired": 5,
     "andrey_s": 0.10739187499711988,
     "comparator_s": 1.6852579760015942,
     "ratio": 18.42811612323122,
     "same_graph": 5,
     "between_shd": 0.0,
     "andrey_shd": 47.0,
     "comparator_shd": 47.0,
     "empty_shd": 50.0,
     "andrey_shd_mean": 42.6,
     "comparator_shd_mean": 42.6,
     "empty_shd_mean": 50.0,
     "andrey_worse_than_empty": 0,
     "comparator_worse_than_empty": 0,
     "andrey_fewer_errors": null,
     "comparator_fewer_errors": null,
     "andrey_skeleton_f1": 0.7575757575757575,
     "comparator_skeleton_f1": 0.7575757575757575,
     "andrey_arrowhead_f1": 0.5470085470085471,
     "comparator_arrowhead_f1": 0.5470085470085471,
     "complete": true,
     "different_graph": []
    },
    {
     "d": 100,
     "mean_degree": 2.0,
     "n": 1000,
     "seeds": 5,
     "fits": 5,
     "andrey_ok": 5,
     "andrey_timeouts": 0,
     "andrey_failed": 0,
     "comparator_ok": 5,
     "comparator_timeouts": 0,
     "comparator_failed": 0,
     "paired": 5,
     "andrey_s": 0.2291183819999958,
     "comparator_s": 9.343042880000013,
     "ratio": 41.25202136341981,
     "same_graph": 5,
     "between_shd": 0.0,
     "andrey_shd": 79.0,
     "comparator_shd": 79.0,
     "empty_shd": 100.0,
     "andrey_shd_mean": 81.2,
     "comparator_shd_mean": 81.2,
     "empty_shd_mean": 100.0,
     "andrey_worse_than_empty": 0,
     "comparator_worse_than_empty": 0,
     "andrey_fewer_errors": null,
     "comparator_fewer_errors": null,
     "andrey_skeleton_f1": 0.7538461538461539,
     "comparator_skeleton_f1": 0.7538461538461539,
     "andrey_arrowhead_f1": 0.6635944700460829,
     "comparator_arrowhead_f1": 0.6635944700460829,
     "complete": true,
     "different_graph": []
    },
    {
     "d": 150,
     "mean_degree": 2.0,
     "n": 1500,
     "seeds": 5,
     "fits": 5,
     "andrey_ok": 5,
     "andrey_timeouts": 0,
     "andrey_failed": 0,
     "comparator_ok": 5,
     "comparator_timeouts": 0,
     "comparator_failed": 0,
     "paired": 5,
     "andrey_s": 0.5492799230000855,
     "comparator_s": 36.09551258800002,
     "ratio": 65.71423981938331,
     "same_graph": 5,
     "between_shd": 0.0,
     "andrey_shd": 140.0,
     "comparator_shd": 140.0,
     "empty_shd": 150.0,
     "andrey_shd_mean": 133.4,
     "comparator_shd_mean": 133.4,
     "empty_shd_mean": 150.0,
     "andrey_worse_than_empty": 0,
     "comparator_worse_than_empty": 0,
     "andrey_fewer_errors": null,
     "comparator_fewer_errors": null,
     "andrey_skeleton_f1": 0.7487437185929647,
     "comparator_skeleton_f1": 0.7487437185929647,
     "andrey_arrowhead_f1": 0.6114285714285714,
     "comparator_arrowhead_f1": 0.6114285714285714,
     "complete": true,
     "different_graph": []
    },
    {
     "d": 200,
     "mean_degree": 2.0,
     "n": 2000,
     "seeds": 5,
     "fits": 5,
     "andrey_ok": 5,
     "andrey_timeouts": 0,
     "andrey_failed": 0,
     "comparator_ok": 5,
     "comparator_timeouts": 0,
     "comparator_failed": 0,
     "paired": 5,
     "andrey_s": 1.0472117629979039,
     "comparator_s": 90.60050459799822,
     "ratio": 86.96285461427307,
     "same_graph": 5,
     "between_shd": 0.0,
     "andrey_shd": 200.0,
     "comparator_shd": 200.0,
     "empty_shd": 200.0,
     "andrey_shd_mean": 202.4,
     "comparator_shd_mean": 202.4,
     "empty_shd_mean": 200.0,
     "andrey_worse_than_empty": 2,
     "comparator_worse_than_empty": 2,
     "andrey_fewer_errors": null,
     "comparator_fewer_errors": null,
     "andrey_skeleton_f1": 0.7246376811594203,
     "comparator_skeleton_f1": 0.7246376811594203,
     "andrey_arrowhead_f1": 0.5683760683760684,
     "comparator_arrowhead_f1": 0.5683760683760684,
     "complete": true,
     "different_graph": []
    }
   ]
  },
  {
   "method": "GES, NumPy backend, parallel",
   "setting": "lambda_value=1.0, max_parents=4, score_func='local_score_BIC'",
   "solution": "andrey.ges.numpy.parallel",
   "comparator": "Andrey 0.4.0",
   "comparator_method": "ges, NumPy backend, parallel",
   "comparator_setting": "lambda_value=1.0, max_parents=4, score_func='local_score_BIC'",
   "comparator_solution": "andrey040.ges.numpy.parallel",
   "comparison": "earlier-build",
   "regime": "linear_gauss_er",
   "note": "Andrey 0.4.0's GES, the released build, runs in its own environment on the same datasets, right after the 0.7.0 build's fit of the same backend and mode; the data, the harness, the conversion, and the scoring are the 0.7.0 build's. Both builds return the same CPDAG on every dataset (same_graph), so the row measures the speed-up between the builds alone; comparison 'earlier-build' marks it as a comparison with no reference package The parallel mode runs the search's passes in the fit's four cores as worker processes",
   "error_metric": "SHD between the estimated CPDAG and the true DAG's CPDAG: one per variable pair whose edge differs (missing, extra, or oriented differently). The empty graph's SHD is the number of true edges.",
   "hardware": "AMD EPYC 7713 64-Core Processor, 4 cores",
   "cores": 4,
   "build": "pre-release Andrey 0.7.0 build, 17 October 2026",
   "comparator_build": "Andrey 0.4.0",
   "fit_protocol": "one fit at a time on an exclusive node, 4 cores per fit, 1 timed repeat and 1 warm-up fit per dataset, a 1800 s wall cap covering the warm-up and the timed fit, and a 30000 MB memory cap per fit",
   "same_graph_test": "the same CPDAG: SHD 0 between the two packages' CPDAGs",
   "complete": true,
   "rows": [
    {
     "d": 50,
     "mean_degree": 2.0,
     "n": 500,
     "seeds": 5,
     "fits": 5,
     "andrey_ok": 5,
     "andrey_timeouts": 0,
     "andrey_failed": 0,
     "comparator_ok": 5,
     "comparator_timeouts": 0,
     "comparator_failed": 0,
     "paired": 5,
     "andrey_s": 0.10249861500051338,
     "comparator_s": 1.6335964989993954,
     "ratio": 15.880969977569414,
     "same_graph": 5,
     "between_shd": 0.0,
     "andrey_shd": 47.0,
     "comparator_shd": 47.0,
     "empty_shd": 50.0,
     "andrey_shd_mean": 42.6,
     "comparator_shd_mean": 42.6,
     "empty_shd_mean": 50.0,
     "andrey_worse_than_empty": 0,
     "comparator_worse_than_empty": 0,
     "andrey_fewer_errors": null,
     "comparator_fewer_errors": null,
     "andrey_skeleton_f1": 0.7575757575757575,
     "comparator_skeleton_f1": 0.7575757575757575,
     "andrey_arrowhead_f1": 0.5470085470085471,
     "comparator_arrowhead_f1": 0.5470085470085471,
     "complete": true,
     "different_graph": []
    },
    {
     "d": 100,
     "mean_degree": 2.0,
     "n": 1000,
     "seeds": 5,
     "fits": 5,
     "andrey_ok": 5,
     "andrey_timeouts": 0,
     "andrey_failed": 0,
     "comparator_ok": 5,
     "comparator_timeouts": 0,
     "comparator_failed": 0,
     "paired": 5,
     "andrey_s": 0.30321480699998915,
     "comparator_s": 4.951403841000001,
     "ratio": 16.301234657923082,
     "same_graph": 5,
     "between_shd": 0.0,
     "andrey_shd": 79.0,
     "comparator_shd": 79.0,
     "empty_shd": 100.0,
     "andrey_shd_mean": 81.2,
     "comparator_shd_mean": 81.2,
     "empty_shd_mean": 100.0,
     "andrey_worse_than_empty": 0,
     "comparator_worse_than_empty": 0,
     "andrey_fewer_errors": null,
     "comparator_fewer_errors": null,
     "andrey_skeleton_f1": 0.7538461538461539,
     "comparator_skeleton_f1": 0.7538461538461539,
     "andrey_arrowhead_f1": 0.6635944700460829,
     "comparator_arrowhead_f1": 0.6635944700460829,
     "complete": true,
     "different_graph": []
    },
    {
     "d": 150,
     "mean_degree": 2.0,
     "n": 1500,
     "seeds": 5,
     "fits": 5,
     "andrey_ok": 5,
     "andrey_timeouts": 0,
     "andrey_failed": 0,
     "comparator_ok": 5,
     "comparator_timeouts": 0,
     "comparator_failed": 0,
     "paired": 5,
     "andrey_s": 0.9640491390000534,
     "comparator_s": 14.624255444000028,
     "ratio": 14.958223336729676,
     "same_graph": 5,
     "between_shd": 0.0,
     "andrey_shd": 140.0,
     "comparator_shd": 140.0,
     "empty_shd": 150.0,
     "andrey_shd_mean": 133.4,
     "comparator_shd_mean": 133.4,
     "empty_shd_mean": 150.0,
     "andrey_worse_than_empty": 0,
     "comparator_worse_than_empty": 0,
     "andrey_fewer_errors": null,
     "comparator_fewer_errors": null,
     "andrey_skeleton_f1": 0.7487437185929647,
     "comparator_skeleton_f1": 0.7487437185929647,
     "andrey_arrowhead_f1": 0.6114285714285714,
     "comparator_arrowhead_f1": 0.6114285714285714,
     "complete": true,
     "different_graph": []
    },
    {
     "d": 200,
     "mean_degree": 2.0,
     "n": 2000,
     "seeds": 5,
     "fits": 5,
     "andrey_ok": 5,
     "andrey_timeouts": 0,
     "andrey_failed": 0,
     "comparator_ok": 5,
     "comparator_timeouts": 0,
     "comparator_failed": 0,
     "paired": 5,
     "andrey_s": 1.6834837019996485,
     "comparator_s": 33.47056778199476,
     "ratio": 19.881729619501684,
     "same_graph": 5,
     "between_shd": 0.0,
     "andrey_shd": 200.0,
     "comparator_shd": 200.0,
     "empty_shd": 200.0,
     "andrey_shd_mean": 202.4,
     "comparator_shd_mean": 202.4,
     "empty_shd_mean": 200.0,
     "andrey_worse_than_empty": 2,
     "comparator_worse_than_empty": 2,
     "andrey_fewer_errors": null,
     "comparator_fewer_errors": null,
     "andrey_skeleton_f1": 0.7246376811594203,
     "comparator_skeleton_f1": 0.7246376811594203,
     "andrey_arrowhead_f1": 0.5683760683760684,
     "comparator_arrowhead_f1": 0.5683760683760684,
     "complete": true,
     "different_graph": []
    }
   ]
  }
 ]
}
