39 lines
1.0 KiB
Lua
39 lines
1.0 KiB
Lua
-- linear_quadratic.lua: Linear start, quadratic finish
|
|
|
|
scheduler = {
|
|
name = "linear_quadratic",
|
|
display = "Linear-Quadratic",
|
|
description = "Linear start, quadratic finish",
|
|
}
|
|
|
|
function schedule(output, num_steps, shift)
|
|
local crossover = 0.5
|
|
local n_linear = math.max(math.floor(num_steps * crossover), 1)
|
|
local n_quad = num_steps - n_linear
|
|
local t_cross = 1.0 - crossover
|
|
|
|
for i = 0, n_linear - 1 do
|
|
output[i] = 1.0 - i * crossover / n_linear
|
|
end
|
|
for i = 0, n_quad - 1 do
|
|
local frac = (i + 1) / n_quad
|
|
output[n_linear + i] = t_cross * (1.0 - frac * frac)
|
|
end
|
|
clamp(output, num_steps)
|
|
apply_shift(output, num_steps, shift)
|
|
end
|
|
|
|
function apply_shift(ts, n, shift)
|
|
if shift == 1.0 then return end
|
|
for i = 0, n - 1 do
|
|
local t = ts[i]; ts[i] = shift * t / (1.0 + (shift - 1.0) * t)
|
|
end
|
|
end
|
|
|
|
function clamp(ts, n)
|
|
for i = 0, n - 1 do
|
|
if ts[i] < 1e-6 then ts[i] = 1e-6 end
|
|
if ts[i] > 1.0 then ts[i] = 1.0 end
|
|
end
|
|
end
|