summaryrefslogtreecommitdiff
path: root/lua_benchmark/tests/Lua-Benchmarks/fasta.lua
diff options
context:
space:
mode:
authorMatthew Sotoudeh <matthew@masot.net>2024-05-17 15:57:30 -0700
committerMatthew Sotoudeh <matthew@masot.net>2024-05-17 15:57:30 -0700
commitd068f0b3c11348a50c18af1ee3b0d2e5f38c4faf (patch)
treedb777acca2336f8c279e9f09346f02de7ddaa0e9 /lua_benchmark/tests/Lua-Benchmarks/fasta.lua
parent221b05e7a86faa38036429d5fbfc8b0779eb5382 (diff)
lua benchmarks
Diffstat (limited to 'lua_benchmark/tests/Lua-Benchmarks/fasta.lua')
-rw-r--r--lua_benchmark/tests/Lua-Benchmarks/fasta.lua106
1 files changed, 106 insertions, 0 deletions
diff --git a/lua_benchmark/tests/Lua-Benchmarks/fasta.lua b/lua_benchmark/tests/Lua-Benchmarks/fasta.lua
new file mode 100644
index 0000000..3c3fe63
--- /dev/null
+++ b/lua_benchmark/tests/Lua-Benchmarks/fasta.lua
@@ -0,0 +1,106 @@
+-- The Computer Language Benchmarks Game
+-- http://benchmarksgame.alioth.debian.org/
+-- contributed by Mike Pall
+
+-- Compability with Lua 5.3
+if not loadstring then
+ loadstring = load
+end
+if not unpack then
+ unpack = table.unpack
+end
+
+local Last = 42
+local function random(max)
+ local y = (Last * 3877 + 29573) % 139968
+ Last = y
+ return (max * y) / 139968
+end
+
+local function make_repeat_fasta(id, desc, s, n)
+ local write, sub = io.write, string.sub
+ write(">", id, " ", desc, "\n")
+ local p, sn, s2 = 1, #s, s..s
+ for i=60,n,60 do
+ write(sub(s2, p, p + 59), "\n")
+ p = p + 60; if p > sn then p = p - sn end
+ end
+ local tail = n % 60
+ if tail > 0 then write(sub(s2, p, p + tail-1), "\n") end
+end
+
+local function make_random_fasta(id, desc, bs, n)
+ io.write(">", id, " ", desc, "\n")
+ loadstring([=[
+ local write, char, unpack, n, random = io.write, string.char, unpack, ...
+ local buf, p = {}, 1
+ for i=60,n,60 do
+ for j=p,p+59 do ]=]..bs..[=[ end
+ buf[p+60] = 10; p = p + 61
+ if p >= 2048 then write(char(unpack(buf, 1, p-1))); p = 1 end
+ end
+ local tail = n % 60
+ if tail > 0 then
+ for j=p,p+tail-1 do ]=]..bs..[=[ end
+ p = p + tail; buf[p] = 10; p = p + 1
+ end
+ write(char(unpack(buf, 1, p-1)))
+ ]=], desc)(n, random)
+end
+
+local function bisect(c, p, lo, hi)
+ local n = hi - lo
+ if n == 0 then return "buf[j] = "..c[hi].."\n" end
+ local mid = math.floor(n / 2)
+ return "if r < "..p[lo+mid].." then\n"..bisect(c, p, lo, lo+mid)..
+ "else\n"..bisect(c, p, lo+mid+1, hi).."end\n"
+end
+
+local function make_bisect(tab)
+ local c, p, sum = {}, {}, 0
+ for i,row in ipairs(tab) do
+ c[i] = string.byte(row[1])
+ sum = sum + row[2]
+ p[i] = sum
+ end
+ return "local r = random(1)\n"..bisect(c, p, 1, #tab)
+end
+
+local alu =
+ "GGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGG"..
+ "GAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGA"..
+ "CCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAAT"..
+ "ACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCA"..
+ "GCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGG"..
+ "AGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCC"..
+ "AGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAA"
+
+local iub = make_bisect{
+ { "a", 0.27 },
+ { "c", 0.12 },
+ { "g", 0.12 },
+ { "t", 0.27 },
+ { "B", 0.02 },
+ { "D", 0.02 },
+ { "H", 0.02 },
+ { "K", 0.02 },
+ { "M", 0.02 },
+ { "N", 0.02 },
+ { "R", 0.02 },
+ { "S", 0.02 },
+ { "V", 0.02 },
+ { "W", 0.02 },
+ { "Y", 0.02 },
+}
+
+local homosapiens = make_bisect{
+ { "a", 0.3029549426680 },
+ { "c", 0.1979883004921 },
+ { "g", 0.1975473066391 },
+ { "t", 0.3015094502008 },
+}
+
+local N = tonumber(arg and arg[1]) or 1000
+make_repeat_fasta('ONE', 'Homo sapiens alu', alu, N*2)
+make_random_fasta('TWO', 'IUB ambiguity codes', iub, N*3)
+make_random_fasta('THREE', 'Homo sapiens frequency', homosapiens, N*5)
generated by cgit on debian on lair
contact matthew@masot.net with questions or feedback