refactor(includes): R12 下标 while 循环改 for range,R13 c.Set 迁移为赋值

R12(wiki/新规范 L27-39):把「i: int = 0 与 while i < N: … i += 1」形式的下标循环改写为「for i in range(N):」。保守判定:仅当条件为裸 NAME < EXPR、循环体无 continue、NAME 在体内无其它赋值、无嵌套重绑定、循环后同层不再引用 NAME 时才改写。共 269 处 / 48 文件。

R13:c.Set 是正在退化的路径——c.Set(*p, v) 期望写作 *p = v,c.Set(a, b) 等于 a = b。本次把 includes 内 45 处 c.Set 全部迁移为赋值,includes 已无 c.Set 调用。

验证:bootstrap 三重重编 SUCCESS(无 vast_c 解析回退);全量 77/77 顺序回归通过;ZlibTest 内部断言 79 passed / 0 failed。
This commit is contained in:
TermiNexus committed 2026-10-05 15:33:52 +08:00
1 parent 3e1ed0992b
commit 27121f56a7
27 files changed
+208 -534

No files matched your search

+68 -204
View File
@@ -50,73 +50,59 @@ class ndarray[T]:
def __add__(self, other: ndarray[T]*) -> ndarray[T]*:
result: ndarray[T]* = _empty_like(self)
if not result: return None
i: sizet = 0
while i < self.size:
for i in range(self.size):
result.data[i] = self.data[i] + other.data[i]
i += 1
return result
def __sub__(self, other: ndarray[T]*) -> ndarray[T]*:
result: ndarray[T]* = _empty_like(self)
if not result: return None
i: sizet = 0
while i < self.size:
for i in range(self.size):
result.data[i] = self.data[i] - other.data[i]
i += 1
return result
def __mul__(self, other: ndarray[T]*) -> ndarray[T]*:
result: ndarray[T]* = _empty_like(self)
if not result: return None
i: sizet = 0
while i < self.size:
for i in range(self.size):
result.data[i] = self.data[i] * other.data[i]
i += 1
return result
def __truediv__(self, other: ndarray[T]*) -> ndarray[T]*:
result: ndarray[T]* = _empty_like(self)
if not result: return None
i: sizet = 0
while i < self.size:
for i in range(self.size):
if other.data[i] != T(0):
result.data[i] = self.data[i] / other.data[i]
else:
result.data[i] = T(0)
i += 1
return result
def __floordiv__(self, other: ndarray[T]*) -> ndarray[T]*:
result: ndarray[T]* = _empty_like(self)
if not result: return None
i: sizet = 0
while i < self.size:
for i in range(self.size):
if other.data[i] != T(0):
result.data[i] = math.floor(self.data[i] / other.data[i])
else:
result.data[i] = T(0)
i += 1
return result
def __mod__(self, other: ndarray[T]*) -> ndarray[T]*:
result: ndarray[T]* = _empty_like(self)
if not result: return None
i: sizet = 0
while i < self.size:
for i in range(self.size):
if other.data[i] != T(0):
result.data[i] = math.fmod(self.data[i], other.data[i])
else:
result.data[i] = T(0)
i += 1
return result
def __neg__(self) -> ndarray[T]*:
result: ndarray[T]* = _empty_like(self)
if not result: return None
i: sizet = 0
while i < self.size:
for i in range(self.size):
result.data[i] = -self.data[i]
i += 1
return result
def __len__(self) -> int:
@@ -136,10 +122,8 @@ class ndarray[T]:
self.pool.free(self)
def fill(self, val: T):
i: sizet = 0
while i < self.size:
for i in range(self.size):
self.data[i] = val
i += 1
def copy(self) -> ndarray[T]*:
result: ndarray[T]* = _empty_like(self)
@@ -167,10 +151,8 @@ class ndarray[T]:
def sum(self) -> T:
s: T = T(0)
i: sizet = 0
while i < self.size:
for i in range(self.size):
s += self.data[i]
i += 1
return s
def mean(self) -> T:
@@ -222,10 +204,8 @@ class ndarray[T]:
def dot(self, other: ndarray[T]*) -> T:
s: T = T(0)
n: sizet = self.size if (self.size < other.size) else other.size
i: sizet = 0
while i < n:
for i in range(n):
s += self.data[i] * other.data[i]
i += 1
return s
def T(self) -> ndarray[T]*:
@@ -238,30 +218,25 @@ class ndarray[T]:
result.shape[0] = cols
result.shape[1] = rows
_compute_strides(result)
i: sizet = 0
while i < rows:
for i in range(rows):
j: sizet = 0
while j < cols:
result.data[j * rows + i] = self.data[i * cols + j]
j += 1
i += 1
return result
def print_arr(self):
if self.ndim == 1:
stdio.printf("[")
i: sizet = 0
while i < self.size:
for i in range(self.size):
if i > 0: stdio.printf(", ")
stdio.printf("%.4f", self.data[i])
i += 1
stdio.printf("]\n")
elif self.ndim == 2:
rows: sizet = self.shape[0]
cols: sizet = self.shape[1]
stdio.printf("[")
i: sizet = 0
while i < rows:
for i in range(rows):
if i > 0: stdio.printf(" ")
stdio.printf("[")
j: sizet = 0
@@ -273,7 +248,6 @@ class ndarray[T]:
stdio.printf("]\n")
else:
stdio.printf("]]\n")
i += 1
# ============================================================
@@ -402,10 +376,8 @@ def linspace(pool: rawptr[memhub.MemManager], start: double, stop: double, num:
a.data[0] = start
return a
step: double = (stop - start) / double(num - 1)
i: sizet = 0
while i < num:
for i in range(num):
a.data[i] = start + double(i) * step
i += 1
return a
def empty2d(pool: rawptr[memhub.MemManager], rows: sizet, cols: sizet) -> ndarray[double]*:
@@ -438,20 +410,16 @@ def ones2d(pool: rawptr[memhub.MemManager], rows: sizet, cols: sizet) -> ndarray
def eye(pool: rawptr[memhub.MemManager], n: sizet) -> ndarray[double]*:
a: ndarray[double]* = empty2d(pool, n, n)
if not a: return None
i: sizet = 0
while i < n:
for i in range(n):
a.data[i * n + i] = double(1.0)
i += 1
return a
def diag(pool: rawptr[memhub.MemManager], vals: ndarray[double]*) -> ndarray[double]*:
n: sizet = vals.size
a: ndarray[double]* = empty2d(pool, n, n)
if not a: return None
i: sizet = 0
while i < n:
for i in range(n):
a.data[i * n + i] = vals.data[i]
i += 1
return a
@@ -461,74 +429,58 @@ def diag(pool: rawptr[memhub.MemManager], vals: ndarray[double]*) -> ndarray[dou
def np_abs(a: ndarray[double]*) -> ndarray[double]*:
result: ndarray[double]* = _empty_like(a)
if not result: return None
i: sizet = 0
while i < a.size:
for i in range(a.size):
v: double = a.data[i]
result.data[i] = v if v >= double(0.0) else -v
i += 1
return result
def np_sqrt(a: ndarray[double]*) -> ndarray[double]*:
result: ndarray[double]* = _empty_like(a)
if not result: return None
i: sizet = 0
while i < a.size:
for i in range(a.size):
result.data[i] = math.sqrt(a.data[i])
i += 1
return result
def np_exp(a: ndarray[double]*) -> ndarray[double]*:
result: ndarray[double]* = _empty_like(a)
if not result: return None
i: sizet = 0
while i < a.size:
for i in range(a.size):
result.data[i] = math.exp(a.data[i])
i += 1
return result
def np_log(a: ndarray[double]*) -> ndarray[double]*:
result: ndarray[double]* = _empty_like(a)
if not result: return None
i: sizet = 0
while i < a.size:
for i in range(a.size):
result.data[i] = math.log(a.data[i])
i += 1
return result
def np_sin(a: ndarray[double]*) -> ndarray[double]*:
result: ndarray[double]* = _empty_like(a)
if not result: return None
i: sizet = 0
while i < a.size:
for i in range(a.size):
result.data[i] = math.sin(a.data[i])
i += 1
return result
def np_cos(a: ndarray[double]*) -> ndarray[double]*:
result: ndarray[double]* = _empty_like(a)
if not result: return None
i: sizet = 0
while i < a.size:
for i in range(a.size):
result.data[i] = math.cos(a.data[i])
i += 1
return result
def np_tan(a: ndarray[double]*) -> ndarray[double]*:
result: ndarray[double]* = _empty_like(a)
if not result: return None
i: sizet = 0
while i < a.size:
for i in range(a.size):
result.data[i] = math.tan(a.data[i])
i += 1
return result
def np_pow(a: ndarray[double]*, p: double) -> ndarray[double]*:
result: ndarray[double]* = _empty_like(a)
if not result: return None
i: sizet = 0
while i < a.size:
for i in range(a.size):
result.data[i] = math.pow(a.data[i], p)
i += 1
return result
@@ -538,40 +490,32 @@ def np_pow(a: ndarray[double]*, p: double) -> ndarray[double]*:
def add_scalar(a: ndarray[double]*, s: double) -> ndarray[double]*:
result: ndarray[double]* = _empty_like(a)
if not result: return None
i: sizet = 0
while i < a.size:
for i in range(a.size):
result.data[i] = a.data[i] + s
i += 1
return result
def mul_scalar(a: ndarray[double]*, s: double) -> ndarray[double]*:
result: ndarray[double]* = _empty_like(a)
if not result: return None
i: sizet = 0
while i < a.size:
for i in range(a.size):
result.data[i] = a.data[i] * s
i += 1
return result
def sub_scalar(a: ndarray[double]*, s: double) -> ndarray[double]*:
result: ndarray[double]* = _empty_like(a)
if not result: return None
i: sizet = 0
while i < a.size:
for i in range(a.size):
result.data[i] = a.data[i] - s
i += 1
return result
def div_scalar(a: ndarray[double]*, s: double) -> ndarray[double]*:
result: ndarray[double]* = _empty_like(a)
if not result: return None
i: sizet = 0
while i < a.size:
for i in range(a.size):
if s != double(0.0):
result.data[i] = a.data[i] / s
else:
result.data[i] = double(0.0)
i += 1
return result
@@ -588,8 +532,7 @@ def matmul(a: ndarray[double]*, b: ndarray[double]*) -> ndarray[double]*:
if k != k2: return None
c: ndarray[double]* = empty2d(a.pool, m, n)
if not c: return None
i: sizet = 0
while i < m:
for i in range(m):
j: sizet = 0
while j < n:
s: double = double(0.0)
@@ -599,7 +542,6 @@ def matmul(a: ndarray[double]*, b: ndarray[double]*) -> ndarray[double]*:
p += 1
c.data[i * n + j] = s
j += 1
i += 1
return c
def dot_product(a: ndarray[double]*, b: ndarray[double]*) -> double:
@@ -635,11 +577,9 @@ def var(a: ndarray[double]*) -> double:
if a.size == 0: return double(0.0)
m: double = a.mean()
s: double = double(0.0)
i: sizet = 0
while i < a.size:
for i in range(a.size):
d: double = a.data[i] - m
s += d * d
i += 1
return s / double(a.size)
def std(a: ndarray[double]*) -> double:
@@ -651,13 +591,11 @@ def norm(a: ndarray[double]*) -> double:
def clip(a: ndarray[double]*, lo: double, hi: double) -> ndarray[double]*:
result: ndarray[double]* = _empty_like(a)
if not result: return None
i: sizet = 0
while i < a.size:
for i in range(a.size):
v: double = a.data[i]
if v < lo: v = lo
if v > hi: v = hi
result.data[i] = v
i += 1
return result
def concatenate(a: ndarray[double]*, b: ndarray[double]*) -> ndarray[double]*:
@@ -692,10 +630,8 @@ def sort_arr(a: ndarray[double]*) -> ndarray[double]*:
def reverse(a: ndarray[double]*) -> ndarray[double]*:
result: ndarray[double]* = _empty_like(a)
if not result: return None
i: sizet = 0
while i < a.size:
for i in range(a.size):
result.data[i] = a.data[a.size - 1 - i]
i += 1
return result
@@ -705,177 +641,139 @@ def reverse(a: ndarray[double]*) -> ndarray[double]*:
def np_log10(a: ndarray[double]*) -> ndarray[double]*:
result: ndarray[double]* = _empty_like(a)
if not result: return None
i: sizet = 0
while i < a.size:
for i in range(a.size):
result.data[i] = math.log10(a.data[i])
i += 1
return result
def np_log2(a: ndarray[double]*) -> ndarray[double]*:
result: ndarray[double]* = _empty_like(a)
if not result: return None
i: sizet = 0
while i < a.size:
for i in range(a.size):
result.data[i] = math.log2(a.data[i])
i += 1
return result
def np_floor(a: ndarray[double]*) -> ndarray[double]*:
result: ndarray[double]* = _empty_like(a)
if not result: return None
i: sizet = 0
while i < a.size:
for i in range(a.size):
result.data[i] = math.floor(a.data[i])
i += 1
return result
def np_ceil(a: ndarray[double]*) -> ndarray[double]*:
result: ndarray[double]* = _empty_like(a)
if not result: return None
i: sizet = 0
while i < a.size:
for i in range(a.size):
result.data[i] = math.ceil(a.data[i])
i += 1
return result
def np_round(a: ndarray[double]*) -> ndarray[double]*:
result: ndarray[double]* = _empty_like(a)
if not result: return None
i: sizet = 0
while i < a.size:
for i in range(a.size):
result.data[i] = math.round(a.data[i])
i += 1
return result
def np_sign(a: ndarray[double]*) -> ndarray[double]*:
result: ndarray[double]* = _empty_like(a)
if not result: return None
i: sizet = 0
while i < a.size:
for i in range(a.size):
if a.data[i] > double(0.0):
result.data[i] = double(1.0)
elif a.data[i] < double(0.0):
result.data[i] = double(-1.0)
else:
result.data[i] = double(0.0)
i += 1
return result
def np_tanh(a: ndarray[double]*) -> ndarray[double]*:
result: ndarray[double]* = _empty_like(a)
if not result: return None
i: sizet = 0
while i < a.size:
for i in range(a.size):
result.data[i] = math.tanh(a.data[i])
i += 1
return result
def np_sinh(a: ndarray[double]*) -> ndarray[double]*:
result: ndarray[double]* = _empty_like(a)
if not result: return None
i: sizet = 0
while i < a.size:
for i in range(a.size):
result.data[i] = math.sinh(a.data[i])
i += 1
return result
def np_cosh(a: ndarray[double]*) -> ndarray[double]*:
result: ndarray[double]* = _empty_like(a)
if not result: return None
i: sizet = 0
while i < a.size:
for i in range(a.size):
result.data[i] = math.cosh(a.data[i])
i += 1
return result
def np_arcsin(a: ndarray[double]*) -> ndarray[double]*:
result: ndarray[double]* = _empty_like(a)
if not result: return None
i: sizet = 0
while i < a.size:
for i in range(a.size):
result.data[i] = math.asin(a.data[i])
i += 1
return result
def np_arccos(a: ndarray[double]*) -> ndarray[double]*:
result: ndarray[double]* = _empty_like(a)
if not result: return None
i: sizet = 0
while i < a.size:
for i in range(a.size):
result.data[i] = math.acos(a.data[i])
i += 1
return result
def np_arctan(a: ndarray[double]*) -> ndarray[double]*:
result: ndarray[double]* = _empty_like(a)
if not result: return None
i: sizet = 0
while i < a.size:
for i in range(a.size):
result.data[i] = math.atan(a.data[i])
i += 1
return result
def np_arctan2(y: ndarray[double]*, x: ndarray[double]*) -> ndarray[double]*:
result: ndarray[double]* = _empty_like(y)
if not result: return None
i: sizet = 0
while i < y.size:
for i in range(y.size):
result.data[i] = math.atan2(y.data[i], x.data[i])
i += 1
return result
def np_degrees(a: ndarray[double]*) -> ndarray[double]*:
result: ndarray[double]* = _empty_like(a)
if not result: return None
i: sizet = 0
while i < a.size:
for i in range(a.size):
result.data[i] = math.degrees(a.data[i])
i += 1
return result
def np_radians(a: ndarray[double]*) -> ndarray[double]*:
result: ndarray[double]* = _empty_like(a)
if not result: return None
i: sizet = 0
while i < a.size:
for i in range(a.size):
result.data[i] = math.radians(a.data[i])
i += 1
return result
def np_isnan(a: ndarray[double]*) -> ndarray[double]*:
result: ndarray[double]* = _empty_like(a)
if not result: return None
i: sizet = 0
while i < a.size:
for i in range(a.size):
result.data[i] = double(math.isnan(a.data[i]))
i += 1
return result
def np_isinf(a: ndarray[double]*) -> ndarray[double]*:
result: ndarray[double]* = _empty_like(a)
if not result: return None
i: sizet = 0
while i < a.size:
for i in range(a.size):
result.data[i] = double(math.isinf(a.data[i]))
i += 1
return result
def np_maximum(a: ndarray[double]*, b: ndarray[double]*) -> ndarray[double]*:
result: ndarray[double]* = _empty_like(a)
if not result: return None
i: sizet = 0
while i < a.size:
for i in range(a.size):
result.data[i] = a.data[i] if a.data[i] > b.data[i] else b.data[i]
i += 1
return result
def np_minimum(a: ndarray[double]*, b: ndarray[double]*) -> ndarray[double]*:
result: ndarray[double]* = _empty_like(a)
if not result: return None
i: sizet = 0
while i < a.size:
for i in range(a.size):
result.data[i] = a.data[i] if a.data[i] < b.data[i] else b.data[i]
i += 1
return result
@@ -886,21 +784,17 @@ def cumsum(a: ndarray[double]*) -> ndarray[double]*:
result: ndarray[double]* = _empty_like(a)
if not result: return None
s: double = double(0.0)
i: sizet = 0
while i < a.size:
for i in range(a.size):
s += a.data[i]
result.data[i] = s
i += 1
return result
def diff(a: ndarray[double]*) -> ndarray[double]*:
if a.size < 2: return None
result: ndarray[double]* = zeros(a.pool, a.size - 1)
if not result: return None
i: sizet = 0
while i < a.size - 1:
for i in range(a.size - 1):
result.data[i] = a.data[i + 1] - a.data[i]
i += 1
return result
def flatten(a: ndarray[double]*) -> ndarray[double]*:
@@ -916,113 +810,89 @@ def trace(a: ndarray[double]*) -> double:
if a.ndim != 2: return double(0.0)
n: sizet = a.shape[0] if a.shape[0] < a.shape[1] else a.shape[1]
s: double = double(0.0)
i: sizet = 0
while i < n:
for i in range(n):
s += a.data[i * a.shape[1] + i]
i += 1
return s
def outer(a: ndarray[double]*, b: ndarray[double]*) -> ndarray[double]*:
result: ndarray[double]* = empty2d(a.pool, a.size, b.size)
if not result: return None
i: sizet = 0
while i < a.size:
for i in range(a.size):
j: sizet = 0
while j < b.size:
result.data[i * b.size + j] = a.data[i] * b.data[j]
j += 1
i += 1
return result
def np_where(condition: ndarray[double]*, x: ndarray[double]*, y: ndarray[double]*) -> ndarray[double]*:
result: ndarray[double]* = _empty_like(x)
if not result: return None
i: sizet = 0
while i < x.size:
for i in range(x.size):
if condition.data[i] != double(0.0):
result.data[i] = x.data[i]
else:
result.data[i] = y.data[i]
i += 1
return result
def np_count_nonzero(a: ndarray[double]*) -> int:
count: int = 0
i: sizet = 0
while i < a.size:
for i in range(a.size):
if a.data[i] != double(0.0):
count += 1
i += 1
return count
def np_all(a: ndarray[double]*) -> int:
i: sizet = 0
while i < a.size:
for i in range(a.size):
if a.data[i] == double(0.0):
return 0
i += 1
return 1
def np_any(a: ndarray[double]*) -> int:
i: sizet = 0
while i < a.size:
for i in range(a.size):
if a.data[i] != double(0.0):
return 1
i += 1
return 0
def np_equal(a: ndarray[double]*, b: ndarray[double]*) -> ndarray[double]*:
result: ndarray[double]* = _empty_like(a)
if not result: return None
i: sizet = 0
while i < a.size:
for i in range(a.size):
result.data[i] = double(1.0) if a.data[i] == b.data[i] else double(0.0)
i += 1
return result
def np_not_equal(a: ndarray[double]*, b: ndarray[double]*) -> ndarray[double]*:
result: ndarray[double]* = _empty_like(a)
if not result: return None
i: sizet = 0
while i < a.size:
for i in range(a.size):
result.data[i] = double(1.0) if a.data[i] != b.data[i] else double(0.0)
i += 1
return result
def np_less(a: ndarray[double]*, b: ndarray[double]*) -> ndarray[double]*:
result: ndarray[double]* = _empty_like(a)
if not result: return None
i: sizet = 0
while i < a.size:
for i in range(a.size):
result.data[i] = double(1.0) if a.data[i] < b.data[i] else double(0.0)
i += 1
return result
def np_greater(a: ndarray[double]*, b: ndarray[double]*) -> ndarray[double]*:
result: ndarray[double]* = _empty_like(a)
if not result: return None
i: sizet = 0
while i < a.size:
for i in range(a.size):
result.data[i] = double(1.0) if a.data[i] > b.data[i] else double(0.0)
i += 1
return result
def np_less_equal(a: ndarray[double]*, b: ndarray[double]*) -> ndarray[double]*:
result: ndarray[double]* = _empty_like(a)
if not result: return None
i: sizet = 0
while i < a.size:
for i in range(a.size):
result.data[i] = double(1.0) if a.data[i] <= b.data[i] else double(0.0)
i += 1
return result
def np_greater_equal(a: ndarray[double]*, b: ndarray[double]*) -> ndarray[double]*:
result: ndarray[double]* = _empty_like(a)
if not result: return None
i: sizet = 0
while i < a.size:
for i in range(a.size):
result.data[i] = double(1.0) if a.data[i] >= b.data[i] else double(0.0)
i += 1
return result
@@ -1073,13 +943,11 @@ def meshgrid(x: ndarray[double]*, y: ndarray[double]*) -> ndarray[double]*:
# Returns X grid as 2D array (each row is x)
result: ndarray[double]* = empty2d(x.pool, y.size, x.size)
if not result: return None
i: sizet = 0
while i < y.size:
for i in range(y.size):
j: sizet = 0
while j < x.size:
result.data[i * x.size + j] = x.data[j]
j += 1
i += 1
return result
@@ -1118,20 +986,16 @@ def np_interp(x: double, xp: ndarray[double]*, fp: ndarray[double]*) -> double:
if xp.size == 0: return double(0.0)
if x <= xp.data[0]: return fp.data[0]
if x >= xp.data[xp.size - 1]: return fp.data[xp.size - 1]
i: sizet = 0
while i < xp.size - 1:
for i in range(xp.size - 1):
if x >= xp.data[i] and x <= xp.data[i + 1]:
t_val: double = (x - xp.data[i]) / (xp.data[i + 1] - xp.data[i])
return fp.data[i] + t_val * (fp.data[i + 1] - fp.data[i])
i += 1
return fp.data[xp.size - 1]
def prod(a: ndarray[double]*) -> double:
p: double = double(1.0)
i: sizet = 0
while i < a.size:
for i in range(a.size):
p *= a.data[i]
i += 1
return p
def median(a: ndarray[double]*) -> double: