tritium demo conv2d
transcript ·
python ·
c ·
rust
/* TRITIUM-PROVENANCE sha256=fa150e08b678777a032d553feb0ff5a804a6e70b0b4702daf495d667b6bba189 lang=c */
/* TRITIUM-HEIGHT high=0.00 mid=0.36 low=0.64 fns=5 */
#include <stdint.h>
#include <math.h>
// TRITIUM-PSEUDO fn=im2col_f
//| fn im2col_f(x, h, w, kh, kw, out):
//| return p
// TRITIUM-HEIGHT fn=im2col_f high=0.00 mid=0.39 low=0.61
int64_t im2col_f(double* x, int64_t h, int64_t w, int64_t kh, int64_t kw, double* out) {
int64_t p;
int64_t i;
int64_t j;
int64_t u;
int64_t v;
p = 0L;
i = 0L;
while (i < ((h - kh) + 1L)) {
j = 0L;
while (j < ((w - kw) + 1L)) {
u = 0L;
while (u < kh) {
v = 0L;
while (v < kw) {
out[p] = x[(((i + u) * w) + (j + v))];
p = (p + 1L);
v = (v + 1L);
}
u = (u + 1L);
}
j = (j + 1L);
}
i = (i + 1L);
}
return p;
}
// TRITIUM-PSEUDO fn=conv2d_f
//| fn conv2d_f(x, h, w, k, kh, kw, out):
//| return sum_2 * sum
// TRITIUM-HEIGHT fn=conv2d_f high=0.00 mid=0.46 low=0.54
int64_t conv2d_f(double* x, int64_t h, int64_t w, double* k, int64_t kh, int64_t kw, double* out) {
int64_t i;
int64_t sum_2;
int64_t sum;
int64_t j;
int64_t u;
int64_t v;
double x_2;
sum_2 = (h - kh) + 1L;
sum = (w - kw) + 1L;
i = 0L;
while (i < sum_2) {
j = 0L;
while (j < sum) {
x_2 = 0.0;
u = 0L;
while (u < kh) {
v = 0L;
while (v < kw) {
x_2 = x_2 + (x[(((i + u) * w) + (j + v))] * k[((u * kw) + v)]);
v = (v + 1L);
}
u = (u + 1L);
}
out[((i * sum) + j)] = x_2;
j = (j + 1L);
}
i = (i + 1L);
}
return sum_2 * sum;
}
// TRITIUM-PSEUDO fn=list_get
//| fn list_get(vals, i):
//| return vals[i]
// TRITIUM-HEIGHT fn=list_get high=0.00 mid=0.00 low=1.00 role=leaf_charset
int64_t list_get(int64_t* vals, int64_t i) {
return vals[i];
}
// TRITIUM-PSEUDO fn=list_set
//| fn list_set(vals, i, v):
//| vals[i] = v
//| return v
// TRITIUM-HEIGHT fn=list_set high=0.00 mid=0.33 low=0.67 role=leaf_charset
int64_t list_set(int64_t* vals, int64_t i, int64_t v) {
vals[i] = v;
return v;
}
// TRITIUM-PSEUDO fn=relu
//| fn relu(vals, n):
//| return n
// TRITIUM-HEIGHT fn=relu high=0.00 mid=0.61 low=0.39
int64_t relu(int64_t* vals, int64_t n) {
int64_t i;
i = 0L;
while (i < n) {
if (list_get(vals, i) < 0L) {
list_set(vals, i, 0L);
}
i = (i + 1L);
}
return n;
}