Nodes/DDRK Omega Sampler/DDRK Omega Sampler
ComfyUI Node

DDRK Omega Sampler

When to reach for DDRK Omega Sampler

By HVOSTOVSKY·Created 2 months ago·Updated 5 days ago· 1
DDRK Omega Sampler
    • SAMPLER
    ◄integratorhc3►
    ◄sde_strength0.00►
    ◄sharpness0.00►
    ◄saber_fusion0.00►
    ◄saber_modeauto►
    ◄use_ema_sabertrue►
    ◄ema_decay0.70►
    ◄dyn_thresh_percentile1.000►
    ◄latent_rescale0.00►
    ◄restart_repeats0►
    ◄restart_steps3►
    ◄restart_t_min0.10►
    ◄restart_t_max0.35►
    ◄hc2_corrector0.00►
    ◄sigma_adapt0.00►
    ◄hc2_max_order2►
    ◄limiter_kappa1.00►
    ◄momentum_beta0.00►
    ◄sde_seed-1►
    ◄s_churn0►
    ◄s_tmin0.0►
    ◄s_tmax999999►
    ◄s_noise1.00►
    ◄content_awaretrue►
    ◄auto_optimizetrue►
    ◄debug_modefalse►
    ◄debug_tag►
    ◄hc2_spaceve►
    ◄hc2_free_correctorfalse►

    DDRK Omega Sampler is the low-level member of the DDRK Omega pack. Where the Unified KSampler does the whole job - model, conditioning, latent in, image latent out - this node only hands you a SAMPLER object for the stock SamplerCustom node to consume. If you just want images, use the Unified node and move on. Reach for this one when you're building a custom sampling graph where you control the SIGMAS yourself, doing img2img with a hand-picked schedule, or experimenting with the HC2 integrator in isolation.

    What it is under the hood

    Same engine as its big sibling: the sampler auto-detects whether your model is flow matching or EDM by reading the sigma schedule, routes sampling through three phases, and can use the HC2 exponential integrator - second order at one model call per step, a multistep method in the DPM-Solver++/UniPC line. The node itself takes no model input at all; it's a pure sampler configuration. Your wiring job is to pair it with a scheduler node that produces SIGMAS (the pack's DDRK Omega Scheduler works, so does any stock one) and feed both into SamplerCustom.

    The inputs you'll actually set

    • integrator - auto, hc2, rk4, heun, euler. This is the main event. hc2 is the pack's second-order-at-one-call integrator; auto picks per phase and step.
    • sde_strength - ancestral stochastic noise, FM only (silently ignored on EDM, which uses s_churn instead). 0 = deterministic.
    • sharpness - final-step perceptual sharpen, FM only by design. Set it on SDXL and nothing happens.
    • saber_fusion - spatial stabilization weight; 0 disables the module entirely. If you're doing text or graphics, that's usually the number to zero out.
    • dyn_thresh_percentile - a percentile latent limiter, 1.0 = off. Despite the name this is not Imagen-style dynamic thresholding; the README is upfront that the renormalization step is deliberately missing.
    • latent_rescale - attenuates values beyond ~2 std from the per-image mean. The tooltip hammers this home: it is not classical CFG-rescale, because ComfyUI combines conditional and unconditional predictions before the sampler runs, so the two tensors that method needs aren't available here. It was renamed from cfg_rescale to stop implying otherwise.

    Then the specialized clusters: limiter_kappa and hc2_max_order control HC2's slope limiter and order; hc2_corrector and sigma_adapt are marked experimental and default off (no measurable effect in the author's testing); s_churn/s_tmin/s_tmax/s_noise are Karras Alg 2 churn for EDM; sde_seed set to -1 derives the noise seed from the workflow seed so runs repeat from the seed widget.

    Installing and wiring it

    Same pack, same install, no extras - the README lists no dependencies beyond what ComfyUI already requires.

    cd ComfyUI/custom_nodes/
    git clone https://github.com/HVOSTOVSKY/DDRK-Omega-Sampler.git
    

    Restart, then: DDRK Omega Scheduler → SIGMAS and this node → SAMPLER, both into SamplerCustom.

    Gotchas

    • At ≤6 steps the integrator is forced to euler unless you picked hc2; the console prints the override.
    • Remember the model-call arithmetic: HC2 and Euler cost one call per step, Heun two, RK4 four. On EDM, HC2's advantage evaporates - the author's measurements put it at +1.2% dynamic range while using 10% more calls. auto or heun is the EDM call.
    • sde_strength doing nothing on EDM and sharpness doing nothing on EDM are features, not bugs - they're gated per family.
    • Something weird in your latent? debug_mode writes a per-step JSON+CSV+summary to the ComfyUI output folder, which is honestly the fastest way to see which enhancers actually fired.
    Categorysampling/DDRK Omega/custom sampling

    Inputs (29)

    NameTypeDefaultDescription
    integratorCOMBOhc3hc3 (recommended): HC2 plus trust damping and a zero-cost corrector - third order at one model call per step, and it falls back towards first order by itself where high CFG makes extrapolation unsafe. hc2: second order, one call per step (the 1.6-1.10 default for FM). euler: first order, one call. heun: 2 calls per step. rk4: 4 calls per step. auto: per-phase choice (heun/rk4 early, hc2 late; 1-4 calls per step). Compare integrators at equal MODEL CALLS, not equal steps.
    sde_strengthFLOAT0.000–0.5Ancestral SDE noise, gated to flat regions. 0 = fully deterministic. FM only - ignored on EDM, which uses s_churn. MEASURED (Krea2 Turbo, 8 steps, 3 seeds): 0.00, 0.08 and 0.15 were indistinguishable by dynamic range (within 0.2%); 0.30 widened it 3.6%. The operator saw no quality change at any setting, only a different composition - which is what stochastic sampling does, it moves to a different sample rather than a better one. Treat this as a variation dial, not a quality dial.
    sharpnessFLOAT0.000–1.5Final-step perceptual sharpen. FM only - disabled on EDM by design, so it does nothing there. MEASURED (Krea2 Turbo, 8 steps, 3 seeds): 0.10 widened dynamic range 2.6%, 0.12 widened it 3.2%, both consistent across seeds, and the operator saw a clear sharpness increase. The effect had NOT saturated at the point where an inherited cap used to cut it off, so values above 0.12 are now reachable and genuinely untested - halos and edge ringing are the failure mode to watch for.
    saber_fusionFLOAT0.000–1Spatial stabilization (a gated blur). 0 disables the module entirely. MEASURED (Krea2 Turbo, 8 steps, 3 seeds): this consistently NARROWS dynamic range - 0.10 by 0.4%, 0.15 by 0.8% - and the operator reported smoother shadows and a silkier look, but graininess appearing by 0.15. Every other measurement in this project has associated a narrower range with a softer, less detailed result, so treat this as a stylistic smoothing control with a real cost, not as a quality improvement. Turn it off for text, graphics and pixel art.
    saber_modeCOMBOautoAuto detects video by 5D latent with >1 frame.
    use_ema_saberBOOLEANtrue—
    ema_decayFLOAT0.700–0.99—
    dyn_thresh_percentileFLOAT1.0000.9–1Percentile latent limiter. 1.0 = disabled (default since 1.8.0). Clips individual latent values above the percentile. MEASURED (Krea 2 Turbo, live runs): at 0.995 it fired on the final FM step - whose output is the image - in 4 of 6 runs, leaving the final latent exactly symmetric (max = -min), i.e. the brightest 0.5% flattened. Suspect for dotted halos around lights. On EDM it fires below 30% of sigma_max, i.e. on most steps.
    latent_rescaleFLOAT0.000–1DEPRECATED - leave at 0. Attenuates latent values beyond ~2 std from the per-image mean. Ablation measured ~30% dynamic range loss and visible artifacts: the transfer curve has a kink at the 2-std threshold, applied per element. HC2's limiter_kappa handles overshoot without this cost. Also note this was never classical CFG-rescale; ComfyUI combines cond and uncond before the sampler runs, so that method cannot be implemented here.
    restart_repeatsINT00–4Restart Sampling (Xu et al. 2023). 0 = off. Deterministic solvers accumulate discretisation error; jumping back up in noise a few times contracts it the way an SDE does, without paying on every step. Each repeat costs restart_steps extra model calls. Set sde_strength to 0 when using this. MEASURED: fires correctly and does what it should on EDM (Illustrious, 20 steps: +0.8% dynamic range for 15% more calls, so not a clear win by that metric). On Flow Matching the first attempt never fired at all - see restart_t_min, which must be set relative to the schedule's actual sigma range.
    restart_stepsINT31–8Steps taken to descend back after each restart jump. Total extra model calls = restart_repeats x restart_steps.
    restart_t_minFLOAT0.100.01–0.9Lower edge of the restart window, as a FRACTION OF SIGMA_MAX - and that is the catch, because the two model families live on different sigma scales. On EDM sigma_max is ~14.6, so 0.10 means sigma 1.46 and the schedule passes through it. On Flow Matching sigma_max is 1.0, so 0.10 means sigma 0.10 - while an 8-step schedule's smallest non-terminal sigma is around 0.33, and restart silently never fired. For FM at few steps use 0.40 or higher. If no schedule point falls in the window the console now says so and prints the value that would work.
    restart_t_maxFLOAT0.350.02–0.95Upper edge: how far back up the jump goes, as a fraction of sigma_max. Must exceed restart_t_min. Larger jumps contract more error but discard more of the structure already resolved.
    hc2_correctorFLOAT0.000–1HC2 selective corrector. 0 = off. On steps where the high-order correction exceeds this fraction of the first-order step, HC2 spends a SECOND model call to redo the step with an interpolated slope instead of an extrapolated one. MEASURED (Krea2 Turbo, 8 steps, CFG 1, 3 seeds): correction activity peaks around 0.14, so thresholds of 0.30 and 0.50 NEVER FIRE - those settings are identical to 0. At 0.10 it fired on 3 of 8 steps for 12 calls instead of 9; dynamic range fell 4.2% while the operator judged detail and lighting improved, so the metric and the eye disagree here. Useful range is roughly 0.05-0.15. EXPERIMENTAL.
    sigma_adaptFLOAT0.000–0.5HC2 adaptive step placement. 0 = off. Moves the intermediate sigma values by up to this fraction to equalise estimated error across steps; step COUNT, start and terminal zero are unchanged. MEASURED (Krea2 Turbo, 8 steps, CFG 1, 3 seeds): 0.10 gave the largest single gain of any option tested, +3.3% dynamic range, reaching +11% on one seed. 0.30 and 0.50 went slightly negative, matching the operator's report that higher values start to hurt on some seeds. Start at 0.10. Note the controller saturates at its own bound when activity falls monotonically, which is most of a run - so above ~0.20 this behaves less like adaptation and more like a fixed schedule stretch.
    hc2_max_orderINT21–3HC2 maximum order. 2 = second order, one model call per step (default). 3 = allow third order: uses two past denoiser evaluations, spends ONE extra model call on the first step to bootstrap (a multistep method's first step is otherwise first-order and caps the whole run's accuracy), and falls back to second order on any step where the expansion stops converging. Ignored by every other integrator.
    limiter_kappaFLOAT1.000.1–3HC2 slope limiter. Caps the 2nd-order correction at this multiple of the 1st-order step, per element. MEASURED (Anima, CFG 5, 3 seeds): the control responds monotonically - kappa 3.0 clips 2.1% of elements on average, 1.0 clips 6.1%, 0.5 clips 11.8%. By dynamic range the default 1.0 came out best, 0.5 worst (-1.6%). Note the original premise was only partly borne out: going from CFG 1 to CFG 5 raised correction activity by ~57%, not by the order of magnitude that would make aggressive limiting necessary. Leave at 1.0 unless you see overshoot. Ignored by every other integrator.
    momentum_betaFLOAT0.000–0.8Adams-Bashforth 2 slope extrapolation for EULER steps only (1.0 = full AB2, a second-order method at one call per step). 0 = plain Euler. Ignored by heun, rk4 and hc2: on top of a higher-order method it makes it first order (measured: RK4 error ~250x, Heun 3-5x at 128-256 calls), so since 1.10.0 it is no longer applied there.
    sde_seedINT-1-1–18446744073709550000SDE noise seed. -1 derives the seed from ComfyUI's globally seeded Torch RNG, so the workflow seed remains reproducible.
    s_churnFLOAT00–100EDM churn (Karras Alg 2). 0 = off. Try 5-15 for SDXL. EDM models only; silently ignored for Flow Matching.
    s_tminFLOAT0.00–999999EDM churn lower sigma bound (Karras Alg 2). Churn only fires while s_tmin <= sigma <= s_tmax. 0.0 = no lower bound.
    s_tmaxFLOAT9999990–999999EDM churn upper sigma bound. Default (max) means unbounded, matching Karras Alg 2's s_tmax=inf. Lower it to restrict churn to high-sigma steps only.
    s_noiseFLOAT1.000–2EDM churn noise multiplier. 1.0 = standard.
    content_awareBOOLEANtrueContent-aware SABER — edge-gated fusion. Disable for pixel-art/flat styles.
    auto_optimizeBOOLEANtrueFlow Matching only: caps or disables SABER/SDE/momentum/sharpness by step budget, and at <=10 steps turns integrator 'auto' into 'hc2'. Does NOT set steps/cfg or the schedule.
    debug_modeBOOLEANfalseWrite a per-step diagnostics log (JSON+CSV+summary) to your ComfyUI output folder. Off by default; adds overhead only when on.
    debug_tagSTRINGOptional label included in the debug log filename, e.g. 'test1'.
    hc2_spaceoptCOMBOveHC2 time variable on Flow Matching. ve (default): lambda = -log(sigma), as HC2 always was. flow: the exact FM parameterisation, half-log-SNR log((1-sigma)/sigma) with a (1-sigma) weight on the correction. MEASURED (Anima, CFG 4, 25 steps, 2 seeds, distance to an RK4 reference): a draw - better on one seed, worse on the other - so it is opt-in. No effect on EDM, where both are the same.
    hc2_free_correctoroptBOOLEANfalseHC2 zero-cost corrector (UniPC-style). Off by default. After each HC2 step the model is called at the step's end point anyway, for the next step; with this on, that output is also used to redo the finished step by interpolation instead of extrapolation, then the next step proceeds from the corrected latent. No extra model calls. MEASURED on the analytic bench only (tests/analytic.py, equal calls): EDM Karras 20-32 calls, error 3-3.6x lower than plain HC2; Flow Matching with the model's schedule, a few percent, because the final jump to sigma 0 dominates there. NOT validated on images - A/B it before relying on it. Ignored by other integrators and on steps that follow SDE noise, churn or a restart jump.

    Outputs (1)

    NameTypeDescription
    SAMPLERSAMPLER—