Spaces:
Running
on
Zero
Running
on
Zero
from __future__ import annotations | |
import comfy.utils | |
import folder_paths | |
import logging | |
from abc import ABC, abstractmethod | |
from typing import Any | |
import torch | |
class ResourceKey(ABC): | |
Type = Any | |
def __init__(self): | |
... | |
class TorchDictFolderFilename(ResourceKey): | |
'''Key for requesting a torch file via file_name from a folder category.''' | |
Type = dict[str, torch.Tensor] | |
def __init__(self, folder_name: str, file_name: str): | |
self.folder_name = folder_name | |
self.file_name = file_name | |
def __hash__(self): | |
return hash((self.folder_name, self.file_name)) | |
def __eq__(self, other: object) -> bool: | |
if not isinstance(other, TorchDictFolderFilename): | |
return False | |
return self.folder_name == other.folder_name and self.file_name == other.file_name | |
def __str__(self): | |
return f"{self.folder_name} -> {self.file_name}" | |
class Resources(ABC): | |
def __init__(self): | |
... | |
def get(self, key: ResourceKey, default: Any=...) -> Any: | |
pass | |
class ResourcesLocal(Resources): | |
def __init__(self): | |
super().__init__() | |
self.local_resources: dict[ResourceKey, Any] = {} | |
def get(self, key: ResourceKey, default: Any=...) -> Any: | |
cached = self.local_resources.get(key, None) | |
if cached is not None: | |
logging.info(f"Using cached resource '{key}'") | |
return cached | |
logging.info(f"Loading resource '{key}'") | |
to_return = None | |
if isinstance(key, TorchDictFolderFilename): | |
if default is ...: | |
to_return = comfy.utils.load_torch_file(folder_paths.get_full_path_or_raise(key.folder_name, key.file_name), safe_load=True) | |
else: | |
full_path = folder_paths.get_full_path(key.folder_name, key.file_name) | |
if full_path is not None: | |
to_return = comfy.utils.load_torch_file(full_path, safe_load=True) | |
if to_return is not None: | |
self.local_resources[key] = to_return | |
return to_return | |
if default is not ...: | |
return default | |
raise Exception(f"Unsupported resource key type: {type(key)}") | |
class _RESOURCES: | |
ResourceKey = ResourceKey | |
TorchDictFolderFilename = TorchDictFolderFilename | |
Resources = Resources | |
ResourcesLocal = ResourcesLocal | |