viva_math

Package Version Hex Docs

Core mathematical functions for VIVA - a sentient digital life research project.

Built on top of gleam_community_maths with specialized functions for emotional dynamics, consciousness modeling, and information theory.

Installation

gleam add viva_math

Modules

ModulePurpose
viva_math/commonUtilities: clamp, sigmoid, softmax, lerp, smoothstep
viva_math/vectorVec3 type for PAD emotional space (Pleasure-Arousal-Dominance)
viva_math/cuspCusp catastrophe theory (Thom, 1972) for emotional phase transitions
viva_math/free_energyFree Energy Principle (Friston, 2010) for interoception
viva_math/attractorEmotional attractor dynamics (Mehrabian, 1996)
viva_math/entropyShannon entropy, KL divergence, Jensen-Shannon divergence

Quick Start

import viva_math/vector
import viva_math/attractor
import viva_math/cusp
import viva_math/free_energy

pub fn main() {
  // Create PAD emotional state
  let state = vector.pad(-0.3, 0.7, -0.2)
  // Pleasure: -0.3 (slightly negative)
  // Arousal: 0.7 (high)
  // Dominance: -0.2 (slightly submissive)

  // Classify emotion by nearest attractor
  let emotion = attractor.classify_emotion(state)
  // -> "fear"

  // Check for emotional volatility (cusp bistability)
  let params = cusp.from_arousal_dominance(0.7, -0.2)
  let volatile = cusp.is_bistable(params)
  // -> True (high arousal creates bistability)

  // Compute free energy (prediction error)
  let expected = vector.pad(0.0, 0.0, 0.0)
  let fe_state = free_energy.compute_state(expected, state, expected, 0.1)
  // fe_state.feeling -> Surprised or Alarmed
}

Theoretical Background

PAD Model (Mehrabian, 1996)

Emotions are represented as points in 3D space:

Cusp Catastrophe (Thom, 1972)

Models sudden emotional transitions using the potential function:

V(x) = x⁴/4 + αx²/2 + βx

When arousal is high (α < 0) and discriminant Δ > 0, the system becomes bistable - small perturbations can cause sudden mood shifts.

Free Energy Principle (Friston, 2010)

Organisms minimize “surprise” through prediction:

F ≈ Prediction_Error² + Complexity

Low free energy = predictions match reality (homeostasis). High free energy = significant mismatch (alarm).

Attractor Dynamics

Eight basic emotions form attractors in PAD space:

EmotionPAD
Joy+0.76+0.48+0.35
Sadness-0.63-0.27-0.33
Fear-0.64+0.60-0.43
Anger-0.51+0.59+0.25
Trust+0.58-0.23+0.42
Disgust-0.60+0.35+0.11
Serenity+0.45-0.42+0.21
Excitement+0.62+0.75+0.38

Dependencies

This library builds on:

For functions not in viva_math (like sin, cos, mean, euclidean_distance), import directly:

import gleam_community/maths

let angle = maths.pi() /. 4.0
let sin_val = maths.sin(angle)

References

License

MIT

Search Document