mergeron 2025.739355.0__tar.gz → 2025.739355.1__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 (20) hide show
  1. {mergeron-2025.739355.0 → mergeron-2025.739355.1}/PKG-INFO +2 -2
  2. {mergeron-2025.739355.0 → mergeron-2025.739355.1}/README.rst +1 -1
  3. {mergeron-2025.739355.0 → mergeron-2025.739355.1}/pyproject.toml +2 -3
  4. {mergeron-2025.739355.0 → mergeron-2025.739355.1}/src/mergeron/__init__.py +1 -1
  5. {mergeron-2025.739355.0 → mergeron-2025.739355.1}/src/mergeron/core/guidelines_boundary_functions.py +42 -40
  6. {mergeron-2025.739355.0 → mergeron-2025.739355.1}/src/mergeron/gen/data_generation_functions.py +5 -3
  7. {mergeron-2025.739355.0 → mergeron-2025.739355.1}/src/mergeron/core/__init__.py +0 -0
  8. {mergeron-2025.739355.0 → mergeron-2025.739355.1}/src/mergeron/core/empirical_margin_distribution.py +0 -0
  9. {mergeron-2025.739355.0 → mergeron-2025.739355.1}/src/mergeron/core/ftc_merger_investigations_data.py +0 -0
  10. {mergeron-2025.739355.0 → mergeron-2025.739355.1}/src/mergeron/core/guidelines_boundaries.py +0 -0
  11. {mergeron-2025.739355.0 → mergeron-2025.739355.1}/src/mergeron/core/guidelines_boundary_functions_extra.py +0 -0
  12. {mergeron-2025.739355.0 → mergeron-2025.739355.1}/src/mergeron/core/pseudorandom_numbers.py +0 -0
  13. {mergeron-2025.739355.0 → mergeron-2025.739355.1}/src/mergeron/data/__init__.py +0 -0
  14. {mergeron-2025.739355.0 → mergeron-2025.739355.1}/src/mergeron/data/damodaran_margin_data_serialized.zip +0 -0
  15. {mergeron-2025.739355.0 → mergeron-2025.739355.1}/src/mergeron/data/ftc_merger_investigations_data.zip +0 -0
  16. {mergeron-2025.739355.0 → mergeron-2025.739355.1}/src/mergeron/gen/__init__.py +0 -0
  17. {mergeron-2025.739355.0 → mergeron-2025.739355.1}/src/mergeron/gen/data_generation.py +0 -0
  18. {mergeron-2025.739355.0 → mergeron-2025.739355.1}/src/mergeron/gen/enforcement_stats.py +0 -0
  19. {mergeron-2025.739355.0 → mergeron-2025.739355.1}/src/mergeron/gen/upp_tests.py +0 -0
  20. {mergeron-2025.739355.0 → mergeron-2025.739355.1}/src/mergeron/py.typed +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: mergeron
3
- Version: 2025.739355.0
3
+ Version: 2025.739355.1
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
@@ -89,5 +89,5 @@ To install the package, use the following shell command:
89
89
  Documentation
90
90
  -------------
91
91
 
92
- Usage guide and API reference available `here <https://capeconomics.github.io/mergeron/>`_.
92
+ Usage guide and API reference are `available <https://capeconomics.github.io/mergeron/>`_.
93
93
 
@@ -49,4 +49,4 @@ To install the package, use the following shell command:
49
49
  Documentation
50
50
  -------------
51
51
 
52
- Usage guide and API reference available `here <https://capeconomics.github.io/mergeron/>`_.
52
+ Usage guide and API reference are `available <https://capeconomics.github.io/mergeron/>`_.
@@ -15,7 +15,7 @@ keywords = [
15
15
  "upward pricing pressure",
16
16
  "GUPPI",
17
17
  ]
18
- version = "2025.739355.0"
18
+ version = "2025.739355.1"
19
19
 
20
20
  # Classifiers list: https://pypi.org/classifiers/
