Post 1 set out seven steps. This is the seventh: taking whatever survives post 11's sparse regression and checking it — term by term — against GKA, Mott-Hubbard, and ZSA before it earns a place in anything I'd call a rule.

A discovered formula that passes post 11's cross-validation and sign-checking is still just a fitted equation. It earns the word “rule” only after it's checked against the three theoretical frameworks this entire series has been built around — GKA for the magnetic side, the Mott criterion for the metal–insulator boundary, and ZSA for which mechanism sets the gap at all. That checking, plus the resulting compiled set of conditional rules, is the rule bank, and it's the last step on post 1's original list.

What a rule bank actually is

Not one equation. A small set of conditional rules, each with its own formula, its own validity domain, and a record of which theoretical limit it was checked against. A single global formula across the whole Mโ‚“Cแตง dataset would almost certainly average over real mechanism changes — the whole point of the ZSA classification in post 4 is that Mott-Hubbard and charge-transfer compounds obey different physics, so a rule bank should contain at least one branch per regime, not one formula trying to cover both.

RegimeConditionFormula formChecked againstStatus
Charge-transfer, near-180°ฮ”CT < −0.3 eV, angle > 150°gap ≈ f(ฮ”CT, angle, …)ZSA CT branch, GKA rule 1template — fill in once post 11's regression runs on real data
Mott-Hubbardฮ”CT > 0.3 eVgap ≈ g(U/W, …)Mott criterion (U/W ≈ 1)template
Near-90° pathwayangle ≤ 100°magnetization ≈ h(d-count, …)GKA rule 3template
Mechanism boundary|ฮ”CT| < 0.3 eV— flagged, not fitZSA crossoverexpected low-confidence zone

That table is deliberately a template, not a result — the formula forms get filled in once post 11's regression actually runs against real compound data. What's fixed in advance is the structure: every row needs a condition, a form, and a named theoretical check before it's trusted.

Application: an automated theory-check harness

Eyeballing whether a coefficient's sign matches GKA rule 1 doesn't scale past a few terms, and it's exactly the step where it's easiest to talk yourself into a match that isn't really there. The code below turns each theoretical check from this series into a function that takes the fitted formula and returns pass/fail plus a reason — meant to run on whatever LassoLarsIC or gplearn model post 11 produced.

# Three checks, one per framework this series has used —
# run against the fitted formula from post 11, not hand-checked
import numpy as np

def check_gka_sign(coef_angle_term, expected_sign):
  """GKA: a near-180° / half-filled-like d-count term should push
  toward AFM the way rule 1 predicts — sign has to match, not just
  the magnitude or the R²."""
  ok = np.sign(coef_angle_term) == expected_sign
  return ok, ff"angle term sign {'matches' if ok else 'CONTRADICTS'} GKA rule 1"

def check_mott_criterion(formula_fn, u_over_w_grid):
  """Mott-Hubbard: predicted gap should collapse toward zero as
  U/W drops below ≈1 — the textbook threshold, not some arbitrary
  crossing the regression happened to land on."""
  gaps = [formula_fn(u_over_w=x) for x in u_over_w_grid]
  crossing = next((x for x, g in zip(u_over_w_grid, gaps) if g <= 0), None)
  ok = crossing is not None and abs(crossing - 1.0) < 0.3
  return ok, ff"gap→0 crossing at U/W={crossing}"

def check_zsa_branch(formula_fn):
  """ZSA: sensitivity to ฮ”_CT should be the dominant term on the
  charge-transfer side and weak relative to U on the Mott-Hubbard
  side — not the same dependence on both sides of ฮ”_CT=0."""
  sens_neg = formula_fn(delta_ct=-0.5) - formula_fn(delta_ct=-0.4)
  sens_pos = formula_fn(delta_ct=0.5) - formula_fn(delta_ct=0.4)
  ok = abs(sens_neg) > abs(sens_pos)
  return ok, ff"ฮ”_CT sensitivity: {sens_neg:.4f} (CT side) vs {sens_pos:.4f} (MH side)"

Every row in the rule-bank table above only gets to flip from “template” to a real status once it has a function call like these attached to it, with a real pass/fail and a real number — not a description of what the check would show.

Where the rule bank breaks, and why that's the interesting part

Posts 5, 6, 9, and 10 each flagged specific places a clean theoretical picture was expected to fail — tellurides with extra covalency, distorted structures with multiple competing M–X–M angles, the ฮ”CT ≈ 0 boundary zone. A rule bank that passes every check everywhere, with no flagged exceptions, is more likely a sign the candidate library in post 11 wasn't expressive enough to capture a real failure mode than evidence the textbook physics holds exactly everywhere. The compounds where a check fails are exactly the ones worth a closer individual look — against DFT, against the original literature value, against whether the structure actually has the single dominant pathway the formula assumes.

Closing the loop

Post 1 listed building the dataset, engineering descriptors, testing structure against electronic properties, testing structure against magnetic properties, testing the coupling between the two, searching for an explicit formula, and validating it against theory. Eleven posts later, all seven steps have a post. That's a reasonable point to pause the conceptual arc and let the next direction be set by whatever the rule bank actually turns up once it's run on real data — new compounds to predict, exceptions worth chasing individually, or a expanded dataset built specifically to stress-test wherever the bank turned out weakest.

Rule BankGKA RulesMott-HubbardZSA ClassificationModel ValidationInterpretable ML