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.

predict.rn
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.

SymbolDescriptionExample
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.

SymbolDescriptionExample
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.

SymbolDescriptionExample
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.

SymbolDescriptionExample
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.

SymbolDescriptionExample
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.

SymbolDescriptionExample
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.

SymbolDescriptionExample
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.

SymbolDescriptionExample
math.piπ
benutzen "math"; print math::pi;
math.eEuler's number
benutzen "math"; print math::e;
math.infInfinity
benutzen "math"; print math::inf;
math.nanNot a number
benutzen "math"; print math::nan;

Notes