Module:Uniform map: Difference between revisions
m Trying to fix the call to map template |
ArrowHead294 (talk | contribs) mNo edit summary |
||
| (18 intermediate revisions by 3 users not shown) | |||
| Line 1: | Line 1: | ||
local p = {} | local p = {} | ||
local getArgs = require("Module:Arguments").getArgs | |||
p.lower = { | local utils = require("Module:Utils") | ||
local yesno = require("Module:Yesno") | |||
-- stylua: ignore | |||
local warts = { | |||
"a", "b", "c", "d", "e", "f", "g", "h", "i", | |||
"j", "k", "l", "m", "n", "o", "p", "q", "r", | |||
"s", "t", "u", "v", "w", "x", "y", "z" | |||
} | |||
function p.new() | |||
local m = {} | |||
m.map = {} -- The prime map | |||
m.lower = {} -- List of smallest sizes that match a map for each prime | |||
m.upper = {} -- List of largest sizes that match a map for each prime | |||
m.pbi = 0 -- Index of the prime that defines the boundary | |||
return m | |||
end | |||
-- Find the minimum size that corresponds to a given map | -- Find the minimum size that corresponds to a given map | ||
function p. | function p.lower_bound(m) | ||
local lowermax | local lowermax | ||
for i=1, #map do | for i = 1, #m.map do | ||
m.lower[i] = (m.map[i] - 0.5) / utils.log2(utils.primes[i]) | |||
lowermax = math.max(unpack( | lowermax = math.max(unpack(m.lower)) | ||
end | end | ||
return math.max(0, lowermax) | return math.max(0, lowermax) | ||
| Line 19: | Line 32: | ||
-- Find the maximum size that corresponds to a given map | -- Find the maximum size that corresponds to a given map | ||
function p. | function p.upper_bound(m) | ||
local uppermin | local uppermin | ||
for i=1, #map do | for i = 1, #m.map do | ||
m.upper[i] = (m.map[i] + 1 / 2) / utils.log2(utils.primes[i]) | |||
uppermin = math.min(unpack( | uppermin = math.min(unpack(m.upper)) | ||
pbi = | m.pbi = utils.index_of(m.upper, uppermin) | ||
end | end | ||
return math.max(0, uppermin) | return math.max(0, uppermin) | ||
end | end | ||
-- Find the p-limit just | -- Find the p-limit just tuning map corresponding to a given size | ||
function p. | function p.just_tuning_map(size, prime) | ||
local | prime = tonumber(prime) | ||
for i=1, | local p_index = utils.index_of(utils.primes, prime) | ||
assert(p_index ~= nil, "index of prime " .. prime .. " not found") | |||
local just_tuning_map = {} | |||
for i = 1, utils.index_of(utils.primes, prime) do | |||
just_tuning_map[i] = size * utils.log2(utils.primes[i]) | |||
end | end | ||
return | return just_tuning_map | ||
end | end | ||
-- Find the p-limit simple map corresponding to a given size | -- Find the p-limit simple map corresponding to a given size | ||
function p.simple_map(size, prime) | function p.simple_map(size, prime) | ||
prime = tonumber(prime) | |||
local p_index = utils.index_of(utils.primes, prime) | |||
assert(p_index ~= nil, "index of prime " .. prime .. " not found") | |||
local simple_map = {} | |||
for i = 1, p_index do | |||
simple_map[i] = math.floor(0.5 + size * utils.log2(utils.primes[i])) | |||
end | end | ||
return | return simple_map | ||
end | end | ||
| Line 50: | Line 69: | ||
function p.wart(map) | function p.wart(map) | ||
local edo = map[1] | local edo = map[1] | ||
local simple_map_edo = p.simple_map(edo, | local simple_map_edo = p.simple_map(edo, utils.primes[#map]) | ||
local | local just_tuning_map_edo = p.just_tuning_map(edo, utils.primes[#map]) | ||
local wart_notation = edo | local wart_notation = edo | ||
for i=2, #map do | for i = 2, #map do | ||
-- direction is 1 if current harmonic mapped flatter than just, otherwise 0 | -- direction is 1 if current harmonic mapped flatter than just, otherwise 0 | ||
local direction = math.ceil( | local direction = math.ceil(just_tuning_map_edo[i] - simple_map_edo[i]) | ||
local difference = map[i]-simple_map_edo[i] | local difference = map[i] - simple_map_edo[i] | ||
if difference ~= 0 then | if difference ~= 0 then | ||
number_warts = (2*math.abs(difference)+( | local number_warts = (2 * math.abs(difference) + (utils.signum((-1) ^ direction * difference) - 1) / 2) | ||
for | for _ = 1, number_warts do | ||
wart_notation = wart_notation .. warts[i] | wart_notation = wart_notation .. warts[i] | ||
end | end | ||
end | end | ||
end | end | ||
return wart_notation | |||
end | end | ||
-- Generate table of p-limit uniform maps between min and max, for use with print_table | -- Generate table of p-limit uniform maps between min and max, for use with print_table | ||
function p.make_table(prime, min, max) | -- Could potentially be used standalone for raw data with headers | ||
function p.make_table(prime, prec, min, max) | |||
local maptable = {} | local maptable = {} -- Table of uniform maps with boundaries and wart notation | ||
local map_table = p.new() | |||
map_table.map = p.simple_map(min, prime) -- Set p-limit map for minimum size | |||
local lb = p.lower_bound(map_table) -- Minimum size for the current map | |||
local ub = p.upper_bound(map_table) -- Maximum size for the current map | |||
local row = { "Min. size", "Max. size", "[[Wart notation]]" } | |||
for i = 1, #map_table.map do | |||
local lb = p. | table.insert(row, utils.primes[i]) | ||
local ub = p. | |||
local row = { | |||
for i=1, #map do | |||
table.insert(row, | |||
end | end | ||
table.insert(maptable, row) | table.insert(maptable, row) | ||
while lb < max do | while lb < max do | ||
row = {string.format("%. | row = { string.format(string.format("%%.%df", tonumber(prec)), lb), string.format(string.format("%%.%df", tonumber(prec)), ub), p.wart(map_table.map) } | ||
for j=1, #map do | for j = 1, #map_table.map do | ||
table.insert(row, map[j]) | table.insert(row, map_table.map[j]) | ||
end | end | ||
table.insert(maptable, row) | table.insert(maptable, row) | ||
map[pbi] = map[pbi] + 1 | map_table.map[map_table.pbi] = map_table.map[map_table.pbi] + 1 | ||
lb = p. | lb = p.lower_bound(map_table) | ||
ub = p. | ub = p.upper_bound(map_table) | ||
end | end | ||
return maptable | return maptable | ||
| Line 101: | Line 115: | ||
function p.print_table(frame) | function p.print_table(frame) | ||
local args = getArgs(frame) | local args = getArgs(frame) | ||
local prime = args["limit"] | |||
end | local min = args["min"] | ||
local max = args["max"] | |||
local edo = args["edo"] | |||
local prec = args["prec"] | |||
local debugg = yesno(args["debug"]) | |||
-- Default to 13-limit | |||
prime = utils.eval_num_arg(prime, 13) | |||
if utils.index_of(utils.primes, prime) == nil then | |||
prime = 13 | |||
end | |||
assert(prime, "Prime limit undefined.") | |||
min = utils.eval_num_arg(min, nil) | |||
max = utils.eval_num_arg(max, nil) | |||
if max == nil or min == nil then | |||
assert(edo, "Must provide edo if not min or max given.") | |||
-- default to +/- 0.2 | |||
min = edo - 0.2 | |||
max = edo + 0.2 | |||
end | end | ||
luatable = p.make_table(prime, | |||
local luatable = p.make_table(prime, prec, min, max) | |||
for i=1, 3 do | local result = '{| class="wikitable"\n' | ||
.. '|+ style="font-size: 105%; | ' | |||
.. string.format("%d-limit [[uniform map]]s between %g and %g\n", prime, min, max) | |||
.. "|-\n" | |||
for i = 1, 3 do | |||
result = result .. "! " .. luatable[1][i] .. "\n" | |||
end | end | ||
result = result .. "! Map\n" | |||
for i=2, #luatable do | for i = 2, #luatable do | ||
result = result .. "|-\n" | |||
for j=1, 3 do | for j = 1, 3 do | ||
result = result .. "| " .. luatable[i][j] .. "\n" | |||
end | end | ||
local wikimap = | local wikimap = "" | ||
for j=4, #luatable[i] do | for j = 4, #luatable[i] do | ||
wikimap = wikimap .. | wikimap = wikimap .. " " .. luatable[i][j] | ||
end | end | ||
wikimap = | result = result .. string.format("| {{map|%s}}\n", wikimap) | ||
end | |||
result = result .. "|}" | |||
-- Debugger option | |||
if debugg == true then | |||
result = "<syntaxhighlight lang=\"wikitext\">" .. result .. "</syntaxhighlight>" | |||
end | end | ||
return frame:preprocess(result) | |||
end | end | ||
return p | return p | ||