Current section
Files
Jump to
Current section
Files
src/viva_math.erl
-module(viva_math).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]).
-define(FILEPATH, "src/viva_math.gleam").
-export([pad/3, classify/1, is_volatile/2, free_energy/2, entropy/1, sigmoid/1, clamp_bipolar/1, erf/1, gelu/1]).
-if(?OTP_RELEASE >= 27).
-define(MODULEDOC(Str), -moduledoc(Str)).
-define(DOC(Str), -doc(Str)).
-else.
-define(MODULEDOC(Str), -compile([])).
-define(DOC(Str), -compile([])).
-endif.
?MODULEDOC(
" viva_math - Mathematical foundations for VIVA's sentient digital life.\n"
"\n"
" A specialized math library for the BEAM, designed to sit between\n"
" `gleam_community_maths` (primitives) and `viva_tensor` (tensors + NIF).\n"
"\n"
" ## Modules\n"
"\n"
" ### Foundations\n"
" - `viva_math/scalar` - Scalar math: erf, gelu, silu, mish, logsumexp...\n"
" - `viva_math/constants` - High-precision constants (pi, e, sqrt_2pi...)\n"
" - `viva_math/common` - Generic helpers: clamp, lerp, sigmoid, softmax\n"
"\n"
" ### Geometry & linear algebra\n"
" - `viva_math/vector` - Vec3 (PAD emotional space) + ops\n"
" - `viva_math/vec2` - 2-D vectors (polar, planar)\n"
" - `viva_math/vec4` - 4-D vectors (RGBA, homogeneous, quaternions)\n"
" - `viva_math/vecn` - N-D vectors as List(Float)\n"
" - `viva_math/matrix` - Mat2, Mat3, Mat4 and generic MatN\n"
"\n"
" ### Stochastic & inference\n"
" - `viva_math/random` - PRNG with opaque Seed (Erlang :rand backed)\n"
" - `viva_math/statistics` - mean, var, ema, percentile, correlation\n"
" - `viva_math/distributions` - gaussian/uniform/exponential/categorical\n"
" - `viva_math/entropy` - Shannon, KL, JS, Rényi, Tsallis, Fisher\n"
"\n"
" ### Dynamical systems\n"
" - `viva_math/cusp` - Catastrophe theory (Thom)\n"
" - `viva_math/free_energy` - Friston FEP + active inference\n"
" - `viva_math/attractor` - Mehrabian PAD attractors + OU dynamics\n"
" - `viva_math/ode` - Euler / RK2 / RK4 / Euler-Maruyama / Milstein\n"
" - `viva_math/calculus` - Finite differences + Simpson / Romberg\n"
" - `viva_math/scheduler` - Cosine annealing, warmup, decay schedules\n"
"\n"
" ## Quick start\n"
"\n"
" ```gleam\n"
" import viva_math/scalar\n"
" import viva_math/vector\n"
" import viva_math/attractor\n"
" import viva_math/random\n"
"\n"
" // PAD emotional state\n"
" let state = vector.pad(-0.3, 0.7, -0.2)\n"
"\n"
" // Classify nearest emotion\n"
" let emotion = attractor.classify_emotion(state)\n"
" // -> \"fear\"\n"
"\n"
" // Scalar activations for ML\n"
" let y = scalar.gelu(0.5)\n"
"\n"
" // Seedable, reproducible normal sample\n"
" let seed = random.from_int(42)\n"
" let #(x, _) = random.normal(seed, 0.0, 1.0)\n"
" ```\n"
).
-file("src/viva_math.gleam", 69).
?DOC(" Create a PAD vector with clamping. Shorthand for `vector.pad/3`.\n").
-spec pad(float(), float(), float()) -> viva_math@vector:vec3().
pad(Pleasure, Arousal, Dominance) ->
viva_math@vector:pad(Pleasure, Arousal, Dominance).
-file("src/viva_math.gleam", 74).
?DOC(" Classify emotional state to nearest attractor name.\n").
-spec classify(viva_math@vector:vec3()) -> binary().
classify(State) ->
viva_math@attractor:classify_emotion(State).
-file("src/viva_math.gleam", 79).
?DOC(" Check if emotional state is volatile (cusp bistability).\n").
-spec is_volatile(float(), float()) -> boolean().
is_volatile(Arousal, Dominance) ->
_pipe = viva_math@cusp:from_arousal_dominance(Arousal, Dominance),
viva_math@cusp:is_bistable(_pipe).
-file("src/viva_math.gleam", 85).
?DOC(" Compute free energy from expected and actual states with default precision.\n").
-spec free_energy(viva_math@vector:vec3(), viva_math@vector:vec3()) -> viva_math@free_energy:free_energy_state().
free_energy(Expected, Actual) ->
Baseline = viva_math@vector:zero(),
Complexity_weight = 0.1,
viva_math@free_energy:compute_state_simple(
Expected,
Actual,
Baseline,
Complexity_weight
).
-file("src/viva_math.gleam", 100).
?DOC(" Shannon entropy of a probability distribution.\n").
-spec entropy(list(float())) -> float().
entropy(Probabilities) ->
viva_math@entropy:shannon(Probabilities).
-file("src/viva_math.gleam", 105).
?DOC(" Standard sigmoid σ(x) = 1 / (1 + e^(-x)).\n").
-spec sigmoid(float()) -> float().
sigmoid(X) ->
viva_math@scalar:sigmoid(X).
-file("src/viva_math.gleam", 110).
?DOC(" Clamp value to [-1, 1] range.\n").
-spec clamp_bipolar(float()) -> float().
clamp_bipolar(X) ->
viva_math@common:clamp_bipolar(X).
-file("src/viva_math.gleam", 115).
?DOC(" Error function. Delegates to `viva_math/scalar.erf` (Erlang `:math.erf`).\n").
-spec erf(float()) -> float().
erf(X) ->
math:erf(X).
-file("src/viva_math.gleam", 120).
?DOC(" GELU activation (exact form using erf).\n").
-spec gelu(float()) -> float().
gelu(X) ->
viva_math@scalar:gelu(X).