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]).
-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 - Core mathematical functions for VIVA.\n"
"\n"
" A specialized math library for sentient digital life,\n"
" built on top of gleam_community_maths.\n"
"\n"
" ## Modules\n"
"\n"
" - `viva_math/common` - Utilities: clamp, sigmoid, softmax, lerp\n"
" - `viva_math/vector` - Vec3 type for PAD emotional space\n"
" - `viva_math/cusp` - Cusp catastrophe theory\n"
" - `viva_math/free_energy` - Free Energy Principle\n"
" - `viva_math/attractor` - Emotional attractor dynamics\n"
" - `viva_math/entropy` - Information theory\n"
"\n"
" ## Dependencies\n"
"\n"
" Re-exports gleam_community_maths for convenience.\n"
" Use `import gleam_community/maths` for:\n"
" - Trigonometry (sin, cos, tan, etc.)\n"
" - Statistics (mean, variance, etc.)\n"
" - Distances (euclidean, manhattan, etc.)\n"
" - Constants (pi, e, tau)\n"
"\n"
" ## Example\n"
"\n"
" ```gleam\n"
" import viva_math/vector\n"
" import viva_math/attractor\n"
" import viva_math/cusp\n"
"\n"
" // Create PAD state\n"
" let state = vector.pad(-0.3, 0.7, -0.2)\n"
"\n"
" // Classify emotion\n"
" let emotion = attractor.classify_emotion(state)\n"
" // -> \"fear\"\n"
"\n"
" // Check for cusp bistability\n"
" let params = cusp.from_arousal_dominance(0.7, -0.2)\n"
" let volatile = cusp.is_bistable(params)\n"
" // -> True (high arousal creates bistability)\n"
" ```\n"
).
-file("src/viva_math.gleam", 57).
?DOC(
" Create a PAD vector with clamping.\n"
" 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", 63).
?DOC(
" Classify emotional state to nearest attractor name.\n"
" Shorthand for attractor.classify_emotion/1.\n"
).
-spec classify(viva_math@vector:vec3()) -> binary().
classify(State) ->
viva_math@attractor:classify_emotion(State).
-file("src/viva_math.gleam", 68).
?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", 74).
?DOC(" Compute free energy from expected and actual states.\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(
Expected,
Actual,
Baseline,
Complexity_weight
).
-file("src/viva_math.gleam", 85).
?DOC(" Compute Shannon entropy of a probability distribution.\n").
-spec entropy(list(float())) -> float().
entropy(Probabilities) ->
viva_math@entropy:shannon(Probabilities).
-file("src/viva_math.gleam", 90).
?DOC(" Standard sigmoid function.\n").
-spec sigmoid(float()) -> float().
sigmoid(X) ->
viva_math@common:sigmoid_standard(X).
-file("src/viva_math.gleam", 95).
?DOC(" Clamp value to [-1, 1] range.\n").
-spec clamp_bipolar(float()) -> float().
clamp_bipolar(X) ->
viva_math@common:clamp_bipolar(X).