RES4LYF Combo Loop (Sampler + Scheduler)
Sampler × scheduler × mode, all in one node
- sampler_name
- scheduler
- sampler_mode
- sampler_index
- scheduler_index
- sampler_mode_index
- total_combinations
- label
This is the node the pack is named for. RES4LYFComboLoop is the tester-loop in its most complete form: one node that cycles your sampler, your scheduler, and RES4LYF's sampler mode at the same time, then tells you exactly what combination produced the image. If you're running a sampler sweep, this is the one you'd reach for - the separate Sampler and Scheduler loop nodes exist mainly for when you want to hold one axis fixed.
The context you need: RES4LYF is ClownsharkBatwing's pack of high-order solvers and schedules that became the default place sampler tuning happens for flow-matching models. The catch has always been the sheer breadth of it - over a hundred solvers across categories like exponential, hybrid, fully implicit, and a handful of schedules, with almost no guidance on which pairs well with which. Manually A/B-ing that space is miserable. This node is KY-2000's answer: let each queue run advance the combo, so a batch of images is your experiment.
How it works
It keeps three independent counters - one for samplers, one for schedulers, one for sampler modes - each with its own mode of sequential / random / ping_pong. On each execution it selects one value from each list (all pulled live from your RES4LYF install) and reports all three plus their indices. total_combinations is the honest product of what you actually enabled: samplers × schedulers × modes, with skip_ lists and disabled mode-looping shrinking it accordingly. If RES4LYF isn't found, it falls back to the pack's built-in lists and logs a console warning.
The inputs that matter
sampler_loop_modeandscheduler_loop_mode- set each axis's traversal: sequential, random, or ping_pong.seed- reproduces random draws on both axes.reset- restart the whole sweep from the first combination.skip_samplers/skip_schedulers- comma/newline lists to prune (start withnonefor samplers).loop_sampler_mode+sampler_mode_method+skip_sampler_modes- fold RES4LYF'sunsample/standard/resamplemodes into the loop or leave it off.
Outputs are the whole picture at once: sampler_name, scheduler, sampler_mode, the three _index integers, total_combinations, and a label like exponential/res_2s | beta57 | standard. Wire sampler_name, scheduler, and sampler_mode into RES4LYF's ClownsharKSampler_Beta node - that's exactly what the repo's sample workflow does, then it tags the image with the label via AddLabel so each output tells you its own settings.
Install
RES4LYF first, then the loop pack, both in ComfyUI/custom_nodes/:
cd ComfyUI/custom_nodes/
git clone https://github.com/ClownsharkBatwing/RES4LYF.git
git clone https://github.com/KY-2000/RES4LYF-tester-loop.git
Restart ComfyUI. No pip installs, no model downloads - pure Python stdlib. ComfyUI Manager finds both packs by title.
Where people get burned
Watch the math: 100+ samplers × 11 schedulers × 3 modes is a lot of runs. total_combinations exists so you can see it coming, and the skip lists are how you keep it sane. Since every instance of the class shares its counters, two Combo Loops in one workflow advance together - run one sweep at a time. And when you're reviewing output, remember the loop is deliberately generating dead combinations too: on flow-matching models, scheduler names like karras and exponential are known failures, and that's the sweep doing its job, not the sampler lying to you.
Inputs (9)
| Name | Type | Default | Description |
|---|---|---|---|
| sampler_loop_mode | COMBO | 3 options: sequential, random, ping_pong | |
| scheduler_loop_mode | COMBO | 3 options: sequential, random, ping_pong | |
| seed | INT | 00–18446744073709550000 | — |
| reset | BOOLEAN | false | — |
| skip_samplersopt | STRING | — | |
| skip_schedulersopt | STRING | — | |
| loop_sampler_modeopt | BOOLEAN | false | — |
| sampler_mode_methodopt | COMBO | 3 options: sequential, random, ping_pong | |
| skip_sampler_modesopt | STRING | — |
Outputs (8)
| Name | Type | Description |
|---|---|---|
| sampler_name | none,multistep/res_2m,multistep/res_3m,multistep/dpmpp_2m,multistep/dpmpp_3m,multistep/abnorsett_2m,multistep/abnorsett_3m,multistep/abnorsett_4m,multistep/deis_2m,multistep/deis_3m,multistep/deis_4m,exponential/res_2s_rkmk2e,exponential/res_2s,exponential/res_2s_stable,exponential/res_3s,exponential/res_3s_non-monotonic,exponential/res_3s_alt,exponential/res_3s_cox_matthews,exponential/res_3s_lie,exponential/res_3s_sunstar,exponential/res_3s_strehmel_weiner,exponential/res_4s_krogstad,exponential/res_4s_krogstad_alt,exponential/res_4s_strehmel_weiner,exponential/res_4s_strehmel_weiner_alt,exponential/res_4s_cox_matthews,exponential/res_4s_cfree4,exponential/res_4s_friedli,exponential/res_4s_minchev,exponential/res_4s_munthe-kaas,exponential/res_5s,exponential/res_5s_hochbruck-ostermann,exponential/res_6s,exponential/res_8s,exponential/res_8s_alt,exponential/res_10s,exponential/res_15s,exponential/res_16s,exponential/etdrk2_2s,exponential/etdrk3_a_3s,exponential/etdrk3_b_3s,exponential/etdrk4_4s,exponential/etdrk4_4s_alt,exponential/dpmpp_2s,exponential/dpmpp_sde_2s,exponential/dpmpp_3s,exponential/lawson2a_2s,exponential/lawson2b_2s,exponential/lawson4_4s,exponential/lawson41-gen_4s,exponential/lawson41-gen-mod_4s,exponential/ddim,hybrid/pec423_2h2s,hybrid/pec433_2h3s,hybrid/abnorsett2_1h2s,hybrid/abnorsett3_2h2s,hybrid/abnorsett4_3h2s,hybrid/lawson42-gen-mod_1h4s,hybrid/lawson43-gen-mod_2h4s,hybrid/lawson44-gen-mod_3h4s,hybrid/lawson45-gen-mod_4h4s,linear/ralston_2s,linear/ralston_3s,linear/ralston_4s,linear/midpoint_2s,linear/heun_2s,linear/heun_3s,linear/houwen-wray_3s,linear/kutta_3s,linear/ssprk3_3s,linear/ssprk4_4s,linear/rk38_4s,linear/rk4_4s,linear/rk5_7s,linear/rk6_7s,linear/bogacki-shampine_4s,linear/bogacki-shampine_7s,linear/dormand-prince_6s,linear/dormand-prince_13s,linear/tsi_7s,linear/euler,diag_implicit/irk_exp_diag_2s,diag_implicit/kraaijevanger_spijker_2s,diag_implicit/qin_zhang_2s,diag_implicit/pareschi_russo_2s,diag_implicit/pareschi_russo_alt_2s,diag_implicit/crouzeix_2s,diag_implicit/crouzeix_3s,diag_implicit/crouzeix_3s_alt,fully_implicit/gauss-legendre_2s,fully_implicit/gauss-legendre_3s,fully_implicit/gauss-legendre_4s,fully_implicit/gauss-legendre_4s_alternating_a,fully_implicit/gauss-legendre_4s_ascending_a,fully_implicit/gauss-legendre_4s_alt,fully_implicit/gauss-legendre_5s,fully_implicit/gauss-legendre_5s_ascending,fully_implicit/radau_ia_2s,fully_implicit/radau_ia_3s,fully_implicit/radau_iia_2s,fully_implicit/radau_iia_3s,fully_implicit/radau_iia_3s_alt,fully_implicit/radau_iia_5s,fully_implicit/radau_iia_7s,fully_implicit/radau_iia_9s,fully_implicit/radau_iia_11s,fully_implicit/lobatto_iiia_2s,fully_implicit/lobatto_iiia_3s,fully_implicit/lobatto_iiia_4s,fully_implicit/lobatto_iiib_2s,fully_implicit/lobatto_iiib_3s,fully_implicit/lobatto_iiib_4s,fully_implicit/lobatto_iiic_2s,fully_implicit/lobatto_iiic_3s,fully_implicit/lobatto_iiic_4s,fully_implicit/lobatto_iiic_star_2s,fully_implicit/lobatto_iiic_star_3s,fully_implicit/lobatto_iiid_2s,fully_implicit/lobatto_iiid_3s | — |
| scheduler | simple,sgm_uniform,karras,exponential,ddim_uniform,beta,normal,linear_quadratic,kl_optimal,bong_tangent,beta57 | — |
| sampler_mode | unsample,standard,resample | — |
| sampler_index | INT | — |
| scheduler_index | INT | — |
| sampler_mode_index | INT | — |
| total_combinations | INT | — |
| label | STRING | — |