mergeron 2025.739355.0__py3-none-any.whl → 2025.739355.1__py3-none-any.whl
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.
- mergeron/__init__.py +1 -1
- mergeron/core/guidelines_boundary_functions.py +42 -40
- mergeron/gen/data_generation_functions.py +5 -3
- {mergeron-2025.739355.0.dist-info → mergeron-2025.739355.1.dist-info}/METADATA +2 -2
- {mergeron-2025.739355.0.dist-info → mergeron-2025.739355.1.dist-info}/RECORD +6 -6
- {mergeron-2025.739355.0.dist-info → mergeron-2025.739355.1.dist-info}/WHEEL +0 -0
mergeron/__init__.py
CHANGED
|
@@ -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 =
|
|
471
|
+
_step_size = 10**-dps
|
|
473
472
|
|
|
474
473
|
_bdry_start = np.array([(_s_mid, _s_mid)])
|
|
475
|
-
_s_1 = np.
|
|
474
|
+
_s_1 = np.arange(_s_mid - _step_size, 0, -_step_size)
|
|
476
475
|
if recapture_form == "inside-out":
|
|
477
|
-
_s_intcpt =
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
2 *
|
|
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 =
|
|
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
|
-
|
|
499
|
-
|
|
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
|
-
|
|
505
|
-
|
|
506
|
-
|
|
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
|
|
510
|
-
np.einsum("i->", nr_t2_s1
|
|
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 -
|
|
518
|
+
s_2: ArrayDouble = (nr_t1 - nr_t2_s1**0.5) / (2 * _r_val)
|
|
520
519
|
|
|
521
520
|
else:
|
|
522
|
-
_s_intcpt =
|
|
523
|
-
s_2 = (
|
|
524
|
-
|
|
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
|
-
-
|
|
528
|
-
(
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
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([(
|
|
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
|
-
))
|
|
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
|
|
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 =
|
|
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]
|
|
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)
|
|
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:
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.3
|
|
2
2
|
Name: mergeron
|
|
3
|
-
Version: 2025.739355.
|
|
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
|
|
92
|
+
Usage guide and API reference are `available <https://capeconomics.github.io/mergeron/>`_.
|
|
93
93
|
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
mergeron/__init__.py,sha256=
|
|
1
|
+
mergeron/__init__.py,sha256=EuIMqkVajtF2FCtP2VIkeEc9Kw9k4ZR5_dRZjxHbXHs,5773
|
|
2
2
|
mergeron/core/__init__.py,sha256=4Y_q-Qu7gXENVKHS-lNebn5mPZDy9oPHFwUV7fAW9Nw,3269
|
|
3
3
|
mergeron/core/empirical_margin_distribution.py,sha256=aqQ7JYpliHSjHpzyPRkYW9LhJfp-aAlSifRxYx3Dmbo,11623
|
|
4
4
|
mergeron/core/ftc_merger_investigations_data.py,sha256=k4TDkP1rDBmN4uKOYF0SUvSRkYmyVhbsBvLUKDYJqOo,28537
|
|
5
5
|
mergeron/core/guidelines_boundaries.py,sha256=noacM3NmhzqPKLPGm7HEvLKX2UlRI1DCw1kxDa2cFXk,15586
|
|
6
|
-
mergeron/core/guidelines_boundary_functions.py,sha256=
|
|
6
|
+
mergeron/core/guidelines_boundary_functions.py,sha256=yyq2Fn41OwfeSSlKdnvkVwaPMvUalp6_MCOXt49DbKY,28606
|
|
7
7
|
mergeron/core/guidelines_boundary_functions_extra.py,sha256=JompgWmwnwcWsodXrZbvzY_OXw-7ppb_H_Gsz9-fpgI,22080
|
|
8
8
|
mergeron/core/pseudorandom_numbers.py,sha256=-mPveXjJJ446NrBMAmWIa2jI6j0Px0xcCJTGEEsn3bo,10149
|
|
9
9
|
mergeron/data/__init__.py,sha256=CbqheFSkXEe7NOfuAV-NLaaEiNzl9pVCndGjtUUOj9g,1846
|
|
@@ -11,10 +11,10 @@ mergeron/data/damodaran_margin_data_serialized.zip,sha256=Wc1v9buSrYTWWAravG8W9n
|
|
|
11
11
|
mergeron/data/ftc_merger_investigations_data.zip,sha256=tiB2TLFyS9LMSFIv8DBA_oEEx12DU4MyjHni4NlsRMU,24002
|
|
12
12
|
mergeron/gen/__init__.py,sha256=bRGGIFBqIVw4-zZ4AKwcNbOTM9aHKegPj7w_7MJV9-I,23856
|
|
13
13
|
mergeron/gen/data_generation.py,sha256=L44YNtxso-Ya50YT71rnG-el4_PgGn4vtoA7rFDD194,17487
|
|
14
|
-
mergeron/gen/data_generation_functions.py,sha256=
|
|
14
|
+
mergeron/gen/data_generation_functions.py,sha256=AaDG0XxpTYsx_2fuUkE20b7bdFq9kfQMWvGIhEFiERw,26106
|
|
15
15
|
mergeron/gen/enforcement_stats.py,sha256=etTax-sBSn8DveF-IxuBJDdX0XSBD6oFU9vaZe6cYks,14387
|
|
16
16
|
mergeron/gen/upp_tests.py,sha256=gRJISQ2jGmIDmFOvaTIkvYooI4mK-QbgkfgL46RrRio,7445
|
|
17
17
|
mergeron/py.typed,sha256=frcCV1k9oG9oKj3dpUqdJg1PxRT2RSN_XKdLCPjaYaY,2
|
|
18
|
-
mergeron-2025.739355.
|
|
19
|
-
mergeron-2025.739355.
|
|
20
|
-
mergeron-2025.739355.
|
|
18
|
+
mergeron-2025.739355.1.dist-info/METADATA,sha256=qmUfVT8DcCL6o3cgQz-wK_mWvmANZbE9wSg8FSaxGXs,3864
|
|
19
|
+
mergeron-2025.739355.1.dist-info/WHEEL,sha256=fGIA9gx4Qxk2KDKeNJCbOEwSrmLtjWCwzBz351GyrPQ,88
|
|
20
|
+
mergeron-2025.739355.1.dist-info/RECORD,,
|
|
File without changes
|