Skip to content

Commit 7ec1d07

Browse files
committed
fix: correct power law R² calculation in structure evaluator
1 parent f2796f5 commit 7ec1d07

File tree

1 file changed

+21
-7
lines changed

1 file changed

+21
-7
lines changed

graphgen/models/evaluator/kg/structure_evaluator.py

Lines changed: 21 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
from collections import Counter
12
from typing import Any, Dict, Optional
23

34
import numpy as np
@@ -81,14 +82,27 @@ def _calculate_powerlaw_r2(degree_map: Dict[str, int]) -> Optional[float]:
8182
return None
8283

8384
try:
84-
# Fit power law: log(y) = a * log(x) + b
85-
log_degrees = np.log(degrees)
86-
sorted_log_degrees = np.sort(log_degrees)
87-
x = np.arange(1, len(sorted_log_degrees) + 1)
88-
log_x = np.log(x)
89-
85+
degree_counts = Counter(degrees)
86+
degree_values = []
87+
frequencies = []
88+
for deg, freq in sorted(degree_counts.items()):
89+
if deg > 0 and freq > 0:
90+
degree_values.append(deg)
91+
frequencies.append(freq)
92+
93+
if len(degree_values) < 3:
94+
logger.warning(
95+
f"Insufficient unique degrees ({len(degree_values)}) for power law fitting. "
96+
f"Graph may be too uniform."
97+
)
98+
return None
99+
100+
# Fit power law: log(frequency) = a * log(degree) + b
101+
log_degrees = np.log(degree_values)
102+
log_frequencies = np.log(frequencies)
103+
90104
# Linear regression on log-log scale
91-
r_value, *_ = stats.linregress(log_x, sorted_log_degrees)
105+
r_value, *_ = stats.linregress(log_degrees, log_frequencies)
92106
r2 = r_value**2
93107

94108
return float(r2)

0 commit comments

Comments
 (0)