You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Three-pass --disable-salt to align PE federal SALT with TAXSIM-35 (#934)
* Three-pass --disable-salt to match TAXSIM federal SALT methodology
`--disable-salt` was added so PE-US state-tax computation could converge
without iterating against federal SALT, matching TAXSIM-35's missing
state↔federal SALT iteration. The single-pass implementation zeroed
`state_and_local_sales_or_income_tax` globally, which also stripped state
income tax from PE's federal Schedule A — producing a systematic federal
mismatch against TAXSIM (~90+ records in the 3K eCPS sample, median gap
$200-$2,400).
This change runs PE in two PE-Microsim invocations when the flag is set:
Pass A — state-side: state_and_local_sales_or_income_tax = 0,
producing state outputs that match TAXSIM's first-pass state tax.
Pass B — federal-side: state_and_local_sales_or_income_tax explicitly
set to Pass-A's per-record state_income_tax, so PE federal Schedule A
uses a fixed SALT value (no iteration), mirroring TAXSIM exactly.
Final result stitches state-side columns (siitax, v32-v44, etc.) from
Pass A and everything else from Pass B.
3K eCPS 2025 sample (|AGI|<$500K, no S-Corp), pre/post:
- Federal exact match: 89.8% → 91.1%
- Federal within $100: 93.1% → 95.5%
- Federal within $1K: 97.9% → 98.9%
- State match: unchanged
Runtime: ~22% more CPU, ~5% more wall time on the 3K case (Microsim
setup dominates).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
* Apply ruff format
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
* Relax state-iteration perf test ceiling for three-pass --disable-salt
`test_extract_does_not_iterate_states` enforces a ceiling on
`_calc_tax_unit()` calls to catch regressions where state vars
iterate per-state. With three-pass `--disable-salt` the runner
invokes PE twice, doubling the expected count from ~85 to ~170.
Raise the assertion ceiling from <100 to <200; per-state iteration
would still be 470+ calls, so the regression guard still bites.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
* Relax benchmark wall-time ceilings for three-pass --disable-salt
`test_benchmark_500_records` and `test_benchmark_cps_like` use
`disable_salt=True`, which now invokes PE twice. Wall-time roughly
doubles. Raise the ceilings from 60s/120s to 120s/240s respectively.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Run `--disable-salt` in three passes so PE's federal Schedule A keeps state-tax SALT (matching TAXSIM-35's single-pass methodology) while state computation remains SALT-disabled. Eliminates the iterated-vs-single-pass state-tax mismatch in PE-vs-TAXSIM federal comparisons.
0 commit comments