Files
2026-08-16 18:24:52 +07:00

58 lines
1.6 KiB
Lua

-- aflops.lua: A-FloPS (1 NFE, stateful multistep)
-- Adaptive Flow Path Sampler with velocity decomposition.
solver = {
name = "aflops",
display = "A-FloPS (1 NFE)",
description = "Exponential integrator with residual tracking",
nfe = 1,
order = 2,
needs_model = false,
stateful = true,
stochastic = false,
}
local prev_w = nil
local prev_t = 0
local prev_t_dst = 0
local function clamp_alpha(t)
local a = 1 - t
return math.max(1e-6, math.min(a, 1 - 1e-6))
end
function step(xt, vt, t_curr, t_prev, n)
if (step_index or 0) == 0 then prev_w = nil; prev_t = 0; prev_t_dst = 0 end
local alpha_curr = clamp_alpha(t_curr)
local alpha_prev = clamp_alpha(t_prev)
local alpha_ratio = alpha_prev / alpha_curr
local log_ratio = math.log(alpha_ratio)
-- Compute residual velocity: w = v + x/(1-t)
local w = {}
local inv_alpha = 1 / alpha_curr
for i = 0, n-1 do w[i] = vt[i] + xt[i] * inv_alpha end
if prev_w then
-- 2nd order: AB-like correction
local dt_curr = t_curr - t_prev
local dt_prev = prev_t - prev_t_dst
local r = (dt_prev > 1e-8) and (dt_curr / dt_prev) or 1
local c1 = 1 + 0.5 * r
local c0 = 0.5 * r
for i = 0, n-1 do
local w_eff = c1 * w[i] - c0 * prev_w[i]
xt[i] = alpha_ratio * xt[i] - alpha_prev * w_eff * log_ratio
end
else
-- 1st order: exponential Euler
for i = 0, n-1 do
xt[i] = alpha_ratio * xt[i] - alpha_prev * w[i] * log_ratio
end
end
prev_w = w
prev_t = t_curr
prev_t_dst = t_prev
end