From fb10dff2420a50d719adabe732358f68feef19bd Mon Sep 17 00:00:00 2001 From: vmobilis <75476228+vmobilis@users.noreply.github.com> Date: Thu, 10 Sep 2026 16:08:57 +0300 Subject: [PATCH 01/18] rng.hpp: add RNG name for `std` --- src/core/rng.hpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/core/rng.hpp b/src/core/rng.hpp index 20ffec7de..c09ec2fe3 100644 --- a/src/core/rng.hpp +++ b/src/core/rng.hpp @@ -6,6 +6,8 @@ class RNG { public: + static constexpr std::string_view rng_name = "rng"; + virtual void manual_seed(uint64_t seed) = 0; virtual std::vector randn(uint32_t n) = 0; }; @@ -15,6 +17,8 @@ class STDDefaultRNG : public RNG { std::default_random_engine generator; public: + static constexpr std::string_view rng_name = "std"; + void manual_seed(uint64_t seed) override { generator.seed((unsigned int)seed); } @@ -32,4 +36,4 @@ class STDDefaultRNG : public RNG { } }; -#endif // __SD_CORE_RNG_HPP__ \ No newline at end of file +#endif // __SD_CORE_RNG_HPP__ From 8b9689cfa39675e99efee6ee1d1a3259ffeab616 Mon Sep 17 00:00:00 2001 From: vmobilis <75476228+vmobilis@users.noreply.github.com> Date: Thu, 10 Sep 2026 16:12:07 +0300 Subject: [PATCH 02/18] rng_mt19937.hpp: add RNG name for `cpu` --- src/core/rng_mt19937.hpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/core/rng_mt19937.hpp b/src/core/rng_mt19937.hpp index 85da05cfe..915990524 100644 --- a/src/core/rng_mt19937.hpp +++ b/src/core/rng_mt19937.hpp @@ -121,6 +121,8 @@ class MT19937RNG : public RNG { } public: + static constexpr std::string_view rng_name = "cpu"; + MT19937RNG(uint64_t seed = 0) { manual_seed(seed); } void manual_seed(uint64_t seed) override { @@ -144,4 +146,4 @@ class MT19937RNG : public RNG { } }; -#endif // __SD_CORE_RNG_MT19937_HPP__ \ No newline at end of file +#endif // __SD_CORE_RNG_MT19937_HPP__ From 3eb60317e8331e3672275a6ee99e73c8ea9aa0b6 Mon Sep 17 00:00:00 2001 From: vmobilis <75476228+vmobilis@users.noreply.github.com> Date: Thu, 10 Sep 2026 16:14:25 +0300 Subject: [PATCH 03/18] rng_philox.hpp: add RNG name for `cuda` --- src/core/rng_philox.hpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/core/rng_philox.hpp b/src/core/rng_philox.hpp index 8258ed950..a54705ef5 100644 --- a/src/core/rng_philox.hpp +++ b/src/core/rng_philox.hpp @@ -88,6 +88,8 @@ class PhiloxRNG : public RNG { } public: + static constexpr std::string_view rng_name = "cuda"; + PhiloxRNG(uint64_t seed = 0) { this->seed = seed; this->offset = 0; @@ -122,4 +124,4 @@ class PhiloxRNG : public RNG { } }; -#endif // __SD_CORE_RNG_PHILOX_HPP__ \ No newline at end of file +#endif // __SD_CORE_RNG_PHILOX_HPP__ From 138b059467d1afefa71c2b947aa94649527bee40 Mon Sep 17 00:00:00 2001 From: vmobilis <75476228+vmobilis@users.noreply.github.com> Date: Thu, 10 Sep 2026 16:20:07 +0300 Subject: [PATCH 04/18] denoiser.hpp: add choices for `brownian_tree` --- src/runtime/denoiser.hpp | 31 ++++++++++++++++++++++++------- 1 file changed, 24 insertions(+), 7 deletions(-) diff --git a/src/runtime/denoiser.hpp b/src/runtime/denoiser.hpp index a9bf91699..e8a9ffe10 100644 --- a/src/runtime/denoiser.hpp +++ b/src/runtime/denoiser.hpp @@ -16,6 +16,10 @@ #include "runtime/gits_noise.h" #include "runtime/guidance.h" +//#include "core/rng.hpp" // included in core/tensor.hpp +#include "core/rng_mt19937.hpp" +#include "core/rng_philox.hpp" + /*================================================= CompVisDenoiser ==================================================*/ // Ref: https://github.com/crowsonkb/k-diffusion/blob/master/k_diffusion/external.py @@ -2714,14 +2718,15 @@ class IIDGaussianNoiseSampler : public NoiseSampler { class BrownianTreeNoiseSampler : public NoiseSampler { public: BrownianTreeNoiseSampler(const sd::Tensor& x_template, + std::shared_ptr r, double sigma_min, double sigma_max, uint64_t seed) : t_min_(sigma_min), t_max_(sigma_max), + rng(r), // rng(std::move(r)) shape_(x_template.shape()), root_seed_(mix64(seed, 0x9E3779B97F4A7C15ULL)) { - auto rng = std::make_shared(); rng->manual_seed(mix64(seed, 0xBF58476D1CE4E5B9ULL)); w_at_tmax_ = sd::Tensor::randn(shape_, rng) * std::sqrt(static_cast(t_max_ - t_min_)); } @@ -2772,7 +2777,6 @@ class BrownianTreeNoiseSampler : public NoiseSampler { } double m = 0.5 * (a + c); double std_dev = std::sqrt((c - m) * (m - a) / (c - a)); - auto rng = std::make_shared(); rng->manual_seed(node_seed); auto z = sd::Tensor::randn(shape_, rng); auto w_m = 0.5f * (w_a + w_c) + static_cast(std_dev) * z; @@ -2787,6 +2791,7 @@ class BrownianTreeNoiseSampler : public NoiseSampler { double t_min_; double t_max_; + std::shared_ptr rng; std::vector shape_; uint64_t root_seed_; sd::Tensor w_at_tmax_; @@ -2796,13 +2801,25 @@ class BrownianTreeNoiseSampler : public NoiseSampler { static std::unique_ptr make_noise_sampler(const sd::Tensor& x, std::shared_ptr rng, sample_method_t method, const std::vector& sigmas, const SamplerExtraArgs& extra_args) { bool brownian_tree = (method == DPMPP2M_SDE_BT_SAMPLE_METHOD); bool def_brownian_tree = brownian_tree; + std::shared_ptr r = rng; for (const auto& [key, value] : extra_args) { if (key == "noise_sampler") { if (value == "iid") { - brownian_tree = false; - } else if (value == "brownian_tree") { + brownian_tree = false; // setting both for the case when + r = rng; // the key is repeated several times + } else if (value == "brownian_tree" || value == "brownian_tree_std") { + brownian_tree = true; + r = std::make_shared(); + } else if (value == "brownian_tree_cpu") { + brownian_tree = true; + r = std::make_shared(); + } else if (value == "brownian_tree_cuda") { + brownian_tree = true; + r = std::make_shared(); + } else if (value == "brownian_tree_sampler_rng") { brownian_tree = true; + r = rng; } else { LOG_WARN("unknown noise_sampler value '%s'; using default", value.c_str()); } @@ -2824,16 +2841,16 @@ static std::unique_ptr make_noise_sampler(const sd::Tensor& auto draw = rng->randn(2); std::memcpy(&tree_seed, draw.data(), sizeof(tree_seed)); if (!def_brownian_tree) { - LOG_INFO("setting noise sampler to Brownian tree"); + LOG_INFO("setting noise sampler to Brownian tree (%s)", r->rn()); } - return std::make_unique(x, sigma_min, sigma_max, tree_seed); + return std::make_unique(x, std::move(r), sigma_min, sigma_max, tree_seed); } } if (def_brownian_tree) { LOG_INFO("setting noise sampler to independent and identically distributed (iid)"); } - return std::make_unique(x, rng); + return std::make_unique(x, std::move(r)); } // k diffusion reverse ODE: dx = (x - D(x;\sigma)) / \sigma dt; \sigma(t) = t From 8c56b7a0f11a89915f8806e9597a7142b92cec62 Mon Sep 17 00:00:00 2001 From: vmobilis <75476228+vmobilis@users.noreply.github.com> Date: Thu, 10 Sep 2026 16:47:23 +0300 Subject: [PATCH 05/18] rng.hpp: wrong version --- src/core/rng.hpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/core/rng.hpp b/src/core/rng.hpp index c09ec2fe3..3e89ebc35 100644 --- a/src/core/rng.hpp +++ b/src/core/rng.hpp @@ -6,10 +6,10 @@ class RNG { public: - static constexpr std::string_view rng_name = "rng"; - virtual void manual_seed(uint64_t seed) = 0; virtual std::vector randn(uint32_t n) = 0; + + virtual const char* const rn() { return "rng"; } }; class STDDefaultRNG : public RNG { @@ -17,7 +17,7 @@ class STDDefaultRNG : public RNG { std::default_random_engine generator; public: - static constexpr std::string_view rng_name = "std"; + virtual const char* const rn() override { return "std"; } void manual_seed(uint64_t seed) override { generator.seed((unsigned int)seed); From a97348fe776f8f48be0fed29e57ca0612fd453bb Mon Sep 17 00:00:00 2001 From: vmobilis <75476228+vmobilis@users.noreply.github.com> Date: Thu, 10 Sep 2026 16:48:37 +0300 Subject: [PATCH 06/18] rng_mt19937.hpp: wrobg version --- src/core/rng_mt19937.hpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/core/rng_mt19937.hpp b/src/core/rng_mt19937.hpp index 915990524..bf7375cfa 100644 --- a/src/core/rng_mt19937.hpp +++ b/src/core/rng_mt19937.hpp @@ -121,10 +121,10 @@ class MT19937RNG : public RNG { } public: - static constexpr std::string_view rng_name = "cpu"; - MT19937RNG(uint64_t seed = 0) { manual_seed(seed); } + virtual const char* const rn() override { return "cpu"; } + void manual_seed(uint64_t seed) override { s.seed_ = seed; s.seeded_ = true; From 4fd0964f0389800061ff989e528d82b04dda3055 Mon Sep 17 00:00:00 2001 From: vmobilis <75476228+vmobilis@users.noreply.github.com> Date: Thu, 10 Sep 2026 16:49:56 +0300 Subject: [PATCH 07/18] rng_philox.hpp: wrong version --- src/core/rng_philox.hpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/core/rng_philox.hpp b/src/core/rng_philox.hpp index a54705ef5..22bd59b72 100644 --- a/src/core/rng_philox.hpp +++ b/src/core/rng_philox.hpp @@ -88,13 +88,13 @@ class PhiloxRNG : public RNG { } public: - static constexpr std::string_view rng_name = "cuda"; - PhiloxRNG(uint64_t seed = 0) { this->seed = seed; this->offset = 0; } + virtual const char* const rn() override { return "cuda"; } + void manual_seed(uint64_t seed) override { this->seed = seed; this->offset = 0; From cdbf0ee65795ece77bfdb64a3d8737f13ebbb217 Mon Sep 17 00:00:00 2001 From: vmobilis <75476228+vmobilis@users.noreply.github.com> Date: Thu, 10 Sep 2026 23:08:01 +0300 Subject: [PATCH 08/18] rng.hpp: support `const STDDefaultRNG` --- src/core/rng.hpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/core/rng.hpp b/src/core/rng.hpp index 3e89ebc35..979cc77aa 100644 --- a/src/core/rng.hpp +++ b/src/core/rng.hpp @@ -9,7 +9,7 @@ class RNG { virtual void manual_seed(uint64_t seed) = 0; virtual std::vector randn(uint32_t n) = 0; - virtual const char* const rn() { return "rng"; } + virtual const char* const rn() const { return "rng"; } }; class STDDefaultRNG : public RNG { @@ -17,7 +17,7 @@ class STDDefaultRNG : public RNG { std::default_random_engine generator; public: - virtual const char* const rn() override { return "std"; } + virtual const char* const rn() const override { return "std"; } void manual_seed(uint64_t seed) override { generator.seed((unsigned int)seed); From f0fac780a6f71a3f8930ceafdbf6f39e9e45f7b3 Mon Sep 17 00:00:00 2001 From: vmobilis <75476228+vmobilis@users.noreply.github.com> Date: Thu, 10 Sep 2026 23:14:00 +0300 Subject: [PATCH 09/18] rng_mt19937.hpp: support `const MT19937RNG` --- src/core/rng_mt19937.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/core/rng_mt19937.hpp b/src/core/rng_mt19937.hpp index bf7375cfa..8c561a850 100644 --- a/src/core/rng_mt19937.hpp +++ b/src/core/rng_mt19937.hpp @@ -123,7 +123,7 @@ class MT19937RNG : public RNG { public: MT19937RNG(uint64_t seed = 0) { manual_seed(seed); } - virtual const char* const rn() override { return "cpu"; } + virtual const char* const rn() const override { return "cpu"; } void manual_seed(uint64_t seed) override { s.seed_ = seed; From 11897434281700651e02a4776b0fb2e1bf48b9ae Mon Sep 17 00:00:00 2001 From: vmobilis <75476228+vmobilis@users.noreply.github.com> Date: Thu, 10 Sep 2026 23:16:51 +0300 Subject: [PATCH 10/18] rng_philox.hpp: support `const PhiloxRNG` --- src/core/rng_philox.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/core/rng_philox.hpp b/src/core/rng_philox.hpp index 22bd59b72..8962096da 100644 --- a/src/core/rng_philox.hpp +++ b/src/core/rng_philox.hpp @@ -93,7 +93,7 @@ class PhiloxRNG : public RNG { this->offset = 0; } - virtual const char* const rn() override { return "cuda"; } + virtual const char* const rn() const override { return "cuda"; } void manual_seed(uint64_t seed) override { this->seed = seed; From 532e484ff2e4d4699f5f03654b9dc7b83bdf73d4 Mon Sep 17 00:00:00 2001 From: vmobilis <75476228+vmobilis@users.noreply.github.com> Date: Fri, 11 Sep 2026 18:47:38 +0300 Subject: [PATCH 11/18] clang-format --- src/runtime/denoiser.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/runtime/denoiser.hpp b/src/runtime/denoiser.hpp index e8a9ffe10..5fe418257 100644 --- a/src/runtime/denoiser.hpp +++ b/src/runtime/denoiser.hpp @@ -16,7 +16,7 @@ #include "runtime/gits_noise.h" #include "runtime/guidance.h" -//#include "core/rng.hpp" // included in core/tensor.hpp +// #include "core/rng.hpp" // included in core/tensor.hpp #include "core/rng_mt19937.hpp" #include "core/rng_philox.hpp" From 9c940706a6a14c1a386f45f604368501a9e35815 Mon Sep 17 00:00:00 2001 From: vmobilis <75476228+vmobilis@users.noreply.github.com> Date: Mon, 14 Sep 2026 17:11:57 +0300 Subject: [PATCH 12/18] stable-diffusion.cpp: make `get_rng()` global --- src/stable-diffusion.cpp | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/stable-diffusion.cpp b/src/stable-diffusion.cpp index d2193e14c..b635eb3bf 100644 --- a/src/stable-diffusion.cpp +++ b/src/stable-diffusion.cpp @@ -654,16 +654,6 @@ class StableDiffusionGGML { return false; } - std::shared_ptr get_rng(rng_type_t rng_type) { - if (rng_type == STD_DEFAULT_RNG) { - return std::make_shared(); - } else if (rng_type == CPU_RNG) { - return std::make_shared(); - } else { // default: CUDA_RNG - return std::make_shared(); - } - } - void refresh_compvis_denoiser_sigmas() { auto comp_vis_denoiser = std::dynamic_pointer_cast(denoiser); if (!comp_vis_denoiser) { @@ -3302,6 +3292,16 @@ enum rng_type_t str_to_rng_type(const char* str) { return RNG_TYPE_COUNT; } +std::shared_ptr get_rng(rng_type_t rng_type) { + if (rng_type == STD_DEFAULT_RNG) { + return std::make_shared(); + } else if (rng_type == CPU_RNG) { + return std::make_shared(); + } else { // default: CUDA_RNG + return std::make_shared(); + } +} + const char* sample_method_to_str[] = { "euler", "euler_a", From 85d0c467fe6f30f8e5881392764315cd17540844 Mon Sep 17 00:00:00 2001 From: vmobilis <75476228+vmobilis@users.noreply.github.com> Date: Mon, 14 Sep 2026 17:15:50 +0300 Subject: [PATCH 13/18] stable-diffusion.h: `str_to_rng_type()` visibility --- include/stable-diffusion.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/stable-diffusion.h b/include/stable-diffusion.h index d5cda6d9a..32c36fde4 100644 --- a/include/stable-diffusion.h +++ b/include/stable-diffusion.h @@ -464,7 +464,7 @@ SD_API bool sd_ctx_has_control_net(const sd_ctx_t* sd_ctx); SD_API const char* sd_type_name(enum sd_type_t type); SD_API enum sd_type_t str_to_sd_type(const char* str); SD_API const char* sd_rng_type_name(enum rng_type_t rng_type); -SD_API enum rng_type_t str_to_rng_type(const char* str); +extern SD_API enum rng_type_t str_to_rng_type(const char* str); SD_API const char* sd_sample_method_name(enum sample_method_t sample_method); SD_API enum sample_method_t str_to_sample_method(const char* str); SD_API const char* sd_scheduler_name(enum scheduler_t scheduler); From fc287b8a6a1a853d5c328682451b270cb4ea001b Mon Sep 17 00:00:00 2001 From: vmobilis <75476228+vmobilis@users.noreply.github.com> Date: Mon, 14 Sep 2026 17:18:52 +0300 Subject: [PATCH 14/18] rng.hpp: make `STDDefaultRNG` replicable --- src/core/rng.hpp | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/core/rng.hpp b/src/core/rng.hpp index 979cc77aa..e2eb694de 100644 --- a/src/core/rng.hpp +++ b/src/core/rng.hpp @@ -4,20 +4,28 @@ #include #include +#include "stable-diffusion.h" // for SD_API, str_to_rng_type() in denoiser + class RNG { public: virtual void manual_seed(uint64_t seed) = 0; virtual std::vector randn(uint32_t n) = 0; virtual const char* const rn() const { return "rng"; } + virtual const std::shared_ptr clone() const = 0; }; +extern SD_API std::shared_ptr get_rng(rng_type_t rng_type); + class STDDefaultRNG : public RNG { private: std::default_random_engine generator; public: virtual const char* const rn() const override { return "std"; } + virtual const std::shared_ptr clone() const override { + return std::make_shared(*this); + } void manual_seed(uint64_t seed) override { generator.seed((unsigned int)seed); @@ -36,4 +44,4 @@ class STDDefaultRNG : public RNG { } }; -#endif // __SD_CORE_RNG_HPP__ +#endif // __SD_CORE_RNG_HPP__ \ No newline at end of file From 5ed21c0099f37e97050374f19cc936220a6ce154 Mon Sep 17 00:00:00 2001 From: vmobilis <75476228+vmobilis@users.noreply.github.com> Date: Mon, 14 Sep 2026 17:22:25 +0300 Subject: [PATCH 15/18] rng_mt19937.hpp: make `MT19937RNG` replicable --- src/core/rng_mt19937.hpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/core/rng_mt19937.hpp b/src/core/rng_mt19937.hpp index 8c561a850..b1fd282c3 100644 --- a/src/core/rng_mt19937.hpp +++ b/src/core/rng_mt19937.hpp @@ -124,6 +124,9 @@ class MT19937RNG : public RNG { MT19937RNG(uint64_t seed = 0) { manual_seed(seed); } virtual const char* const rn() const override { return "cpu"; } + virtual const std::shared_ptr clone() const override { + return std::make_shared(*this); + } void manual_seed(uint64_t seed) override { s.seed_ = seed; @@ -146,4 +149,4 @@ class MT19937RNG : public RNG { } }; -#endif // __SD_CORE_RNG_MT19937_HPP__ +#endif // __SD_CORE_RNG_MT19937_HPP__ \ No newline at end of file From 5d28224c8496f6edea6688503922c884832f5d41 Mon Sep 17 00:00:00 2001 From: vmobilis <75476228+vmobilis@users.noreply.github.com> Date: Mon, 14 Sep 2026 17:25:01 +0300 Subject: [PATCH 16/18] rng_phoilox.hpp: make `PhiloxRNG` replicable --- src/core/rng_philox.hpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/core/rng_philox.hpp b/src/core/rng_philox.hpp index 8962096da..8f8c7aee9 100644 --- a/src/core/rng_philox.hpp +++ b/src/core/rng_philox.hpp @@ -94,6 +94,9 @@ class PhiloxRNG : public RNG { } virtual const char* const rn() const override { return "cuda"; } + virtual const std::shared_ptr clone() const override { + return std::make_shared(*this); + } void manual_seed(uint64_t seed) override { this->seed = seed; @@ -124,4 +127,4 @@ class PhiloxRNG : public RNG { } }; -#endif // __SD_CORE_RNG_PHILOX_HPP__ +#endif // __SD_CORE_RNG_PHILOX_HPP__ \ No newline at end of file From 4ff163c87753488e84bae4d03c8a4e4db91a3a14 Mon Sep 17 00:00:00 2001 From: vmobilis <75476228+vmobilis@users.noreply.github.com> Date: Mon, 14 Sep 2026 17:28:35 +0300 Subject: [PATCH 17/18] denoiser.hpp: make copies of `rng` independent --- src/runtime/denoiser.hpp | 56 +++++++++++++++++++++++++--------------- 1 file changed, 35 insertions(+), 21 deletions(-) diff --git a/src/runtime/denoiser.hpp b/src/runtime/denoiser.hpp index 5fe418257..be7afa023 100644 --- a/src/runtime/denoiser.hpp +++ b/src/runtime/denoiser.hpp @@ -2724,9 +2724,10 @@ class BrownianTreeNoiseSampler : public NoiseSampler { uint64_t seed) : t_min_(sigma_min), t_max_(sigma_max), - rng(r), // rng(std::move(r)) + app_wide_rng(std::move(r)), shape_(x_template.shape()), root_seed_(mix64(seed, 0x9E3779B97F4A7C15ULL)) { + auto rng = app_wide_rng->clone(); rng->manual_seed(mix64(seed, 0xBF58476D1CE4E5B9ULL)); w_at_tmax_ = sd::Tensor::randn(shape_, rng) * std::sqrt(static_cast(t_max_ - t_min_)); } @@ -2759,12 +2760,13 @@ class BrownianTreeNoiseSampler : public NoiseSampler { return it->second; } sd::Tensor zero = sd::Tensor::zeros(shape_); - sd::Tensor out = bridge(t_min_, t_max_, zero, w_at_tmax_, t, root_seed_, kMaxDepth); + sd::Tensor out = bridge(app_wide_rng, t_min_, t_max_, zero, w_at_tmax_, t, root_seed_, kMaxDepth); cache_.emplace(t, out); return out; } - sd::Tensor bridge(double a, + sd::Tensor bridge(std::shared_ptr r, + double a, double c, const sd::Tensor& w_a, const sd::Tensor& w_c, @@ -2777,6 +2779,7 @@ class BrownianTreeNoiseSampler : public NoiseSampler { } double m = 0.5 * (a + c); double std_dev = std::sqrt((c - m) * (m - a) / (c - a)); + auto rng = r->clone(); rng->manual_seed(node_seed); auto z = sd::Tensor::randn(shape_, rng); auto w_m = 0.5f * (w_a + w_c) + static_cast(std_dev) * z; @@ -2784,14 +2787,14 @@ class BrownianTreeNoiseSampler : public NoiseSampler { return w_m; } if (t < m) { - return bridge(a, m, w_a, w_m, t, mix64(node_seed, 1), depth - 1); + return bridge(r, a, m, w_a, w_m, t, mix64(node_seed, 1), depth - 1); } - return bridge(m, c, w_m, w_c, t, mix64(node_seed, 2), depth - 1); + return bridge(r, m, c, w_m, w_c, t, mix64(node_seed, 2), depth - 1); } double t_min_; double t_max_; - std::shared_ptr rng; + const std::shared_ptr app_wide_rng; std::vector shape_; uint64_t root_seed_; sd::Tensor w_at_tmax_; @@ -2801,29 +2804,28 @@ class BrownianTreeNoiseSampler : public NoiseSampler { static std::unique_ptr make_noise_sampler(const sd::Tensor& x, std::shared_ptr rng, sample_method_t method, const std::vector& sigmas, const SamplerExtraArgs& extra_args) { bool brownian_tree = (method == DPMPP2M_SDE_BT_SAMPLE_METHOD); bool def_brownian_tree = brownian_tree; - std::shared_ptr r = rng; + int bt_rng_type = STD_DEFAULT_RNG; // int instead of enum because of RNG_TYPE_COUNT + 1 for (const auto& [key, value] : extra_args) { if (key == "noise_sampler") { if (value == "iid") { - brownian_tree = false; // setting both for the case when - r = rng; // the key is repeated several times - } else if (value == "brownian_tree" || value == "brownian_tree_std") { - brownian_tree = true; - r = std::make_shared(); - } else if (value == "brownian_tree_cpu") { - brownian_tree = true; - r = std::make_shared(); - } else if (value == "brownian_tree_cuda") { + brownian_tree = false; + } else if (value == "brownian_tree") { brownian_tree = true; - r = std::make_shared(); - } else if (value == "brownian_tree_sampler_rng") { - brownian_tree = true; - r = rng; } else { LOG_WARN("unknown noise_sampler value '%s'; using default", value.c_str()); } } + if (key == "brownian_tree_rng") { + if (value == "sampler_rng") { + bt_rng_type = RNG_TYPE_COUNT + 1; + } else { + bt_rng_type = str_to_rng_type(value.c_str()); + if (bt_rng_type == RNG_TYPE_COUNT) { + LOG_WARN("invalid '%s' type '%s'; using std_default", key.c_str(), value.c_str()); + } + } + } } if (brownian_tree) { @@ -2840,6 +2842,18 @@ static std::unique_ptr make_noise_sampler(const sd::Tensor& uint64_t tree_seed = 0; auto draw = rng->randn(2); std::memcpy(&tree_seed, draw.data(), sizeof(tree_seed)); + + std::shared_ptr r; + switch(bt_rng_type) { + case RNG_TYPE_COUNT + 1: + r = rng; + break; + case RNG_TYPE_COUNT: + r = get_rng(STD_DEFAULT_RNG); + break; + default: + r = get_rng((rng_type_t) bt_rng_type); + } if (!def_brownian_tree) { LOG_INFO("setting noise sampler to Brownian tree (%s)", r->rn()); } @@ -2850,7 +2864,7 @@ static std::unique_ptr make_noise_sampler(const sd::Tensor& if (def_brownian_tree) { LOG_INFO("setting noise sampler to independent and identically distributed (iid)"); } - return std::make_unique(x, std::move(r)); + return std::make_unique(x, rng); } // k diffusion reverse ODE: dx = (x - D(x;\sigma)) / \sigma dt; \sigma(t) = t From ce653266e9e2fb44ebaf511766f99665ae8a67aa Mon Sep 17 00:00:00 2001 From: vmobilis <75476228+vmobilis@users.noreply.github.com> Date: Mon, 14 Sep 2026 19:08:02 +0300 Subject: [PATCH 18/18] extern `str_to_rng_type()` is needless --- include/stable-diffusion.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/stable-diffusion.h b/include/stable-diffusion.h index 32c36fde4..d5cda6d9a 100644 --- a/include/stable-diffusion.h +++ b/include/stable-diffusion.h @@ -464,7 +464,7 @@ SD_API bool sd_ctx_has_control_net(const sd_ctx_t* sd_ctx); SD_API const char* sd_type_name(enum sd_type_t type); SD_API enum sd_type_t str_to_sd_type(const char* str); SD_API const char* sd_rng_type_name(enum rng_type_t rng_type); -extern SD_API enum rng_type_t str_to_rng_type(const char* str); +SD_API enum rng_type_t str_to_rng_type(const char* str); SD_API const char* sd_sample_method_name(enum sample_method_t sample_method); SD_API enum sample_method_t str_to_sample_method(const char* str); SD_API const char* sd_scheduler_name(enum scheduler_t scheduler);