mergeron 2025.739439.12__tar.gz → 2025.739439.14__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of mergeron might be problematic. Click here for more details.

Files changed (21) hide show
  1. {mergeron-2025.739439.12 → mergeron-2025.739439.14}/PKG-INFO +1 -1
  2. {mergeron-2025.739439.12 → mergeron-2025.739439.14}/pyproject.toml +4 -3
  3. {mergeron-2025.739439.12 → mergeron-2025.739439.14}/src/mergeron/__init__.py +3 -3
  4. {mergeron-2025.739439.12 → mergeron-2025.739439.14}/src/mergeron/core/guidelines_boundaries.py +5 -21
  5. {mergeron-2025.739439.12 → mergeron-2025.739439.14}/src/mergeron/core/guidelines_boundary_functions.py +3 -5
  6. {mergeron-2025.739439.12 → mergeron-2025.739439.14}/src/mergeron/gen/__init__.py +3 -1
  7. {mergeron-2025.739439.12 → mergeron-2025.739439.14}/src/mergeron/gen/data_generation_functions.py +1 -1
  8. {mergeron-2025.739439.12 → mergeron-2025.739439.14}/src/mergeron/gen/upp_tests.py +3 -1
  9. {mergeron-2025.739439.12 → mergeron-2025.739439.14}/src/mergeron/perks/guidelines_boundary_functions_extra.py +3 -6
  10. {mergeron-2025.739439.12 → mergeron-2025.739439.14}/README.rst +0 -0
  11. {mergeron-2025.739439.12 → mergeron-2025.739439.14}/src/mergeron/core/__init__.py +0 -0
  12. {mergeron-2025.739439.12 → mergeron-2025.739439.14}/src/mergeron/core/empirical_margin_distribution.py +0 -0
  13. {mergeron-2025.739439.12 → mergeron-2025.739439.14}/src/mergeron/core/ftc_merger_investigations_data.py +0 -0
  14. {mergeron-2025.739439.12 → mergeron-2025.739439.14}/src/mergeron/core/pseudorandom_numbers.py +0 -0
  15. {mergeron-2025.739439.12 → mergeron-2025.739439.14}/src/mergeron/data/__init__.py +0 -0
  16. {mergeron-2025.739439.12 → mergeron-2025.739439.14}/src/mergeron/data/damodaran_margin_data_serialized.zip +0 -0
  17. {mergeron-2025.739439.12 → mergeron-2025.739439.14}/src/mergeron/data/ftc_merger_investigations_data.zip +0 -0
  18. {mergeron-2025.739439.12 → mergeron-2025.739439.14}/src/mergeron/gen/data_generation.py +2 -2
  19. {mergeron-2025.739439.12 → mergeron-2025.739439.14}/src/mergeron/gen/enforcement_stats.py +0 -0
  20. {mergeron-2025.739439.12 → mergeron-2025.739439.14}/src/mergeron/perks/__init__.py +0 -0
  21. {mergeron-2025.739439.12 → mergeron-2025.739439.14}/src/mergeron/py.typed +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: mergeron
3
- Version: 2025.739439.12
3
+ Version: 2025.739439.14
4
4
  Summary: Python for analyzing merger enforcement policy
5
5
  License: MIT
6
6
  Keywords: merger enforcement policy,merger guidelines,merger screening,enforcement presumptions,concentration standards,diversion ratio,upward pricing pressure,GUPPI
@@ -15,7 +15,7 @@ keywords = [
15
15
  "upward pricing pressure",
16
16
  "GUPPI",
17
17
  ]
18
- version = "2025.739439.12"
18
+ version = "2025.739439.14"
19
19
  requires-python = ">=3.13,<4.0" # need math.fma
20
20
 
21
21
  # Classifiers list: https://pypi.org/classifiers/
@@ -225,11 +225,12 @@ tmp_path_retention_policy = "failed"
225
225
 
226
226
  [tool.tox]
227
227
  requires = ["tox>=4.19"]
228
+ skip_missing_interpreters = true
228
229
  isolated_build = true
229
- envlist = ["py313"]
230
+ envlist = ["py313", "py314"]
230
231
 
231
232
 
