""" This module defines a singleton object, "patchmatch" that wraps the actual patchmatch object. It respects the global "try_patchmatch" attribute, so that patchmatch loading can be suppressed or deferred """ import numpy as np import invokeai.backend.util.logging as logger from invokeai.app.services.config import InvokeAIAppConfig config = InvokeAIAppConfig.get_config() class PatchMatch: """ Thin class wrapper around the patchmatch function. """ patch_match = None tried_load: bool = False def __init__(self): super().__init__() @classmethod def _load_patch_match(self): if self.tried_load: return if config.try_patchmatch: from patchmatch import patch_match as pm if pm.patchmatch_available: logger.info("Patchmatch initialized") else: logger.info("Patchmatch not loaded (nonfatal)") self.patch_match = pm else: logger.info("Patchmatch loading disabled") self.tried_load = True @classmethod def patchmatch_available(self) -> bool: self._load_patch_match() return self.patch_match and self.patch_match.patchmatch_available @classmethod def inpaint(self, *args, **kwargs) -> np.ndarray: if self.patchmatch_available(): return self.patch_match.inpaint(*args, **kwargs)