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:
1 parent
3e1ed0992b
commit
27121f56a7
27 files changed
+208
-534
No files matched your search
+68
-204
@@ -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:
|
||||
|
||||
Reference in new issue
Block a user