58 lines
1.6 KiB
Lua
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
|