21
21
  classifiers = [
@@ -111,7 +111,6 @@ exclude = [
111
111
  "venv",
112
112
  ]
113
113
 
114
- target-version = "py312"
115
114
  fix = true
116
115
 
117
116
  # Same as Black.
@@ -183,7 +182,7 @@ line-ending = "lf"
183
182
  preview = true
184
183
 
185
184
  [tool.mypy]
186
- python_version = "3.12"
185
+
187
186
  cache_fine_grained = true
188
187
  ignore_missing_imports = false
189
188
  strict = true
@@ -15,7 +15,7 @@ from ruamel import yaml
15
15
 
16
16
  _PKG_NAME: str = Path(__file__).parent.name
17
17
 
18
- VERSION = "2025.739355.0"
18
+ VERSION = "2025.739355.1"
19
19
 
20
20
  __version__ = VERSION
21
21
 
@@ -467,47 +467,46 @@ def diversion_share_boundary_xact_avg(
467
467
  Array of share-pairs, area under boundary, area under boundary.
468
468
 
469
469
  """
470
- _delta_star, _r_val = (mpf(f"{_v}") for _v in (_delta_star, _r_val))
471
470
  _s_mid = _delta_star / (1 + _delta_star)
472
- _step_size = mp.power(10, -dps)
471
+ _step_size = 10**-dps
473
472
 
474
473
  _bdry_start = np.array([(_s_mid, _s_mid)])
475
- _s_1 = np.array(mp.arange(_s_mid - _step_size, 0, -_step_size))
474
+ _s_1 = np.arange(_s_mid - _step_size, 0, -_step_size)
476
475
  if recapture_form == "inside-out":
477
- _s_intcpt = mp.fdiv(
478
- mp.fsub(
479
- 2 * _delta_star * _r_val + 1, mp.fabs(2 * _delta_star * _r_val - 1)
480
- ),
481
- 2 * mpf(f"{_r_val}"),
476
+ _s_intcpt: float = (
477
+ 2 * _delta_star * _r_val + 1 - np.abs(2 * _delta_star * _r_val - 1)
478
+ ) / (2 * _r_val)
479
+ nr_t1: ArrayDouble = (
480
+ 1 + 2 * _delta_star * _r_val * (1 - _s_1) - _s_1 * (1 - _r_val)
482
481
  )
483
- nr_t1 = 1 + 2 * _delta_star * _r_val * (1 - _s_1) - _s_1 * (1 - _r_val)
484
482
 
485
- nr_sqrt_mdr = 4 * _delta_star * _r_val
486
- nr_sqrt_mdr2 = nr_sqrt_mdr * _r_val
487
- nr_sqrt_md2r2 = nr_sqrt_mdr2 * _delta_star
483
+ nr_sqrt_mdr: float = 4 * _delta_star * _r_val
484
+ nr_sqrt_mdr2: float = nr_sqrt_mdr * _r_val
485
+ nr_sqrt_md2r2: float = nr_sqrt_mdr2 * _delta_star
488
486
 
489
- nr_sqrt_t1 = nr_sqrt_md2r2 * (_s_1**2 - 2 * _s_1 + 1)
490
- nr_sqrt_t2 = nr_sqrt_mdr2 * _s_1 * (_s_1 - 1)
491
- nr_sqrt_t3 = nr_sqrt_mdr * (2 * _s_1 - _s_1**2 - 1)
492
- nr_sqrt_t4 = (_s_1**2) * (_r_val**2 - 6 * _r_val + 1)
493
- nr_sqrt_t5 = _s_1 * (6 * _r_val - 2) + 1
487
+ nr_sqrt_t1: ArrayDouble = nr_sqrt_md2r2 * (_s_1**2 - 2 * _s_1 + 1)
488
+ nr_sqrt_t2: ArrayDouble = nr_sqrt_mdr2 * _s_1 * (_s_1 - 1)
489
+ nr_sqrt_t3: ArrayDouble = nr_sqrt_mdr * (2 * _s_1 - _s_1**2 - 1)
490
+ nr_sqrt_t4: ArrayDouble = (_s_1**2) * (_r_val**2 - 6 * _r_val + 1)
491
+ nr_sqrt_t5: ArrayDouble = _s_1 * (6 * _r_val - 2) + 1
494
492
 
495
- nr_t2_mdr = nr_sqrt_t1 + nr_sqrt_t2 + nr_sqrt_t3 + nr_sqrt_t4 + nr_sqrt_t5
493
+ nr_t2_mdr: ArrayDouble = (
494
+ nr_sqrt_t1 + nr_sqrt_t2 + nr_sqrt_t3 + nr_sqrt_t4 + nr_sqrt_t5
495
+ )
496
496
 
497
497
  # Alternative grouping of terms in np.sqrt
498
- nr_sqrt_s1sq = (_s_1**2) * (
499
- nr_sqrt_md2r2 + nr_sqrt_mdr2 - nr_sqrt_mdr + _r_val**2 - 6 * _r_val + 1
500
- )
501
- nr_sqrt_s1 = _s_1 * (
498
+ nr_sqrt_nos1: float = nr_sqrt_md2r2 - nr_sqrt_mdr + 1
499
+ nr_sqrt_s1: ArrayDouble = _s_1 * (
502
500
  -2 * nr_sqrt_md2r2 - nr_sqrt_mdr2 + 2 * nr_sqrt_mdr + 6 * _r_val - 2
503
501
  )
504
- nr_sqrt_nos1 = nr_sqrt_md2r2 - nr_sqrt_mdr + 1
505
-
506
- nr_t2_s1 = nr_sqrt_s1sq + nr_sqrt_s1 + nr_sqrt_nos1
502
+ nr_sqrt_s1sq: ArrayDouble = (_s_1**2) * (
503
+ nr_sqrt_md2r2 + nr_sqrt_mdr2 - nr_sqrt_mdr + _r_val**2 - 6 * _r_val + 1
504
+ )
505
+ nr_t2_s1: ArrayDouble = nr_sqrt_s1sq + nr_sqrt_s1 + nr_sqrt_nos1
507
506
 
508
507
  if not np.isclose(
509
- np.einsum("i->", nr_t2_mdr.astype(float)),
510
- np.einsum("i->", nr_t2_s1.astype(float)),
508
+ np.einsum("i->", nr_t2_mdr),
509
+ np.einsum("i->", nr_t2_s1),
511
510
  rtol=0,
512
511
  atol=0.5 * dps,
513
512
  ):
@@ -516,25 +515,28 @@ def diversion_share_boundary_xact_avg(
516
515
  f"with recapture spec, {f'"{recapture_form}"'} is incorrect."
517
516
  )
518
517
 
519
- s_2 = (nr_t1 - np.sqrt(nr_t2_s1)) / (2 * _r_val)
518
+ s_2: ArrayDouble = (nr_t1 - nr_t2_s1**0.5) / (2 * _r_val)
520
519
 
521
520
  else:
522
- _s_intcpt = mp.fsub(_delta_star + 1 / 2, mp.fabs(_delta_star - 1 / 2))
523
- s_2 = (
524
- (1 / 2)
521
+ _s_intcpt: float = _delta_star + 1 / 2 - np.abs(_delta_star - 1 / 2)
522
+ s_2: ArrayDouble = (
523
+ 0.5
525
524
  + _delta_star
526
525
  - _delta_star * _s_1
527
- - np.sqrt(
528
- ((_delta_star**2) - 1) * (_s_1**2)
529
- + (-2 * (_delta_star**2) + _delta_star + 1) * _s_1
530
- + (_delta_star**2)
531
- - _delta_star
532
- + (1 / 4)
526
+ - (
527
+ (
528
+ ((_delta_star**2) - 1) * (_s_1**2)
529
+ + (-2 * (_delta_star**2) + _delta_star + 1) * _s_1
530
+ + (_delta_star**2)
531
+ - _delta_star
532
+ + (1 / 4)
533
+ )
534
+ ** 0.5
533
535
  )
534
536
  )
535
537
 
536
538
  bdry_inner = np.stack((_s_1, s_2), axis=1)
537
- bdry_end = np.array([(mpf("0.0"), _s_intcpt)], float)
539
+ bdry_end = np.array([(0.0, _s_intcpt)], float)
538
540
 
539
541
  bdry = np.vstack((
540
542
  bdry_end,
@@ -542,14 +544,14 @@ def diversion_share_boundary_xact_avg(
542
544
  _bdry_start,
543
545
  bdry_inner[:, ::-1],
544
546
  bdry_end[:, ::-1],
545
- )).astype(float)
547
+ ))
546
548
  s_2 = np.concatenate((np.array([_s_mid], float), s_2))
547
549
 
548
550
  bdry_ends = [0, -1]
549
551
  bdry_odds = np.array(range(1, len(s_2), 2), int)
550
552
  bdry_evns = np.array(range(2, len(s_2), 2), int)
551
553
 
552
- # Double the are under the curve, and subtract the double counted bit.
554
+ # Double the area under the curve, and subtract the double counted bit.
553
555
  bdry_area_simpson = 2 * _step_size * (
554
556
  (4 / 3) * np.sum(s_2.take(bdry_odds))
555
557
  + (2 / 3) * np.sum(s_2.take(bdry_evns))
@@ -438,11 +438,13 @@ def gen_divr_array(
438
438
  """
439
439
  divr_array: ArrayDouble
440
440
  if _recapture_form == RECForm.FIXED:
441
- divr_array = _recapture_ratio * _frmshr_array[:, ::-1] / (1 - _frmshr_array) # type: ignore
441
+ divr_array = np.divide(
442
+ _recapture_ratio * _frmshr_array[:, ::-1], 1 - _frmshr_array
443
+ )
442
444
 
443
445
  else:
444
446
  purchprob_array = _aggregate_purchase_prob * _frmshr_array
445
- divr_array = purchprob_array[:, ::-1] / (1 - purchprob_array)
447
+ divr_array = np.divide(purchprob_array[:, ::-1], 1 - purchprob_array)
446
448
 
447
449
  divr_assert_test = (
448
450
  (np.round(np.einsum("ij->i", _frmshr_array), 15) == 1)
@@ -616,7 +618,7 @@ def gen_margin_price_data(
616
618
  # Revenue ratio has been 10-to-1 since inception
617
619
  # Thus, a simple form of the HSR filing test would impose a 10-to-1
618
620
  # ratio restriction on the merging firms' revenues
619
- rev_ratio = (rev_array.min(axis=1) / rev_array.max(axis=1)).round(4)
621
+ rev_ratio = np.divide(rev_array.min(axis=1), rev_array.max(axis=1)).round(4)
620
622
  hsr_filing_test = rev_ratio >= test_rev_ratio_inv
621
623
  # del _rev_array, _rev_ratio
622
624
  case SSZConstant.HSR_NTH: