Skip to content

Instantly share code, notes, and snippets.

@ealmansi
Created February 1, 2018 20:22
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ealmansi/2e45e7d121b01df7bb33d36e430dffe2 to your computer and use it in GitHub Desktop.
Save ealmansi/2e45e7d121b01df7bb33d36e430dffe2 to your computer and use it in GitHub Desktop.
Gaussian Elimination in Egglang
do(
define(math, import("modules/math.egg")),
define(matrix, get(math, "matrix")),
define(mset, get(math, "mset")),
define(mprint, get(math, "mprint")),
define(mreduce, get(math, "mreduce")),
# m: [
# [5, -3, 1, 14],
# [2, 3, 3, 15],
# [3, 2, -4, 3],
# ]
define(m, matrix(3, 4)),
mset(m, 0, 0, 5),
mset(m, 1, 0, 2),
mset(m, 2, 0, 3),
mset(m, 0, 1, -3),
mset(m, 1, 1, 3),
mset(m, 2, 1, 2),
mset(m, 0, 2, 1),
mset(m, 1, 2, 3),
mset(m, 2, 2, -4),
mset(m, 0, 3, 14),
mset(m, 1, 3, 15),
mset(m, 2, 3, 3),
print("Original matrix:"),
mprint(m),
print("Reduced matrix:"),
mprint(mreduce(m))
)
dict(
"min", define(min, fun(a, b, do(
if (<(a, b), a, b)
))),
"abs", define(abs, fun(a, do(
if (<(a, 0), -(0, a), a)
))),
"matrix", define(matrix, fun(n, m, do(
define(values, dict()),
define(i, 0),
while(<(i, n), do(
define(j, 0),
while(<(j, m), do(
push(values, +(i, +(",", j)), 0),
define(j, +(j, 1))
)),
define(i, +(i, 1))
)),
dict(
"n", n,
"m", m,
"_get", fun(i, j, get(values, +(i, +(",", j)))),
"_set", fun(i, j, value, push(values, +(i, +(",", j)), value)),
"_print", fun(print(values))
)
))),
"mget", define(mget, fun(mx, i, j, do(
get(mx, "_get")(i, j)
))),
"mset", define(mset, fun(mx, i, j, value, do(
get(mx, "_set")(i, j, value)
))),
"mprint", define(mprint, fun(mx, do(
get(mx, "_print")()
))),
"mreduce", define(mreduce, fun(mx, do(
define(n, get(mx, "n")),
define(m, get(mx, "m")),
define(k, 0),
while(<(k, min(n, m)), do(
define(p, _pivot(mx, k, n)),
_swap(mx, k, p),
define(i, +(k, 1)),
while(<(i, n), do(
define(f, /(mget(mx, i, k), mget(mx, k, k))),
define(j, +(k, 1)),
while(<(j, m), do(
mset(mx, i, j, -(mget(mx, i, j), *(mget(mx, k, j), f))),
define(j, +(j, 1))
)),
mset(mx, i, k, 0),
define(i, +(i, 1))
)),
define(k, +(k, 1))
)),
mx
))),
"_pivot", define(_pivot, fun(mx, k, n, do(
define(best, -1),
define(p, -1),
define(i, k),
while(<(i, n), do(
define(candidate, abs(mget(mx, i, k))),
if(<(best, candidate), do(
define(best, candidate),
define(p, i)
), do(
""
)),
define(i, +(i, 1))
)),
p
))),
"_swap", define(_swap, fun(mx, k, p, do(
define(m, get(mx, "m")),
define(j, 0),
while(<(j, m), do(
define(t, mget(mx, k, j)),
mset(mx, k, j, mget(mx, p, j)),
mset(mx, p, j, t),
define(j, +(j, 1))
))
)))
)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment