import importlib import json import logging import struct import sys import types from pathlib import Path import pytest import torch from safetensors.torch import load_file, save_file from unifiedefficientloader import IncrementalSafetensorsWriter REPO_ROOT = Path(__file__).resolve().parents[1] PACKAGE_NAME = "modelutils_quant_guard_tests" def _load_module(name): if PACKAGE_NAME not in sys.modules: package = types.ModuleType(PACKAGE_NAME) package.__path__ = [str(REPO_ROOT)] sys.modules[PACKAGE_NAME] = package return importlib.import_module(f"{PACKAGE_NAME}.{name}") @pytest.fixture(scope="module") def modules(): return { "guard": _load_module("nodes.quantization_guard"), "extract": _load_module("nodes.lora_extract_svd"), "resize": _load_module("nodes.lora_resize"), "multi": _load_module("nodes.lora_merger"), "generic": _load_module("nodes.merger"), "operations": _load_module("nodes.merger_ops"), } def _patch_output(monkeypatch, module, output_dir): monkeypatch.setattr(module.folder_paths, "get_folder_paths", lambda _: [str(output_dir)]) monkeypatch.setattr(module.folder_paths, "models_dir", str(output_dir)) monkeypatch.setattr(module, "prepare_for_large_operation", lambda *args, **kwargs: None) monkeypatch.setattr(module, "cleanup_after_operation", lambda: None) def _inspect_file(path, modules, label="input"): handler = modules["resize"].MemoryEfficientSafeOpen(str(path), low_memory=True) try: return modules["guard"].inspect_low_bit_input(handler, label, "Guard Test") finally: handler.__exit__(None, None, None) def _round_trip_preserved(path, output, modules): handler = modules["resize"].MemoryEfficientSafeOpen(str(path), low_memory=True) try: with IncrementalSafetensorsWriter(str(output)) as writer: modules["guard"].write_preserved_tensor(writer, "low", handler) finally: handler.__exit__(None, None, None) return load_file(str(output))["low"] def _tensor_payload(path, key="low"): with open(path, "rb") as source: header_size = struct.unpack("