diff --git a/quimb/tensor/decomp.py b/quimb/tensor/decomp.py index 93a08eb5..cc8186a4 100644 --- a/quimb/tensor/decomp.py +++ b/quimb/tensor/decomp.py @@ -185,6 +185,18 @@ def _trim_and_renorm_svd_result( return U, None, VH +@compose +def identity(x, **kwargs): + """ + No-op "decomposition" that leaves the input unchanged. Can be useful to quickly build a tensor network representing a given tensor "as is". + """ + + if x.shape[0] < x.shape[1]: + return do("eye", x.shape[0], like=x), None, x + else: + return x, None, do("eye", x.shape[1], like=x) + + @compose def svd_truncated( x, diff --git a/quimb/tensor/tensor_core.py b/quimb/tensor/tensor_core.py index 39f6d7a6..5efe6255 100644 --- a/quimb/tensor/tensor_core.py +++ b/quimb/tensor/tensor_core.py @@ -325,6 +325,7 @@ def rand_uuid(base=""): _VALID_SPLIT_GET = {None, "arrays", "tensors", "values"} _SPLIT_FNS = { + "identity": decomp.identity, "svd": decomp.svd_truncated, "eig": decomp.svd_via_eig_truncated, "lu": decomp.lu_truncated,