|
| 1 | +from pathlib import Path |
| 2 | + |
| 3 | +path = Path("statgpu/panel/_covariance.py") |
| 4 | +text = path.read_text(encoding="utf-8") |
| 5 | +old = ''' leverage_np = np.asarray(_to_numpy(leverage), dtype=np.float64).ravel() |
| 6 | + tol = 256.0 * np.finfo(np.float64).eps |
| 7 | + if leverage_np.size and float(np.min(leverage_np)) < -tol: |
| 8 | + raise ValueError("HC2/HC3 leverage is materially negative") |
| 9 | + if leverage_np.size and float(np.max(leverage_np)) > 1.0 + tol: |
| 10 | + raise ValueError("HC2/HC3 leverage is materially greater than one") |
| 11 | + leverage_np = np.clip(leverage_np, 0.0, 1.0) |
| 12 | + denominator_np = 1.0 - leverage_np |
| 13 | + if denominator_np.size and float(np.min(denominator_np)) <= tol: |
| 14 | + raise ValueError("HC2/HC3 covariance is undefined when leverage is numerically one") |
| 15 | + denominator = xp_asarray( |
| 16 | + denominator_np, |
| 17 | + dtype=xp.float64, |
| 18 | + xp=xp, |
| 19 | + ref_arr=X, |
| 20 | + ) |
| 21 | +''' |
| 22 | +new = ''' leverage_min = _to_float_scalar(xp.min(leverage)) |
| 23 | + leverage_max = _to_float_scalar(xp.max(leverage)) |
| 24 | + tol = 256.0 * np.finfo(np.float64).eps |
| 25 | + if leverage_min < -tol: |
| 26 | + raise ValueError("HC2/HC3 leverage is materially negative") |
| 27 | + if leverage_max > 1.0 + tol: |
| 28 | + raise ValueError("HC2/HC3 leverage is materially greater than one") |
| 29 | + if _is_torch(xp): |
| 30 | + leverage = xp.clamp(leverage, min=0.0, max=1.0) |
| 31 | + else: |
| 32 | + leverage = xp.clip(leverage, 0.0, 1.0) |
| 33 | + denominator = 1.0 - leverage |
| 34 | + denominator_min = _to_float_scalar(xp.min(denominator)) |
| 35 | + if denominator_min <= tol: |
| 36 | + raise ValueError("HC2/HC3 covariance is undefined when leverage is numerically one") |
| 37 | +''' |
| 38 | +if old not in text: |
| 39 | + raise SystemExit("expected HC leverage block not found") |
| 40 | +text = text.replace(old, new, 1) |
| 41 | +old_meta = ''' "leverage_min": float(leverage_np.min()) if leverage_np.size else None, |
| 42 | + "leverage_max": float(leverage_np.max()) if leverage_np.size else None, |
| 43 | +''' |
| 44 | +new_meta = ''' "leverage_min": float(leverage_min), |
| 45 | + "leverage_max": float(leverage_max), |
| 46 | +''' |
| 47 | +if old_meta not in text: |
| 48 | + raise SystemExit("expected HC leverage metadata block not found") |
| 49 | +text = text.replace(old_meta, new_meta, 1) |
| 50 | +path.write_text(text, encoding="utf-8") |
0 commit comments