| """ |
| this code is borrowed from https://github.com/NVlabs/stylegan2-ada-pytorch with few modifications |
| |
| Copyright (c) 2021, NVIDIA CORPORATION. All rights reserved. |
| |
| NVIDIA CORPORATION and its licensors retain all intellectual property |
| and proprietary rights in and to this software, related documentation |
| and any modifications thereto. Any use, reproduction, disclosure or |
| distribution of this software and related documentation without an express |
| license agreement from NVIDIA CORPORATION is strictly prohibited. |
| """ |
|
|
| import warnings |
| import torch |
| import numpy as np |
|
|
|
|
| |
| |
| |
|
|
| _constant_cache = dict() |
|
|
| def constant(value, shape=None, dtype=None, device=None, memory_format=None): |
| value = np.asarray(value) |
| if shape is not None: |
| shape = tuple(shape) |
| if dtype is None: |
| dtype = torch.get_default_dtype() |
| if device is None: |
| device = torch.device("cpu") |
| if memory_format is None: |
| memory_format = torch.contiguous_format |
|
|
| key = (value.shape, value.dtype, value.tobytes(), shape, dtype, device, memory_format) |
| tensor = _constant_cache.get(key, None) |
| if tensor is None: |
| tensor = torch.as_tensor(value.copy(), dtype=dtype, device=device) |
| if shape is not None: |
| tensor, _ = torch.broadcast_tensors(tensor, torch.empty(shape)) |
| tensor = tensor.contiguous(memory_format=memory_format) |
| _constant_cache[key] = tensor |
| return tensor |
|
|
| |
| |
|
|
| try: |
| nan_to_num = torch.nan_to_num |
| except AttributeError: |
| def nan_to_num(input, nan=0.0, posinf=None, neginf=None, *, out=None): |
| assert isinstance(input, torch.Tensor) |
| if posinf is None: |
| posinf = torch.finfo(input.dtype).max |
| if neginf is None: |
| neginf = torch.finfo(input.dtype).min |
| assert nan == 0 |
| return torch.clamp(input.unsqueeze(0).nansum(0), min=neginf, max=posinf, out=out) |
|
|
| |
| |
|
|
| try: |
| symbolic_assert = torch._assert |
| except AttributeError: |
| symbolic_assert = torch.Assert |
|
|
| |
| |
|
|
| class suppress_tracer_warnings(warnings.catch_warnings): |
| def __enter__(self): |
| super().__enter__() |
| warnings.simplefilter("ignore", category=torch.jit.TracerWarning) |
| return self |
|
|
| |
| |
| |
| |
|
|
| def assert_shape(tensor, ref_shape): |
| if tensor.ndim != len(ref_shape): |
| raise AssertionError(f"Wrong number of dimensions: got {tensor.ndim}, expected {len(ref_shape)}") |
| for idx, (size, ref_size) in enumerate(zip(tensor.shape, ref_shape)): |
| if ref_size is None: |
| pass |
| elif isinstance(ref_size, torch.Tensor): |
| with suppress_tracer_warnings(): |
| symbolic_assert(torch.equal(torch.as_tensor(size), ref_size), f"Wrong size for dimension {idx}") |
| elif isinstance(size, torch.Tensor): |
| with suppress_tracer_warnings(): |
| symbolic_assert(torch.equal(size, torch.as_tensor(ref_size)), f"Wrong size for dimension {idx}: expected {ref_size}") |
| elif size != ref_size: |
| raise AssertionError(f"Wrong size for dimension {idx}: got {size}, expected {ref_size}") |
|
|