|
|
|
|
|
import torch |
|
|
|
class DifferentialDiffusion(): |
|
@classmethod |
|
def INPUT_TYPES(s): |
|
return {"required": {"model": ("MODEL", ), |
|
}} |
|
RETURN_TYPES = ("MODEL",) |
|
FUNCTION = "apply" |
|
CATEGORY = "_for_testing" |
|
INIT = False |
|
|
|
def apply(self, model): |
|
model = model.clone() |
|
model.set_model_denoise_mask_function(self.forward) |
|
return (model,) |
|
|
|
def forward(self, sigma: torch.Tensor, denoise_mask: torch.Tensor, extra_options: dict): |
|
model = extra_options["model"] |
|
step_sigmas = extra_options["sigmas"] |
|
sigma_to = model.inner_model.model_sampling.sigma_min |
|
if step_sigmas[-1] > sigma_to: |
|
sigma_to = step_sigmas[-1] |
|
sigma_from = step_sigmas[0] |
|
|
|
ts_from = model.inner_model.model_sampling.timestep(sigma_from) |
|
ts_to = model.inner_model.model_sampling.timestep(sigma_to) |
|
current_ts = model.inner_model.model_sampling.timestep(sigma[0]) |
|
|
|
threshold = (current_ts - ts_to) / (ts_from - ts_to) |
|
|
|
return (denoise_mask >= threshold).to(denoise_mask.dtype) |
|
|
|
|
|
NODE_CLASS_MAPPINGS = { |
|
"DifferentialDiffusion": DifferentialDiffusion, |
|
} |
|
NODE_DISPLAY_NAME_MAPPINGS = { |
|
"DifferentialDiffusion": "Differential Diffusion", |
|
} |
|
|