From e56295d180c1321214e7f3240b61cb23ef6cbee7 Mon Sep 17 00:00:00 2001 From: leejet Date: Mon, 11 May 2026 01:20:06 +0800 Subject: [PATCH] add euler flow flash sample method --- include/stable-diffusion.h | 1 + src/denoiser.hpp | 27 +++++++++++++++++++++++++++ src/stable-diffusion.cpp | 2 ++ 3 files changed, 30 insertions(+) diff --git a/include/stable-diffusion.h b/include/stable-diffusion.h index c4c14949..3596c20c 100644 --- a/include/stable-diffusion.h +++ b/include/stable-diffusion.h @@ -37,6 +37,7 @@ enum rng_type_t { enum sample_method_t { EULER_SAMPLE_METHOD, + EULER_FLOW_FLASH_SAMPLE_METHOD, EULER_A_SAMPLE_METHOD, HEUN_SAMPLE_METHOD, DPM2_SAMPLE_METHOD, diff --git a/src/denoiser.hpp b/src/denoiser.hpp index 3f08706d..e7a25a6d 100644 --- a/src/denoiser.hpp +++ b/src/denoiser.hpp @@ -867,6 +867,31 @@ static sd::Tensor sample_euler_flow(denoise_cb_t model, return x; } +static sd::Tensor sample_euler_flow_flash(denoise_cb_t model, + sd::Tensor x, + const std::vector& sigmas, + std::shared_ptr rng, + float eta) { + float s_noise = eta; + int steps = static_cast(sigmas.size()) - 1; + for (int i = 0; i < steps; i++) { + float sigma = sigmas[i]; + float sigma_next = sigmas[i + 1]; + auto denoised_opt = model(x, sigma, i + 1); + if (denoised_opt.empty()) { + return {}; + } + sd::Tensor denoised = std::move(denoised_opt); + if (sigma_next == 0.0f) { + x = std::move(denoised); + continue; + } + auto noise = sd::Tensor::randn_like(x, rng); + x = sigma_next * noise * s_noise + (1.0f - sigma_next) * denoised; + } + return x; +} + static sd::Tensor sample_euler(denoise_cb_t model, sd::Tensor x, const std::vector& sigmas) { @@ -1658,6 +1683,8 @@ static sd::Tensor sample_k_diffusion(sample_method_t method, float eta, bool is_flow_denoiser) { switch (method) { + case EULER_FLOW_FLASH_SAMPLE_METHOD: + return sample_euler_flow_flash(model, std::move(x), sigmas, rng, eta); case EULER_A_SAMPLE_METHOD: if (is_flow_denoiser) return sample_euler_flow(model, std::move(x), sigmas, rng, eta); diff --git a/src/stable-diffusion.cpp b/src/stable-diffusion.cpp index e4d5a7b6..ba2b3ea6 100644 --- a/src/stable-diffusion.cpp +++ b/src/stable-diffusion.cpp @@ -60,6 +60,7 @@ const char* model_version_to_str[] = { const char* sampling_methods_str[] = { "Euler", + "Euler Flow Flash", "Euler A", "Heun", "DPM2", @@ -1978,6 +1979,7 @@ enum rng_type_t str_to_rng_type(const char* str) { const char* sample_method_to_str[] = { "euler", + "euler_flow_flash", "euler_a", "heun", "dpm2",