Spaces:
Paused
Paused
| from .context import ContextFuseMethod, ContextOptions, ContextOptionsGroup, ContextSchedules | |
| from .utils_model import BIGMAX | |
| LENGTH_MAX = 128 # keep an eye on these max values; | |
| STRIDE_MAX = 32 # would need to be updated | |
| OVERLAP_MAX = 128 # if new motion modules come out | |
| class LoopedUniformContextOptionsNode: | |
| def INPUT_TYPES(s): | |
| return { | |
| "required": { | |
| "context_length": ("INT", {"default": 16, "min": 1, "max": LENGTH_MAX}), | |
| "context_stride": ("INT", {"default": 1, "min": 1, "max": STRIDE_MAX}), | |
| "context_overlap": ("INT", {"default": 4, "min": 0, "max": OVERLAP_MAX}), | |
| "closed_loop": ("BOOLEAN", {"default": False},), | |
| #"sync_context_to_pe": ("BOOLEAN", {"default": False},), | |
| }, | |
| "optional": { | |
| "fuse_method": (ContextFuseMethod.LIST,), | |
| "use_on_equal_length": ("BOOLEAN", {"default": False},), | |
| "start_percent": ("FLOAT", {"default": 0.0, "min": 0.0, "max": 1.0, "step": 0.001}), | |
| "guarantee_steps": ("INT", {"default": 1, "min": 0, "max": BIGMAX}), | |
| "prev_context": ("CONTEXT_OPTIONS",), | |
| "view_opts": ("VIEW_OPTS",), | |
| } | |
| } | |
| RETURN_TYPES = ("CONTEXT_OPTIONS",) | |
| RETURN_NAMES = ("CONTEXT_OPTS",) | |
| CATEGORY = "Animate Diff ππ π /context opts" | |
| FUNCTION = "create_options" | |
| def create_options(self, context_length: int, context_stride: int, context_overlap: int, closed_loop: bool, | |
| fuse_method: str=ContextFuseMethod.FLAT, use_on_equal_length=False, start_percent: float=0.0, guarantee_steps: int=1, | |
| view_opts: ContextOptions=None, prev_context: ContextOptionsGroup=None): | |
| if prev_context is None: | |
| prev_context = ContextOptionsGroup() | |
| prev_context = prev_context.clone() | |
| context_options = ContextOptions( | |
| context_length=context_length, | |
| context_stride=context_stride, | |
| context_overlap=context_overlap, | |
| context_schedule=ContextSchedules.UNIFORM_LOOPED, | |
| closed_loop=closed_loop, | |
| fuse_method=fuse_method, | |
| use_on_equal_length=use_on_equal_length, | |
| start_percent=start_percent, | |
| guarantee_steps=guarantee_steps, | |
| view_options=view_opts, | |
| ) | |
| #context_options.set_sync_context_to_pe(sync_context_to_pe) | |
| prev_context.add(context_options) | |
| return (prev_context,) | |
| # This Legacy version exists to maintain compatiblity with old workflows | |
| class LegacyLoopedUniformContextOptionsNode: | |
| def INPUT_TYPES(s): | |
| return { | |
| "required": { | |
| "context_length": ("INT", {"default": 16, "min": 1, "max": LENGTH_MAX}), | |
| "context_stride": ("INT", {"default": 1, "min": 1, "max": STRIDE_MAX}), | |
| "context_overlap": ("INT", {"default": 4, "min": 0, "max": OVERLAP_MAX}), | |
| "context_schedule": (ContextSchedules.LEGACY_UNIFORM_SCHEDULE_LIST,), | |
| "closed_loop": ("BOOLEAN", {"default": False},), | |
| #"sync_context_to_pe": ("BOOLEAN", {"default": False},), | |
| }, | |
| "optional": { | |
| "fuse_method": (ContextFuseMethod.LIST, {"default": ContextFuseMethod.FLAT}), | |
| "use_on_equal_length": ("BOOLEAN", {"default": False},), | |
| "start_percent": ("FLOAT", {"default": 0.0, "min": 0.0, "max": 1.0, "step": 0.001}), | |
| "guarantee_steps": ("INT", {"default": 1, "min": 0, "max": BIGMAX}), | |
| "prev_context": ("CONTEXT_OPTIONS",), | |
| "view_opts": ("VIEW_OPTS",), | |
| } | |
| } | |
| RETURN_TYPES = ("CONTEXT_OPTIONS",) | |
| RETURN_NAMES = ("CONTEXT_OPTS",) | |
| CATEGORY = "" # No Category, so will not appear in menu | |
| FUNCTION = "create_options" | |
| def create_options(self, fuse_method: str=ContextFuseMethod.FLAT, context_schedule: str=None, **kwargs): | |
| return LoopedUniformContextOptionsNode.create_options(self, fuse_method=fuse_method, **kwargs) | |
| class StandardUniformContextOptionsNode: | |
| def INPUT_TYPES(s): | |
| return { | |
| "required": { | |
| "context_length": ("INT", {"default": 16, "min": 1, "max": LENGTH_MAX}), | |
| "context_stride": ("INT", {"default": 1, "min": 1, "max": STRIDE_MAX}), | |
| "context_overlap": ("INT", {"default": 4, "min": 0, "max": OVERLAP_MAX}), | |
| }, | |
| "optional": { | |
| "fuse_method": (ContextFuseMethod.LIST,), | |
| "use_on_equal_length": ("BOOLEAN", {"default": False},), | |
| "start_percent": ("FLOAT", {"default": 0.0, "min": 0.0, "max": 1.0, "step": 0.001}), | |
| "guarantee_steps": ("INT", {"default": 1, "min": 0, "max": BIGMAX}), | |
| "prev_context": ("CONTEXT_OPTIONS",), | |
| "view_opts": ("VIEW_OPTS",), | |
| } | |
| } | |
| RETURN_TYPES = ("CONTEXT_OPTIONS",) | |
| RETURN_NAMES = ("CONTEXT_OPTS",) | |
| CATEGORY = "Animate Diff ππ π /context opts" | |
| FUNCTION = "create_options" | |
| def create_options(self, context_length: int, context_stride: int, context_overlap: int, | |
| fuse_method: str=ContextFuseMethod.PYRAMID, use_on_equal_length=False, start_percent: float=0.0, guarantee_steps: int=1, | |
| view_opts: ContextOptions=None, prev_context: ContextOptionsGroup=None): | |
| if prev_context is None: | |
| prev_context = ContextOptionsGroup() | |
| prev_context = prev_context.clone() | |
| context_options = ContextOptions( | |
| context_length=context_length, | |
| context_stride=context_stride, | |
| context_overlap=context_overlap, | |
| context_schedule=ContextSchedules.UNIFORM_STANDARD, | |
| closed_loop=False, | |
| fuse_method=fuse_method, | |
| use_on_equal_length=use_on_equal_length, | |
| start_percent=start_percent, | |
| guarantee_steps=guarantee_steps, | |
| view_options=view_opts, | |
| ) | |
| prev_context.add(context_options) | |
| return (prev_context,) | |
| class StandardStaticContextOptionsNode: | |
| def INPUT_TYPES(s): | |
| return { | |
| "required": { | |
| "context_length": ("INT", {"default": 16, "min": 1, "max": LENGTH_MAX}), | |
| "context_overlap": ("INT", {"default": 4, "min": 0, "max": OVERLAP_MAX}), | |
| }, | |
| "optional": { | |
| "fuse_method": (ContextFuseMethod.LIST_STATIC,), | |
| "use_on_equal_length": ("BOOLEAN", {"default": False},), | |
| "start_percent": ("FLOAT", {"default": 0.0, "min": 0.0, "max": 1.0, "step": 0.001}), | |
| "guarantee_steps": ("INT", {"default": 1, "min": 0, "max": BIGMAX}), | |
| "prev_context": ("CONTEXT_OPTIONS",), | |
| "view_opts": ("VIEW_OPTS",), | |
| } | |
| } | |
| RETURN_TYPES = ("CONTEXT_OPTIONS",) | |
| RETURN_NAMES = ("CONTEXT_OPTS",) | |
| CATEGORY = "Animate Diff ππ π /context opts" | |
| FUNCTION = "create_options" | |
| def create_options(self, context_length: int, context_overlap: int, | |
| fuse_method: str=ContextFuseMethod.PYRAMID, use_on_equal_length=False, start_percent: float=0.0, guarantee_steps: int=1, | |
| view_opts: ContextOptions=None, prev_context: ContextOptionsGroup=None): | |
| if prev_context is None: | |
| prev_context = ContextOptionsGroup() | |
| prev_context = prev_context.clone() | |
| context_options = ContextOptions( | |
| context_length=context_length, | |
| context_stride=None, | |
| context_overlap=context_overlap, | |
| context_schedule=ContextSchedules.STATIC_STANDARD, | |
| fuse_method=fuse_method, | |
| use_on_equal_length=use_on_equal_length, | |
| start_percent=start_percent, | |
| guarantee_steps=guarantee_steps, | |
| view_options=view_opts, | |
| ) | |
| prev_context.add(context_options) | |
| return (prev_context,) | |
| class BatchedContextOptionsNode: | |
| def INPUT_TYPES(s): | |
| return { | |
| "required": { | |
| "context_length": ("INT", {"default": 16, "min": 1, "max": LENGTH_MAX}), | |
| }, | |
| "optional": { | |
| "start_percent": ("FLOAT", {"default": 0.0, "min": 0.0, "max": 1.0, "step": 0.001}), | |
| "guarantee_steps": ("INT", {"default": 1, "min": 0, "max": BIGMAX}), | |
| "prev_context": ("CONTEXT_OPTIONS",), | |
| } | |
| } | |
| RETURN_TYPES = ("CONTEXT_OPTIONS",) | |
| RETURN_NAMES = ("CONTEXT_OPTS",) | |
| CATEGORY = "Animate Diff ππ π /context opts" | |
| FUNCTION = "create_options" | |
| def create_options(self, context_length: int, start_percent: float=0.0, guarantee_steps: int=1, | |
| prev_context: ContextOptionsGroup=None): | |
| if prev_context is None: | |
| prev_context = ContextOptionsGroup() | |
| prev_context = prev_context.clone() | |
| context_options = ContextOptions( | |
| context_length=context_length, | |
| context_overlap=0, | |
| context_schedule=ContextSchedules.BATCHED, | |
| start_percent=start_percent, | |
| guarantee_steps=guarantee_steps, | |
| ) | |
| prev_context.add(context_options) | |
| return (prev_context,) | |
| class ViewAsContextOptionsNode: | |
| def INPUT_TYPES(s): | |
| return { | |
| "required": { | |
| "view_opts_req": ("VIEW_OPTS",), | |
| }, | |
| "optional": { | |
| "start_percent": ("FLOAT", {"default": 0.0, "min": 0.0, "max": 1.0, "step": 0.001}), | |
| "guarantee_steps": ("INT", {"default": 1, "min": 0, "max": BIGMAX}), | |
| "prev_context": ("CONTEXT_OPTIONS",), | |
| } | |
| } | |
| RETURN_TYPES = ("CONTEXT_OPTIONS",) | |
| RETURN_NAMES = ("CONTEXT_OPTS",) | |
| CATEGORY = "Animate Diff ππ π /context opts" | |
| FUNCTION = "create_options" | |
| def create_options(self, view_opts_req: ContextOptions, start_percent: float=0.0, guarantee_steps: int=1, | |
| prev_context: ContextOptionsGroup=None): | |
| if prev_context is None: | |
| prev_context = ContextOptionsGroup() | |
| prev_context = prev_context.clone() | |
| context_options = ContextOptions( | |
| context_schedule=ContextSchedules.VIEW_AS_CONTEXT, | |
| start_percent=start_percent, | |
| guarantee_steps=guarantee_steps, | |
| view_options=view_opts_req, | |
| use_on_equal_length=True | |
| ) | |
| prev_context.add(context_options) | |
| return (prev_context,) | |
| ######################### | |
| # View Options | |
| class StandardStaticViewOptionsNode: | |
| def INPUT_TYPES(s): | |
| return { | |
| "required": { | |
| "view_length": ("INT", {"default": 16, "min": 1, "max": LENGTH_MAX}), | |
| "view_overlap": ("INT", {"default": 4, "min": 0, "max": OVERLAP_MAX}), | |
| }, | |
| "optional": { | |
| "fuse_method": (ContextFuseMethod.LIST,), | |
| } | |
| } | |
| RETURN_TYPES = ("VIEW_OPTS",) | |
| CATEGORY = "Animate Diff ππ π /context opts/view opts" | |
| FUNCTION = "create_options" | |
| def create_options(self, view_length: int, view_overlap: int, | |
| fuse_method: str=ContextFuseMethod.FLAT,): | |
| view_options = ContextOptions( | |
| context_length=view_length, | |
| context_stride=None, | |
| context_overlap=view_overlap, | |
| context_schedule=ContextSchedules.STATIC_STANDARD, | |
| fuse_method=fuse_method, | |
| ) | |
| return (view_options,) | |
| class StandardUniformViewOptionsNode: | |
| def INPUT_TYPES(s): | |
| return { | |
| "required": { | |
| "view_length": ("INT", {"default": 16, "min": 1, "max": LENGTH_MAX}), | |
| "view_stride": ("INT", {"default": 1, "min": 1, "max": STRIDE_MAX}), | |
| "view_overlap": ("INT", {"default": 4, "min": 0, "max": OVERLAP_MAX}), | |
| }, | |
| "optional": { | |
| "fuse_method": (ContextFuseMethod.LIST,), | |
| } | |
| } | |
| RETURN_TYPES = ("VIEW_OPTS",) | |
| CATEGORY = "Animate Diff ππ π /context opts/view opts" | |
| FUNCTION = "create_options" | |
| def create_options(self, view_length: int, view_overlap: int, view_stride: int, | |
| fuse_method: str=ContextFuseMethod.PYRAMID,): | |
| view_options = ContextOptions( | |
| context_length=view_length, | |
| context_stride=view_stride, | |
| context_overlap=view_overlap, | |
| context_schedule=ContextSchedules.UNIFORM_STANDARD, | |
| fuse_method=fuse_method, | |
| ) | |
| return (view_options,) | |
| class LoopedUniformViewOptionsNode: | |
| def INPUT_TYPES(s): | |
| return { | |
| "required": { | |
| "view_length": ("INT", {"default": 16, "min": 1, "max": LENGTH_MAX}), | |
| "view_stride": ("INT", {"default": 1, "min": 1, "max": STRIDE_MAX}), | |
| "view_overlap": ("INT", {"default": 4, "min": 0, "max": OVERLAP_MAX}), | |
| "closed_loop": ("BOOLEAN", {"default": False},), | |
| }, | |
| "optional": { | |
| "fuse_method": (ContextFuseMethod.LIST,), | |
| "use_on_equal_length": ("BOOLEAN", {"default": False},), | |
| } | |
| } | |
| RETURN_TYPES = ("VIEW_OPTS",) | |
| CATEGORY = "Animate Diff ππ π /context opts/view opts" | |
| FUNCTION = "create_options" | |
| def create_options(self, view_length: int, view_overlap: int, view_stride: int, closed_loop: bool, | |
| fuse_method: str=ContextFuseMethod.PYRAMID, use_on_equal_length=False): | |
| view_options = ContextOptions( | |
| context_length=view_length, | |
| context_stride=view_stride, | |
| context_overlap=view_overlap, | |
| context_schedule=ContextSchedules.UNIFORM_LOOPED, | |
| closed_loop=closed_loop, | |
| fuse_method=fuse_method, | |
| use_on_equal_length=use_on_equal_length, | |
| ) | |
| return (view_options,) | |