Packages
Tensor library for Gleam/BEAM with a pure Gleam API, zero-copy views, and optional native acceleration
Retired package: Release invalid
Current section
Files
Jump to
Current section
Files
src/viva_tensor@horde.erl
-module(viva_tensor@horde).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]).
-define(FILEPATH, "src/viva_tensor/horde.gleam").
-export([new/2, set_positions/2, set_velocities/2, integrate/2, dampen/2, wrap/2, positions/1, velocities/1, kinetic_energy/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(
" Horde - Massively Parallel Entity Physics\n"
"\n"
" A Structure-of-Arrays (SoA) physics engine optimized for 10,000+ entities.\n"
" Data is stored in contiguous buffers (Positions, Velocities) for SIMD acceleration.\n"
"\n"
" Ideal for: particle systems, boids, swarms, and massive game entities.\n"
).
-file("src/viva_tensor/horde.gleam", 18).
?DOC(
" Create a new Horde\n"
"\n"
" - count: Number of entities\n"
" - dims: Dimensions per entity (1, 2, or 3)\n"
).
-spec new(integer(), integer()) -> viva_tensor@core@ffi:horde_ref().
new(Count, Dims) ->
H@1 = case viva_tensor@core@ffi:horde_create(Count, Dims) of
{ok, H} -> H;
_assert_fail ->
erlang:error(#{gleam_error => let_assert,
message => <<"Pattern match failed, no pattern matched the value."/utf8>>,
file => <<?FILEPATH/utf8>>,
module => <<"viva_tensor/horde"/utf8>>,
function => <<"new"/utf8>>,
line => 19,
value => _assert_fail,
start => 561,
'end' => 609,
pattern_start => 572,
pattern_end => 577})
end,
H@1.
-file("src/viva_tensor/horde.gleam", 26).
?DOC(
" Set positions for all entities\n"
"\n"
" Data must be a flat list: [x0, y0, x1, y1, ...]\n"
).
-spec set_positions(viva_tensor@core@ffi:horde_ref(), list(float())) -> viva_tensor@core@ffi:horde_ref().
set_positions(Horde, Data) ->
case viva_tensor@core@ffi:horde_set_positions(Horde, Data) of
{ok, nil} -> nil;
_assert_fail ->
erlang:error(#{gleam_error => let_assert,
message => <<"Pattern match failed, no pattern matched the value."/utf8>>,
file => <<?FILEPATH/utf8>>,
module => <<"viva_tensor/horde"/utf8>>,
function => <<"set_positions"/utf8>>,
line => 27,
value => _assert_fail,
start => 775,
'end' => 832,
pattern_start => 786,
pattern_end => 793})
end,
Horde.
-file("src/viva_tensor/horde.gleam", 32).
?DOC(" Set velocities for all entities\n").
-spec set_velocities(viva_tensor@core@ffi:horde_ref(), list(float())) -> viva_tensor@core@ffi:horde_ref().
set_velocities(Horde, Data) ->
case viva_tensor@core@ffi:horde_set_velocities(Horde, Data) of
{ok, nil} -> nil;
_assert_fail ->
erlang:error(#{gleam_error => let_assert,
message => <<"Pattern match failed, no pattern matched the value."/utf8>>,
file => <<?FILEPATH/utf8>>,
module => <<"viva_tensor/horde"/utf8>>,
function => <<"set_velocities"/utf8>>,
line => 33,
value => _assert_fail,
start => 948,
'end' => 1006,
pattern_start => 959,
pattern_end => 966})
end,
Horde.
-file("src/viva_tensor/horde.gleam", 40).
?DOC(
" Advance simulation by dt (seconds)\n"
"\n"
" Positions += Velocities * dt\n"
).
-spec integrate(viva_tensor@core@ffi:horde_ref(), float()) -> viva_tensor@core@ffi:horde_ref().
integrate(Horde, Dt) ->
case viva_tensor@core@ffi:horde_integrate(Horde, Dt) of
{ok, nil} -> nil;
_assert_fail ->
erlang:error(#{gleam_error => let_assert,
message => <<"Pattern match failed, no pattern matched the value."/utf8>>,
file => <<?FILEPATH/utf8>>,
module => <<"viva_tensor/horde"/utf8>>,
function => <<"integrate"/utf8>>,
line => 41,
value => _assert_fail,
start => 1149,
'end' => 1200,
pattern_start => 1160,
pattern_end => 1167})
end,
Horde.
-file("src/viva_tensor/horde.gleam", 48).
?DOC(
" Apply damping (friction)\n"
"\n"
" Velocities *= friction (0.0 to 1.0)\n"
).
-spec dampen(viva_tensor@core@ffi:horde_ref(), float()) -> viva_tensor@core@ffi:horde_ref().
dampen(Horde, Friction) ->
case viva_tensor@core@ffi:horde_dampen(Horde, Friction) of
{ok, nil} -> nil;
_assert_fail ->
erlang:error(#{gleam_error => let_assert,
message => <<"Pattern match failed, no pattern matched the value."/utf8>>,
file => <<?FILEPATH/utf8>>,
module => <<"viva_tensor/horde"/utf8>>,
function => <<"dampen"/utf8>>,
line => 49,
value => _assert_fail,
start => 1343,
'end' => 1397,
pattern_start => 1354,
pattern_end => 1361})
end,
Horde.
-file("src/viva_tensor/horde.gleam", 56).
?DOC(
" Wrap positions torus-style\n"
"\n"
" If pos > max, pos -= max\n"
).
-spec wrap(viva_tensor@core@ffi:horde_ref(), float()) -> viva_tensor@core@ffi:horde_ref().
wrap(Horde, Max_bound) ->
case viva_tensor@core@ffi:horde_wrap(Horde, Max_bound) of
{ok, nil} -> nil;
_assert_fail ->
erlang:error(#{gleam_error => let_assert,
message => <<"Pattern match failed, no pattern matched the value."/utf8>>,
file => <<?FILEPATH/utf8>>,
module => <<"viva_tensor/horde"/utf8>>,
function => <<"wrap"/utf8>>,
line => 57,
value => _assert_fail,
start => 1530,
'end' => 1583,
pattern_start => 1541,
pattern_end => 1548})
end,
Horde.
-file("src/viva_tensor/horde.gleam", 62).
?DOC(" Get current positions\n").
-spec positions(viva_tensor@core@ffi:horde_ref()) -> list(float()).
positions(Horde) ->
Data@1 = case viva_tensor@core@ffi:horde_get_positions(Horde) of
{ok, Data} -> Data;
_assert_fail ->
erlang:error(#{gleam_error => let_assert,
message => <<"Pattern match failed, no pattern matched the value."/utf8>>,
file => <<?FILEPATH/utf8>>,
module => <<"viva_tensor/horde"/utf8>>,
function => <<"positions"/utf8>>,
line => 63,
value => _assert_fail,
start => 1671,
'end' => 1723,
pattern_start => 1682,
pattern_end => 1690})
end,
Data@1.
-file("src/viva_tensor/horde.gleam", 68).
?DOC(" Get current velocities\n").
-spec velocities(viva_tensor@core@ffi:horde_ref()) -> list(float()).
velocities(Horde) ->
Data@1 = case viva_tensor@core@ffi:horde_get_velocities(Horde) of
{ok, Data} -> Data;
_assert_fail ->
erlang:error(#{gleam_error => let_assert,
message => <<"Pattern match failed, no pattern matched the value."/utf8>>,
file => <<?FILEPATH/utf8>>,
module => <<"viva_tensor/horde"/utf8>>,
function => <<"velocities"/utf8>>,
line => 69,
value => _assert_fail,
start => 1812,
'end' => 1865,
pattern_start => 1823,
pattern_end => 1831})
end,
Data@1.
-file("src/viva_tensor/horde.gleam", 74).
?DOC(" Get total kinetic energy of the system\n").
-spec kinetic_energy(viva_tensor@core@ffi:horde_ref()) -> float().
kinetic_energy(Horde) ->
Ke@1 = case viva_tensor@core@ffi:horde_kinetic_energy(Horde) of
{ok, Ke} -> Ke;
_assert_fail ->
erlang:error(#{gleam_error => let_assert,
message => <<"Pattern match failed, no pattern matched the value."/utf8>>,
file => <<?FILEPATH/utf8>>,
module => <<"viva_tensor/horde"/utf8>>,
function => <<"kinetic_energy"/utf8>>,
line => 75,
value => _assert_fail,
start => 1968,
'end' => 2019,
pattern_start => 1979,
pattern_end => 1985})
end,
Ke@1.