mergeron 2024.738936.0__py3-none-any.whl → 2024.738940.0__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.

@@ -19,13 +19,14 @@ import tables as ptb # type: ignore
19
19
  from attrs import evolve
20
20
 
21
21
  import mergeron.core.ftc_merger_investigations_data as fid
22
- import mergeron.core.guidelines_standards as gsf
22
+ import mergeron.core.guidelines_standards as gsl
23
23
  import mergeron.gen.data_generation as dgl
24
24
  import mergeron.gen.guidelines_tests as gtl
25
25
  import mergeron.gen.investigations_stats as isl
26
26
  from mergeron import DATA_DIR
27
27
  from mergeron.core.guidelines_standards import GuidelinesStandards
28
28
  from mergeron.core.proportions_tests import propn_ci
29
+ from mergeron.gen import PCMConstants, PCMSpec, RECConstants, ShareSpec, SHRConstants
29
30
 
30
31
  if not sys.warnoptions:
31
32
  warnings.simplefilter("ignore") # , category="RuntimeWarning")
@@ -41,7 +42,7 @@ def invres_stats_sim_setup(
41
42
  _invdata: fid.INVData,
42
43
  _data_period: str,
43
44
  _merger_class: isl.INDGRPConstants | isl.EVIDENConstants,
44
- _invres_parm_vec: gsf.GuidelinesSTD,
45
+ _invres_parm_vec: gsl.GuidelinesSTD,
45
46
  _sample_spec: dgl.MarketSampleSpec,
46
47
  _invres_stats_kwargs: Mapping[str, Any] | None = None,
47
48
  /,
@@ -86,9 +87,9 @@ def invres_stats_sim_setup(
86
87
 
87
88
  _sample_spec_here = evolve(
88
89
  _sample_spec,
89
- share_spec=dgl.ShareSpec(
90
- dgl.RECConstants.INOUT,
91
- dgl.SHRConstants.DIR_FLAT,
90
+ share_spec=ShareSpec(
91
+ RECConstants.INOUT,
92
+ SHRConstants.DIR_FLAT,
92
93
  None,
93
94
  _invres_cnts_obs_byfirmcount_array[:-1, 1],
94
95
  ),
@@ -96,11 +97,7 @@ def invres_stats_sim_setup(
96
97
 
97
98
  # Generate simulated rates
98
99
  _start_time = datetime.now()
99
- (
100
- _invres_cnts_sim_byfirmcount_array,
101
- _invres_cnts_sim_bydelta_array,
102
- _invres_cnts_sim_byconczone_array,
103
- ) = gtl.sim_invres_cnts_ll(
100
+ _upp_tests_counts = gtl.sim_invres_cnts_ll(
104
101
  _invres_parm_vec, _sample_spec_here, _invres_stats_kwargs
105
102
  )
106
103
  _total_duration = datetime.now() - _start_time
@@ -118,7 +115,7 @@ def invres_stats_sim_setup(
118
115
  "hcol_width": 54,
119
116
  "notewidth": 0.63,
120
117
  "obs_array": _invres_cnts_obs_byfirmcount_array,
121
- "sim_array": _invres_cnts_sim_byfirmcount_array,
118
+ "sim_array": _upp_tests_counts.by_firm_count,
122
119
  },
123
120
  isl.StatsGrpSelector.DL: {
124
121
  "desc": Rf"{_test_regime.capitalize()} rates by range of $\Delta HHI$",
@@ -137,7 +134,7 @@ def invres_stats_sim_setup(
137
134
  isl.LTX_ARRAY_LINEEND,
138
135
  )),
139
136
  "obs_array": _invres_cnts_obs_bydelta_array,
140
- "sim_array": _invres_cnts_sim_bydelta_array,
137
+ "sim_array": _upp_tests_counts.by_delta,
141
138
  },
142
139
  isl.StatsGrpSelector.ZN: {
143
140
  "desc": f"{_test_regime.capitalize()} rates by Approximate Presumption Zone",
@@ -149,7 +146,7 @@ def invres_stats_sim_setup(
149
146
  "hcol_width": 190,
150
147
  "notewidth": 0.96,
151
148
  "obs_array": _invres_cnts_obs_byconczone_array,
152
- "sim_array": _invres_cnts_sim_byconczone_array,
149
+ "sim_array": _upp_tests_counts.by_conczone,
153
150
  },
154
151
  }
155
152
 
@@ -180,7 +177,7 @@ def invres_stats_sim_render(
180
177
  _merger_class: isl.INDGRPConstants | isl.EVIDENConstants,
181
178
  _stats_group: isl.StatsGrpSelector,
182
179
  _stats_group_dict_sub: Mapping[str, Any],
183
- _invres_parm_vec: gsf.GuidelinesSTD,
180
+ _invres_parm_vec: gsl.GuidelinesSTD,
184
181
  _sim_test_regime: gtl.UPPTestRegime,
185
182
  _stats_table_file: TextIOWrapper,
186
183
  /,
@@ -192,9 +189,9 @@ def invres_stats_sim_render(
192
189
  for _g, _h in (("obs_array", -2), ("sim_array", -5))
193
190
  )
194
191
 
195
- _invres_select, _, _ = _sim_test_regime
192
+ _invres_select = _sim_test_regime.resolution
196
193
  (
197
- _stats_table_content.test_regime,
194
+ _stats_table_content.test_res,
198
195
  _stats_table_content.obs_merger_class,
199
196
  _stats_table_content.obs_period,
200
197
  ) = (_invres_select.capitalize(), _merger_class, _data_period.split("-"))
@@ -214,7 +211,7 @@ def invres_stats_sim_render(
214
211
  R"estimated by the Wilson method, given the",
215
212
  "reported numbers of investigated mergers and cleared mergers",
216
213
  _stats_group_dict_sub["desc"].replace(
217
- f"{_stats_table_content.test_regime} rates ", ""
214
+ f"{_stats_table_content.test_res} rates ", ""
218
215
  ),
219
216
  isl.LTX_ARRAY_LINEEND,
220
217
  ))
@@ -224,7 +221,7 @@ def invres_stats_sim_render(
224
221
  propn_ci(0.50 * _eg_count, _eg_count, method="Exact")
225
222
  )
226
223
  _stats_sim_notestr = " ".join((
227
- Rf"\(\cdot\) Simulated {_stats_table_content.test_regime} rates are estimated by",
224
+ Rf"\(\cdot\) Simulated {_stats_table_content.test_res} rates are estimated by",
228
225
  "Monte Carlo integration over generated data representing",
229
226
  Rf"{_sim_sample_sz:,d} hypothetical mergers. Thus,",
230
227
  R"for a subset of simulations with a relative frequency",
@@ -315,7 +312,7 @@ def invres_stats_sim_render(
315
312
  f"{g} {isl.LTX_ARRAY_LINEEND}" for g in _invres_stats_hdr_list
316
313
  ])
317
314
  _stats_table_content.stats_cis = "".join([
318
- f"{' & '.join(g)} {isl.LTX_ARRAY_LINEEND}" for g in _invres_stats_dat_list
315
+ f"{" & ".join(g)} {isl.LTX_ARRAY_LINEEND}" for g in _invres_stats_dat_list
319
316
  ])
320
317
  # Print to console
321
318
  isl.stats_print_rows(_invres_stats_hdr_list, _invres_stats_dat_list)
@@ -333,7 +330,7 @@ def invres_stats_sim_render(
333
330
  # Exclude results of IPR tests
334
331
  _stats_sim_dat_list = [_f[:-1] for _f in _stats_sim_dat_list]
335
332
  _stats_table_content.stats_sim = "".join([
336
- f"{' & '.join(g)} {isl.LTX_ARRAY_LINEEND}" for g in _stats_sim_dat_list
333
+ f"{" & ".join(g)} {isl.LTX_ARRAY_LINEEND}" for g in _stats_sim_dat_list
337
334
  ])
338
335
  # Print to console
339
336
  isl.stats_print_rows(_stats_sim_hdr_list, _stats_sim_dat_list)
@@ -362,8 +359,7 @@ if __name__ == "__main__":
362
359
  )
363
360
 
364
361
  sample_sz_base = 10**7
365
- pr_sym_spec = dgl.PRIConstants.SYM
366
- pcm_dist_type, pcm_dist_parms = dgl.PCMConstants.EMPR, np.empty(2)
362
+ pcm_dist_type, pcm_dist_parms = PCMConstants.EMPR, None
367
363
 
368
364
  save_data_to_file_flag = False
369
365
  save_data_to_file: gtl.SaveData = False
@@ -379,8 +375,8 @@ if __name__ == "__main__":
379
375
  save_data_to_file = (True, h5datafile, "/")
380
376
 
381
377
  sim_test_regime = (
382
- (isl.PolicySelector.CLRN, gtl.GUPPIWghtngSelector.MAX, None),
383
- (isl.PolicySelector.ENFT, gtl.GUPPIWghtngSelector.OSD, None),
378
+ (isl.PolicySelector.CLRN, gtl.UPPAggrSelector.MAX, None),
379
+ (isl.PolicySelector.ENFT, gtl.UPPAggrSelector.OSD, None),
384
380
  )[1]
385
381
  invres_stats_kwargs = {"sim_test_regime": sim_test_regime}
386
382
 
@@ -406,17 +402,14 @@ if __name__ == "__main__":
406
402
  mkt_sample_spec = dgl.MarketSampleSpec(
407
403
  sample_sz_base,
408
404
  invres_parm_vec.rec,
409
- pr_sym_spec,
410
- pcm_spec=dgl.PCMSpec(
411
- pcm_dist_type, dgl.FM2Constants.MNL, pcm_dist_parms
412
- ),
405
+ pcm_spec=PCMSpec(pcm_dist_type, dgl.FM2Constants.MNL, pcm_dist_parms),
413
406
  hsr_filing_test_type=dgl.SSZConstants.HSR_NTH,
414
407
  )
415
408
 
416
409
  # A file to write tables to, and a hierarchy under which to store the data
417
410
  if save_data_to_file:
418
411
  h5hier_pat = re.compile(r"\W")
419
- h5hier = f"/{h5hier_pat.sub('_', f'{merger_class} {study_period}')}"
412
+ h5hier = f"/{h5hier_pat.sub("_", f"{merger_class} {study_period}")}"
420
413
  save_data_to_file = (True, save_data_to_file[1], h5hier)
421
414
 
422
415
  table_dottex_name = invres_stats_sim_setup(
@@ -24,7 +24,7 @@ from numpy import (
24
24
  vstack,
25
25
  )
26
26
 
27
- import mergeron.core.guidelines_standards as gsf
27
+ import mergeron.core.guidelines_standards as gsl
28
28
  from mergeron import DATA_DIR
29
29
 
30
30
  PROG_PATH = Path(__file__)
@@ -40,7 +40,7 @@ def plot_delta_boundaries(
40
40
  raise ValueError(f"Recapture specification must be one of, {_recspecs!r}")
41
41
 
42
42
  print("ΔHHI safeharbor boundary")
43
- _plt, _my_fig1, _ax1, _ = gsf.boundary_plot()
43
+ _plt, _my_fig1, _ax1, _ = gsl.boundary_plot()
44
44
 
45
45
  _dh_bar, _r_bar, _guppi_bench, _divr_bench, _, _ = get_hmg_standards_by_key(
46
46
  _guppi_bench_key
@@ -52,7 +52,7 @@ def plot_delta_boundaries(
52
52
  if _dh_bound in (300, 500):
53
53
  continue
54
54
 
55
- _dh_safeharb, _dh_prob = gsf.delta_hhi_boundary(_dh_bound / 1e4)
55
+ _dh_safeharb, _dh_prob = gsl.delta_hhi_boundary(_dh_bound / 1e4)
56
56
  _dh_dat_x, _dh_dat_y = zip(*_dh_safeharb, strict=True)
57
57
  if _dh_bound == 100:
58
58
  _lwval, _lsval = 0.75, "-"
@@ -69,8 +69,8 @@ def plot_delta_boundaries(
69
69
  )
70
70
 
71
71
  if _print_guppi_max_bndry_envs_flag:
72
- _symshr = gsf.round_cust(sqrt(_dh_bound / 2e4))
73
- _dstar = gsf.round_cust(_symshr / (1 - _symshr))
72
+ _symshr = gsl.round_cust(sqrt(_dh_bound / 2e4))
73
+ _dstar = gsl.round_cust(_symshr / (1 - _symshr))
74
74
  _m_star = _guppi_bench / (_dstar * _r_bar)
75
75
  print(_symshr, _dstar, _m_star, _r_bar, _guppi_bench, "...", end="")
76
76
 
@@ -150,10 +150,10 @@ def plot_guppi_boundaries( # noqa PLR0915
150
150
  )
151
151
 
152
152
  # First we get the data for the ΔHHI benchmark we want to plot
153
- _dh_safeharb, _dh_prob = gsf.delta_hhi_boundary(_dh_bar)
153
+ _dh_safeharb, _dh_prob = gsl.delta_hhi_boundary(_dh_bar)
154
154
  _dh_dat_x, _dh_dat_y = zip(*_dh_safeharb, strict=True)
155
155
 
156
- _plt, _my_fig1, _ax1, _set_axis_def = gsf.boundary_plot()
156
+ _plt, _my_fig1, _ax1, _set_axis_def = gsl.boundary_plot()
157
157
  _plt.delaxes(_ax1)
158
158
  del _my_fig1, _ax1
159
159
 
@@ -316,13 +316,13 @@ def plot_guppi_boundaries( # noqa PLR0915
316
316
  # print("Diversion ratio bound")
317
317
  if _divr_bench < _r_bar:
318
318
  _m_star_bench = _guppi_bench / _divr_bench
319
- _s_mid_bench = gsf.shr_from_gbd(
319
+ _s_mid_bench = gsl.shr_from_gbd(
320
320
  _guppi_bench, m_star=_m_star_bench, r_bar=_r_bar
321
321
  )
322
- _delta_star = gsf.critical_shrratio(
322
+ _delta_star = gsl.critical_shrratio(
323
323
  _guppi_bench, m_star=_m_star_bench, r_bar=_r_bar
324
324
  )
325
- (guppi_boundary_data, guppi_boundary_area) = gsf.shrratio_mgnsym_boundary_max(
325
+ (guppi_boundary_data, guppi_boundary_area) = gsl.shrratio_boundary_max(
326
326
  _delta_star
327
327
  )
328
328
  _x_drt, _y_drt = zip(*guppi_boundary_data, strict=True)
@@ -451,16 +451,16 @@ def get_hmg_standards_by_key(_guppi_bench_key: str, /) -> tuple:
451
451
  match _guppi_bench_key:
452
452
  case "DOJATR":
453
453
  return (
454
- *(_tmp := gsf.GuidelinesStandards(2010).safeharbor[:2]),
454
+ *(_tmp := gsl.GuidelinesStandards(2010).safeharbor[:2]),
455
455
  0.05,
456
456
  _tmp[-1],
457
457
  None,
458
458
  None,
459
459
  )
460
460
  case "DH100":
461
- return gsf.GuidelinesStandards(2010).safeharbor
461
+ return gsl.GuidelinesStandards(2010).safeharbor
462
462
  case "DH50":
463
- return gsf.GuidelinesStandards(1992).safeharbor
463
+ return gsl.GuidelinesStandards(1992).safeharbor
464
464
  case _:
465
465
  raise ValueError(
466
466
  f"GUPPI benchmark key must be one of, {guppi_benchmark_keys!r}"
@@ -12,14 +12,14 @@ from matplotlib import cm as colormgr
12
12
  from matplotlib import colors as mcolors
13
13
  from matplotlib.ticker import AutoMinorLocator, MultipleLocator, StrMethodFormatter
14
14
 
15
- import mergeron.core.guidelines_standards as gsf
15
+ import mergeron.core.guidelines_standards as gsl
16
16
  from mergeron import DATA_DIR
17
17
 
18
18
  PROG_PATH = Path(__file__)
19
19
 
20
20
 
21
21
  def _main() -> None:
22
- plt, _, _, set_axis_def = gsf.boundary_plot()
22
+ plt, _, _, set_axis_def = gsl.boundary_plot()
23
23
  # plt.delaxes(ax1)
24
24
  # del my_fig1, ax1
25
25
  # del ax1
@@ -45,7 +45,7 @@ def _main() -> None:
45
45
  g_bar, r_bar, dr_bar = 0.06, 0.80, 0.20
46
46
 
47
47
  step_size = 10**-5
48
- sym_shr_vec = np.arange(gsf.shr_from_gbd(g_bar), 0.5 + step_size, step_size)
48
+ sym_shr_vec = np.arange(gsl.shr_from_gbd(g_bar), 0.5 + step_size, step_size)
49
49
  mst_vec = (g_bar / r_bar) * (1 - sym_shr_vec) / sym_shr_vec
50
50
 
51
51
  print("Setup basic figure and axes for plots of safe harbor boundaries.")
@@ -7,15 +7,28 @@ from typing import Literal
7
7
  import numpy as np
8
8
  import tables as ptb # type: ignore
9
9
 
10
- import mergeron.core.guidelines_standards as gsf
10
+ import mergeron.core.guidelines_standards as gsl
11
11
  import mergeron.gen.data_generation as dgl
12
12
  import mergeron.gen.guidelines_tests as gtl
13
13
  import mergeron.gen.investigations_stats as isl
14
14
  from mergeron import DATA_DIR
15
+ from mergeron.gen import (
16
+ EMPTY_ARRAY_DEFAULT,
17
+ FCOUNT_WTS_DEFAULT,
18
+ MarketSampleSpec,
19
+ PCMConstants,
20
+ PCMSpec,
21
+ ShareSpec,
22
+ SHRConstants,
23
+ )
15
24
 
16
25
  tests_of_interest: tuple[gtl.UPPTestRegime, ...] = (
17
- (isl.PolicySelector.CLRN, gtl.GUPPIWghtngSelector.MAX, gtl.GUPPIWghtngSelector.MAX),
18
- (isl.PolicySelector.ENFT, gtl.GUPPIWghtngSelector.MIN, gtl.GUPPIWghtngSelector.MIN),
26
+ gtl.UPPTestRegime(
27
+ isl.PolicySelector.CLRN, gtl.UPPAggrSelector.MAX, gtl.UPPAggrSelector.MAX
28
+ ),
29
+ gtl.UPPTestRegime(
30
+ isl.PolicySelector.ENFT, gtl.UPPAggrSelector.MIN, gtl.UPPAggrSelector.MIN
31
+ ),
19
32
  )
20
33
 
21
34
  PROG_PATH = Path(__file__)
@@ -24,9 +37,7 @@ PROG_PATH = Path(__file__)
24
37
  def analyze_invres_data(
25
38
  _sample_size: int = 10**6,
26
39
  _hmg_std_pub_year: Literal[1992, 2010, 2023] = 1992,
27
- _test_sel: tuple[
28
- str, gtl.GUPPIWghtngSelector, gtl.GUPPIWghtngSelector | None
29
- ] = tests_of_interest[1],
40
+ _test_sel: gtl.UPPTestRegime = tests_of_interest[1],
30
41
  /,
31
42
  *,
32
43
  save_data_to_file_flag: bool = False,
@@ -50,7 +61,7 @@ def analyze_invres_data(
50
61
  If True, simulated data are save to file (hdf5 format)
51
62
 
52
63
  """
53
- _invres_parm_vec = gsf.GuidelinesStandards(_hmg_std_pub_year).presumption
64
+ _invres_parm_vec = gsl.GuidelinesStandards(_hmg_std_pub_year).presumption
54
65
 
55
66
  _save_data_to_file: gtl.SaveData = False
56
67
  if save_data_to_file_flag:
@@ -61,10 +72,10 @@ def analyze_invres_data(
61
72
  _h5_datafile = ptb.open_file(
62
73
  DATA_DIR / PROG_PATH.with_suffix(".h5").name,
63
74
  mode="w",
64
- title=f"GUPPI Safeharbor {_test_sel[0].capitalize()} Rate Module",
75
+ title=f"GUPPI Safeharbor {_test_sel.resolution.capitalize()} Rate Module",
65
76
  filters=_blosc_filters,
66
77
  )
67
- _h5_hier = f"/{_h5_hier_pat.sub('_', f'Standards from {_hmg_std_pub_year} Guidelines')}"
78
+ _h5_hier = f"/{_h5_hier_pat.sub("_", f"Standards from {_hmg_std_pub_year} Guidelines")}"
68
79
 
69
80
  _save_data_to_file = (True, _h5_datafile, _h5_hier)
70
81
 
@@ -77,11 +88,7 @@ def analyze_invres_data(
77
88
  [
78
89
  tuple(
79
90
  zip(
80
- (
81
- dgl.PCMConstants.UNI,
82
- dgl.PCMConstants.BETA,
83
- dgl.PCMConstants.EMPR,
84
- ),
91
+ (PCMConstants.UNI, PCMConstants.BETA, PCMConstants.EMPR),
85
92
  (
86
93
  np.array((0, 1), dtype=np.float64),
87
94
  np.array((10, 10), dtype=np.float64),
@@ -106,24 +113,23 @@ def analyze_invres_data(
106
113
 
107
114
  print()
108
115
  print(
109
- f"Simulated {_test_sel[0].capitalize()} rates by range of ∆HHI",
116
+ f"Simulated {_test_sel.resolution.capitalize()} rates by range of ∆HHI",
110
117
  f'recapture-rate calibrated, "{_recapture_spec_test}"',
111
118
  f'Firm 2 margins, "{_pcm_dist_firm2_test}"',
112
119
  f"and margins distributed {_pcm_dist_type_test}{_pcm_dist_parms_test}:",
113
120
  sep="; ",
114
121
  )
115
122
 
116
- _ind_sample_spec = dgl.MarketSampleSpec(
123
+ _ind_sample_spec = MarketSampleSpec(
117
124
  _sample_size,
118
125
  _invres_parm_vec.rec,
119
- dgl.PRIConstants.SYM,
120
- share_spec=dgl.ShareSpec(
126
+ share_spec=ShareSpec(
121
127
  _recapture_spec_test,
122
- dgl.SHRConstants.UNI,
123
- dgl.EMPTY_ARRAY_DEFAULT,
124
- dgl.FCOUNT_WTS_DEFAULT,
128
+ SHRConstants.UNI,
129
+ EMPTY_ARRAY_DEFAULT,
130
+ FCOUNT_WTS_DEFAULT,
125
131
  ),
126
- pcm_spec=dgl.PCMSpec(
132
+ pcm_spec=PCMSpec(
127
133
  _pcm_dist_type_test, _pcm_dist_firm2_test, _pcm_dist_parms_test
128
134
  ),
129
135
  )
@@ -134,11 +140,8 @@ def analyze_invres_data(
134
140
  }
135
141
 
136
142
  _start_time = datetime.now()
137
- (
138
- _invres_rate_sim_byfirmcount_array,
139
- _invres_rate_sim_bydelta_array,
140
- _invres_rate_sim_byconczone_array,
141
- ) = gtl.sim_invres_cnts_ll(
143
+
144
+ upp_test_counts = gtl.sim_invres_cnts_ll(
142
145
  _invres_parm_vec, _ind_sample_spec, _invres_cnts_kwargs
143
146
  )
144
147
  _run_duration = datetime.now() - _start_time
@@ -149,7 +152,7 @@ def analyze_invres_data(
149
152
  )
150
153
 
151
154
  _stats_hdr_list, _stats_dat_list = isl.latex_tbl_invres_stats_1dim(
152
- _invres_rate_sim_bydelta_array,
155
+ upp_test_counts.by_delta,
153
156
  return_type_sel=isl.StatsReturnSelector.RPT,
154
157
  sort_order=isl.SortSelector.REV,
155
158
  )
@@ -24,28 +24,28 @@ d_bar = 0.2 # 0.2 # r_bar # g_bar # 0.8 * 0.125 / (1 - 0.125)
24
24
  sample_sz = 10**8
25
25
 
26
26
 
27
- def icr_gsh_sym(_ssz: int = sample_sz) -> NDArray[float]:
27
+ def icr_gsh_sym(_ssz: int = sample_sz) -> NDArray[np.float64]:
28
28
  """With symmetric shares, margins, and prices; closed-form integrand."""
29
29
  _m_lim = g_bar / d_bar
30
30
  _m_star = _m_lim + (1.0 - _m_lim) * rng.uniform(size=(_ssz, 1))
31
31
  _d_star = g_bar / (r_bar * _m_star)
32
32
  _divr_limit_prob = 2 * g_bar / (r_bar + d_bar)
33
- _gsf_bound_prob = 2 * (1 - _m_lim) * (_d_star / (1 + _d_star)).mean()
34
- return np.array([_ssz, _divr_limit_prob + _gsf_bound_prob, np.nan, np.nan])
33
+ _guppi_bound_prob = 2 * (1 - _m_lim) * (_d_star / (1 + _d_star)).mean()
34
+ return np.array([_ssz, _divr_limit_prob + _guppi_bound_prob, np.nan, np.nan])
35
35
 
36
36
 
37
- def icr_gsh_asymmshr(_ssz: int = sample_sz) -> NDArray[float]:
37
+ def icr_gsh_asymmshr(_ssz: int = sample_sz) -> NDArray[np.float64]:
38
38
  """With symmetric margins and prices, unequal shares; closed-form integrand."""
39
39
  _m_lim = g_bar / d_bar
40
40
  _m_star = _m_lim + (1.0 - _m_lim) * rng.random(size=(_ssz, 1))
41
41
 
42
42
  _d_star = g_bar / (r_bar * _m_star)
43
43
  _divr_limit_prob = 2 * (g_bar / r_bar) * d_bar / (r_bar + d_bar)
44
- _gsf_bound_prob = 2 * (1 - _m_lim) * (_d_star**2 / (1 + _d_star)).mean()
45
- return np.array([_ssz, _divr_limit_prob + _gsf_bound_prob, np.nan, np.nan])
44
+ _guppi_bound_prob = 2 * (1 - _m_lim) * (_d_star**2 / (1 + _d_star)).mean()
45
+ return np.array([_ssz, _divr_limit_prob + _guppi_bound_prob, np.nan, np.nan])
46
46
 
47
47
 
48
- def gen_qtyshr(_ssz: int = sample_sz, *, sym_flag: bool = False) -> NDArray[float]:
48
+ def gen_qtyshr(_ssz: int = sample_sz, *, sym_flag: bool = False) -> NDArray[np.float64]:
49
49
  """Unequal shares and margins, and symmetric prices; indicator-function integrand."""
50
50
  if sym_flag:
51
51
  # for symmetric shares
@@ -57,7 +57,7 @@ def gen_qtyshr(_ssz: int = sample_sz, *, sym_flag: bool = False) -> NDArray[floa
57
57
  return _mktshr_array
58
58
 
59
59
 
60
- def icr_gsh_asymmshrmgn(_ssz: int = sample_sz) -> NDArray[float]:
60
+ def icr_gsh_asymmshrmgn(_ssz: int = sample_sz) -> NDArray[np.float64]:
61
61
  """With symmetric prices, unequal shares and margins; indicator-function integrand."""
62
62
 
63
63
  _shr_sym_flag = False
@@ -98,17 +98,17 @@ def icr_gsh_asymmshrmgn(_ssz: int = sample_sz) -> NDArray[float]:
98
98
  _divr_test = _divr_array.max(axis=1) < d_bar
99
99
  _pcm_min_test = _pcm_array.min(axis=1) >= (g_bar / d_bar)
100
100
  _divr_limit_test = _gbd_test & _divr_test & np.logical_not(_pcm_min_test)
101
- _gsf_not_in_deltah = np.logical_not(_delta_test) & _gbd_test & _divr_test
101
+ _gbd_not_in_deltah = np.logical_not(_delta_test) & _gbd_test & _divr_test
102
102
 
103
103
  _scount = len(_gbd_test)
104
- _gsf_prob = len(_gbd_test[_gbd_test & _divr_test]) / _scount
104
+ _gbd_prob = len(_gbd_test[_gbd_test & _divr_test]) / _scount
105
105
  _deltah_prob = len(_gbd_test[_delta_test]) / _scount
106
- _cum_clr_prob = len(_gbd_test[_delta_test | _gsf_not_in_deltah]) / _scount
106
+ _cum_clr_prob = len(_gbd_test[_delta_test | _gbd_not_in_deltah]) / _scount
107
107
 
108
108
  del _guppi_array, _divr_array, _pcm_array
109
109
  del _gbd_test, _divr_test, _pcm_min_test, _divr_limit_test
110
110
 
111
- return np.array([_scount, _gsf_prob, _deltah_prob, _cum_clr_prob])
111
+ return np.array([_scount, _gbd_prob, _deltah_prob, _cum_clr_prob])
112
112
 
113
113
 
114
114
  if __name__ == "__main__":
@@ -12,6 +12,7 @@ from __future__ import annotations
12
12
 
13
13
  import gc
14
14
  from contextlib import suppress
15
+ from dataclasses import fields
15
16
  from pathlib import Path
16
17
  from typing import Final
17
18
 
@@ -21,12 +22,13 @@ from matplotlib import cm, colors
21
22
  from matplotlib.ticker import StrMethodFormatter
22
23
  from numpy.typing import NDArray
23
24
 
24
- import mergeron.core.guidelines_standards as gsf
25
+ import mergeron.core.guidelines_standards as gsl
25
26
  import mergeron.gen.data_generation as dgl
26
27
  import mergeron.gen.guidelines_tests as gtl
27
28
  import mergeron.gen.investigations_stats as isl
28
29
  from mergeron import DATA_DIR
29
30
  from mergeron.core.pseudorandom_numbers import DIST_PARMS_DEFAULT
31
+ from mergeron.gen import ShareSpec
30
32
 
31
33
  PROG_PATH = Path(__file__)
32
34
 
@@ -37,14 +39,10 @@ blosc_filters = ptb.Filters(
37
39
 
38
40
 
39
41
  def gen_plot_data(
40
- _market_data: dgl.MarketsSample,
41
- _std_vec: gsf.GuidelinesSTD,
42
- _pcm_firm2_star: float = 0.30,
43
- _test_regime: gtl.UPPTestRegime = (
44
- isl.PolicySelector.CLRN,
45
- gtl.GUPPIWghtngSelector.MAX,
46
- None,
47
- ),
42
+ _market_data: dgl.MarketDataSample,
43
+ _std_vec: gsl.GuidelinesSTD,
44
+ _pcm_firm2_star: float,
45
+ _test_regime: gtl.UPPTestRegime,
48
46
  /,
49
47
  *,
50
48
  h5handle: ptb.File | None = None,
@@ -59,14 +57,19 @@ def gen_plot_data(
59
57
  ))
60
58
  del _m1
61
59
 
62
- _upp_tests = gtl.gen_upp_arrays(
60
+ _upp_test_raw = gtl.gen_upp_arrays(
63
61
  _std_vec,
64
- dgl.MarketsSample(_market_data.frmshr_array, _pcm_array, *_market_data[2:]),
62
+ dgl.MarketDataSample(*[
63
+ _pcm_array.astype(_f.type)
64
+ if _f.name == "pcm_array"
65
+ else getattr(_market_data, _f.name)
66
+ for _f in fields(_market_data)
67
+ ]),
65
68
  _test_regime,
66
69
  )
67
70
 
68
- _gbd_test_rows = np.where(_upp_tests.guppi_test_simple)[0]
69
- del _upp_tests
71
+ _gbd_test_rows = np.where(_upp_test_raw.guppi_test_simple)[0]
72
+ del _upp_test_raw
70
73
 
71
74
  _qtyshr_firm1_inv, _qtyshr_firm2_inv = (
72
75
  _market_data.frmshr_array[_gbd_test_rows][:, [0]],
@@ -99,7 +102,7 @@ def gen_plot_data(
99
102
  )
100
103
 
101
104
  _pcm_sorter = np.argsort(_pcm_plotter, axis=0)
102
- if _test_regime[0] != isl.PolicySelector.CLRN:
105
+ if test_regime.resolution != isl.PolicySelector.CLRN:
103
106
  _pcm_sorter = _pcm_sorter[::-1, :]
104
107
  _qtyshr_firm1_plotter = _qtyshr_firm1_inv[_pcm_sorter]
105
108
  _qtyshr_firm2_plotter = _qtyshr_firm2_inv[_pcm_sorter]
@@ -118,14 +121,16 @@ def gen_plot_data(
118
121
 
119
122
  # Generate market data
120
123
  def _main(
121
- _hmg_pub_year: gsf.HMGPubYear,
124
+ _hmg_pub_year: gsl.HMGPubYear,
122
125
  _market_sample_spec: dgl.MarketSampleSpec,
123
126
  _test_regime: gtl.UPPTestRegime,
124
127
  _save_data_to_file: gtl.SaveData,
125
128
  ) -> None:
126
129
  guidelins_std_vec = getattr(
127
- gsf.GuidelinesStandards(_hmg_pub_year),
128
- "safeharbor" if _test_regime[0] == isl.PolicySelector.ENFT else "presumption",
130
+ gsl.GuidelinesStandards(_hmg_pub_year),
131
+ "safeharbor"
132
+ if test_regime.resolution == isl.PolicySelector.ENFT
133
+ else "presumption",
129
134
  )
130
135
 
131
136
  _, _r_bar, _g_bar, _divr_bar, *_ = guidelins_std_vec
@@ -140,14 +145,14 @@ def _main(
140
145
  )
141
146
  _fig_norm = colors.Normalize(0.0, 1.0)
142
147
  _cmap_kwargs = {"cmap": "cividis", "norm": _fig_norm}
143
- _plt, _, _, _set_axis_def = gsf.boundary_plot()
148
+ _plt, _, _, _set_axis_def = gsl.boundary_plot()
144
149
 
145
150
  _fig_2dsg = _plt.figure(figsize=(8.5, 9.5), dpi=600)
146
151
 
147
152
  _fig_grid = _fig_2dsg.add_gridspec(
148
153
  nrows=1, ncols=2, figure=_fig_2dsg, width_ratios=[6, 0.125], wspace=0.0
149
154
  )
150
- _fig_grid_gsf = _fig_grid[0, 0].subgridspec(
155
+ _fig_grid_gbd = _fig_grid[0, 0].subgridspec(
151
156
  nrows=3, ncols=1, wspace=0, hspace=0.125
152
157
  )
153
158
 
@@ -156,7 +161,7 @@ def _main(
156
161
  _g_bar / _divr_bar,
157
162
  _g_bar / _r_bar,
158
163
  )):
159
- _ax_now = _fig_2dsg.add_subplot(_fig_grid_gsf[_ax_row, 0])
164
+ _ax_now = _fig_2dsg.add_subplot(_fig_grid_gbd[_ax_row, 0])
160
165
  _ax_now = _set_axis_def(_ax_now, mktshares_plot_flag=True)
161
166
  _ax_now.set_xlabel(None)
162
167
  _ax_now.set_ylabel(None)
@@ -237,10 +242,10 @@ def _main(
237
242
 
238
243
  _base_name = DATA_DIR / "{}_{}Rate_{}gbar{}PCT_{}Recapture".format(
239
244
  PROG_PATH.stem,
240
- f"{_test_regime[0]}".capitalize(),
245
+ f"{test_regime.resolution}".capitalize(),
241
246
  _hmg_pub_year,
242
247
  f"{_g_bar * 100:02.0f}",
243
- market_sample_spec.share_spec[0],
248
+ market_sample_spec.share_spec.recapture_spec,
244
249
  )
245
250
  _my_fig_2dsg_savepath = DATA_DIR / f"{_base_name}_2DScatterGrid.pdf"
246
251
  print(f"Save 2D plot to, {f'"{_my_fig_2dsg_savepath}"'}")
@@ -250,14 +255,14 @@ def _main(
250
255
  if __name__ == "__main__":
251
256
  # Get Guidelines parameter values
252
257
  hmg_pub_year: Final = 2023
253
- test_regime: gtl.UPPTestRegime = (
254
- isl.PolicySelector.ENFT,
255
- gtl.GUPPIWghtngSelector.MIN,
256
- gtl.GUPPIWghtngSelector.MIN,
258
+ test_regime: gtl.UPPTestRegime = gtl.UPPTestRegime(
259
+ isl.PolicySelector.ENFT, gtl.UPPAggrSelector.MIN, gtl.UPPAggrSelector.MIN
257
260
  )
258
261
  r_bar = getattr(
259
- gsf.GuidelinesStandards(hmg_pub_year),
260
- "presumption" if test_regime[0] == isl.PolicySelector.ENFT else "safeharbor",
262
+ gsl.GuidelinesStandards(hmg_pub_year),
263
+ "presumption"
264
+ if test_regime.resolution == isl.PolicySelector.ENFT
265
+ else "safeharbor",
261
266
  ).rec
262
267
 
263
268
  sample_sz = 10**7
@@ -265,7 +270,7 @@ if __name__ == "__main__":
265
270
  market_sample_spec = dgl.MarketSampleSpec(
266
271
  sample_sz,
267
272
  r_bar,
268
- share_spec=dgl.ShareSpec(
273
+ share_spec=ShareSpec(
269
274
  dgl.RECConstants.INOUT, dgl.SHRConstants.UNI, DIST_PARMS_DEFAULT, None
270
275
  ),
271
276
  )