From 2b4efd70f07f6af3820eb40aac630638073e277b Mon Sep 17 00:00:00 2001 From: Rafael Ballester Date: Wed, 26 Jun 2024 13:54:16 +0200 Subject: [PATCH 1/2] Added an 'identity' tensor splitting option --- quimb/tensor/decomp.py | 13 +++++++++++++ quimb/tensor/tensor_core.py | 1 + 2 files changed, 14 insertions(+) diff --git a/quimb/tensor/decomp.py b/quimb/tensor/decomp.py index 93a08eb5..4ee2eb68 100644 --- a/quimb/tensor/decomp.py +++ b/quimb/tensor/decomp.py @@ -185,6 +185,19 @@ def _trim_and_renorm_svd_result( return U, None, VH +@compose +def identity(x, backend=None, **kwargs): + """ + No-op "decomposition" that leaves the input unchanged. Can be useful to quickly build a tensor network representing a given tensor "as is". + """ + + with backend_like(backend): + if x.shape[0] < x.shape[1]: + return do("eye", x.shape[0]), do("ones", x.shape[0]), x + else: + return x, do("ones", x.shape[1]), do("eye", x.shape[1]) + + @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, From ad301640bd1f8d6274bdc9c56fb05b789bcbce54 Mon Sep 17 00:00:00 2001 From: Rafael Ballester Date: Wed, 11 Sep 2024 18:08:30 +0200 Subject: [PATCH 2/2] PR update --- quimb/tensor/decomp.py | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/quimb/tensor/decomp.py b/quimb/tensor/decomp.py index 4ee2eb68..cc8186a4 100644 --- a/quimb/tensor/decomp.py +++ b/quimb/tensor/decomp.py @@ -186,16 +186,15 @@ def _trim_and_renorm_svd_result( @compose -def identity(x, backend=None, **kwargs): +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". """ - with backend_like(backend): - if x.shape[0] < x.shape[1]: - return do("eye", x.shape[0]), do("ones", x.shape[0]), x - else: - return x, do("ones", x.shape[1]), do("eye", x.shape[1]) + 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