Skip to content

Commit a31b545

Browse files
ci: stage reviewed HC backend patch
1 parent 6c06f66 commit a31b545

1 file changed

Lines changed: 50 additions & 0 deletions

File tree

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
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

Comments
 (0)