axiom

Making a model travel · step 4 of 6

The facets a graph cannot settle

The population is licensed. What about the window and the level?

A selection diagram settles one facet out of eight. Twelve weeks is not fifty-two weeks, and a household is not a person, and no causal graph has an opinion about either. transfer_to walks all eight facets and, for each one that differs, either names the assumption that licenses it or refuses.

Three differing facets, three named assumptions, every one unverified until something checks it. Nothing passed silently — and note the last block: a transfer that cannot be licensed at all is refused rather than assumed away.

step 4
plan = measured.transfer_to(needed)
print("plan status:", plan.status)
print()
for entry in plan.entries:
    print(f"{entry.facet}")
    print(f"  {entry.statement}")
    for a in entry.assumptions:
        print(f"  needs  {a.name}  [{a.state}]")
        print(f"         challenged by {a.challenged_by}")
print()

# A facet that is not bridgeable by any assumption is refused, not
# licensed. A different functional is a different quantity.
elasticity = needed.model_copy(
    update={"name": "elasticity", "quantity": Quantity(kind="elasticity")})
blocked = measured.transfer_to(elasticity)
print("asking for an elasticity instead:", blocked.status)
print(" ", blocked.reason)
what it printed
plan status: downgraded

population
  population differs: district_A vs district_B
  needs  s_admissibility  [unverified]
         challenged by overlap; moderator interaction in meta
window
  time window or basis differs
  needs  stationary_dynamics  [unverified]
         challenged by half-life against window length
  needs  carryover_contained  [unverified]
         challenged by half-life against window length
level
  level differs
  needs  linear_aggregation  [unverified]
         challenged by the Jensen gap under a nonlinear response

asking for an elasticity instead: blocked
  quantity: a different functional is a different quantity; re-express first

Every line above was captured by running this code at build time. The steps share one namespace, so the code on this page is the code you would type after the steps before it.