| |
|
|
| 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", |
| } |
|
|