math
Scalars, array math, matrices, activations, and neural-network helpers.
benutzen "math" at the top of your file.
Matrices are first-class values for linear algebra and feedforward networks. Create them with zeros, ones, fromArray, or loadMatrix. Use matmul, madd, activations, and derivatives to build training loops in plain Rain.
Matrix multiply uses Apple Accelerate (BLAS) on macOS for speed.
Two-layer forward pass
End-to-end example using matrices and activations.
benutzen "csv";
benutzen "math";
var W1 = math::loadMatrix("weights/w1.bin");
var b1 = math::loadMatrix("weights/b1.bin");
var W2 = math::loadMatrix("weights/w2.bin");
var b2 = math::loadMatrix("weights/b2.bin");
var X = csv::readToMatrixT("mnist_test.csv", 1, 1, 785, 1.0 / 255.0);
var labels = csv::readLabels("mnist_test.csv", 1, 0);
var Z1 = math::madd(math::matmul(W1, X), b1);
var A1 = math::relu(Z1);
var Z2 = math::madd(math::matmul(W2, A1), b2);
var A2 = math::msoftmax(Z2);
var pred = math::argmax(A2);Scalars
Math on single numbers: trig, logs, rounding, random.
| Symbol | Description | Example |
|---|---|---|
sqrt(x) | Square root | benutzen "math";
print math::sqrt(16); |
pow(base, exp) | Power | benutzen "math";
print math::pow(2, 8); |
abs(x) | Absolute value | benutzen "math";
print math::abs(-7); |
sign(x) | Sign (-1, 0, 1) | benutzen "math";
print math::sign(-3); |
sin(x) | Sine (radians) | benutzen "math";
print math::sin(math::pi / 2); |
cos(x) | Cosine | benutzen "math";
print math::cos(0); |
tan(x) | Tangent | benutzen "math";
print math::tan(0); |
asin(x) | Arc sine | benutzen "math";
print math::asin(1); |
acos(x) | Arc cosine | benutzen "math";
print math::acos(1); |
atan(x) | Arc tangent | benutzen "math";
print math::atan(1); |
atan2(y, x) | Arc tangent of y/x | benutzen "math";
print math::atan2(1, 1); |
sinh(x) | Hyperbolic sine | benutzen "math";
print math::sinh(0); |
cosh(x) | Hyperbolic cosine | benutzen "math";
print math::cosh(0); |
tanh(x) | Hyperbolic tangent | benutzen "math";
print math::tanh(0); |
floor(x) | Round down | benutzen "math";
print math::floor(3.9); |
ceil(x) | Round up | benutzen "math";
print math::ceil(3.1); |
round(x) | Round to nearest | benutzen "math";
print math::round(3.5); |
trunc(x) | Truncate toward zero | benutzen "math";
print math::trunc(3.9); |
min(a, b) | Smaller of two numbers | benutzen "math";
print math::min(3, 9); |
max(a, b) | Larger of two numbers | benutzen "math";
print math::max(3, 9); |
clamp(x, lo, hi) | Clamp x into [lo, hi] | benutzen "math";
print math::clamp(15, 0, 10); |
log(x) | Natural log | benutzen "math";
print math::log(math::e); |
log2(x) | Base-2 log | benutzen "math";
print math::log2(8); |
log10(x) | Base-10 log | benutzen "math";
print math::log10(100); |
exp(x) | e^x | benutzen "math";
print math::exp(1); |
exp2(x) | 2^x | benutzen "math";
print math::exp2(3); |
cbrt(x) | Cube root | benutzen "math";
print math::cbrt(27); |
fmod(x, y) | Floating-point remainder | benutzen "math";
print math::fmod(10, 3); |
hypot(x, y) | Hypotenuse | benutzen "math";
print math::hypot(3, 4); |
random() | Random float in [0, 1) | benutzen "math";
print math::random(); |
randomInt(n) | Random int in [0, n) | benutzen "math";
print math::randomInt(10); |
Arrays
Vector operations: dot, sum, softmax, element-wise math.
| Symbol | Description | Example |
|---|---|---|
dot(a, b) | Dot product of number arrays | benutzen "math";
var a = #[1, 2, 3, 4];
var b = #[2, 2, 2, 2];
print math::dot(a, b); |
sum(arr) | Sum of array | benutzen "math";
print math::sum(#[1, 2, 3, 4]); |
mean(arr) | Average of array | benutzen "math";
print math::mean(#[1, 2, 3, 4]); |
norm(arr) | Euclidean norm | benutzen "math";
print math::norm(#[1, 2, 3, 4]); |
scale(arr, n) | Multiply each element by n | benutzen "math";
print math::scale(#[1, 2, 3, 4], 2); |
emul(a, b) | Element-wise multiply | benutzen "math";
print math::emul(#[1, 2, 3, 4], #[2, 2, 2, 2]); |
ediv(a, b) | Element-wise divide | benutzen "math";
print math::ediv(#[1, 2, 3, 4], #[2, 2, 2, 2]); |
eadd(a, b) | Element-wise add | benutzen "math";
print math::eadd(#[1, 2, 3, 4], #[2, 2, 2, 2]); |
esub(a, b) | Element-wise subtract | benutzen "math";
print math::esub(#[1, 2, 3, 4], #[2, 2, 2, 2]); |
std(arr) | Standard deviation | benutzen "math";
print math::std(#[1, 2, 3, 4]); |
variance(arr) | Variance | benutzen "math";
print math::variance(#[1, 2, 3, 4]); |
median(arr) | Median | benutzen "math";
print math::median(#[1, 2, 3, 4]); |
softmax(arr) | Softmax over a 1D array | benutzen "math";
print math::softmax(#[1, 2, 3]); |
Matrices: create & I/O
Allocate, fill, and save/load matrix files.
| Symbol | Description | Example |
|---|---|---|
zeros(rows, cols) | Matrix filled with 0 | benutzen "math";
print math::shape(math::zeros(2, 3)); |
ones(rows, cols) | Matrix filled with 1 | benutzen "math";
print math::shape(math::ones(2, 3)); |
randomMatrix(rows, cols) | Xavier-style random init | benutzen "math";
var W = math::randomMatrix(128, 784); |
fromArray(arr) | 2D array → matrix; 1D → column vector (n, 1) | benutzen "math";
var m = math::fromArray(#[#[1, 2], #[3, 4]]); |
shape(m) | Returns `#[rows, cols]` | benutzen "math";
print math::shape(math::zeros(3, 4)); |
saveMatrix(m, path) | Write binary matrix file | benutzen "math";
math::saveMatrix(W, "weights/w1.bin"); |
loadMatrix(path) | Read binary matrix file | benutzen "math";
var W = math::loadMatrix("weights/w1.bin"); |
Matrices: linear algebra
matmul, transpose, element-wise matrix ops.
| Symbol | Description | Example |
|---|---|---|
matmul(A, B) | Matrix multiply (A.cols must equal B.rows) | benutzen "math";
var C = math::matmul(A, B); |
transpose(m) | Swap rows and columns | benutzen "math";
var Xt = math::transpose(X); |
madd(A, B) | Element-wise add; B broadcasts if a dimension is 1 | benutzen "math";
var Z = math::madd(math::matmul(W, X), b); |
msub(A, B) | Element-wise subtract; B broadcasts | benutzen "math";
W = math::msub(W, math::mscale(dW, lr)); |
mscale(m, n) | Multiply every element by scalar | benutzen "math";
var X = math::mscale(X, 1.0 / 255.0); |
mmul(A, B) | Element-wise multiply (same shape) | benutzen "math";
var dZ1 = math::mmul(dA1, math::mreluDeriv(Z1)); |
mlog(m) | Element-wise log(x + 1e-8) | benutzen "math";
print math::mlog(A); |
msum(m, axis) | Sum along axis: 1 → column vector per row, else per column | benutzen "math";
var db = math::mscale(math::msum(dZ, 1), 1.0 / m); |
msqrt(m) | Element-wise square root | benutzen "math";
var root = math::msqrt(A); |
mdiv(A, B) | Element-wise divide; B broadcasts like madd | benutzen "math";
var Q = math::mdiv(A, B); |
mgetCols(m, start, end) | Extract column range `[start, end)` as a new matrix | benutzen "math";
var batch = math::mgetCols(X, 0, 128); |
mgetColsByIndex(m, indices) | Gather columns by index array (shuffled mini-batches) | benutzen "math";
var batch = math::mgetColsByIndex(X, idx); |
Training helpers
Adam step, dropout, and column shifts for ML loops.
| Symbol | Description | Example |
|---|---|---|
adamStep(param, grad, m, v, t, lr, beta1, beta2, eps) | One Adam step; updates m/v in place, returns new param matrix | benutzen "math";
W1 = math::adamStep(W1, dW1, mW1, vW1, t, lr, 0.9, 0.999, 1e-8); |
dropoutMask(rows, cols, p) | Binary mask: 1 with prob `(1-p)`, else 0 (inverted dropout) | benutzen "math";
var mask = math::dropoutMask(HIDDEN, batch, 0.25); |
randomShiftCols(X, max_shift) | Random ±pixel shift per column (28×28 MNIST layout, row-major) | benutzen "math";
var X_aug = math::randomShiftCols(X, 2); |
Activations
sigmoid, relu, softmax and their derivatives.
| Symbol | Description | Example |
|---|---|---|
sigmoid(x) | σ(x) on a number or matrix | benutzen "math";
print math::sigmoid(0); |
relu(x) | max(0, x) on a number or matrix | benutzen "math";
var A1 = math::relu(Z1); |
softmax(arr) | Softmax over a 1D array | benutzen "math";
print math::softmax(#[1, 2, 3]); |
msoftmax(m) | Softmax down each column | benutzen "math";
var A2 = math::msoftmax(Z2); |
msigmoidDeriv(m) | Derivative given sigmoid output: s * (1 - s) | benutzen "math";
var dA = math::msigmoidDeriv(A); |
mreluDeriv(m) | ReLU derivative: 1 where input > 0, else 0 | benutzen "math";
var dZ = math::mmul(dA, math::mreluDeriv(Z)); |
ML helpers
oneHot encoding and argmax for classification.
| Symbol | Description | Example |
|---|---|---|
oneHot(labels, numClasses) | One-hot encode labels → (m, numClasses) | benutzen "math";
var Y = math::transpose(math::oneHot(labels, 10)); |
argmax(m) | Index of max value in each column | benutzen "math";
var pred = math::argmax(A2); |
Constants
pi, e, inf, and nan on the math module.
| Symbol | Description | Example |
|---|---|---|
math.pi | π | benutzen "math";
print math::pi; |
math.e | Euler's number | benutzen "math";
print math::e; |
math.inf | Infinity | benutzen "math";
print math::inf; |
math.nan | Not a number | benutzen "math";
print math::nan; |