232
- [tool.tox.env."py313"]
233
+ [tool.tox.env_run_base]
233
234
  commands = [
234
235
  [
235
236
  "poetry",
@@ -15,7 +15,7 @@ from ruamel import yaml
15
15
 
16
16
  _PKG_NAME: str = Path(__file__).parent.name
17
17
 
18
- VERSION = "2025.739439.12"
18
+ VERSION = "2025.739439.14"
19
19
 
20
20
  __version__ = VERSION
21
21
 
@@ -80,8 +80,8 @@ def assert_allclose( # noqa: PLR0913
80
80
  return np.testing.assert_allclose(
81
81
  _a,
82
82
  _b,
83
- atol=1e-15,
84
- rtol=1e-14,
83
+ atol=atol,
84
+ rtol=rtol,
85
85
  equal_nan=equal_nan,
86
86
  err_msg=err_msg,
87
87
  verbose=verbose,
@@ -226,10 +226,7 @@ class DiversionBoundary:
226
226
 
227
227
  @diversion_ratio.validator
228
228
  def _dvv(
229
- _instance: DiversionBoundary,
230
- _attribute: Attribute[float],
231
- _value: float,
232
- /,
229
+ _instance: DiversionBoundary, _attribute: Attribute[float], _value: float, /
233
230
  ) -> None:
234
231
  if not (isinstance(_value, decimal.Decimal | float) and 0 <= _value <= 1):
235
232
  raise ValueError(
@@ -237,9 +234,7 @@ class DiversionBoundary:
237
234
  )
238
235
 
239
236
  recapture_rate: float = field(
240
- kw_only=False,
241
- default=DEFAULT_REC,
242
- validator=validators.instance_of(float),
237
+ kw_only=False, default=DEFAULT_REC, validator=validators.instance_of(float)
243
238
  )
244
239
 
245
240
  recapture_form: RECForm | None = field(kw_only=True, default=RECForm.INOUT)
@@ -270,10 +265,7 @@ class DiversionBoundary:
270
265
 
271
266
  @recapture_form.validator
272
267
  def _rsv(
273
- _instance: DiversionBoundary,
274
- _attribute: Attribute[RECForm],
275
- _value: RECForm,
276
- /,
268
+ _instance: DiversionBoundary, _attribute: Attribute[RECForm], _value: RECForm, /
277
269
  ) -> None:
278
270
  if _value and not (isinstance(_value, RECForm)):
279
271
  raise ValueError(f"Invalid recapture specification, {_value!r}.")
@@ -373,11 +365,7 @@ class DiversionBoundary:
373
365
 
374
366
 
375
367
  def guppi_from_delta(
376
- _delta_bound: float = 0.01,
377
- /,
378
- *,
379
- m_star: float = 1.00,
380
- r_bar: float = DEFAULT_REC,
368
+ _delta_bound: float = 0.01, /, *, m_star: float = 1.00, r_bar: float = DEFAULT_REC
381
369
  ) -> float:
382
370
  """
383
371
  Translate ∆HHI bound to GUPPI bound.
@@ -433,11 +421,7 @@ def critical_diversion_share(
433
421
 
434
422
 
435
423
  def share_from_guppi(
436
- _guppi_bound: float = 0.065,
437
- /,
438
- *,
439
- m_star: float = 1.00,
440
- r_bar: float = DEFAULT_REC,
424
+ _guppi_bound: float = 0.065, /, *, m_star: float = 1.00, r_bar: float = DEFAULT_REC
441
425
  ) -> float:
442
426
  """
443
427
  Symmetric-firm share for given GUPPI, margin, and recapture rate.
@@ -205,7 +205,7 @@ def hhi_post_contrib_boundary(
205
205
 
206
206
 
207
207
  # hand-rolled root finding
208
- def diversion_share_boundary_wtd_avg( # noqa: PLR0914
208
+ def diversion_share_boundary_wtd_avg(
209
209
  _delta_star: float = 0.075,
210
210
  _r_val: float = DEFAULT_REC,
211
211
  /,
@@ -409,7 +409,7 @@ def diversion_share_boundary_wtd_avg( # noqa: PLR0914
409
409
  )
410
410
 
411
411
 
412
- def diversion_share_boundary_xact_avg( # noqa: PLR0914
412
+ def diversion_share_boundary_xact_avg(
413
413
  _delta_star: float = 0.075,
414
414
  _r_val: float = DEFAULT_REC,
415
415
  /,
@@ -676,9 +676,7 @@ def _diversion_share_boundary_intcpt(
676
676
  ),
677
677
  2 * mpf(f"{_r_val}"),
678
678
  )
679
- case None if (
680
- agg_method == "arithmetic mean" and recapture_form == "fixed"
681
- ):
679
+ case None if agg_method == "arithmetic mean" and recapture_form == "fixed":
682
680
  _s_intcpt = mp.fsub(_delta_star + 1 / 2, mp.fabs(_delta_star - 1 / 2))
683
681
  case _:
684
682
  _s_intcpt = s_2_pre
@@ -114,7 +114,9 @@ def _fc_wts_conv(
114
114
  return _tv if (_tv := np.asarray(_v, float)).sum() == 1 else _tv / _tv.sum()
115
115
 
116
116
 
117
- def _shr_dp_conv(_v: Sequence[float] | ArrayFloat | None, _i: MarketShareSpec) -> ArrayFloat:
117
+ def _shr_dp_conv(
118
+ _v: Sequence[float] | ArrayFloat | None, _i: MarketShareSpec
119
+ ) -> ArrayFloat:
118
120
  if _v is None or len(_v) == 0 or np.array_equal(_v, DEFAULT_DIST_PARMS):
119
121
  if _i.dist_type == SHRDistribution.UNI:
120
122
  return DEFAULT_DIST_PARMS
@@ -467,7 +467,7 @@ def diversion_ratios_builder(
467
467
  return divratio_array
468
468
 
469
469
 
470
- def prices_sampler( # noqa: PLR0914
470
+ def prices_sampler(
471
471
  _frmshr_array: ArrayDouble,
472
472
  _nth_firm_share: ArrayDouble,
473
473
  _aggregate_purchase_prob: ArrayDouble,
@@ -78,7 +78,9 @@ def compute_upp_test_counts(
78
78
 
79
79
  np.divide(
80
80
  np.einsum(
81
- "ij,ij->ij", _market_data_sample.pcm_array, _market_data_sample.divratio_array
81
+ "ij,ij->ij",
82
+ _market_data_sample.pcm_array,
83
+ _market_data_sample.divratio_array,
82
84
  ),
83
85
  1 - _market_data_sample.divratio_array,
84
86
  out=ipr_array,
@@ -6,6 +6,7 @@ and may provide improved precision than core functions, but tend to have
6
6
  poor performance
7
7
 
8
8
  """
9
+
9
10
  from __future__ import annotations
10
11
 
11
12
  from typing import Literal
@@ -292,13 +293,9 @@ def diversion_share_boundary_distance(
292
293
 
293
294
  match agg_method:
294
295
  case "arithmetic mean":
295
- delta_test = minkowski(
296
- (de_1, de_2), (0.0, 0.0), p=1, w=weights_i
297
- )
296
+ delta_test = minkowski((de_1, de_2), (0.0, 0.0), p=1, w=weights_i)
298
297
  case "distance":
299
- delta_test = minkowski(
300
- (de_1, de_2), (0.0, 0.0), p=2, w=weights_i
301
- )
298
+ delta_test = minkowski((de_1, de_2), (0.0, 0.0), p=2, w=weights_i)
302
299
 
303
300
  _test_flag, _incr_decr = (
304
301
  (delta_test > _delta_star, -1)
@@ -25,12 +25,12 @@ from ..core.guidelines_boundaries import HMGThresholds # noqa: TID252
25
25
  from . import (
26
26
  INVResolution, # noqa: F401
27
27
  MarketsData,
28
+ MarketShareSpec,
28
29
  PCMDistribution,
29
30
  PCMRestriction,
30
31
  PCMSpec,
31
32
  PriceSpec,
32
33
  SeedSequenceData,
33
- MarketShareSpec,
34
34
  SHRDistribution,
35
35
  SSZConstant,
36
36
  UPPTestRegime,
@@ -38,8 +38,8 @@ from . import (
38
38
  )
39
39
  from .data_generation_functions import (
40
40
  diversion_ratios_builder,
41
- prices_sampler,
42
41
  market_share_sampler,
42
+ prices_sampler,
43
43
  )
44
44
  from .upp_tests import compute_upp_test_counts
45
45