| from math import copysign | |
| from types import ModuleType | |
| import torch | |
| from .module_injector import get_module_injector | |
| INITIALIZED = False | |
| def _advanced_encode_from_tokens_negpip_wrapper(advanced_encode_from_tokens, from_zero): | |
| def advanced_encode_from_tokens_negpip( | |
| tokenized, | |
| token_normalization, | |
| weight_interpretation, | |
| encode_func, | |
| m_token=266, | |
| length=77, | |
| w_max=1.0, | |
| return_pooled=False, | |
| apply_to_pooled=False, | |
| **extra_args, | |
| ): | |
| tokenized_abs = [[(t, abs(w), p) for t, w, p in x] for x in tokenized] | |
| weights_sign = [[copysign(1, w) for _, w, _ in x] for x in tokenized] | |
| def _encoded_with_negpip(): | |
| tokens = [[(m_token, 1.0) for _ in range(length)]] | |
| emb, _ = encode_func(tokens) | |
| if emb.shape[1] == length: | |
| return False | |
| if emb.shape[1] == length * 2: | |
| return True | |
| raise ValueError( | |
| f"Unknown embedding shape: expected {length} or {length * 2}, but found {emb.shape[1]}. Perhaps you've applied NegPip node more than once?" | |
| ) | |
| encoded_with_negpip = _encoded_with_negpip() | |
| def _encode_func(tokens): | |
| emb, pooled = encode_func(tokens) | |
| if encoded_with_negpip: | |
| return emb[:, 0::2, :], pooled | |
| return emb, pooled | |
| def _apply_negpip(weights_sign, emb): | |
| emb_negpip = torch.empty_like(emb).repeat(1, 2, 1) | |
| emb_negpip[:, 0::2, :] = emb | |
| emb_negpip[:, 1::2, :] = from_zero(weights_sign, emb) | |
| return emb_negpip | |
| weighted_emb, pooled = advanced_encode_from_tokens( | |
| tokenized_abs, | |
| token_normalization, | |
| weight_interpretation, | |
| _encode_func, | |
| m_token, | |
| length, | |
| w_max, | |
| return_pooled, | |
| apply_to_pooled, | |
| **extra_args, | |
| ) | |
| if encoded_with_negpip: | |
| weighted_emb = _apply_negpip(weights_sign, weighted_emb) | |
| return weighted_emb, pooled | |
| return advanced_encode_from_tokens_negpip | |
| def patch_adv_encode(): | |
| global INITIALIZED | |
| if not INITIALIZED: | |
| try: | |
| injector = get_module_injector("ComfyUI_ADV_CLIP_emb") | |
| def _patch(module: ModuleType): | |
| adv_encode = module.adv_encode | |
| advanced_encode_from_tokens_negpip = _advanced_encode_from_tokens_negpip_wrapper( | |
| adv_encode.advanced_encode_from_tokens, adv_encode.from_zero | |
| ) | |
| adv_encode.advanced_encode_from_tokens = advanced_encode_from_tokens_negpip | |
| injector.patch(_patch) | |
| finally: | |
| INITIALIZED = True | |
Xet Storage Details
- Size:
- 2.89 kB
- Xet hash:
- aeafac50936d851394c5b4dc7058acc53b9c4f256c6b98f1dca1036ca2940a2c
·
Xet efficiently stores files, intelligently splitting them into unique chunks and accelerating uploads and downloads. More info.