diff --git a/CHANGELOG.md b/CHANGELOG.md index e3c1a0c1..c24e1b73 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,8 +7,16 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +## [3.1.2] - 2026-04-18 + +### Fixed +- **SyntheticDiD catastrophic cancellation at extreme Y scale** (PR #312) - the Frank-Wolfe weight solver lost precision when outcome magnitudes were very large or very small; results are now numerically stable across scales. +- **Non-convergence signaling in FE imputation alternating-projection solvers** (PR #314) - `ImputationDiD`, `TwoStageDiD`, and shared `within_transform` now emit a `ConvergenceWarning` when the alternating-projection / weighted-demean loop exits without meeting the tolerance. `max_iter` and `tol` are documented on `within_transform`. +- **Non-convergence signaling in SyntheticDiD Frank-Wolfe solver** (PR #315) - the numpy-path Frank-Wolfe SC weight solver now emits a `ConvergenceWarning` when the loop exits without meeting `min_decrease`. Wrapper-level and `max_iter=0` regression tests added. + ### Changed -- Refresh `ROADMAP.md` to drop top-level phase numbering and reflect shipped state through v3.1.1. Absorbs dCDH into the Current State estimator list; adds Recently Shipped summary; reorganizes open work as Shipping Next / Under Consideration / AI-Agent Track / Long-term. Updates `docs/business-strategy.md`, `docs/survey-roadmap.md`, `docs/practitioner_decision_tree.rst`, `docs/choosing_estimator.rst`, `docs/api/chaisemartin_dhaultfoeuille.rst`, `README.md`, and `diff_diff/guides/llms-full.txt` to remove stale phase-deferral language now that the deferred items have shipped. +- Refresh `ROADMAP.md` to drop top-level phase numbering and reflect shipped state through v3.1.1 (PR #313). Absorbs dCDH into the Current State estimator list; adds Recently Shipped summary; reorganizes open work as Shipping Next / Under Consideration / AI-Agent Track / Long-term. Updates `docs/business-strategy.md`, `docs/survey-roadmap.md`, `docs/practitioner_decision_tree.rst`, `docs/choosing_estimator.rst`, `docs/api/chaisemartin_dhaultfoeuille.rst`, `README.md`, and `diff_diff/guides/llms-full.txt` to remove stale phase-deferral language now that the deferred items have shipped. +- Bump the `SyntheticDiD(lambda_reg=...)` and `SyntheticDiD(zeta=...)` deprecation warnings' removal target from `v3.1` to `v4.0.0`. Removing public kwargs in a patch / minor release would violate Semantic Versioning; the deprecation stays warning-only throughout the `3.x` line and will be removed in the next major release. Use `zeta_omega` / `zeta_lambda` instead. ## [3.1.1] - 2026-04-16 @@ -1298,6 +1306,7 @@ for the full feature history leading to this release. [2.1.2]: https://github.com/igerber/diff-diff/compare/v2.1.1...v2.1.2 [2.1.1]: https://github.com/igerber/diff-diff/compare/v2.1.0...v2.1.1 [2.1.0]: https://github.com/igerber/diff-diff/compare/v2.0.3...v2.1.0 +[3.1.2]: https://github.com/igerber/diff-diff/compare/v3.1.1...v3.1.2 [3.1.1]: https://github.com/igerber/diff-diff/compare/v3.1.0...v3.1.1 [3.1.0]: https://github.com/igerber/diff-diff/compare/v3.0.2...v3.1.0 [3.0.2]: https://github.com/igerber/diff-diff/compare/v3.0.1...v3.0.2 diff --git a/TODO.md b/TODO.md index f5917ebc..2ef24f36 100644 --- a/TODO.md +++ b/TODO.md @@ -124,7 +124,7 @@ Deprecated parameters still present for backward compatibility: - `lambda_reg` and `zeta` in `SyntheticDiD` (`synthetic_did.py`) - Deprecated in favor of `zeta_omega`/`zeta_lambda` parameters - - Remove in v3.1 + - Remove in v4.0.0 (SemVer-safe: public kwarg removal requires a major bump) --- diff --git a/diff_diff/__init__.py b/diff_diff/__init__.py index bc1b88de..3ae225b0 100644 --- a/diff_diff/__init__.py +++ b/diff_diff/__init__.py @@ -231,7 +231,7 @@ ETWFE = WooldridgeDiD DCDH = ChaisemartinDHaultfoeuille -__version__ = "3.1.1" +__version__ = "3.1.2" __all__ = [ # Estimators "DifferenceInDifferences", diff --git a/diff_diff/guides/llms-full.txt b/diff_diff/guides/llms-full.txt index 95734a57..7bbd950c 100644 --- a/diff_diff/guides/llms-full.txt +++ b/diff_diff/guides/llms-full.txt @@ -2,7 +2,7 @@ > A Python library for Difference-in-Differences causal inference analysis. Provides sklearn-like estimators with statsmodels-style output for econometric analysis. -- Version: 3.1.1 +- Version: 3.1.2 - Repository: https://github.com/igerber/diff-diff - License: MIT - Dependencies: numpy, pandas, scipy (no statsmodels dependency) diff --git a/diff_diff/synthetic_did.py b/diff_diff/synthetic_did.py index 97976f7c..e3f43740 100644 --- a/diff_diff/synthetic_did.py +++ b/diff_diff/synthetic_did.py @@ -149,14 +149,14 @@ def __init__( warnings.warn( "lambda_reg is deprecated and ignored. Regularization is now " "auto-computed from data. Use zeta_omega to override unit weight " - "regularization. Will be removed in v3.1.", + "regularization. Will be removed in v4.0.0.", DeprecationWarning, stacklevel=2, ) if zeta is not None: warnings.warn( "zeta is deprecated and ignored. Use zeta_lambda to override " - "time weight regularization. Will be removed in v3.1.", + "time weight regularization. Will be removed in v4.0.0.", DeprecationWarning, stacklevel=2, ) @@ -1471,7 +1471,7 @@ def set_params(self, **params) -> "SyntheticDiD": if key in _deprecated: warnings.warn( f"{key} is deprecated and ignored. Use zeta_omega/zeta_lambda " - f"instead. Will be removed in v3.1.", + f"instead. Will be removed in v4.0.0.", DeprecationWarning, stacklevel=2, ) diff --git a/pyproject.toml b/pyproject.toml index 395b7ef7..f3749252 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "maturin" [project] name = "diff-diff" -version = "3.1.1" +version = "3.1.2" description = "Difference-in-Differences causal inference with sklearn-like API. Callaway-Sant'Anna, Synthetic DiD, Honest DiD, event studies, parallel trends." readme = "README.md" license = "MIT" diff --git a/rust/Cargo.toml b/rust/Cargo.toml index 8a54e8e9..4fe96ea7 100644 --- a/rust/Cargo.toml +++ b/rust/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "diff_diff_rust" -version = "3.1.1" +version = "3.1.2" edition = "2021" rust-version = "1.84" description = "Rust backend for diff-diff DiD library"