{"record":{"id":"9b9daf6617619e00","repo":"lllyasviel/Fooocus","slug":"solver-type-must-be-heun-or-midpoint","errorCode":null,"errorMessage":"solver_type must be 'heun' or 'midpoint'","messagePattern":"solver_type must be 'heun' or 'midpoint'","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"ldm_patched/k_diffusion/sampling.py","lineNumber":600,"sourceCode":"            callback({'x': x, 'i': i, 'sigma': sigmas[i], 'sigma_hat': sigmas[i], 'denoised': denoised})\n        t, t_next = t_fn(sigmas[i]), t_fn(sigmas[i + 1])\n        h = t_next - t\n        if old_denoised is None or sigmas[i + 1] == 0:\n            x = (sigma_fn(t_next) / sigma_fn(t)) * x - (-h).expm1() * denoised\n        else:\n            h_last = t - t_fn(sigmas[i - 1])\n            r = h_last / h\n            denoised_d = (1 + 1 / (2 * r)) * denoised - (1 / (2 * r)) * old_denoised\n            x = (sigma_fn(t_next) / sigma_fn(t)) * x - (-h).expm1() * denoised_d\n        old_denoised = denoised\n    return x\n\n@torch.no_grad()\ndef sample_dpmpp_2m_sde(model, x, sigmas, extra_args=None, callback=None, disable=None, eta=1., s_noise=1., noise_sampler=None, solver_type='midpoint'):\n    \"\"\"DPM-Solver++(2M) SDE.\"\"\"\n\n    if solver_type not in {'heun', 'midpoint'}:\n        raise ValueError('solver_type must be \\'heun\\' or \\'midpoint\\'')\n\n    seed = extra_args.get(\"seed\", None)\n    sigma_min, sigma_max = sigmas[sigmas > 0].min(), sigmas.max()\n    noise_sampler = BrownianTreeNoiseSampler(x, sigma_min, sigma_max, seed=seed, cpu=True) if noise_sampler is None else noise_sampler\n    extra_args = {} if extra_args is None else extra_args\n    s_in = x.new_ones([x.shape[0]])\n\n    old_denoised = None\n    h_last = None\n    h = None\n\n    for i in trange(len(sigmas) - 1, disable=disable):\n        denoised = model(x, sigmas[i] * s_in, **extra_args)\n        if callback is not None:\n            callback({'x': x, 'i': i, 'sigma': sigmas[i], 'sigma_hat': sigmas[i], 'denoised': denoised})\n        if sigmas[i + 1] == 0:\n            # Denoising step\n            x = denoised","sourceCodeStart":582,"sourceCodeEnd":618,"githubUrl":"https://github.com/lllyasviel/Fooocus/blob/ae05379cc97bc4361ec8b4ec90193dab21be763f/ldm_patched/k_diffusion/sampling.py#L582-L618","documentation":"sample_dpmpp_2m_sde implements the 2M SDE variant with two internal derivative predictors — midpoint and Heun — selected by solver_type. The step-update math is written per variant, so any other string raises ValueError before the noise sampler is constructed (the check runs before BrownianTreeNoiseSampler setup).","triggerScenarios":"Calling sample_dpmpp_2m_sude(..., solver_type='heun ') with trailing whitespace, 'midpoint2', 'euler', or capitalized 'Midpoint'; or forwarding a UI dropdown value that does not exactly match.","commonSituations":"Frontends that offer extra solver names for other samplers (e.g. 'ddim', 'euler') and pass them through; hand-typed config strings; copy-paste from sample_dpmpp_sde docs where the accepted set differs.","solutions":["Use solver_type='midpoint' (default) or solver_type='heun'.","Normalize user input: solver_type.strip().lower() before the call.","Validate against {'heun','midpoint'} in your config schema/UI before queueing.","If you wanted a different SDE solver, pick the appropriate sampler function instead of changing solver_type."],"exampleFix":"# before\nx = sample_dpmpp_2m_sde(model, x, sigmas, solver_type='euler')  # ValueError\n\n# after\nx = sample_dpmpp_2m_sde(model, x, sigmas, solver_type='midpoint')","handlingStrategy":"validation","validationCode":"solver_type = solver_type.strip().lower()\nif solver_type not in {'heun', 'midpoint'}:\n    raise ValueError(f\"solver_type must be 'heun' or 'midpoint', got {solver_type!r}\")","typeGuard":"def is_valid_solver_type(s: str) -> bool:\n    return isinstance(s, str) and s.strip().lower() in {'heun', 'midpoint'}","tryCatchPattern":"try:\n    x = sample_dpmpp_2m_sde(model, x, sigmas, solver_type=solver_type)\nexcept ValueError as e:\n    if 'solver_type' in str(e):\n        x = sample_dpmpp_2m_sde(model, x, sigmas, solver_type='midpoint')\n    else:\n        raise","preventionTips":["Restrict solver_type dropdowns to 'heun' and 'midpoint'.","Normalize casing/whitespace on user strings before dispatch.","Validate per-sampler option sets rather than one global options dict."],"tags":["k-diffusion","dpm-solver","sampler-config","sde"],"backgroundTag":null,"analyzedSha":"ae05379cc97bc4361ec8b4ec90193dab21be763f","analyzedAt":"2026-08-15T04:23:59.533Z","schemaVersion":2},"datasetVersion":"2026-08-15T17:31:12.345Z"}