sunandbean's picture
Add files using upload-large-folder tool
629b123 verified
Raw History Blame Contribute Delete
1.77 kB
# SPDX-FileCopyrightText: © 2026 Tenstorrent AI ULC
# SPDX-License-Identifier: Apache-2.0
from __future__ import annotations
from typing import TYPE_CHECKING, Any
from diffusers.schedulers import FlowMatchEulerDiscreteScheduler, UniPCMultistepScheduler
from .euler import EulerSolver
from .unipc import UniPCSolver, UniPCVariant
if TYPE_CHECKING:
from .base import Solver
class CustomSigmaScheduler:
"""Stand-in for a scheduler, for a pipeline that supplies its own sigmas.
The sigmas are taken exactly as given, so any flow shift belongs to whatever builds them.
Only Euler can be driven this way; UniPC needs its scheduler for the shift and its multistep bookkeeping.
"""
def solver_for_scheduler(scheduler: Any) -> Solver:
"""Return the on-device solver matching `scheduler`, bound to it.
The scheduler determines the solver family, so a pipeline picks its solver by
choosing a scheduler rather than by constructing one directly.
"""
if isinstance(scheduler, CustomSigmaScheduler):
# Resolved to a scheduler-less solver, so the marker never outlives this call.
return EulerSolver()
if isinstance(scheduler, UniPCMultistepScheduler):
if not scheduler.config.use_flow_sigmas:
msg = "UniPCSolver requires a scheduler configured with use_flow_sigmas=True"
raise ValueError(msg)
return UniPCSolver(
order=scheduler.config.solver_order,
variant=UniPCVariant(scheduler.config.solver_type),
scheduler=scheduler,
)
if isinstance(scheduler, FlowMatchEulerDiscreteScheduler):
return EulerSolver(scheduler=scheduler)
msg = f"no solver available for {type(scheduler).__name__}"
raise ValueError(msg)