From ca2964d1acf91f2a38c5a66b51267360f66e1909 Mon Sep 17 00:00:00 2001 From: joserapa98 Date: Tue, 14 May 2024 21:22:51 +0200 Subject: [PATCH 01/14] Add is_conj, is_complex, is_floating_point --- tensorkrowch/components.py | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/tensorkrowch/components.py b/tensorkrowch/components.py index c2a1478..726ad91 100644 --- a/tensorkrowch/components.py +++ b/tensorkrowch/components.py @@ -769,6 +769,36 @@ def is_resultant(self) -> bool: their own tensors or use other node's tensor. """ return not (self._leaf or self._data or self._virtual) + + def is_conj(self) -> bool: + """ + Equivalent to `torch.is_conj() + `_. + """ + tensor = self.tensor + if tensor is None: + return + return tensor.is_conj() + + def is_complex(self) -> bool: + """ + Equivalent to `torch.is_complex() + `_. + """ + tensor = self.tensor + if tensor is None: + return + return tensor.is_complex() + + def is_floating_point(self) -> bool: + """ + Equivalent to `torch.is_floating_point() + `_. + """ + tensor = self.tensor + if tensor is None: + return + return tensor.is_floating_point() def size(self, axis: Optional[Ax] = None) -> Union[Size, int]: """ From bd394dfd549396828884a7543bde50caa7de4971 Mon Sep 17 00:00:00 2001 From: joserapa98 Date: Tue, 14 May 2024 21:25:44 +0200 Subject: [PATCH 02/14] Add conj operation --- tensorkrowch/operations.py | 115 +++++++++++++++++++++++++++++++++++++ 1 file changed, 115 insertions(+) diff --git a/tensorkrowch/operations.py b/tensorkrowch/operations.py index 42408c2..1d26fcf 100644 --- a/tensorkrowch/operations.py +++ b/tensorkrowch/operations.py @@ -11,6 +11,7 @@ * mul * add * sub + * conj Node-like operations: * split @@ -1466,6 +1467,120 @@ def renormalize( AbstractNode.renormalize = renormalize_node +################################## conj ################################## +# MARK: conj +def _check_first_conj(node: AbstractNode) -> Optional[Successor]: + args = (node,) + successors = node._successors.get('conj') + if not successors: + return None + return successors.get(args) + + +def _conj_first(node: AbstractNode) -> Node: + new_node = Node._create_resultant(axes_names=node.axes_names, + name='conj', + network=node._network, + tensor=node.tensor.conj(), + edges=node._edges, + node1_list=node.is_node1()) + + # Create successor + net = node._network + args = (node,) + successor = Successor(node_ref=node.node_ref(), + index=node._tensor_info['index'], + child=new_node) + + # Add successor to parent + if 'conj' in node._successors: + node._successors['conj'].update({args: successor}) + else: + node._successors['conj'] = {args: successor} + + # Add operation to list of performed operations of TN + net._seq_ops.append(('conj', args)) + + # Record in inverse_memory while tracing + if net._tracing: + node._record_in_inverse_memory() + + return new_node + + +def _conj_next(successor: Successor, node: AbstractNode) -> Node: + tensor = node._direct_get_tensor(successor.node_ref, + successor.index) + child = successor.child + child._direct_set_tensor(tensor.conj()) + + # Record in inverse_memory while contracting, if network is traced + # (to delete memory if possible) + if node._network._traced: + node._check_inverse_memory(successor.node_ref) + + return child + + +conj_op = Operation('conj', + _check_first_conj, + _conj_first, + _conj_next) + + +def conj(node: AbstractNode) -> Node: + """ + Returns a view of the node's tensor with a flipped conjugate bit. If the + node has a non-complex dtype, this function returns a new node with the + same tensor. + + See `conj `_ + in the **PyTorch** documentation. + + Parameters + ---------- + node : Node or ParamNode + Node that is to be conjugated. + + Returns + ------- + Node + + Examples + -------- + >>> nodeA = tk.randn((3, 3), dtype=torch.complex64) + >>> conjA = tk.conj(nodeA) + >>> conjA.is_conj() + True + """ + return conj_op(node) + + +conj_node = copy_func(conj) +conj_node.__doc__ = \ + """ + Returns a view of the node's tensor with a flipped conjugate bit. If the + node has a non-complex dtype, this function returns a new node with the + same tensor. + + See `conj `_ + in the **PyTorch** documentation. + + Returns + ------- + Node + + Examples + -------- + >>> nodeA = tk.randn((3, 3), dtype=torch.complex64) + >>> conjA = nodeA.conj() + >>> conjA.is_conj() + True + """ + +AbstractNode.conj = conj_node + + ############################################################################### # NODE-LIKE OPERATIONS # ############################################################################### From cd0b82ede30e6f4d021f6880a256b69b82b88323 Mon Sep 17 00:00:00 2001 From: joserapa98 Date: Tue, 14 May 2024 21:26:04 +0200 Subject: [PATCH 03/14] Fix bug split complex tensor --- tensorkrowch/operations.py | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/tensorkrowch/operations.py b/tensorkrowch/operations.py index 1d26fcf..db6bcc0 100644 --- a/tensorkrowch/operations.py +++ b/tensorkrowch/operations.py @@ -9,8 +9,10 @@ * permute_ (in-place) * tprod * mul + * div * add * sub + * renormalize * conj Node-like operations: @@ -1714,9 +1716,12 @@ def _split_first(node: AbstractNode, u = u[..., :rank] s = s[..., :rank] vh = vh[..., :rank, :] + + if u.is_complex(): + s = s.to(u.dtype) if mode == 'svdr': - phase = torch.sign(torch.randn(s.shape)) + phase = torch.sgn(torch.randn_like(s)) phase = torch.diag_embed(phase) u = u @ phase vh = phase @ vh @@ -1913,9 +1918,12 @@ def _split_next(successor: Successor, u = u[..., :rank] s = s[..., :rank] vh = vh[..., :rank, :] + + if u.is_complex(): + s = s.to(u.dtype) if mode == 'svdr': - phase = torch.sign(torch.randn(s.shape)) + phase = torch.sgn(torch.randn_like(s)) phase = torch.diag_embed(phase) u = u @ phase vh = phase @ vh From b42c7badd7e82f2268d340d45761eb0fbe699478 Mon Sep 17 00:00:00 2001 From: joserapa98 Date: Tue, 14 May 2024 21:26:28 +0200 Subject: [PATCH 04/14] Allow complex dtype in random_unitary --- tensorkrowch/utils.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/tensorkrowch/utils.py b/tensorkrowch/utils.py index 15f3dee..db2554b 100644 --- a/tensorkrowch/utils.py +++ b/tensorkrowch/utils.py @@ -307,14 +307,16 @@ def split_sequence_into_regions(lst: Sequence[int]) -> List[List[int]]: regions.append(current_region) return regions -def random_unitary(n, device: Optional[torch.device] = None): +def random_unitary(n, + device: Optional[torch.device] = None, + dtype: Optional[torch.dtype] = None): """ Returns random unitary matrix from the Haar measure of size n x n. Unitary matrix is created as described in this `paper `_. """ - mat = torch.randn(n, n, device=device) + mat = torch.randn(n, n, device=device, dtype=dtype) q, r = torch.linalg.qr(mat) d = torch.diagonal(r) ph = d / d.abs() From 8cc51ca51e62263d1c848f30c96508cec126146e Mon Sep 17 00:00:00 2001 From: joserapa98 Date: Tue, 14 May 2024 21:26:45 +0200 Subject: [PATCH 05/14] Add conj operation --- tensorkrowch/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tensorkrowch/__init__.py b/tensorkrowch/__init__.py index 1f07f5b..615eb13 100644 --- a/tensorkrowch/__init__.py +++ b/tensorkrowch/__init__.py @@ -34,7 +34,7 @@ from tensorkrowch.operations import get_shared_edges # Not in docs from tensorkrowch.operations import (permute, permute_, tprod, mul, div, add, - sub, renormalize) + sub, renormalize, conj) from tensorkrowch.operations import (split, split_, contract_edges, contract_between, contract_between_, stack, unbind, einsum, stacked_einsum) From 6bcc67c5a3b07299fcf95e620a677d2619c9b69c Mon Sep 17 00:00:00 2001 From: joserapa98 Date: Tue, 14 May 2024 21:27:11 +0200 Subject: [PATCH 06/14] Consider complex dtype --- tensorkrowch/decompositions/svd_decompositions.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/tensorkrowch/decompositions/svd_decompositions.py b/tensorkrowch/decompositions/svd_decompositions.py index afb31fe..4d65dc2 100644 --- a/tensorkrowch/decompositions/svd_decompositions.py +++ b/tensorkrowch/decompositions/svd_decompositions.py @@ -145,6 +145,9 @@ def vec_to_mps(vec: torch.Tensor, tensors.append(u) prev_bond = aux_rank + + if vh.is_complex(): + s = s.to(vh.dtype) vec = torch.diag_embed(s) @ vh tensors.append(vec) @@ -281,6 +284,9 @@ def mat_to_mpo(mat: torch.Tensor, tensors.append(u) prev_bond = aux_rank + + if vh.is_complex(): + s = s.to(vh.dtype) mat = torch.diag_embed(s) @ vh mat = mat.reshape(aux_rank, in_out_dims[-2], in_out_dims[-1]) From 3eaf6178c432602d10e77541b2e39c93462c3c87 Mon Sep 17 00:00:00 2001 From: joserapa98 Date: Tue, 14 May 2024 21:28:24 +0200 Subject: [PATCH 07/14] Fix canonical and unit inits --- tensorkrowch/models/mps.py | 20 ++++++++------------ 1 file changed, 8 insertions(+), 12 deletions(-) diff --git a/tensorkrowch/models/mps.py b/tensorkrowch/models/mps.py index feea9b2..1c34172 100644 --- a/tensorkrowch/models/mps.py +++ b/tensorkrowch/models/mps.py @@ -612,12 +612,10 @@ def _make_canonical(self, device: Optional[torch.device] = None) -> List[torch.T tensor = tensor.reshape(*node_shape) if i == (self._n_features - 1): - if self._boundary == 'obc': - tensor = tensor.t() / tensor.norm() * sqrt(phys_dim) - else: - tensor = tensor / tensor.norm() * sqrt(phys_dim) - else: - tensor = tensor * sqrt(phys_dim) + if (self._boundary == 'obc') and (i == 0): + tensor = tensor[:, 0] + tensor = tensor / tensor.norm() + tensor = tensor * sqrt(phys_dim) tensors.append(tensor) return tensors @@ -654,13 +652,11 @@ def _make_unitaries(self, device: Optional[torch.device] = None) -> List[torch.T if self._boundary == 'obc': if i == 0: - tensors.append(units.squeeze(0)) + units = units.squeeze(0) elif i == (self._n_features - 1): - tensors.append(units.squeeze(-1)) - else: - tensors.append(units) - else: - tensors.append(units) + units = units.squeeze(-1) + tensors.append(units) + return tensors def initialize(self, From 63ca2d7b53a9d6b2fdc3cb5e814dabc33f7b0091 Mon Sep 17 00:00:00 2001 From: joserapa98 Date: Tue, 14 May 2024 21:28:55 +0200 Subject: [PATCH 08/14] Conjugate copied nodes when contracting MPS with itself --- tensorkrowch/models/mps.py | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/tensorkrowch/models/mps.py b/tensorkrowch/models/mps.py index 1c34172..32e6320 100644 --- a/tensorkrowch/models/mps.py +++ b/tensorkrowch/models/mps.py @@ -1312,6 +1312,12 @@ def contract(self, # Connect copies directly to output nodes copied_node['input'] ^ node['input'] + # If MPS nodes are complex, copied nodes are their conjugates + is_complex = copied_nodes[0].is_complex() + if is_complex: + for i, node in enumerate(copied_nodes): + copied_nodes[i] = node.conj() + # Contract output nodes with copies mats_out_env = self._input_contraction( nodes_env=nodes_out_env, @@ -1433,6 +1439,12 @@ def norm(self, copied_nodes = [] for node in all_nodes: copied_nodes.append(node.neighbours('input')) + + # If MPS nodes are complex, copied nodes are their conjugates + is_complex = copied_nodes[0].is_complex() + if is_complex: + for i, node in enumerate(copied_nodes): + copied_nodes[i] = node.conj() # Contract output nodes with copies mats_out_env = self._input_contraction( From fb62fdd63d355a5fc003186e53796db6daa9e232 Mon Sep 17 00:00:00 2001 From: joserapa98 Date: Tue, 14 May 2024 21:30:15 +0200 Subject: [PATCH 09/14] Fix bug entropy ignore small singular values --- tensorkrowch/models/mps.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tensorkrowch/models/mps.py b/tensorkrowch/models/mps.py index 32e6320..e8ead11 100644 --- a/tensorkrowch/models/mps.py +++ b/tensorkrowch/models/mps.py @@ -1683,7 +1683,7 @@ def entropy(self, middle_tensor.shape[-1]), # right full_matrices=False) - s = s[s > 0] + s = s[s.pow(2) > 0] entropy = -(s.pow(2) * s.pow(2).log()).sum() # Rescale From 68a2d1ec720cd9a37c32c3b57ab0846ffc586c3a Mon Sep 17 00:00:00 2001 From: joserapa98 Date: Tue, 14 May 2024 21:31:22 +0200 Subject: [PATCH 10/14] Add tensors method --- tensorkrowch/models/mps_data.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/tensorkrowch/models/mps_data.py b/tensorkrowch/models/mps_data.py index c15dd9d..d9e96b9 100644 --- a/tensorkrowch/models/mps_data.py +++ b/tensorkrowch/models/mps_data.py @@ -289,6 +289,15 @@ def mats_env(self) -> List[AbstractNode]: """Returns the list of nodes in ``mats_env``.""" return self._mats_env + @property + def tensors(self) -> List[torch.Tensor]: + """Returns the list of MPS tensors.""" + mps_tensors = [node.tensor for node in self._mats_env] + if self._boundary == 'obc': + mps_tensors[0] = mps_tensors[0][0, :, :] + mps_tensors[-1] = mps_tensors[-1][:, :, 0] + return mps_tensors + # ------- # Methods # ------- From 264f3ca61fb7a45eeb805cb2eca4221b6cd1b6a8 Mon Sep 17 00:00:00 2001 From: joserapa98 Date: Tue, 14 May 2024 21:32:23 +0200 Subject: [PATCH 11/14] Add dtype option --- tensorkrowch/components.py | 66 +- tensorkrowch/models/mpo.py | 46 +- tensorkrowch/models/mps.py | 290 ++-- tensorkrowch/models/mps_data.py | 40 +- .../decompositions/test_svd_decompositions.py | 132 +- tests/models/test_mps.py | 1443 ++++++++++++++--- tests/test_components.py | 108 +- tests/test_operations.py | 156 +- 8 files changed, 1848 insertions(+), 433 deletions(-) diff --git a/tensorkrowch/components.py b/tensorkrowch/components.py index 726ad91..78885cd 100644 --- a/tensorkrowch/components.py +++ b/tensorkrowch/components.py @@ -450,6 +450,7 @@ def __init__(self, node1_list: Optional[List[bool]] = None, init_method: Optional[Text] = None, device: Optional[torch.device] = None, + dtype: Optional[torch.dtype] = None, **kwargs: float) -> None: super().__init__() @@ -561,7 +562,10 @@ def __init__(self, if shape is not None: if init_method is not None: self._unrestricted_set_tensor( - init_method=init_method, device=device, **kwargs) + init_method=init_method, + device=device, + dtype=dtype, + **kwargs) else: self._unrestricted_set_tensor(tensor=tensor) @@ -1200,9 +1204,10 @@ def disconnect(self, axis: Optional[Ax] = None) -> None: @staticmethod def _make_copy_tensor(shape: Shape, - device: torch.device = torch.device('cpu')) -> Tensor: + device: Optional[torch.device] = None, + dtype: Optional[torch.dtype] = None) -> Tensor: """Returns copy tensor (ones in the "diagonal", zeros elsewhere).""" - copy_tensor = torch.zeros(shape, device=device) + copy_tensor = torch.zeros(shape, device=device, dtype=dtype) rank = len(shape) if rank <= 1: i = 0 @@ -1215,7 +1220,8 @@ def _make_copy_tensor(shape: Shape, def _make_rand_tensor(shape: Shape, low: float = 0., high: float = 1., - device: torch.device = torch.device('cpu')) -> Tensor: + device: Optional[torch.device] = None, + dtype: Optional[torch.dtype] = None) -> Tensor: """Returns tensor whose entries are drawn from the uniform distribution.""" if not isinstance(low, float): raise TypeError('`low` should be float type') @@ -1223,13 +1229,14 @@ def _make_rand_tensor(shape: Shape, raise TypeError('`high` should be float type') if low >= high: raise ValueError('`low` should be strictly smaller than `high`') - return torch.rand(shape, device=device) * (high - low) + low + return torch.rand(shape, device=device, dtype=dtype) * (high - low) + low @staticmethod def _make_randn_tensor(shape: Shape, mean: float = 0., std: float = 1., - device: torch.device = torch.device('cpu')) -> Tensor: + device: Optional[torch.device] = None, + dtype: Optional[torch.dtype] = None) -> Tensor: """Returns tensor whose entries are drawn from the normal distribution.""" if not isinstance(mean, float): raise TypeError('`mean` should be float type') @@ -1237,12 +1244,13 @@ def _make_randn_tensor(shape: Shape, raise TypeError('`std` should be float type') if std <= 0: raise ValueError('`std` should be positive') - return torch.randn(shape, device=device) * std + mean + return torch.randn(shape, device=device, dtype=dtype) * std + mean def make_tensor(self, shape: Optional[Shape] = None, init_method: Text = 'zeros', - device: torch.device = torch.device('cpu'), + device: Optional[torch.device] = None, + dtype: Optional[torch.dtype] = None, **kwargs: float) -> Tensor: """ Returns a tensor that can be put in the node, and is initialized according @@ -1256,6 +1264,8 @@ def make_tensor(self, Initialization method. device : torch.device, optional Device where to initialize the tensor. + dtype : torch.dtype, optional + Dtype of the tensor. kwargs : float Keyword arguments for the different initialization methods: @@ -1277,15 +1287,17 @@ def make_tensor(self, if shape is None: shape = self._shape if init_method == 'zeros': - return torch.zeros(shape, device=device) + return torch.zeros(shape, device=device, dtype=dtype) elif init_method == 'ones': - return torch.ones(shape, device=device) + return torch.ones(shape, device=device, dtype=dtype) elif init_method == 'copy': - return self._make_copy_tensor(shape, device=device) + return self._make_copy_tensor(shape, device=device, dtype=dtype) elif init_method == 'rand': - return self._make_rand_tensor(shape, device=device, **kwargs) + return self._make_rand_tensor(shape, device=device, dtype=dtype, + **kwargs) elif init_method == 'randn': - return self._make_randn_tensor(shape, device=device, **kwargs) + return self._make_randn_tensor(shape, device=device, dtype=dtype, + **kwargs) else: raise ValueError('Choose a valid `init_method`: "zeros", ' '"ones", "copy", "rand", "randn"') @@ -1358,6 +1370,7 @@ def _unrestricted_set_tensor(self, tensor: Optional[Tensor] = None, init_method: Optional[Text] = 'zeros', device: Optional[torch.device] = None, + dtype: Optional[torch.dtype] = None, **kwargs: float) -> None: """ Sets a new node's tensor or creates one with :meth:`make_tensor` and sets @@ -1376,6 +1389,8 @@ def _unrestricted_set_tensor(self, Initialization method. device : torch.device, optional Device where to initialize the tensor. + dtype : torch.dtype, optional + Dtype of the tensor. kwargs : float Keyword arguments for the different initialization methods. See :meth:`make_tensor`. @@ -1383,10 +1398,14 @@ def _unrestricted_set_tensor(self, if tensor is not None: if not isinstance(tensor, Tensor): raise TypeError('`tensor` should be torch.Tensor type') - elif device is not None: + if device is not None: warnings.warn('`device` was specified but is being ignored. ' 'Provide a tensor that is already in the required' ' device') + if dtype is not None: + warnings.warn('`dtype` was specified but is being ignored. ' + 'Provide a tensor that already has the required' + ' dtype') if not self._compatible_shape(tensor): tensor = self._crop_tensor(tensor) @@ -1394,10 +1413,13 @@ def _unrestricted_set_tensor(self, elif init_method is not None: node_tensor = self.tensor - if (device is None) and (node_tensor is not None): - device = node_tensor.device + if node_tensor is not None: + if device is None: + device = node_tensor.device + if dtype is None: + dtype = node_tensor.dtype tensor = self.make_tensor( - init_method=init_method, device=device, **kwargs) + init_method=init_method, device=device, dtype=dtype, **kwargs) correct_format_tensor = self._set_tensor_format(tensor) else: @@ -1410,6 +1432,7 @@ def set_tensor(self, tensor: Optional[Tensor] = None, init_method: Optional[Text] = 'zeros', device: Optional[torch.device] = None, + dtype: Optional[torch.dtype] = None, **kwargs: float) -> None: """ Sets new node's tensor or creates one with :meth:`make_tensor` and sets @@ -1443,6 +1466,8 @@ def set_tensor(self, Initialization method. device : torch.device, optional Device where to initialize the tensor. + dtype : torch.dtype, optional + Dtype of the tensor. kwargs : float Keyword arguments for the different initialization methods. See :meth:`make_tensor`. @@ -1483,6 +1508,7 @@ def set_tensor(self, self._unrestricted_set_tensor(tensor=tensor, init_method=init_method, device=device, + dtype=dtype, **kwargs) else: raise ValueError('Node\'s tensor can only be changed if it is not' @@ -2035,6 +2061,8 @@ class Node(AbstractNode): # MARK: Node Initialization method. device : torch.device, optional Device where to initialize the tensor if ``init_method`` is provided. + dtype : torch.dtype, optional + Dtype of the tensor if ``init_method`` is provided. kwargs : float Keyword arguments for the different initialization methods. See :meth:`AbstractNode.make_tensor`. @@ -2359,6 +2387,8 @@ class ParamNode(AbstractNode): # MARK: ParamNode Initialization method. device : torch.device, optional Device where to initialize the tensor if ``init_method`` is provided. + dtype : torch.dtype, optional + Dtype of the tensor if ``init_method`` is provided. kwargs : float Keyword arguments for the different initialization methods. See :meth:`AbstractNode.make_tensor`. @@ -2440,6 +2470,7 @@ def __init__(self, node1_list: Optional[List[bool]] = None, init_method: Optional[Text] = None, device: Optional[torch.device] = None, + dtype: Optional[torch.dtype] = None, **kwargs: float) -> None: super().__init__(shape=shape, @@ -2455,6 +2486,7 @@ def __init__(self, node1_list=node1_list, init_method=init_method, device=device, + dtype=dtype, **kwargs) # ---------- diff --git a/tensorkrowch/models/mpo.py b/tensorkrowch/models/mpo.py index 332e907..c817474 100644 --- a/tensorkrowch/models/mpo.py +++ b/tensorkrowch/models/mpo.py @@ -81,6 +81,8 @@ class MPO(TensorNetwork): # MARK: MPO explanation of the different initialization methods. device : torch.device, optional Device where to initialize the tensors if ``init_method`` is provided. + dtype : torch.dtype, optional + Dtype of the tensor if ``init_method`` is provided. kwargs : float Keyword arguments for the different initialization methods. See :meth:`~tensorkrowch.AbstractNode.make_tensor`. @@ -121,6 +123,7 @@ def __init__(self, n_batches: int = 1, init_method: Text = 'randn', device: Optional[torch.device] = None, + dtype: Optional[torch.dtype] = None, **kwargs) -> None: super().__init__(name='mpo') @@ -267,6 +270,7 @@ def __init__(self, self.initialize(tensors=tensors, init_method=init_method, device=device, + dtype=dtype, **kwargs) # ---------- @@ -399,6 +403,7 @@ def initialize(self, tensors: Optional[Sequence[torch.Tensor]] = None, init_method: Optional[Text] = 'randn', device: Optional[torch.device] = None, + dtype: Optional[torch.dtype] = None, **kwargs: float) -> None: """ Initializes all the nodes of the :class:`MPO`. It can be called when @@ -408,7 +413,7 @@ def initialize(self, * ``{"zeros", "ones", "copy", "rand", "randn"}``: Each node is initialized calling :meth:`~tensorkrowch.AbstractNode.set_tensor` with - the given method, ``device`` and ``kwargs``. + the given method, ``device``, ``dtype`` and ``kwargs``. Parameters ---------- @@ -422,6 +427,8 @@ def initialize(self, Initialization method. device : torch.device, optional Device where to initialize the tensors if ``init_method`` is provided. + dtype : torch.dtype, optional + Dtype of the tensor if ``init_method`` is provided. kwargs : float Keyword arguments for the different initialization methods. See :meth:`~tensorkrowch.AbstractNode.make_tensor`. @@ -436,6 +443,8 @@ def initialize(self, if device is None: device = tensors[0].device + if dtype is None: + dtype = tensors[0].dtype if len(tensors) == 1: tensors[0] = tensors[0].reshape(1, @@ -446,13 +455,15 @@ def initialize(self, else: # Left node aux_tensor = torch.zeros(*self._mats_env[0].shape, - device=device) + device=device, + dtype=dtype) aux_tensor[0] = tensors[0] tensors[0] = aux_tensor # Right node aux_tensor = torch.zeros(*self._mats_env[-1].shape, - device=device) + device=device, + dtype=dtype) aux_tensor[..., 0, :] = tensors[-1] tensors[-1] = aux_tensor @@ -464,10 +475,13 @@ def initialize(self, for i, node in enumerate(self._mats_env): node.set_tensor(init_method=init_method, device=device, + dtype=dtype, **kwargs) if self._boundary == 'obc': - aux_tensor = torch.zeros(*node.shape, device=device) + aux_tensor = torch.zeros(*node.shape, + device=device, + dtype=dtype) if i == 0: # Left node aux_tensor[0] = node.tensor[0] @@ -477,8 +491,12 @@ def initialize(self, node.tensor = aux_tensor if self._boundary == 'obc': - self._left_node.set_tensor(init_method='copy', device=device) - self._right_node.set_tensor(init_method='copy', device=device) + self._left_node.set_tensor(init_method='copy', + device=device, + dtype=dtype) + self._right_node.set_tensor(init_method='copy', + device=device, + dtype=dtype) def set_data_nodes(self) -> None: """ @@ -515,7 +533,8 @@ def copy(self, share_tensors: bool = False) -> 'MPO': tensors=None, n_batches=self._n_batches, init_method=None, - device=None) + device=None, + dtype=None) new_mpo.name = self.name + '_copy' if share_tensors: for new_node, node in zip(new_mpo._mats_env, self._mats_env): @@ -1025,6 +1044,8 @@ class UMPO(MPO): # MARK: UMPO explanation of the different initialization methods. device : torch.device, optional Device where to initialize the tensors if ``init_method`` is provided. + dtype : torch.dtype, optional + Dtype of the tensor if ``init_method`` is provided. kwargs : float Keyword arguments for the different initialization methods. See :meth:`~tensorkrowch.AbstractNode.make_tensor`. @@ -1053,6 +1074,7 @@ def __init__(self, n_batches: int = 1, init_method: Text = 'randn', device: Optional[torch.device] = None, + dtype: Optional[torch.dtype] = None, **kwargs) -> None: tensors = None @@ -1097,6 +1119,7 @@ def __init__(self, n_batches=n_batches, init_method=init_method, device=device, + dtype=dtype, **kwargs) self.name = 'umpo' @@ -1122,6 +1145,7 @@ def initialize(self, tensors: Optional[Sequence[torch.Tensor]] = None, init_method: Optional[Text] = 'randn', device: Optional[torch.device] = None, + dtype: Optional[torch.dtype] = None, **kwargs: float) -> None: """ Initializes the common tensor of the :class:`UMPO`. It can be called @@ -1131,7 +1155,7 @@ def initialize(self, * ``{"zeros", "ones", "copy", "rand", "randn"}``: The tensor is initialized calling :meth:`~tensorkrowch.AbstractNode.set_tensor` with - the given method, ``device`` and ``kwargs``. + the given method, ``device``, ``dtype`` and ``kwargs``. Parameters ---------- @@ -1143,6 +1167,8 @@ def initialize(self, Initialization method. device : torch.device, optional Device where to initialize the tensors if ``init_method`` is provided. + dtype : torch.dtype, optional + Dtype of the tensor if ``init_method`` is provided. kwargs : float Keyword arguments for the different initialization methods. See :meth:`~tensorkrowch.AbstractNode.make_tensor`. @@ -1153,6 +1179,7 @@ def initialize(self, elif init_method is not None: self.uniform_memory.set_tensor(init_method=init_method, device=device, + dtype=dtype, **kwargs) def copy(self, share_tensors: bool = False) -> 'UMPO': @@ -1180,7 +1207,8 @@ def copy(self, share_tensors: bool = False) -> 'UMPO': tensor=None, n_batches=self._n_batches, init_method=None, - device=None) + device=None, + dtype=None) new_mpo.name = self.name + '_copy' if share_tensors: new_mpo.uniform_memory.tensor = self.uniform_memory.tensor diff --git a/tensorkrowch/models/mps.py b/tensorkrowch/models/mps.py index e8ead11..6f91a76 100644 --- a/tensorkrowch/models/mps.py +++ b/tensorkrowch/models/mps.py @@ -111,6 +111,8 @@ class MPS(TensorNetwork): # MARK: MPS explanation of the different initialization methods. device : torch.device, optional Device where to initialize the tensors if ``init_method`` is provided. + dtype : torch.dtype, optional + Dtype of the tensor if ``init_method`` is provided. kwargs : float Keyword arguments for the different initialization methods. See :meth:`~tensorkrowch.AbstractNode.make_tensor`. @@ -170,6 +172,7 @@ def __init__(self, n_batches: int = 1, init_method: Text = 'randn', device: Optional[torch.device] = None, + dtype: Optional[torch.dtype] = None, **kwargs) -> None: super().__init__(name='mps') @@ -363,6 +366,7 @@ def __init__(self, self.initialize(tensors=tensors, init_method=init_method, device=device, + dtype=dtype, **kwargs) # ---------- @@ -579,7 +583,9 @@ def _make_nodes(self) -> None: if i == self._n_features - 1: self._mats_env[-1]['right'] ^ self._right_node['left'] - def _make_canonical(self, device: Optional[torch.device] = None) -> List[torch.Tensor]: + def _make_canonical(self, + device: Optional[torch.device] = None, + dtype: Optional[torch.dtype] = None) -> List[torch.Tensor]: """ Creates random unitaries to initialize the MPS in canonical form with orthogonality center at the rightmost node. Unitaries in nodes are @@ -607,7 +613,7 @@ def _make_canonical(self, device: Optional[torch.device] = None) -> List[torch.T phys_dim = node_shape[1] size = max(aux_shape[0], aux_shape[1]) - tensor = random_unitary(size, device=device) + tensor = random_unitary(size, device=device, dtype=dtype) tensor = tensor[:min(aux_shape[0], size), :min(aux_shape[1], size)] tensor = tensor.reshape(*node_shape) @@ -620,7 +626,9 @@ def _make_canonical(self, device: Optional[torch.device] = None) -> List[torch.T tensors.append(tensor) return tensors - def _make_unitaries(self, device: Optional[torch.device] = None) -> List[torch.Tensor]: + def _make_unitaries(self, + device: Optional[torch.device] = None, + dtype: Optional[torch.dtype] = None) -> List[torch.Tensor]: """ Creates random unitaries to initialize the MPS nodes as stacks of unitaries. @@ -644,7 +652,7 @@ def _make_unitaries(self, device: Optional[torch.device] = None) -> List[torch.T size_2 = min(node.shape[2], size) for _ in range(node.shape[1]): - tensor = random_unitary(size, device=device) + tensor = random_unitary(size, device=device, dtype=dtype) tensor = tensor[:size_1, :size_2] units.append(tensor) @@ -663,6 +671,7 @@ def initialize(self, tensors: Optional[Sequence[torch.Tensor]] = None, init_method: Optional[Text] = 'randn', device: Optional[torch.device] = None, + dtype: Optional[torch.dtype] = None, **kwargs: float) -> None: """ Initializes all the nodes of the :class:`MPS`. It can be called when @@ -672,7 +681,7 @@ def initialize(self, * ``{"zeros", "ones", "copy", "rand", "randn"}``: Each node is initialized calling :meth:`~tensorkrowch.AbstractNode.set_tensor` with - the given method, ``device`` and ``kwargs``. + the given method, ``device``, ``dtype`` and ``kwargs``. * ``"randn_eye"``: Nodes are initialized as in this `paper `_, adding identities at the @@ -702,14 +711,16 @@ def initialize(self, Initialization method. device : torch.device, optional Device where to initialize the tensors if ``init_method`` is provided. + dtype : torch.dtype, optional + Dtype of the tensor if ``init_method`` is provided. kwargs : float Keyword arguments for the different initialization methods. See :meth:`~tensorkrowch.AbstractNode.make_tensor`. """ if init_method == 'unit': - tensors = self._make_unitaries(device=device) + tensors = self._make_unitaries(device=device, dtype=dtype) elif init_method == 'canonical': - tensors = self._make_canonical(device=device) + tensors = self._make_canonical(device=device, dtype=dtype) if tensors is not None: if len(tensors) != self._n_features: @@ -721,19 +732,23 @@ def initialize(self, if device is None: device = tensors[0].device + if dtype is None: + dtype = tensors[0].dtype if len(tensors) == 1: tensors[0] = tensors[0].reshape(1, -1, 1) else: # Left node aux_tensor = torch.zeros(*self._mats_env[0].shape, - device=device) + device=device, + dtype=dtype) aux_tensor[0] = tensors[0] tensors[0] = aux_tensor # Right node aux_tensor = torch.zeros(*self._mats_env[-1].shape, - device=device) + device=device, + dtype=dtype) aux_tensor[..., 0] = tensors[-1] tensors[-1] = aux_tensor @@ -749,16 +764,20 @@ def initialize(self, for i, node in enumerate(self._mats_env): node.set_tensor(init_method=init_method, device=device, + dtype=dtype, **kwargs) if add_eye: aux_tensor = node.tensor.detach() aux_tensor[:, 0, :] += torch.eye(node.shape[0], node.shape[2], - device=device) + device=device, + dtype=dtype) node.tensor = aux_tensor if self._boundary == 'obc': - aux_tensor = torch.zeros(*node.shape, device=device) + aux_tensor = torch.zeros(*node.shape, + device=device, + dtype=dtype) if i == 0: # Left node aux_tensor[0] = node.tensor[0] @@ -769,8 +788,12 @@ def initialize(self, node.tensor = aux_tensor if self._boundary == 'obc': - self._left_node.set_tensor(init_method='copy', device=device) - self._right_node.set_tensor(init_method='copy', device=device) + self._left_node.set_tensor(init_method='copy', + device=device, + dtype=dtype) + self._right_node.set_tensor(init_method='copy', + device=device, + dtype=dtype) def set_data_nodes(self) -> None: """ @@ -808,7 +831,8 @@ def copy(self, share_tensors: bool = False) -> 'MPS': out_features=self._out_features, n_batches=self._n_batches, init_method=None, - device=None) + device=None, + dtype=None) new_mps.name = self.name + '_copy' if share_tensors: for new_node, node in zip(new_mps._mats_env, self._mats_env): @@ -1221,10 +1245,10 @@ def contract(self, copied_nodes = [] for node in nodes_out_env: copied_node = node.__class__(shape=node._shape, - axes_names=node.axes_names, - name='virtual_result_copy', - network=self, - virtual=True) + axes_names=node.axes_names, + name='virtual_result_copy', + network=self, + virtual=True) copied_node.set_tensor_from(node) copied_nodes.append(copied_node) @@ -1553,10 +1577,14 @@ def partial_density(self, if n_dims >= 1: if n_dims == 1: data = torch.cat(data, dim=-1) - data = basis(data, dim=dims[0]).float().to(self.in_env[0].device) + data = basis(data, dim=dims[0])\ + .to(self.in_env[0].dtype)\ + .to(self.in_env[0].device) elif n_dims > 1: data = [ - basis(dat, dim=dim).squeeze(-2).float().to(self.in_env[0].device) + basis(dat, dim=dim).squeeze(-2)\ + .to(self.in_env[0].dtype)\ + .to(self.in_env[0].device) for dat, dim in zip(data, dims) ] @@ -1876,6 +1904,7 @@ def _project_to_bond_dim(self, side: Text = 'right'): """Projects all nodes into a space of dimension ``bond_dim``.""" device = nodes[0].tensor.device + dtype = nodes[0].tensor.dtype if side == 'left': nodes.reverse() @@ -1900,7 +1929,7 @@ def _project_to_bond_dim(self, proj_mat_node.tensor = torch.eye( torch.tensor(phys_dim_lst).prod().int().item(), - bond_dim).view(*phys_dim_lst, -1).to(device) + bond_dim).view(*phys_dim_lst, -1).to(dtype).to(device) for k in range(j + 1): nodes[k]['input'] ^ proj_mat_node[k] @@ -1920,7 +1949,7 @@ def _project_to_bond_dim(self, proj_mat_node.tensor = torch.eye( torch.tensor(phys_dim_lst).prod().int().item(), - bond_dim).view(*phys_dim_lst, -1).to(device) + bond_dim).view(*phys_dim_lst, -1).to(dtype).to(device) for k in range(j + 1): nodes[k]['input'] ^ proj_mat_node[k] @@ -1937,7 +1966,8 @@ def _project_to_bond_dim(self, name=f'proj_vec_node_{side}_({k})', network=self) - proj_vec_node.tensor = torch.eye(phys_dim, 1).squeeze().to(device) + proj_vec_node.tensor = torch.eye(phys_dim, 1).squeeze()\ + .to(dtype).to(device) nodes[k]['input'] ^ proj_vec_node['input'] line_mat_nodes.append(proj_vec_node @ nodes[k]) @@ -2105,6 +2135,8 @@ class UMPS(MPS): # MARK: UMPS explanation of the different initialization methods. device : torch.device, optional Device where to initialize the tensors if ``init_method`` is provided. + dtype : torch.dtype, optional + Dtype of the tensor if ``init_method`` is provided. kwargs : float Keyword arguments for the different initialization methods. See :meth:`~tensorkrowch.AbstractNode.make_tensor`. @@ -2133,6 +2165,7 @@ def __init__(self, n_batches: int = 1, init_method: Text = 'randn', device: Optional[torch.device] = None, + dtype: Optional[torch.dtype] = None, **kwargs) -> None: tensors = None @@ -2174,6 +2207,7 @@ def __init__(self, n_batches=n_batches, init_method=init_method, device=device, + dtype=dtype, **kwargs) self.name = 'umps' @@ -2194,7 +2228,9 @@ def _make_nodes(self) -> None: for node in self._mats_env: node.set_tensor_from(uniform_memory) - def _make_canonical(self, device: Optional[torch.device] = None) -> List[torch.Tensor]: + def _make_canonical(self, + device: Optional[torch.device] = None, + dtype: Optional[torch.dtype] = None) -> List[torch.Tensor]: """ Creates random unitaries to initialize the MPS in canonical form with orthogonality center at the rightmost node. Unitaries in nodes are @@ -2208,13 +2244,15 @@ def _make_canonical(self, device: Optional[torch.device] = None) -> List[torch.T size = max(aux_shape[0], aux_shape[1]) phys_dim = node_shape[1] - tensor = random_unitary(size, device=device) + tensor = random_unitary(size, device=device, dtype=dtype) tensor = tensor[:min(aux_shape[0], size), :min(aux_shape[1], size)] tensor = tensor.reshape(*node_shape) tensor = tensor * sqrt(phys_dim) return tensor - def _make_unitaries(self, device: Optional[torch.device] = None) -> List[torch.Tensor]: + def _make_unitaries(self, + device: Optional[torch.device] = None, + dtype: Optional[torch.dtype] = None) -> List[torch.Tensor]: """ Creates random unitaries to initialize the MPS nodes as stacks of unitaries. @@ -2224,7 +2262,7 @@ def _make_unitaries(self, device: Optional[torch.device] = None) -> List[torch.T units = [] for _ in range(node_shape[1]): - tensor = random_unitary(node_shape[0], device=device) + tensor = random_unitary(node_shape[0], device=device, dtype=dtype) units.append(tensor) tensor = torch.stack(units, dim=1) return tensor @@ -2233,6 +2271,7 @@ def initialize(self, tensors: Optional[Sequence[torch.Tensor]] = None, init_method: Optional[Text] = 'randn', device: Optional[torch.device] = None, + dtype: Optional[torch.dtype] = None, **kwargs: float) -> None: """ Initializes the common tensor of the :class:`UMPS`. It can be called @@ -2242,7 +2281,7 @@ def initialize(self, * ``{"zeros", "ones", "copy", "rand", "randn"}``: The tensor is initialized calling :meth:`~tensorkrowch.AbstractNode.set_tensor` with - the given method, ``device`` and ``kwargs``. + the given method, ``device``, ``dtype`` and ``kwargs``. * ``"randn_eye"``: Tensor is initialized as in this `paper `_, adding identities at the @@ -2269,6 +2308,8 @@ def initialize(self, Initialization method. device : torch.device, optional Device where to initialize the tensors if ``init_method`` is provided. + dtype : torch.dtype, optional + Dtype of the tensor if ``init_method`` is provided. kwargs : float Keyword arguments for the different initialization methods. See :meth:`~tensorkrowch.AbstractNode.make_tensor`. @@ -2276,9 +2317,9 @@ def initialize(self, node = self.uniform_memory if init_method == 'unit': - tensors = [self._make_unitaries(device=device)] + tensors = [self._make_unitaries(device=device, dtype=dtype)] elif init_method == 'canonical': - tensors = [self._make_canonical(device=device)] + tensors = [self._make_canonical(device=device, dtype=dtype)] if tensors is not None: node.tensor = tensors[0] @@ -2291,12 +2332,14 @@ def initialize(self, node.set_tensor(init_method=init_method, device=device, + dtype=dtype, **kwargs) if add_eye: aux_tensor = node.tensor.detach() aux_tensor[:, 0, :] += torch.eye(node.shape[0], node.shape[2], - device=device) + device=device, + dtype=dtype) node.tensor = aux_tensor def copy(self, share_tensors: bool = False) -> 'UMPS': @@ -2325,7 +2368,8 @@ def copy(self, share_tensors: bool = False) -> 'UMPS': out_features=self._out_features, n_batches=self._n_batches, init_method=None, - device=None) + device=None, + dtype=None) new_mps.name = self.name + '_copy' if share_tensors: new_mps.uniform_memory.tensor = self.uniform_memory.tensor @@ -2469,6 +2513,8 @@ class MPSLayer(MPS): # MARK: MPSLayer explanation of the different initialization methods. device : torch.device, optional Device where to initialize the tensors if ``init_method`` is provided. + dtype : torch.dtype, optional + Dtype of the tensor if ``init_method`` is provided. kwargs : float Keyword arguments for the different initialization methods. See :meth:`~tensorkrowch.AbstractNode.make_tensor`. @@ -2510,6 +2556,7 @@ def __init__(self, n_batches: int = 1, init_method: Text = 'randn', device: Optional[torch.device] = None, + dtype: Optional[torch.dtype] = None, **kwargs) -> None: phys_dim = None @@ -2571,6 +2618,7 @@ def __init__(self, n_batches=n_batches, init_method=init_method, device=device, + dtype=dtype, **kwargs) self.name = 'mpslayer' self._in_dim = self._phys_dim[:out_position] + \ @@ -2600,7 +2648,9 @@ def out_node(self) -> ParamNode: """Returns the output node.""" return self._mats_env[self._out_position] - def _make_canonical(self, device: Optional[torch.device] = None) -> List[torch.Tensor]: + def _make_canonical(self, + device: Optional[torch.device] = None, + dtype: Optional[torch.dtype] = None) -> List[torch.Tensor]: """ Creates random unitaries to initialize the MPS in canonical form with orthogonality center at the rightmost node. Unitaries in nodes are @@ -2625,14 +2675,16 @@ def _make_canonical(self, device: Optional[torch.device] = None) -> List[torch.T phys_dim = node_shape[1] size = max(aux_shape[0], aux_shape[1]) - tensor = random_unitary(size, device=device) + tensor = random_unitary(size, device=device, dtype=dtype) tensor = tensor[:min(aux_shape[0], size), :min(aux_shape[1], size)] tensor = tensor.reshape(*node_shape) left_tensors.append(tensor * sqrt(phys_dim)) # Output node - out_tensor = torch.randn(self.out_node.shape, device=device) + out_tensor = torch.randn(self.out_node.shape, + device=device, + dtype=dtype) phys_dim = out_tensor.shape[1] if self._boundary == 'obc': if self._out_position == 0: @@ -2659,7 +2711,7 @@ def _make_canonical(self, device: Optional[torch.device] = None) -> List[torch.T phys_dim = node_shape[1] size = max(aux_shape[0], aux_shape[1]) - tensor = random_unitary(size, device=device) + tensor = random_unitary(size, device=device, dtype=dtype) tensor = tensor[:min(aux_shape[0], size), :min(aux_shape[1], size)] tensor = tensor.reshape(*node_shape) @@ -2670,7 +2722,9 @@ def _make_canonical(self, device: Optional[torch.device] = None) -> List[torch.T tensors = left_tensors + [out_tensor] + right_tensors return tensors - def _make_unitaries(self, device: Optional[torch.device] = None) -> List[torch.Tensor]: + def _make_unitaries(self, + device: Optional[torch.device] = None, + dtype: Optional[torch.dtype] = None) -> List[torch.Tensor]: """ Creates random unitaries to initialize the MPS nodes as stacks of unitaries. @@ -2692,7 +2746,7 @@ def _make_unitaries(self, device: Optional[torch.device] = None) -> List[torch.T size_2 = min(node.shape[2], size) for _ in range(node.shape[1]): - tensor = random_unitary(size, device=device) + tensor = random_unitary(size, device=device, dtype=dtype) tensor = tensor[:size_1, :size_2] units.append(tensor) @@ -2707,7 +2761,9 @@ def _make_unitaries(self, device: Optional[torch.device] = None) -> List[torch.T left_tensors.append(units) # Output node - out_tensor = torch.randn(self.out_node.shape, device=device) + out_tensor = torch.randn(self.out_node.shape, + device=device, + dtype=dtype) if self._boundary == 'obc': if self._out_position == 0: out_tensor = out_tensor[0] @@ -2731,7 +2787,7 @@ def _make_unitaries(self, device: Optional[torch.device] = None) -> List[torch.T size_2 = min(node.shape[2], size) for _ in range(node.shape[1]): - tensor = random_unitary(size, device=device).t() + tensor = random_unitary(size, device=device, dtype=dtype).H tensor = tensor[:size_1, :size_2] units.append(tensor) @@ -2749,63 +2805,12 @@ def _make_unitaries(self, device: Optional[torch.device] = None) -> List[torch.T # All tensors tensors = left_tensors + [out_tensor] + right_tensors return tensors - - def initialize(self, - tensors: Optional[Sequence[torch.Tensor]] = None, - init_method: Optional[Text] = 'randn', - device: Optional[torch.device] = None, - **kwargs: float) -> None: - """ - Initializes all the nodes of the :class:`MPS`. It can be called when - instantiating the model, or to override the existing nodes' tensors. - - There are different methods to initialize the nodes: - - * ``{"zeros", "ones", "copy", "rand", "randn"}``: Each node is - initialized calling :meth:`~tensorkrowch.AbstractNode.set_tensor` with - the given method, ``device`` and ``kwargs``. - - * ``"randn_eye"``: Nodes are initialized as in this - `paper `_, adding identities at the - top of random gaussian tensors. In this case, ``std`` should be - specified with a low value, e.g., ``std = 1e-9``. - - * ``"unit"``: Nodes are initialized as stacks of random unitaries. This, - combined (at least) with an embedding of the inputs as elements of - the computational basis (:func:`~tensorkrowch.embeddings.discretize` - combined with :func:`~tensorkrowch.embeddings.basis`) - - * ``"canonical"```: MPS is initialized in canonical form with a squared - norm `close` to the product of all the physical dimensions (if bond - dimensions are bigger than the powers of the physical dimensions, - the norm could vary). Th orthogonality center is at the rightmost - node. - - Parameters - ---------- - tensors : list[torch.Tensor] or tuple[torch.Tensor], optional - Sequence of tensors to set in each of the MPS nodes. If ``boundary`` - is ``"obc"``, all tensors should be rank-3, except the first and - last ones, which can be rank-2, or rank-1 (if the first and last are - the same). If ``boundary`` is ``"pbc"``, all tensors should be - rank-3. - init_method : {"zeros", "ones", "copy", "rand", "randn", "randn_eye", "unit", "canonical"}, optional - Initialization method. - device : torch.device, optional - Device where to initialize the tensors if ``init_method`` is provided. - kwargs : float - Keyword arguments for the different initialization methods. See - :meth:`~tensorkrowch.AbstractNode.make_tensor`. - """ - if init_method == 'unit': - tensors = self._make_unitaries(device=device) - elif init_method == 'canonical': - tensors = self._make_canonical(device=device) def initialize(self, tensors: Optional[Sequence[torch.Tensor]] = None, init_method: Optional[Text] = 'randn', device: Optional[torch.device] = None, + dtype: Optional[torch.dtype] = None, **kwargs: float) -> None: """ Initializes all the nodes of the :class:`MPSLayer`. It can be called when @@ -2815,7 +2820,7 @@ def initialize(self, * ``{"zeros", "ones", "copy", "rand", "randn"}``: Each node is initialized calling :meth:`~tensorkrowch.AbstractNode.set_tensor` with - the given method, ``device`` and ``kwargs``. + the given method, ``device``, ``dtype`` and ``kwargs``. * ``"randn_eye"``: Nodes are initialized as in this `paper `_, adding identities at the @@ -2844,14 +2849,16 @@ def initialize(self, Initialization method. device : torch.device, optional Device where to initialize the tensors if ``init_method`` is provided. + dtype : torch.dtype, optional + Dtype of the tensor if ``init_method`` is provided. kwargs : float Keyword arguments for the different initialization methods. See :meth:`~tensorkrowch.AbstractNode.make_tensor`. """ if init_method == 'unit': - tensors = self._make_unitaries(device=device) + tensors = self._make_unitaries(device=device, dtype=dtype) elif init_method == 'canonical': - tensors = self._make_canonical(device=device) + tensors = self._make_canonical(device=device, dtype=dtype) if tensors is not None: if len(tensors) != self._n_features: @@ -2863,19 +2870,23 @@ def initialize(self, if device is None: device = tensors[0].device + if dtype is None: + dtype = tensors[0].dtype if len(tensors) == 1: tensors[0] = tensors[0].reshape(1, -1, 1) else: # Left node aux_tensor = torch.zeros(*self._mats_env[0].shape, - device=device) + device=device, + dtype=dtype) aux_tensor[0] = tensors[0] tensors[0] = aux_tensor # Right node aux_tensor = torch.zeros(*self._mats_env[-1].shape, - device=device) + device=device, + dtype=dtype) aux_tensor[..., 0] = tensors[-1] tensors[-1] = aux_tensor @@ -2891,12 +2902,14 @@ def initialize(self, for i, node in enumerate(self._mats_env): node.set_tensor(init_method=init_method, device=device, + dtype=dtype, **kwargs) if add_eye: aux_tensor = node.tensor.detach() eye_tensor = torch.eye(node.shape[0], node.shape[2], - device=device) + device=device, + dtype=dtype) if i == self._out_position: eye_tensor = eye_tensor.unsqueeze(1) eye_tensor = eye_tensor.expand(node.shape) @@ -2906,7 +2919,9 @@ def initialize(self, node.tensor = aux_tensor if self._boundary == 'obc': - aux_tensor = torch.zeros(*node.shape, device=device) + aux_tensor = torch.zeros(*node.shape, + device=device, + dtype=dtype) if i == 0: # Left node aux_tensor[0] = node.tensor[0] @@ -2917,8 +2932,12 @@ def initialize(self, node.tensor = aux_tensor if self._boundary == 'obc': - self._left_node.set_tensor(init_method='copy', device=device) - self._right_node.set_tensor(init_method='copy', device=device) + self._left_node.set_tensor(init_method='copy', + device=device, + dtype=dtype) + self._right_node.set_tensor(init_method='copy', + device=device, + dtype=dtype) def copy(self, share_tensors: bool = False) -> 'MPSLayer': """ @@ -2947,7 +2966,8 @@ def copy(self, share_tensors: bool = False) -> 'MPSLayer': tensors=None, n_batches=self._n_batches, init_method=None, - device=None) + device=None, + dtype=None) new_mps.name = self.name + '_copy' if share_tensors: for new_node, node in zip(new_mps._mats_env, self._mats_env): @@ -3009,6 +3029,8 @@ class UMPSLayer(MPS): # MARK: UMPSLayer explanation of the different initialization methods. device : torch.device, optional Device where to initialize the tensors if ``init_method`` is provided. + dtype : torch.dtype, optional + Dtype of the tensor if ``init_method`` is provided. kwargs : float Keyword arguments for the different initialization methods. See :meth:`~tensorkrowch.AbstractNode.make_tensor`. @@ -3039,6 +3061,7 @@ def __init__(self, n_batches: int = 1, init_method: Text = 'randn', device: Optional[torch.device] = None, + dtype: Optional[torch.dtype] = None, **kwargs) -> None: phys_dim = None @@ -3114,6 +3137,7 @@ def __init__(self, n_batches=n_batches, init_method=init_method, device=device, + dtype=dtype, **kwargs) self.name = 'umpslayer' self._in_dim = self._phys_dim[:out_position] + \ @@ -3162,7 +3186,9 @@ def _make_nodes(self) -> None: for node in in_nodes: node.set_tensor_from(uniform_memory) - def _make_canonical(self, device: Optional[torch.device] = None) -> List[torch.Tensor]: + def _make_canonical(self, + device: Optional[torch.device] = None, + dtype: Optional[torch.dtype] = None) -> List[torch.Tensor]: """ Creates random unitaries to initialize the MPS in canonical form with orthogonality center at the rightmost node. Unitaries in nodes are @@ -3177,18 +3203,22 @@ def _make_canonical(self, device: Optional[torch.device] = None) -> List[torch.T size = max(aux_shape[0], aux_shape[1]) phys_dim = node_shape[1] - uni_tensor = random_unitary(size, device=device) + uni_tensor = random_unitary(size, device=device, dtype=dtype) uni_tensor = uni_tensor[:min(aux_shape[0], size), :min(aux_shape[1], size)] uni_tensor = uni_tensor.reshape(*node_shape) uni_tensor = uni_tensor * sqrt(phys_dim) # Output node - out_tensor = torch.randn(self.out_node.shape, device=device) + out_tensor = torch.randn(self.out_node.shape, + device=device, + dtype=dtype) out_tensor = out_tensor / out_tensor.norm() * sqrt(out_tensor.shape[1]) return [uni_tensor, out_tensor] - def _make_unitaries(self, device: Optional[torch.device] = None) -> List[torch.Tensor]: + def _make_unitaries(self, + device: Optional[torch.device] = None, + dtype: Optional[torch.dtype] = None) -> List[torch.Tensor]: """ Creates random unitaries to initialize the MPS nodes as stacks of unitaries. @@ -3199,7 +3229,9 @@ def _make_unitaries(self, device: Optional[torch.device] = None) -> List[torch.T units = [] for _ in range(node_shape[1]): - tensor = random_unitary(node_shape[0], device=device) + tensor = random_unitary(node_shape[0], + device=device, + dtype=dtype) units.append(tensor) tensors.append(torch.stack(units, dim=1)) @@ -3210,6 +3242,7 @@ def initialize(self, tensors: Optional[Sequence[torch.Tensor]] = None, init_method: Optional[Text] = 'randn', device: Optional[torch.device] = None, + dtype: Optional[torch.dtype] = None, **kwargs: float) -> None: """ Initializes the common tensor of the :class:`UMPSLayer`. It can be called @@ -3219,7 +3252,7 @@ def initialize(self, * ``{"zeros", "ones", "copy", "rand", "randn"}``: The tensor is initialized calling :meth:`~tensorkrowch.AbstractNode.set_tensor` with - the given method, ``device`` and ``kwargs``. + the given method, ``device``, ``dtype`` and ``kwargs``. * ``"randn_eye"``: Tensor is initialized as in this `paper `_, adding identities at the @@ -3247,14 +3280,16 @@ def initialize(self, Initialization method. device : torch.device, optional Device where to initialize the tensors if ``init_method`` is provided. + dtype : torch.dtype, optional + Dtype of the tensor if ``init_method`` is provided. kwargs : float Keyword arguments for the different initialization methods. See :meth:`~tensorkrowch.AbstractNode.make_tensor`. """ if init_method == 'unit': - tensors = self._make_unitaries(device=device) + tensors = self._make_unitaries(device=device, dtype=dtype) elif init_method == 'canonical': - tensors = self._make_canonical(device=device) + tensors = self._make_canonical(device=device, dtype=dtype) if tensors is not None: self.uniform_memory.tensor = tensors[0] @@ -3269,12 +3304,14 @@ def initialize(self, node.set_tensor(init_method=init_method, device=device, + dtype=dtype, **kwargs) if add_eye: aux_tensor = node.tensor.detach() eye_tensor = torch.eye(node.shape[0], node.shape[2], - device=device) + device=device, + dtype=dtype) if i == 0: aux_tensor[:, 0, :] += eye_tensor else: @@ -3309,7 +3346,8 @@ def copy(self, share_tensors: bool = False) -> 'UMPSLayer': tensor=None, n_batches=self._n_batches, init_method=None, - device=None) + device=None, + dtype=None) new_mps.name = self.name + '_copy' if share_tensors: new_mps.uniform_memory.tensor = self.uniform_memory.tensor @@ -3550,6 +3588,8 @@ class ConvMPS(AbstractConvClass, MPS): # MARK: ConvMPS explanation of the different initialization methods. device : torch.device, optional Device where to initialize the tensors if ``init_method`` is provided. + dtype : torch.dtype, optional + Dtype of the tensor if ``init_method`` is provided. kwargs : float Keyword arguments for the different initialization methods. See :meth:`~tensorkrowch.AbstractNode.make_tensor`. @@ -3576,6 +3616,7 @@ def __init__(self, tensors: Optional[Sequence[torch.Tensor]] = None, init_method: Text = 'randn', device: Optional[torch.device] = None, + dtype: Optional[torch.dtype] = None, **kwargs): unfold = self._set_attributes(in_channels=in_channels, @@ -3593,6 +3634,7 @@ def __init__(self, n_batches=2, init_method=init_method, device=device, + dtype=dtype, **kwargs) self.unfold = unfold @@ -3661,7 +3703,8 @@ def copy(self, share_tensors: bool = False) -> 'ConvMPS': boundary=self._boundary, tensors=None, init_method=None, - device=None) + device=None, + dtype=None) new_mps.name = self.name + '_copy' if share_tensors: for new_node, node in zip(new_mps._mats_env, self._mats_env): @@ -3713,6 +3756,8 @@ class ConvUMPS(AbstractConvClass, UMPS): # MARK: ConvUMPS explanation of the different initialization methods. device : torch.device, optional Device where to initialize the tensors if ``init_method`` is provided. + dtype : torch.dtype, optional + Dtype of the tensor if ``init_method`` is provided. kwargs : float Keyword arguments for the different initialization methods. See :meth:`~tensorkrowch.AbstractNode.make_tensor`. @@ -3742,6 +3787,7 @@ def __init__(self, tensor: Optional[torch.Tensor] = None, init_method: Text = 'randn', device: Optional[torch.device] = None, + dtype: Optional[torch.dtype] = None, **kwargs): unfold = self._set_attributes(in_channels=in_channels, @@ -3758,6 +3804,7 @@ def __init__(self, n_batches=2, init_method=init_method, device=device, + dtype=dtype, **kwargs) self.unfold = unfold @@ -3825,7 +3872,8 @@ def copy(self, share_tensors: bool = False) -> 'ConvUMPS': dilation=self.dilation, tensor=None, init_method=None, - device=None) + device=None, + dtype=None) new_mps.name = self.name + '_copy' if share_tensors: new_mps.uniform_memory.tensor = self.uniform_memory.tensor @@ -3893,6 +3941,8 @@ class ConvMPSLayer(AbstractConvClass, MPSLayer): # MARK: ConvMPSLayer explanation of the different initialization methods. device : torch.device, optional Device where to initialize the tensors if ``init_method`` is provided. + dtype : torch.dtype, optional + Dtype of the tensor if ``init_method`` is provided. kwargs : float Keyword arguments for the different initialization methods. See :meth:`~tensorkrowch.AbstractNode.make_tensor`. @@ -3922,6 +3972,7 @@ def __init__(self, tensors: Optional[Sequence[torch.Tensor]] = None, init_method: Text = 'randn', device: Optional[torch.device] = None, + dtype: Optional[torch.dtype] = None, **kwargs): unfold = self._set_attributes(in_channels=in_channels, @@ -3942,6 +3993,7 @@ def __init__(self, n_batches=2, init_method=init_method, device=device, + dtype=dtype, **kwargs) self._out_channels = out_channels @@ -4017,7 +4069,8 @@ def copy(self, share_tensors: bool = False) -> 'ConvMPSLayer': boundary=self._boundary, tensors=None, init_method=None, - device=None) + device=None, + dtype=None) new_mps.name = self.name + '_copy' if share_tensors: for new_node, node in zip(new_mps._mats_env, self._mats_env): @@ -4078,6 +4131,8 @@ class ConvUMPSLayer(AbstractConvClass, UMPSLayer): # MARK: ConvUMPSLayer detailed explanation of the different initialization methods. device : torch.device, optional Device where to initialize the tensors if ``init_method`` is provided. + dtype : torch.dtype, optional + Dtype of the tensor if ``init_method`` is provided. kwargs : float Keyword arguments for the different initialization methods. See :meth:`~tensorkrowch.AbstractNode.make_tensor`. @@ -4110,6 +4165,7 @@ def __init__(self, tensors: Optional[Sequence[torch.Tensor]] = None, init_method: Text = 'randn', device: Optional[torch.device] = None, + dtype: Optional[torch.dtype] = None, **kwargs): unfold = self._set_attributes(in_channels=in_channels, @@ -4129,6 +4185,7 @@ def __init__(self, n_batches=2, init_method=init_method, device=device, + dtype=dtype, **kwargs) self._out_channels = out_channels @@ -4208,7 +4265,8 @@ def copy(self, share_tensors: bool = False) -> 'ConvUMPSLayer': dilation=self.dilation, tensor=None, init_method=None, - device=None) + device=None, + dtype=None) new_mps.name = self.name + '_copy' if share_tensors: new_mps.uniform_memory.tensor = self.uniform_memory.tensor diff --git a/tensorkrowch/models/mps_data.py b/tensorkrowch/models/mps_data.py index d9e96b9..8bfa339 100644 --- a/tensorkrowch/models/mps_data.py +++ b/tensorkrowch/models/mps_data.py @@ -86,6 +86,8 @@ class MPSData(TensorNetwork): # MARK: MPSData :meth:`add_data` to see how to initialize MPS nodes with data tensors. device : torch.device, optional Device where to initialize the tensors if ``init_method`` is provided. + dtype : torch.dtype, optional + Dtype of the tensor if ``init_method`` is provided. kwargs : float Keyword arguments for the different initialization methods. See :meth:`~tensorkrowch.AbstractNode.make_tensor`. @@ -112,6 +114,7 @@ def __init__(self, tensors: Optional[Sequence[torch.Tensor]] = None, init_method: Optional[Text] = None, device: Optional[torch.device] = None, + dtype: Optional[torch.dtype] = None, **kwargs) -> None: super().__init__(name='mps_data') @@ -241,6 +244,7 @@ def __init__(self, self._make_nodes() self.initialize(init_method=init_method, device=device, + dtype=dtype, **kwargs) if tensors is not None: @@ -355,6 +359,7 @@ def _make_nodes(self) -> None: def initialize(self, init_method: Optional[Text] = 'randn', device: Optional[torch.device] = None, + dtype: Optional[torch.dtype] = None, **kwargs: float) -> None: """ Initializes all the nodes of the :class:`MPSData`. It can be called when @@ -364,7 +369,7 @@ def initialize(self, * ``{"zeros", "ones", "copy", "rand", "randn"}``: Each node is initialized calling :meth:`~tensorkrowch.AbstractNode.set_tensor` with - the given method, ``device`` and ``kwargs``. + the given method, ``device``, ``dtype`` and ``kwargs``. Parameters ---------- @@ -373,22 +378,31 @@ def initialize(self, initialize MPS nodes with data tensors. device : torch.device, optional Device where to initialize the tensors if ``init_method`` is provided. + dtype : torch.dtype, optional + Dtype of the tensor if ``init_method`` is provided. kwargs : float Keyword arguments for the different initialization methods. See :meth:`~tensorkrowch.AbstractNode.make_tensor`. """ if self._boundary == 'obc': - self._left_node.set_tensor(init_method='copy', device=device) - self._right_node.set_tensor(init_method='copy', device=device) + self._left_node.set_tensor(init_method='copy', + device=device, + dtype=dtype) + self._right_node.set_tensor(init_method='copy', + device=device, + dtype=dtype) if init_method is not None: for i, node in enumerate(self._mats_env): node.set_tensor(init_method=init_method, device=device, + dtype=dtype, **kwargs) if self._boundary == 'obc': - aux_tensor = torch.zeros(*node.shape, device=device) + aux_tensor = torch.zeros(*node.shape, + device=device, + dtype=dtype) if i == 0: # Left node aux_tensor[..., 0, :, :] = node.tensor[..., 0, :, :] @@ -444,37 +458,45 @@ def add_data(self, data: Sequence[torch.Tensor]) -> None: data = data[:] device = data[0].device + dtype = data[0].dtype for i, node in enumerate(self._mats_env): if self._boundary == 'obc': - aux_tensor = torch.zeros(*node.shape, device=device) if (i == 0) and (i == (self._n_features - 1)): aux_tensor = torch.zeros(*data[i].shape[:-1], *node.shape[-3:], - device=device) + device=device, + dtype=dtype) aux_tensor[..., 0, :, 0] = data[i] data[i] = aux_tensor elif i == 0: aux_tensor = torch.zeros(*data[i].shape[:-2], *node.shape[-3:-1], data[i].shape[-1], - device=device) + device=device, + dtype=dtype) aux_tensor[..., 0, :, :] = data[i] data[i] = aux_tensor elif i == (self._n_features - 1): aux_tensor = torch.zeros(*data[i].shape[:-1], *node.shape[-2:], - device=device) + device=device, + dtype=dtype) aux_tensor[..., 0] = data[i] data[i] = aux_tensor node._direct_set_tensor(data[i]) - # Send left and right nodes to correct device + # Send left and right nodes to correct device and dtype if self._boundary == 'obc': if self._left_node.device != device: self._left_node.tensor = self._left_node.tensor.to(device) + if self._left_node.dtype != dtype: + self._left_node.tensor = self._left_node.tensor.to(dtype) + if self._right_node.device != device: self._right_node.tensor = self._right_node.tensor.to(device) + if self._right_node.dtype != dtype: + self._right_node.tensor = self._right_node.tensor.to(dtype) # Update bond dim if self._boundary == 'obc': diff --git a/tests/decompositions/test_svd_decompositions.py b/tests/decompositions/test_svd_decompositions.py index c454602..7adb682 100644 --- a/tests/decompositions/test_svd_decompositions.py +++ b/tests/decompositions/test_svd_decompositions.py @@ -14,72 +14,76 @@ class TestSVDDecompositions: def test_vec_to_mps(self): for renormalize in [True, False]: - for i in range(1, 6): - dims = torch.randint(low=2, high=10, size=(i,)) - vec = torch.randn(*dims) * 1e-5 - for j in range(i + 1): - tensors = tk.decompositions.vec_to_mps(vec=vec, - n_batches=j, - rank=5, - renormalize=renormalize) - - for k, tensor in enumerate(tensors): - assert tensor.shape[:j] == vec.shape[:j] - if k == 0: - if j < i: - assert tensor.shape[j] == vec.shape[j] - if j < i - 1: - assert tensor.shape[j + 1] <= 5 - elif k < (i - j - 1): - assert tensor.shape[j + 1] == vec.shape[j + k] - assert tensor.shape[j + 2] <= 5 - else: - assert tensor.shape[j + 1] == vec.shape[j + k] - - bond_dims = [tensor.shape[-1] for tensor in tensors[:-1]] - - if i - j > 0: - mps = tk.models.MPSData(tensors=tensors, - n_batches=j) - assert mps.phys_dim == dims[j:].tolist() - assert mps.bond_dim == bond_dims - - if j == 0: - mps = tk.models.MPS(tensors=tensors) - assert mps.phys_dim == dims.tolist() - assert mps.bond_dim == bond_dims + for dtype in [torch.float32, torch.complex64]: + for i in range(1, 6): + dims = torch.randint(low=2, high=10, size=(i,)) + vec = torch.randn(*dims, dtype=dtype) * 1e-5 + for j in range(i + 1): + tensors = tk.decompositions.vec_to_mps(vec=vec, + n_batches=j, + rank=5, + renormalize=renormalize) + + for k, tensor in enumerate(tensors): + assert tensor.shape[:j] == vec.shape[:j] + assert tensor.dtype == dtype + if k == 0: + if j < i: + assert tensor.shape[j] == vec.shape[j] + if j < i - 1: + assert tensor.shape[j + 1] <= 5 + elif k < (i - j - 1): + assert tensor.shape[j + 1] == vec.shape[j + k] + assert tensor.shape[j + 2] <= 5 + else: + assert tensor.shape[j + 1] == vec.shape[j + k] + + bond_dims = [tensor.shape[-1] for tensor in tensors[:-1]] + + if i - j > 0: + mps = tk.models.MPSData(tensors=tensors, + n_batches=j) + assert mps.phys_dim == dims[j:].tolist() + assert mps.bond_dim == bond_dims + + if j == 0: + mps = tk.models.MPS(tensors=tensors) + assert mps.phys_dim == dims.tolist() + assert mps.bond_dim == bond_dims def test_vec_to_mps_accuracy(self): for renormalize in [True, False]: - for i in range(1, 6): - dims = torch.randint(low=2, high=10, size=(i,)) - vec = torch.randn(*dims) * 1e-1 - for j in range(i + 1): - tensors = tk.decompositions.vec_to_mps(vec=vec, - n_batches=j, - cum_percentage=0.9999, - renormalize=renormalize) - - bond_dims = [tensor.shape[-1] for tensor in tensors[:-1]] - - if i - j > 0: - mps = tk.models.MPSData(tensors=tensors, - n_batches=j) - assert mps.phys_dim == dims[j:].tolist() - assert mps.bond_dim == bond_dims - - if j == 0: - mps = tk.models.MPS(tensors=tensors) - assert mps.phys_dim == dims.tolist() - assert mps.bond_dim == bond_dims - - approx_vec = mps.left_node - for node in mps.mats_env + [mps.right_node]: - approx_vec @= node - - approx_vec = approx_vec.tensor - diff = vec - approx_vec - assert diff.norm() < 1e-1 + for dtype in [torch.float32, torch.complex64]: + for i in range(1, 6): + dims = torch.randint(low=2, high=10, size=(i,)) + vec = torch.randn(*dims, dtype=dtype) * 1e-1 + for j in range(i + 1): + tensors = tk.decompositions.vec_to_mps( + vec=vec, + n_batches=j, + cum_percentage=0.9999, + renormalize=renormalize) + + bond_dims = [tensor.shape[-1] for tensor in tensors[:-1]] + + if i - j > 0: + mps = tk.models.MPSData(tensors=tensors, + n_batches=j) + assert mps.phys_dim == dims[j:].tolist() + assert mps.bond_dim == bond_dims + + if j == 0: + mps = tk.models.MPS(tensors=tensors) + assert mps.phys_dim == dims.tolist() + assert mps.bond_dim == bond_dims + + approx_vec = mps.left_node + for node in mps.mats_env + [mps.right_node]: + approx_vec @= node + + approx_vec = approx_vec.tensor + diff = vec - approx_vec + assert diff.norm() < 1e-1 def test_mat_to_mpo(self): for renormalize in [True, False]: @@ -164,7 +168,7 @@ def test_mat_to_mpo_permuted_accuracy(self): diff = mat - approx_mat assert diff.norm() < 1e-1 - def test_mat_to_mpo_permuted_diff_dimsaccuracy(self): + def test_mat_to_mpo_permuted_diff_dims_accuracy(self): for renormalize in [True, False]: # inputs (2, 3, 4, 2) x outputs (3, 5, 7, 2) dims = [2, 3, 4, 2, 3, 5, 7, 2] diff --git a/tests/models/test_mps.py b/tests/models/test_mps.py index a3c0140..5fab322 100644 --- a/tests/models/test_mps.py +++ b/tests/models/test_mps.py @@ -39,7 +39,6 @@ def test_initialize_with_tensors(self): def test_initialize_with_tensors_cuda(self): device = torch.device('cuda:0' if torch.cuda.is_available() else 'cpu') - for n in [1, 2, 5]: # PBC tensors = [torch.randn(10, 2, 10, device=device) for _ in range(n)] @@ -63,6 +62,34 @@ def test_initialize_with_tensors_cuda(self): for node in mps.mats_env: assert node.device == device + def test_initialize_with_tensors_complex(self): + for n in [1, 2, 5]: + # PBC + tensors = [torch.randn(10, 2, 10, + dtype=torch.complex64) for _ in range(n)] + mps = tk.models.MPS(tensors=tensors) + assert mps.n_features == n + assert mps.boundary == 'pbc' + assert mps.phys_dim == [2] * n + assert mps.bond_dim == [10] * n + for node in mps.mats_env: + assert node.dtype == torch.complex64 + assert node.is_complex() + + # OBC + tensors = [torch.randn(10, 2, 10, + dtype=torch.complex64) for _ in range(n)] + tensors[0] = tensors[0][0] + tensors[-1] = tensors[-1][..., 0] + mps = tk.models.MPS(tensors=tensors) + assert mps.n_features == n + assert mps.boundary == 'obc' + assert mps.phys_dim == [2] * n + assert mps.bond_dim == [10] * (n - 1) + for node in mps.mats_env: + assert node.dtype == torch.complex64 + assert node.is_complex() + def test_initialize_with_tensors_ignore_rest(self): tensors = [torch.randn(10, 2, 10) for _ in range(10)] mps = tk.models.MPS(tensors=tensors, @@ -104,23 +131,23 @@ def test_initialize_init_method(self): mps = tk.models.MPS(boundary='pbc', n_features=n, phys_dim=2, - bond_dim=2, + bond_dim=5, init_method=init_method) assert mps.n_features == n assert mps.boundary == 'pbc' assert mps.phys_dim == [2] * n - assert mps.bond_dim == [2] * n + assert mps.bond_dim == [5] * n # OBC mps = tk.models.MPS(boundary='obc', n_features=n, phys_dim=2, - bond_dim=2, + bond_dim=5, init_method=init_method) assert mps.n_features == n assert mps.boundary == 'obc' assert mps.phys_dim == [2] * n - assert mps.bond_dim == [2] * (n - 1) + assert mps.bond_dim == [5] * (n - 1) assert torch.equal(mps.left_node.tensor[0], torch.ones_like(mps.left_node.tensor)[0]) @@ -142,13 +169,13 @@ def test_initialize_init_method_cuda(self): mps = tk.models.MPS(boundary='pbc', n_features=n, phys_dim=2, - bond_dim=2, + bond_dim=5, init_method=init_method, device=device) assert mps.n_features == n assert mps.boundary == 'pbc' assert mps.phys_dim == [2] * n - assert mps.bond_dim == [2] * n + assert mps.bond_dim == [5] * n for node in mps.mats_env: assert node.device == device @@ -156,13 +183,13 @@ def test_initialize_init_method_cuda(self): mps = tk.models.MPS(boundary='obc', n_features=n, phys_dim=2, - bond_dim=2, + bond_dim=5, init_method=init_method, device=device) assert mps.n_features == n assert mps.boundary == 'obc' assert mps.phys_dim == [2] * n - assert mps.bond_dim == [2] * (n - 1) + assert mps.bond_dim == [5] * (n - 1) for node in mps.mats_env: assert node.device == device @@ -176,6 +203,51 @@ def test_initialize_init_method_cuda(self): assert torch.equal(mps.right_node.tensor[1:], torch.zeros_like(mps.right_node.tensor)[1:]) + def test_initialize_init_method_complex(self): + methods = ['zeros', 'ones', 'copy', 'rand', 'randn', + 'randn_eye', 'unit', 'canonical'] + for n in [1, 2, 5]: + for init_method in methods: + # PBC + mps = tk.models.MPS(boundary='pbc', + n_features=n, + phys_dim=2, + bond_dim=5, + init_method=init_method, + dtype=torch.complex64) + assert mps.n_features == n + assert mps.boundary == 'pbc' + assert mps.phys_dim == [2] * n + assert mps.bond_dim == [5] * n + for node in mps.mats_env: + assert node.dtype == torch.complex64 + assert node.is_complex() + + # OBC + mps = tk.models.MPS(boundary='obc', + n_features=n, + phys_dim=2, + bond_dim=5, + init_method=init_method, + dtype=torch.complex64) + assert mps.n_features == n + assert mps.boundary == 'obc' + assert mps.phys_dim == [2] * n + assert mps.bond_dim == [5] * (n - 1) + for node in mps.mats_env: + assert node.dtype == torch.complex64 + assert node.is_complex() + + assert torch.equal(mps.left_node.tensor[0], + torch.ones_like(mps.left_node.tensor)[0]) + assert torch.equal(mps.left_node.tensor[1:], + torch.zeros_like(mps.left_node.tensor)[1:]) + + assert torch.equal(mps.right_node.tensor[0], + torch.ones_like(mps.right_node.tensor)[0]) + assert torch.equal(mps.right_node.tensor[1:], + torch.zeros_like(mps.right_node.tensor)[1:]) + def test_initialize_canonical(self): for n in [1, 2, 5]: # PBC @@ -203,6 +275,7 @@ def test_initialize_canonical(self): assert mps.bond_dim == [2] * (n - 1) # Check it has norm == 2**n + norm = mps.norm() assert mps.norm().isclose(torch.tensor(2. ** n).sqrt()) # Norm is close to 2**n if bond dimension is <= than # physical dimension, otherwise, it will not be exactly 2**n @@ -241,11 +314,50 @@ def test_initialize_canonical_cuda(self): assert node.device == device # Check it has norm == 2**n - norm = mps.norm() assert mps.norm().isclose(torch.tensor(2. ** n).sqrt()) # Norm is close to 2**n if bond dimension is <= than # physical dimension, otherwise, it will not be exactly 2**n + def test_initialize_canonical_complex(self): + for n in [1, 2, 5]: + # PBC + mps = tk.models.MPS(boundary='pbc', + n_features=n, + phys_dim=2, + bond_dim=2, + init_method='canonical', + dtype=torch.complex64) + assert mps.n_features == n + assert mps.boundary == 'pbc' + assert mps.phys_dim == [2] * n + assert mps.bond_dim == [2] * n + for node in mps.mats_env: + assert node.dtype == torch.complex64 + assert node.is_complex() + + # For PBC norm does not have to be 2**n always + + # OBC + mps = tk.models.MPS(boundary='obc', + n_features=n, + phys_dim=2, + bond_dim=2, + init_method='canonical', + dtype=torch.complex64) + assert mps.n_features == n + assert mps.boundary == 'obc' + assert mps.phys_dim == [2] * n + assert mps.bond_dim == [2] * (n - 1) + for node in mps.mats_env: + assert node.dtype == torch.complex64 + assert node.is_complex() + + # Check it has norm == 2**n + assert mps.norm().isclose( + torch.tensor(2. ** n, dtype=torch.complex64).sqrt()) + # Norm is close to 2**n if bond dimension is <= than + # physical dimension, otherwise, it will not be exactly 2**n + def test_in_and_out_features(self): tensors = [torch.randn(10, 2, 10) for _ in range(10)] mps = tk.models.MPS(tensors=tensors, @@ -495,6 +607,52 @@ def test_all_algorithms_cuda(self): result.sum().backward() for node in mps.mats_env: assert node.grad is not None + + def test_all_algorithms_complex(self): + for n_features in [1, 2, 3, 4, 10]: + for boundary in ['obc', 'pbc']: + # batch x n_features x feature_dim + example = torch.randn(1, n_features, 5, dtype=torch.complex64) + data = torch.randn(100, n_features, 5, dtype=torch.complex64) + + mps = tk.models.MPS(n_features=n_features, + phys_dim=5, + bond_dim=2, + boundary=boundary, + dtype=torch.complex64) + + for auto_stack in [True, False]: + for auto_unbind in [True, False]: + for inline_input in [True, False]: + for inline_mats in [True, False]: + for renormalize in [True, False]: + mps.auto_stack = auto_stack + mps.auto_unbind = auto_unbind + + mps.trace(example, + inline_input=inline_input, + inline_mats=inline_mats, + renormalize=renormalize) + result = mps(data, + inline_input=inline_input, + inline_mats=inline_mats, + renormalize=renormalize) + + assert result.shape == (100,) + assert len(mps.edges) == 0 + if boundary == 'obc': + assert len(mps.leaf_nodes) == n_features + 2 + else: + assert len(mps.leaf_nodes) == n_features + assert len(mps.data_nodes) == n_features + if not inline_input and auto_stack: + assert len(mps.virtual_nodes) == 2 + else: + assert len(mps.virtual_nodes) == 1 + + result.sum().abs().backward() + for node in mps.mats_env: + assert node.grad is not None def test_all_algorithms_diff_in_dim(self): for n_features in [1, 2, 3, 4, 6]: @@ -802,7 +960,8 @@ def test_all_algorithms_marginalize_with_list_matrices(self): for node in mps.mats_env: assert node.grad is not None - def test_all_algorithms_marginalize_with_matrix(self): + def test_all_algorithms_marginalize_with_list_matrices_cuda(self): + device = torch.device('cuda:0' if torch.cuda.is_available() else 'cpu') for n_features in [1, 2, 3, 4, 10]: for boundary in ['obc', 'pbc']: in_features = torch.randint(low=0, @@ -811,8 +970,8 @@ def test_all_algorithms_marginalize_with_matrix(self): in_features = list(set(in_features)) # batch x n_features x feature_dim - example = torch.randn(1, len(in_features), 5) - data = torch.randn(100, len(in_features), 5) + example = torch.randn(1, len(in_features), 5, device=device) + data = torch.randn(100, len(in_features), 5, device=device) if example.numel() == 0: example = None @@ -822,9 +981,11 @@ def test_all_algorithms_marginalize_with_matrix(self): phys_dim=5, bond_dim=2, boundary=boundary, - in_features=in_features) + in_features=in_features, + device=device) - embedding_matrix = torch.randn(5, 5) + embedding_matrices = [torch.randn(5, 5, device=device) + for _ in range(len(mps.out_features))] for auto_stack in [True, False]: for auto_unbind in [True, False]: @@ -839,13 +1000,13 @@ def test_all_algorithms_marginalize_with_matrix(self): inline_mats=inline_mats, renormalize=renormalize, marginalize_output=True, - embedding_matrices=embedding_matrix) + embedding_matrices=embedding_matrices) result = mps(data, inline_input=inline_input, inline_mats=inline_mats, renormalize=renormalize, marginalize_output=True, - embedding_matrices=embedding_matrix) + embedding_matrices=embedding_matrices) if in_features: assert result.shape == (100, 100) @@ -873,8 +1034,7 @@ def test_all_algorithms_marginalize_with_matrix(self): for node in mps.mats_env: assert node.grad is not None - def test_all_algorithms_marginalize_with_matrix_cuda(self): - device = torch.device('cuda:0' if torch.cuda.is_available() else 'cpu') + def test_all_algorithms_marginalize_with_list_matrices_complex(self): for n_features in [1, 2, 3, 4, 10]: for boundary in ['obc', 'pbc']: in_features = torch.randint(low=0, @@ -883,8 +1043,8 @@ def test_all_algorithms_marginalize_with_matrix_cuda(self): in_features = list(set(in_features)) # batch x n_features x feature_dim - example = torch.randn(1, len(in_features), 5, device=device) - data = torch.randn(100, len(in_features), 5, device=device) + example = torch.randn(1, len(in_features), 5, dtype=torch.complex64) + data = torch.randn(100, len(in_features), 5, dtype=torch.complex64) if example.numel() == 0: example = None @@ -895,9 +1055,10 @@ def test_all_algorithms_marginalize_with_matrix_cuda(self): bond_dim=2, boundary=boundary, in_features=in_features, - device=device) + dtype=torch.complex64) - embedding_matrix = torch.randn(5, 5, device=device) + embedding_matrices = [torch.randn(5, 5, dtype=torch.complex64) + for _ in range(len(mps.out_features))] for auto_stack in [True, False]: for auto_unbind in [True, False]: @@ -912,13 +1073,13 @@ def test_all_algorithms_marginalize_with_matrix_cuda(self): inline_mats=inline_mats, renormalize=renormalize, marginalize_output=True, - embedding_matrices=embedding_matrix) + embedding_matrices=embedding_matrices) result = mps(data, inline_input=inline_input, inline_mats=inline_mats, renormalize=renormalize, marginalize_output=True, - embedding_matrices=embedding_matrix) + embedding_matrices=embedding_matrices) if in_features: assert result.shape == (100, 100) @@ -942,106 +1103,322 @@ def test_all_algorithms_marginalize_with_matrix_cuda(self): assert len(mps.data_nodes) == len(in_features) - result.sum().backward() + result.sum().abs().backward() for node in mps.mats_env: assert node.grad is not None - def test_all_algorithms_marginalize_with_mpo(self): - for n_features in [1, 2, 3, 4, 10]: - for mps_boundary in ['obc', 'pbc']: - for mpo_boundary in ['obc', 'pbc']: - in_features = torch.randint(low=0, - high=n_features, - size=(n_features // 2,)).tolist() - in_features = list(set(in_features)) - - # batch x n_features x feature_dim - example = torch.randn(1, len(in_features), 5) - data = torch.randn(100, len(in_features), 5) - - if example.numel() == 0: - example = None - data = None - - mps = tk.models.MPS(n_features=n_features, - phys_dim=5, - bond_dim=2, - boundary=mps_boundary, - in_features=in_features) - - mpo = tk.models.MPO(n_features=n_features - len(in_features), - in_dim=5, - out_dim=5, - bond_dim=2, - boundary=mpo_boundary) - - # De-parameterize MPO nodes to only train MPS nodes - mpo = mpo.parameterize(set_param=False, override=True) - - for auto_stack in [True, False]: - for auto_unbind in [True, False]: - for inline_input in [True, False]: - for inline_mats in [True, False]: - for renormalize in [True, False]: - mps.auto_stack = auto_stack - mps.auto_unbind = auto_unbind - - mps.trace(example, - inline_input=inline_input, - inline_mats=inline_mats, - renormalize=renormalize, - marginalize_output=True, - mpo=mpo) - result = mps(data, - inline_input=inline_input, - inline_mats=inline_mats, - renormalize=renormalize, - marginalize_output=True, - mpo=mpo) - - if in_features: - assert result.shape == (100, 100) - else: - assert result.shape == tuple() - - if mps_boundary == 'obc': - if mpo_boundary == 'obc': - leaf = (n_features + 2) + \ - (n_features - len(in_features) + 2) - assert len(mps.leaf_nodes) == leaf - else: - leaf = (n_features + 2) + \ - (n_features - len(in_features)) - assert len(mps.leaf_nodes) == leaf - else: - if mpo_boundary == 'obc': - leaf = n_features + \ - (n_features - len(in_features) + 2) - assert len(mps.leaf_nodes) == leaf - else: - leaf = n_features + \ - (n_features - len(in_features)) - assert len(mps.leaf_nodes) == leaf - - result.sum().backward() - for node in mps.mats_env: - assert node.grad is not None - for node in mpo.mats_env: - assert node.tensor.grad is None - - def test_all_algorithms_marginalize_with_mpo_cuda(self): - device = torch.device('cuda:0' if torch.cuda.is_available() else 'cpu') + def test_all_algorithms_marginalize_with_matrix(self): for n_features in [1, 2, 3, 4, 10]: - for mps_boundary in ['obc', 'pbc']: - for mpo_boundary in ['obc', 'pbc']: - in_features = torch.randint(low=0, + for boundary in ['obc', 'pbc']: + in_features = torch.randint(low=0, high=n_features, size=(n_features // 2,)).tolist() in_features = list(set(in_features)) # batch x n_features x feature_dim - example = torch.randn(1, len(in_features), 5, device=device) - data = torch.randn(100, len(in_features), 5, device=device) + example = torch.randn(1, len(in_features), 5) + data = torch.randn(100, len(in_features), 5) + + if example.numel() == 0: + example = None + data = None + + mps = tk.models.MPS(n_features=n_features, + phys_dim=5, + bond_dim=2, + boundary=boundary, + in_features=in_features) + + embedding_matrix = torch.randn(5, 5) + + for auto_stack in [True, False]: + for auto_unbind in [True, False]: + for inline_input in [True, False]: + for inline_mats in [True, False]: + for renormalize in [True, False]: + mps.auto_stack = auto_stack + mps.auto_unbind = auto_unbind + + mps.trace(example, + inline_input=inline_input, + inline_mats=inline_mats, + renormalize=renormalize, + marginalize_output=True, + embedding_matrices=embedding_matrix) + result = mps(data, + inline_input=inline_input, + inline_mats=inline_mats, + renormalize=renormalize, + marginalize_output=True, + embedding_matrices=embedding_matrix) + + if in_features: + assert result.shape == (100, 100) + + if not inline_input and auto_stack: + assert len(mps.virtual_nodes) == \ + (2 + 2 * len(mps.out_features)) + else: + assert len(mps.virtual_nodes) == \ + (1 + 2 * len(mps.out_features)) + + else: + assert result.shape == tuple() + assert len(mps.virtual_nodes) == \ + 2 * len(mps.out_features) + + if boundary == 'obc': + assert len(mps.leaf_nodes) == n_features + 2 + else: + assert len(mps.leaf_nodes) == n_features + + assert len(mps.data_nodes) == len(in_features) + + result.sum().backward() + for node in mps.mats_env: + assert node.grad is not None + + def test_all_algorithms_marginalize_with_matrix_cuda(self): + device = torch.device('cuda:0' if torch.cuda.is_available() else 'cpu') + for n_features in [1, 2, 3, 4, 10]: + for boundary in ['obc', 'pbc']: + in_features = torch.randint(low=0, + high=n_features, + size=(n_features // 2,)).tolist() + in_features = list(set(in_features)) + + # batch x n_features x feature_dim + example = torch.randn(1, len(in_features), 5, device=device) + data = torch.randn(100, len(in_features), 5, device=device) + + if example.numel() == 0: + example = None + data = None + + mps = tk.models.MPS(n_features=n_features, + phys_dim=5, + bond_dim=2, + boundary=boundary, + in_features=in_features, + device=device) + + embedding_matrix = torch.randn(5, 5, device=device) + + for auto_stack in [True, False]: + for auto_unbind in [True, False]: + for inline_input in [True, False]: + for inline_mats in [True, False]: + for renormalize in [True, False]: + mps.auto_stack = auto_stack + mps.auto_unbind = auto_unbind + + mps.trace(example, + inline_input=inline_input, + inline_mats=inline_mats, + renormalize=renormalize, + marginalize_output=True, + embedding_matrices=embedding_matrix) + result = mps(data, + inline_input=inline_input, + inline_mats=inline_mats, + renormalize=renormalize, + marginalize_output=True, + embedding_matrices=embedding_matrix) + + if in_features: + assert result.shape == (100, 100) + + if not inline_input and auto_stack: + assert len(mps.virtual_nodes) == \ + (2 + 2 * len(mps.out_features)) + else: + assert len(mps.virtual_nodes) == \ + (1 + 2 * len(mps.out_features)) + + else: + assert result.shape == tuple() + assert len(mps.virtual_nodes) == \ + 2 * len(mps.out_features) + + if boundary == 'obc': + assert len(mps.leaf_nodes) == n_features + 2 + else: + assert len(mps.leaf_nodes) == n_features + + assert len(mps.data_nodes) == len(in_features) + + result.sum().backward() + for node in mps.mats_env: + assert node.grad is not None + + def test_all_algorithms_marginalize_with_matrix_complex(self): + for n_features in [1, 2, 3, 4, 10]: + for boundary in ['obc', 'pbc']: + in_features = torch.randint(low=0, + high=n_features, + size=(n_features // 2,)).tolist() + in_features = list(set(in_features)) + + # batch x n_features x feature_dim + example = torch.randn(1, len(in_features), 5, dtype=torch.complex64) + data = torch.randn(100, len(in_features), 5, dtype=torch.complex64) + + if example.numel() == 0: + example = None + data = None + + mps = tk.models.MPS(n_features=n_features, + phys_dim=5, + bond_dim=2, + boundary=boundary, + in_features=in_features, + dtype=torch.complex64) + + embedding_matrix = torch.randn(5, 5, dtype=torch.complex64) + + for auto_stack in [True, False]: + for auto_unbind in [True, False]: + for inline_input in [True, False]: + for inline_mats in [True, False]: + for renormalize in [True, False]: + mps.auto_stack = auto_stack + mps.auto_unbind = auto_unbind + + mps.trace(example, + inline_input=inline_input, + inline_mats=inline_mats, + renormalize=renormalize, + marginalize_output=True, + embedding_matrices=embedding_matrix) + result = mps(data, + inline_input=inline_input, + inline_mats=inline_mats, + renormalize=renormalize, + marginalize_output=True, + embedding_matrices=embedding_matrix) + + if in_features: + assert result.shape == (100, 100) + + if not inline_input and auto_stack: + assert len(mps.virtual_nodes) == \ + (2 + 2 * len(mps.out_features)) + else: + assert len(mps.virtual_nodes) == \ + (1 + 2 * len(mps.out_features)) + + else: + assert result.shape == tuple() + assert len(mps.virtual_nodes) == \ + 2 * len(mps.out_features) + + if boundary == 'obc': + assert len(mps.leaf_nodes) == n_features + 2 + else: + assert len(mps.leaf_nodes) == n_features + + assert len(mps.data_nodes) == len(in_features) + + result.sum().abs().backward() + for node in mps.mats_env: + assert node.grad is not None + + def test_all_algorithms_marginalize_with_mpo(self): + for n_features in [1, 2, 3, 4, 10]: + for mps_boundary in ['obc', 'pbc']: + for mpo_boundary in ['obc', 'pbc']: + in_features = torch.randint(low=0, + high=n_features, + size=(n_features // 2,)).tolist() + in_features = list(set(in_features)) + + # batch x n_features x feature_dim + example = torch.randn(1, len(in_features), 5) + data = torch.randn(100, len(in_features), 5) + + if example.numel() == 0: + example = None + data = None + + mps = tk.models.MPS(n_features=n_features, + phys_dim=5, + bond_dim=2, + boundary=mps_boundary, + in_features=in_features) + + mpo = tk.models.MPO(n_features=n_features - len(in_features), + in_dim=5, + out_dim=5, + bond_dim=2, + boundary=mpo_boundary) + + # De-parameterize MPO nodes to only train MPS nodes + mpo = mpo.parameterize(set_param=False, override=True) + + for auto_stack in [True, False]: + for auto_unbind in [True, False]: + for inline_input in [True, False]: + for inline_mats in [True, False]: + for renormalize in [True, False]: + mps.auto_stack = auto_stack + mps.auto_unbind = auto_unbind + + mps.trace(example, + inline_input=inline_input, + inline_mats=inline_mats, + renormalize=renormalize, + marginalize_output=True, + mpo=mpo) + result = mps(data, + inline_input=inline_input, + inline_mats=inline_mats, + renormalize=renormalize, + marginalize_output=True, + mpo=mpo) + + if in_features: + assert result.shape == (100, 100) + else: + assert result.shape == tuple() + + if mps_boundary == 'obc': + if mpo_boundary == 'obc': + leaf = (n_features + 2) + \ + (n_features - len(in_features) + 2) + assert len(mps.leaf_nodes) == leaf + else: + leaf = (n_features + 2) + \ + (n_features - len(in_features)) + assert len(mps.leaf_nodes) == leaf + else: + if mpo_boundary == 'obc': + leaf = n_features + \ + (n_features - len(in_features) + 2) + assert len(mps.leaf_nodes) == leaf + else: + leaf = n_features + \ + (n_features - len(in_features)) + assert len(mps.leaf_nodes) == leaf + + result.sum().backward() + for node in mps.mats_env: + assert node.grad is not None + for node in mpo.mats_env: + assert node.tensor.grad is None + + def test_all_algorithms_marginalize_with_mpo_cuda(self): + device = torch.device('cuda:0' if torch.cuda.is_available() else 'cpu') + for n_features in [1, 2, 3, 4, 10]: + for mps_boundary in ['obc', 'pbc']: + for mpo_boundary in ['obc', 'pbc']: + in_features = torch.randint(low=0, + high=n_features, + size=(n_features // 2,)).tolist() + in_features = list(set(in_features)) + + # batch x n_features x feature_dim + example = torch.randn(1, len(in_features), 5, device=device) + data = torch.randn(100, len(in_features), 5, device=device) if example.numel() == 0: example = None @@ -1119,6 +1496,96 @@ def test_all_algorithms_marginalize_with_mpo_cuda(self): assert node.grad is not None for node in mpo.mats_env: assert node.tensor.grad is None + + def test_all_algorithms_marginalize_with_mpo_complex(self): + for n_features in [1, 2, 3, 4, 10]: + for mps_boundary in ['obc', 'pbc']: + for mpo_boundary in ['obc', 'pbc']: + in_features = torch.randint(low=0, + high=n_features, + size=(n_features // 2,)).tolist() + in_features = list(set(in_features)) + + # batch x n_features x feature_dim + example = torch.randn(1, len(in_features), 5, dtype=torch.complex64) + data = torch.randn(100, len(in_features), 5, dtype=torch.complex64) + + if example.numel() == 0: + example = None + data = None + + mps = tk.models.MPS(n_features=n_features, + phys_dim=5, + bond_dim=2, + boundary=mps_boundary, + in_features=in_features, + dtype=torch.complex64) + + mpo = tk.models.MPO(n_features=n_features - len(in_features), + in_dim=5, + out_dim=5, + bond_dim=2, + boundary=mpo_boundary, + dtype=torch.complex64) + + # Send mpo to cuda before deparameterizing, so that all + # nodes are still in the state_dict of the model and are + # automatically sent to cuda + # mpo = mpo.to(device) + + # De-parameterize MPO nodes to only train MPS nodes + mpo = mpo.parameterize(set_param=False, override=True) + + for auto_stack in [True, False]: + for auto_unbind in [True, False]: + for inline_input in [True, False]: + for inline_mats in [True, False]: + for renormalize in [True, False]: + mps.auto_stack = auto_stack + mps.auto_unbind = auto_unbind + + mps.trace(example, + inline_input=inline_input, + inline_mats=inline_mats, + renormalize=renormalize, + marginalize_output=True, + mpo=mpo) + result = mps(data, + inline_input=inline_input, + inline_mats=inline_mats, + renormalize=renormalize, + marginalize_output=True, + mpo=mpo) + + if in_features: + assert result.shape == (100, 100) + else: + assert result.shape == tuple() + + if mps_boundary == 'obc': + if mpo_boundary == 'obc': + leaf = (n_features + 2) + \ + (n_features - len(in_features) + 2) + assert len(mps.leaf_nodes) == leaf + else: + leaf = (n_features + 2) + \ + (n_features - len(in_features)) + assert len(mps.leaf_nodes) == leaf + else: + if mpo_boundary == 'obc': + leaf = n_features + \ + (n_features - len(in_features) + 2) + assert len(mps.leaf_nodes) == leaf + else: + leaf = n_features + \ + (n_features - len(in_features)) + assert len(mps.leaf_nodes) == leaf + + result.sum().abs().backward() + for node in mps.mats_env: + assert node.grad is not None + for node in mpo.mats_env: + assert node.tensor.grad is None def test_all_algorithms_no_marginalize(self): for n_features in [1, 2, 3, 4, 10]: @@ -1140,53 +1607,143 @@ def test_all_algorithms_no_marginalize(self): phys_dim=5, bond_dim=2, boundary=boundary, - in_features=in_features) - - for auto_stack in [True, False]: - for auto_unbind in [True, False]: - for inline_input in [True, False]: - for inline_mats in [True, False]: - for renormalize in [True, False]: - mps.auto_stack = auto_stack - mps.auto_unbind = auto_unbind - - mps.trace(example, - inline_input=inline_input, - inline_mats=inline_mats, - renormalize=renormalize) - result = mps(data, - inline_input=inline_input, - inline_mats=inline_mats, - renormalize=renormalize) - - aux_shape = [5] * len(mps.out_features) - if in_features: - aux_shape = [100] + aux_shape - assert result.shape == tuple(aux_shape) - - if not inline_input and auto_stack: - assert len(mps.virtual_nodes) == 2 - else: - assert len(mps.virtual_nodes) == 1 - - else: - assert result.shape == tuple(aux_shape) - assert len(mps.virtual_nodes) == 0 - - assert len(mps.edges) == len(mps.out_features) - - if boundary == 'obc': - assert len(mps.leaf_nodes) == n_features + 2 - else: - assert len(mps.leaf_nodes) == n_features - - assert len(mps.data_nodes) == len(in_features) - - result.sum().backward() - for node in mps.mats_env: - assert node.grad is not None + in_features=in_features) + + for auto_stack in [True, False]: + for auto_unbind in [True, False]: + for inline_input in [True, False]: + for inline_mats in [True, False]: + for renormalize in [True, False]: + mps.auto_stack = auto_stack + mps.auto_unbind = auto_unbind + + mps.trace(example, + inline_input=inline_input, + inline_mats=inline_mats, + renormalize=renormalize) + result = mps(data, + inline_input=inline_input, + inline_mats=inline_mats, + renormalize=renormalize) + + aux_shape = [5] * len(mps.out_features) + if in_features: + aux_shape = [100] + aux_shape + assert result.shape == tuple(aux_shape) + + if not inline_input and auto_stack: + assert len(mps.virtual_nodes) == 2 + else: + assert len(mps.virtual_nodes) == 1 + + else: + assert result.shape == tuple(aux_shape) + assert len(mps.virtual_nodes) == 0 + + assert len(mps.edges) == len(mps.out_features) + + if boundary == 'obc': + assert len(mps.leaf_nodes) == n_features + 2 + else: + assert len(mps.leaf_nodes) == n_features + + assert len(mps.data_nodes) == len(in_features) + + result.sum().backward() + for node in mps.mats_env: + assert node.grad is not None + + def test_norm(self): + for n_features in [1, 2, 3, 4, 10]: + for boundary in ['obc', 'pbc']: + in_features = torch.randint(low=0, + high=n_features, + size=(n_features // 2,)).tolist() + in_features = list(set(in_features)) + in_features.sort() + + # batch x n_features x feature_dim + example = torch.randn(1, len(in_features), 5) + + if example.numel() == 0: + example = None + + mps = tk.models.MPS(n_features=n_features, + phys_dim=5, + bond_dim=2, + boundary=boundary, + in_features=in_features) + mps.trace(example) + + assert mps.resultant_nodes + if in_features: + assert mps.data_nodes + assert mps.in_features == in_features + + for log_scale in [True, False]: + # MPS has to be reset, otherwise norm automatically calls + # the forward method that was traced when contracting the MPS + # with example + mps.reset() + norm = mps.norm(log_scale=log_scale) + assert mps.resultant_nodes + assert not mps.data_nodes + assert mps.in_features == in_features + + norm.sum().backward() + for node in mps.mats_env: + assert node.grad is not None + + # Repeat norm + norm = mps.norm(log_scale=log_scale) + + def test_norm_cuda(self): + device = torch.device('cuda:0' if torch.cuda.is_available() else 'cpu') + for n_features in [1, 2, 3, 4, 10]: + for boundary in ['obc', 'pbc']: + in_features = torch.randint(low=0, + high=n_features, + size=(n_features // 2,)).tolist() + in_features = list(set(in_features)) + in_features.sort() + + # batch x n_features x feature_dim + example = torch.randn(1, len(in_features), 5, device=device) + + if example.numel() == 0: + example = None + + mps = tk.models.MPS(n_features=n_features, + phys_dim=5, + bond_dim=2, + boundary=boundary, + in_features=in_features, + device=device) + mps.trace(example) + + assert mps.resultant_nodes + if in_features: + assert mps.data_nodes + assert mps.in_features == in_features + + for log_scale in [True, False]: + # MPS has to be reset, otherwise norm automatically calls + # the forward method that was traced when contracting the MPS + # with example + mps.reset() + norm = mps.norm(log_scale=log_scale) + assert mps.resultant_nodes + assert not mps.data_nodes + assert mps.in_features == in_features + + norm.sum().backward() + for node in mps.mats_env: + assert node.grad is not None + + # Repeat norm + norm = mps.norm(log_scale=log_scale) - def test_norm(self): + def test_norm_complex(self): for n_features in [1, 2, 3, 4, 10]: for boundary in ['obc', 'pbc']: in_features = torch.randint(low=0, @@ -1196,7 +1753,7 @@ def test_norm(self): in_features.sort() # batch x n_features x feature_dim - example = torch.randn(1, len(in_features), 5) + example = torch.randn(1, len(in_features), 5, dtype=torch.complex64) if example.numel() == 0: example = None @@ -1205,7 +1762,8 @@ def test_norm(self): phys_dim=5, bond_dim=2, boundary=boundary, - in_features=in_features) + in_features=in_features, + dtype=torch.complex64) mps.trace(example) assert mps.resultant_nodes @@ -1223,7 +1781,7 @@ def test_norm(self): assert not mps.data_nodes assert mps.in_features == in_features - norm.sum().backward() + norm.sum().abs().backward() for node in mps.mats_env: assert node.grad is not None @@ -1336,6 +1894,59 @@ def test_partial_density_cuda(self): # Repeat density density = mps.partial_density(trace_sites) + def test_partial_density_complex(self): + for n_features in [1, 2, 3, 4, 5]: + for boundary in ['obc', 'pbc']: + phys_dim = torch.randint(low=2, high=12, + size=(n_features,)).tolist() + bond_dim = torch.randint(low=2, high=10, size=(n_features,)).tolist() + bond_dim = bond_dim[:-1] if boundary == 'obc' else bond_dim + + trace_sites = torch.randint(low=0, + high=n_features, + size=(n_features // 2,)).tolist() + + mps = tk.models.MPS(n_features=n_features, + phys_dim=phys_dim, + bond_dim=bond_dim, + boundary=boundary, + in_features=trace_sites, + dtype=torch.complex64) + + in_dims = [phys_dim[i] for i in mps.in_features] + example = [torch.randn(1, d, dtype=torch.complex64) for d in in_dims] + if example == []: + example = None + + mps.trace(example) + + assert mps.resultant_nodes + if trace_sites: + assert mps.data_nodes + assert set(mps.in_features) == set(trace_sites) + + # MPS has to be reset, otherwise partial_density automatically + # calls the forward method that was traced when contracting the + # MPS with example + mps.reset() + + # Here, trace_sites are now the out_features, + # not the in_features + density = mps.partial_density(trace_sites) + assert mps.resultant_nodes + assert mps.data_nodes + assert set(mps.out_features) == set(trace_sites) + + assert density.shape == \ + tuple([phys_dim[i] for i in mps.in_features] * 2) + + density.sum().abs().backward() + for node in mps.mats_env: + assert node.grad is not None + + # Repeat density + density = mps.partial_density(trace_sites) + def test_entropy(self): for n_features in [1, 2, 3, 4, 10]: for boundary in ['obc', 'pbc']: @@ -1343,12 +1954,13 @@ def test_entropy(self): bond_dim = torch.randint(low=2, high=10, size=(n_features,)).tolist() bond_dim = bond_dim[:-1] if boundary == 'obc' else bond_dim - + mps = tk.models.MPS(n_features=n_features, phys_dim=2, bond_dim=bond_dim, boundary=boundary, - in_features=[]) + in_features=[], + init_method='canonical') mps_tensor = mps() assert mps_tensor.shape == (2,) * n_features @@ -1364,17 +1976,128 @@ def test_entropy(self): assert len(mps.data_nodes) == n_features # Mutual Information - scaled_mi, log_norm = mps.entropy(middle_site=middle_site, - renormalize=True) - mi = mps.entropy(middle_site=middle_site, - renormalize=False) + scaled_entropy, log_norm = mps.entropy(middle_site=middle_site, + renormalize=True) + entropy = mps.entropy(middle_site=middle_site, + renormalize=False) + + assert all([mps.bond_dim[i] <= bond_dim[i] + for i in range(len(bond_dim))]) + + sq_norm = log_norm.exp().pow(2) + approx_entropy = sq_norm * scaled_entropy - sq_norm * 2 * log_norm + assert torch.isclose(entropy, approx_entropy, + rtol=1e-03, atol=1e-05) + + if mps.boundary == 'obc': + assert len(mps.leaf_nodes) == n_features + 2 + else: + assert len(mps.leaf_nodes) == n_features + assert len(mps.data_nodes) == n_features + + mps.unset_data_nodes() + mps.in_features = [] + approx_mps_tensor = mps() + assert approx_mps_tensor.shape == (2,) * n_features + + def test_entropy_cuda(self): + device = torch.device('cuda:0' if torch.cuda.is_available() else 'cpu') + for n_features in [1, 2, 3, 4, 10]: + for boundary in ['obc', 'pbc']: + for middle_site in range(n_features - 1): + bond_dim = torch.randint(low=2, high=10, + size=(n_features,)).tolist() + bond_dim = bond_dim[:-1] if boundary == 'obc' else bond_dim + + mps = tk.models.MPS(n_features=n_features, + phys_dim=2, + bond_dim=bond_dim, + boundary=boundary, + in_features=[], + device=device, + init_method='canonical') + + mps_tensor = mps() + assert mps_tensor.shape == (2,) * n_features + + mps.out_features = [] + example = torch.randn(1, n_features, 2, device=device) + mps.trace(example) + + if mps.boundary == 'obc': + assert len(mps.leaf_nodes) == n_features + 2 + else: + assert len(mps.leaf_nodes) == n_features + assert len(mps.data_nodes) == n_features + + # Mutual Information + scaled_entropy, log_norm = mps.entropy(middle_site=middle_site, + renormalize=True) + entropy = mps.entropy(middle_site=middle_site, + renormalize=False) + + assert all([mps.bond_dim[i] <= bond_dim[i] + for i in range(len(bond_dim))]) + + sq_norm = log_norm.exp().pow(2) + approx_entropy = sq_norm * scaled_entropy - sq_norm * 2 * log_norm + assert torch.isclose(entropy, approx_entropy, + rtol=1e-03, atol=1e-05) + + if mps.boundary == 'obc': + assert len(mps.leaf_nodes) == n_features + 2 + else: + assert len(mps.leaf_nodes) == n_features + assert len(mps.data_nodes) == n_features + + mps.unset_data_nodes() + mps.in_features = [] + approx_mps_tensor = mps() + assert approx_mps_tensor.shape == (2,) * n_features + + def test_entropy_complex(self): + for n_features in [1, 2, 3, 4, 10]: + for boundary in ['obc', 'pbc']: + for middle_site in range(n_features - 1): + bond_dim = torch.randint(low=2, high=10, + size=(n_features,)).tolist() + bond_dim = bond_dim[:-1] if boundary == 'obc' else bond_dim + + mps = tk.models.MPS(n_features=n_features, + phys_dim=2, + bond_dim=bond_dim, + boundary=boundary, + in_features=[], + dtype=torch.complex64, + init_method='canonical') + + mps_tensor = mps() + assert mps_tensor.shape == (2,) * n_features + + mps.out_features = [] + example = torch.randn(1, n_features, 2, + dtype=torch.complex64) + mps.trace(example) + + if mps.boundary == 'obc': + assert len(mps.leaf_nodes) == n_features + 2 + else: + assert len(mps.leaf_nodes) == n_features + assert len(mps.data_nodes) == n_features + + # Mutual Information + scaled_entropy, log_norm = mps.entropy(middle_site=middle_site, + renormalize=True) + entropy = mps.entropy(middle_site=middle_site, + renormalize=False) assert all([mps.bond_dim[i] <= bond_dim[i] for i in range(len(bond_dim))]) sq_norm = log_norm.exp().pow(2) - approx_mi = sq_norm * scaled_mi - sq_norm * 2 * log_norm - assert torch.isclose(mi, approx_mi) + approx_entropy = sq_norm * scaled_entropy - sq_norm * 2 * log_norm + assert torch.isclose(entropy, approx_entropy, + rtol=1e-03, atol=1e-05) if mps.boundary == 'obc': assert len(mps.leaf_nodes) == n_features + 2 @@ -1387,7 +2110,59 @@ def test_entropy(self): approx_mps_tensor = mps() assert approx_mps_tensor.shape == (2,) * n_features - def test_canonicalize(self): + def test_canonicalize(self): + for n_features in [1, 2, 3, 4, 10]: + for boundary in ['obc', 'pbc']: + for oc in range(n_features): + for mode in ['svd', 'svdr', 'qr']: + for renormalize in [True, False]: + mps = tk.models.MPS(n_features=n_features, + phys_dim=2, + bond_dim=10, + boundary=boundary, + in_features=[]) + + mps_tensor = mps() + assert mps_tensor.shape == (2,) * n_features + + mps.out_features = [] + example = torch.randn(1, n_features, 2) + mps.trace(example) + + if mps.boundary == 'obc': + assert len(mps.leaf_nodes) == n_features + 2 + else: + assert len(mps.leaf_nodes) == n_features + assert len(mps.data_nodes) == n_features + + # Canonicalize + rank = torch.randint(5, 11, (1,)).item() + mps.canonicalize(oc=oc, + mode=mode, + rank=rank, + cum_percentage=0.98, + cutoff=1e-5, + renormalize=renormalize) + + if mps.bond_dim and mode != 'qr': + if mps.boundary == 'obc': + assert (torch.tensor(mps.bond_dim) <= rank).all() + else: + assert (torch.tensor(mps.bond_dim[:-1]) <= rank).all() + + if mps.boundary == 'obc': + assert len(mps.leaf_nodes) == n_features + 2 + else: + assert len(mps.leaf_nodes) == n_features + assert len(mps.data_nodes) == n_features + + mps.unset_data_nodes() + mps.in_features = [] + approx_mps_tensor = mps() + assert approx_mps_tensor.shape == (2,) * n_features + + def test_canonicalize_cuda(self): + device = torch.device('cuda:0' if torch.cuda.is_available() else 'cpu') for n_features in [1, 2, 3, 4, 10]: for boundary in ['obc', 'pbc']: for oc in range(n_features): @@ -1397,13 +2172,68 @@ def test_canonicalize(self): phys_dim=2, bond_dim=10, boundary=boundary, - in_features=[]) + in_features=[], + device=device) mps_tensor = mps() assert mps_tensor.shape == (2,) * n_features mps.out_features = [] - example = torch.randn(1, n_features, 2) + example = torch.randn(1, n_features, 2, + device=device) + mps.trace(example) + + if mps.boundary == 'obc': + assert len(mps.leaf_nodes) == n_features + 2 + else: + assert len(mps.leaf_nodes) == n_features + assert len(mps.data_nodes) == n_features + + # Canonicalize + rank = torch.randint(5, 11, (1,)).item() + mps.canonicalize(oc=oc, + mode=mode, + rank=rank, + cum_percentage=0.98, + cutoff=1e-5, + renormalize=renormalize) + + if mps.bond_dim and mode != 'qr': + if mps.boundary == 'obc': + assert (torch.tensor(mps.bond_dim) <= rank).all() + else: + assert (torch.tensor(mps.bond_dim[:-1]) <= rank).all() + + if mps.boundary == 'obc': + assert len(mps.leaf_nodes) == n_features + 2 + else: + assert len(mps.leaf_nodes) == n_features + assert len(mps.data_nodes) == n_features + + mps.unset_data_nodes() + mps.in_features = [] + approx_mps_tensor = mps() + assert approx_mps_tensor.shape == (2,) * n_features + + def test_canonicalize_complex(self): + for n_features in [1, 2, 3, 4, 10]: + for boundary in ['obc', 'pbc']: + for oc in range(n_features): + for mode in ['svd', 'svdr', 'qr']: + for renormalize in [True, False]: + mps = tk.models.MPS(n_features=n_features, + phys_dim=2, + bond_dim=10, + boundary=boundary, + in_features=[], + dtype=torch.complex64) + + mps_tensor = mps() + assert mps_tensor.shape == (2,) * n_features + + mps.out_features = [] + example = torch.randn(1, n_features, 2, + dtype=torch.complex64) mps.trace(example) if mps.boundary == 'obc': @@ -1517,6 +2347,75 @@ def test_canonicalize_univocal(self): approx_mps_tensor = mps() assert approx_mps_tensor.shape == (2,) * n_features + assert torch.allclose(mps_tensor, approx_mps_tensor, + rtol=1e-2, atol=1e-3) + + def test_canonicalize_univocal_cuda(self): + device = torch.device('cuda:0' if torch.cuda.is_available() else 'cpu') + for n_features in [1, 2, 3, 4, 10]: + mps = tk.models.MPS(n_features=n_features, + phys_dim=2, + bond_dim=10, + boundary='obc', + in_features=[], + init_method='unit', + device=device) + + mps_tensor = mps() + assert mps_tensor.shape == (2,) * n_features + + mps.out_features = [] + example = torch.randn(1, n_features, 2, device=device) + mps.trace(example) + + assert len(mps.leaf_nodes) == n_features + 2 + assert len(mps.data_nodes) == n_features + + # Canonicalize + mps.canonicalize_univocal() + + assert len(mps.leaf_nodes) == n_features + 2 + assert len(mps.data_nodes) == n_features + + mps.unset_data_nodes() + mps.in_features = [] + approx_mps_tensor = mps() + assert approx_mps_tensor.shape == (2,) * n_features + + assert torch.allclose(mps_tensor, approx_mps_tensor, + rtol=1e-2, atol=1e-4) + + def test_canonicalize_univocal_complex(self): + for n_features in [1, 2, 3, 4, 10]: + mps = tk.models.MPS(n_features=n_features, + phys_dim=2, + bond_dim=10, + boundary='obc', + in_features=[], + init_method='unit', + dtype=torch.complex64) + + mps_tensor = mps() + assert mps_tensor.shape == (2,) * n_features + + mps.out_features = [] + example = torch.randn(1, n_features, 2, dtype=torch.complex64) + mps.trace(example) + + assert len(mps.leaf_nodes) == n_features + 2 + assert len(mps.data_nodes) == n_features + + # Canonicalize + mps.canonicalize_univocal() + + assert len(mps.leaf_nodes) == n_features + 2 + assert len(mps.data_nodes) == n_features + + mps.unset_data_nodes() + mps.in_features = [] + approx_mps_tensor = mps() + assert approx_mps_tensor.shape == (2,) * n_features + assert torch.allclose(mps_tensor, approx_mps_tensor, rtol=1e-2, atol=1e-4) @@ -1681,12 +2580,12 @@ def test_initialize_init_method(self): for init_method in methods: mps = tk.models.UMPS(n_features=n, phys_dim=2, - bond_dim=2, + bond_dim=5, init_method=init_method) assert mps.n_features == n assert mps.boundary == 'pbc' assert mps.phys_dim == [2] * n - assert mps.bond_dim == [2] * n + assert mps.bond_dim == [5] * n def test_initialize_init_method_cuda(self): device = torch.device('cuda:0' if torch.cuda.is_available() else 'cpu') @@ -1696,16 +2595,34 @@ def test_initialize_init_method_cuda(self): for init_method in methods: mps = tk.models.UMPS(n_features=n, phys_dim=2, - bond_dim=2, + bond_dim=5, init_method=init_method, device=device) assert mps.n_features == n assert mps.boundary == 'pbc' assert mps.phys_dim == [2] * n - assert mps.bond_dim == [2] * n + assert mps.bond_dim == [5] * n for node in mps.mats_env: assert node.device == device + def test_initialize_init_method_complex(self): + methods = ['zeros', 'ones', 'copy', 'rand', 'randn', + 'randn_eye', 'unit', 'canonical'] + for n in [1, 2, 5]: + for init_method in methods: + mps = tk.models.UMPS(n_features=n, + phys_dim=2, + bond_dim=5, + init_method=init_method, + dtype=torch.complex64) + assert mps.n_features == n + assert mps.boundary == 'pbc' + assert mps.phys_dim == [2] * n + assert mps.bond_dim == [5] * n + for node in mps.mats_env: + assert node.dtype == torch.complex64 + assert node.is_complex() + def test_initialize_with_unitaries(self): for n in [1, 2, 5]: mps = tk.models.UMPS(n_features=n, @@ -2105,6 +3022,55 @@ def test_partial_density_cuda(self): # Repeat density density = mps.partial_density(trace_sites) + def test_partial_density_complex(self): + for n_features in [1, 2, 3, 4, 5]: + phys_dim = torch.randint(low=2, high=12, size=(1,)).item() + bond_dim = torch.randint(low=2, high=10, size=(1,)).item() + + trace_sites = torch.randint(low=0, + high=n_features, + size=(n_features // 2,)).tolist() + + mps = tk.models.UMPS(n_features=n_features, + phys_dim=phys_dim, + bond_dim=bond_dim, + in_features=trace_sites, + dtype=torch.complex64) + + # batch x n_features x feature_dim + example = torch.randn(1, n_features // 2, phys_dim, + dtype=torch.complex64) + if example.numel() == 0: + example = None + + mps.trace(example) + + assert mps.resultant_nodes + if trace_sites: + assert mps.data_nodes + assert set(mps.in_features) == set(trace_sites) + + # MPS has to be reset, otherwise partial_density automatically + # calls the forward method that was traced when contracting the + # MPS with example + mps.reset() + + # Here, trace_sites are now the out_features, + # not the in_features + density = mps.partial_density(trace_sites) + assert mps.resultant_nodes + assert mps.data_nodes + assert set(mps.out_features) == set(trace_sites) + + assert density.shape == (phys_dim,) * 2 * len(mps.in_features) + + density.sum().abs().backward() + for node in mps.mats_env: + assert node.grad is not None + + # Repeat density + density = mps.partial_density(trace_sites) + def test_canonicalize_error(self): mps = tk.models.UMPS(n_features=10, phys_dim=2, @@ -2175,26 +3141,26 @@ def test_initialize_init_method(self): n_features=n, in_dim=2, out_dim=10, - bond_dim=2, + bond_dim=5, init_method=init_method) assert mps.n_features == n assert mps.boundary == 'pbc' assert mps.in_dim == [2] * (n - 1) assert mps.out_dim == 10 - assert mps.bond_dim == [2] * n + assert mps.bond_dim == [5] * n # OBC mps = tk.models.MPSLayer(boundary='obc', n_features=n, in_dim=2, out_dim=10, - bond_dim=2, + bond_dim=5, init_method=init_method) assert mps.n_features == n assert mps.boundary == 'obc' assert mps.in_dim == [2] * (n - 1) assert mps.out_dim == 10 - assert mps.bond_dim == [2] * (n - 1) + assert mps.bond_dim == [5] * (n - 1) assert torch.equal(mps.left_node.tensor[0], torch.ones_like(mps.left_node.tensor)[0]) @@ -2217,14 +3183,14 @@ def test_initialize_init_method_cuda(self): n_features=n, in_dim=2, out_dim=10, - bond_dim=2, + bond_dim=5, init_method=init_method, device=device) assert mps.n_features == n assert mps.boundary == 'pbc' assert mps.in_dim == [2] * (n - 1) assert mps.out_dim == 10 - assert mps.bond_dim == [2] * n + assert mps.bond_dim == [5] * n for node in mps.mats_env: assert node.device == device @@ -2233,14 +3199,14 @@ def test_initialize_init_method_cuda(self): n_features=n, in_dim=2, out_dim=10, - bond_dim=2, + bond_dim=5, init_method=init_method, device=device) assert mps.n_features == n assert mps.boundary == 'obc' assert mps.in_dim == [2] * (n - 1) assert mps.out_dim == 10 - assert mps.bond_dim == [2] * (n - 1) + assert mps.bond_dim == [5] * (n - 1) for node in mps.mats_env: assert node.device == device @@ -2254,6 +3220,55 @@ def test_initialize_init_method_cuda(self): assert torch.equal(mps.right_node.tensor[1:], torch.zeros_like(mps.right_node.tensor)[1:]) + def test_initialize_init_method_complex(self): + methods = ['zeros', 'ones', 'copy', 'rand', 'randn', + 'randn_eye', 'unit', 'canonical'] + for n in [1, 2, 5]: + for init_method in methods: + # PBC + mps = tk.models.MPSLayer(boundary='pbc', + n_features=n, + in_dim=2, + out_dim=10, + bond_dim=5, + init_method=init_method, + dtype=torch.complex64) + assert mps.n_features == n + assert mps.boundary == 'pbc' + assert mps.in_dim == [2] * (n - 1) + assert mps.out_dim == 10 + assert mps.bond_dim == [5] * n + for node in mps.mats_env: + assert node.dtype == torch.complex64 + assert node.is_complex() + + # OBC + mps = tk.models.MPSLayer(boundary='obc', + n_features=n, + in_dim=2, + out_dim=10, + bond_dim=5, + init_method=init_method, + dtype=torch.complex64) + assert mps.n_features == n + assert mps.boundary == 'obc' + assert mps.in_dim == [2] * (n - 1) + assert mps.out_dim == 10 + assert mps.bond_dim == [5] * (n - 1) + for node in mps.mats_env: + assert node.dtype == torch.complex64 + assert node.is_complex() + + assert torch.equal(mps.left_node.tensor[0], + torch.ones_like(mps.left_node.tensor)[0]) + assert torch.equal(mps.left_node.tensor[1:], + torch.zeros_like(mps.left_node.tensor)[1:]) + + assert torch.equal(mps.right_node.tensor[0], + torch.ones_like(mps.right_node.tensor)[0]) + assert torch.equal(mps.right_node.tensor[1:], + torch.zeros_like(mps.right_node.tensor)[1:]) + def test_initialize_canonical(self): for n in [1, 2, 5]: # PBC @@ -2283,7 +3298,6 @@ def test_initialize_canonical(self): assert mps.bond_dim == [10] * (n - 1) # Check it has norm == 10**n - norm = mps.norm() assert mps.norm().isclose(torch.tensor(10. ** n).sqrt()) # Norm is close to 10**n if bond dimension is <= than # physical dimension, otherwise, it will not be exactly 10**n @@ -2324,11 +3338,52 @@ def test_initialize_canonical_cuda(self): assert node.device == device # Check it has norm == 10**n - norm = mps.norm() assert mps.norm().isclose(torch.tensor(10. ** n).sqrt()) # Norm is close to 10**n if bond dimension is <= than # physical dimension, otherwise, it will not be exactly 10**n + def test_initialize_canonical_complex(self): + for n in [1, 2, 5]: + # PBC + mps = tk.models.MPSLayer(boundary='pbc', + n_features=n, + in_dim=10, + out_dim=10, + bond_dim=10, + init_method='canonical', + dtype=torch.complex64) + assert mps.n_features == n + assert mps.boundary == 'pbc' + assert mps.phys_dim == [10] * n + assert mps.bond_dim == [10] * n + for node in mps.mats_env: + assert node.dtype == torch.complex64 + assert node.is_complex() + + # For PBC norm does not have to be 10**n always + + # OBC + mps = tk.models.MPSLayer(boundary='obc', + n_features=n, + in_dim=10, + out_dim=10, + bond_dim=10, + init_method='canonical', + dtype=torch.complex64) + assert mps.n_features == n + assert mps.boundary == 'obc' + assert mps.phys_dim == [10] * n + assert mps.bond_dim == [10] * (n - 1) + for node in mps.mats_env: + assert node.dtype == torch.complex64 + assert node.is_complex() + + # Check it has norm == 10**n + assert mps.norm().isclose(torch.tensor(10. ** n, + dtype=torch.complex64).sqrt()) + # Norm is close to 10**n if bond dimension is <= than + # physical dimension, otherwise, it will not be exactly 10**n + def test_in_and_out_features(self): tensors = [torch.randn(10, 2, 10) for _ in range(10)] mps = tk.models.MPSLayer(tensors=tensors, @@ -2700,7 +3755,7 @@ def test_initialize_init_method(self): mps = tk.models.MPSData(boundary=boundary, n_features=n_features, phys_dim=2, - bond_dim=2, + bond_dim=5, n_batches=n_batches, init_method=init_method) @@ -2709,16 +3764,16 @@ def test_initialize_init_method(self): assert mps.phys_dim == [2] * n_features if boundary == 'obc': - assert mps.bond_dim == [2] * (n_features - 1) + assert mps.bond_dim == [5] * (n_features - 1) else: - assert mps.bond_dim == [2] * n_features + assert mps.bond_dim == [5] * n_features if (n_features == 1) and (boundary == 'obc'): node = mps.mats_env[0] assert node.shape == tuple([1] * n_batches + [1, 2, 1]) else: for node in mps.mats_env: - assert node.shape == tuple([1] * n_batches + [2] * 3) + assert node.shape == tuple([1] * n_batches + [5, 2, 5]) def test_initialize_add_data(self): for n_features in [1, 2, 5]: diff --git a/tests/test_components.py b/tests/test_components.py index 050815f..bbf55e4 100644 --- a/tests/test_components.py +++ b/tests/test_components.py @@ -599,16 +599,54 @@ def test_set_init_method(self, setup): assert node1.tensor is None # Initialize tensor of node1 - node1.set_tensor(init_method='randn', mean=1., std=2.) - assert node1.tensor is not None + for init_method in ["zeros", "ones", "copy", "rand", "randn"]: + node1.set_tensor(init_method=init_method) + assert node1.tensor is not None - # Set node1's tensor as node2's tensor - node2.tensor = node1.tensor - assert torch.equal(node1.tensor, node2.tensor) + # Set node1's tensor as node2's tensor + node2.tensor = node1.tensor + assert torch.equal(node1.tensor, node2.tensor) - # Changing node1's tensor changes node2's tensor - node1.tensor[0, 0, 0] = 1000 - assert node2.tensor[0, 0, 0] == 1000 + # Changing node1's tensor changes node2's tensor + node1.tensor[0, 0, 0] = 1000 + assert node2.tensor[0, 0, 0] == 1000 + + def test_set_init_method_cuda(self, setup): + node1, node2, tensor = setup + assert node1.tensor is None + + # Send to cuda if possible + device = torch.device('cuda:0' if torch.cuda.is_available() else 'cpu') + + # Initialize tensor of node1 + for init_method in ["zeros", "ones", "copy", "rand", "randn"]: + node1.set_tensor(init_method=init_method, device=device) + assert node1.tensor is not None + + # Set node1's tensor as node2's tensor + node2.tensor = node1.tensor + assert torch.equal(node1.tensor, node2.tensor) + + # Changing node1's tensor changes node2's tensor + node1.tensor[0, 0, 0] = 1000 + assert node2.tensor[0, 0, 0] == 1000 + + def test_set_init_method_complex(self, setup): + node1, node2, tensor = setup + assert node1.tensor is None + + # Initialize tensor of node1 + for init_method in ["zeros", "ones", "copy", "rand", "randn"]: + node1.set_tensor(init_method=init_method, dtype=torch.complex64) + assert node1.tensor is not None + + # Set node1's tensor as node2's tensor + node2.tensor = node1.tensor + assert torch.equal(node1.tensor, node2.tensor) + + # Changing node1's tensor changes node2's tensor + node1.tensor[0, 0, 0] = 1000 + assert node2.tensor[0, 0, 0] == 1000 def test_set_tensor_from(self, setup): node1, node2, tensor = setup @@ -901,16 +939,54 @@ def test_set_init_method(self, setup): assert node1.tensor is None # Initialize tensor of node1 - node1.set_tensor(init_method='randn', mean=1., std=2.) - assert node1.tensor is not None + for init_method in ["zeros", "ones", "copy", "rand", "randn"]: + node1.set_tensor(init_method=init_method) + assert node1.tensor is not None - # Set node1's tensor as node2's tensor - node2.tensor = node1.tensor - assert torch.equal(node1.tensor, node2.tensor) + # Set node1's tensor as node2's tensor + node2.tensor = node1.tensor + assert torch.equal(node1.tensor, node2.tensor) - # Cannot change element of Parameter - with pytest.raises(RuntimeError): - node1.tensor[0, 0, 0] = 1000 + # Cannot change element of Parameter + with pytest.raises(RuntimeError): + node1.tensor[0, 0, 0] = 1000 + + def test_set_init_method_cuda(self, setup): + node1, node2, tensor = setup + assert node1.tensor is None + + # Send to cuda if possible + device = torch.device('cuda:0' if torch.cuda.is_available() else 'cpu') + + # Initialize tensor of node1 + for init_method in ["zeros", "ones", "copy", "rand", "randn"]: + node1.set_tensor(init_method=init_method, device=device) + assert node1.tensor is not None + + # Set node1's tensor as node2's tensor + node2.tensor = node1.tensor + assert torch.equal(node1.tensor, node2.tensor) + + # Cannot change element of Parameter + with pytest.raises(RuntimeError): + node1.tensor[0, 0, 0] = 1000 + + def test_set_init_method_complex(self, setup): + node1, node2, tensor = setup + assert node1.tensor is None + + # Initialize tensor of node1 + for init_method in ["zeros", "ones", "copy", "rand", "randn"]: + node1.set_tensor(init_method=init_method, dtype=torch.complex64) + assert node1.tensor is not None + + # Set node1's tensor as node2's tensor + node2.tensor = node1.tensor + assert torch.equal(node1.tensor, node2.tensor) + + # Cannot change element of Parameter + with pytest.raises(RuntimeError): + node1.tensor[0, 0, 0] = 1000 def test_set_parametric(self, setup): node1, node2, tensor = setup diff --git a/tests/test_operations.py b/tests/test_operations.py index 9d51a49..0c180e1 100644 --- a/tests/test_operations.py +++ b/tests/test_operations.py @@ -2,7 +2,7 @@ This script contains tests for operations: * TestPermute - * TestBasicOps + * TestTensorOps * TestSplitSVD * TestSplitSVDR * TestSplitQR @@ -159,7 +159,7 @@ def test_permute_paramnode_in_place(self): assert torch.equal(permuted_node.tensor, node.tensor.permute(0, 2, 1)) -class TestBasicOps: +class TestTensorOps: @pytest.fixture def setup(self): @@ -521,6 +521,22 @@ def test_renormalize(self): # Repeat node4 = node1.renormalize(axis=['left', 'right']) + + def test_conj(self): + node1 = tk.randn(shape=(3, 3, 3), + axes_names=('left', 'input', 'right'), + dtype=torch.complex64) + assert node1.successors == dict() + + node2 = tk.conj(node1) + assert node2 is not node1 + assert node2.shape == (3, 3, 3) + assert (node2.tensor == node1.tensor.conj()).all() + assert node2.is_conj() + assert node1.successors != dict() + + # Repeat + node2 = tk.conj(node1) @pytest.fixture def setup_param(self): @@ -915,6 +931,23 @@ def test_renormalize_param(self): # Repeat node4 = node1.renormalize(axis=['left', 'right']) + + def test_conj_param(self): + node1 = tk.randn(shape=(3, 3, 3), + axes_names=('left', 'input', 'right'), + param_node=True, + dtype=torch.complex64) + assert node1.successors == dict() + + node2 = tk.conj(node1) + assert node2 is not node1 + assert node2.shape == (3, 3, 3) + assert (node2.tensor == node1.tensor.conj()).all() + assert node2.is_conj() + assert node1.successors != dict() + + # Repeat + node2 = tk.conj(node1) class TestSplitSVD: @@ -1106,7 +1139,7 @@ def test_split_contracted_node_cum_percentage(self): assert new_node1.shape == (10, 2, 5, 1) assert new_node2.shape == (10, 1, 5, 3) - def test_split_contracted_node_paramnodes_cum_percentage(self): + def test_split_contracted_node_paramnode_cum_percentage(self): net = tk.TensorNetwork() node1 = tk.ParamNode(shape=(10, 2, 5, 4), axes_names=('batch', 'left', 'input', 'right'), @@ -1264,6 +1297,59 @@ def test_split_contracted_node_rank_cum_percentage_cutoff(self): assert new_node1.shape == (10, 2, 5, 8) assert new_node2.shape == (10, 8, 5, 3) + + def test_split_contracted_complex_node(self): + net = tk.TensorNetwork() + node1 = tk.Node(shape=(10, 2, 5, 4), + axes_names=('batch', 'left', 'input', 'right'), + name='node1', + init_method='randn', + dtype=torch.complex64, + network=net) + node2 = tk.Node(shape=(10, 4, 5, 3), + axes_names=('batch', 'left', 'input', 'right'), + name='node2', + init_method='randn', + dtype=torch.complex64, + network=net) + edge = node1[3] ^ node2[1] + result = node1 @ node2 + + assert len(net.nodes) == 3 + assert len(net.leaf_nodes) == 2 + assert len(net.resultant_nodes) == 1 + assert node1.successors['contract_edges'][(None, node1, node2)].child == result + + # Split result + new_node1, new_node2 = result.split(node1_axes=['left', 'input_0'], + node2_axes=['input_1', 'right']) + + assert new_node1.shape == (10, 2, 5, 10) + assert new_node1['batch'].size() == 10 + assert new_node1['left'].size() == 2 + assert new_node1['input'].size() == 5 + assert new_node1['split'].size() == 10 + + assert new_node2.shape == (10, 10, 5, 3) + assert new_node2['batch'].size() == 10 + assert new_node2['split'].size() == 10 + assert new_node2['input'].size() == 5 + assert new_node2['right'].size() == 3 + + assert len(net.nodes) == 5 + assert len(net.leaf_nodes) == 2 + assert len(net.resultant_nodes) == 3 + assert result.successors['split'][(result, + tuple(['left', 'input_0']), + tuple(['input_1', 'right']), + 'svd', + 'left', + None, + None, + None)].child == [new_node1, new_node2] + + assert net.edges == [node1['left'], node1['input'], + node2['input'], node2['right']] def test_split_in_place(self): net = tk.TensorNetwork() @@ -1659,7 +1745,7 @@ def test_split_contracted_node_cum_percentage(self): assert new_node1.shape == (10, 2, 5, 1) assert new_node2.shape == (10, 1, 5, 3) - def test_split_contracted_node_paramnodes_cum_percentage(self): + def test_split_contracted_node_paramnode_cum_percentage(self): net = tk.TensorNetwork() node1 = tk.ParamNode(shape=(10, 2, 5, 4), axes_names=('batch', 'left', 'input', 'right'), @@ -1824,6 +1910,60 @@ def test_split_contracted_node_rank_cum_percentage_cutoff(self): assert new_node1.shape == (10, 2, 5, 8) assert new_node2.shape == (10, 8, 5, 3) + + def test_split_contracted_complex_node(self): + net = tk.TensorNetwork() + node1 = tk.Node(shape=(10, 2, 5, 4), + axes_names=('batch', 'left', 'input', 'right'), + name='node1', + init_method='randn', + dtype=torch.complex64, + network=net) + node2 = tk.Node(shape=(10, 4, 5, 3), + axes_names=('batch', 'left', 'input', 'right'), + name='node2', + init_method='randn', + dtype=torch.complex64, + network=net) + edge = node1[3] ^ node2[1] + result = node1 @ node2 + + assert len(net.nodes) == 3 + assert len(net.leaf_nodes) == 2 + assert len(net.resultant_nodes) == 1 + assert node1.successors['contract_edges'][(None, node1, node2)].child == result + + # Split result + new_node1, new_node2 = result.split(node1_axes=['left', 'input_0'], + node2_axes=['input_1', 'right'], + mode='svdr') + + assert new_node1.shape == (10, 2, 5, 10) + assert new_node1['batch'].size() == 10 + assert new_node1['left'].size() == 2 + assert new_node1['input'].size() == 5 + assert new_node1['split'].size() == 10 + + assert new_node2.shape == (10, 10, 5, 3) + assert new_node2['batch'].size() == 10 + assert new_node2['split'].size() == 10 + assert new_node2['input'].size() == 5 + assert new_node2['right'].size() == 3 + + assert len(net.nodes) == 5 + assert len(net.leaf_nodes) == 2 + assert len(net.resultant_nodes) == 3 + assert result.successors['split'][(result, + tuple(['left', 'input_0']), + tuple(['input_1', 'right']), + 'svdr', + 'left', + None, + None, + None)].child == [new_node1, new_node2] + + assert net.edges == [node1['left'], node1['input'], + node2['input'], node2['right']] def test_split_in_place(self): net = tk.TensorNetwork() @@ -6676,7 +6816,7 @@ def test_mps(self, setup_mps): image_size = (10, 10) mps = MPS(image_size=image_size) - device = torch.device('cuda' if torch.cuda.is_available() else 'cpu') + device = torch.device('cuda:0' if torch.cuda.is_available() else 'cpu') mps = mps.to(device) # batch_size x height x width @@ -6700,7 +6840,7 @@ def test_uniform_mps(self, setup_mps): image_size = (10, 10) mps = MPS(image_size=image_size, uniform=True) - device = torch.device('cuda' if torch.cuda.is_available() else 'cpu') + device = torch.device('cuda:0' if torch.cuda.is_available() else 'cpu') mps = mps.to(device) # batch_size x height x width @@ -6918,7 +7058,7 @@ def test_peps(self, setup_peps): image_size = (3, 3) peps = PEPS(image_size=image_size) - device = torch.device('cuda' if torch.cuda.is_available() else 'cpu') + device = torch.device('cuda:0' if torch.cuda.is_available() else 'cpu') peps = peps.to(device) # batch_size x height x width @@ -6942,7 +7082,7 @@ def test_uniform_peps(self, setup_peps): image_size = (3, 3) peps = PEPS(image_size=image_size, uniform=True) - device = torch.device('cuda' if torch.cuda.is_available() else 'cpu') + device = torch.device('cuda:0' if torch.cuda.is_available() else 'cpu') peps = peps.to(device) # batch_size x height x width From bb09e8f08f7e4561f59e893df9550fd02a57de9b Mon Sep 17 00:00:00 2001 From: joserapa98 Date: Tue, 14 May 2024 21:32:38 +0200 Subject: [PATCH 12/14] Split tests in two jobs --- .github/workflows/tests.yml | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 2573642..4601762 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -8,7 +8,7 @@ on: workflow_dispatch: jobs: - tests: + tests_basics: runs-on: ubuntu-latest @@ -33,6 +33,21 @@ jobs: - name: Test decompositions if: always() run: pytest tests/decompositions/test_svd_decompositions.py --cov=tensorkrowch + + tests_models: + + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v4 + - name: Set up Python + uses: actions/setup-python@v5 + with: + python-version: '3.x' + - name: Install dependencies + run: python -m pip install --upgrade pip torch opt_einsum + - name: Install pytest + run: pip install pytest pytest-cov - name: Test MPS if: always() run: pytest tests/models/test_mps.py --cov=tensorkrowch @@ -44,4 +59,4 @@ jobs: run: pytest tests/models/test_peps.py --cov=tensorkrowch - name: Test Tree if: always() - run: pytest tests/models/test_tree.py --cov=tensorkrowch + run: pytest tests/models/test_tree.py --cov=tensorkrow \ No newline at end of file From d353db209a4ecae6c5902b54dc75f3448f8f9b68 Mon Sep 17 00:00:00 2001 From: joserapa98 Date: Tue, 14 May 2024 21:34:05 +0200 Subject: [PATCH 13/14] Update docs --- docs/_build/doctest/output.txt | 158 ++--- docs/_build/doctrees/components.doctree | Bin 974904 -> 991251 bytes docs/_build/doctrees/environment.pickle | Bin 981842 -> 994295 bytes docs/_build/doctrees/models.doctree | Bin 1213402 -> 1247823 bytes .../doctrees/tutorials/0_first_steps.doctree | Bin 34642 -> 34646 bytes docs/_build/html/.buildinfo | 2 +- docs/_build/html/_modules/index.html | 2 +- .../_modules/tensorkrowch/components.html | 98 ++- .../decompositions/svd_decompositions.html | 8 +- .../_modules/tensorkrowch/embeddings.html | 2 +- .../_modules/tensorkrowch/initializers.html | 2 +- .../_modules/tensorkrowch/models/mpo.html | 48 +- .../_modules/tensorkrowch/models/mps.html | 326 ++++++---- .../tensorkrowch/models/mps_data.html | 51 +- .../_modules/tensorkrowch/models/peps.html | 2 +- .../_modules/tensorkrowch/models/tree.html | 2 +- .../_modules/tensorkrowch/operations.html | 129 +++- .../_sources/tutorials/0_first_steps.rst.txt | 2 +- .../html/_static/documentation_options.js | 2 +- docs/_build/html/api.html | 2 +- docs/_build/html/components.html | 56 +- docs/_build/html/contents.html | 2 +- docs/_build/html/decompositions.html | 2 +- docs/_build/html/embeddings.html | 2 +- docs/_build/html/examples.html | 2 +- .../html/examples/hybrid_tnn_model.html | 2 +- docs/_build/html/examples/mps_dmrg.html | 2 +- docs/_build/html/examples/mps_dmrg.ipynb | 587 ------------------ .../_build/html/examples/mps_dmrg_hybrid.html | 2 +- docs/_build/html/examples/tensorizing_nn.html | 2 +- docs/_build/html/examples/training_mps.html | 2 +- docs/_build/html/genindex.html | 16 +- docs/_build/html/index.html | 2 +- docs/_build/html/initializers.html | 2 +- docs/_build/html/installation.html | 2 +- docs/_build/html/models.html | 76 ++- docs/_build/html/objects.inv | Bin 9088 -> 9176 bytes docs/_build/html/operations.html | 2 +- docs/_build/html/search.html | 2 +- docs/_build/html/searchindex.js | 2 +- docs/_build/html/tutorials.html | 2 +- docs/_build/html/tutorials/0_first_steps.html | 4 +- .../tutorials/1_creating_tensor_network.html | 2 +- .../2_contracting_tensor_network.html | 2 +- .../html/tutorials/3_memory_management.html | 2 +- .../html/tutorials/4_types_of_nodes.html | 2 +- .../tutorials/5_subclass_tensor_network.html | 2 +- .../html/tutorials/6_mix_with_pytorch.html | 2 +- docs/tutorials/0_first_steps.rst | 2 +- 49 files changed, 714 insertions(+), 907 deletions(-) delete mode 100644 docs/_build/html/examples/mps_dmrg.ipynb diff --git a/docs/_build/doctest/output.txt b/docs/_build/doctest/output.txt index 1b925f4..ecdef6d 100644 --- a/docs/_build/doctest/output.txt +++ b/docs/_build/doctest/output.txt @@ -1,22 +1,6 @@ -Results of doctest builder run on 2024-05-13 15:19:16 +Results of doctest builder run on 2024-05-14 21:33:03 ===================================================== -Document: models ----------------- -1 items passed all tests: - 118 tests in default -118 tests in 1 items. -118 passed and 0 failed. -Test passed. - -Document: embeddings --------------------- -1 items passed all tests: - 45 tests in default -45 tests in 1 items. -45 passed and 0 failed. -Test passed. - Document: components -------------------- ********************************************************************** @@ -27,8 +11,8 @@ Expected: tensor([[-0.2799, -0.4383, -0.8387], [ 1.6225, -0.3370, -1.2316]]) Got: - tensor([[-0.3491, 1.6723, 0.1550], - [-1.2811, 1.7880, 1.4058]]) + tensor([[-1.0631, -0.4740, 0.1857], + [ 0.1684, 0.9431, -0.5282]]) ********************************************************************** File "../tensorkrowch/components.py", line ?, in default Failed example: @@ -36,7 +20,7 @@ Failed example: Expected: tensor(-1.5029) Got: - tensor(3.3910) + tensor(-0.7681) ********************************************************************** File "../tensorkrowch/components.py", line ?, in default Failed example: @@ -44,7 +28,7 @@ Failed example: Expected: tensor([ 1.3427, -0.7752, -2.0704]) Got: - tensor([-1.6301, 3.4603, 1.5608]) + tensor([-0.8947, 0.4691, -0.3424]) ********************************************************************** File "../tensorkrowch/components.py", line ?, in default Failed example: @@ -53,8 +37,8 @@ Expected: tensor([[ 1.4005, -0.0521, -1.2091], [ 1.9844, 0.3513, -0.5920]]) Got: - tensor([[ 0.1392, -1.0223, -1.4595], - [-0.8048, 0.5959, -0.3506]]) + tensor([[ 0.7595, 0.6039, -0.3528], + [-0.9391, 0.5732, -0.1683]]) ********************************************************************** File "../tensorkrowch/components.py", line ?, in default Failed example: @@ -62,7 +46,7 @@ Failed example: Expected: tensor(0.3139) Got: - tensor(-0.4837) + tensor(0.0794) ********************************************************************** File "../tensorkrowch/components.py", line ?, in default Failed example: @@ -70,7 +54,7 @@ Failed example: Expected: tensor([ 1.6925, 0.1496, -0.9006]) Got: - tensor([-0.3328, -0.2132, -0.9050]) + tensor([-0.0898, 0.5886, -0.2606]) ********************************************************************** File "../tensorkrowch/components.py", line ?, in default Failed example: @@ -79,8 +63,8 @@ Expected: tensor([[ 0.2111, -0.9551, -0.7812], [ 0.2254, 0.3381, -0.2461]]) Got: - tensor([[-1.0223, -0.8771, -2.0712], - [-0.8749, -0.0445, 0.0772]]) + tensor([[-0.5163, -1.9652, 0.5784], + [ 1.1581, 1.1339, -0.2820]]) ********************************************************************** File "../tensorkrowch/components.py", line ?, in default Failed example: @@ -88,7 +72,7 @@ Failed example: Expected: tensor(0.5567) Got: - tensor(0.7768) + tensor(1.1973) ********************************************************************** File "../tensorkrowch/components.py", line ?, in default Failed example: @@ -96,7 +80,7 @@ Failed example: Expected: tensor([0.0101, 0.9145, 0.3784]) Got: - tensor([0.1042, 0.5887, 1.5192]) + tensor([1.1840, 2.1914, 0.6084]) ********************************************************************** File "../tensorkrowch/components.py", line ?, in default Failed example: @@ -105,8 +89,8 @@ Expected: tensor([[ 1.5570, 1.8441, -0.0743], [ 0.4572, 0.7592, 0.6356]]) Got: - tensor([[-0.5176, -0.2405, -0.4334], - [-0.5865, -0.3753, 0.4047]]) + tensor([[ 0.4585, -0.9622, -1.3563], + [ 1.5910, -1.6511, 1.4884]]) ********************************************************************** File "../tensorkrowch/components.py", line ?, in default Failed example: @@ -114,7 +98,7 @@ Failed example: Expected: tensor(2.6495) Got: - tensor(1.0781) + tensor(3.2324) ********************************************************************** File "../tensorkrowch/components.py", line ?, in default Failed example: @@ -122,7 +106,7 @@ Failed example: Expected: tensor([1.6227, 1.9942, 0.6399]) Got: - tensor([0.7822, 0.4458, 0.5930]) + tensor([1.6557, 1.9110, 2.0137]) ********************************************************************** File "../tensorkrowch/components.py", line ?, in default Failed example: @@ -153,17 +137,17 @@ Got: Node( name: my_node tensor: - tensor([[[-0.6988, -1.1643], - [-0.4288, 1.4445], - [ 0.3650, 0.1796], - [-0.7360, -0.4975], - [ 0.2338, -0.2614]], + tensor([[[ 0.0756, 0.2978], + [-0.9519, -0.6720], + [-0.5188, -0.1702], + [-0.5977, 0.7331], + [ 0.2803, -0.6546]], - [[ 1.4763, -0.5471], - [ 0.1191, 0.6986], - [ 0.4719, 0.6936], - [-0.3989, -0.9837], - [-0.7574, -0.4083]]]) + [[ 0.1922, -1.1753], + [ 0.1176, 0.1418], + [ 0.3928, 0.8509], + [-0.5760, 0.9210], + [ 2.1306, -1.1455]]]) axes: [left input @@ -202,17 +186,17 @@ Got: Node( name: node tensor: - tensor([[[ 5.5549e-01, -7.1141e-01], - [ 1.3587e-02, -7.7982e-01], - [-2.4167e-01, 3.1204e-01], - [ 1.2386e-03, -4.0765e-02], - [ 1.2701e-01, -1.3453e-01]], + tensor([[[ 1.0910, -0.5809], + [ 0.1853, 0.3664], + [-0.0117, 0.5005], + [-0.0661, 0.0234], + [-0.8290, 1.9922]], - [[-1.8415e+00, 3.0231e-01], - [-1.0302e+00, 1.9352e+00], - [-2.3677e+00, 9.1492e-01], - [ 1.0165e+00, -4.1301e-01], - [-1.0887e+00, 2.1221e-01]]]) + [[ 0.1525, 0.9578], + [ 0.7693, 0.5078], + [ 0.1810, -1.0350], + [ 0.3174, -0.2801], + [ 0.4202, -0.4585]]]) axes: [axis_0 axis_1 @@ -264,17 +248,17 @@ Got: name: my_paramnode tensor: Parameter containing: - tensor([[[-0.7826, 0.0821], - [ 0.3175, 0.7941], - [ 1.5045, -0.8090], - [ 0.3632, -0.3924], - [ 1.7720, 2.3521]], + tensor([[[ 0.7591, 0.2141], + [ 0.4399, -2.5171], + [-3.7951, 0.2628], + [-0.2629, 2.4291], + [ 1.8276, 0.2167]], - [[ 0.7189, 0.9170], - [ 0.0166, 0.3871], - [ 1.1382, -1.4283], - [-0.7954, 0.0954], - [-0.3044, 0.9413]]], requires_grad=True) + [[-0.4733, 1.6149], + [ 0.0621, 0.6297], + [ 0.4117, 0.4973], + [-0.1463, -0.2648], + [-1.0274, -1.1514]]], requires_grad=True) axes: [left input @@ -315,17 +299,17 @@ Got: name: paramnode tensor: Parameter containing: - tensor([[[-0.2850, -0.0664], - [-0.2535, 1.0285], - [-0.4207, 0.8395], - [-0.7933, 0.1413], - [-1.4896, -0.7656]], + tensor([[[-1.3839, -1.1648], + [-0.2835, -0.6608], + [ 0.1896, -0.8977], + [-1.0581, 0.9863], + [-1.2442, -0.7461]], - [[-0.4232, 0.1107], - [-0.5041, -1.5471], - [ 0.6676, 1.5313], - [ 1.4140, -1.2289], - [ 1.2960, -1.4492]]], requires_grad=True) + [[ 0.2663, -0.2669], + [-0.9733, 1.0781], + [ 0.2842, -0.3121], + [-0.9311, -0.5546], + [ 0.4118, 1.2157]]], requires_grad=True) axes: [axis_0 axis_1 @@ -344,8 +328,8 @@ Expected: [ 1.3371, 1.4761, 0.6551]], requires_grad=True) Got: Parameter containing: - tensor([[ 0.5249, 0.1834, 1.2888], - [-0.4819, 0.8874, 0.0728]], requires_grad=True) + tensor([[-0.4446, 0.2519, 1.6840], + [ 1.2981, -0.4704, -0.1416]], requires_grad=True) ********************************************************************** File "../tensorkrowch/components.py", line ?, in default Failed example: @@ -396,11 +380,19 @@ Got: data_0[feature] <-> nodeA[input]]) ********************************************************************** 1 items had failures: - 21 of 398 in default -398 tests in 1 items. -377 passed and 21 failed. + 21 of 401 in default +401 tests in 1 items. +380 passed and 21 failed. ***Test Failed*** 21 failures. +Document: embeddings +-------------------- +1 items passed all tests: + 45 tests in default +45 tests in 1 items. +45 passed and 0 failed. +Test passed. + Document: operations -------------------- 1 items passed all tests: @@ -409,9 +401,17 @@ Document: operations 214 passed and 0 failed. Test passed. +Document: models +---------------- +1 items passed all tests: + 118 tests in default +118 tests in 1 items. +118 passed and 0 failed. +Test passed. + Doctest summary =============== - 775 tests + 778 tests 21 failures in tests 0 failures in setup code 0 failures in cleanup code diff --git a/docs/_build/doctrees/components.doctree b/docs/_build/doctrees/components.doctree index 2d1dbe4f36e7ac5137df9fdd6f72485289a9c3fb..158361713189c5f57e69ad4742f795cd4b546dc0 100644 GIT binary patch delta 151959 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 U;j%UanC+p~9!#75K9dH?_b delta 147114 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%0AhU$syK_OoSw$%$0 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%0D6%e_`D%Sv)zC&8|gG>q`($Ll07 zl^rbFOsPv7UWfPZln}dI7Lo&}s?mn;z-EwAlztEIf_GiH7L!jgc^6wm21*_MjCrr* z`+GMZhtv1h^m}`HXT}!iK{#KF`WBZ$Df}?PG8BH0gCvXyi`q2VghmSY+j}uqI*o?( zupClyO@8lBU_j!8a!DA4#QkAp;ot%6(f7 zgeP8YSqS0DuE-d7=N3zNGElsQ=l^f-OW@?Hs=NuNvvhV6!V(gSAfy9LXJL;d4g<&% zX#xQR0lTZaD_!+c-PKf8lQf%%s05#bNW+MLVAOHkKt*sw9T`wuX9PzP5&4FEB;h37Aw2F6!-dPd48Je?tdyB~ZQWNrzQHT05cwD5F$Yt3ObhVc9e zh|zT6DSD)Zr)*V7nx84kClH>iYlSCj9Ud5T5@q?$lYw+~lyF7pDw1TGbyy^Uz2==q zg#MJhks@@ZDsP&HW=SPNH60*A1I8q&2t5gnN)ft|PeO!>r!WyJ5pGC?N=L165i09> zMcAJjm4qTxe?C4U^bH1MCKI7uMyW(1luacSp##4l9(uuVzA75 zmqJ751~;hGC#~GAu`2Nn8=g}HzG2R z((6_Ug=S#VR_Xfcn!?5AxTFC!k%<$W^UVU|BRapV7)�GST@pqm;p%!PY06N-8?P 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�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 AWdHyG diff --git a/docs/_build/doctrees/tutorials/0_first_steps.doctree b/docs/_build/doctrees/tutorials/0_first_steps.doctree index 92aae468babab3ad89ce045a5aff8210325b3b67..aabdd710e6be32a80413cb17c6e2cce2aa037e22 100644 GIT binary patch delta 48 ucmccA$8@caiKT&cs`o~gJ|jkf$!krmn5+yopEbJAgv`6aw0Xb9WIq6;=Mkv@ delta 42 rcmccC$8@QWiKT&cs{2NkJ|jlH$?Hw6HlH`T&je@QVA_1xVzM6qTc!}z diff --git a/docs/_build/html/.buildinfo b/docs/_build/html/.buildinfo index 218778c..38ea4b1 100644 --- a/docs/_build/html/.buildinfo +++ b/docs/_build/html/.buildinfo @@ -1,4 +1,4 @@ # Sphinx build info version 1 # This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. -config: e4485bdccc4a9ef1ab7141439481b17d +config: c711dcb750f5eb023ece44b19b251e46 tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/docs/_build/html/_modules/index.html b/docs/_build/html/_modules/index.html index b16a90d..4c08981 100644 --- a/docs/_build/html/_modules/index.html +++ b/docs/_build/html/_modules/index.html @@ -5,7 +5,7 @@ - Overview: module code — TensorKrowch 1.1.2 documentation + Overview: module code — TensorKrowch 1.1.3 documentation diff --git a/docs/_build/html/_modules/tensorkrowch/components.html b/docs/_build/html/_modules/tensorkrowch/components.html index b7bc16d..3f05e31 100644 --- a/docs/_build/html/_modules/tensorkrowch/components.html +++ b/docs/_build/html/_modules/tensorkrowch/components.html @@ -5,7 +5,7 @@ - tensorkrowch.components — TensorKrowch 1.1.2 documentation + tensorkrowch.components — TensorKrowch 1.1.3 documentation @@ -777,6 +777,7 @@

Source code for tensorkrowch.components

                  node1_list: Optional[List[bool]] = None,
                  init_method: Optional[Text] = None,
                  device: Optional[torch.device] = None,
+                 dtype: Optional[torch.dtype] = None,
                  **kwargs: float) -> None:
 
         super().__init__()
@@ -888,7 +889,10 @@ 

Source code for tensorkrowch.components

         if shape is not None:
             if init_method is not None:
                 self._unrestricted_set_tensor(
-                    init_method=init_method, device=device, **kwargs)
+                    init_method=init_method,
+                    device=device,
+                    dtype=dtype,
+                    **kwargs)
         else:
             self._unrestricted_set_tensor(tensor=tensor)
 
@@ -1096,6 +1100,36 @@ 

Source code for tensorkrowch.components

         their own tensors or use other node's tensor.
         """
         return not (self._leaf or self._data or self._virtual)
+ +
[docs] def is_conj(self) -> bool: + """ + Equivalent to `torch.is_conj() + <https://pytorch.org/docs/stable/generated/torch.is_conj.html>`_. + """ + tensor = self.tensor + if tensor is None: + return + return tensor.is_conj()
+ +
[docs] def is_complex(self) -> bool: + """ + Equivalent to `torch.is_complex() + <https://pytorch.org/docs/stable/generated/torch.is_complex.html>`_. + """ + tensor = self.tensor + if tensor is None: + return + return tensor.is_complex()
+ +
[docs] def is_floating_point(self) -> bool: + """ + Equivalent to `torch.is_floating_point() + <https://pytorch.org/docs/stable/generated/torch.is_floating_point.html>`_. + """ + tensor = self.tensor + if tensor is None: + return + return tensor.is_floating_point()
[docs] def size(self, axis: Optional[Ax] = None) -> Union[Size, int]: """ @@ -1497,9 +1531,10 @@

Source code for tensorkrowch.components

 
     @staticmethod
     def _make_copy_tensor(shape: Shape,
-                          device: torch.device = torch.device('cpu')) -> Tensor:
+                          device: Optional[torch.device] = None,
+                          dtype: Optional[torch.dtype] = None) -> Tensor:
         """Returns copy tensor (ones in the "diagonal", zeros elsewhere)."""
-        copy_tensor = torch.zeros(shape, device=device)
+        copy_tensor = torch.zeros(shape, device=device, dtype=dtype)
         rank = len(shape)
         if rank <= 1:
             i = 0
@@ -1512,7 +1547,8 @@ 

Source code for tensorkrowch.components

     def _make_rand_tensor(shape: Shape,
                           low: float = 0.,
                           high: float = 1.,
-                          device: torch.device = torch.device('cpu')) -> Tensor:
+                          device: Optional[torch.device] = None,
+                          dtype: Optional[torch.dtype] = None) -> Tensor:
         """Returns tensor whose entries are drawn from the uniform distribution."""
         if not isinstance(low, float):
             raise TypeError('`low` should be float type')
@@ -1520,13 +1556,14 @@ 

Source code for tensorkrowch.components

             raise TypeError('`high` should be float type')
         if low >= high:
             raise ValueError('`low` should be strictly smaller than `high`')
-        return torch.rand(shape, device=device) * (high - low) + low
+        return torch.rand(shape, device=device, dtype=dtype) * (high - low) + low
 
     @staticmethod
     def _make_randn_tensor(shape: Shape,
                            mean: float = 0.,
                            std: float = 1.,
-                           device: torch.device = torch.device('cpu')) -> Tensor:
+                           device: Optional[torch.device] = None,
+                           dtype: Optional[torch.dtype] = None) -> Tensor:
         """Returns tensor whose entries are drawn from the normal distribution."""
         if not isinstance(mean, float):
             raise TypeError('`mean` should be float type')
@@ -1534,12 +1571,13 @@ 

Source code for tensorkrowch.components

             raise TypeError('`std` should be float type')
         if std <= 0:
             raise ValueError('`std` should be positive')
-        return torch.randn(shape, device=device) * std + mean
+        return torch.randn(shape, device=device, dtype=dtype) * std + mean
 
 
[docs] def make_tensor(self, shape: Optional[Shape] = None, init_method: Text = 'zeros', - device: torch.device = torch.device('cpu'), + device: Optional[torch.device] = None, + dtype: Optional[torch.dtype] = None, **kwargs: float) -> Tensor: """ Returns a tensor that can be put in the node, and is initialized according @@ -1553,6 +1591,8 @@

Source code for tensorkrowch.components

             Initialization method.
         device : torch.device, optional
             Device where to initialize the tensor.
+        dtype : torch.dtype, optional
+            Dtype of the tensor.
         kwargs : float
             Keyword arguments for the different initialization methods:
 
@@ -1574,15 +1614,17 @@ 

Source code for tensorkrowch.components

         if shape is None:
             shape = self._shape
         if init_method == 'zeros':
-            return torch.zeros(shape, device=device)
+            return torch.zeros(shape, device=device, dtype=dtype)
         elif init_method == 'ones':
-            return torch.ones(shape, device=device)
+            return torch.ones(shape, device=device, dtype=dtype)
         elif init_method == 'copy':
-            return self._make_copy_tensor(shape, device=device)
+            return self._make_copy_tensor(shape, device=device, dtype=dtype)
         elif init_method == 'rand':
-            return self._make_rand_tensor(shape, device=device, **kwargs)
+            return self._make_rand_tensor(shape, device=device, dtype=dtype,
+                                          **kwargs)
         elif init_method == 'randn':
-            return self._make_randn_tensor(shape, device=device, **kwargs)
+            return self._make_randn_tensor(shape, device=device, dtype=dtype,
+                                           **kwargs)
         else:
             raise ValueError('Choose a valid `init_method`: "zeros", '
                              '"ones", "copy", "rand", "randn"')
@@ -1655,6 +1697,7 @@

Source code for tensorkrowch.components

                                  tensor: Optional[Tensor] = None,
                                  init_method: Optional[Text] = 'zeros',
                                  device: Optional[torch.device] = None,
+                                 dtype: Optional[torch.dtype] = None,
                                  **kwargs: float) -> None:
         """
         Sets a new node's tensor or creates one with :meth:`make_tensor` and sets
@@ -1673,6 +1716,8 @@ 

Source code for tensorkrowch.components

             Initialization method.
         device : torch.device, optional
             Device where to initialize the tensor.
+        dtype : torch.dtype, optional
+            Dtype of the tensor.
         kwargs : float
             Keyword arguments for the different initialization methods. See
             :meth:`make_tensor`.
@@ -1680,10 +1725,14 @@ 

Source code for tensorkrowch.components

         if tensor is not None:
             if not isinstance(tensor, Tensor):
                 raise TypeError('`tensor` should be torch.Tensor type')
-            elif device is not None:
+            if device is not None:
                 warnings.warn('`device` was specified but is being ignored. '
                               'Provide a tensor that is already in the required'
                               ' device')
+            if dtype is not None:
+                warnings.warn('`dtype` was specified but is being ignored. '
+                              'Provide a tensor that already has the required'
+                              ' dtype')
 
             if not self._compatible_shape(tensor):
                 tensor = self._crop_tensor(tensor)
@@ -1691,10 +1740,13 @@ 

Source code for tensorkrowch.components

 
         elif init_method is not None:
             node_tensor = self.tensor
-            if (device is None) and (node_tensor is not None):
-                device = node_tensor.device
+            if node_tensor is not None:
+                if device is None:
+                    device = node_tensor.device
+                if dtype is None:
+                    dtype = node_tensor.dtype
             tensor = self.make_tensor(
-                init_method=init_method, device=device, **kwargs)
+                init_method=init_method, device=device, dtype=dtype, **kwargs)
             correct_format_tensor = self._set_tensor_format(tensor)
 
         else:
@@ -1707,6 +1759,7 @@ 

Source code for tensorkrowch.components

                    tensor: Optional[Tensor] = None,
                    init_method: Optional[Text] = 'zeros',
                    device: Optional[torch.device] = None,
+                   dtype: Optional[torch.dtype] = None,
                    **kwargs: float) -> None:
         """
         Sets new node's tensor or creates one with :meth:`make_tensor` and sets
@@ -1740,6 +1793,8 @@ 

Source code for tensorkrowch.components

             Initialization method.
         device : torch.device, optional
             Device where to initialize the tensor.
+        dtype : torch.dtype, optional
+            Dtype of the tensor.
         kwargs : float
             Keyword arguments for the different initialization methods. See
             :meth:`make_tensor`.
@@ -1780,6 +1835,7 @@ 

Source code for tensorkrowch.components

             self._unrestricted_set_tensor(tensor=tensor,
                                           init_method=init_method,
                                           device=device,
+                                          dtype=dtype,
                                           **kwargs)
         else:
             raise ValueError('Node\'s tensor can only be changed if it is not'
@@ -2332,6 +2388,8 @@ 

Source code for tensorkrowch.components

         Initialization method.
     device : torch.device, optional
         Device where to initialize the tensor if ``init_method`` is provided.
+    dtype : torch.dtype, optional
+        Dtype of the tensor if ``init_method`` is provided.
     kwargs : float
         Keyword arguments for the different initialization methods. See
         :meth:`AbstractNode.make_tensor`.
@@ -2656,6 +2714,8 @@ 

Source code for tensorkrowch.components

         Initialization method.
     device : torch.device, optional
         Device where to initialize the tensor if ``init_method`` is provided.
+    dtype : torch.dtype, optional
+        Dtype of the tensor if ``init_method`` is provided.
     kwargs : float
         Keyword arguments for the different initialization methods. See
         :meth:`AbstractNode.make_tensor`.
@@ -2737,6 +2797,7 @@ 

Source code for tensorkrowch.components

                  node1_list: Optional[List[bool]] = None,
                  init_method: Optional[Text] = None,
                  device: Optional[torch.device] = None,
+                 dtype: Optional[torch.dtype] = None,
                  **kwargs: float) -> None:
 
         super().__init__(shape=shape,
@@ -2752,6 +2813,7 @@ 

Source code for tensorkrowch.components

                          node1_list=node1_list,
                          init_method=init_method,
                          device=device,
+                         dtype=dtype,
                          **kwargs)
 
     # ----------
diff --git a/docs/_build/html/_modules/tensorkrowch/decompositions/svd_decompositions.html b/docs/_build/html/_modules/tensorkrowch/decompositions/svd_decompositions.html
index dfab7d8..faa1d44 100644
--- a/docs/_build/html/_modules/tensorkrowch/decompositions/svd_decompositions.html
+++ b/docs/_build/html/_modules/tensorkrowch/decompositions/svd_decompositions.html
@@ -5,7 +5,7 @@
   
     
     
-    tensorkrowch.decompositions.svd_decompositions — TensorKrowch 1.1.2 documentation
+    tensorkrowch.decompositions.svd_decompositions — TensorKrowch 1.1.3 documentation
     
   
   
@@ -472,6 +472,9 @@ 

Source code for tensorkrowch.decompositions.svd_decompositions

tensors.append(u) prev_bond = aux_rank + + if vh.is_complex(): + s = s.to(vh.dtype) vec = torch.diag_embed(s) @ vh tensors.append(vec) @@ -608,6 +611,9 @@

Source code for tensorkrowch.decompositions.svd_decompositions

tensors.append(u) prev_bond = aux_rank + + if vh.is_complex(): + s = s.to(vh.dtype) mat = torch.diag_embed(s) @ vh mat = mat.reshape(aux_rank, in_out_dims[-2], in_out_dims[-1]) diff --git a/docs/_build/html/_modules/tensorkrowch/embeddings.html b/docs/_build/html/_modules/tensorkrowch/embeddings.html index fea19d8..c21c6f0 100644 --- a/docs/_build/html/_modules/tensorkrowch/embeddings.html +++ b/docs/_build/html/_modules/tensorkrowch/embeddings.html @@ -5,7 +5,7 @@ - tensorkrowch.embeddings — TensorKrowch 1.1.2 documentation + tensorkrowch.embeddings — TensorKrowch 1.1.3 documentation diff --git a/docs/_build/html/_modules/tensorkrowch/initializers.html b/docs/_build/html/_modules/tensorkrowch/initializers.html index 7ae7d3d..a2bdba3 100644 --- a/docs/_build/html/_modules/tensorkrowch/initializers.html +++ b/docs/_build/html/_modules/tensorkrowch/initializers.html @@ -5,7 +5,7 @@ - tensorkrowch.initializers — TensorKrowch 1.1.2 documentation + tensorkrowch.initializers — TensorKrowch 1.1.3 documentation diff --git a/docs/_build/html/_modules/tensorkrowch/models/mpo.html b/docs/_build/html/_modules/tensorkrowch/models/mpo.html index 37300e8..92ac5ec 100644 --- a/docs/_build/html/_modules/tensorkrowch/models/mpo.html +++ b/docs/_build/html/_modules/tensorkrowch/models/mpo.html @@ -5,7 +5,7 @@ - tensorkrowch.models.mpo — TensorKrowch 1.1.2 documentation + tensorkrowch.models.mpo — TensorKrowch 1.1.3 documentation @@ -408,6 +408,8 @@

Source code for tensorkrowch.models.mpo

         explanation of the different initialization methods.
     device : torch.device, optional
         Device where to initialize the tensors if ``init_method`` is provided.
+    dtype : torch.dtype, optional
+        Dtype of the tensor if ``init_method`` is provided.
     kwargs : float
         Keyword arguments for the different initialization methods. See
         :meth:`~tensorkrowch.AbstractNode.make_tensor`.
@@ -448,6 +450,7 @@ 

Source code for tensorkrowch.models.mpo

                  n_batches: int = 1,
                  init_method: Text = 'randn',
                  device: Optional[torch.device] = None,
+                 dtype: Optional[torch.dtype] = None,
                  **kwargs) -> None:
 
         super().__init__(name='mpo')
@@ -594,6 +597,7 @@ 

Source code for tensorkrowch.models.mpo

         self.initialize(tensors=tensors,
                         init_method=init_method,
                         device=device,
+                        dtype=dtype,
                         **kwargs)
     
     # ----------
@@ -726,6 +730,7 @@ 

Source code for tensorkrowch.models.mpo

                    tensors: Optional[Sequence[torch.Tensor]] = None,
                    init_method: Optional[Text] = 'randn',
                    device: Optional[torch.device] = None,
+                   dtype: Optional[torch.dtype] = None,
                    **kwargs: float) -> None:
         """
         Initializes all the nodes of the :class:`MPO`. It can be called when
@@ -735,7 +740,7 @@ 

Source code for tensorkrowch.models.mpo

         
         * ``{"zeros", "ones", "copy", "rand", "randn"}``: Each node is
           initialized calling :meth:`~tensorkrowch.AbstractNode.set_tensor` with
-          the given method, ``device`` and ``kwargs``.
+          the given method, ``device``, ``dtype`` and ``kwargs``.
         
         Parameters
         ----------
@@ -749,6 +754,8 @@ 

Source code for tensorkrowch.models.mpo

             Initialization method.
         device : torch.device, optional
             Device where to initialize the tensors if ``init_method`` is provided.
+        dtype : torch.dtype, optional
+            Dtype of the tensor if ``init_method`` is provided.
         kwargs : float
             Keyword arguments for the different initialization methods. See
             :meth:`~tensorkrowch.AbstractNode.make_tensor`.
@@ -763,6 +770,8 @@ 

Source code for tensorkrowch.models.mpo

                 
                 if device is None:
                     device = tensors[0].device
+                if dtype is None:
+                    dtype = tensors[0].dtype
                 
                 if len(tensors) == 1:
                     tensors[0] = tensors[0].reshape(1,
@@ -773,13 +782,15 @@ 

Source code for tensorkrowch.models.mpo

                 else:
                     # Left node
                     aux_tensor = torch.zeros(*self._mats_env[0].shape,
-                                             device=device)
+                                             device=device,
+                                             dtype=dtype)
                     aux_tensor[0] = tensors[0]
                     tensors[0] = aux_tensor
                     
                     # Right node
                     aux_tensor = torch.zeros(*self._mats_env[-1].shape,
-                                             device=device)
+                                             device=device,
+                                             dtype=dtype)
                     aux_tensor[..., 0, :] = tensors[-1]
                     tensors[-1] = aux_tensor
                 
@@ -791,10 +802,13 @@ 

Source code for tensorkrowch.models.mpo

             for i, node in enumerate(self._mats_env):
                 node.set_tensor(init_method=init_method,
                                 device=device,
+                                dtype=dtype,
                                 **kwargs)
                 
                 if self._boundary == 'obc':
-                    aux_tensor = torch.zeros(*node.shape, device=device)
+                    aux_tensor = torch.zeros(*node.shape,
+                                             device=device,
+                                             dtype=dtype)
                     if i == 0:
                         # Left node
                         aux_tensor[0] = node.tensor[0]
@@ -804,8 +818,12 @@ 

Source code for tensorkrowch.models.mpo

                     node.tensor = aux_tensor
         
         if self._boundary == 'obc':
-            self._left_node.set_tensor(init_method='copy', device=device)
-            self._right_node.set_tensor(init_method='copy', device=device)
+ self._left_node.set_tensor(init_method='copy', + device=device, + dtype=dtype) + self._right_node.set_tensor(init_method='copy', + device=device, + dtype=dtype)
[docs] def set_data_nodes(self) -> None: """ @@ -842,7 +860,8 @@

Source code for tensorkrowch.models.mpo

                       tensors=None,
                       n_batches=self._n_batches,
                       init_method=None,
-                      device=None)
+                      device=None,
+                      dtype=None)
         new_mpo.name = self.name + '_copy'
         if share_tensors:
             for new_node, node in zip(new_mpo._mats_env, self._mats_env):
@@ -1352,6 +1371,8 @@ 

Source code for tensorkrowch.models.mpo

         explanation of the different initialization methods.
     device : torch.device, optional
         Device where to initialize the tensors if ``init_method`` is provided.
+    dtype : torch.dtype, optional
+        Dtype of the tensor if ``init_method`` is provided.
     kwargs : float
         Keyword arguments for the different initialization methods. See
         :meth:`~tensorkrowch.AbstractNode.make_tensor`.
@@ -1380,6 +1401,7 @@ 

Source code for tensorkrowch.models.mpo

                  n_batches: int = 1,
                  init_method: Text = 'randn',
                  device: Optional[torch.device] = None,
+                 dtype: Optional[torch.dtype] = None,
                  **kwargs) -> None:
 
         tensors = None
@@ -1424,6 +1446,7 @@ 

Source code for tensorkrowch.models.mpo

                          n_batches=n_batches,
                          init_method=init_method,
                          device=device,
+                         dtype=dtype,
                          **kwargs)
         self.name = 'umpo'
     
@@ -1449,6 +1472,7 @@ 

Source code for tensorkrowch.models.mpo

                    tensors: Optional[Sequence[torch.Tensor]] = None,
                    init_method: Optional[Text] = 'randn',
                    device: Optional[torch.device] = None,
+                   dtype: Optional[torch.dtype] = None,
                    **kwargs: float) -> None:
         """
         Initializes the common tensor of the :class:`UMPO`. It can be called
@@ -1458,7 +1482,7 @@ 

Source code for tensorkrowch.models.mpo

         
         * ``{"zeros", "ones", "copy", "rand", "randn"}``: The tensor is
           initialized calling :meth:`~tensorkrowch.AbstractNode.set_tensor` with
-          the given method, ``device`` and ``kwargs``.
+          the given method, ``device``, ``dtype`` and ``kwargs``.
         
         Parameters
         ----------
@@ -1470,6 +1494,8 @@ 

Source code for tensorkrowch.models.mpo

             Initialization method.
         device : torch.device, optional
             Device where to initialize the tensors if ``init_method`` is provided.
+        dtype : torch.dtype, optional
+            Dtype of the tensor if ``init_method`` is provided.
         kwargs : float
             Keyword arguments for the different initialization methods. See
             :meth:`~tensorkrowch.AbstractNode.make_tensor`.
@@ -1480,6 +1506,7 @@ 

Source code for tensorkrowch.models.mpo

         elif init_method is not None:
             self.uniform_memory.set_tensor(init_method=init_method,
                                            device=device,
+                                           dtype=dtype,
                                            **kwargs)
[docs] def copy(self, share_tensors: bool = False) -> 'UMPO': @@ -1507,7 +1534,8 @@

Source code for tensorkrowch.models.mpo

                        tensor=None,
                        n_batches=self._n_batches,
                        init_method=None,
-                       device=None)
+                       device=None,
+                       dtype=None)
         new_mpo.name = self.name + '_copy'
         if share_tensors:
             new_mpo.uniform_memory.tensor = self.uniform_memory.tensor
diff --git a/docs/_build/html/_modules/tensorkrowch/models/mps.html b/docs/_build/html/_modules/tensorkrowch/models/mps.html
index 563ef92..17a676b 100644
--- a/docs/_build/html/_modules/tensorkrowch/models/mps.html
+++ b/docs/_build/html/_modules/tensorkrowch/models/mps.html
@@ -5,7 +5,7 @@
   
     
     
-    tensorkrowch.models.mps — TensorKrowch 1.1.2 documentation
+    tensorkrowch.models.mps — TensorKrowch 1.1.3 documentation
     
   
   
@@ -438,6 +438,8 @@ 

Source code for tensorkrowch.models.mps

         explanation of the different initialization methods.
     device : torch.device, optional
         Device where to initialize the tensors if ``init_method`` is provided.
+    dtype : torch.dtype, optional
+        Dtype of the tensor if ``init_method`` is provided.
     kwargs : float
         Keyword arguments for the different initialization methods. See
         :meth:`~tensorkrowch.AbstractNode.make_tensor`.
@@ -497,6 +499,7 @@ 

Source code for tensorkrowch.models.mps

                  n_batches: int = 1,
                  init_method: Text = 'randn',
                  device: Optional[torch.device] = None,
+                 dtype: Optional[torch.dtype] = None,
                  **kwargs) -> None:
 
         super().__init__(name='mps')
@@ -690,6 +693,7 @@ 

Source code for tensorkrowch.models.mps

         self.initialize(tensors=tensors,
                         init_method=init_method,
                         device=device,
+                        dtype=dtype,
                         **kwargs)
     
     # ----------
@@ -906,7 +910,9 @@ 

Source code for tensorkrowch.models.mps

                 if i == self._n_features - 1:
                     self._mats_env[-1]['right'] ^ self._right_node['left']
     
-    def _make_canonical(self, device: Optional[torch.device] = None) -> List[torch.Tensor]:
+    def _make_canonical(self,
+                        device: Optional[torch.device] = None,
+                        dtype: Optional[torch.dtype] = None) -> List[torch.Tensor]:
         """
         Creates random unitaries to initialize the MPS in canonical form with
         orthogonality center at the rightmost node. Unitaries in nodes are
@@ -934,22 +940,22 @@ 

Source code for tensorkrowch.models.mps

                 phys_dim = node_shape[1]
             size = max(aux_shape[0], aux_shape[1])
             
-            tensor = random_unitary(size, device=device)
+            tensor = random_unitary(size, device=device, dtype=dtype)
             tensor = tensor[:min(aux_shape[0], size), :min(aux_shape[1], size)]
             tensor = tensor.reshape(*node_shape)
             
             if i == (self._n_features - 1):
-                if self._boundary == 'obc':
-                    tensor = tensor.t() / tensor.norm() * sqrt(phys_dim)
-                else:
-                    tensor = tensor / tensor.norm() * sqrt(phys_dim)
-            else:
-                tensor = tensor * sqrt(phys_dim)
+                if (self._boundary == 'obc') and (i == 0):
+                    tensor = tensor[:, 0]
+                tensor = tensor / tensor.norm()
+            tensor = tensor * sqrt(phys_dim)
             
             tensors.append(tensor)
         return tensors
     
-    def _make_unitaries(self, device: Optional[torch.device] = None) -> List[torch.Tensor]:
+    def _make_unitaries(self,
+                        device: Optional[torch.device] = None,
+                        dtype: Optional[torch.dtype] = None) -> List[torch.Tensor]:
         """
         Creates random unitaries to initialize the MPS nodes as stacks of
         unitaries.
@@ -973,7 +979,7 @@ 

Source code for tensorkrowch.models.mps

                 size_2 = min(node.shape[2], size)
             
             for _ in range(node.shape[1]):
-                tensor = random_unitary(size, device=device)
+                tensor = random_unitary(size, device=device, dtype=dtype)
                 tensor = tensor[:size_1, :size_2]
                 units.append(tensor)
             
@@ -981,19 +987,18 @@ 

Source code for tensorkrowch.models.mps

             
             if self._boundary == 'obc':
                 if i == 0:
-                    tensors.append(units.squeeze(0))
+                    units = units.squeeze(0)
                 elif i == (self._n_features - 1):
-                    tensors.append(units.squeeze(-1))
-                else:
-                    tensors.append(units)
-            else:    
-                tensors.append(units)
+                    units = units.squeeze(-1)
+            tensors.append(units)
+        
         return tensors
 
 
[docs] def initialize(self, tensors: Optional[Sequence[torch.Tensor]] = None, init_method: Optional[Text] = 'randn', device: Optional[torch.device] = None, + dtype: Optional[torch.dtype] = None, **kwargs: float) -> None: """ Initializes all the nodes of the :class:`MPS`. It can be called when @@ -1003,7 +1008,7 @@

Source code for tensorkrowch.models.mps

         
         * ``{"zeros", "ones", "copy", "rand", "randn"}``: Each node is
           initialized calling :meth:`~tensorkrowch.AbstractNode.set_tensor` with
-          the given method, ``device`` and ``kwargs``.
+          the given method, ``device``, ``dtype`` and ``kwargs``.
         
         * ``"randn_eye"``: Nodes are initialized as in this
           `paper <https://arxiv.org/abs/1605.03795>`_, adding identities at the
@@ -1033,14 +1038,16 @@ 

Source code for tensorkrowch.models.mps

             Initialization method.
         device : torch.device, optional
             Device where to initialize the tensors if ``init_method`` is provided.
+        dtype : torch.dtype, optional
+            Dtype of the tensor if ``init_method`` is provided.
         kwargs : float
             Keyword arguments for the different initialization methods. See
             :meth:`~tensorkrowch.AbstractNode.make_tensor`.
         """
         if init_method == 'unit':
-            tensors = self._make_unitaries(device=device)
+            tensors = self._make_unitaries(device=device, dtype=dtype)
         elif init_method == 'canonical':
-            tensors = self._make_canonical(device=device)
+            tensors = self._make_canonical(device=device, dtype=dtype)
 
         if tensors is not None:
             if len(tensors) != self._n_features:
@@ -1052,19 +1059,23 @@ 

Source code for tensorkrowch.models.mps

                 
                 if device is None:
                     device = tensors[0].device
+                if dtype is None:
+                    dtype = tensors[0].dtype
                 
                 if len(tensors) == 1:
                     tensors[0] = tensors[0].reshape(1, -1, 1)
                 else:
                     # Left node
                     aux_tensor = torch.zeros(*self._mats_env[0].shape,
-                                             device=device)
+                                             device=device,
+                                             dtype=dtype)
                     aux_tensor[0] = tensors[0]
                     tensors[0] = aux_tensor
                     
                     # Right node
                     aux_tensor = torch.zeros(*self._mats_env[-1].shape,
-                                             device=device)
+                                             device=device,
+                                             dtype=dtype)
                     aux_tensor[..., 0] = tensors[-1]
                     tensors[-1] = aux_tensor
                 
@@ -1080,16 +1091,20 @@ 

Source code for tensorkrowch.models.mps

             for i, node in enumerate(self._mats_env):
                 node.set_tensor(init_method=init_method,
                                 device=device,
+                                dtype=dtype,
                                 **kwargs)
                 if add_eye:
                     aux_tensor = node.tensor.detach()
                     aux_tensor[:, 0, :] += torch.eye(node.shape[0],
                                                      node.shape[2],
-                                                     device=device)
+                                                     device=device,
+                                                     dtype=dtype)
                     node.tensor = aux_tensor
                 
                 if self._boundary == 'obc':
-                    aux_tensor = torch.zeros(*node.shape, device=device)
+                    aux_tensor = torch.zeros(*node.shape,
+                                             device=device,
+                                             dtype=dtype)
                     if i == 0:
                         # Left node
                         aux_tensor[0] = node.tensor[0]
@@ -1100,8 +1115,12 @@ 

Source code for tensorkrowch.models.mps

                         node.tensor = aux_tensor
         
         if self._boundary == 'obc':
-            self._left_node.set_tensor(init_method='copy', device=device)
-            self._right_node.set_tensor(init_method='copy', device=device)
+ self._left_node.set_tensor(init_method='copy', + device=device, + dtype=dtype) + self._right_node.set_tensor(init_method='copy', + device=device, + dtype=dtype)
[docs] def set_data_nodes(self) -> None: """ @@ -1139,7 +1158,8 @@

Source code for tensorkrowch.models.mps

                       out_features=self._out_features,
                       n_batches=self._n_batches,
                       init_method=None,
-                      device=None)
+                      device=None,
+                      dtype=None)
         new_mps.name = self.name + '_copy'
         if share_tensors:
             for new_node, node in zip(new_mps._mats_env, self._mats_env):
@@ -1552,10 +1572,10 @@ 

Source code for tensorkrowch.models.mps

                 copied_nodes = []
                 for node in nodes_out_env:
                     copied_node = node.__class__(shape=node._shape,
-                                              axes_names=node.axes_names,
-                                              name='virtual_result_copy',
-                                              network=self,
-                                              virtual=True)
+                                                 axes_names=node.axes_names,
+                                                 name='virtual_result_copy',
+                                                 network=self,
+                                                 virtual=True)
                     copied_node.set_tensor_from(node)
                     copied_nodes.append(copied_node)
                     
@@ -1643,6 +1663,12 @@ 

Source code for tensorkrowch.models.mps

                         # Connect copies directly to output nodes
                         copied_node['input'] ^ node['input']
                 
+                # If MPS nodes are complex, copied nodes are their conjugates
+                is_complex = copied_nodes[0].is_complex()
+                if is_complex:
+                    for i, node in enumerate(copied_nodes):
+                        copied_nodes[i] = node.conj()
+                
                 # Contract output nodes with copies
                 mats_out_env = self._input_contraction(
                     nodes_env=nodes_out_env,
@@ -1764,6 +1790,12 @@ 

Source code for tensorkrowch.models.mps

             copied_nodes = []
             for node in all_nodes:
                 copied_nodes.append(node.neighbours('input'))
+        
+        # If MPS nodes are complex, copied nodes are their conjugates
+        is_complex = copied_nodes[0].is_complex()
+        if is_complex:
+            for i, node in enumerate(copied_nodes):
+                copied_nodes[i] = node.conj()
             
         # Contract output nodes with copies
         mats_out_env = self._input_contraction(
@@ -1872,10 +1904,14 @@ 

Source code for tensorkrowch.models.mps

         if n_dims >= 1:
             if n_dims == 1:
                 data = torch.cat(data, dim=-1)
-                data = basis(data, dim=dims[0]).float().to(self.in_env[0].device)
+                data = basis(data, dim=dims[0])\
+                    .to(self.in_env[0].dtype)\
+                    .to(self.in_env[0].device)
             elif n_dims > 1:
                 data = [
-                    basis(dat, dim=dim).squeeze(-2).float().to(self.in_env[0].device)
+                    basis(dat, dim=dim).squeeze(-2)\
+                        .to(self.in_env[0].dtype)\
+                        .to(self.in_env[0].device)
                     for dat, dim in zip(data, dims)
                     ]
             
@@ -2002,7 +2038,7 @@ 

Source code for tensorkrowch.models.mps

                                   middle_tensor.shape[-1]),         # right
             full_matrices=False)
         
-        s = s[s > 0]
+        s = s[s.pow(2) > 0]
         entropy = -(s.pow(2) * s.pow(2).log()).sum()
         
         # Rescale
@@ -2195,6 +2231,7 @@ 

Source code for tensorkrowch.models.mps

                              side: Text = 'right'):
         """Projects all nodes into a space of dimension ``bond_dim``."""
         device = nodes[0].tensor.device
+        dtype = nodes[0].tensor.dtype
 
         if side == 'left':
             nodes.reverse()
@@ -2219,7 +2256,7 @@ 

Source code for tensorkrowch.models.mps

 
                 proj_mat_node.tensor = torch.eye(
                     torch.tensor(phys_dim_lst).prod().int().item(),
-                    bond_dim).view(*phys_dim_lst, -1).to(device)
+                    bond_dim).view(*phys_dim_lst, -1).to(dtype).to(device)
                 for k in range(j + 1):
                     nodes[k]['input'] ^ proj_mat_node[k]
 
@@ -2239,7 +2276,7 @@ 

Source code for tensorkrowch.models.mps

 
             proj_mat_node.tensor = torch.eye(
                 torch.tensor(phys_dim_lst).prod().int().item(),
-                bond_dim).view(*phys_dim_lst, -1).to(device)
+                bond_dim).view(*phys_dim_lst, -1).to(dtype).to(device)
             for k in range(j + 1):
                 nodes[k]['input'] ^ proj_mat_node[k]
 
@@ -2256,7 +2293,8 @@ 

Source code for tensorkrowch.models.mps

                                  name=f'proj_vec_node_{side}_({k})',
                                  network=self)
 
-            proj_vec_node.tensor = torch.eye(phys_dim, 1).squeeze().to(device)
+            proj_vec_node.tensor = torch.eye(phys_dim, 1).squeeze()\
+                .to(dtype).to(device)
             nodes[k]['input'] ^ proj_vec_node['input']
             line_mat_nodes.append(proj_vec_node @ nodes[k])
 
@@ -2424,6 +2462,8 @@ 

Source code for tensorkrowch.models.mps

         explanation of the different initialization methods.
     device : torch.device, optional
         Device where to initialize the tensors if ``init_method`` is provided.
+    dtype : torch.dtype, optional
+        Dtype of the tensor if ``init_method`` is provided.
     kwargs : float
         Keyword arguments for the different initialization methods. See
         :meth:`~tensorkrowch.AbstractNode.make_tensor`.
@@ -2452,6 +2492,7 @@ 

Source code for tensorkrowch.models.mps

                  n_batches: int = 1,
                  init_method: Text = 'randn',
                  device: Optional[torch.device] = None,
+                 dtype: Optional[torch.dtype] = None,
                  **kwargs) -> None:
         
         tensors = None
@@ -2493,6 +2534,7 @@ 

Source code for tensorkrowch.models.mps

                          n_batches=n_batches,
                          init_method=init_method,
                          device=device,
+                         dtype=dtype,
                          **kwargs)
         self.name = 'umps'
 
@@ -2513,7 +2555,9 @@ 

Source code for tensorkrowch.models.mps

         for node in self._mats_env:
             node.set_tensor_from(uniform_memory)
     
-    def _make_canonical(self, device: Optional[torch.device] = None) -> List[torch.Tensor]:
+    def _make_canonical(self,
+                        device: Optional[torch.device] = None,
+                        dtype: Optional[torch.dtype] = None) -> List[torch.Tensor]:
         """
         Creates random unitaries to initialize the MPS in canonical form with
         orthogonality center at the rightmost node. Unitaries in nodes are
@@ -2527,13 +2571,15 @@ 

Source code for tensorkrowch.models.mps

         size = max(aux_shape[0], aux_shape[1])
         phys_dim = node_shape[1]
         
-        tensor = random_unitary(size, device=device)
+        tensor = random_unitary(size, device=device, dtype=dtype)
         tensor = tensor[:min(aux_shape[0], size), :min(aux_shape[1], size)]
         tensor = tensor.reshape(*node_shape)
         tensor = tensor * sqrt(phys_dim)
         return tensor
     
-    def _make_unitaries(self, device: Optional[torch.device] = None) -> List[torch.Tensor]:
+    def _make_unitaries(self,
+                        device: Optional[torch.device] = None,
+                        dtype: Optional[torch.dtype] = None) -> List[torch.Tensor]:
         """
         Creates random unitaries to initialize the MPS nodes as stacks of
         unitaries.
@@ -2543,7 +2589,7 @@ 

Source code for tensorkrowch.models.mps

         
         units = []
         for _ in range(node_shape[1]):
-            tensor = random_unitary(node_shape[0], device=device)
+            tensor = random_unitary(node_shape[0], device=device, dtype=dtype)
             units.append(tensor)
         tensor = torch.stack(units, dim=1)
         return tensor
@@ -2552,6 +2598,7 @@ 

Source code for tensorkrowch.models.mps

                    tensors: Optional[Sequence[torch.Tensor]] = None,
                    init_method: Optional[Text] = 'randn',
                    device: Optional[torch.device] = None,
+                   dtype: Optional[torch.dtype] = None,
                    **kwargs: float) -> None:
         """
         Initializes the common tensor of the :class:`UMPS`. It can be called
@@ -2561,7 +2608,7 @@ 

Source code for tensorkrowch.models.mps

         
         * ``{"zeros", "ones", "copy", "rand", "randn"}``: The tensor is
           initialized calling :meth:`~tensorkrowch.AbstractNode.set_tensor` with
-          the given method, ``device`` and ``kwargs``.
+          the given method, ``device``, ``dtype`` and ``kwargs``.
         
         * ``"randn_eye"``: Tensor is initialized as in this
           `paper <https://arxiv.org/abs/1605.03795>`_, adding identities at the
@@ -2588,6 +2635,8 @@ 

Source code for tensorkrowch.models.mps

             Initialization method.
         device : torch.device, optional
             Device where to initialize the tensors if ``init_method`` is provided.
+        dtype : torch.dtype, optional
+            Dtype of the tensor if ``init_method`` is provided.
         kwargs : float
             Keyword arguments for the different initialization methods. See
             :meth:`~tensorkrowch.AbstractNode.make_tensor`.
@@ -2595,9 +2644,9 @@ 

Source code for tensorkrowch.models.mps

         node = self.uniform_memory
         
         if init_method == 'unit':
-            tensors = [self._make_unitaries(device=device)]
+            tensors = [self._make_unitaries(device=device, dtype=dtype)]
         elif init_method == 'canonical':
-            tensors = [self._make_canonical(device=device)]
+            tensors = [self._make_canonical(device=device, dtype=dtype)]
         
         if tensors is not None:
             node.tensor = tensors[0]
@@ -2610,12 +2659,14 @@ 

Source code for tensorkrowch.models.mps

             
             node.set_tensor(init_method=init_method,
                             device=device,
+                            dtype=dtype,
                             **kwargs)
             if add_eye:
                 aux_tensor = node.tensor.detach()
                 aux_tensor[:, 0, :] += torch.eye(node.shape[0],
                                                  node.shape[2],
-                                                 device=device)
+                                                 device=device,
+                                                 dtype=dtype)
                 node.tensor = aux_tensor
[docs] def copy(self, share_tensors: bool = False) -> 'UMPS': @@ -2644,7 +2695,8 @@

Source code for tensorkrowch.models.mps

                        out_features=self._out_features,
                        n_batches=self._n_batches,
                        init_method=None,
-                       device=None)
+                       device=None,
+                       dtype=None)
         new_mps.name = self.name + '_copy'
         if share_tensors:
             new_mps.uniform_memory.tensor = self.uniform_memory.tensor
@@ -2788,6 +2840,8 @@ 

Source code for tensorkrowch.models.mps

         explanation of the different initialization methods.
     device : torch.device, optional
         Device where to initialize the tensors if ``init_method`` is provided.
+    dtype : torch.dtype, optional
+        Dtype of the tensor if ``init_method`` is provided.
     kwargs : float
         Keyword arguments for the different initialization methods. See
         :meth:`~tensorkrowch.AbstractNode.make_tensor`.
@@ -2829,6 +2883,7 @@ 

Source code for tensorkrowch.models.mps

                  n_batches: int = 1,
                  init_method: Text = 'randn',
                  device: Optional[torch.device] = None,
+                 dtype: Optional[torch.dtype] = None,
                  **kwargs) -> None:
         
         phys_dim = None
@@ -2890,6 +2945,7 @@ 

Source code for tensorkrowch.models.mps

                          n_batches=n_batches,
                          init_method=init_method,
                          device=device,
+                         dtype=dtype,
                          **kwargs)
         self.name = 'mpslayer'
         self._in_dim = self._phys_dim[:out_position] + \
@@ -2919,7 +2975,9 @@ 

Source code for tensorkrowch.models.mps

         """Returns the output node."""
         return self._mats_env[self._out_position]
     
-    def _make_canonical(self, device: Optional[torch.device] = None) -> List[torch.Tensor]:
+    def _make_canonical(self,
+                        device: Optional[torch.device] = None,
+                        dtype: Optional[torch.dtype] = None) -> List[torch.Tensor]:
         """
         Creates random unitaries to initialize the MPS in canonical form with
         orthogonality center at the rightmost node. Unitaries in nodes are
@@ -2944,14 +3002,16 @@ 

Source code for tensorkrowch.models.mps

                 phys_dim = node_shape[1]
             size = max(aux_shape[0], aux_shape[1])
             
-            tensor = random_unitary(size, device=device)
+            tensor = random_unitary(size, device=device, dtype=dtype)
             tensor = tensor[:min(aux_shape[0], size), :min(aux_shape[1], size)]
             tensor = tensor.reshape(*node_shape)
             
             left_tensors.append(tensor * sqrt(phys_dim))
         
         # Output node
-        out_tensor = torch.randn(self.out_node.shape, device=device)
+        out_tensor = torch.randn(self.out_node.shape,
+                                 device=device,
+                                 dtype=dtype)
         phys_dim = out_tensor.shape[1]
         if self._boundary == 'obc':
             if self._out_position == 0:
@@ -2978,7 +3038,7 @@ 

Source code for tensorkrowch.models.mps

                 phys_dim = node_shape[1]
             size = max(aux_shape[0], aux_shape[1])
             
-            tensor = random_unitary(size, device=device)
+            tensor = random_unitary(size, device=device, dtype=dtype)
             tensor = tensor[:min(aux_shape[0], size), :min(aux_shape[1], size)]
             tensor = tensor.reshape(*node_shape)
             
@@ -2989,7 +3049,9 @@ 

Source code for tensorkrowch.models.mps

         tensors = left_tensors + [out_tensor] + right_tensors
         return tensors
     
-    def _make_unitaries(self, device: Optional[torch.device] = None) -> List[torch.Tensor]:
+    def _make_unitaries(self,
+                        device: Optional[torch.device] = None,
+                        dtype: Optional[torch.dtype] = None) -> List[torch.Tensor]:
         """
         Creates random unitaries to initialize the MPS nodes as stacks of
         unitaries.
@@ -3011,7 +3073,7 @@ 

Source code for tensorkrowch.models.mps

                 size_2 = min(node.shape[2], size)
             
             for _ in range(node.shape[1]):
-                tensor = random_unitary(size, device=device)
+                tensor = random_unitary(size, device=device, dtype=dtype)
                 tensor = tensor[:size_1, :size_2]
                 units.append(tensor)
             
@@ -3026,7 +3088,9 @@ 

Source code for tensorkrowch.models.mps

                 left_tensors.append(units)
         
         # Output node
-        out_tensor = torch.randn(self.out_node.shape, device=device)
+        out_tensor = torch.randn(self.out_node.shape,
+                                 device=device,
+                                 dtype=dtype)
         if self._boundary == 'obc':
             if self._out_position == 0:
                 out_tensor = out_tensor[0]
@@ -3050,7 +3114,7 @@ 

Source code for tensorkrowch.models.mps

                 size_2 = min(node.shape[2], size)
             
             for _ in range(node.shape[1]):
-                tensor = random_unitary(size, device=device).t()
+                tensor = random_unitary(size, device=device, dtype=dtype).H
                 tensor = tensor[:size_1, :size_2]
                 units.append(tensor)
             
@@ -3068,63 +3132,12 @@ 

Source code for tensorkrowch.models.mps

         # All tensors
         tensors = left_tensors + [out_tensor] + right_tensors
         return tensors
-
-    def initialize(self,
-                   tensors: Optional[Sequence[torch.Tensor]] = None,
-                   init_method: Optional[Text] = 'randn',
-                   device: Optional[torch.device] = None,
-                   **kwargs: float) -> None:
-        """
-        Initializes all the nodes of the :class:`MPS`. It can be called when
-        instantiating the model, or to override the existing nodes' tensors.
-        
-        There are different methods to initialize the nodes:
-        
-        * ``{"zeros", "ones", "copy", "rand", "randn"}``: Each node is
-          initialized calling :meth:`~tensorkrowch.AbstractNode.set_tensor` with
-          the given method, ``device`` and ``kwargs``.
-        
-        * ``"randn_eye"``: Nodes are initialized as in this
-          `paper <https://arxiv.org/abs/1605.03795>`_, adding identities at the
-          top of random gaussian tensors. In this case, ``std`` should be
-          specified with a low value, e.g., ``std = 1e-9``.
-        
-        * ``"unit"``: Nodes are initialized as stacks of random unitaries. This,
-          combined (at least) with an embedding of the inputs as elements of
-          the computational basis (:func:`~tensorkrowch.embeddings.discretize`
-          combined with :func:`~tensorkrowch.embeddings.basis`)
-        
-        * ``"canonical"```: MPS is initialized in canonical form with a squared
-          norm `close` to the product of all the physical dimensions (if bond
-          dimensions are bigger than the powers of the physical dimensions,
-          the norm could vary). Th orthogonality center is at the rightmost
-          node.
-        
-        Parameters
-        ----------
-        tensors : list[torch.Tensor] or tuple[torch.Tensor], optional
-            Sequence of tensors to set in each of the MPS nodes. If ``boundary``
-            is ``"obc"``, all tensors should be rank-3, except the first and
-            last ones, which can be rank-2, or rank-1 (if the first and last are
-            the same). If ``boundary`` is ``"pbc"``, all tensors should be
-            rank-3.
-        init_method : {"zeros", "ones", "copy", "rand", "randn", "randn_eye", "unit", "canonical"}, optional
-            Initialization method.
-        device : torch.device, optional
-            Device where to initialize the tensors if ``init_method`` is provided.
-        kwargs : float
-            Keyword arguments for the different initialization methods. See
-            :meth:`~tensorkrowch.AbstractNode.make_tensor`.
-        """
-        if init_method == 'unit':
-            tensors = self._make_unitaries(device=device)
-        elif init_method == 'canonical':
-            tensors = self._make_canonical(device=device)
     
 
[docs] def initialize(self, tensors: Optional[Sequence[torch.Tensor]] = None, init_method: Optional[Text] = 'randn', device: Optional[torch.device] = None, + dtype: Optional[torch.dtype] = None, **kwargs: float) -> None: """ Initializes all the nodes of the :class:`MPSLayer`. It can be called when @@ -3134,7 +3147,7 @@

Source code for tensorkrowch.models.mps

         
         * ``{"zeros", "ones", "copy", "rand", "randn"}``: Each node is
           initialized calling :meth:`~tensorkrowch.AbstractNode.set_tensor` with
-          the given method, ``device`` and ``kwargs``.
+          the given method, ``device``, ``dtype`` and ``kwargs``.
         
         * ``"randn_eye"``: Nodes are initialized as in this
           `paper <https://arxiv.org/abs/1605.03795>`_, adding identities at the
@@ -3163,14 +3176,16 @@ 

Source code for tensorkrowch.models.mps

             Initialization method.
         device : torch.device, optional
             Device where to initialize the tensors if ``init_method`` is provided.
+        dtype : torch.dtype, optional
+            Dtype of the tensor if ``init_method`` is provided.
         kwargs : float
             Keyword arguments for the different initialization methods. See
             :meth:`~tensorkrowch.AbstractNode.make_tensor`.
         """
         if init_method == 'unit':
-            tensors = self._make_unitaries(device=device)
+            tensors = self._make_unitaries(device=device, dtype=dtype)
         elif init_method == 'canonical':
-            tensors = self._make_canonical(device=device)
+            tensors = self._make_canonical(device=device, dtype=dtype)
 
         if tensors is not None:
             if len(tensors) != self._n_features:
@@ -3182,19 +3197,23 @@ 

Source code for tensorkrowch.models.mps

                 
                 if device is None:
                     device = tensors[0].device
+                if dtype is None:
+                    dtype = tensors[0].dtype
                 
                 if len(tensors) == 1:
                     tensors[0] = tensors[0].reshape(1, -1, 1)
                 else:
                     # Left node
                     aux_tensor = torch.zeros(*self._mats_env[0].shape,
-                                             device=device)
+                                             device=device,
+                                             dtype=dtype)
                     aux_tensor[0] = tensors[0]
                     tensors[0] = aux_tensor
                     
                     # Right node
                     aux_tensor = torch.zeros(*self._mats_env[-1].shape,
-                                             device=device)
+                                             device=device,
+                                             dtype=dtype)
                     aux_tensor[..., 0] = tensors[-1]
                     tensors[-1] = aux_tensor
                 
@@ -3210,12 +3229,14 @@ 

Source code for tensorkrowch.models.mps

             for i, node in enumerate(self._mats_env):
                 node.set_tensor(init_method=init_method,
                                 device=device,
+                                dtype=dtype,
                                 **kwargs)
                 if add_eye:
                     aux_tensor = node.tensor.detach()
                     eye_tensor = torch.eye(node.shape[0],
                                            node.shape[2],
-                                           device=device)
+                                           device=device,
+                                           dtype=dtype)
                     if i == self._out_position:
                         eye_tensor = eye_tensor.unsqueeze(1)
                         eye_tensor = eye_tensor.expand(node.shape)
@@ -3225,7 +3246,9 @@ 

Source code for tensorkrowch.models.mps

                     node.tensor = aux_tensor
                 
                 if self._boundary == 'obc':
-                    aux_tensor = torch.zeros(*node.shape, device=device)
+                    aux_tensor = torch.zeros(*node.shape,
+                                             device=device,
+                                             dtype=dtype)
                     if i == 0:
                         # Left node
                         aux_tensor[0] = node.tensor[0]
@@ -3236,8 +3259,12 @@ 

Source code for tensorkrowch.models.mps

                         node.tensor = aux_tensor
         
         if self._boundary == 'obc':
-            self._left_node.set_tensor(init_method='copy', device=device)
-            self._right_node.set_tensor(init_method='copy', device=device)
+ self._left_node.set_tensor(init_method='copy', + device=device, + dtype=dtype) + self._right_node.set_tensor(init_method='copy', + device=device, + dtype=dtype)
[docs] def copy(self, share_tensors: bool = False) -> 'MPSLayer': """ @@ -3266,7 +3293,8 @@

Source code for tensorkrowch.models.mps

                            tensors=None,
                            n_batches=self._n_batches,
                            init_method=None,
-                           device=None)
+                           device=None,
+                           dtype=None)
         new_mps.name = self.name + '_copy'
         if share_tensors:
             for new_node, node in zip(new_mps._mats_env, self._mats_env):
@@ -3328,6 +3356,8 @@ 

Source code for tensorkrowch.models.mps

         explanation of the different initialization methods.
     device : torch.device, optional
         Device where to initialize the tensors if ``init_method`` is provided.
+    dtype : torch.dtype, optional
+        Dtype of the tensor if ``init_method`` is provided.
     kwargs : float
         Keyword arguments for the different initialization methods. See
         :meth:`~tensorkrowch.AbstractNode.make_tensor`.
@@ -3358,6 +3388,7 @@ 

Source code for tensorkrowch.models.mps

                  n_batches: int = 1,
                  init_method: Text = 'randn',
                  device: Optional[torch.device] = None,
+                 dtype: Optional[torch.dtype] = None,
                  **kwargs) -> None:
         
         phys_dim = None
@@ -3433,6 +3464,7 @@ 

Source code for tensorkrowch.models.mps

                          n_batches=n_batches,
                          init_method=init_method,
                          device=device,
+                         dtype=dtype,
                          **kwargs)
         self.name = 'umpslayer'
         self._in_dim = self._phys_dim[:out_position] + \
@@ -3481,7 +3513,9 @@ 

Source code for tensorkrowch.models.mps

         for node in in_nodes:
             node.set_tensor_from(uniform_memory)
     
-    def _make_canonical(self, device: Optional[torch.device] = None) -> List[torch.Tensor]:
+    def _make_canonical(self,
+                        device: Optional[torch.device] = None,
+                        dtype: Optional[torch.dtype] = None) -> List[torch.Tensor]:
         """
         Creates random unitaries to initialize the MPS in canonical form with
         orthogonality center at the rightmost node. Unitaries in nodes are
@@ -3496,18 +3530,22 @@ 

Source code for tensorkrowch.models.mps

         size = max(aux_shape[0], aux_shape[1])
         phys_dim = node_shape[1]
         
-        uni_tensor = random_unitary(size, device=device)
+        uni_tensor = random_unitary(size, device=device, dtype=dtype)
         uni_tensor = uni_tensor[:min(aux_shape[0], size), :min(aux_shape[1], size)]
         uni_tensor = uni_tensor.reshape(*node_shape)
         uni_tensor = uni_tensor * sqrt(phys_dim)
         
         # Output node
-        out_tensor = torch.randn(self.out_node.shape, device=device)
+        out_tensor = torch.randn(self.out_node.shape,
+                                 device=device,
+                                 dtype=dtype)
         out_tensor = out_tensor / out_tensor.norm() * sqrt(out_tensor.shape[1])
         
         return [uni_tensor, out_tensor]
     
-    def _make_unitaries(self, device: Optional[torch.device] = None) -> List[torch.Tensor]:
+    def _make_unitaries(self,
+                        device: Optional[torch.device] = None,
+                        dtype: Optional[torch.dtype] = None) -> List[torch.Tensor]:
         """
         Creates random unitaries to initialize the MPS nodes as stacks of
         unitaries.
@@ -3518,7 +3556,9 @@ 

Source code for tensorkrowch.models.mps

             
             units = []
             for _ in range(node_shape[1]):
-                tensor = random_unitary(node_shape[0], device=device)
+                tensor = random_unitary(node_shape[0],
+                                        device=device,
+                                        dtype=dtype)
                 units.append(tensor)
             
             tensors.append(torch.stack(units, dim=1))
@@ -3529,6 +3569,7 @@ 

Source code for tensorkrowch.models.mps

                    tensors: Optional[Sequence[torch.Tensor]] = None,
                    init_method: Optional[Text] = 'randn',
                    device: Optional[torch.device] = None,
+                   dtype: Optional[torch.dtype] = None,
                    **kwargs: float) -> None:
         """
         Initializes the common tensor of the :class:`UMPSLayer`. It can be called
@@ -3538,7 +3579,7 @@ 

Source code for tensorkrowch.models.mps

         
         * ``{"zeros", "ones", "copy", "rand", "randn"}``: The tensor is
           initialized calling :meth:`~tensorkrowch.AbstractNode.set_tensor` with
-          the given method, ``device`` and ``kwargs``.
+          the given method, ``device``, ``dtype`` and ``kwargs``.
         
         * ``"randn_eye"``: Tensor is initialized as in this
           `paper <https://arxiv.org/abs/1605.03795>`_, adding identities at the
@@ -3566,14 +3607,16 @@ 

Source code for tensorkrowch.models.mps

             Initialization method.
         device : torch.device, optional
             Device where to initialize the tensors if ``init_method`` is provided.
+        dtype : torch.dtype, optional
+            Dtype of the tensor if ``init_method`` is provided.
         kwargs : float
             Keyword arguments for the different initialization methods. See
             :meth:`~tensorkrowch.AbstractNode.make_tensor`.
         """
         if init_method == 'unit':
-            tensors = self._make_unitaries(device=device)
+            tensors = self._make_unitaries(device=device, dtype=dtype)
         elif init_method == 'canonical':
-            tensors = self._make_canonical(device=device)
+            tensors = self._make_canonical(device=device, dtype=dtype)
         
         if tensors is not None:
             self.uniform_memory.tensor = tensors[0]
@@ -3588,12 +3631,14 @@ 

Source code for tensorkrowch.models.mps

                 
                 node.set_tensor(init_method=init_method,
                                 device=device,
+                                dtype=dtype,
                                 **kwargs)
                 if add_eye:
                     aux_tensor = node.tensor.detach()
                     eye_tensor = torch.eye(node.shape[0],
                                            node.shape[2],
-                                           device=device)
+                                           device=device,
+                                           dtype=dtype)
                     if i == 0:
                         aux_tensor[:, 0, :] += eye_tensor
                     else:
@@ -3628,7 +3673,8 @@ 

Source code for tensorkrowch.models.mps

                             tensor=None,
                             n_batches=self._n_batches,
                             init_method=None,
-                            device=None)
+                            device=None,
+                            dtype=None)
         new_mps.name = self.name + '_copy'
         if share_tensors:
             new_mps.uniform_memory.tensor = self.uniform_memory.tensor
@@ -3869,6 +3915,8 @@ 

Source code for tensorkrowch.models.mps

         explanation of the different initialization methods.
     device : torch.device, optional
         Device where to initialize the tensors if ``init_method`` is provided.
+    dtype : torch.dtype, optional
+        Dtype of the tensor if ``init_method`` is provided.
     kwargs : float
         Keyword arguments for the different initialization methods. See
         :meth:`~tensorkrowch.AbstractNode.make_tensor`.
@@ -3895,6 +3943,7 @@ 

Source code for tensorkrowch.models.mps

                  tensors: Optional[Sequence[torch.Tensor]] = None,
                  init_method: Text = 'randn',
                  device: Optional[torch.device] = None,
+                 dtype: Optional[torch.dtype] = None,
                  **kwargs):
         
         unfold = self._set_attributes(in_channels=in_channels,
@@ -3912,6 +3961,7 @@ 

Source code for tensorkrowch.models.mps

                      n_batches=2,
                      init_method=init_method,
                      device=device,
+                     dtype=dtype,
                      **kwargs)
         
         self.unfold = unfold
@@ -3980,7 +4030,8 @@ 

Source code for tensorkrowch.models.mps

                           boundary=self._boundary,
                           tensors=None,
                           init_method=None,
-                          device=None)
+                          device=None,
+                          dtype=None)
         new_mps.name = self.name + '_copy'
         if share_tensors:
             for new_node, node in zip(new_mps._mats_env, self._mats_env):
@@ -4032,6 +4083,8 @@ 

Source code for tensorkrowch.models.mps

         explanation of the different initialization methods.
     device : torch.device, optional
         Device where to initialize the tensors if ``init_method`` is provided.
+    dtype : torch.dtype, optional
+        Dtype of the tensor if ``init_method`` is provided.
     kwargs : float
         Keyword arguments for the different initialization methods. See
         :meth:`~tensorkrowch.AbstractNode.make_tensor`.
@@ -4061,6 +4114,7 @@ 

Source code for tensorkrowch.models.mps

                  tensor: Optional[torch.Tensor] = None,
                  init_method: Text = 'randn',
                  device: Optional[torch.device] = None,
+                 dtype: Optional[torch.dtype] = None,
                  **kwargs):
 
         unfold = self._set_attributes(in_channels=in_channels,
@@ -4077,6 +4131,7 @@ 

Source code for tensorkrowch.models.mps

                       n_batches=2,
                       init_method=init_method,
                       device=device,
+                      dtype=dtype,
                       **kwargs)
         
         self.unfold = unfold
@@ -4144,7 +4199,8 @@ 

Source code for tensorkrowch.models.mps

                            dilation=self.dilation,
                            tensor=None,
                            init_method=None,
-                           device=None)
+                           device=None,
+                           dtype=None)
         new_mps.name = self.name + '_copy'
         if share_tensors:
             new_mps.uniform_memory.tensor = self.uniform_memory.tensor
@@ -4212,6 +4268,8 @@ 

Source code for tensorkrowch.models.mps

         explanation of the different initialization methods.
     device : torch.device, optional
         Device where to initialize the tensors if ``init_method`` is provided.
+    dtype : torch.dtype, optional
+        Dtype of the tensor if ``init_method`` is provided.
     kwargs : float
         Keyword arguments for the different initialization methods. See
         :meth:`~tensorkrowch.AbstractNode.make_tensor`.
@@ -4241,6 +4299,7 @@ 

Source code for tensorkrowch.models.mps

                  tensors: Optional[Sequence[torch.Tensor]] = None,
                  init_method: Text = 'randn',
                  device: Optional[torch.device] = None,
+                 dtype: Optional[torch.dtype] = None,
                  **kwargs):
 
         unfold = self._set_attributes(in_channels=in_channels,
@@ -4261,6 +4320,7 @@ 

Source code for tensorkrowch.models.mps

                           n_batches=2,
                           init_method=init_method,
                           device=device,
+                          dtype=dtype,
                           **kwargs)
         
         self._out_channels = out_channels
@@ -4336,7 +4396,8 @@ 

Source code for tensorkrowch.models.mps

                                boundary=self._boundary,
                                tensors=None,
                                init_method=None,
-                               device=None)
+                               device=None,
+                               dtype=None)
         new_mps.name = self.name + '_copy'
         if share_tensors:
             for new_node, node in zip(new_mps._mats_env, self._mats_env):
@@ -4397,6 +4458,8 @@ 

Source code for tensorkrowch.models.mps

         detailed explanation of the different initialization methods.
     device : torch.device, optional
         Device where to initialize the tensors if ``init_method`` is provided.
+    dtype : torch.dtype, optional
+        Dtype of the tensor if ``init_method`` is provided.
     kwargs : float
         Keyword arguments for the different initialization methods. See
         :meth:`~tensorkrowch.AbstractNode.make_tensor`.
@@ -4429,6 +4492,7 @@ 

Source code for tensorkrowch.models.mps

                  tensors: Optional[Sequence[torch.Tensor]] = None,
                  init_method: Text = 'randn',
                  device: Optional[torch.device] = None,
+                 dtype: Optional[torch.dtype] = None,
                  **kwargs):
 
         unfold = self._set_attributes(in_channels=in_channels,
@@ -4448,6 +4512,7 @@ 

Source code for tensorkrowch.models.mps

                            n_batches=2,
                            init_method=init_method,
                            device=device,
+                           dtype=dtype,
                            **kwargs)
         
         self._out_channels = out_channels
@@ -4527,7 +4592,8 @@ 

Source code for tensorkrowch.models.mps

                                 dilation=self.dilation,
                                 tensor=None,
                                 init_method=None,
-                                device=None)
+                                device=None,
+                                dtype=None)
         new_mps.name = self.name + '_copy'
         if share_tensors:
             new_mps.uniform_memory.tensor = self.uniform_memory.tensor
diff --git a/docs/_build/html/_modules/tensorkrowch/models/mps_data.html b/docs/_build/html/_modules/tensorkrowch/models/mps_data.html
index 07bb2a2..424d1f6 100644
--- a/docs/_build/html/_modules/tensorkrowch/models/mps_data.html
+++ b/docs/_build/html/_modules/tensorkrowch/models/mps_data.html
@@ -5,7 +5,7 @@
   
     
     
-    tensorkrowch.models.mps_data — TensorKrowch 1.1.2 documentation
+    tensorkrowch.models.mps_data — TensorKrowch 1.1.3 documentation
     
   
   
@@ -413,6 +413,8 @@ 

Source code for tensorkrowch.models.mps_data

        :meth:`add_data` to see how to initialize MPS nodes with data tensors.
     device : torch.device, optional
         Device where to initialize the tensors if ``init_method`` is provided.
+    dtype : torch.dtype, optional
+            Dtype of the tensor if ``init_method`` is provided.
     kwargs : float
         Keyword arguments for the different initialization methods. See
         :meth:`~tensorkrowch.AbstractNode.make_tensor`.
@@ -439,6 +441,7 @@ 

Source code for tensorkrowch.models.mps_data

tensors: Optional[Sequence[torch.Tensor]] = None,
                  init_method: Optional[Text] = None,
                  device: Optional[torch.device] = None,
+                 dtype: Optional[torch.dtype] = None,
                  **kwargs) -> None:
 
         super().__init__(name='mps_data')
@@ -568,6 +571,7 @@ 

Source code for tensorkrowch.models.mps_data

self._make_nodes()
         self.initialize(init_method=init_method,
                             device=device,
+                            dtype=dtype,
                             **kwargs)
         
         if tensors is not None:
@@ -616,6 +620,15 @@ 

Source code for tensorkrowch.models.mps_data

        """Returns the list of nodes in ``mats_env``."""
         return self._mats_env
     
+    @property
+    def tensors(self) -> List[torch.Tensor]:
+        """Returns the list of MPS tensors."""
+        mps_tensors = [node.tensor for node in self._mats_env]
+        if self._boundary == 'obc':
+            mps_tensors[0] = mps_tensors[0][0, :, :]
+            mps_tensors[-1] = mps_tensors[-1][:, :, 0]
+        return mps_tensors
+    
     # -------
     # Methods
     # -------
@@ -673,6 +686,7 @@ 

Source code for tensorkrowch.models.mps_data

[docs]    def initialize(self,
                    init_method: Optional[Text] = 'randn',
                    device: Optional[torch.device] = None,
+                   dtype: Optional[torch.dtype] = None,
                    **kwargs: float) -> None:
         """
         Initializes all the nodes of the :class:`MPSData`. It can be called when
@@ -682,7 +696,7 @@ 

Source code for tensorkrowch.models.mps_data

        
         * ``{"zeros", "ones", "copy", "rand", "randn"}``: Each node is
           initialized calling :meth:`~tensorkrowch.AbstractNode.set_tensor` with
-          the given method, ``device`` and ``kwargs``.
+          the given method, ``device``, ``dtype`` and ``kwargs``.
         
         Parameters
         ----------
@@ -691,22 +705,31 @@ 

Source code for tensorkrowch.models.mps_data

            initialize MPS nodes with data tensors.
         device : torch.device, optional
             Device where to initialize the tensors if ``init_method`` is provided.
+        dtype : torch.dtype, optional
+            Dtype of the tensor if ``init_method`` is provided.
         kwargs : float
             Keyword arguments for the different initialization methods. See
             :meth:`~tensorkrowch.AbstractNode.make_tensor`.
         """
         if self._boundary == 'obc':
-            self._left_node.set_tensor(init_method='copy', device=device)
-            self._right_node.set_tensor(init_method='copy', device=device)
+            self._left_node.set_tensor(init_method='copy',
+                                       device=device,
+                                       dtype=dtype)
+            self._right_node.set_tensor(init_method='copy',
+                                        device=device,
+                                        dtype=dtype)
                 
         if init_method is not None:
             for i, node in enumerate(self._mats_env):
                 node.set_tensor(init_method=init_method,
                                 device=device,
+                                dtype=dtype,
                                 **kwargs)
                 
                 if self._boundary == 'obc':
-                    aux_tensor = torch.zeros(*node.shape, device=device)
+                    aux_tensor = torch.zeros(*node.shape,
+                                             device=device,
+                                             dtype=dtype)
                     if i == 0:
                         # Left node
                         aux_tensor[..., 0, :, :] = node.tensor[..., 0, :, :]
@@ -762,37 +785,45 @@ 

Source code for tensorkrowch.models.mps_data

data = data[:]
         device = data[0].device
+        dtype = data[0].dtype
         for i, node in enumerate(self._mats_env):
             if self._boundary == 'obc':
-                aux_tensor = torch.zeros(*node.shape, device=device)
                 if (i == 0) and (i == (self._n_features - 1)):
                     aux_tensor = torch.zeros(*data[i].shape[:-1],
                                              *node.shape[-3:],
-                                             device=device)
+                                             device=device,
+                                             dtype=dtype)
                     aux_tensor[..., 0, :, 0] = data[i]
                     data[i] = aux_tensor
                 elif i == 0:
                     aux_tensor = torch.zeros(*data[i].shape[:-2],
                                              *node.shape[-3:-1],
                                              data[i].shape[-1],
-                                             device=device)
+                                             device=device,
+                                             dtype=dtype)
                     aux_tensor[..., 0, :, :] = data[i]
                     data[i] = aux_tensor
                 elif i == (self._n_features - 1):
                     aux_tensor = torch.zeros(*data[i].shape[:-1],
                                              *node.shape[-2:],
-                                             device=device)
+                                             device=device,
+                                             dtype=dtype)
                     aux_tensor[..., 0] = data[i]
                     data[i] = aux_tensor
                     
             node._direct_set_tensor(data[i])
         
-        # Send left and right nodes to correct device
+        # Send left and right nodes to correct device and dtype
         if self._boundary == 'obc':
             if self._left_node.device != device:
                 self._left_node.tensor = self._left_node.tensor.to(device)
+            if self._left_node.dtype != dtype:
+                self._left_node.tensor = self._left_node.tensor.to(dtype)
+            
             if self._right_node.device != device:
                 self._right_node.tensor = self._right_node.tensor.to(device)
+            if self._right_node.dtype != dtype:
+                self._right_node.tensor = self._right_node.tensor.to(dtype)
         
         # Update bond dim
         if self._boundary == 'obc':
diff --git a/docs/_build/html/_modules/tensorkrowch/models/peps.html b/docs/_build/html/_modules/tensorkrowch/models/peps.html
index 3c67433..1d26549 100644
--- a/docs/_build/html/_modules/tensorkrowch/models/peps.html
+++ b/docs/_build/html/_modules/tensorkrowch/models/peps.html
@@ -5,7 +5,7 @@
   
     
     
-    tensorkrowch.models.peps — TensorKrowch 1.1.2 documentation
+    tensorkrowch.models.peps — TensorKrowch 1.1.3 documentation
     
   
   
diff --git a/docs/_build/html/_modules/tensorkrowch/models/tree.html b/docs/_build/html/_modules/tensorkrowch/models/tree.html
index ec2b696..c57a6ce 100644
--- a/docs/_build/html/_modules/tensorkrowch/models/tree.html
+++ b/docs/_build/html/_modules/tensorkrowch/models/tree.html
@@ -5,7 +5,7 @@
   
     
     
-    tensorkrowch.models.tree — TensorKrowch 1.1.2 documentation
+    tensorkrowch.models.tree — TensorKrowch 1.1.3 documentation
     
   
   
diff --git a/docs/_build/html/_modules/tensorkrowch/operations.html b/docs/_build/html/_modules/tensorkrowch/operations.html
index 82dbc4b..ddf3449 100644
--- a/docs/_build/html/_modules/tensorkrowch/operations.html
+++ b/docs/_build/html/_modules/tensorkrowch/operations.html
@@ -5,7 +5,7 @@
   
     
     
-    tensorkrowch.operations — TensorKrowch 1.1.2 documentation
+    tensorkrowch.operations — TensorKrowch 1.1.3 documentation
     
   
   
@@ -336,8 +336,11 @@ 

Source code for tensorkrowch.operations

         * permute_           (in-place)
         * tprod
         * mul
+        * div
         * add
         * sub
+        * renormalize
+        * conj
         
     Node-like operations:
         * split
@@ -1793,6 +1796,120 @@ 

Source code for tensorkrowch.operations

 AbstractNode.renormalize = renormalize_node
 
 
+##################################   conj    ##################################
+# MARK: conj
+def _check_first_conj(node: AbstractNode) -> Optional[Successor]:
+    args = (node,)
+    successors = node._successors.get('conj')
+    if not successors:
+        return None
+    return successors.get(args)
+
+
+def _conj_first(node: AbstractNode) -> Node:
+    new_node = Node._create_resultant(axes_names=node.axes_names,
+                                      name='conj',
+                                      network=node._network,
+                                      tensor=node.tensor.conj(),
+                                      edges=node._edges,
+                                      node1_list=node.is_node1())
+    
+    # Create successor
+    net = node._network
+    args = (node,)
+    successor = Successor(node_ref=node.node_ref(),
+                          index=node._tensor_info['index'],
+                          child=new_node)
+
+    # Add successor to parent
+    if 'conj' in node._successors:
+        node._successors['conj'].update({args: successor})
+    else:
+        node._successors['conj'] = {args: successor}
+
+    # Add operation to list of performed operations of TN
+    net._seq_ops.append(('conj', args))
+
+    # Record in inverse_memory while tracing
+    if net._tracing:
+        node._record_in_inverse_memory()
+
+    return new_node
+
+
+def _conj_next(successor: Successor, node: AbstractNode) -> Node:
+    tensor = node._direct_get_tensor(successor.node_ref,
+                                     successor.index)
+    child = successor.child
+    child._direct_set_tensor(tensor.conj())
+
+    # Record in inverse_memory while contracting, if network is traced
+    # (to delete memory if possible)
+    if node._network._traced:
+        node._check_inverse_memory(successor.node_ref)
+    
+    return child
+
+
+conj_op = Operation('conj',
+                    _check_first_conj,
+                    _conj_first,
+                    _conj_next)
+
+
+def conj(node: AbstractNode) -> Node:
+    """
+    Returns a view of the node's tensor with a flipped conjugate bit. If the
+    node has a non-complex dtype, this function returns a new node with the
+    same tensor.
+
+    See `conj <https://pytorch.org/docs/stable/generated/torch.conj.html>`_
+    in the **PyTorch** documentation.
+
+    Parameters
+    ----------
+    node : Node or ParamNode
+        Node that is to be conjugated.
+
+    Returns
+    -------
+    Node
+    
+    Examples
+    --------
+    >>> nodeA = tk.randn((3, 3), dtype=torch.complex64)
+    >>> conjA = tk.conj(nodeA)
+    >>> conjA.is_conj()
+    True
+    """
+    return conj_op(node)
+
+
+conj_node = copy_func(conj)
+conj_node.__doc__ = \
+    """
+    Returns a view of the node's tensor with a flipped conjugate bit. If the
+    node has a non-complex dtype, this function returns a new node with the
+    same tensor.
+
+    See `conj <https://pytorch.org/docs/stable/generated/torch.conj.html>`_
+    in the **PyTorch** documentation.
+
+    Returns
+    -------
+    Node
+    
+    Examples
+    --------
+    >>> nodeA = tk.randn((3, 3), dtype=torch.complex64)
+    >>> conjA = nodeA.conj()
+    >>> conjA.is_conj()
+    True
+    """
+
+AbstractNode.conj = conj_node
+
+
 ###############################################################################
 #                            NODE-LIKE OPERATIONS                             #
 ###############################################################################
@@ -1926,9 +2043,12 @@ 

Source code for tensorkrowch.operations

         u = u[..., :rank]
         s = s[..., :rank]
         vh = vh[..., :rank, :]
+        
+        if u.is_complex():
+            s = s.to(u.dtype)
 
         if mode == 'svdr':
-            phase = torch.sign(torch.randn(s.shape))
+            phase = torch.sgn(torch.randn_like(s))
             phase = torch.diag_embed(phase)
             u = u @ phase
             vh = phase @ vh
@@ -2125,9 +2245,12 @@ 

Source code for tensorkrowch.operations

         u = u[..., :rank]
         s = s[..., :rank]
         vh = vh[..., :rank, :]
+        
+        if u.is_complex():
+            s = s.to(u.dtype)
 
         if mode == 'svdr':
-            phase = torch.sign(torch.randn(s.shape))
+            phase = torch.sgn(torch.randn_like(s))
             phase = torch.diag_embed(phase)
             u = u @ phase
             vh = phase @ vh
diff --git a/docs/_build/html/_sources/tutorials/0_first_steps.rst.txt b/docs/_build/html/_sources/tutorials/0_first_steps.rst.txt
index 05997e1..153719f 100644
--- a/docs/_build/html/_sources/tutorials/0_first_steps.rst.txt
+++ b/docs/_build/html/_sources/tutorials/0_first_steps.rst.txt
@@ -134,7 +134,7 @@ possible classes.
 ::
 
     # Check if GPU is available
-    device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
+    device = torch.device('cuda:0' if torch.cuda.is_available() else 'cpu')
 
     # Instantiate model
     mps = tk.models.MPSLayer(n_features=image_size[0] * image_size[1] + 1,
diff --git a/docs/_build/html/_static/documentation_options.js b/docs/_build/html/_static/documentation_options.js
index 5314893..3d088f5 100644
--- a/docs/_build/html/_static/documentation_options.js
+++ b/docs/_build/html/_static/documentation_options.js
@@ -1,6 +1,6 @@
 var DOCUMENTATION_OPTIONS = {
     URL_ROOT: document.getElementById("documentation_options").getAttribute('data-url_root'),
-    VERSION: '1.1.2',
+    VERSION: '1.1.3',
     LANGUAGE: 'None',
     COLLAPSE_INDEX: false,
     BUILDER: 'html',
diff --git a/docs/_build/html/api.html b/docs/_build/html/api.html
index 04904b7..3001f29 100644
--- a/docs/_build/html/api.html
+++ b/docs/_build/html/api.html
@@ -6,7 +6,7 @@
     
     
 
-    API Reference — TensorKrowch 1.1.2 documentation
+    API Reference — TensorKrowch 1.1.3 documentation
     
   
   
diff --git a/docs/_build/html/components.html b/docs/_build/html/components.html
index 79314d3..9888808 100644
--- a/docs/_build/html/components.html
+++ b/docs/_build/html/components.html
@@ -6,7 +6,7 @@
     
     
 
-    Components — TensorKrowch 1.1.2 documentation
+    Components — TensorKrowch 1.1.3 documentation
     
   
   
@@ -705,7 +705,7 @@ 

Nodes

AbstractNode#

-class tensorkrowch.AbstractNode(shape=None, axes_names=None, name=None, network=None, data=False, virtual=False, override_node=False, tensor=None, edges=None, override_edges=False, node1_list=None, init_method=None, device=None, **kwargs)[source]#
+class tensorkrowch.AbstractNode(shape=None, axes_names=None, name=None, network=None, data=False, virtual=False, override_node=False, tensor=None, edges=None, override_edges=False, node1_list=None, init_method=None, device=None, dtype=None, **kwargs)[source]#

Abstract class for all types of nodes. Defines what a node is and most of its properties and methods. Since it is an abstract class, cannot be instantiated.

Nodes are the elements that make up a TensorNetwork. At its most @@ -948,6 +948,24 @@

AbstractNode +
+is_conj()[source]#
+

Equivalent to torch.is_conj().

+

+ +
+
+is_complex()[source]#
+

Equivalent to torch.is_complex().

+
+ +
+
+is_floating_point()[source]#
+

Equivalent to torch.is_floating_point().

+
+
size(axis=None)[source]#
@@ -1134,7 +1152,7 @@

AbstractNode
-make_tensor(shape=None, init_method='zeros', device=device(type='cpu'), **kwargs)[source]#
+make_tensor(shape=None, init_method='zeros', device=None, dtype=None, **kwargs)[source]#

Returns a tensor that can be put in the node, and is initialized according to init_method. By default, it has the same shape as the node.

@@ -1143,6 +1161,7 @@

AbstractNodeNone, node’s shape will be used.

  • init_method ({"zeros", "ones", "copy", "rand", "randn"}, optional) – Initialization method.

  • device (torch.device, optional) – Device where to initialize the tensor.

  • +
  • dtype (torch.dtype, optional) – Dtype of the tensor.

  • kwargs (float) –

    Keyword arguments for the different initialization methods:

    @@ -1527,6 +1547,28 @@

    AbstractNode +
    +conj()#
    +

    Returns a view of the node’s tensor with a flipped conjugate bit. If the +node has a non-complex dtype, this function returns a new node with the +same tensor.

    +

    See conj +in the PyTorch documentation.

    +
    +
    Return type
    +

    Node

    +
    +
    +

    Examples

    +
    >>> nodeA = tk.randn((3, 3), dtype=torch.complex64)
    +>>> conjA = nodeA.conj()
    +>>> conjA.is_conj()
    +True
    +
    +
    +

  • +
    contract_between(node2)#
    @@ -1813,7 +1855,7 @@

    AbstractNode#

    -class tensorkrowch.Node(shape=None, axes_names=None, name=None, network=None, data=False, virtual=False, override_node=False, tensor=None, edges=None, override_edges=False, node1_list=None, init_method=None, device=None, **kwargs)[source]#
    +class tensorkrowch.Node(shape=None, axes_names=None, name=None, network=None, data=False, virtual=False, override_node=False, tensor=None, edges=None, override_edges=False, node1_list=None, init_method=None, device=None, dtype=None, **kwargs)[source]#

    Base class for non-trainable nodes. Should be subclassed by any class of nodes that are not intended to be trained (e.g. StackNode).

    Can be used for fixed nodes of the TensorNetwork, or intermediate @@ -1869,6 +1911,7 @@

    Node#< should also be provided.

  • init_method ({"zeros", "ones", "copy", "rand", "randn"}, optional) – Initialization method.

  • device (torch.device, optional) – Device where to initialize the tensor if init_method is provided.

  • +
  • dtype (torch.dtype, optional) – Dtype of the tensor if init_method is provided.

  • kwargs (float) – Keyword arguments for the different initialization methods. See AbstractNode.make_tensor().

  • @@ -2042,7 +2085,7 @@

    Node#<

    ParamNode#

    -class tensorkrowch.ParamNode(shape=None, axes_names=None, name=None, network=None, virtual=False, override_node=False, tensor=None, edges=None, override_edges=False, node1_list=None, init_method=None, device=None, **kwargs)[source]#
    +class tensorkrowch.ParamNode(shape=None, axes_names=None, name=None, network=None, virtual=False, override_node=False, tensor=None, edges=None, override_edges=False, node1_list=None, init_method=None, device=None, dtype=None, **kwargs)[source]#

    Class for trainable nodes. Should be subclassed by any class of nodes that are intended to be trained (e.g. ParamStackNode).

    Should be used as the initial nodes conforming the TensorNetwork, @@ -2104,6 +2147,7 @@

    ParamNodeinit_method is provided.

    +
  • dtype (torch.dtype, optional) – Dtype of the tensor if init_method is provided.

  • kwargs (float) – Keyword arguments for the different initialization methods. See AbstractNode.make_tensor().

  • diff --git a/docs/_build/html/contents.html b/docs/_build/html/contents.html index fcaef76..09518ae 100644 --- a/docs/_build/html/contents.html +++ b/docs/_build/html/contents.html @@ -6,7 +6,7 @@ - <no title> — TensorKrowch 1.1.2 documentation + <no title> — TensorKrowch 1.1.3 documentation diff --git a/docs/_build/html/decompositions.html b/docs/_build/html/decompositions.html index 4d073be..c66ed6d 100644 --- a/docs/_build/html/decompositions.html +++ b/docs/_build/html/decompositions.html @@ -6,7 +6,7 @@ - Decompositions — TensorKrowch 1.1.2 documentation + Decompositions — TensorKrowch 1.1.3 documentation diff --git a/docs/_build/html/embeddings.html b/docs/_build/html/embeddings.html index 5e8e34d..56de0af 100644 --- a/docs/_build/html/embeddings.html +++ b/docs/_build/html/embeddings.html @@ -6,7 +6,7 @@ - Embeddings — TensorKrowch 1.1.2 documentation + Embeddings — TensorKrowch 1.1.3 documentation diff --git a/docs/_build/html/examples.html b/docs/_build/html/examples.html index 41d6f03..73d815e 100644 --- a/docs/_build/html/examples.html +++ b/docs/_build/html/examples.html @@ -6,7 +6,7 @@ - Examples — TensorKrowch 1.1.2 documentation + Examples — TensorKrowch 1.1.3 documentation diff --git a/docs/_build/html/examples/hybrid_tnn_model.html b/docs/_build/html/examples/hybrid_tnn_model.html index 5e33e48..b6e00ca 100644 --- a/docs/_build/html/examples/hybrid_tnn_model.html +++ b/docs/_build/html/examples/hybrid_tnn_model.html @@ -6,7 +6,7 @@ - Hybrid Tensorial Neural Network model — TensorKrowch 1.1.2 documentation + Hybrid Tensorial Neural Network model — TensorKrowch 1.1.3 documentation diff --git a/docs/_build/html/examples/mps_dmrg.html b/docs/_build/html/examples/mps_dmrg.html index 7741b4c..76b90e9 100644 --- a/docs/_build/html/examples/mps_dmrg.html +++ b/docs/_build/html/examples/mps_dmrg.html @@ -6,7 +6,7 @@ - DMRG-like training of MPS — TensorKrowch 1.1.2 documentation + DMRG-like training of MPS — TensorKrowch 1.1.3 documentation diff --git a/docs/_build/html/examples/mps_dmrg.ipynb b/docs/_build/html/examples/mps_dmrg.ipynb deleted file mode 100644 index f681d39..0000000 --- a/docs/_build/html/examples/mps_dmrg.ipynb +++ /dev/null @@ -1,587 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# DMRG-like training of MPS\n", - "\n", - "Here we show how one can use MPS models to train via DMRG, as shown in\n", - "[[SS16']](https://arxiv.org/abs/1605.05775)." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "%mkdir data\n", - "%mkdir models" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "import torch\n", - "import torch.nn as nn\n", - "import torch.optim as optim\n", - "from torch.utils.data import DataLoader\n", - "\n", - "import torchvision.transforms as transforms\n", - "import torchvision.datasets as datasets\n", - "\n", - "import matplotlib.pyplot as plt\n", - "\n", - "import tensorkrowch as tk" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "device(type='cuda', index=0)" - ] - }, - "execution_count": 2, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "device = torch.device('cpu')\n", - "\n", - "if torch.cuda.is_available():\n", - " device = torch.device('cuda:0')\n", - "elif torch.backends.mps.is_available():\n", - " device = torch.device('mps:0')\n", - "else:\n", - " device = torch.device('cpu')\n", - "\n", - "device" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Dataset" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [], - "source": [ - "# MNIST Dataset\n", - "dataset_name = 'mnist'\n", - "batch_size = 64\n", - "image_size = 15\n", - "input_size = image_size ** 2\n", - "num_classes = 10\n", - "\n", - "transform = transforms.Compose([transforms.ToTensor(),\n", - " transforms.Resize(image_size, antialias=True),\n", - " ])\n", - "\n", - "# Load data\n", - "train_dataset = datasets.MNIST(root='data/',\n", - " train=True,\n", - " transform=transform,\n", - " download=True)\n", - "test_dataset = datasets.MNIST(root='data/',\n", - " train=False,\n", - " transform=transform,\n", - " download=True)\n", - "\n", - "train_loader = DataLoader(dataset=train_dataset,\n", - " batch_size=batch_size,\n", - " shuffle=True)\n", - "test_loader = DataLoader(dataset=test_dataset,\n", - " batch_size=batch_size,\n", - " shuffle=True)" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAaAAAAGdCAYAAABU0qcqAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8fJSN1AAAACXBIWXMAAA9hAAAPYQGoP6dpAAAceElEQVR4nO3df2xV9f3H8dell166rlxsHW3vbKEaIgKVoQhRzAaxkTWIsgWdptYGjc6tCrWGlW4rbipU3OYq2BQxmbBE/PGHRSVT13UIGuVXa51kW4HYYZW1nYneCyVca+/5/rFw96386oVzePeW5yM5f/Tew+fzvmB5etrLqc9xHEcAAJxjI6wHAACcnwgQAMAEAQIAmCBAAAATBAgAYIIAAQBMECAAgAkCBAAw4bce4OtisZgOHjyojIwM+Xw+63EAAAlyHEeHDh1SKBTSiBEnv84ZcgE6ePCg8vLyrMcAAJylzs5OXXTRRSd9fsgFKCMjQ9J/Bx89erTxNACAREUiEeXl5cX/Pj+ZIRegY192Gz16NAECgCR2um+j8CYEAIAJAgQAMEGAAAAmCBAAwAQBAgCY8CxA9fX1Gj9+vEaNGqWZM2dq586dXm0FAEhCngToxRdfVGVlpR566CG1trZq6tSpmjt3rnp6erzYDgCQhDwJ0BNPPKG7775bixYt0qRJk7R27Vp94xvf0B/+8AcvtgMAJCHXA/Tll1+qpaVFRUVF/9tkxAgVFRXpvffeO+78aDSqSCQy4AAADH+uB+izzz5Tf3+/srOzBzyenZ2trq6u486vra1VMBiMH9wHDgDOD+bvgquurlY4HI4fnZ2d1iMBAM4B1+8Fd+GFFyolJUXd3d0DHu/u7lZOTs5x5wcCAQUCAbfHAAAMca5fAaWmpurKK69Uc3Nz/LFYLKbm5mZdffXVbm8HAEhSntwNu7KyUmVlZZo+fbpmzJihuro69fb2atGiRV5sBwBIQp4E6Ec/+pH+85//aPny5erq6tJ3vvMdvfHGG8e9MQEAcP7yOY7jWA/x/0UiEQWDQYXDYX4eEAAkocH+PW7+LjgAwPmJAAEATBAgAIAJAgQAMEGAAAAmCBAAwAQBAgCYIEAAABMECABgggABAEwQIACACQIEADBBgAAAJggQAMAEAQIAmCBAAAATBAgAYIIAAQBMECAAgAkCBAAwQYAAACYIEADABAECAJggQAAAEwQIAGCCAAEATBAgAIAJAgQAMEGAAAAm/NYD4PwWjUY93yMcDnu+x9GjRz1d/5vf/Kan60tSRkaG53uMHDnS8z2QPLgCAgCYIEAAABMECABgggABAEwQIACACQIEADBBgAAAJggQAMCE6wGqra3VVVddpYyMDI0dO1YLFixQe3u729sAAJKc6wHaunWrysvLtX37djU1Namvr0/XX3+9ent73d4KAJDEXL8VzxtvvDHg4/Xr12vs2LFqaWnRd7/7Xbe3AwAkKc/vBXfsPlyZmZknfD4ajQ64H1gkEvF6JADAEODpmxBisZgqKio0a9YsTZky5YTn1NbWKhgMxo+8vDwvRwIADBGeBqi8vFx79uzRCy+8cNJzqqurFQ6H40dnZ6eXIwEAhgjPvgR33333afPmzdq2bZsuuuiik54XCAQUCAS8GgMAMES5HiDHcXT//fersbFRb731lgoKCtzeAgAwDLgeoPLycm3cuFGvvPKKMjIy1NXVJUkKBoNKS0tzezsAQJJy/XtADQ0NCofDmj17tnJzc+PHiy++6PZWAIAk5smX4AAAOB3uBQcAMEGAAAAmCBAAwAQBAgCYIEAAABOe34wU3jly5Ijne7z77ruerl9fX+/p+pK0f/9+z/dIT0/3dP3+/n5P15ek0tJSz/e4//77PV3f5/N5uj7cxRUQAMAEAQIAmCBAAAATBAgAYIIAAQBMECAAgAkCBAAwQYAAACYIEADABAECAJggQAAAEwQIAGCCAAEATBAgAIAJAgQAMEGAAAAmCBAAwAQBAgCYIEAAABMECABgggABAEwQIACACQIEADBBgAAAJvzWAwxXjuN4vseKFSs836O9vd3T9RcuXOjp+pI0ffp0z/cIBoOerv/nP//Z0/Ul6dlnn/V8jzvuuMPT9ceMGePp+nAXV0AAABMECABgggABAEwQIACACQIEADBBgAAAJggQAMCE5wF67LHH5PP5VFFR4fVWAIAk4mmAdu3apaefflqXX365l9sAAJKQZwE6fPiwSkpK9Mwzz+iCCy7wahsAQJLyLEDl5eWaN2+eioqKvNoCAJDEPLkX3AsvvKDW1lbt2rXrtOdGo1FFo9H4x5FIxIuRAABDjOtXQJ2dnVqyZImee+45jRo16rTn19bWKhgMxo+8vDy3RwIADEGuB6ilpUU9PT264oor5Pf75ff7tXXrVq1evVp+v1/9/f0Dzq+urlY4HI4fnZ2dbo8EABiCXP8S3HXXXacPP/xwwGOLFi3SxIkTVVVVpZSUlAHPBQIBBQIBt8cAAAxxrgcoIyNDU6ZMGfBYenq6srKyjnscAHD+4k4IAAAT5+Qnor711lvnYhsAQBLhCggAYIIAAQBMECAAgAkCBAAwQYAAACbOybvgzkc+n8/zPe666y7P90hLS/N0/ezsbE/Xl6QRI7z//6y+vj5P1//3v//t6fqS1N3d7fkeXv8+IblwBQQAMEGAAAAmCBAAwAQBAgCYIEAAABMECABgggABAEwQIACACQIEADBBgAAAJggQAMAEAQIAmCBAAAATBAgAYIIAAQBMECAAgAkCBAAwQYAAACYIEADABAECAJggQAAAEwQIAGCCAAEATBAgAIAJv/UAOHMXX3yx9QhJwXEcz/d4//33PV1//fr1nq4vSQsXLvR8jwsuuMDzPZA8uAICAJggQAAAEwQIAGCCAAEATBAgAIAJAgQAMEGAAAAmCBAAwIQnAfr00091++23KysrS2lpaSosLNTu3bu92AoAkKRcvxPC559/rlmzZmnOnDl6/fXX9a1vfUv79u3jX0ADAAZwPUCrVq1SXl6enn322fhjBQUFbm8DAEhyrn8J7tVXX9X06dN18803a+zYsZo2bZqeeeaZk54fjUYViUQGHACA4c/1AH300UdqaGjQhAkT9Oabb+onP/mJFi9erA0bNpzw/NraWgWDwfiRl5fn9kgAgCHI9QDFYjFdccUVWrlypaZNm6Z77rlHd999t9auXXvC86urqxUOh+NHZ2en2yMBAIYg1wOUm5urSZMmDXjssssu08cff3zC8wOBgEaPHj3gAAAMf64HaNasWWpvbx/w2N69ezVu3Di3twIAJDHXA/TAAw9o+/btWrlypfbv36+NGzdq3bp1Ki8vd3srAEAScz1AV111lRobG/X8889rypQpeuSRR1RXV6eSkhK3twIAJDFPfiT3DTfcoBtuuMGLpQEAwwT3ggMAmCBAAAATBAgAYIIAAQBMECAAgAlP3gUHDJbjOJ7v8cknn3i+x8MPP+zp+mlpaZ6uL0l33XWX53v4/fyVg//hCggAYIIAAQBMECAAgAkCBAAwQYAAACYIEADABAECAJggQAAAEwQIAGCCAAEATBAgAIAJAgQAMEGAAAAmCBAAwAQBAgCYIEAAABMECABgggABAEwQIACACQIEADBBgAAAJggQAMAEAQIAmPBbD4ChzXEcT9fv6enxdH1Jqqqq8nyPDz/80NP116xZ4+n6khQKhTzfo6+vz9P1+/v7PV1fkr766ivP90hNTU3q9QeLKyAAgAkCBAAwQYAAACYIEADABAECAJggQAAAEwQIAGCCAAEATLgeoP7+ftXU1KigoEBpaWm65JJL9Mgjj3j+DxoBAMnF9TshrFq1Sg0NDdqwYYMmT56s3bt3a9GiRQoGg1q8eLHb2wEAkpTrAXr33Xd10003ad68eZKk8ePH6/nnn9fOnTvd3goAkMRc/xLcNddco+bmZu3du1eS9MEHH+idd95RcXHxCc+PRqOKRCIDDgDA8Of6FdCyZcsUiUQ0ceJEpaSkqL+/XytWrFBJSckJz6+trdWvf/1rt8cAAAxxrl8BvfTSS3ruuee0ceNGtba2asOGDfrtb3+rDRs2nPD86upqhcPh+NHZ2en2SACAIcj1K6ClS5dq2bJluvXWWyVJhYWFOnDggGpra1VWVnbc+YFAQIFAwO0xAABDnOtXQEeOHNGIEQOXTUlJUSwWc3srAEASc/0KaP78+VqxYoXy8/M1efJkvf/++3riiSd05513ur0VACCJuR6gNWvWqKamRj/96U/V09OjUCikH//4x1q+fLnbWwEAkpjrAcrIyFBdXZ3q6urcXhoAMIxwLzgAgAkCBAAwQYAAACYIEADABAECAJhw/V1wGF66u7s9Xb+8vNzT9SXptdde83yPH/zgB56uP2bMGE/Xl6SXX37Z8z1aWlo8Xf+TTz7xdH1J6urq8nyP73//+56uX1FR4en60Wh0UOdxBQQAMEGAAAAmCBAAwAQBAgCYIEAAABMECABgggABAEwQIACACQIEADBBgAAAJggQAMAEAQIAmCBAAAATBAgAYIIAAQBMECAAgAkCBAAwQYAAACYIEADABAECAJggQAAAEwQIAGCCAAEATBAgAIAJv/UAOHOxWMzzPerr6z1df9OmTZ6uL52b36fGxkZP1//Tn/7k6fqS5DiO53vk5+d7uv6kSZM8XV+SCgoKPN9j3Lhxnq7v8/mGxPpcAQEATBAgAIAJAgQAMEGAAAAmCBAAwAQBAgCYIEAAABMJB2jbtm2aP3++QqGQfD7fcf+Ow3EcLV++XLm5uUpLS1NRUZH27dvn1rwAgGEi4QD19vZq6tSpJ/0Hio8//rhWr16ttWvXaseOHUpPT9fcuXN19OjRsx4WADB8JHwnhOLiYhUXF5/wOcdxVFdXp1/+8pe66aabJEl//OMflZ2drU2bNunWW289u2kBAMOGq98D6ujoUFdXl4qKiuKPBYNBzZw5U++9994Jf000GlUkEhlwAACGP1cD1NXVJUnKzs4e8Hh2dnb8ua+rra1VMBiMH3l5eW6OBAAYoszfBVddXa1wOBw/Ojs7rUcCAJwDrgYoJydHktTd3T3g8e7u7vhzXxcIBDR69OgBBwBg+HM1QAUFBcrJyVFzc3P8sUgkoh07dujqq692cysAQJJL+F1whw8f1v79++Mfd3R0qK2tTZmZmcrPz1dFRYUeffRRTZgwQQUFBaqpqVEoFNKCBQvcnBsAkOQSDtDu3bs1Z86c+MeVlZWSpLKyMq1fv14/+9nP1Nvbq3vuuUdffPGFrr32Wr3xxhsaNWqUe1MDAJJewgGaPXv2KX9yos/n08MPP6yHH374rAYDAAxv5u+CAwCcnwgQAMAEAQIAmCBAAAATBAgAYCLhd8Fh6DjVuxHdEgwGPV2/pKTE0/UlnZO7a4wfP97T9QsLCz1dX5Iuvvhiz/cYO3asp+tnZGR4ur4kjRjB/7efTmpq6qDO43cSAGCCAAEATBAgAIAJAgQAMEGAAAAmCBAAwAQBAgCYIEAAABMECABgggABAEwQIACACQIEADBBgAAAJggQAMAEAQIAmCBAAAATBAgAYIIAAQBMECAAgAkCBAAwQYAAACYIEADABAECAJggQAAAE37rAXDmUlJSPN+joqLC8z28di5+n7zm8/msRwBcxxUQAMAEAQIAmCBAAAATBAgAYIIAAQBMECAAgAkCBAAwkXCAtm3bpvnz5ysUCsnn82nTpk3x5/r6+lRVVaXCwkKlp6crFArpjjvu0MGDB92cGQAwDCQcoN7eXk2dOlX19fXHPXfkyBG1traqpqZGra2tevnll9Xe3q4bb7zRlWEBAMNHwndCKC4uVnFx8QmfCwaDampqGvDYU089pRkzZujjjz9Wfn7+mU0JABh2PP8eUDgcls/n05gxY7zeCgCQRDy9F9zRo0dVVVWl2267TaNHjz7hOdFoVNFoNP5xJBLxciQAwBDh2RVQX1+fbrnlFjmOo4aGhpOeV1tbq2AwGD/y8vK8GgkAMIR4EqBj8Tlw4ICamppOevUjSdXV1QqHw/Gjs7PTi5EAAEOM61+COxafffv2acuWLcrKyjrl+YFAQIFAwO0xAABDXMIBOnz4sPbv3x//uKOjQ21tbcrMzFRubq4WLlyo1tZWbd68Wf39/erq6pIkZWZmKjU11b3JAQBJzec4jpPIL3jrrbc0Z86c4x4vKyvTr371KxUUFJzw123ZskWzZ88+7fqRSETBYFDhcPiUX7rDufHVV19Zj3DW+IF0wLk12L/HE74Cmj17tk7VrAR7BgA4T3EvOACACQIEADBBgAAAJggQAMAEAQIAmCBAAAATnt6MFMnP7+c/EQDe4AoIAGCCAAEATBAgAIAJAgQAMEGAAAAmCBAAwAQBAgCYIEAAABMECABgggABAEwQIACACQIEADBBgAAAJggQAMAEAQIAmCBAAAATBAgAYIIAAQBMECAAgAkCBAAwQYAAACYIEADABAECAJggQAAAEwQIAGCCAAEATBAgAIAJAgQAMEGAAAAmCBAAwAQBAgCYIEAAABMJB2jbtm2aP3++QqGQfD6fNm3adNJz7733Xvl8PtXV1Z3FiACA4SjhAPX29mrq1Kmqr68/5XmNjY3avn27QqHQGQ8HABi+/In+guLiYhUXF5/ynE8//VT333+/3nzzTc2bN++MhwMADF8JB+h0YrGYSktLtXTpUk2ePPm050ejUUWj0fjHkUjE7ZEAAEOQ629CWLVqlfx+vxYvXjyo82traxUMBuNHXl6e2yMBAIYgVwPU0tKiJ598UuvXr5fP5xvUr6murlY4HI4fnZ2dbo4EABiiXA3Q22+/rZ6eHuXn58vv98vv9+vAgQN68MEHNX78+BP+mkAgoNGjRw84AADDn6vfAyotLVVRUdGAx+bOnavS0lItWrTIza0AAEku4QAdPnxY+/fvj3/c0dGhtrY2ZWZmKj8/X1lZWQPOHzlypHJycnTppZee/bQAgGEj4QDt3r1bc+bMiX9cWVkpSSorK9P69etdGwwAMLwlHKDZs2fLcZxBn/+vf/0r0S0AAOcB7gUHADBBgAAAJggQAMAEAQIAmHD9XnBn69gbHLgnHAAkp2N/f5/uDWtDLkCHDh2SJO4JBwBJ7tChQwoGgyd93uck8p7qcyAWi+ngwYPKyMgY9P3kIpGI8vLy1NnZmbS38uE1DB3D4XXwGoaG4fAapMRfh+M4OnTokEKhkEaMOPl3eobcFdCIESN00UUXndGvHQ73kuM1DB3D4XXwGoaG4fAapMRex6mufI7hTQgAABMECABgYlgEKBAI6KGHHlIgELAe5YzxGoaO4fA6eA1Dw3B4DZJ3r2PIvQkBAHB+GBZXQACA5EOAAAAmCBAAwAQBAgCYSPoA1dfXa/z48Ro1apRmzpypnTt3Wo+UkNraWl111VXKyMjQ2LFjtWDBArW3t1uPdVYee+wx+Xw+VVRUWI+SkE8//VS33367srKylJaWpsLCQu3evdt6rEHr7+9XTU2NCgoKlJaWpksuuUSPPPJIQj9A0sK2bds0f/58hUIh+Xw+bdq0acDzjuNo+fLlys3NVVpamoqKirRv3z6bYU/iVK+hr69PVVVVKiwsVHp6ukKhkO644w4dPHjQbuATON2fw/937733yufzqa6u7qz2TOoAvfjii6qsrNRDDz2k1tZWTZ06VXPnzlVPT4/1aIO2detWlZeXa/v27WpqalJfX5+uv/569fb2Wo92Rnbt2qWnn35al19+ufUoCfn88881a9YsjRw5Uq+//rr+/ve/63e/+50uuOAC69EGbdWqVWpoaNBTTz2lf/zjH1q1apUef/xxrVmzxnq0U+rt7dXUqVNVX19/wucff/xxrV69WmvXrtWOHTuUnp6uuXPn6ujRo+d40pM71Ws4cuSIWltbVVNTo9bWVr388stqb2/XjTfeaDDpyZ3uz+GYxsZGbd++XaFQ6Ow3dZLYjBkznPLy8vjH/f39TigUcmpraw2nOjs9PT2OJGfr1q3WoyTs0KFDzoQJE5ympibne9/7nrNkyRLrkQatqqrKufbaa63HOCvz5s1z7rzzzgGP/fCHP3RKSkqMJkqcJKexsTH+cSwWc3Jycpzf/OY38ce++OILJxAIOM8//7zBhKf39ddwIjt37nQkOQcOHDg3QyXoZK/hk08+cb797W87e/bsccaNG+f8/ve/P6t9kvYK6Msvv1RLS4uKiorij40YMUJFRUV67733DCc7O+FwWJKUmZlpPEniysvLNW/evAF/Jsni1Vdf1fTp03XzzTdr7NixmjZtmp555hnrsRJyzTXXqLm5WXv37pUkffDBB3rnnXdUXFxsPNmZ6+joUFdX14D/poLBoGbOnJn0n+c+n09jxoyxHmXQYrGYSktLtXTpUk2ePNmVNYfczUgH67PPPlN/f7+ys7MHPJ6dna1//vOfRlOdnVgspoqKCs2aNUtTpkyxHichL7zwglpbW7Vr1y7rUc7IRx99pIaGBlVWVurnP/+5du3apcWLFys1NVVlZWXW4w3KsmXLFIlENHHiRKWkpKi/v18rVqxQSUmJ9WhnrKurS5JO+Hl+7Llkc/ToUVVVVem2225LqhuUrlq1Sn6/X4sXL3ZtzaQN0HBUXl6uPXv26J133rEeJSGdnZ1asmSJmpqaNGrUKOtxzkgsFtP06dO1cuVKSdK0adO0Z88erV27NmkC9NJLL+m5557Txo0bNXnyZLW1tamiokKhUChpXsNw19fXp1tuuUWO46ihocF6nEFraWnRk08+qdbW1kH/mJzBSNovwV144YVKSUlRd3f3gMe7u7uVk5NjNNWZu++++7R582Zt2bLljH8chZWWlhb19PToiiuukN/vl9/v19atW7V69Wr5/X719/dbj3haubm5mjRp0oDHLrvsMn388cdGEyVu6dKlWrZsmW699VYVFhaqtLRUDzzwgGpra61HO2PHPpeHw+f5sfgcOHBATU1NSXX18/bbb6unp0f5+fnxz/EDBw7owQcf1Pjx48943aQNUGpqqq688ko1NzfHH4vFYmpubtbVV19tOFliHMfRfffdp8bGRv31r39VQUGB9UgJu+666/Thhx+qra0tfkyfPl0lJSVqa2tTSkqK9YinNWvWrOPe/r53716NGzfOaKLEHTly5Lgf/pWSkqJYLGY00dkrKChQTk7OgM/zSCSiHTt2JNXn+bH47Nu3T3/5y1+UlZVlPVJCSktL9be//W3A53goFNLSpUv15ptvnvG6Sf0luMrKSpWVlWn69OmaMWOG6urq1Nvbq0WLFlmPNmjl5eXauHGjXnnlFWVkZMS/rh0MBpWWlmY83eBkZGQc9z2r9PR0ZWVlJc33sh544AFdc801WrlypW655Rbt3LlT69at07p166xHG7T58+drxYoVys/P1+TJk/X+++/riSee0J133mk92ikdPnxY+/fvj3/c0dGhtrY2ZWZmKj8/XxUVFXr00Uc1YcIEFRQUqKamRqFQSAsWLLAb+mtO9Rpyc3O1cOFCtba2avPmzerv749/nmdmZio1NdVq7AFO9+fw9WiOHDlSOTk5uvTSS89807N6D90QsGbNGic/P99JTU11ZsyY4Wzfvt16pIRIOuHx7LPPWo92VpLtbdiO4zivvfaaM2XKFCcQCDgTJ0501q1bZz1SQiKRiLNkyRInPz/fGTVqlHPxxRc7v/jFL5xoNGo92ilt2bLlhJ8DZWVljuP8963YNTU1TnZ2thMIBJzrrrvOaW9vtx36a071Gjo6Ok76eb5lyxbr0eNO9+fwdW68DZsfxwAAMJG03wMCACQ3AgQAMEGAAAAmCBAAwAQBAgCYIEAAABMECABgggABAEwQIACACQIEADBBgAAAJggQAMDE/wGCpihoW+pRwgAAAABJRU5ErkJggg==", - "text/plain": [ - "
    " - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "2\n" - ] - } - ], - "source": [ - "random_sample = torch.randint(low=0, high=len(train_dataset), size=(1,)).item()\n", - "\n", - "plt.imshow(train_dataset[random_sample][0].squeeze(0), cmap='Greys')\n", - "plt.show()\n", - "\n", - "print(train_dataset[random_sample][1])" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Define model" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [], - "source": [ - "class MPS_DMRG(tk.models.MPSLayer):\n", - " \n", - " def __init__(self, *args, **kwargs):\n", - " super().__init__(*args, **kwargs)\n", - " \n", - " self.parameterize(set_param=False, override=True)\n", - " \n", - " self.out_node.get_axis('input').name = 'output'\n", - " \n", - " self.block_position = None\n", - " self.block_length = None\n", - " \n", - " @property\n", - " def block(self):\n", - " if self.block_position is not None:\n", - " return self.mats_env[self.block_position]\n", - " return None\n", - " \n", - " def merge_block(self, block_position, block_length):\n", - " if block_position + block_length > self.n_features:\n", - " raise ValueError(\n", - " f'Last position of the block ({block_position + block_length}) '\n", - " f'exceeds the range of MPS sites ({self.n_features})')\n", - " elif block_length < 1:\n", - " raise ValueError(\n", - " '`block_length` should be greater than or equal to 1')\n", - " \n", - " if self.block_position is not None:\n", - " raise ValueError(\n", - " 'Cannot create block if there is already a merged block')\n", - " \n", - " block_nodes = self.mats_env[block_position:(block_position + block_length)]\n", - " \n", - " block = block_nodes[0]\n", - " for node in block_nodes[1:]:\n", - " block = tk.contract_between_(block, node)\n", - " block = block.parameterize(True)\n", - " block.name = 'block'\n", - " \n", - " self.block_position = block_position\n", - " self.block_length = block_length\n", - " self._mats_env = self._mats_env[:block_position] + [block] + \\\n", - " self._mats_env[(block_position + block_length):]\n", - " \n", - " def unmerge_block(self, side='right', rank=None, cum_percentage=None):\n", - " block = self.block\n", - " \n", - " block_nodes = []\n", - " for i in range(self.block_length - 1):\n", - " node1_axes = block.axes[:2]\n", - " node2_axes = block.axes[2:]\n", - " \n", - " node, block = tk.split_(block,\n", - " node1_axes,\n", - " node2_axes,\n", - " side=side,\n", - " rank=rank,\n", - " cum_percentage=cum_percentage)\n", - " block.get_axis('split').name = 'left'\n", - " node.get_axis('split').name = 'right'\n", - " node.name = f'mats_env_({self.block_position + i})'\n", - " \n", - " block_nodes.append(node)\n", - " \n", - " block.name = f'mats_env_({self.block_position + i + 1})'\n", - " block_nodes.append(block)\n", - " \n", - " self._mats_env = self._mats_env[:self.block_position] + block_nodes + \\\n", - " self._mats_env[(self.block_position + 1):]\n", - " \n", - " self.block_position = None\n", - " self.block_length = None\n", - " \n", - " def contract(self):\n", - " result_mats = []\n", - " for node in self.mats_env:\n", - " while any(['input' in name for name in node.axes_names]):\n", - " for axis in node.axes:\n", - " if 'input' in axis.name:\n", - " data_node = node.neighbours(axis)\n", - " node = node @ data_node\n", - " break\n", - " result_mats.append(node)\n", - " \n", - " result_mats = [self.left_node] + result_mats + [self.right_node]\n", - " \n", - " result = result_mats[0]\n", - " for node in result_mats[1:]:\n", - " result @= node\n", - " \n", - " return result" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [], - "source": [ - "# Model hyperparameters\n", - "embedding_dim = 2\n", - "output_dim = num_classes\n", - "bond_dim = 50\n", - "init_method = 'unit'\n", - "block_length = 2\n", - "cum_percentage = 0.98" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [], - "source": [ - "# Initialize network\n", - "model_name = 'mps_dmrg'\n", - "mps = MPS_DMRG(n_features=input_size + 1,\n", - " in_dim=embedding_dim,\n", - " out_dim=num_classes,\n", - " bond_dim=bond_dim,\n", - " boundary='obc',\n", - " init_method=init_method,\n", - " device=device)\n", - "\n", - "# Important to set data nodes before merging nodes\n", - "mps.set_data_nodes()" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [], - "source": [ - "def embedding(x):\n", - " x = tk.embeddings.unit(x, dim=embedding_dim)\n", - " return x" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Train" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [], - "source": [ - "# Hyperparameters\n", - "learning_rate = 1e-3\n", - "weight_decay = 1e-8\n", - "num_epochs = 100\n", - "move_block_epochs = 100\n", - "\n", - "# Loss and optimizer\n", - "criterion = nn.CrossEntropyLoss()" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [], - "source": [ - "# Check accuracy on training & test to see how good our model is\n", - "def check_accuracy(loader, model):\n", - " num_correct = 0\n", - " num_samples = 0\n", - " model.eval()\n", - " \n", - " with torch.no_grad():\n", - " for x, y in loader:\n", - " x = x.to(device)\n", - " y = y.to(device)\n", - " x = x.reshape(x.shape[0], -1)\n", - " \n", - " scores = model(embedding(x))\n", - " _, predictions = scores.max(1)\n", - " num_correct += (predictions == y).sum()\n", - " num_samples += predictions.size(0)\n", - " \n", - " accuracy = float(num_correct) / float(num_samples) * 100\n", - " model.train()\n", - " return accuracy" - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "* Epoch 1 (block_position=9, direction=1)=> Train. Acc.: 12.75, Test Acc.: 13.15\n", - "* Epoch 2 (block_position=18, direction=1)=> Train. Acc.: 12.88, Test Acc.: 13.35\n", - "* Epoch 3 (block_position=27, direction=1)=> Train. Acc.: 13.07, Test Acc.: 13.63\n", - "* Epoch 4 (block_position=36, direction=1)=> Train. Acc.: 13.25, Test Acc.: 13.20\n", - "* Epoch 5 (block_position=45, direction=1)=> Train. Acc.: 15.93, Test Acc.: 15.27\n", - "* Epoch 6 (block_position=54, direction=1)=> Train. Acc.: 17.78, Test Acc.: 16.93\n", - "* Epoch 7 (block_position=63, direction=1)=> Train. Acc.: 18.97, Test Acc.: 17.51\n", - "* Epoch 8 (block_position=72, direction=1)=> Train. Acc.: 21.57, Test Acc.: 18.85\n", - "* Epoch 9 (block_position=81, direction=1)=> Train. Acc.: 22.80, Test Acc.: 19.67\n", - "* Epoch 10 (block_position=90, direction=1)=> Train. Acc.: 24.91, Test Acc.: 21.50\n", - "* Epoch 11 (block_position=99, direction=1)=> Train. Acc.: 27.40, Test Acc.: 23.48\n", - "* Epoch 12 (block_position=108, direction=1)=> Train. Acc.: 29.46, Test Acc.: 25.31\n", - "* Epoch 13 (block_position=117, direction=1)=> Train. Acc.: 38.99, Test Acc.: 33.37\n", - "* Epoch 14 (block_position=126, direction=1)=> Train. Acc.: 41.44, Test Acc.: 35.75\n", - "* Epoch 15 (block_position=135, direction=1)=> Train. Acc.: 44.87, Test Acc.: 38.75\n", - "* Epoch 16 (block_position=144, direction=1)=> Train. Acc.: 47.04, Test Acc.: 41.17\n", - "* Epoch 17 (block_position=153, direction=1)=> Train. Acc.: 48.40, Test Acc.: 41.93\n", - "* Epoch 18 (block_position=162, direction=1)=> Train. Acc.: 49.52, Test Acc.: 42.38\n", - "* Epoch 19 (block_position=171, direction=1)=> Train. Acc.: 50.02, Test Acc.: 42.80\n", - "* Epoch 20 (block_position=180, direction=1)=> Train. Acc.: 50.37, Test Acc.: 43.01\n", - "* Epoch 21 (block_position=189, direction=1)=> Train. Acc.: 50.22, Test Acc.: 42.90\n", - "* Epoch 22 (block_position=198, direction=1)=> Train. Acc.: 50.56, Test Acc.: 43.45\n", - "* Epoch 23 (block_position=207, direction=1)=> Train. Acc.: 50.45, Test Acc.: 43.09\n", - "* Epoch 24 (block_position=216, direction=1)=> Train. Acc.: 50.38, Test Acc.: 43.32\n", - "* Epoch 25 (block_position=223, direction=-1)=> Train. Acc.: 50.67, Test Acc.: 43.13\n", - "* Epoch 26 (block_position=214, direction=-1)=> Train. Acc.: 50.41, Test Acc.: 43.18\n", - "* Epoch 27 (block_position=205, direction=-1)=> Train. Acc.: 50.31, Test Acc.: 42.80\n", - "* Epoch 28 (block_position=196, direction=-1)=> Train. Acc.: 50.62, Test Acc.: 43.36\n", - "* Epoch 29 (block_position=187, direction=-1)=> Train. Acc.: 50.35, Test Acc.: 43.42\n", - "* Epoch 30 (block_position=178, direction=-1)=> Train. Acc.: 50.87, Test Acc.: 43.31\n", - "* Epoch 31 (block_position=169, direction=-1)=> Train. Acc.: 51.33, Test Acc.: 43.28\n", - "* Epoch 32 (block_position=160, direction=-1)=> Train. Acc.: 51.49, Test Acc.: 42.85\n", - "* Epoch 33 (block_position=151, direction=-1)=> Train. Acc.: 52.19, Test Acc.: 43.20\n", - "* Epoch 34 (block_position=142, direction=-1)=> Train. Acc.: 52.50, Test Acc.: 43.21\n", - "* Epoch 35 (block_position=133, direction=-1)=> Train. Acc.: 53.17, Test Acc.: 43.05\n", - "* Epoch 36 (block_position=124, direction=-1)=> Train. Acc.: 54.22, Test Acc.: 43.48\n", - "* Epoch 37 (block_position=115, direction=-1)=> Train. Acc.: 55.39, Test Acc.: 44.47\n", - "* Epoch 38 (block_position=106, direction=-1)=> Train. Acc.: 59.71, Test Acc.: 48.28\n", - "* Epoch 39 (block_position=97, direction=-1)=> Train. Acc.: 61.19, Test Acc.: 49.97\n", - "* Epoch 40 (block_position=88, direction=-1)=> Train. Acc.: 63.27, Test Acc.: 52.01\n", - "* Epoch 41 (block_position=79, direction=-1)=> Train. Acc.: 65.81, Test Acc.: 54.78\n", - "* Epoch 42 (block_position=70, direction=-1)=> Train. Acc.: 67.14, Test Acc.: 56.31\n", - "* Epoch 43 (block_position=61, direction=-1)=> Train. Acc.: 69.11, Test Acc.: 58.45\n", - "* Epoch 44 (block_position=52, direction=-1)=> Train. Acc.: 69.54, Test Acc.: 59.10\n", - "* Epoch 45 (block_position=43, direction=-1)=> Train. Acc.: 69.92, Test Acc.: 59.63\n", - "* Epoch 46 (block_position=34, direction=-1)=> Train. Acc.: 69.91, Test Acc.: 59.61\n", - "* Epoch 47 (block_position=25, direction=-1)=> Train. Acc.: 69.96, Test Acc.: 59.37\n", - "* Epoch 48 (block_position=16, direction=-1)=> Train. Acc.: 69.94, Test Acc.: 59.60\n", - "* Epoch 49 (block_position=7, direction=-1)=> Train. Acc.: 69.57, Test Acc.: 59.07\n", - "* Epoch 50 (block_position=2, direction=1)=> Train. Acc.: 70.16, Test Acc.: 59.82\n", - "* Epoch 51 (block_position=11, direction=1)=> Train. Acc.: 69.99, Test Acc.: 59.69\n", - "* Epoch 52 (block_position=20, direction=1)=> Train. Acc.: 69.91, Test Acc.: 59.58\n", - "* Epoch 53 (block_position=29, direction=1)=> Train. Acc.: 69.87, Test Acc.: 59.23\n", - "* Epoch 54 (block_position=38, direction=1)=> Train. Acc.: 69.94, Test Acc.: 59.44\n", - "* Epoch 55 (block_position=47, direction=1)=> Train. Acc.: 70.32, Test Acc.: 59.61\n", - "* Epoch 56 (block_position=56, direction=1)=> Train. Acc.: 70.44, Test Acc.: 59.36\n", - "* Epoch 57 (block_position=65, direction=1)=> Train. Acc.: 70.80, Test Acc.: 59.50\n", - "* Epoch 58 (block_position=74, direction=1)=> Train. Acc.: 71.57, Test Acc.: 59.42\n", - "* Epoch 59 (block_position=83, direction=1)=> Train. Acc.: 72.07, Test Acc.: 59.73\n", - "* Epoch 60 (block_position=92, direction=1)=> Train. Acc.: 72.71, Test Acc.: 60.39\n", - "* Epoch 61 (block_position=101, direction=1)=> Train. Acc.: 73.74, Test Acc.: 61.01\n", - "* Epoch 62 (block_position=110, direction=1)=> Train. Acc.: 74.56, Test Acc.: 61.42\n", - "* Epoch 63 (block_position=119, direction=1)=> Train. Acc.: 77.45, Test Acc.: 64.26\n", - "* Epoch 64 (block_position=128, direction=1)=> Train. Acc.: 78.30, Test Acc.: 65.43\n", - "* Epoch 65 (block_position=137, direction=1)=> Train. Acc.: 79.33, Test Acc.: 66.56\n", - "* Epoch 66 (block_position=146, direction=1)=> Train. Acc.: 80.41, Test Acc.: 67.67\n", - "* Epoch 67 (block_position=155, direction=1)=> Train. Acc.: 81.28, Test Acc.: 68.59\n", - "* Epoch 68 (block_position=164, direction=1)=> Train. Acc.: 82.38, Test Acc.: 69.93\n", - "* Epoch 69 (block_position=173, direction=1)=> Train. Acc.: 82.69, Test Acc.: 70.40\n", - "* Epoch 70 (block_position=182, direction=1)=> Train. Acc.: 82.86, Test Acc.: 69.84\n", - "* Epoch 71 (block_position=191, direction=1)=> Train. Acc.: 82.85, Test Acc.: 70.54\n", - "* Epoch 72 (block_position=200, direction=1)=> Train. Acc.: 82.70, Test Acc.: 70.19\n", - "* Epoch 73 (block_position=209, direction=1)=> Train. Acc.: 82.95, Test Acc.: 70.56\n", - "* Epoch 74 (block_position=218, direction=1)=> Train. Acc.: 82.81, Test Acc.: 70.34\n", - "* Epoch 75 (block_position=221, direction=-1)=> Train. Acc.: 83.05, Test Acc.: 70.74\n", - "* Epoch 76 (block_position=212, direction=-1)=> Train. Acc.: 82.64, Test Acc.: 70.36\n", - "* Epoch 77 (block_position=203, direction=-1)=> Train. Acc.: 82.80, Test Acc.: 70.40\n", - "* Epoch 78 (block_position=194, direction=-1)=> Train. Acc.: 83.10, Test Acc.: 70.45\n", - "* Epoch 79 (block_position=185, direction=-1)=> Train. Acc.: 82.98, Test Acc.: 70.27\n", - "* Epoch 80 (block_position=176, direction=-1)=> Train. Acc.: 83.10, Test Acc.: 70.23\n", - "* Epoch 81 (block_position=167, direction=-1)=> Train. Acc.: 83.75, Test Acc.: 70.21\n", - "* Epoch 82 (block_position=158, direction=-1)=> Train. Acc.: 84.00, Test Acc.: 70.05\n", - "* Epoch 83 (block_position=149, direction=-1)=> Train. Acc.: 84.41, Test Acc.: 70.18\n", - "* Epoch 84 (block_position=140, direction=-1)=> Train. Acc.: 84.52, Test Acc.: 70.06\n", - "* Epoch 85 (block_position=131, direction=-1)=> Train. Acc.: 84.89, Test Acc.: 69.79\n", - "* Epoch 86 (block_position=122, direction=-1)=> Train. Acc.: 85.35, Test Acc.: 69.74\n", - "* Epoch 87 (block_position=113, direction=-1)=> Train. Acc.: 85.68, Test Acc.: 70.67\n", - "* Epoch 88 (block_position=104, direction=-1)=> Train. Acc.: 87.23, Test Acc.: 71.58\n", - "* Epoch 89 (block_position=95, direction=-1)=> Train. Acc.: 87.77, Test Acc.: 72.49\n", - "* Epoch 90 (block_position=86, direction=-1)=> Train. Acc.: 88.09, Test Acc.: 72.60\n", - "* Epoch 91 (block_position=77, direction=-1)=> Train. Acc.: 89.02, Test Acc.: 73.84\n", - "* Epoch 92 (block_position=68, direction=-1)=> Train. Acc.: 89.36, Test Acc.: 74.31\n", - "* Epoch 93 (block_position=59, direction=-1)=> Train. Acc.: 89.81, Test Acc.: 75.01\n", - "* Epoch 94 (block_position=50, direction=-1)=> Train. Acc.: 89.46, Test Acc.: 75.64\n", - "* Epoch 95 (block_position=41, direction=-1)=> Train. Acc.: 89.64, Test Acc.: 75.40\n", - "* Epoch 96 (block_position=32, direction=-1)=> Train. Acc.: 89.38, Test Acc.: 74.92\n", - "* Epoch 97 (block_position=23, direction=-1)=> Train. Acc.: 89.54, Test Acc.: 75.21\n", - "* Epoch 98 (block_position=14, direction=-1)=> Train. Acc.: 89.53, Test Acc.: 75.20\n", - "* Epoch 99 (block_position=5, direction=-1)=> Train. Acc.: 88.86, Test Acc.: 74.91\n", - "* Epoch 100 (block_position=4, direction=1)=> Train. Acc.: 89.37, Test Acc.: 75.13\n" - ] - } - ], - "source": [ - "# Train network\n", - "block_position = 0\n", - "direction = 1\n", - "mps.merge_block(block_position, block_length)\n", - "mps.trace(torch.zeros(1, input_size, embedding_dim, device=device))\n", - "optimizer = optim.Adam(mps.parameters(),\n", - " lr=learning_rate,\n", - " weight_decay=weight_decay)\n", - "\n", - "for epoch in range(num_epochs):\n", - " for batch_idx, (data, targets) in enumerate(train_loader):\n", - " # Get data to cuda if possible\n", - " data = data.to(device)\n", - " targets = targets.to(device)\n", - " \n", - " # Get to correct shape\n", - " data = data.reshape(data.shape[0], -1)\n", - " \n", - " # Forward\n", - " scores = mps(embedding(data))\n", - " loss = criterion(scores, targets)\n", - " \n", - " # Backward\n", - " optimizer.zero_grad()\n", - " loss.backward()\n", - " \n", - " # Gradient descent\n", - " optimizer.step()\n", - " \n", - " if (batch_idx + 1) % move_block_epochs == 0:\n", - " if block_position + direction + block_length > mps.n_features:\n", - " direction *= -1\n", - " if block_position + direction < 0:\n", - " direction *= -1\n", - " if block_length == mps.n_features:\n", - " direction = 0\n", - " \n", - " if direction >= 0:\n", - " mps.unmerge_block(side='left',\n", - " rank=bond_dim, \n", - " cum_percentage=cum_percentage)\n", - " else:\n", - " mps.unmerge_block(side='right',\n", - " rank=bond_dim, \n", - " cum_percentage=cum_percentage)\n", - " \n", - " block_position += direction\n", - " mps.merge_block(block_position, block_length)\n", - " mps.trace(torch.zeros(1, input_size, embedding_dim, device=device))\n", - " optimizer = optim.Adam(mps.parameters(),\n", - " lr=learning_rate,\n", - " weight_decay=weight_decay)\n", - " \n", - " train_acc = check_accuracy(train_loader, mps)\n", - " test_acc = check_accuracy(test_loader, mps)\n", - " \n", - " print(f'* Epoch {epoch + 1:<3} ({block_position=}, {direction=})=>'\n", - " f' Train. Acc.: {train_acc:.2f},'\n", - " f' Test Acc.: {test_acc:.2f}')\n", - "\n", - "# Reset before saving the model\n", - "mps.reset()\n", - "torch.save(mps.state_dict(), f'models/{model_name}_{dataset_name}.pt')" - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "metadata": {}, - "outputs": [], - "source": [ - "mps.unmerge_block(rank=bond_dim, cum_percentage=cum_percentage)" - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "metadata": {}, - "outputs": [], - "source": [ - "mps.update_bond_dim()" - ] - }, - { - "cell_type": "code", - "execution_count": 27, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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", - "text/plain": [ - "
    " - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "plt.bar(torch.arange(mps.n_features - 1) + 1, torch.tensor(mps.bond_dim))\n", - "plt.show()" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "test_tk", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.10.14" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/docs/_build/html/examples/mps_dmrg_hybrid.html b/docs/_build/html/examples/mps_dmrg_hybrid.html index 4cb3f09..56c5566 100644 --- a/docs/_build/html/examples/mps_dmrg_hybrid.html +++ b/docs/_build/html/examples/mps_dmrg_hybrid.html @@ -6,7 +6,7 @@ - Hybrid DMRG-like training of MPS — TensorKrowch 1.1.2 documentation + Hybrid DMRG-like training of MPS — TensorKrowch 1.1.3 documentation diff --git a/docs/_build/html/examples/tensorizing_nn.html b/docs/_build/html/examples/tensorizing_nn.html index 24b9032..437aacd 100644 --- a/docs/_build/html/examples/tensorizing_nn.html +++ b/docs/_build/html/examples/tensorizing_nn.html @@ -6,7 +6,7 @@ - Tensorizing Neural Networks — TensorKrowch 1.1.2 documentation + Tensorizing Neural Networks — TensorKrowch 1.1.3 documentation diff --git a/docs/_build/html/examples/training_mps.html b/docs/_build/html/examples/training_mps.html index ec54c00..dc665e7 100644 --- a/docs/_build/html/examples/training_mps.html +++ b/docs/_build/html/examples/training_mps.html @@ -6,7 +6,7 @@ - Training MPS in different ways — TensorKrowch 1.1.2 documentation + Training MPS in different ways — TensorKrowch 1.1.3 documentation diff --git a/docs/_build/html/genindex.html b/docs/_build/html/genindex.html index 1b7c1e1..26779b1 100644 --- a/docs/_build/html/genindex.html +++ b/docs/_build/html/genindex.html @@ -5,7 +5,7 @@ - Index — TensorKrowch 1.1.2 documentation + Index — TensorKrowch 1.1.3 documentation @@ -446,6 +446,8 @@

    C

  • (tensorkrowch.ParamNode method)
  • +
  • conj() (tensorkrowch.AbstractNode method) +
  • connect() (in module tensorkrowch)
  • + + - +
  • is_complex() (tensorkrowch.AbstractNode method) +
  • +
  • is_conj() (tensorkrowch.AbstractNode method) +
  • is_connected_to() (tensorkrowch.AbstractNode method)
  • is_dangling() (tensorkrowch.Edge method)
  • is_data() (tensorkrowch.AbstractNode method) +
  • +
  • is_floating_point() (tensorkrowch.AbstractNode method)
  • is_leaf() (tensorkrowch.AbstractNode method)
  • @@ -1246,6 +1254,8 @@

    T

    diff --git a/docs/_build/html/index.html b/docs/_build/html/index.html index c0a4036..11e3955 100644 --- a/docs/_build/html/index.html +++ b/docs/_build/html/index.html @@ -6,7 +6,7 @@ - TensorKrowch documentation — TensorKrowch 1.1.2 documentation + TensorKrowch documentation — TensorKrowch 1.1.3 documentation diff --git a/docs/_build/html/initializers.html b/docs/_build/html/initializers.html index acaeaa5..a59d24c 100644 --- a/docs/_build/html/initializers.html +++ b/docs/_build/html/initializers.html @@ -6,7 +6,7 @@ - Initializers — TensorKrowch 1.1.2 documentation + Initializers — TensorKrowch 1.1.3 documentation diff --git a/docs/_build/html/installation.html b/docs/_build/html/installation.html index e3f3bf3..a51f62b 100644 --- a/docs/_build/html/installation.html +++ b/docs/_build/html/installation.html @@ -6,7 +6,7 @@ - Installation — TensorKrowch 1.1.2 documentation + Installation — TensorKrowch 1.1.3 documentation diff --git a/docs/_build/html/models.html b/docs/_build/html/models.html index 6933718..fbe0f1e 100644 --- a/docs/_build/html/models.html +++ b/docs/_build/html/models.html @@ -6,7 +6,7 @@ - Models — TensorKrowch 1.1.2 documentation + Models — TensorKrowch 1.1.3 documentation @@ -670,7 +670,7 @@

    MPS#MPS#

    -class tensorkrowch.models.MPS(n_features=None, phys_dim=None, bond_dim=None, boundary='obc', tensors=None, in_features=None, out_features=None, n_batches=1, init_method='randn', device=None, **kwargs)[source]#
    +class tensorkrowch.models.MPS(n_features=None, phys_dim=None, bond_dim=None, boundary='obc', tensors=None, in_features=None, out_features=None, n_batches=1, init_method='randn', device=None, dtype=None, **kwargs)[source]#

    Class for Matrix Product States. This is the base class from which UMPS, MPSLayer and UMPSLayer inherit.

    Matrix Product States are formed by:

    @@ -737,6 +737,7 @@

    MPS#

    init_method ({"zeros", "ones", "copy", "rand", "randn", "randn_eye", "unit"}, optional) – Initialization method. Check initialize() for a more detailed explanation of the different initialization methods.

  • device (torch.device, optional) – Device where to initialize the tensors if init_method is provided.

  • +
  • dtype (torch.dtype, optional) – Dtype of the tensor if init_method is provided.

  • kwargs (float) – Keyword arguments for the different initialization methods. See make_tensor().

  • @@ -885,14 +886,14 @@

    MPS#
    -initialize(tensors=None, init_method='randn', device=None, **kwargs)[source]#
    +initialize(tensors=None, init_method='randn', device=None, dtype=None, **kwargs)[source]#

    Initializes all the nodes of the MPS. It can be called when instantiating the model, or to override the existing nodes’ tensors.

    There are different methods to initialize the nodes:

    • {"zeros", "ones", "copy", "rand", "randn"}: Each node is initialized calling set_tensor() with -the given method, device and kwargs.

    • +the given method, device, dtype and kwargs.

    • "randn_eye": Nodes are initialized as in this paper, adding identities at the top of random gaussian tensors. In this case, std should be @@ -917,6 +918,7 @@

      MPS#

    • init_method ({"zeros", "ones", "copy", "rand", "randn", "randn_eye", "unit", "canonical"}, optional) – Initialization method.

    • device (torch.device, optional) – Device where to initialize the tensors if init_method is provided.

    • +
    • dtype (torch.dtype, optional) – Dtype of the tensor if init_method is provided.

    • kwargs (float) – Keyword arguments for the different initialization methods. See make_tensor().

    @@ -1243,7 +1245,7 @@

    MPS#UMPS#

    -class tensorkrowch.models.UMPS(n_features, phys_dim=None, bond_dim=None, tensor=None, in_features=None, out_features=None, n_batches=1, init_method='randn', device=None, **kwargs)[source]#
    +class tensorkrowch.models.UMPS(n_features, phys_dim=None, bond_dim=None, tensor=None, in_features=None, out_features=None, n_batches=1, init_method='randn', device=None, dtype=None, **kwargs)[source]#

    Class for Uniform (translationally invariant) Matrix Product States. It is the uniform version of MPS, that is, all nodes share the same tensor. Thus this class cannot have different physical or bond dimensions @@ -1282,6 +1284,7 @@

    UMPS#<
  • init_method ({"zeros", "ones", "copy", "rand", "randn", "randn_eye", "unit"}, optional) – Initialization method. Check initialize() for a more detailed explanation of the different initialization methods.

  • device (torch.device, optional) – Device where to initialize the tensors if init_method is provided.

  • +
  • dtype (torch.dtype, optional) – Dtype of the tensor if init_method is provided.

  • kwargs (float) – Keyword arguments for the different initialization methods. See make_tensor().

  • @@ -1302,14 +1305,14 @@

    UMPS#<

    -initialize(tensors=None, init_method='randn', device=None, **kwargs)[source]#
    +initialize(tensors=None, init_method='randn', device=None, dtype=None, **kwargs)[source]#

    Initializes the common tensor of the UMPS. It can be called when instantiating the model, or to override the existing nodes’ tensors.

    There are different methods to initialize the nodes:

    @@ -1381,7 +1385,7 @@

    UMPS#<

    MPSLayer#

    -class tensorkrowch.models.MPSLayer(n_features=None, in_dim=None, out_dim=None, bond_dim=None, out_position=None, boundary='obc', tensors=None, n_batches=1, init_method='randn', device=None, **kwargs)[source]#
    +class tensorkrowch.models.MPSLayer(n_features=None, in_dim=None, out_dim=None, bond_dim=None, out_position=None, boundary='obc', tensors=None, n_batches=1, init_method='randn', device=None, dtype=None, **kwargs)[source]#

    Class for Matrix Product States with a single output node. That is, this MPS has \(n\) nodes, being \(n-1\) input nodes connected to data nodes (nodes that will contain the data tensors), and one output node, @@ -1447,6 +1451,7 @@

    MPSLayerinitialize() for a more detailed explanation of the different initialization methods.

  • device (torch.device, optional) – Device where to initialize the tensors if init_method is provided.

  • +
  • dtype (torch.dtype, optional) – Dtype of the tensor if init_method is provided.

  • kwargs (float) – Keyword arguments for the different initialization methods. See make_tensor().

  • @@ -1503,14 +1508,14 @@

    MPSLayer
    -initialize(tensors=None, init_method='randn', device=None, **kwargs)[source]#
    +initialize(tensors=None, init_method='randn', device=None, dtype=None, **kwargs)[source]#

    Initializes all the nodes of the MPSLayer. It can be called when instantiating the model, or to override the existing nodes’ tensors.

    There are different methods to initialize the nodes:

    @@ -1567,7 +1573,7 @@

    MPSLayer#

    -class tensorkrowch.models.UMPSLayer(n_features, in_dim=None, out_dim=None, bond_dim=None, out_position=None, tensors=None, n_batches=1, init_method='randn', device=None, **kwargs)[source]#
    +class tensorkrowch.models.UMPSLayer(n_features, in_dim=None, out_dim=None, bond_dim=None, out_position=None, tensors=None, n_batches=1, init_method='randn', device=None, dtype=None, **kwargs)[source]#

    Class for Uniform (translationally invariant) Matrix Product States with an output node. It is the uniform version of MPSLayer, with all input nodes sharing the same tensor, but with a different node for the output node. @@ -1607,6 +1613,7 @@

    UMPSLayerinitialize() for a more detailed explanation of the different initialization methods.

  • device (torch.device, optional) – Device where to initialize the tensors if init_method is provided.

  • +
  • dtype (torch.dtype, optional) – Dtype of the tensor if init_method is provided.

  • kwargs (float) – Keyword arguments for the different initialization methods. See make_tensor().

  • @@ -1654,14 +1661,14 @@

    UMPSLayer
    -initialize(tensors=None, init_method='randn', device=None, **kwargs)[source]#
    +initialize(tensors=None, init_method='randn', device=None, dtype=None, **kwargs)[source]#

    Initializes the common tensor of the UMPSLayer. It can be called when instantiating the model, or to override the existing nodes’ tensors.

    There are different methods to initialize the nodes:

    @@ -1734,7 +1742,7 @@

    UMPSLayer#

    -class tensorkrowch.models.ConvMPS(in_channels, bond_dim, kernel_size, stride=1, padding=0, dilation=1, boundary='obc', tensors=None, init_method='randn', device=None, **kwargs)[source]#
    +class tensorkrowch.models.ConvMPS(in_channels, bond_dim, kernel_size, stride=1, padding=0, dilation=1, boundary='obc', tensors=None, init_method='randn', device=None, dtype=None, **kwargs)[source]#

    Convolutional version of MPS, where the input data is assumed to be a batch of images.

    Input data as well as initialization parameters are described in torch.nn.Conv2d.

    @@ -1772,6 +1780,7 @@

    ConvMPSinitialize() for a more detailed explanation of the different initialization methods.

  • device (torch.device, optional) – Device where to initialize the tensors if init_method is provided.

  • +
  • dtype (torch.dtype, optional) – Dtype of the tensor if init_method is provided.

  • kwargs (float) – Keyword arguments for the different initialization methods. See make_tensor().

  • @@ -1869,7 +1878,7 @@

    ConvMPS#

    -class tensorkrowch.models.ConvUMPS(in_channels, bond_dim, kernel_size, stride=1, padding=0, dilation=1, tensor=None, init_method='randn', device=None, **kwargs)[source]#
    +class tensorkrowch.models.ConvUMPS(in_channels, bond_dim, kernel_size, stride=1, padding=0, dilation=1, tensor=None, init_method='randn', device=None, dtype=None, **kwargs)[source]#

    Convolutional version of UMPS, where the input data is assumed to be a batch of images.

    Input data as well as initialization parameters are described in torch.nn.Conv2d.

    @@ -1897,6 +1906,7 @@

    ConvUMPSinitialize() for a more detailed explanation of the different initialization methods.

  • device (torch.device, optional) – Device where to initialize the tensors if init_method is provided.

  • +
  • dtype (torch.dtype, optional) – Dtype of the tensor if init_method is provided.

  • kwargs (float) – Keyword arguments for the different initialization methods. See make_tensor().

  • @@ -1997,7 +2007,7 @@

    ConvUMPS#

    -class tensorkrowch.models.ConvMPSLayer(in_channels, out_channels, bond_dim, kernel_size, stride=1, padding=0, dilation=1, out_position=None, boundary='obc', tensors=None, init_method='randn', device=None, **kwargs)[source]#
    +class tensorkrowch.models.ConvMPSLayer(in_channels, out_channels, bond_dim, kernel_size, stride=1, padding=0, dilation=1, out_position=None, boundary='obc', tensors=None, init_method='randn', device=None, dtype=None, **kwargs)[source]#

    Convolutional version of MPSLayer, where the input data is assumed to be a batch of images.

    Input data as well as initialization parameters are described in torch.nn.Conv2d.

    @@ -2040,6 +2050,7 @@

    ConvMPSLayerinitialize() for a more detailed explanation of the different initialization methods.

  • device (torch.device, optional) – Device where to initialize the tensors if init_method is provided.

  • +
  • dtype (torch.dtype, optional) – Dtype of the tensor if init_method is provided.

  • kwargs (float) – Keyword arguments for the different initialization methods. See make_tensor().

  • @@ -2144,7 +2155,7 @@

    ConvMPSLayer#

    -class tensorkrowch.models.ConvUMPSLayer(in_channels, out_channels, bond_dim, kernel_size, stride=1, padding=0, dilation=1, out_position=None, tensors=None, init_method='randn', device=None, **kwargs)[source]#
    +class tensorkrowch.models.ConvUMPSLayer(in_channels, out_channels, bond_dim, kernel_size, stride=1, padding=0, dilation=1, out_position=None, tensors=None, init_method='randn', device=None, dtype=None, **kwargs)[source]#

    Convolutional version of UMPSLayer, where the input data is assumed to be a batch of images.

    Input data as well as initialization parameters are described in torch.nn.Conv2d.

    @@ -2178,6 +2189,7 @@

    ConvUMPSLayerinitialize() for a more detailed explanation of the different initialization methods.

  • device (torch.device, optional) – Device where to initialize the tensors if init_method is provided.

  • +
  • dtype (torch.dtype, optional) – Dtype of the tensor if init_method is provided.

  • kwargs (float) – Keyword arguments for the different initialization methods. See make_tensor().

  • @@ -2289,7 +2301,7 @@

    MPSData#

    -class tensorkrowch.models.MPSData(n_features=None, phys_dim=None, bond_dim=None, boundary='obc', n_batches=1, tensors=None, init_method=None, device=None, **kwargs)[source]#
    +class tensorkrowch.models.MPSData(n_features=None, phys_dim=None, bond_dim=None, boundary='obc', n_batches=1, tensors=None, init_method=None, device=None, dtype=None, **kwargs)[source]#

    Class for data vectors in the form of Matrix Product States. That is, this is a class similar to MPS, but where all nodes can have additional batch edges.

    @@ -2344,6 +2356,7 @@

    MPSDataadd_data() to see how to initialize MPS nodes with data tensors.

  • device (torch.device, optional) – Device where to initialize the tensors if init_method is provided.

  • +
  • dtype (torch.dtype, optional) – Dtype of the tensor if init_method is provided.

  • kwargs (float) – Keyword arguments for the different initialization methods. See make_tensor().

  • @@ -2409,16 +2422,22 @@

    MPSData

    Returns the list of nodes in mats_env.

    +
    +
    +property tensors#
    +

    Returns the list of MPS tensors.

    +
    +
    -initialize(init_method='randn', device=None, **kwargs)[source]#
    +initialize(init_method='randn', device=None, dtype=None, **kwargs)[source]#

    Initializes all the nodes of the MPSData. It can be called when instantiating the model, or to override the existing nodes’ tensors.

    There are different methods to initialize the nodes:

    • {"zeros", "ones", "copy", "rand", "randn"}: Each node is initialized calling set_tensor() with -the given method, device and kwargs.

    • +the given method, device, dtype and kwargs.

    Parameters
    @@ -2426,6 +2445,7 @@

    MPSData

    init_method ({"zeros", "ones", "copy", "rand", "randn"}, optional) – Initialization method. Check add_data() to see how to initialize MPS nodes with data tensors.

  • device (torch.device, optional) – Device where to initialize the tensors if init_method is provided.

  • +
  • dtype (torch.dtype, optional) – Dtype of the tensor if init_method is provided.

  • kwargs (float) – Keyword arguments for the different initialization methods. See make_tensor().

  • @@ -2461,7 +2481,7 @@

    MPO#MPO#

    -class tensorkrowch.models.MPO(n_features=None, in_dim=None, out_dim=None, bond_dim=None, boundary='obc', tensors=None, n_batches=1, init_method='randn', device=None, **kwargs)[source]#
    +class tensorkrowch.models.MPO(n_features=None, in_dim=None, out_dim=None, bond_dim=None, boundary='obc', tensors=None, n_batches=1, init_method='randn', device=None, dtype=None, **kwargs)[source]#

    Class for Matrix Product Operators. This is the base class from which UMPO inherits.

    Matrix Product Operators are formed by:

    @@ -2511,6 +2531,7 @@

    MPO#

    init_method ({"zeros", "ones", "copy", "rand", "randn"}, optional) – Initialization method. Check initialize() for a more detailed explanation of the different initialization methods.

  • device (torch.device, optional) – Device where to initialize the tensors if init_method is provided.

  • +
  • dtype (torch.dtype, optional) – Dtype of the tensor if init_method is provided.

  • kwargs (float) – Keyword arguments for the different initialization methods. See make_tensor().

  • @@ -2604,14 +2625,14 @@

    MPO#
    -initialize(tensors=None, init_method='randn', device=None, **kwargs)[source]#
    +initialize(tensors=None, init_method='randn', device=None, dtype=None, **kwargs)[source]#

    Initializes all the nodes of the MPO. It can be called when instantiating the model, or to override the existing nodes’ tensors.

    There are different methods to initialize the nodes:

    • {"zeros", "ones", "copy", "rand", "randn"}: Each node is initialized calling set_tensor() with -the given method, device and kwargs.

    • +the given method, device, dtype and kwargs.

    Parameters
    @@ -2623,6 +2644,7 @@

    MPO#
  • init_method ({"zeros", "ones", "copy", "rand", "randn"}, optional) – Initialization method.

  • device (torch.device, optional) – Device where to initialize the tensors if init_method is provided.

  • +
  • dtype (torch.dtype, optional) – Dtype of the tensor if init_method is provided.

  • kwargs (float) – Keyword arguments for the different initialization methods. See make_tensor().

  • @@ -2808,7 +2830,7 @@

    MPO#UMPO#

    -class tensorkrowch.models.UMPO(n_features=None, in_dim=None, out_dim=None, bond_dim=None, tensor=None, n_batches=1, init_method='randn', device=None, **kwargs)[source]#
    +class tensorkrowch.models.UMPO(n_features=None, in_dim=None, out_dim=None, bond_dim=None, tensor=None, n_batches=1, init_method='randn', device=None, dtype=None, **kwargs)[source]#

    Class for Uniform (translationally invariant) Matrix Product Operators. It is the uniform version of MPO, that is, all nodes share the same tensor. Thus this class cannot have different input/output or bond dimensions @@ -2836,6 +2858,7 @@

    UMPO#<
  • init_method ({"zeros", "ones", "copy", "rand", "randn"}, optional) – Initialization method. Check initialize() for a more detailed explanation of the different initialization methods.

  • device (torch.device, optional) – Device where to initialize the tensors if init_method is provided.

  • +
  • dtype (torch.dtype, optional) – Dtype of the tensor if init_method is provided.

  • kwargs (float) – Keyword arguments for the different initialization methods. See make_tensor().

  • @@ -2857,14 +2880,14 @@

    UMPO#<

    -initialize(tensors=None, init_method='randn', device=None, **kwargs)[source]#
    +initialize(tensors=None, init_method='randn', device=None, dtype=None, **kwargs)[source]#

    Initializes the common tensor of the UMPO. It can be called when instantiating the model, or to override the existing nodes’ tensors.

    There are different methods to initialize the nodes:

    • {"zeros", "ones", "copy", "rand", "randn"}: The tensor is initialized calling set_tensor() with -the given method, device and kwargs.

    • +the given method, device, dtype and kwargs.

    Parameters
    @@ -2874,6 +2897,7 @@

    UMPO#< equal.

  • init_method ({"zeros", "ones", "copy", "rand", "randn"}, optional) – Initialization method.

  • device (torch.device, optional) – Device where to initialize the tensors if init_method is provided.

  • +
  • dtype (torch.dtype, optional) – Dtype of the tensor if init_method is provided.

  • kwargs (float) – Keyword arguments for the different initialization methods. See make_tensor().

  • diff --git a/docs/_build/html/objects.inv b/docs/_build/html/objects.inv index 08d7c19fe175b1b3fcd99080e81d258ac41a6d4b..519ff1cf1c7a70b7c04a237878226fb480373ae2 100644 GIT binary patch delta 9091 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 BR*(Py delta 9002 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 GHUAI#4=vXK diff --git a/docs/_build/html/operations.html b/docs/_build/html/operations.html index 6e068cd..0521ed6 100644 --- a/docs/_build/html/operations.html +++ b/docs/_build/html/operations.html @@ -6,7 +6,7 @@ - Operations — TensorKrowch 1.1.2 documentation + Operations — TensorKrowch 1.1.3 documentation diff --git a/docs/_build/html/search.html b/docs/_build/html/search.html index 38aa2fe..5a1402c 100644 --- a/docs/_build/html/search.html +++ b/docs/_build/html/search.html @@ -5,7 +5,7 @@ - Search — TensorKrowch 1.1.2 documentation + Search — TensorKrowch 1.1.3 documentation diff --git a/docs/_build/html/searchindex.js b/docs/_build/html/searchindex.js index f4ec712..5dfcfda 100644 --- a/docs/_build/html/searchindex.js +++ b/docs/_build/html/searchindex.js @@ -1 +1 @@ -Search.setIndex({docnames:["api","components","contents","decompositions","embeddings","examples","examples/hybrid_tnn_model","examples/mps_dmrg","examples/mps_dmrg_hybrid","examples/tensorizing_nn","examples/training_mps","index","initializers","installation","models","operations","tutorials","tutorials/0_first_steps","tutorials/1_creating_tensor_network","tutorials/2_contracting_tensor_network","tutorials/3_memory_management","tutorials/4_types_of_nodes","tutorials/5_subclass_tensor_network","tutorials/6_mix_with_pytorch"],envversion:{"sphinx.domains.c":2,"sphinx.domains.changeset":1,"sphinx.domains.citation":1,"sphinx.domains.cpp":5,"sphinx.domains.index":1,"sphinx.domains.javascript":2,"sphinx.domains.math":2,"sphinx.domains.python":3,"sphinx.domains.rst":2,"sphinx.domains.std":2,"sphinx.ext.viewcode":1,nbsphinx:4,sphinx:56},filenames:["api.rst","components.rst","contents.rst","decompositions.rst","embeddings.rst","examples.rst","examples/hybrid_tnn_model.ipynb","examples/mps_dmrg.ipynb","examples/mps_dmrg_hybrid.ipynb","examples/tensorizing_nn.ipynb","examples/training_mps.ipynb","index.rst","initializers.rst","installation.rst","models.rst","operations.rst","tutorials.rst","tutorials/0_first_steps.rst","tutorials/1_creating_tensor_network.rst","tutorials/2_contracting_tensor_network.rst","tutorials/3_memory_management.rst","tutorials/4_types_of_nodes.rst","tutorials/5_subclass_tensor_network.rst","tutorials/6_mix_with_pytorch.rst"],objects:{"tensorkrowch.AbstractNode":[[1,1,1,"","axes"],[1,1,1,"","axes_names"],[1,2,1,"","contract_between"],[1,2,1,"","contract_between_"],[1,1,1,"","device"],[1,2,1,"","disconnect"],[1,1,1,"","dtype"],[1,1,1,"","edges"],[1,2,1,"","get_axis"],[1,2,1,"","get_axis_num"],[1,2,1,"","get_edge"],[1,2,1,"","in_which_axis"],[1,2,1,"","is_connected_to"],[1,2,1,"","is_data"],[1,2,1,"","is_leaf"],[1,2,1,"","is_node1"],[1,2,1,"","is_resultant"],[1,2,1,"","is_virtual"],[1,2,1,"","make_tensor"],[1,2,1,"","mean"],[1,2,1,"","move_to_network"],[1,1,1,"","name"],[1,2,1,"","neighbours"],[1,1,1,"","network"],[1,2,1,"","node_ref"],[1,2,1,"","norm"],[1,2,1,"","numel"],[1,2,1,"","permute"],[1,2,1,"","permute_"],[1,1,1,"","rank"],[1,2,1,"","reattach_edges"],[1,2,1,"","renormalize"],[1,2,1,"","reset_tensor_address"],[1,2,1,"","set_tensor"],[1,2,1,"","set_tensor_from"],[1,1,1,"","shape"],[1,2,1,"","size"],[1,2,1,"","split"],[1,2,1,"","split_"],[1,2,1,"","std"],[1,1,1,"","successors"],[1,2,1,"","sum"],[1,1,1,"","tensor"],[1,2,1,"","tensor_address"],[1,2,1,"","unset_tensor"]],"tensorkrowch.Axis":[[1,2,1,"","is_batch"],[1,2,1,"","is_node1"],[1,1,1,"","name"],[1,1,1,"","node"],[1,1,1,"","num"]],"tensorkrowch.Edge":[[1,1,1,"","axes"],[1,1,1,"","axis1"],[1,1,1,"","axis2"],[1,2,1,"","change_size"],[1,2,1,"","connect"],[1,2,1,"","contract"],[1,2,1,"","contract_"],[1,2,1,"","copy"],[1,2,1,"","disconnect"],[1,2,1,"","is_attached_to"],[1,2,1,"","is_batch"],[1,2,1,"","is_dangling"],[1,1,1,"","name"],[1,1,1,"","node1"],[1,1,1,"","node2"],[1,1,1,"","nodes"],[1,2,1,"","qr"],[1,2,1,"","qr_"],[1,2,1,"","rq"],[1,2,1,"","rq_"],[1,2,1,"","size"],[1,2,1,"","svd"],[1,2,1,"","svd_"],[1,2,1,"","svdr"],[1,2,1,"","svdr_"]],"tensorkrowch.Node":[[1,2,1,"","change_type"],[1,2,1,"","copy"],[1,2,1,"","parameterize"]],"tensorkrowch.ParamNode":[[1,2,1,"","change_type"],[1,2,1,"","copy"],[1,1,1,"","grad"],[1,2,1,"","parameterize"]],"tensorkrowch.ParamStackNode":[[1,1,1,"","edges_dict"],[1,1,1,"","node1_lists_dict"],[1,2,1,"","reconnect"],[1,2,1,"","unbind"]],"tensorkrowch.StackEdge":[[1,2,1,"","connect"],[1,1,1,"","edges"],[1,1,1,"","node1_list"]],"tensorkrowch.StackNode":[[1,1,1,"","edges_dict"],[1,1,1,"","node1_lists_dict"],[1,2,1,"","reconnect"],[1,2,1,"","unbind"]],"tensorkrowch.TensorNetwork":[[1,2,1,"","add_data"],[1,1,1,"","auto_stack"],[1,1,1,"","auto_unbind"],[1,2,1,"","contract"],[1,2,1,"","copy"],[1,1,1,"","data_nodes"],[1,2,1,"","delete_node"],[1,1,1,"","edges"],[1,2,1,"","forward"],[1,1,1,"","leaf_nodes"],[1,1,1,"","nodes"],[1,1,1,"","nodes_names"],[1,2,1,"","parameterize"],[1,2,1,"","reset"],[1,1,1,"","resultant_nodes"],[1,2,1,"","set_data_nodes"],[1,2,1,"","trace"],[1,2,1,"","unset_data_nodes"],[1,1,1,"","virtual_nodes"]],"tensorkrowch.decompositions":[[3,3,1,"","mat_to_mpo"],[3,3,1,"","vec_to_mps"]],"tensorkrowch.embeddings":[[4,3,1,"","add_ones"],[4,3,1,"","basis"],[4,3,1,"","discretize"],[4,3,1,"","poly"],[4,3,1,"","unit"]],"tensorkrowch.models":[[14,0,1,"","ConvMPS"],[14,0,1,"","ConvMPSLayer"],[14,0,1,"","ConvPEPS"],[14,0,1,"","ConvTree"],[14,0,1,"","ConvUMPS"],[14,0,1,"","ConvUMPSLayer"],[14,0,1,"","ConvUPEPS"],[14,0,1,"","ConvUTree"],[14,0,1,"","MPO"],[14,0,1,"","MPS"],[14,0,1,"","MPSData"],[14,0,1,"","MPSLayer"],[14,0,1,"","PEPS"],[14,0,1,"","Tree"],[14,0,1,"","UMPO"],[14,0,1,"","UMPS"],[14,0,1,"","UMPSLayer"],[14,0,1,"","UPEPS"],[14,0,1,"","UTree"]],"tensorkrowch.models.ConvMPS":[[14,2,1,"","copy"],[14,1,1,"","dilation"],[14,2,1,"","forward"],[14,1,1,"","in_channels"],[14,1,1,"","kernel_size"],[14,1,1,"","padding"],[14,1,1,"","stride"]],"tensorkrowch.models.ConvMPSLayer":[[14,2,1,"","copy"],[14,1,1,"","dilation"],[14,2,1,"","forward"],[14,1,1,"","in_channels"],[14,1,1,"","kernel_size"],[14,1,1,"","out_channels"],[14,1,1,"","padding"],[14,1,1,"","stride"]],"tensorkrowch.models.ConvPEPS":[[14,1,1,"","dilation"],[14,2,1,"","forward"],[14,1,1,"","in_channels"],[14,1,1,"","kernel_size"],[14,1,1,"","padding"],[14,1,1,"","stride"]],"tensorkrowch.models.ConvTree":[[14,1,1,"","dilation"],[14,2,1,"","forward"],[14,1,1,"","in_channels"],[14,1,1,"","kernel_size"],[14,1,1,"","padding"],[14,1,1,"","stride"]],"tensorkrowch.models.ConvUMPS":[[14,2,1,"","copy"],[14,1,1,"","dilation"],[14,2,1,"","forward"],[14,1,1,"","in_channels"],[14,1,1,"","kernel_size"],[14,1,1,"","padding"],[14,1,1,"","stride"]],"tensorkrowch.models.ConvUMPSLayer":[[14,2,1,"","copy"],[14,1,1,"","dilation"],[14,2,1,"","forward"],[14,1,1,"","in_channels"],[14,1,1,"","kernel_size"],[14,1,1,"","out_channels"],[14,1,1,"","padding"],[14,1,1,"","stride"]],"tensorkrowch.models.ConvUPEPS":[[14,1,1,"","dilation"],[14,2,1,"","forward"],[14,1,1,"","in_channels"],[14,1,1,"","kernel_size"],[14,1,1,"","padding"],[14,1,1,"","stride"]],"tensorkrowch.models.ConvUTree":[[14,1,1,"","dilation"],[14,2,1,"","forward"],[14,1,1,"","in_channels"],[14,1,1,"","kernel_size"],[14,1,1,"","padding"],[14,1,1,"","stride"]],"tensorkrowch.models.MPO":[[14,1,1,"","bond_dim"],[14,1,1,"","boundary"],[14,2,1,"","canonicalize"],[14,2,1,"","contract"],[14,2,1,"","copy"],[14,1,1,"","in_dim"],[14,2,1,"","initialize"],[14,1,1,"","left_node"],[14,1,1,"","mats_env"],[14,1,1,"","n_batches"],[14,1,1,"","n_features"],[14,1,1,"","out_dim"],[14,2,1,"","parameterize"],[14,1,1,"","right_node"],[14,2,1,"","set_data_nodes"],[14,1,1,"","tensors"],[14,2,1,"","update_bond_dim"]],"tensorkrowch.models.MPS":[[14,1,1,"","bond_dim"],[14,1,1,"","boundary"],[14,2,1,"","canonicalize"],[14,2,1,"","canonicalize_univocal"],[14,2,1,"","contract"],[14,2,1,"","copy"],[14,2,1,"","entropy"],[14,1,1,"","in_env"],[14,1,1,"","in_features"],[14,1,1,"","in_regions"],[14,2,1,"","initialize"],[14,1,1,"","left_node"],[14,1,1,"","mats_env"],[14,1,1,"","n_batches"],[14,1,1,"","n_features"],[14,2,1,"","norm"],[14,1,1,"","out_env"],[14,1,1,"","out_features"],[14,1,1,"","out_regions"],[14,2,1,"","parameterize"],[14,2,1,"","partial_density"],[14,1,1,"","phys_dim"],[14,1,1,"","right_node"],[14,2,1,"","set_data_nodes"],[14,1,1,"","tensors"],[14,2,1,"","update_bond_dim"]],"tensorkrowch.models.MPSData":[[14,2,1,"","add_data"],[14,1,1,"","bond_dim"],[14,1,1,"","boundary"],[14,2,1,"","initialize"],[14,1,1,"","left_node"],[14,1,1,"","mats_env"],[14,1,1,"","n_batches"],[14,1,1,"","n_features"],[14,1,1,"","phys_dim"],[14,1,1,"","right_node"]],"tensorkrowch.models.MPSLayer":[[14,2,1,"","copy"],[14,1,1,"","in_dim"],[14,2,1,"","initialize"],[14,1,1,"","out_dim"],[14,1,1,"","out_node"],[14,1,1,"","out_position"]],"tensorkrowch.models.PEPS":[[14,1,1,"","bond_dim"],[14,1,1,"","boundary"],[14,2,1,"","contract"],[14,1,1,"","in_dim"],[14,2,1,"","initialize"],[14,1,1,"","n_batches"],[14,1,1,"","n_cols"],[14,1,1,"","n_rows"],[14,2,1,"","set_data_nodes"]],"tensorkrowch.models.Tree":[[14,1,1,"","bond_dim"],[14,2,1,"","canonicalize"],[14,2,1,"","contract"],[14,2,1,"","initialize"],[14,1,1,"","n_batches"],[14,2,1,"","set_data_nodes"],[14,1,1,"","sites_per_layer"]],"tensorkrowch.models.UMPO":[[14,2,1,"","copy"],[14,2,1,"","initialize"],[14,2,1,"","parameterize"]],"tensorkrowch.models.UMPS":[[14,2,1,"","copy"],[14,2,1,"","initialize"],[14,2,1,"","parameterize"]],"tensorkrowch.models.UMPSLayer":[[14,2,1,"","copy"],[14,1,1,"","in_dim"],[14,2,1,"","initialize"],[14,1,1,"","out_dim"],[14,1,1,"","out_node"],[14,1,1,"","out_position"],[14,2,1,"","parameterize"]],"tensorkrowch.models.UPEPS":[[14,1,1,"","bond_dim"],[14,2,1,"","contract"],[14,1,1,"","in_dim"],[14,2,1,"","initialize"],[14,1,1,"","n_batches"],[14,1,1,"","n_cols"],[14,1,1,"","n_rows"],[14,2,1,"","set_data_nodes"]],"tensorkrowch.models.UTree":[[14,1,1,"","bond_dim"],[14,2,1,"","contract"],[14,2,1,"","initialize"],[14,1,1,"","n_batches"],[14,2,1,"","set_data_nodes"],[14,1,1,"","sites_per_layer"]],tensorkrowch:[[1,0,1,"","AbstractNode"],[1,0,1,"","Axis"],[1,0,1,"","Edge"],[1,0,1,"","Node"],[15,0,1,"","Operation"],[1,0,1,"","ParamNode"],[1,0,1,"","ParamStackNode"],[1,0,1,"","StackEdge"],[1,0,1,"","StackNode"],[1,0,1,"","Successor"],[1,0,1,"","TensorNetwork"],[15,3,1,"","add"],[15,3,1,"","connect"],[15,3,1,"","connect_stack"],[15,3,1,"","contract"],[15,3,1,"","contract_"],[15,3,1,"","contract_between"],[15,3,1,"","contract_between_"],[15,3,1,"","contract_edges"],[12,3,1,"","copy"],[15,3,1,"","disconnect"],[15,3,1,"","div"],[15,3,1,"","einsum"],[12,3,1,"","empty"],[15,3,1,"","mul"],[12,3,1,"","ones"],[15,3,1,"","permute"],[15,3,1,"","permute_"],[15,3,1,"","qr"],[15,3,1,"","qr_"],[12,3,1,"","rand"],[12,3,1,"","randn"],[15,3,1,"","renormalize"],[15,3,1,"","rq"],[15,3,1,"","rq_"],[15,3,1,"","split"],[15,3,1,"","split_"],[15,3,1,"","stack"],[15,3,1,"","stacked_einsum"],[15,3,1,"","sub"],[15,3,1,"","svd"],[15,3,1,"","svd_"],[15,3,1,"","svdr"],[15,3,1,"","svdr_"],[15,3,1,"","tprod"],[15,3,1,"","unbind"],[12,3,1,"","zeros"]]},objnames:{"0":["py","class","Python class"],"1":["py","property","Python property"],"2":["py","method","Python method"],"3":["py","function","Python function"]},objtypes:{"0":"py:class","1":"py:property","2":"py:method","3":"py:function"},terms:{"0":[1,3,4,6,7,8,9,10,11,14,15,17,19,21,22,23],"00":[4,7],"0000":4,"0000e":4,"0086":1,"01":[7,10],"0101":1,"0188":1,"02":7,"0234":1,"03":[9,10],"0371":1,"04":[7,9],"0412":1,"0440":1,"0445":1,"0465":1,"05":7,"0501":1,"0521":1,"06":[7,9],"0633":1,"0639":17,"07":[7,9],"0704":1,"0728":17,"0743":1,"0750":17,"08":[4,9],"0806":1,"0820":17,"08595":11,"09":[7,10,14],"0913":17,"0983":17,"0998":17,"1":[1,3,4,6,7,8,9,10,11,14,15,23],"10":[1,4,6,7,8,9,10,11,14,15,17,19,22,23],"100":[1,4,6,7,8,9,10,11,14,15,18,19,20,21],"10000":[17,23],"101":7,"1024":[17,23],"104":7,"106":7,"108":7,"1091":1,"11":[6,7,8,9,10],"110":7,"1123":17,"113":7,"115":7,"117":7,"119":7,"12":[6,7,9,10],"1211":1,"122":7,"124":7,"126":7,"128":7,"13":[6,7,9],"1308":17,"131":7,"133":7,"135":7,"137":7,"1371":1,"14":[6,7,8,9,10,23],"140":7,"142":7,"144":7,"146":7,"149":7,"1496":1,"15":[1,6,7,8,9,10,15,19],"151":7,"153":7,"155":7,"1573":17,"158":7,"159674":10,"159962":10,"16":[6,7,8,9,10],"160":7,"161204":17,"162":7,"164":7,"16406":9,"1654":1,"167":7,"169":7,"17":[6,7,9,10],"171":7,"173":7,"176":7,"178":7,"18":[6,7,10],"180":7,"182":7,"185":7,"187":7,"1878":23,"189":7,"19":[7,9,10],"191":7,"194":7,"1955":17,"196":7,"198":7,"1990":17,"1998":1,"1e":[6,7,8,9,10,14,17,22,23],"2":[1,4,6,7,8,9,10,14,15,23],"20":[1,7,10,14,15,23],"200":7,"203":7,"205":7,"2052":23,"207":7,"209":7,"2091":1,"2095":1,"21":[7,10],"2111":1,"212":7,"214":7,"216":7,"218":7,"22":[6,7,10],"2203":23,"221":7,"223":7,"2254":1,"23":[7,10],"2306":11,"2316":1,"2357":23,"236220":[10,17],"2380":1,"2390":1,"24":[7,8],"2449":1,"2461":1,"2477":1,"25":[7,8],"2503":1,"2517":1,"26":7,"2618":23,"27":[7,8],"2730":1,"2775":1,"27944":9,"2799":1,"28":[6,7,8,9,10,17,23],"2808":1,"2840":23,"2856":1,"2866":1,"2898":1,"29":[7,8],"2d":14,"2f":[6,7,8,9,10],"3":[1,4,6,7,8,9,10,11,14,15,21,23],"30":[7,9,23],"3083":17,"3088":1,"31":7,"3139":1,"3149":23,"32":[7,14,17],"3222":1,"33":[6,7,9],"3340":1,"3370":1,"3371":1,"3381":1,"3393":1,"34":7,"3427":1,"3489":1,"35":[6,7,9],"3508":1,"3513":1,"3585":1,"36":7,"37":[7,8],"3711e":4,"3714":23,"3760":1,"3784":1,"38":[6,7,8],"3821":1,"39":[6,7,8,9,10],"39760":9,"4":[1,4,6,7,8,9,10,14,15,19,21,23],"40":[6,7,10,23],"4005":1,"41":7,"4181":1,"4184":1,"42":[7,8],"4216":1,"43":7,"4383":1,"4385":1,"44":7,"4402":1,"4431":1,"4461":1,"45":[6,7,8,9],"4572":1,"4588":1,"46":7,"462803":6,"47":7,"4731":1,"4761":1,"48":7,"49":[7,8],"4974":1,"499320":23,"4f":[17,23],"5":[1,4,6,7,8,9,10,11,14,15,18,19,20,21,23],"50":[6,7,9,23],"500":[11,17,22,23],"5000":4,"5021":1,"5029":1,"5069":1,"51":7,"5161":1,"52":[7,8,9,10],"5224":23,"53":7,"54":7,"5401":1,"5406":1,"55":[6,7,10],"553036":6,"553186":23,"5567":1,"5570":1,"56":[7,9],"5676":17,"57":[7,9,10],"5731":1,"5760":1,"5797":1,"58":[7,10],"59":[7,8],"5920":1,"6":[1,4,6,7,8,9,10,14,23],"60":[7,23],"60000":[17,23],"6023":1,"61":[6,7],"6149":17,"61999999999999":9,"62":[7,8,9],"6225":1,"6227":1,"6295":1,"63":7,"6356":1,"6399":1,"64":[6,7,8,9,10],"6492":1,"6495":1,"65":[7,8,10],"6524":1,"6545":1,"6551":1,"66":7,"67":[7,10],"68":7,"6811":1,"69":[7,8,9,10],"6925":1,"6982":1,"7":[1,6,7,8,9,10,11,14,15,19,20,23],"70":[7,8,9,23],"71":7,"72":[7,10],"73":[7,9],"74":[7,10],"75":[4,7],"7500":4,"7592":1,"76":[7,10],"7688":1,"77":7,"7752":1,"78":7,"7812":1,"79":[6,7,10],"7997":1,"8":[6,7,8,9,10,11,14,17],"80":[6,7,23],"8090":1,"81":[6,7,8,9],"8147":1,"82":7,"8227":1,"83":[6,7,9,10],"8361":1,"8387":1,"84":[6,7,8,9,10],"8441":1,"8442":1,"85":[6,7,9],"8502":23,"86":[6,7,9],"8627":23,"8633":1,"8649":1,"87":[6,7,9],"8795":23,"88":[6,7,9],"8815":1,"8820":17,"8848":23,"8851":23,"8859":1,"89":[6,7,9],"8901":23,"8911":1,"8915":23,"8948":23,"8968":23,"8984":23,"9":[6,7,8,9,10,11,14,17,22,23],"90":[7,9,23],"9006":1,"9009":23,"9011":[17,23],"9026":23,"9048":23,"9053":17,"91":[7,10],"9125":23,"9145":1,"9174":23,"92":[7,10],"9231":23,"9265":1,"9284":23,"93":[7,10],"9320":1,"9371":17,"9396":17,"94":[7,9],"9400":17,"9432":1,"95":[6,7,8,9,10],"9509":17,"9526":17,"9551":1,"9561":1,"9585":17,"96":[7,8,9,10],"9600":17,"9618":1,"9621":17,"9625":17,"9668":17,"9677":17,"9696":17,"97":[7,8,10],"9700":17,"9721":17,"9729":17,"9731":17,"9734":17,"9736":17,"9738":17,"9743":17,"9768":17,"9775":17,"9793":17,"98":[6,7,8,10,23],"9844":1,"99":[6,7,17],"9925":1,"9942":1,"9957":1,"abstract":1,"boolean":[1,12,14],"break":[7,8],"byte":[17,23],"case":[1,3,11,14,20,21,22],"class":[0,1,6,7,8,9,14,17,19,22,23],"default":[1,4,14,20,21],"do":[1,14,17,18,20,21,22],"final":[1,3,14,19,22],"float":[1,3,6,7,8,9,10,14,15],"function":[1,14,15,19,23],"garc\u00eda":11,"import":[1,6,7,8,9,10,11,18,19,20,21,22,23],"int":[1,3,4,10,12,14,15],"n\u00ba":[17,23],"new":[1,4,14,15,17,18,19,20,22,23],"p\u00e9rez":11,"return":[1,3,4,6,7,8,9,10,12,14,15,17,18,19,20,22,23],"super":[1,6,7,8,9,22,23],"true":[1,6,7,8,9,10,11,12,14,15,17,19,20,21,22,23],"try":[10,19,23],"while":[1,7,8,11,19,20,21],A:[1,11,14,15,18],And:[20,23],As:[11,14,17,18,19,20],At:[1,18],Be:[1,19],But:[19,20,22,23],By:[1,4,11,14,17,18],For:[1,14,15,18,19,20,21,22],If:[1,3,4,11,14,15,18,20,22],In:[1,3,8,11,14,15,17,18,19,20,21,22,23],Is:14,It:[1,3,11,14,15,17,18,19,23],Its:[1,15],Not:22,Of:[20,22],On:1,One:[1,10,18],That:[1,3,4,14,15,19,20,22,23],The:[1,3,4,11,14,15,16,18,19,20,23],Then:[1,14,20],There:[1,14,19,21,22],These:[1,3,11,14,18,19,21],To:[1,3,4,11,13,14,15,17,18,19,20,21,22],With:[1,10,11,15,18,19,22],_:[1,6,7,8,9,10,14,15,17,18,22,23],__call__:1,__init__:[1,6,7,8,9,22,23],_channel:14,_copi:1,_dim:1,_mats_env:[7,8],_percentag:[1,3,14,15],_size:14,_size_0:14,_size_1:14,_size_:1,a_:15,abil:11,abl:[1,11,18,19,22],about:[1,15,18,19,20,21,22],abov:[1,18,22],abstractnod:[0,12,15],acc:[6,7,8,9,10,17,23],acceler:[1,9,10],accept:19,access:[1,18,19,20],accomplish:[1,3,14,21],accord:[1,15],accordingli:14,account:[1,14,21],accross:[1,15],accumul:[3,14],accuraci:[6,7,8,9,10,17,23],achiev:1,act:[1,14,18,20],action:1,activ:1,actual:[1,14,18,19,20,23],ad:[1,4,14,15,19,22],adam:[6,7,8,9,10,17,23],adapt:[11,15],add:[0,1,14,17,19,22,23],add_data:[1,9,14,21,22],add_on:[0,23],addit:[1,11,14,15],addition:1,address:[1,18,20],admit:[14,15],advanc:[1,11,16],advantag:[8,20,22],advis:11,affect:[1,15],after:[1,3,8,14,17,23],afterward:[1,14,15],again:[8,10,14,17,20,22],against:14,aim:[3,14,17],alejandro:11,algorithm:[1,14,20,22,23],all:[1,3,4,8,10,14,15,17,18,19,20,21,22,23],allow:[1,11,14],almost:[1,19,20,21,23],along:[1,15],alreadi:[1,7,14,15,17,18,19,22],also:[1,3,8,11,13,14,15,17,18,19,20,21,22],alter:14,although:[1,10,18,19,20,21,22],alwai:[1,11,14,15,17,18,19,20,21,22],among:[3,14],amount:[15,17],an:[1,3,4,6,9,10,11,12,14,15,17,18,19,20,21,22],ancillari:[1,20,21],ani:[1,7,8,14,15,18,19,22],anomali:11,anoth:[1,14,15,18,19],antialia:[7,8,9,10],anymor:1,api:2,appear:[1,15,18],append:[6,7,8,19,20,21,22,23],appli:[1,11,14,15,19],approach:[8,10,11],appropi:[14,15,22,23],approxim:1,ar:[1,3,4,8,11,13,14,15,17,18,19,21,22,23],arang:[4,7,8],arbitrari:1,architectur:11,archiveprefix:11,arg:[1,6,7,8,9,12,14],argument:[1,3,12,14,15,22],aros:1,around:17,arrai:18,arrow:15,arxiv:11,ascertain:11,assert:[1,11,14,15,18,19,20,21],assign:14,assum:[1,4,14,15],attach:[1,15,18],attribut:[1,14,22],author:11,auto_stack:[1,15,17,20,21,22,23],auto_unbind:[1,15,17,20,22,23],automat:[1,15,18,19,20],auxiliari:15,avail:[11,17,18],avoid:[1,3,14,15,20],awar:[1,19],ax:[1,7,8,14,15,18,19],axes_nam:[1,7,8,11,15,18,19,20,21,22],axi:[0,4,7,8,15,18,22,23],axis1:1,axis2:1,axis_0:1,axis_1:1,axis_2:1,axis_n:1,b:[4,14,15,19],b_1:3,b_:15,b_m:3,back:1,backend:[6,7,8,9,10],backpropag:[17,23],backward:[1,6,7,8,9,10,11,17,19,23],bar:[7,8],base:[1,4,10,14,15,19],basi:[0,10,14],basic:[1,11,18,19],batch:[1,3,4,10,11,14,15,17,18,19,21,22],batch_0:[4,14],batch_1:[1,14,22],batch_idx:[6,7,8,9,10],batch_m:1,batch_n:[4,14,22],batch_siz:[6,7,8,9,10,14,17,23],becaus:[1,14,20,23],becom:[1,11,14,15],been:[1,14,15,18,22],befor:[1,6,7,8,9,10,14,17,18,22,23],beforehand:18,beggin:8,begin:[4,17,18,23],behav:[1,20],behavior:[3,14],behaviour:[1,14,15,18,20,21],being:[1,3,4,14,15,19],belong:[1,14,17,18,19],besid:[1,14,15,18],best:[10,11],better:18,between:[1,3,4,10,11,14,15,18,20,21,23],bia:9,big:[14,19],bigger:14,binom:4,blank:1,block:[7,8],block_:8,block_length:[7,8],block_nod:[7,8],block_posit:7,bmatrix:4,bodi:18,bond:[3,8,14],bond_dim:[6,7,8,9,10,11,14,17,23],bool:[1,3,12,14],border:14,both:[1,14,15,18,19,20,21,22],bottom:[1,14,23],boudari:14,bound:[1,3,14,15],boundari:[3,7,8,9,10,14],bracket:1,bridg:11,bring:17,build:[1,6,11,16,19],built:[11,17,19,22],bunch:[1,19,22],c_:15,cach:[1,20],calcul:20,call:[1,14,15,17,19,22,23],callabl:15,can:[1,3,4,6,7,8,9,10,11,13,14,15,17,18,19,20,21,22,23],cannot:[1,7,14,15,19,21],canon:[6,10,14,17,23],canonic:[6,9,10,14,17,23],canonicalize_univoc:14,carri:[1,14,15,18],cast:1,cat:[6,23],caus:14,cdot:[3,4,14],center:14,central:[1,18,23],certain:[1,4,10,11,15],chang:[1,6,10,11,14,15,18,20,22,23],change_s:1,change_typ:1,channel:14,charact:1,check:[1,6,7,8,9,10,14,15,17,18,19,20,21,23],check_accuraci:[6,7,8,9,10],check_first:15,child:1,choic:10,choos:10,chose:21,classif:[14,17],classifi:[17,22],clone:[11,13,14],close:14,cmap:[6,7,8,9,10],cnn:[6,23],cnn_snake:[6,23],cnn_snakesb:[6,23],co:4,code:[1,10,11,18,23],coincid:[14,15,18],collect:[1,11,15,19,20],column:14,com:[11,13],combin:[1,6,10,14,18,22,23],come:[1,15,17,18,21,22],comma:15,command:[11,13],common:[1,14,17,22],compar:20,complementari:14,complet:[1,15],compon:[0,4,11,15,17,19],compos:[7,8,9,10,17,23],comput:[1,3,4,11,13,14,15,17,19,20,22,23],concaten:4,concept:11,condit:[3,14,15],configur:[10,11],conform:1,connect:[0,1,9,11,14,18,19,20,21,22],connect_stack:0,consecut:[3,14],consid:[11,14],consist:[1,15],constraint:11,construct:[1,11,19,20],contain:[1,14,18,19,20,21],context:11,continu:[14,17],contract:[0,1,6,7,8,9,10,11,14,16,17,18,20,21,22],contract_:[0,1,19],contract_between:[0,1,19],contract_between_:[0,1,7,8,19],contract_edg:[0,1,19],contract_edges_ip:[1,15],contrast:[10,14],contrat:14,control:[1,18,20],conv2d:[6,14,23],conv_mp:14,conv_mps_lay:14,conv_pep:14,conv_tre:14,conveni:[14,21],convent:[1,15,19,22],converg:10,convmp:0,convmpslay:[0,6,23],convolut:[6,14,22,23],convpep:0,convtre:0,convump:0,convumpslay:0,convupep:0,convutre:0,copi:[0,1,14],core:[8,10,14,18,23],corner:14,correct:[1,7,8,9,10,20],correctli:15,correspond:[1,3,4,14,15,18,19,20,22],costli:[1,14,20],could:[14,17,18,20,22],count:17,coupl:[1,18,21],cours:[20,22],cpu:[1,6,7,8,9,10,17,22,23],creat:[1,6,7,11,14,15,16,19,20,21,22],creation:[11,15],criterion:[6,7,8,9,10],crop:[1,14],crossentropyloss:[6,7,8,9,10,17,23],cuda:[1,6,7,8,9,10,17,22,23],cum:[1,3,14,15],cum_percentag:[1,3,6,7,8,9,10,14,15,17,23],current:[1,14],custom:[1,11,14,16],cut:[3,17,23],cutoff:[1,3,14,15],d:[4,11],d_1:3,d_n:3,dagger:[1,15],dangl:[1,15,17,18,19],data:[1,4,6,7,8,9,10,11,14,15,19,21,22,23],data_0:[1,21],data_1:1,data_nod:[1,7,8,19,21,22],data_node_:19,dataload:[6,7,8,9,10,17,23],dataset:[14,17,23],dataset_nam:[6,7,8,9,10],david:[4,11],ddot:4,de:[1,14,19],decompos:[3,15],decomposit:[0,1,9,14,15,17,19,23],decreas:1,dedic:14,deep:[11,17],deepcopi:1,def:[1,6,7,8,9,10,17,22,23],defin:[1,4,11,14,18,19,21,22,23],degre:[4,8,10],del:[1,15],delet:[1,15],delete_nod:1,demonstr:11,densiti:14,depend:[1,3,10],deriv:14,descent:[6,7,8,9,10,18,19],describ:[1,9,14,22],design:14,desir:[4,8,19,20,21,22],detach:9,detail:[1,11,14,19],determin:11,develop:11,devic:[1,6,7,8,9,10,14,17,22,23],devot:20,df:1,diagon:[1,12,15],diagram:18,dictionari:1,did:23,differ:[1,5,6,11,14,15,16,17,18,19,20,22,23],differenti:[11,16,18],dilat:14,dim:[4,6,7,10,17,23],dimens:[1,3,4,8,14,15,17,18,22],dimension:[18,23],direct:7,directli:[1,11,13,15,18,19,20,21],disconnect:[0,1,14,18],discret:[0,10,14],distinct:1,distinguish:21,distribut:[3,12,14],div:[0,19],divers:11,divid:[1,15],divis:15,divisor:15,dmrg:[5,10],document:[1,15],doe:[1,14,18,20],don:15,done:[1,3,14,18],down:14,down_bord:14,download:[6,7,8,9,10,11,13,23],drawn:12,drop_last:[17,23],dtype:1,due:14,duplic:14,dure:[1,8,17,20,21],dynam:14,e:[1,4,11,14,15,21],each:[1,3,4,8,14,15,17,18,19,20,21,22,23],earlier:18,easi:[1,11],easier:18,easili:[1,18,19,22,23],edg:[0,11,14,17,18,19,20,21,22,23],edge1:[1,15],edge2:[1,15],edgea:1,edgeb:1,edges_dict:1,effect:[1,19],effici:[1,11,18],einstein:19,einsum:[0,19],either:[14,15],element:[1,4,11,12,14,15,18],element_s:[17,23],elif:[6,7,8,9,10],els:[6,7,8,9,10,17,22,23],emb:[4,17,22],emb_a:4,emb_b:4,embed:[0,6,7,8,10,14,17,22,23],embedd:4,embedding_dim:[7,8,10],embedding_matric:14,empti:[0,1,14,18,19,20],enabl:[1,11,14,18,19,20],end:[1,4,8,15],engin:18,enhanc:11,enough:[1,14],ensur:[1,11],entail:[1,20],entangl:14,entir:1,entropi:14,enumer:[1,6,7,8,9,10,14],environ:14,epoch:[1,6,7,8,9,10,17,22,23],epoch_num:[17,23],eprint:11,equal:[1,7,14,22],equilibrium:17,equival:[1,4,14,18,23],error:[11,14],essenti:[1,11],etc:[1,15,18,22],eval:[6,7,8,9,10],evalu:19,even:[1,3,8,11,14,18,20,22],evenli:[3,14],everi:[1,15,18,20,23],exact:1,exactli:1,exampl:[1,2,4,6,9,14,15,17,19,21,22],exce:7,exceed:14,excel:11,except:[12,14],exclud:[1,21],execut:15,exist:[1,14,15,19],exp:14,expand:[1,4,22],expect:[3,14],experi:[1,11,18,20],experiment:11,explain:[1,18,19,20],explan:[1,14,15],explicitli:[1,15,21,22],explod:[3,14],explor:[11,18],express:15,extend:1,extra:[3,14,15],extract:[3,14,18],extractor:23,ey:22,eye_tensor:22,f:[6,7,8,9,10,17,18,19,20,21,23],facilit:[1,11,15,18],fact:[1,21,22],factor:[3,14],fail:[14,15],failur:11,fals:[1,3,6,7,8,9,10,12,14,15,17,19,20,22,23],familiar:[11,18],fashion:[8,19],fashion_mnist:[6,9],fashionmnist:[6,9,23],faster:[1,8,22],fastest:11,fc1:9,fc2:9,featur:[1,4,14,15,18,19,20,21,23],feature_dim:[1,22],feature_s:14,fed:23,feed:9,few:[8,11],fffc:9,file:11,fill:[1,12,18,19,22],find:11,finish:[18,22],finit:14,first:[1,4,10,11,14,15,16,18,19,20,21,23],fix:[1,18,19],flat:14,flatten:14,flavour:1,flip:[6,23],flips_x:6,fn_first:15,fn_next:15,folder:[11,13],follow:[1,11,13,14,15],forget:1,form:[1,14,17,18,19,21,23],former:[1,14,15],forward:[1,6,7,8,9,10,14,15,22,23],four:22,frac:[1,3,4,14,15],framework:11,free:14,friendli:11,from:[1,3,6,7,8,9,10,11,12,13,14,15,17,18,19,21,22,23],from_sid:14,from_siz:14,full:17,fulli:[9,11],func:[1,14],functool:23,fundament:11,further:[1,11],furthermor:[1,20,22],futur:[1,20],g:[1,14,15,21],gain:11,gap:11,garc:11,gaussian:14,ge:[1,3,14,15],gener:[1,20],get:[1,6,7,8,9,10,17,18,22,23],get_axi:[1,7,8,18],get_axis_num:[1,18],get_edg:1,git:[11,13],github:[11,13],give:[1,18,20,21],given:[1,4,6,14],glimps:17,go:[1,15,17,19,20,23],goal:11,goe:14,good:[1,6,7,8,9,10,17],gpc20:6,gpu:[17,22],grad:[1,11,19],gradient:[1,6,7,8,9,10,11,14,18,19],graph:[1,18,20,22],grasp:11,greater:[1,7,22],greatli:11,grei:[6,7,8,9,10],grid:14,grid_env:14,group:15,gt:[6,7,8,9,10],guid:11,ha:[1,3,8,14,15,17,18,20,21,22,23],had:[1,15,20],hand:[1,11,14,22],happen:[1,3,14,20,23],har:11,hardwar:11,hat:4,have:[1,3,4,14,15,17,18,19,20,21,22,23],heavi:22,height:[14,17,22],help:[1,20],henc:[1,15,17,18,19,20,22],here:[1,7,8,10,14,19],hidden:[1,21],high:[1,4,6,7,8,9,10,12],highli:11,hint:1,hold:[19,21],hood:20,horizont:14,how:[1,6,7,8,9,10,11,14,15,16,17,19,21,23],howev:[1,11,14,15,18,19,20],http:[11,13],hundread:19,hybrid:[5,11,16],hyperparamet:[6,7,8,9,10],i:[1,3,6,7,8,11,14,15,18,19,20,21,22],i_1:12,i_n:12,ideal:11,ident:14,identif:11,idx:18,ignor:[6,10],ijb:[15,19],ijk:15,im:15,imag:[6,14,17,22,23],image_s:[6,7,8,9,10,17,22,23],immers:11,implement:[1,11,17,23],improv:17,imshow:[6,7,8,9,10],in_1:3,in_channel:[6,14,23],in_dim:[7,8,10,11,14,17],in_env:14,in_featur:14,in_n:3,in_region:14,in_which_axi:1,includ:[1,11,14,18],incorpor:11,inde:[1,14],independ:[1,15],index:[1,6,7,8,9,10,18,20],indic:[1,3,12,14,15,18,19,20,21],infer:[1,14,15,18,20,22],inform:[1,11,14,15,18,19,20],ingredi:[1,18],inherit:[1,14,15,21],inic:22,init:19,init_method:[1,6,7,8,10,14,17,18,19,23],initi:[0,1,7,8,9,10,14,17,18,19,22,23],inlin:14,inline_input:[6,9,10,14],inline_mat:[6,9,10,14],inner:1,input:[1,3,7,8,14,15,17,18,19,20,21,22,23],input_edg:[1,21,22],input_nod:22,input_s:[6,7,8,9,10],insid:[1,11,13],insight:19,instal:[2,17,18],instanc:[1,15,20,21,22],instanti:[1,3,14,18,20,21,22],instati:18,instead:[1,14,19,20,21,22,23],integ:4,integr:11,intend:[1,14],interior:14,intermedi:[1,19,21,22],intern:[14,15],intric:11,intricaci:11,introduc:[6,14],introduct:11,invari:[1,14,20,21],inverse_memori:1,involv:[1,15,20],is_attached_to:1,is_avail:[6,7,8,9,10,17,22,23],is_batch:[1,18],is_connected_to:1,is_dangl:[1,18],is_data:[1,21],is_leaf:[1,21],is_node1:1,is_result:[1,21],is_virtu:[1,21],isinst:[1,19],isn:[17,18],isometri:14,issu:1,item:[6,7,8,9,10,17,23],iter:[1,8,14,20],its:[1,11,12,14,15,18,20,22,23],itself:[1,14,22],itselv:14,j:[1,4,8,11,15],jkb:[15,19],jl:15,jo:11,joserapa98:[11,13],just:[1,11,14,18,20,21,22,23],k:[11,15],keep:[1,3,14,15,20],keepdim:1,kei:[1,10,11,18],kept:[1,3,14,15],kernel:14,kernel_s:[6,14,23],kerstjen:11,keyword:[1,12,14],kib:[15,19],kind:[1,17],klm:15,know:[1,18,19,20],known:22,kwarg:[1,6,7,8,9,12,14],l2_reg:[17,23],l:[4,15],label:[14,17,21,23],lambda:[17,23],larger:1,largest:1,last:[1,7,14,15,22,23],later:22,latter:[1,14],layer:[1,6,11,14,17,22,23],ldot:12,lead:[1,15,21],leaf:[1,15,21,22],leaf_nod:[1,21],learn:[1,8,11,15,17,18,19,20,21,22,23],learn_rat:[17,23],learnabl:19,learning_r:[6,7,8,9,10],least:[1,14,15,17,20,23],leav:[8,14,20],left1:19,left2:19,left:[1,7,8,11,14,15,18,19,20,21,22,23],left_bord:14,left_down_corn:14,left_nod:[7,8,14],left_up_corn:14,leg:1,len:[6,7,8,9,10,15,22],length:[1,14],let:[17,18,19,20,22,23],level:[1,4,10,18],leverag:18,lfloor:4,li:[1,11,18],librari:[11,18,23],like:[0,1,5,10,11,14,17,18,19,20,21,22,23],line:[11,14,23],linear:[9,11,22],link:1,list:[1,3,12,14,15,18,19,22],load:[6,7,8,9,10,17,22],load_state_dict:[9,10,22],loader:[6,7,8,9,10,17,23],local:[4,14],locat:[1,14],log_norm:14,log_scal:14,logarithm:[3,14],logarithmoc:14,logit:[17,23],longer:[1,20],look:[1,10],loop:[17,22],lose:17,loss:[6,7,8,9,10,23],loss_fun:[17,23],lot:[1,17],low:[1,4,6,7,8,9,10,12,14],lower:[1,3,14,15],lr:[6,7,8,9,10,17,23],lst_y:6,lt:10,lvert:4,m:[1,3,11,13,15],machin:[11,17],made:[1,15],mai:[1,3,10,11,14],main:[1,18,19,20,22],mainli:1,maintain:1,make:[1,8,18,19,20,21],make_tensor:[1,14],manag:[1,22],mandatori:[1,15],mani:[1,8,14,17,18,20,23],manipul:18,manual:[1,14,22],manual_se:[17,23],map:4,margin:14,marginalize_output:14,master:[11,13],mat:3,mat_to_mpo:[0,9],match:[1,10,14,15],matplotlib:[6,7,8,9,10],matric:[14,15,19,22],matrix:[1,3,4,9,11,14,15,17,18,20,22],mats_env:[7,8,14],mats_env_:[7,8],max:[6,7,8,9,10,17,23],max_bond:14,maximum:[4,14],maxpool2d:[6,23],mayb:15,mb:[17,23],mean:[1,12,14],megabyt:[17,23],mehtod:18,member:[1,14],memori:[1,11,16,17,18,21,22,23],mention:[14,22],merg:[7,8],merge_block:7,messag:11,method:[1,14,15,18,19,20,21,22],middl:14,middle_sit:14,might:[1,14,20,21,22],mile:4,mimic:22,minuend:15,misc:11,miscellan:[17,23],mit:11,mkdir:[6,7,8,9,10],mnist:[7,8,10,17],mod:4,mode:[1,6,14,15,17,21,22,23],model:[0,1,5,9,11,16,18,19,20,21],model_nam:[6,7,8,9,10],modif:1,modifi:[1,14,19],modul:[1,6,9,11,13,14,17,18,19,22,23],modulelist:[6,23],monomi:4,monturiol:11,mooth:11,more:[1,3,11,14,15,18,19,20,21],most:[1,11,18,21],move:[1,14,18],move_block_epoch:[7,8],move_nam:1,move_to_network:[1,15],movec:15,mp:[0,3,5,6,9,11,17,18,19,20,21,22,23],mpo:[0,3,9,22],mpo_tensor:9,mps_data:[9,14],mps_dmrg:7,mps_dmrg_hybrid:8,mps_hdmrg:8,mps_layer:[6,14],mps_tensor:9,mpsdata:[0,3,9],mpslayer:[0,7,8,10,11,17,22],mpss:6,much:[1,8,20,21,22,23],mul:[0,19],multi:18,multipl:[14,18,20],multipli:[14,15],must:[1,3,15,18,22],my_model:11,my_nod:[1,20],my_paramnod:1,my_stack:1,mybatch:1,n:[1,4,6,9,10,11,12,14,17,23],n_:[1,4],n_batch:[3,9,14],n_block:8,n_col:14,n_epoch:22,n_featur:[7,8,9,10,11,14,17,22],n_param:[6,9,10,17,23],n_row:14,name:[1,7,8,11,15,17,18,19,20,22,23],name_:1,necessari:[1,14,15,17,18,22,23],need:[1,11,14,15,17,18,19,20,22],neighbour:[1,7,8,14,19],nelement:[17,23],net2:1,net:[1,11,15,18,19,20,21],network:[0,5,7,8,10,11,14,15,16,20,21,22],neumann:14,neural:[5,11,14,16,17],never:[1,15,21],nevertheless:11,new_bond_dim:10,new_edg:[1,15],new_edgea:1,new_edgeb:1,new_mp:22,new_nodea:[1,15],new_nodeb:[1,15],new_tensor:20,next:[1,14,15,18,19,20,21],nn:[1,6,7,8,9,10,11,14,17,18,19,22,23],no_grad:[6,7,8,9,10,17,23],node1:[1,11,15,18,19,20,21],node1_ax:[1,7,8,15],node1_list:1,node1_lists_dict:1,node2:[1,11,15,18,19,20,21],node2_ax:[1,7,8,15],node3:[19,20],node:[0,3,7,8,11,12,14,16,17,20,22,23],node_0:1,node_1:1,node_:[18,19,20,21],node_left:[1,15],node_n:1,node_ref:1,node_right:[1,15],nodea:[1,15],nodeb:[1,15],nodec:[1,15],nodes_list:15,nodes_nam:1,nodesa:15,nodesb:15,nodesc:15,non:[1,14,15,19,22],none:[1,3,7,8,11,14,15,19,22],norm:[1,3,14,15],normal:[1,3,12,14,15],notabl:11,notat:18,note:[1,11,15,18,19,22],noth:[1,18,20],now:[1,18,19,20,22,23],npov15:9,nto16:10,nu_batch:14,num:1,num_batch:[17,23],num_batch_edg:[1,21,22],num_class:[6,7,8,9,10],num_correct:[6,7,8,9,10],num_epoch:[6,7,8,9,10,17,23],num_epochs_canon:17,num_sampl:[6,7,8,9,10],num_test:[17,23],num_train:[17,23],number:[1,3,14,15,17,19,22,23],numel:[1,6,9,10],numer:15,nummber:1,o:11,obc:[3,7,8,9,10,14],object:[1,18,23],obtain:[14,17],oc:14,occur:[1,14,20],occurr:11,off:[17,20,23],offer:11,often:[1,20],onc:[1,8,11,14,15,20],one:[1,3,4,6,7,9,10,14,15,17,18,19,20,21,22,23],ones:[0,1,4,6,14,18,19,21,23],ones_lik:[6,17,23],onli:[1,11,14,15,18,19,20,21,22],open:14,oper:[0,1,14,18,21,22],operand:[1,18,19],opposit:14,opt_einsum:[11,15,19],optim:[1,6,7,8,9,10,11,14,23],option:[1,3,4,6,10,11,14,15,18,22],order:[1,3,6,14,15,18,19,20,21,22],orient:14,origin:[1,4,14,15,17,21,23],orthogon:14,ot:14,other:[1,8,14,15,18,19,20,21,22,23],other_left:18,other_nod:20,otherwis:[1,14,15,23],otim:4,our:[6,7,8,9,10,17,18,19,20,23],out:[1,14,15,22],out_1:3,out_channel:[6,14,23],out_dim:[7,8,10,11,14,17],out_env:14,out_featur:14,out_n:3,out_nod:[7,8,14],out_posit:14,out_region:14,outdat:14,output:[1,3,4,6,7,8,14,15,17,22],output_dim:[6,7,8,10],output_nod:22,outsid:[11,13],over:[1,15,19],overcom:1,overhead:20,overload:1,overrid:[1,7,14,22],override_edg:1,override_nod:1,overriden:[1,19,22],own:[1,14,15,20,21],ownership:1,p:[1,6,9,10,11,15,17,23],packag:[11,13],pad:[6,14,23],pair:[1,8,14,23],pairwis:14,paper:[4,11,14,23],parallel:[1,14],param:[1,15,17,23],param_nod:[1,11,12,19,21],paramedg:1,paramet:[1,3,4,6,7,8,9,10,12,14,15,17,19,22,23],parameter:[1,7,8,14,19],parametr:[1,14,17,19,22,23],paramnod:[0,12,14,15,20,21,22],paramnode1:19,paramnode2:19,paramnode3:19,paramnodea:1,paramnodeb:1,paramstacknod:[0,15,20,21],pareja2023tensorkrowch:11,pareja:11,parent:[1,22],parenthesi:1,part:[1,14,19,21,22],partial:[14,23],partial_dens:14,particular:[1,22],pass:[14,17,22],patch:[14,22],pattern:23,pave:17,pbc:14,pep:[0,11,22],perform:[1,10,11,14,15,17,18,19,20,22,23],period:14,permut:[0,1,9,19,20],permute_:[0,1,19],persist:11,phase:15,phi:4,phys_dim:[9,14],physic:[3,14,18],pi:4,piec:[18,22],pip:[11,13,17,18],pipelin:[11,17],pixel:[14,17,22,23],place:[1,14,15,19,20,22],plai:21,pleas:11,plt:[6,7,8,9,10],plu:14,plug:14,point:[1,17],poli:[0,8,10,22],pool:[6,23],posit:[7,14,22],possibl:[1,6,7,8,9,10,14,17,18,19,20],potenti:11,power:[4,14,17],poza:11,practic:[1,11],practition:17,pre:9,precis:4,pred:[17,23],predict:[6,7,8,9,10,17,23],present:23,previou:[1,14,19,20,21,22,23],previous:19,primari:11,principl:[1,21],print:[1,6,7,8,9,10,14,15,17,23],probabl:17,problem:[1,20],process:[1,8,10,11,17],prod:6,product:[11,14,15,17,18,20,22],profici:11,project:14,properli:22,properti:[1,7,14,15,18],proport:[1,3,14,15],prove:14,provid:[1,3,11,14,15,18],prune:23,pt:[6,7,8,9,10,22],purpos:[1,18,20,21],put:[1,14,17,23],pyplot:[6,7,8,9,10],pytest:[11,13],python:[11,13,17],pytorch:[1,11,15,17,18,19,20,22,23],q:15,qr:[0,1,3,14,19],qr_:[0,1,14],quantiti:[1,3,14,15],quantum:18,qubit:14,quit:[11,23],r:[11,15],r_1:15,r_2:15,rais:[1,7],ram:11,rand:[0,1,4,6,10,14],randint:[4,6,7,8,9,10],randn:[0,1,4,6,10,11,14,15,18,19,20,21,22],randn_ey:[6,8,10,14,17,23],random:[14,15,19],random_ey:22,random_sampl:[6,7,8,9,10],rang:[1,6,7,8,9,10,11,14,15,17,18,19,20,21,22,23],rangl:4,rank:[1,3,4,7,8,14,15,19],rapid:11,rather:[1,14,15,18,20,21],re:[1,15,17,23],reach:17,readi:22,realli:[1,21],reamin:8,reattach:1,reattach_edg:1,recal:[1,22],recogn:19,recommend:[1,11,14],reconnect:[1,19],recov:[1,3,14],reduc:[1,14,15,17,23],redund:[1,15],refer:[1,2,10,15,18,19,20,21,22],referenc:1,regard:[1,15,19],regio:14,relat:18,relev:[1,18],reli:[11,15],relu:[6,9,11,23],remain:[8,14],remov:[1,14,15],renorm:[0,1,3,6,9,10,14,19],renorma:[1,15],repeat:[1,8,10,15],repeatedli:20,replac:1,repositori:[11,13],repres:[14,18],reproduc:[1,10,11,20],requir:[1,14,15,21],requires_grad:1,rerun:11,res1:19,res2:19,rescal:14,research:11,reserv:[1,15,20],reset:[1,6,7,8,9,10,14,15,20,21,22],reset_tensor_address:1,reshap:[3,7,8,9,10,15,20],resiz:[7,8,9,10,17,23],respect:[1,3,14,15,19,20],rest:[1,19],restrict:[1,15,21],result2:15,result:[1,3,7,8,9,10,11,14,15,19,20,21,22],result_mat:[7,8],resultant_nod:[1,21],retain:1,retriev:[1,18,20,21],reus:14,review:11,rez:11,rfloor:4,rho_a:14,rid:1,right1:19,right2:19,right:[1,7,8,11,14,15,18,19,20,21,22,23],right_bord:14,right_down_corn:14,right_nod:[7,8,14],right_up_corn:14,rightmost:14,ring:19,role:[1,14,21,22],root:[6,7,8,9,10],row:14,rowch:11,rq:[0,1],rq_:[0,1,14],run:[11,13,14,17,23],running_acc:17,running_test_acc:[17,23],running_train_acc:[17,23],running_train_loss:[17,23],s:[1,4,11,12,14,15,17,18,19,20,21,22,23],s_1:4,s_i:[1,3,14,15],s_j:4,s_n:4,sai:[1,20],same:[1,8,10,14,15,18,19,20,23],sampler:[17,23],satisfi:[1,3,14,15],save:[1,6,7,8,9,10,11,14,16,19,22],scalar:14,scale:[3,14],scenario:11,scheme:10,schmidt:14,schwab:4,score:[6,7,8,9,10,17,23],second:[1,14,15,20],secondli:22,section:[18,19,21,23],see:[1,6,7,8,9,10,11,14,15,21,23],seen:21,select:[1,15,18,19,22],self:[1,6,7,8,9,14,22,23],send:[17,22,23],sens:[17,21],sento:22,separ:[14,15],sepcifi:1,sequenc:[1,3,14,15,19,22],sequenti:[11,22],serv:[11,17],set:[1,7,8,14,15,20,21,22,23],set_data_nod:[1,7,8,9,14,21,22],set_param:[1,7,14],set_tensor:[1,14,20],set_tensor_from:[1,20,21,22],sever:[1,15],shall:[1,22],shape:[1,3,4,7,8,9,10,11,12,14,15,17,18,19,20,21,22],shape_all_nodes_layer_1:14,shape_all_nodes_layer_n:14,shape_node_1_layer_1:14,shape_node_1_layer_n:14,shape_node_i1_layer_1:14,shape_node_in_layer_n:14,share:[1,14,15,18,20,21],share_tensor:[1,14],should:[1,3,4,7,11,12,14,15,18,19,20,21,22],show:[6,7,8,9,10,18],showcas:11,shown:7,shuffl:[6,7,8,9,10],side:[1,7,8,14,15,23],similar:[1,14,15,18,19,21,22],simpl:[11,18,19],simpli:[1,18,20,22],simplifi:[1,11],simul:18,sin:4,sinc:[1,8,14,15,19,20,21,22,23],singl:[1,14,15,19,22],singular:[1,3,14,15,17,19,23],site:[7,14,18],sites_per_lay:14,situat:[1,15,21],size:[1,4,6,7,8,9,10,12,14,15,18,19,21,22,23],skip:1,skipp:20,slice:[1,15,20,21],slide:1,slower:[1,20],small:19,smaller:1,smooth:11,snake:[6,14,23],so:[1,14,15,20,22],some:[1,3,14,15,17,18,19,20,21,22],someth:18,sometim:1,sort:[1,14,18,20,21],sourc:[1,3,4,12,14,15],space:[1,17,22,23],special:[1,19,21],specif:[1,11,21],specifi:[1,3,14,15,18,19,21],split:[0,1,3,7,8,14,18,19],split_0:[1,15],split_1:[1,15],split_:[0,1,7,8,19],split_ip:[1,15],split_ip_0:[1,15],split_ip_1:[1,15],sqrt:4,squar:[14,15],squeez:[4,6,7,8,9,10],ss16:[7,10],stack:[0,1,4,6,14,17,19,20,21,22],stack_0:1,stack_1:1,stack_data:[1,15,22],stack_data_memori:[1,21],stack_data_nod:19,stack_input:22,stack_nod:[1,15,19,20,21],stack_result:[19,22],stackabl:15,stacked_einsum:[0,19],stackedg:[0,15,19],stacknod:[0,15,19,21],stai:1,stand:4,start:[1,14,18,20,22,23],state:[1,11,14,17,18,20,22],state_dict:[6,7,8,9,10,14,22],staticmethod:[6,23],statist:11,std:[1,6,8,10,12,14,17,22,23],stem:11,step:[1,6,7,8,9,10,11,16,23],stick:1,still:[1,14,15,19],store:[1,14,15,18,21,22],stoudenmir:4,str:[1,15],straightforward:11,strength:11,stride:[6,14,23],string:[1,14,15,21],structur:[1,11,14,18,22,23],sub:[0,19],subclass:[1,11,16,18,21,23],subsequ:[1,15,20],subsetrandomsampl:[17,23],substitut:1,subsystem:14,subtract:15,subtrahend:15,successfulli:10,successor:[0,15],suffix:1,suitabl:11,sum:[1,3,6,7,8,9,10,14,15,17,19,23],sum_:[1,3,14,15],summat:19,support:11,sv:[1,15],svd:[0,1,3,14,17],svd_:[0,1,14,19],svdr:[0,1,14],svdr_:[0,1,14],t:[14,15,17,18,21,22],t_:[12,15],tailor:11,take:[1,14,15,17,20,21,22],taken:[1,15],target:[6,7,8,9,10],task:[1,14,21],temporari:[1,21],tensor:[0,3,4,5,6,7,8,11,12,14,16,21,22],tensor_address:[1,14,20,21],tensorb:15,tensori:5,tensorkrowch:[1,3,4,6,7,8,9,10,12,13,14,15,16,19,21,22,23],tensornetwork:[1,11,15,16,19,21,23],termin:[11,13],test:[6,7,8,9,10,11,13,17,23],test_acc:[6,7,8,9,10],test_dataset:[6,7,8,9,10],test_load:[6,7,8,9,10],test_set:[17,23],texttt:14,th:14,than:[1,3,7,8,14,15,18,22],thank:18,thei:[1,11,13,14,15,18,19,21],them:[1,14,15,17,18,19,20,22,23],themselv:[14,15],therefor:[1,11,13,14,18,22],thi:[1,3,4,6,8,9,10,11,14,15,17,18,19,20,21,22,23],thing:[1,15,17,21,23],think:20,third:14,those:[1,20,21,22],though:[1,14,15,19,22],thought:1,three:[1,15],through:[1,11,14,15,17,22,23],thu:[1,3,8,11,14,15,18,22],time:[1,3,4,8,10,11,14,15,16,18,19,22],titl:11,tk:[1,4,6,7,8,9,10,11,14,15,17,18,19,20,21,22,23],tn1:9,tn:[9,22],tn_fffc:9,tn_linear:9,tn_model:9,tn_nn:9,togeth:[1,11,13,20,21],tool:[11,18,19],top:[11,14,17,19,23],torch:[1,3,4,6,7,8,9,10,11,12,14,15,17,18,19,20,21,22,23],torchvis:[6,7,8,9,10,17,23],total:[1,3,14,15,17,23],total_num:[17,23],totensor:[6,7,8,9,10,17,23],tprod:[0,19],trace:[1,6,7,8,9,10,14,15,17,21,22,23],trace_sit:14,track:[1,14,20],tradit:8,train:[1,5,11,14,18,19,20,22,23],train_acc:[6,7,8,9,10],train_dataset:[6,7,8,9,10],train_load:[6,7,8,9,10],train_set:[17,23],trainabl:[1,14,18,21,22,23],transform:[4,6,7,8,9,10,14,17,19,23],transit:14,translation:[1,14,20,21],transpos:[6,17,22,23],treat:1,tree:[0,22],tri:[1,15],triangular:15,trick:[20,23],tupl:[1,12,14,15],turn:[1,14,20],tutori:[1,2,17,18,19,20,21,22,23],two:[1,14,15,18,19,20],two_0:15,type:[1,3,4,6,7,8,9,10,11,12,14,15,16,18,19,20],typeerror:1,u:[1,12,15],ump:0,umpo:0,umpslay:0,unbind:[0,1,19,20,22],unbind_0:[1,15],unbind_result:19,unbinded_nod:[19,20],unbound:[1,15],under:[11,20],underli:20,underscor:[1,15],understand:[11,18],undesir:[1,3,14,15,21],unfold:14,uniform:[1,12,14,20,21,22],uniform_memori:22,uniform_nod:[20,21],uninform:17,uniqu:[14,20],unit:[0,6,7,10,14],unitari:[14,15],univoc:14,unix:[11,13],unless:1,unmerg:8,unmerge_block:7,unset:1,unset_data_nod:[1,14],unset_tensor:1,unsqueez:23,until:[1,10,14,15,17],up:[1,14,15,18],up_bord:14,updat:[8,14,17,23],update_bond_dim:[7,8,14],upep:0,upon:14,upper:[14,15],ur_1sr_2v:15,us:[1,3,4,7,11,14,15,17,18,19,20,21,22,23],usag:1,useless:17,user:[1,11],usual:[1,14,15,21,22],usv:15,util:[6,7,8,9,10,17,23],utre:0,v:[1,11,13,15],valid:1,valu:[1,3,4,14,15,17,19,22,23],valueerror:[1,7],vanilla:[18,19,20],vanish:14,vari:14,variabl:4,variant:[19,22],variat:1,variou:[11,14],vdot:4,vec:3,vec_to_mp:[0,9],vector:[3,4,14,17,22,23],veri:[1,17,18,20,22],verifi:[1,15],versa:14,versatil:11,version:[1,14,15,19],vertic:[1,14],via:[1,3,7,14,15,18,19,20,21],vice:14,view:[6,17,22,23],virtual:[1,15,20,21,22],virtual_nod:[1,21],virtual_result:[1,21],virtual_result_stack:[1,15,21],virtual_uniform:[1,14,21,22],virtual_uniform_mp:1,visit:1,von:14,wa:[1,6,14,22,23],wai:[1,5,8,14,17,18,22],want:[1,14,18,19,20,22],we:[1,6,7,8,10,11,17,18,19,20,21,22,23],weight:9,weight_decai:[6,7,8,9,10,17,23],well:[1,10,14,15],were:[1,14,15,19,21,22],what:[1,18,20,22],when:[1,14,15,17,18,19,20,21,22],whenev:[1,15],where:[1,4,8,14,15,17,18,19,20,22],whether:[1,3,12,14,18,20],which:[1,4,10,12,14,15,17,18,19,20,21,22],whilst:14,who:11,whole:[1,8,14,17,19,20,21,22],whose:[1,6,14,15,20,21],why:20,wide:[11,22],width:[14,17,22],wise:[1,15],wish:22,without:[1,12,14,15,17],won:[14,22],word:[1,18],work:[1,11,15,19,23],workflow:[1,22],worri:[1,20],would:[1,14,15,18,20,23],wouldn:21,wow:23,wrap:[1,18],written:[11,13],x:[4,6,7,8,9,10,11,14,17,22,23],x_1:4,x_j:4,x_n:4,y1:23,y2:23,y3:23,y4:23,y:[6,7,8,9,10,23],yet:[18,22],you:[11,13,17,18,19,20,21,22],your:[11,13,17,18,22],your_nod:20,yourself:11,zero:[0,1,6,7,8,9,10,14,17,22,23],zero_grad:[6,7,8,9,10,17,23],zeros_lik:20},titles:["API Reference","Components","<no title>","Decompositions","Embeddings","Examples","Hybrid Tensorial Neural Network model","DMRG-like training of MPS","Hybrid DMRG-like training of MPS","Tensorizing Neural Networks","Training MPS in different ways","TensorKrowch documentation","Initializers","Installation","Models","Operations","Tutorials","First Steps with TensorKrowch","Creating a Tensor Network in TensorKrowch","Contracting and Differentiating the Tensor Network","How to save Memory and Time with TensorKrowch (ADVANCED)","The different Types of Nodes (ADVANCED)","How to subclass TensorNetwork to build Custom Models","Creating a Hybrid Neural-Tensor Network Model"],titleterms:{"1":[17,18,19,20,21,22],"2":[17,18,19,20,21,22],"3":[17,18,19,20,22],"4":17,"5":17,"6":17,"7":17,"class":15,"function":17,"import":17,The:[21,22],abstractnod:1,add:15,add_on:4,advanc:[20,21],api:0,ar:20,axi:1,basi:4,between:19,build:[18,22],choos:17,cite:11,compon:[1,18,22],connect:15,connect_stack:15,content:2,contract:[15,19],contract_:15,contract_between:15,contract_between_:15,contract_edg:15,convmp:14,convmpslay:14,convpep:14,convtre:14,convump:14,convumpslay:14,convupep:14,convutre:14,copi:12,creat:[18,23],custom:22,data:17,dataset:[6,7,8,9,10],decomposit:3,defin:[6,7,8,9],differ:[10,21],differenti:19,disconnect:15,discret:4,distinguish:19,div:15,dmrg:[7,8],document:11,download:17,edg:[1,15],einsum:15,embed:4,empti:12,everyth:22,exampl:[5,11],faster:20,first:[17,22],how:[18,20,22],hybrid:[6,8,23],hyperparamet:17,initi:12,instal:[11,13],instanti:[10,17],introduct:[17,18,19,20,21,22],layer:9,librari:17,licens:11,like:[7,8,15],loss:17,manag:20,mat_to_mpo:3,matrix:19,memori:20,mode:20,model:[6,7,8,10,14,17,22,23],mp:[7,8,10,14],mpo:14,mpsdata:14,mpslayer:14,mul:15,name:21,network:[1,6,9,17,18,19,23],neural:[6,9,23],node:[1,15,18,19,21],notebook:11,ones:12,oper:[15,19,20],optim:17,our:22,paramnod:[1,19],paramstacknod:1,pep:14,permut:15,permute_:15,poli:4,product:19,prune:[10,17],put:22,qr:15,qr_:15,rand:12,randn:12,refer:0,renorm:15,requir:11,reserv:21,retrain:10,rq:15,rq_:15,run:20,save:20,set:17,setup:[17,18],skip:20,split:15,split_:15,stack:15,stacked_einsum:15,stackedg:1,stacknod:1,start:17,state:19,step:[17,18,19,20,21,22],store:20,sub:15,subclass:22,successor:1,svd:15,svd_:15,svdr:15,svdr_:15,tensor:[1,9,15,17,18,19,20,23],tensori:6,tensorkrowch:[11,17,18,20],tensornetwork:[18,20,22],time:20,togeth:22,tprod:15,train:[6,7,8,9,10,17],tree:14,tutori:[11,16],type:21,ump:14,umpo:14,umpslay:14,unbind:15,unit:4,upep:14,utre:14,vec_to_mp:3,wai:10,zero:12}}) \ No newline at end of file +Search.setIndex({docnames:["api","components","contents","decompositions","embeddings","examples","examples/hybrid_tnn_model","examples/mps_dmrg","examples/mps_dmrg_hybrid","examples/tensorizing_nn","examples/training_mps","index","initializers","installation","models","operations","tutorials","tutorials/0_first_steps","tutorials/1_creating_tensor_network","tutorials/2_contracting_tensor_network","tutorials/3_memory_management","tutorials/4_types_of_nodes","tutorials/5_subclass_tensor_network","tutorials/6_mix_with_pytorch"],envversion:{"sphinx.domains.c":2,"sphinx.domains.changeset":1,"sphinx.domains.citation":1,"sphinx.domains.cpp":5,"sphinx.domains.index":1,"sphinx.domains.javascript":2,"sphinx.domains.math":2,"sphinx.domains.python":3,"sphinx.domains.rst":2,"sphinx.domains.std":2,"sphinx.ext.viewcode":1,nbsphinx:4,sphinx:56},filenames:["api.rst","components.rst","contents.rst","decompositions.rst","embeddings.rst","examples.rst","examples/hybrid_tnn_model.ipynb","examples/mps_dmrg.ipynb","examples/mps_dmrg_hybrid.ipynb","examples/tensorizing_nn.ipynb","examples/training_mps.ipynb","index.rst","initializers.rst","installation.rst","models.rst","operations.rst","tutorials.rst","tutorials/0_first_steps.rst","tutorials/1_creating_tensor_network.rst","tutorials/2_contracting_tensor_network.rst","tutorials/3_memory_management.rst","tutorials/4_types_of_nodes.rst","tutorials/5_subclass_tensor_network.rst","tutorials/6_mix_with_pytorch.rst"],objects:{"tensorkrowch.AbstractNode":[[1,1,1,"","axes"],[1,1,1,"","axes_names"],[1,2,1,"","conj"],[1,2,1,"","contract_between"],[1,2,1,"","contract_between_"],[1,1,1,"","device"],[1,2,1,"","disconnect"],[1,1,1,"","dtype"],[1,1,1,"","edges"],[1,2,1,"","get_axis"],[1,2,1,"","get_axis_num"],[1,2,1,"","get_edge"],[1,2,1,"","in_which_axis"],[1,2,1,"","is_complex"],[1,2,1,"","is_conj"],[1,2,1,"","is_connected_to"],[1,2,1,"","is_data"],[1,2,1,"","is_floating_point"],[1,2,1,"","is_leaf"],[1,2,1,"","is_node1"],[1,2,1,"","is_resultant"],[1,2,1,"","is_virtual"],[1,2,1,"","make_tensor"],[1,2,1,"","mean"],[1,2,1,"","move_to_network"],[1,1,1,"","name"],[1,2,1,"","neighbours"],[1,1,1,"","network"],[1,2,1,"","node_ref"],[1,2,1,"","norm"],[1,2,1,"","numel"],[1,2,1,"","permute"],[1,2,1,"","permute_"],[1,1,1,"","rank"],[1,2,1,"","reattach_edges"],[1,2,1,"","renormalize"],[1,2,1,"","reset_tensor_address"],[1,2,1,"","set_tensor"],[1,2,1,"","set_tensor_from"],[1,1,1,"","shape"],[1,2,1,"","size"],[1,2,1,"","split"],[1,2,1,"","split_"],[1,2,1,"","std"],[1,1,1,"","successors"],[1,2,1,"","sum"],[1,1,1,"","tensor"],[1,2,1,"","tensor_address"],[1,2,1,"","unset_tensor"]],"tensorkrowch.Axis":[[1,2,1,"","is_batch"],[1,2,1,"","is_node1"],[1,1,1,"","name"],[1,1,1,"","node"],[1,1,1,"","num"]],"tensorkrowch.Edge":[[1,1,1,"","axes"],[1,1,1,"","axis1"],[1,1,1,"","axis2"],[1,2,1,"","change_size"],[1,2,1,"","connect"],[1,2,1,"","contract"],[1,2,1,"","contract_"],[1,2,1,"","copy"],[1,2,1,"","disconnect"],[1,2,1,"","is_attached_to"],[1,2,1,"","is_batch"],[1,2,1,"","is_dangling"],[1,1,1,"","name"],[1,1,1,"","node1"],[1,1,1,"","node2"],[1,1,1,"","nodes"],[1,2,1,"","qr"],[1,2,1,"","qr_"],[1,2,1,"","rq"],[1,2,1,"","rq_"],[1,2,1,"","size"],[1,2,1,"","svd"],[1,2,1,"","svd_"],[1,2,1,"","svdr"],[1,2,1,"","svdr_"]],"tensorkrowch.Node":[[1,2,1,"","change_type"],[1,2,1,"","copy"],[1,2,1,"","parameterize"]],"tensorkrowch.ParamNode":[[1,2,1,"","change_type"],[1,2,1,"","copy"],[1,1,1,"","grad"],[1,2,1,"","parameterize"]],"tensorkrowch.ParamStackNode":[[1,1,1,"","edges_dict"],[1,1,1,"","node1_lists_dict"],[1,2,1,"","reconnect"],[1,2,1,"","unbind"]],"tensorkrowch.StackEdge":[[1,2,1,"","connect"],[1,1,1,"","edges"],[1,1,1,"","node1_list"]],"tensorkrowch.StackNode":[[1,1,1,"","edges_dict"],[1,1,1,"","node1_lists_dict"],[1,2,1,"","reconnect"],[1,2,1,"","unbind"]],"tensorkrowch.TensorNetwork":[[1,2,1,"","add_data"],[1,1,1,"","auto_stack"],[1,1,1,"","auto_unbind"],[1,2,1,"","contract"],[1,2,1,"","copy"],[1,1,1,"","data_nodes"],[1,2,1,"","delete_node"],[1,1,1,"","edges"],[1,2,1,"","forward"],[1,1,1,"","leaf_nodes"],[1,1,1,"","nodes"],[1,1,1,"","nodes_names"],[1,2,1,"","parameterize"],[1,2,1,"","reset"],[1,1,1,"","resultant_nodes"],[1,2,1,"","set_data_nodes"],[1,2,1,"","trace"],[1,2,1,"","unset_data_nodes"],[1,1,1,"","virtual_nodes"]],"tensorkrowch.decompositions":[[3,3,1,"","mat_to_mpo"],[3,3,1,"","vec_to_mps"]],"tensorkrowch.embeddings":[[4,3,1,"","add_ones"],[4,3,1,"","basis"],[4,3,1,"","discretize"],[4,3,1,"","poly"],[4,3,1,"","unit"]],"tensorkrowch.models":[[14,0,1,"","ConvMPS"],[14,0,1,"","ConvMPSLayer"],[14,0,1,"","ConvPEPS"],[14,0,1,"","ConvTree"],[14,0,1,"","ConvUMPS"],[14,0,1,"","ConvUMPSLayer"],[14,0,1,"","ConvUPEPS"],[14,0,1,"","ConvUTree"],[14,0,1,"","MPO"],[14,0,1,"","MPS"],[14,0,1,"","MPSData"],[14,0,1,"","MPSLayer"],[14,0,1,"","PEPS"],[14,0,1,"","Tree"],[14,0,1,"","UMPO"],[14,0,1,"","UMPS"],[14,0,1,"","UMPSLayer"],[14,0,1,"","UPEPS"],[14,0,1,"","UTree"]],"tensorkrowch.models.ConvMPS":[[14,2,1,"","copy"],[14,1,1,"","dilation"],[14,2,1,"","forward"],[14,1,1,"","in_channels"],[14,1,1,"","kernel_size"],[14,1,1,"","padding"],[14,1,1,"","stride"]],"tensorkrowch.models.ConvMPSLayer":[[14,2,1,"","copy"],[14,1,1,"","dilation"],[14,2,1,"","forward"],[14,1,1,"","in_channels"],[14,1,1,"","kernel_size"],[14,1,1,"","out_channels"],[14,1,1,"","padding"],[14,1,1,"","stride"]],"tensorkrowch.models.ConvPEPS":[[14,1,1,"","dilation"],[14,2,1,"","forward"],[14,1,1,"","in_channels"],[14,1,1,"","kernel_size"],[14,1,1,"","padding"],[14,1,1,"","stride"]],"tensorkrowch.models.ConvTree":[[14,1,1,"","dilation"],[14,2,1,"","forward"],[14,1,1,"","in_channels"],[14,1,1,"","kernel_size"],[14,1,1,"","padding"],[14,1,1,"","stride"]],"tensorkrowch.models.ConvUMPS":[[14,2,1,"","copy"],[14,1,1,"","dilation"],[14,2,1,"","forward"],[14,1,1,"","in_channels"],[14,1,1,"","kernel_size"],[14,1,1,"","padding"],[14,1,1,"","stride"]],"tensorkrowch.models.ConvUMPSLayer":[[14,2,1,"","copy"],[14,1,1,"","dilation"],[14,2,1,"","forward"],[14,1,1,"","in_channels"],[14,1,1,"","kernel_size"],[14,1,1,"","out_channels"],[14,1,1,"","padding"],[14,1,1,"","stride"]],"tensorkrowch.models.ConvUPEPS":[[14,1,1,"","dilation"],[14,2,1,"","forward"],[14,1,1,"","in_channels"],[14,1,1,"","kernel_size"],[14,1,1,"","padding"],[14,1,1,"","stride"]],"tensorkrowch.models.ConvUTree":[[14,1,1,"","dilation"],[14,2,1,"","forward"],[14,1,1,"","in_channels"],[14,1,1,"","kernel_size"],[14,1,1,"","padding"],[14,1,1,"","stride"]],"tensorkrowch.models.MPO":[[14,1,1,"","bond_dim"],[14,1,1,"","boundary"],[14,2,1,"","canonicalize"],[14,2,1,"","contract"],[14,2,1,"","copy"],[14,1,1,"","in_dim"],[14,2,1,"","initialize"],[14,1,1,"","left_node"],[14,1,1,"","mats_env"],[14,1,1,"","n_batches"],[14,1,1,"","n_features"],[14,1,1,"","out_dim"],[14,2,1,"","parameterize"],[14,1,1,"","right_node"],[14,2,1,"","set_data_nodes"],[14,1,1,"","tensors"],[14,2,1,"","update_bond_dim"]],"tensorkrowch.models.MPS":[[14,1,1,"","bond_dim"],[14,1,1,"","boundary"],[14,2,1,"","canonicalize"],[14,2,1,"","canonicalize_univocal"],[14,2,1,"","contract"],[14,2,1,"","copy"],[14,2,1,"","entropy"],[14,1,1,"","in_env"],[14,1,1,"","in_features"],[14,1,1,"","in_regions"],[14,2,1,"","initialize"],[14,1,1,"","left_node"],[14,1,1,"","mats_env"],[14,1,1,"","n_batches"],[14,1,1,"","n_features"],[14,2,1,"","norm"],[14,1,1,"","out_env"],[14,1,1,"","out_features"],[14,1,1,"","out_regions"],[14,2,1,"","parameterize"],[14,2,1,"","partial_density"],[14,1,1,"","phys_dim"],[14,1,1,"","right_node"],[14,2,1,"","set_data_nodes"],[14,1,1,"","tensors"],[14,2,1,"","update_bond_dim"]],"tensorkrowch.models.MPSData":[[14,2,1,"","add_data"],[14,1,1,"","bond_dim"],[14,1,1,"","boundary"],[14,2,1,"","initialize"],[14,1,1,"","left_node"],[14,1,1,"","mats_env"],[14,1,1,"","n_batches"],[14,1,1,"","n_features"],[14,1,1,"","phys_dim"],[14,1,1,"","right_node"],[14,1,1,"","tensors"]],"tensorkrowch.models.MPSLayer":[[14,2,1,"","copy"],[14,1,1,"","in_dim"],[14,2,1,"","initialize"],[14,1,1,"","out_dim"],[14,1,1,"","out_node"],[14,1,1,"","out_position"]],"tensorkrowch.models.PEPS":[[14,1,1,"","bond_dim"],[14,1,1,"","boundary"],[14,2,1,"","contract"],[14,1,1,"","in_dim"],[14,2,1,"","initialize"],[14,1,1,"","n_batches"],[14,1,1,"","n_cols"],[14,1,1,"","n_rows"],[14,2,1,"","set_data_nodes"]],"tensorkrowch.models.Tree":[[14,1,1,"","bond_dim"],[14,2,1,"","canonicalize"],[14,2,1,"","contract"],[14,2,1,"","initialize"],[14,1,1,"","n_batches"],[14,2,1,"","set_data_nodes"],[14,1,1,"","sites_per_layer"]],"tensorkrowch.models.UMPO":[[14,2,1,"","copy"],[14,2,1,"","initialize"],[14,2,1,"","parameterize"]],"tensorkrowch.models.UMPS":[[14,2,1,"","copy"],[14,2,1,"","initialize"],[14,2,1,"","parameterize"]],"tensorkrowch.models.UMPSLayer":[[14,2,1,"","copy"],[14,1,1,"","in_dim"],[14,2,1,"","initialize"],[14,1,1,"","out_dim"],[14,1,1,"","out_node"],[14,1,1,"","out_position"],[14,2,1,"","parameterize"]],"tensorkrowch.models.UPEPS":[[14,1,1,"","bond_dim"],[14,2,1,"","contract"],[14,1,1,"","in_dim"],[14,2,1,"","initialize"],[14,1,1,"","n_batches"],[14,1,1,"","n_cols"],[14,1,1,"","n_rows"],[14,2,1,"","set_data_nodes"]],"tensorkrowch.models.UTree":[[14,1,1,"","bond_dim"],[14,2,1,"","contract"],[14,2,1,"","initialize"],[14,1,1,"","n_batches"],[14,2,1,"","set_data_nodes"],[14,1,1,"","sites_per_layer"]],tensorkrowch:[[1,0,1,"","AbstractNode"],[1,0,1,"","Axis"],[1,0,1,"","Edge"],[1,0,1,"","Node"],[15,0,1,"","Operation"],[1,0,1,"","ParamNode"],[1,0,1,"","ParamStackNode"],[1,0,1,"","StackEdge"],[1,0,1,"","StackNode"],[1,0,1,"","Successor"],[1,0,1,"","TensorNetwork"],[15,3,1,"","add"],[15,3,1,"","connect"],[15,3,1,"","connect_stack"],[15,3,1,"","contract"],[15,3,1,"","contract_"],[15,3,1,"","contract_between"],[15,3,1,"","contract_between_"],[15,3,1,"","contract_edges"],[12,3,1,"","copy"],[15,3,1,"","disconnect"],[15,3,1,"","div"],[15,3,1,"","einsum"],[12,3,1,"","empty"],[15,3,1,"","mul"],[12,3,1,"","ones"],[15,3,1,"","permute"],[15,3,1,"","permute_"],[15,3,1,"","qr"],[15,3,1,"","qr_"],[12,3,1,"","rand"],[12,3,1,"","randn"],[15,3,1,"","renormalize"],[15,3,1,"","rq"],[15,3,1,"","rq_"],[15,3,1,"","split"],[15,3,1,"","split_"],[15,3,1,"","stack"],[15,3,1,"","stacked_einsum"],[15,3,1,"","sub"],[15,3,1,"","svd"],[15,3,1,"","svd_"],[15,3,1,"","svdr"],[15,3,1,"","svdr_"],[15,3,1,"","tprod"],[15,3,1,"","unbind"],[12,3,1,"","zeros"]]},objnames:{"0":["py","class","Python class"],"1":["py","property","Python property"],"2":["py","method","Python method"],"3":["py","function","Python function"]},objtypes:{"0":"py:class","1":"py:property","2":"py:method","3":"py:function"},terms:{"0":[1,3,4,6,7,8,9,10,11,14,15,17,19,21,22,23],"00":[4,7],"0000":4,"0000e":4,"0086":1,"01":[7,10],"0101":1,"0188":1,"02":7,"0234":1,"03":[9,10],"0371":1,"04":[7,9],"0412":1,"0440":1,"0445":1,"0465":1,"05":7,"0501":1,"0521":1,"06":[7,9],"0633":1,"0639":17,"07":[7,9],"0704":1,"0728":17,"0743":1,"0750":17,"08":[4,9],"0806":1,"0820":17,"08595":11,"09":[7,10,14],"0913":17,"0983":17,"0998":17,"1":[1,3,4,6,7,8,9,10,11,14,15,23],"10":[1,4,6,7,8,9,10,11,14,15,17,19,22,23],"100":[1,4,6,7,8,9,10,11,14,15,18,19,20,21],"10000":[17,23],"101":7,"1024":[17,23],"104":7,"106":7,"108":7,"1091":1,"11":[6,7,8,9,10],"110":7,"1123":17,"113":7,"115":7,"117":7,"119":7,"12":[6,7,9,10],"1211":1,"122":7,"124":7,"126":7,"128":7,"13":[6,7,9],"1308":17,"131":7,"133":7,"135":7,"137":7,"1371":1,"14":[6,7,8,9,10,23],"140":7,"142":7,"144":7,"146":7,"149":7,"1496":1,"15":[1,6,7,8,9,10,15,19],"151":7,"153":7,"155":7,"1573":17,"158":7,"159674":10,"159962":10,"16":[6,7,8,9,10],"160":7,"161204":17,"162":7,"164":7,"16406":9,"1654":1,"167":7,"169":7,"17":[6,7,9,10],"171":7,"173":7,"176":7,"178":7,"18":[6,7,10],"180":7,"182":7,"185":7,"187":7,"1878":23,"189":7,"19":[7,9,10],"191":7,"194":7,"1955":17,"196":7,"198":7,"1990":17,"1998":1,"1e":[6,7,8,9,10,14,17,22,23],"2":[1,4,6,7,8,9,10,14,15,23],"20":[1,7,10,14,15,23],"200":7,"203":7,"205":7,"2052":23,"207":7,"209":7,"2091":1,"2095":1,"21":[7,10],"2111":1,"212":7,"214":7,"216":7,"218":7,"22":[6,7,10],"2203":23,"221":7,"223":7,"2254":1,"23":[7,10],"2306":11,"2316":1,"2357":23,"236220":[10,17],"2380":1,"2390":1,"24":[7,8],"2449":1,"2461":1,"2477":1,"25":[7,8],"2503":1,"2517":1,"26":7,"2618":23,"27":[7,8],"2730":1,"2775":1,"27944":9,"2799":1,"28":[6,7,8,9,10,17,23],"2808":1,"2840":23,"2856":1,"2866":1,"2898":1,"29":[7,8],"2d":14,"2f":[6,7,8,9,10],"3":[1,4,6,7,8,9,10,11,14,15,21,23],"30":[7,9,23],"3083":17,"3088":1,"31":7,"3139":1,"3149":23,"32":[7,14,17],"3222":1,"33":[6,7,9],"3340":1,"3370":1,"3371":1,"3381":1,"3393":1,"34":7,"3427":1,"3489":1,"35":[6,7,9],"3508":1,"3513":1,"3585":1,"36":7,"37":[7,8],"3711e":4,"3714":23,"3760":1,"3784":1,"38":[6,7,8],"3821":1,"39":[6,7,8,9,10],"39760":9,"4":[1,4,6,7,8,9,10,14,15,19,21,23],"40":[6,7,10,23],"4005":1,"41":7,"4181":1,"4184":1,"42":[7,8],"4216":1,"43":7,"4383":1,"4385":1,"44":7,"4402":1,"4431":1,"4461":1,"45":[6,7,8,9],"4572":1,"4588":1,"46":7,"462803":6,"47":7,"4731":1,"4761":1,"48":7,"49":[7,8],"4974":1,"499320":23,"4f":[17,23],"5":[1,4,6,7,8,9,10,11,14,15,18,19,20,21,23],"50":[6,7,9,23],"500":[11,17,22,23],"5000":4,"5021":1,"5029":1,"5069":1,"51":7,"5161":1,"52":[7,8,9,10],"5224":23,"53":7,"54":7,"5401":1,"5406":1,"55":[6,7,10],"553036":6,"553186":23,"5567":1,"5570":1,"56":[7,9],"5676":17,"57":[7,9,10],"5731":1,"5760":1,"5797":1,"58":[7,10],"59":[7,8],"5920":1,"6":[1,4,6,7,8,9,10,14,23],"60":[7,23],"60000":[17,23],"6023":1,"61":[6,7],"6149":17,"61999999999999":9,"62":[7,8,9],"6225":1,"6227":1,"6295":1,"63":7,"6356":1,"6399":1,"64":[6,7,8,9,10],"6492":1,"6495":1,"65":[7,8,10],"6524":1,"6545":1,"6551":1,"66":7,"67":[7,10],"68":7,"6811":1,"69":[7,8,9,10],"6925":1,"6982":1,"7":[1,6,7,8,9,10,11,14,15,19,20,23],"70":[7,8,9,23],"71":7,"72":[7,10],"73":[7,9],"74":[7,10],"75":[4,7],"7500":4,"7592":1,"76":[7,10],"7688":1,"77":7,"7752":1,"78":7,"7812":1,"79":[6,7,10],"7997":1,"8":[6,7,8,9,10,11,14,17],"80":[6,7,23],"8090":1,"81":[6,7,8,9],"8147":1,"82":7,"8227":1,"83":[6,7,9,10],"8361":1,"8387":1,"84":[6,7,8,9,10],"8441":1,"8442":1,"85":[6,7,9],"8502":23,"86":[6,7,9],"8627":23,"8633":1,"8649":1,"87":[6,7,9],"8795":23,"88":[6,7,9],"8815":1,"8820":17,"8848":23,"8851":23,"8859":1,"89":[6,7,9],"8901":23,"8911":1,"8915":23,"8948":23,"8968":23,"8984":23,"9":[6,7,8,9,10,11,14,17,22,23],"90":[7,9,23],"9006":1,"9009":23,"9011":[17,23],"9026":23,"9048":23,"9053":17,"91":[7,10],"9125":23,"9145":1,"9174":23,"92":[7,10],"9231":23,"9265":1,"9284":23,"93":[7,10],"9320":1,"9371":17,"9396":17,"94":[7,9],"9400":17,"9432":1,"95":[6,7,8,9,10],"9509":17,"9526":17,"9551":1,"9561":1,"9585":17,"96":[7,8,9,10],"9600":17,"9618":1,"9621":17,"9625":17,"9668":17,"9677":17,"9696":17,"97":[7,8,10],"9700":17,"9721":17,"9729":17,"9731":17,"9734":17,"9736":17,"9738":17,"9743":17,"9768":17,"9775":17,"9793":17,"98":[6,7,8,10,23],"9844":1,"99":[6,7,17],"9925":1,"9942":1,"9957":1,"abstract":1,"boolean":[1,12,14],"break":[7,8],"byte":[17,23],"case":[1,3,11,14,20,21,22],"class":[0,1,6,7,8,9,14,17,19,22,23],"default":[1,4,14,20,21],"do":[1,14,17,18,20,21,22],"final":[1,3,14,19,22],"float":[1,3,6,7,8,9,10,14,15],"function":[1,14,15,19,23],"garc\u00eda":11,"import":[1,6,7,8,9,10,11,18,19,20,21,22,23],"int":[1,3,4,10,12,14,15],"n\u00ba":[17,23],"new":[1,4,14,15,17,18,19,20,22,23],"p\u00e9rez":11,"return":[1,3,4,6,7,8,9,10,12,14,15,17,18,19,20,22,23],"super":[1,6,7,8,9,22,23],"true":[1,6,7,8,9,10,11,12,14,15,17,19,20,21,22,23],"try":[10,19,23],"while":[1,7,8,11,19,20,21],A:[1,11,14,15,18],And:[20,23],As:[11,14,17,18,19,20],At:[1,18],Be:[1,19],But:[19,20,22,23],By:[1,4,11,14,17,18],For:[1,14,15,18,19,20,21,22],If:[1,3,4,11,14,15,18,20,22],In:[1,3,8,11,14,15,17,18,19,20,21,22,23],Is:14,It:[1,3,11,14,15,17,18,19,23],Its:[1,15],Not:22,Of:[20,22],On:1,One:[1,10,18],That:[1,3,4,14,15,19,20,22,23],The:[1,3,4,11,14,15,16,18,19,20,23],Then:[1,14,20],There:[1,14,19,21,22],These:[1,3,11,14,18,19,21],To:[1,3,4,11,13,14,15,17,18,19,20,21,22],With:[1,10,11,15,18,19,22],_:[1,6,7,8,9,10,14,15,17,18,22,23],__call__:1,__init__:[1,6,7,8,9,22,23],_channel:14,_copi:1,_dim:1,_mats_env:[7,8],_percentag:[1,3,14,15],_size:14,_size_0:14,_size_1:14,_size_:1,a_:15,abil:11,abl:[1,11,18,19,22],about:[1,15,18,19,20,21,22],abov:[1,18,22],abstractnod:[0,12,15],acc:[6,7,8,9,10,17,23],acceler:[1,9,10],accept:19,access:[1,18,19,20],accomplish:[1,3,14,21],accord:[1,15],accordingli:14,account:[1,14,21],accross:[1,15],accumul:[3,14],accuraci:[6,7,8,9,10,17,23],achiev:1,act:[1,14,18,20],action:1,activ:1,actual:[1,14,18,19,20,23],ad:[1,4,14,15,19,22],adam:[6,7,8,9,10,17,23],adapt:[11,15],add:[0,1,14,17,19,22,23],add_data:[1,9,14,21,22],add_on:[0,23],addit:[1,11,14,15],addition:1,address:[1,18,20],admit:[14,15],advanc:[1,11,16],advantag:[8,20,22],advis:11,affect:[1,15],after:[1,3,8,14,17,23],afterward:[1,14,15],again:[8,10,14,17,20,22],against:14,aim:[3,14,17],alejandro:11,algorithm:[1,14,20,22,23],all:[1,3,4,8,10,14,15,17,18,19,20,21,22,23],allow:[1,11,14],almost:[1,19,20,21,23],along:[1,15],alreadi:[1,7,14,15,17,18,19,22],also:[1,3,8,11,13,14,15,17,18,19,20,21,22],alter:14,although:[1,10,18,19,20,21,22],alwai:[1,11,14,15,17,18,19,20,21,22],among:[3,14],amount:[15,17],an:[1,3,4,6,9,10,11,12,14,15,17,18,19,20,21,22],ancillari:[1,20,21],ani:[1,7,8,14,15,18,19,22],anomali:11,anoth:[1,14,15,18,19],antialia:[7,8,9,10],anymor:1,api:2,appear:[1,15,18],append:[6,7,8,19,20,21,22,23],appli:[1,11,14,15,19],approach:[8,10,11],appropi:[14,15,22,23],approxim:1,ar:[1,3,4,8,11,13,14,15,17,18,19,21,22,23],arang:[4,7,8],arbitrari:1,architectur:11,archiveprefix:11,arg:[1,6,7,8,9,12,14],argument:[1,3,12,14,15,22],aros:1,around:17,arrai:18,arrow:15,arxiv:11,ascertain:11,assert:[1,11,14,15,18,19,20,21],assign:14,assum:[1,4,14,15],attach:[1,15,18],attribut:[1,14,22],author:11,auto_stack:[1,15,17,20,21,22,23],auto_unbind:[1,15,17,20,22,23],automat:[1,15,18,19,20],auxiliari:15,avail:[11,17,18],avoid:[1,3,14,15,20],awar:[1,19],ax:[1,7,8,14,15,18,19],axes_nam:[1,7,8,11,15,18,19,20,21,22],axi:[0,4,7,8,15,18,22,23],axis1:1,axis2:1,axis_0:1,axis_1:1,axis_2:1,axis_n:1,b:[4,14,15,19],b_1:3,b_:15,b_m:3,back:1,backend:[6,7,8,9,10],backpropag:[17,23],backward:[1,6,7,8,9,10,11,17,19,23],bar:[7,8],base:[1,4,10,14,15,19],basi:[0,10,14],basic:[1,11,18,19],batch:[1,3,4,10,11,14,15,17,18,19,21,22],batch_0:[4,14],batch_1:[1,14,22],batch_idx:[6,7,8,9,10],batch_m:1,batch_n:[4,14,22],batch_siz:[6,7,8,9,10,14,17,23],becaus:[1,14,20,23],becom:[1,11,14,15],been:[1,14,15,18,22],befor:[1,6,7,8,9,10,14,17,18,22,23],beforehand:18,beggin:8,begin:[4,17,18,23],behav:[1,20],behavior:[3,14],behaviour:[1,14,15,18,20,21],being:[1,3,4,14,15,19],belong:[1,14,17,18,19],besid:[1,14,15,18],best:[10,11],better:18,between:[1,3,4,10,11,14,15,18,20,21,23],bia:9,big:[14,19],bigger:14,binom:4,bit:1,blank:1,block:[7,8],block_:8,block_length:[7,8],block_nod:[7,8],block_posit:7,bmatrix:4,bodi:18,bond:[3,8,14],bond_dim:[6,7,8,9,10,11,14,17,23],bool:[1,3,12,14],border:14,both:[1,14,15,18,19,20,21,22],bottom:[1,14,23],boudari:14,bound:[1,3,14,15],boundari:[3,7,8,9,10,14],bracket:1,bridg:11,bring:17,build:[1,6,11,16,19],built:[11,17,19,22],bunch:[1,19,22],c_:15,cach:[1,20],calcul:20,call:[1,14,15,17,19,22,23],callabl:15,can:[1,3,4,6,7,8,9,10,11,13,14,15,17,18,19,20,21,22,23],cannot:[1,7,14,15,19,21],canon:[6,10,14,17,23],canonic:[6,9,10,14,17,23],canonicalize_univoc:14,carri:[1,14,15,18],cast:1,cat:[6,23],caus:14,cdot:[3,4,14],center:14,central:[1,18,23],certain:[1,4,10,11,15],chang:[1,6,10,11,14,15,18,20,22,23],change_s:1,change_typ:1,channel:14,charact:1,check:[1,6,7,8,9,10,14,15,17,18,19,20,21,23],check_accuraci:[6,7,8,9,10],check_first:15,child:1,choic:10,choos:10,chose:21,classif:[14,17],classifi:[17,22],clone:[11,13,14],close:14,cmap:[6,7,8,9,10],cnn:[6,23],cnn_snake:[6,23],cnn_snakesb:[6,23],co:4,code:[1,10,11,18,23],coincid:[14,15,18],collect:[1,11,15,19,20],column:14,com:[11,13],combin:[1,6,10,14,18,22,23],come:[1,15,17,18,21,22],comma:15,command:[11,13],common:[1,14,17,22],compar:20,complementari:14,complet:[1,15],complex64:1,complex:1,compon:[0,4,11,15,17,19],compos:[7,8,9,10,17,23],comput:[1,3,4,11,13,14,15,17,19,20,22,23],concaten:4,concept:11,condit:[3,14,15],configur:[10,11],conform:1,conj:1,conja:1,conjug:1,connect:[0,1,9,11,14,18,19,20,21,22],connect_stack:0,consecut:[3,14],consid:[11,14],consist:[1,15],constraint:11,construct:[1,11,19,20],contain:[1,14,18,19,20,21],context:11,continu:[14,17],contract:[0,1,6,7,8,9,10,11,14,16,17,18,20,21,22],contract_:[0,1,19],contract_between:[0,1,19],contract_between_:[0,1,7,8,19],contract_edg:[0,1,19],contract_edges_ip:[1,15],contrast:[10,14],contrat:14,control:[1,18,20],conv2d:[6,14,23],conv_mp:14,conv_mps_lay:14,conv_pep:14,conv_tre:14,conveni:[14,21],convent:[1,15,19,22],converg:10,convmp:0,convmpslay:[0,6,23],convolut:[6,14,22,23],convpep:0,convtre:0,convump:0,convumpslay:0,convupep:0,convutre:0,copi:[0,1,14],core:[8,10,14,18,23],corner:14,correct:[1,7,8,9,10,20],correctli:15,correspond:[1,3,4,14,15,18,19,20,22],costli:[1,14,20],could:[14,17,18,20,22],count:17,coupl:[1,18,21],cours:[20,22],cpu:[6,7,8,9,10,17,22,23],creat:[1,6,7,11,14,15,16,19,20,21,22],creation:[11,15],criterion:[6,7,8,9,10],crop:[1,14],crossentropyloss:[6,7,8,9,10,17,23],cuda:[1,6,7,8,9,10,17,22,23],cum:[1,3,14,15],cum_percentag:[1,3,6,7,8,9,10,14,15,17,23],current:[1,14],custom:[1,11,14,16],cut:[3,17,23],cutoff:[1,3,14,15],d:[4,11],d_1:3,d_n:3,dagger:[1,15],dangl:[1,15,17,18,19],data:[1,4,6,7,8,9,10,11,14,15,19,21,22,23],data_0:[1,21],data_1:1,data_nod:[1,7,8,19,21,22],data_node_:19,dataload:[6,7,8,9,10,17,23],dataset:[14,17,23],dataset_nam:[6,7,8,9,10],david:[4,11],ddot:4,de:[1,14,19],decompos:[3,15],decomposit:[0,1,9,14,15,17,19,23],decreas:1,dedic:14,deep:[11,17],deepcopi:1,def:[1,6,7,8,9,10,17,22,23],defin:[1,4,11,14,18,19,21,22,23],degre:[4,8,10],del:[1,15],delet:[1,15],delete_nod:1,demonstr:11,densiti:14,depend:[1,3,10],deriv:14,descent:[6,7,8,9,10,18,19],describ:[1,9,14,22],design:14,desir:[4,8,19,20,21,22],detach:9,detail:[1,11,14,19],determin:11,develop:11,devic:[1,6,7,8,9,10,14,17,22,23],devot:20,df:1,diagon:[1,12,15],diagram:18,dictionari:1,did:23,differ:[1,5,6,11,14,15,16,17,18,19,20,22,23],differenti:[11,16,18],dilat:14,dim:[4,6,7,10,17,23],dimens:[1,3,4,8,14,15,17,18,22],dimension:[18,23],direct:7,directli:[1,11,13,15,18,19,20,21],disconnect:[0,1,14,18],discret:[0,10,14],distinct:1,distinguish:21,distribut:[3,12,14],div:[0,19],divers:11,divid:[1,15],divis:15,divisor:15,dmrg:[5,10],document:[1,15],doe:[1,14,18,20],don:15,done:[1,3,14,18],down:14,down_bord:14,download:[6,7,8,9,10,11,13,23],drawn:12,drop_last:[17,23],dtype:[1,14],due:14,duplic:14,dure:[1,8,17,20,21],dynam:14,e:[1,4,11,14,15,21],each:[1,3,4,8,14,15,17,18,19,20,21,22,23],earlier:18,easi:[1,11],easier:18,easili:[1,18,19,22,23],edg:[0,11,14,17,18,19,20,21,22,23],edge1:[1,15],edge2:[1,15],edgea:1,edgeb:1,edges_dict:1,effect:[1,19],effici:[1,11,18],einstein:19,einsum:[0,19],either:[14,15],element:[1,4,11,12,14,15,18],element_s:[17,23],elif:[6,7,8,9,10],els:[6,7,8,9,10,17,22,23],emb:[4,17,22],emb_a:4,emb_b:4,embed:[0,6,7,8,10,14,17,22,23],embedd:4,embedding_dim:[7,8,10],embedding_matric:14,empti:[0,1,14,18,19,20],enabl:[1,11,14,18,19,20],end:[1,4,8,15],engin:18,enhanc:11,enough:[1,14],ensur:[1,11],entail:[1,20],entangl:14,entir:1,entropi:14,enumer:[1,6,7,8,9,10,14],environ:14,epoch:[1,6,7,8,9,10,17,22,23],epoch_num:[17,23],eprint:11,equal:[1,7,14,22],equilibrium:17,equival:[1,4,14,18,23],error:[11,14],essenti:[1,11],etc:[1,15,18,22],eval:[6,7,8,9,10],evalu:19,even:[1,3,8,11,14,18,20,22],evenli:[3,14],everi:[1,15,18,20,23],exact:1,exactli:1,exampl:[1,2,4,6,9,14,15,17,19,21,22],exce:7,exceed:14,excel:11,except:[12,14],exclud:[1,21],execut:15,exist:[1,14,15,19],exp:14,expand:[1,4,22],expect:[3,14],experi:[1,11,18,20],experiment:11,explain:[1,18,19,20],explan:[1,14,15],explicitli:[1,15,21,22],explod:[3,14],explor:[11,18],express:15,extend:1,extra:[3,14,15],extract:[3,14,18],extractor:23,ey:22,eye_tensor:22,f:[6,7,8,9,10,17,18,19,20,21,23],facilit:[1,11,15,18],fact:[1,21,22],factor:[3,14],fail:[14,15],failur:11,fals:[1,3,6,7,8,9,10,12,14,15,17,19,20,22,23],familiar:[11,18],fashion:[8,19],fashion_mnist:[6,9],fashionmnist:[6,9,23],faster:[1,8,22],fastest:11,fc1:9,fc2:9,featur:[1,4,14,15,18,19,20,21,23],feature_dim:[1,22],feature_s:14,fed:23,feed:9,few:[8,11],fffc:9,file:11,fill:[1,12,18,19,22],find:11,finish:[18,22],finit:14,first:[1,4,10,11,14,15,16,18,19,20,21,23],fix:[1,18,19],flat:14,flatten:14,flavour:1,flip:[1,6,23],flips_x:6,fn_first:15,fn_next:15,folder:[11,13],follow:[1,11,13,14,15],forget:1,form:[1,14,17,18,19,21,23],former:[1,14,15],forward:[1,6,7,8,9,10,14,15,22,23],four:22,frac:[1,3,4,14,15],framework:11,free:14,friendli:11,from:[1,3,6,7,8,9,10,11,12,13,14,15,17,18,19,21,22,23],from_sid:14,from_siz:14,full:17,fulli:[9,11],func:[1,14],functool:23,fundament:11,further:[1,11],furthermor:[1,20,22],futur:[1,20],g:[1,14,15,21],gain:11,gap:11,garc:11,gaussian:14,ge:[1,3,14,15],gener:[1,20],get:[1,6,7,8,9,10,17,18,22,23],get_axi:[1,7,8,18],get_axis_num:[1,18],get_edg:1,git:[11,13],github:[11,13],give:[1,18,20,21],given:[1,4,6,14],glimps:17,go:[1,15,17,19,20,23],goal:11,goe:14,good:[1,6,7,8,9,10,17],gpc20:6,gpu:[17,22],grad:[1,11,19],gradient:[1,6,7,8,9,10,11,14,18,19],graph:[1,18,20,22],grasp:11,greater:[1,7,22],greatli:11,grei:[6,7,8,9,10],grid:14,grid_env:14,group:15,gt:[6,7,8,9,10],guid:11,ha:[1,3,8,14,15,17,18,20,21,22,23],had:[1,15,20],hand:[1,11,14,22],happen:[1,3,14,20,23],har:11,hardwar:11,hat:4,have:[1,3,4,14,15,17,18,19,20,21,22,23],heavi:22,height:[14,17,22],help:[1,20],henc:[1,15,17,18,19,20,22],here:[1,7,8,10,14,19],hidden:[1,21],high:[1,4,6,7,8,9,10,12],highli:11,hint:1,hold:[19,21],hood:20,horizont:14,how:[1,6,7,8,9,10,11,14,15,16,17,19,21,23],howev:[1,11,14,15,18,19,20],http:[11,13],hundread:19,hybrid:[5,11,16],hyperparamet:[6,7,8,9,10],i:[1,3,6,7,8,11,14,15,18,19,20,21,22],i_1:12,i_n:12,ideal:11,ident:14,identif:11,idx:18,ignor:[6,10],ijb:[15,19],ijk:15,im:15,imag:[6,14,17,22,23],image_s:[6,7,8,9,10,17,22,23],immers:11,implement:[1,11,17,23],improv:17,imshow:[6,7,8,9,10],in_1:3,in_channel:[6,14,23],in_dim:[7,8,10,11,14,17],in_env:14,in_featur:14,in_n:3,in_region:14,in_which_axi:1,includ:[1,11,14,18],incorpor:11,inde:[1,14],independ:[1,15],index:[1,6,7,8,9,10,18,20],indic:[1,3,12,14,15,18,19,20,21],infer:[1,14,15,18,20,22],inform:[1,11,14,15,18,19,20],ingredi:[1,18],inherit:[1,14,15,21],inic:22,init:19,init_method:[1,6,7,8,10,14,17,18,19,23],initi:[0,1,7,8,9,10,14,17,18,19,22,23],inlin:14,inline_input:[6,9,10,14],inline_mat:[6,9,10,14],inner:1,input:[1,3,7,8,14,15,17,18,19,20,21,22,23],input_edg:[1,21,22],input_nod:22,input_s:[6,7,8,9,10],insid:[1,11,13],insight:19,instal:[2,17,18],instanc:[1,15,20,21,22],instanti:[1,3,14,18,20,21,22],instati:18,instead:[1,14,19,20,21,22,23],integ:4,integr:11,intend:[1,14],interior:14,intermedi:[1,19,21,22],intern:[14,15],intric:11,intricaci:11,introduc:[6,14],introduct:11,invari:[1,14,20,21],inverse_memori:1,involv:[1,15,20],is_attached_to:1,is_avail:[6,7,8,9,10,17,22,23],is_batch:[1,18],is_complex:1,is_conj:1,is_connected_to:1,is_dangl:[1,18],is_data:[1,21],is_floating_point:1,is_leaf:[1,21],is_node1:1,is_result:[1,21],is_virtu:[1,21],isinst:[1,19],isn:[17,18],isometri:14,issu:1,item:[6,7,8,9,10,17,23],iter:[1,8,14,20],its:[1,11,12,14,15,18,20,22,23],itself:[1,14,22],itselv:14,j:[1,4,8,11,15],jkb:[15,19],jl:15,jo:11,joserapa98:[11,13],just:[1,11,14,18,20,21,22,23],k:[11,15],keep:[1,3,14,15,20],keepdim:1,kei:[1,10,11,18],kept:[1,3,14,15],kernel:14,kernel_s:[6,14,23],kerstjen:11,keyword:[1,12,14],kib:[15,19],kind:[1,17],klm:15,know:[1,18,19,20],known:22,kwarg:[1,6,7,8,9,12,14],l2_reg:[17,23],l:[4,15],label:[14,17,21,23],lambda:[17,23],larger:1,largest:1,last:[1,7,14,15,22,23],later:22,latter:[1,14],layer:[1,6,11,14,17,22,23],ldot:12,lead:[1,15,21],leaf:[1,15,21,22],leaf_nod:[1,21],learn:[1,8,11,15,17,18,19,20,21,22,23],learn_rat:[17,23],learnabl:19,learning_r:[6,7,8,9,10],least:[1,14,15,17,20,23],leav:[8,14,20],left1:19,left2:19,left:[1,7,8,11,14,15,18,19,20,21,22,23],left_bord:14,left_down_corn:14,left_nod:[7,8,14],left_up_corn:14,leg:1,len:[6,7,8,9,10,15,22],length:[1,14],let:[17,18,19,20,22,23],level:[1,4,10,18],leverag:18,lfloor:4,li:[1,11,18],librari:[11,18,23],like:[0,1,5,10,11,14,17,18,19,20,21,22,23],line:[11,14,23],linear:[9,11,22],link:1,list:[1,3,12,14,15,18,19,22],load:[6,7,8,9,10,17,22],load_state_dict:[9,10,22],loader:[6,7,8,9,10,17,23],local:[4,14],locat:[1,14],log_norm:14,log_scal:14,logarithm:[3,14],logarithmoc:14,logit:[17,23],longer:[1,20],look:[1,10],loop:[17,22],lose:17,loss:[6,7,8,9,10,23],loss_fun:[17,23],lot:[1,17],low:[1,4,6,7,8,9,10,12,14],lower:[1,3,14,15],lr:[6,7,8,9,10,17,23],lst_y:6,lt:10,lvert:4,m:[1,3,11,13,15],machin:[11,17],made:[1,15],mai:[1,3,10,11,14],main:[1,18,19,20,22],mainli:1,maintain:1,make:[1,8,18,19,20,21],make_tensor:[1,14],manag:[1,22],mandatori:[1,15],mani:[1,8,14,17,18,20,23],manipul:18,manual:[1,14,22],manual_se:[17,23],map:4,margin:14,marginalize_output:14,master:[11,13],mat:3,mat_to_mpo:[0,9],match:[1,10,14,15],matplotlib:[6,7,8,9,10],matric:[14,15,19,22],matrix:[1,3,4,9,11,14,15,17,18,20,22],mats_env:[7,8,14],mats_env_:[7,8],max:[6,7,8,9,10,17,23],max_bond:14,maximum:[4,14],maxpool2d:[6,23],mayb:15,mb:[17,23],mean:[1,12,14],megabyt:[17,23],mehtod:18,member:[1,14],memori:[1,11,16,17,18,21,22,23],mention:[14,22],merg:[7,8],merge_block:7,messag:11,method:[1,14,15,18,19,20,21,22],middl:14,middle_sit:14,might:[1,14,20,21,22],mile:4,mimic:22,minuend:15,misc:11,miscellan:[17,23],mit:11,mkdir:[6,7,8,9,10],mnist:[7,8,10,17],mod:4,mode:[1,6,14,15,17,21,22,23],model:[0,1,5,9,11,16,18,19,20,21],model_nam:[6,7,8,9,10],modif:1,modifi:[1,14,19],modul:[1,6,9,11,13,14,17,18,19,22,23],modulelist:[6,23],monomi:4,monturiol:11,mooth:11,more:[1,3,11,14,15,18,19,20,21],most:[1,11,18,21],move:[1,14,18],move_block_epoch:[7,8],move_nam:1,move_to_network:[1,15],movec:15,mp:[0,3,5,6,9,11,17,18,19,20,21,22,23],mpo:[0,3,9,22],mpo_tensor:9,mps_data:[9,14],mps_dmrg:7,mps_dmrg_hybrid:8,mps_hdmrg:8,mps_layer:[6,14],mps_tensor:9,mpsdata:[0,3,9],mpslayer:[0,7,8,10,11,17,22],mpss:6,much:[1,8,20,21,22,23],mul:[0,19],multi:18,multipl:[14,18,20],multipli:[14,15],must:[1,3,15,18,22],my_model:11,my_nod:[1,20],my_paramnod:1,my_stack:1,mybatch:1,n:[1,4,6,9,10,11,12,14,17,23],n_:[1,4],n_batch:[3,9,14],n_block:8,n_col:14,n_epoch:22,n_featur:[7,8,9,10,11,14,17,22],n_param:[6,9,10,17,23],n_row:14,name:[1,7,8,11,15,17,18,19,20,22,23],name_:1,necessari:[1,14,15,17,18,22,23],need:[1,11,14,15,17,18,19,20,22],neighbour:[1,7,8,14,19],nelement:[17,23],net2:1,net:[1,11,15,18,19,20,21],network:[0,5,7,8,10,11,14,15,16,20,21,22],neumann:14,neural:[5,11,14,16,17],never:[1,15,21],nevertheless:11,new_bond_dim:10,new_edg:[1,15],new_edgea:1,new_edgeb:1,new_mp:22,new_nodea:[1,15],new_nodeb:[1,15],new_tensor:20,next:[1,14,15,18,19,20,21],nn:[1,6,7,8,9,10,11,14,17,18,19,22,23],no_grad:[6,7,8,9,10,17,23],node1:[1,11,15,18,19,20,21],node1_ax:[1,7,8,15],node1_list:1,node1_lists_dict:1,node2:[1,11,15,18,19,20,21],node2_ax:[1,7,8,15],node3:[19,20],node:[0,3,7,8,11,12,14,16,17,20,22,23],node_0:1,node_1:1,node_:[18,19,20,21],node_left:[1,15],node_n:1,node_ref:1,node_right:[1,15],nodea:[1,15],nodeb:[1,15],nodec:[1,15],nodes_list:15,nodes_nam:1,nodesa:15,nodesb:15,nodesc:15,non:[1,14,15,19,22],none:[1,3,7,8,11,14,15,19,22],norm:[1,3,14,15],normal:[1,3,12,14,15],notabl:11,notat:18,note:[1,11,15,18,19,22],noth:[1,18,20],now:[1,18,19,20,22,23],npov15:9,nto16:10,nu_batch:14,num:1,num_batch:[17,23],num_batch_edg:[1,21,22],num_class:[6,7,8,9,10],num_correct:[6,7,8,9,10],num_epoch:[6,7,8,9,10,17,23],num_epochs_canon:17,num_sampl:[6,7,8,9,10],num_test:[17,23],num_train:[17,23],number:[1,3,14,15,17,19,22,23],numel:[1,6,9,10],numer:15,nummber:1,o:11,obc:[3,7,8,9,10,14],object:[1,18,23],obtain:[14,17],oc:14,occur:[1,14,20],occurr:11,off:[17,20,23],offer:11,often:[1,20],onc:[1,8,11,14,15,20],one:[1,3,4,6,7,9,10,14,15,17,18,19,20,21,22,23],ones:[0,1,4,6,14,18,19,21,23],ones_lik:[6,17,23],onli:[1,11,14,15,18,19,20,21,22],open:14,oper:[0,1,14,18,21,22],operand:[1,18,19],opposit:14,opt_einsum:[11,15,19],optim:[1,6,7,8,9,10,11,14,23],option:[1,3,4,6,10,11,14,15,18,22],order:[1,3,6,14,15,18,19,20,21,22],orient:14,origin:[1,4,14,15,17,21,23],orthogon:14,ot:14,other:[1,8,14,15,18,19,20,21,22,23],other_left:18,other_nod:20,otherwis:[1,14,15,23],otim:4,our:[6,7,8,9,10,17,18,19,20,23],out:[1,14,15,22],out_1:3,out_channel:[6,14,23],out_dim:[7,8,10,11,14,17],out_env:14,out_featur:14,out_n:3,out_nod:[7,8,14],out_posit:14,out_region:14,outdat:14,output:[1,3,4,6,7,8,14,15,17,22],output_dim:[6,7,8,10],output_nod:22,outsid:[11,13],over:[1,15,19],overcom:1,overhead:20,overload:1,overrid:[1,7,14,22],override_edg:1,override_nod:1,overriden:[1,19,22],own:[1,14,15,20,21],ownership:1,p:[1,6,9,10,11,15,17,23],packag:[11,13],pad:[6,14,23],pair:[1,8,14,23],pairwis:14,paper:[4,11,14,23],parallel:[1,14],param:[1,15,17,23],param_nod:[1,11,12,19,21],paramedg:1,paramet:[1,3,4,6,7,8,9,10,12,14,15,17,19,22,23],parameter:[1,7,8,14,19],parametr:[1,14,17,19,22,23],paramnod:[0,12,14,15,20,21,22],paramnode1:19,paramnode2:19,paramnode3:19,paramnodea:1,paramnodeb:1,paramstacknod:[0,15,20,21],pareja2023tensorkrowch:11,pareja:11,parent:[1,22],parenthesi:1,part:[1,14,19,21,22],partial:[14,23],partial_dens:14,particular:[1,22],pass:[14,17,22],patch:[14,22],pattern:23,pave:17,pbc:14,pep:[0,11,22],perform:[1,10,11,14,15,17,18,19,20,22,23],period:14,permut:[0,1,9,19,20],permute_:[0,1,19],persist:11,phase:15,phi:4,phys_dim:[9,14],physic:[3,14,18],pi:4,piec:[18,22],pip:[11,13,17,18],pipelin:[11,17],pixel:[14,17,22,23],place:[1,14,15,19,20,22],plai:21,pleas:11,plt:[6,7,8,9,10],plu:14,plug:14,point:[1,17],poli:[0,8,10,22],pool:[6,23],posit:[7,14,22],possibl:[1,6,7,8,9,10,14,17,18,19,20],potenti:11,power:[4,14,17],poza:11,practic:[1,11],practition:17,pre:9,precis:4,pred:[17,23],predict:[6,7,8,9,10,17,23],present:23,previou:[1,14,19,20,21,22,23],previous:19,primari:11,principl:[1,21],print:[1,6,7,8,9,10,14,15,17,23],probabl:17,problem:[1,20],process:[1,8,10,11,17],prod:6,product:[11,14,15,17,18,20,22],profici:11,project:14,properli:22,properti:[1,7,14,15,18],proport:[1,3,14,15],prove:14,provid:[1,3,11,14,15,18],prune:23,pt:[6,7,8,9,10,22],purpos:[1,18,20,21],put:[1,14,17,23],pyplot:[6,7,8,9,10],pytest:[11,13],python:[11,13,17],pytorch:[1,11,15,17,18,19,20,22,23],q:15,qr:[0,1,3,14,19],qr_:[0,1,14],quantiti:[1,3,14,15],quantum:18,qubit:14,quit:[11,23],r:[11,15],r_1:15,r_2:15,rais:[1,7],ram:11,rand:[0,1,4,6,10,14],randint:[4,6,7,8,9,10],randn:[0,1,4,6,10,11,14,15,18,19,20,21,22],randn_ey:[6,8,10,14,17,23],random:[14,15,19],random_ey:22,random_sampl:[6,7,8,9,10],rang:[1,6,7,8,9,10,11,14,15,17,18,19,20,21,22,23],rangl:4,rank:[1,3,4,7,8,14,15,19],rapid:11,rather:[1,14,15,18,20,21],re:[1,15,17,23],reach:17,readi:22,realli:[1,21],reamin:8,reattach:1,reattach_edg:1,recal:[1,22],recogn:19,recommend:[1,11,14],reconnect:[1,19],recov:[1,3,14],reduc:[1,14,15,17,23],redund:[1,15],refer:[1,2,10,15,18,19,20,21,22],referenc:1,regard:[1,15,19],regio:14,relat:18,relev:[1,18],reli:[11,15],relu:[6,9,11,23],remain:[8,14],remov:[1,14,15],renorm:[0,1,3,6,9,10,14,19],renorma:[1,15],repeat:[1,8,10,15],repeatedli:20,replac:1,repositori:[11,13],repres:[14,18],reproduc:[1,10,11,20],requir:[1,14,15,21],requires_grad:1,rerun:11,res1:19,res2:19,rescal:14,research:11,reserv:[1,15,20],reset:[1,6,7,8,9,10,14,15,20,21,22],reset_tensor_address:1,reshap:[3,7,8,9,10,15,20],resiz:[7,8,9,10,17,23],respect:[1,3,14,15,19,20],rest:[1,19],restrict:[1,15,21],result2:15,result:[1,3,7,8,9,10,11,14,15,19,20,21,22],result_mat:[7,8],resultant_nod:[1,21],retain:1,retriev:[1,18,20,21],reus:14,review:11,rez:11,rfloor:4,rho_a:14,rid:1,right1:19,right2:19,right:[1,7,8,11,14,15,18,19,20,21,22,23],right_bord:14,right_down_corn:14,right_nod:[7,8,14],right_up_corn:14,rightmost:14,ring:19,role:[1,14,21,22],root:[6,7,8,9,10],row:14,rowch:11,rq:[0,1],rq_:[0,1,14],run:[11,13,14,17,23],running_acc:17,running_test_acc:[17,23],running_train_acc:[17,23],running_train_loss:[17,23],s:[1,4,11,12,14,15,17,18,19,20,21,22,23],s_1:4,s_i:[1,3,14,15],s_j:4,s_n:4,sai:[1,20],same:[1,8,10,14,15,18,19,20,23],sampler:[17,23],satisfi:[1,3,14,15],save:[1,6,7,8,9,10,11,14,16,19,22],scalar:14,scale:[3,14],scenario:11,scheme:10,schmidt:14,schwab:4,score:[6,7,8,9,10,17,23],second:[1,14,15,20],secondli:22,section:[18,19,21,23],see:[1,6,7,8,9,10,11,14,15,21,23],seen:21,select:[1,15,18,19,22],self:[1,6,7,8,9,14,22,23],send:[17,22,23],sens:[17,21],sento:22,separ:[14,15],sepcifi:1,sequenc:[1,3,14,15,19,22],sequenti:[11,22],serv:[11,17],set:[1,7,8,14,15,20,21,22,23],set_data_nod:[1,7,8,9,14,21,22],set_param:[1,7,14],set_tensor:[1,14,20],set_tensor_from:[1,20,21,22],sever:[1,15],shall:[1,22],shape:[1,3,4,7,8,9,10,11,12,14,15,17,18,19,20,21,22],shape_all_nodes_layer_1:14,shape_all_nodes_layer_n:14,shape_node_1_layer_1:14,shape_node_1_layer_n:14,shape_node_i1_layer_1:14,shape_node_in_layer_n:14,share:[1,14,15,18,20,21],share_tensor:[1,14],should:[1,3,4,7,11,12,14,15,18,19,20,21,22],show:[6,7,8,9,10,18],showcas:11,shown:7,shuffl:[6,7,8,9,10],side:[1,7,8,14,15,23],similar:[1,14,15,18,19,21,22],simpl:[11,18,19],simpli:[1,18,20,22],simplifi:[1,11],simul:18,sin:4,sinc:[1,8,14,15,19,20,21,22,23],singl:[1,14,15,19,22],singular:[1,3,14,15,17,19,23],site:[7,14,18],sites_per_lay:14,situat:[1,15,21],size:[1,4,6,7,8,9,10,12,14,15,18,19,21,22,23],skip:1,skipp:20,slice:[1,15,20,21],slide:1,slower:[1,20],small:19,smaller:1,smooth:11,snake:[6,14,23],so:[1,14,15,20,22],some:[1,3,14,15,17,18,19,20,21,22],someth:18,sometim:1,sort:[1,14,18,20,21],sourc:[1,3,4,12,14,15],space:[1,17,22,23],special:[1,19,21],specif:[1,11,21],specifi:[1,3,14,15,18,19,21],split:[0,1,3,7,8,14,18,19],split_0:[1,15],split_1:[1,15],split_:[0,1,7,8,19],split_ip:[1,15],split_ip_0:[1,15],split_ip_1:[1,15],sqrt:4,squar:[14,15],squeez:[4,6,7,8,9,10],ss16:[7,10],stack:[0,1,4,6,14,17,19,20,21,22],stack_0:1,stack_1:1,stack_data:[1,15,22],stack_data_memori:[1,21],stack_data_nod:19,stack_input:22,stack_nod:[1,15,19,20,21],stack_result:[19,22],stackabl:15,stacked_einsum:[0,19],stackedg:[0,15,19],stacknod:[0,15,19,21],stai:1,stand:4,start:[1,14,18,20,22,23],state:[1,11,14,17,18,20,22],state_dict:[6,7,8,9,10,14,22],staticmethod:[6,23],statist:11,std:[1,6,8,10,12,14,17,22,23],stem:11,step:[1,6,7,8,9,10,11,16,23],stick:1,still:[1,14,15,19],store:[1,14,15,18,21,22],stoudenmir:4,str:[1,15],straightforward:11,strength:11,stride:[6,14,23],string:[1,14,15,21],structur:[1,11,14,18,22,23],sub:[0,19],subclass:[1,11,16,18,21,23],subsequ:[1,15,20],subsetrandomsampl:[17,23],substitut:1,subsystem:14,subtract:15,subtrahend:15,successfulli:10,successor:[0,15],suffix:1,suitabl:11,sum:[1,3,6,7,8,9,10,14,15,17,19,23],sum_:[1,3,14,15],summat:19,support:11,sv:[1,15],svd:[0,1,3,14,17],svd_:[0,1,14,19],svdr:[0,1,14],svdr_:[0,1,14],t:[14,15,17,18,21,22],t_:[12,15],tailor:11,take:[1,14,15,17,20,21,22],taken:[1,15],target:[6,7,8,9,10],task:[1,14,21],temporari:[1,21],tensor:[0,3,4,5,6,7,8,11,12,14,16,21,22],tensor_address:[1,14,20,21],tensorb:15,tensori:5,tensorkrowch:[1,3,4,6,7,8,9,10,12,13,14,15,16,19,21,22,23],tensornetwork:[1,11,15,16,19,21,23],termin:[11,13],test:[6,7,8,9,10,11,13,17,23],test_acc:[6,7,8,9,10],test_dataset:[6,7,8,9,10],test_load:[6,7,8,9,10],test_set:[17,23],texttt:14,th:14,than:[1,3,7,8,14,15,18,22],thank:18,thei:[1,11,13,14,15,18,19,21],them:[1,14,15,17,18,19,20,22,23],themselv:[14,15],therefor:[1,11,13,14,18,22],thi:[1,3,4,6,8,9,10,11,14,15,17,18,19,20,21,22,23],thing:[1,15,17,21,23],think:20,third:14,those:[1,20,21,22],though:[1,14,15,19,22],thought:1,three:[1,15],through:[1,11,14,15,17,22,23],thu:[1,3,8,11,14,15,18,22],time:[1,3,4,8,10,11,14,15,16,18,19,22],titl:11,tk:[1,4,6,7,8,9,10,11,14,15,17,18,19,20,21,22,23],tn1:9,tn:[9,22],tn_fffc:9,tn_linear:9,tn_model:9,tn_nn:9,togeth:[1,11,13,20,21],tool:[11,18,19],top:[11,14,17,19,23],torch:[1,3,4,6,7,8,9,10,11,12,14,15,17,18,19,20,21,22,23],torchvis:[6,7,8,9,10,17,23],total:[1,3,14,15,17,23],total_num:[17,23],totensor:[6,7,8,9,10,17,23],tprod:[0,19],trace:[1,6,7,8,9,10,14,15,17,21,22,23],trace_sit:14,track:[1,14,20],tradit:8,train:[1,5,11,14,18,19,20,22,23],train_acc:[6,7,8,9,10],train_dataset:[6,7,8,9,10],train_load:[6,7,8,9,10],train_set:[17,23],trainabl:[1,14,18,21,22,23],transform:[4,6,7,8,9,10,14,17,19,23],transit:14,translation:[1,14,20,21],transpos:[6,17,22,23],treat:1,tree:[0,22],tri:[1,15],triangular:15,trick:[20,23],tupl:[1,12,14,15],turn:[1,14,20],tutori:[1,2,17,18,19,20,21,22,23],two:[1,14,15,18,19,20],two_0:15,type:[1,3,4,6,7,8,9,10,11,12,14,15,16,18,19,20],typeerror:1,u:[1,12,15],ump:0,umpo:0,umpslay:0,unbind:[0,1,19,20,22],unbind_0:[1,15],unbind_result:19,unbinded_nod:[19,20],unbound:[1,15],under:[11,20],underli:20,underscor:[1,15],understand:[11,18],undesir:[1,3,14,15,21],unfold:14,uniform:[1,12,14,20,21,22],uniform_memori:22,uniform_nod:[20,21],uninform:17,uniqu:[14,20],unit:[0,6,7,10,14],unitari:[14,15],univoc:14,unix:[11,13],unless:1,unmerg:8,unmerge_block:7,unset:1,unset_data_nod:[1,14],unset_tensor:1,unsqueez:23,until:[1,10,14,15,17],up:[1,14,15,18],up_bord:14,updat:[8,14,17,23],update_bond_dim:[7,8,14],upep:0,upon:14,upper:[14,15],ur_1sr_2v:15,us:[1,3,4,7,11,14,15,17,18,19,20,21,22,23],usag:1,useless:17,user:[1,11],usual:[1,14,15,21,22],usv:15,util:[6,7,8,9,10,17,23],utre:0,v:[1,11,13,15],valid:1,valu:[1,3,4,14,15,17,19,22,23],valueerror:[1,7],vanilla:[18,19,20],vanish:14,vari:14,variabl:4,variant:[19,22],variat:1,variou:[11,14],vdot:4,vec:3,vec_to_mp:[0,9],vector:[3,4,14,17,22,23],veri:[1,17,18,20,22],verifi:[1,15],versa:14,versatil:11,version:[1,14,15,19],vertic:[1,14],via:[1,3,7,14,15,18,19,20,21],vice:14,view:[1,6,17,22,23],virtual:[1,15,20,21,22],virtual_nod:[1,21],virtual_result:[1,21],virtual_result_stack:[1,15,21],virtual_uniform:[1,14,21,22],virtual_uniform_mp:1,visit:1,von:14,wa:[1,6,14,22,23],wai:[1,5,8,14,17,18,22],want:[1,14,18,19,20,22],we:[1,6,7,8,10,11,17,18,19,20,21,22,23],weight:9,weight_decai:[6,7,8,9,10,17,23],well:[1,10,14,15],were:[1,14,15,19,21,22],what:[1,18,20,22],when:[1,14,15,17,18,19,20,21,22],whenev:[1,15],where:[1,4,8,14,15,17,18,19,20,22],whether:[1,3,12,14,18,20],which:[1,4,10,12,14,15,17,18,19,20,21,22],whilst:14,who:11,whole:[1,8,14,17,19,20,21,22],whose:[1,6,14,15,20,21],why:20,wide:[11,22],width:[14,17,22],wise:[1,15],wish:22,without:[1,12,14,15,17],won:[14,22],word:[1,18],work:[1,11,15,19,23],workflow:[1,22],worri:[1,20],would:[1,14,15,18,20,23],wouldn:21,wow:23,wrap:[1,18],written:[11,13],x:[4,6,7,8,9,10,11,14,17,22,23],x_1:4,x_j:4,x_n:4,y1:23,y2:23,y3:23,y4:23,y:[6,7,8,9,10,23],yet:[18,22],you:[11,13,17,18,19,20,21,22],your:[11,13,17,18,22],your_nod:20,yourself:11,zero:[0,1,6,7,8,9,10,14,17,22,23],zero_grad:[6,7,8,9,10,17,23],zeros_lik:20},titles:["API Reference","Components","<no title>","Decompositions","Embeddings","Examples","Hybrid Tensorial Neural Network model","DMRG-like training of MPS","Hybrid DMRG-like training of MPS","Tensorizing Neural Networks","Training MPS in different ways","TensorKrowch documentation","Initializers","Installation","Models","Operations","Tutorials","First Steps with TensorKrowch","Creating a Tensor Network in TensorKrowch","Contracting and Differentiating the Tensor Network","How to save Memory and Time with TensorKrowch (ADVANCED)","The different Types of Nodes (ADVANCED)","How to subclass TensorNetwork to build Custom Models","Creating a Hybrid Neural-Tensor Network Model"],titleterms:{"1":[17,18,19,20,21,22],"2":[17,18,19,20,21,22],"3":[17,18,19,20,22],"4":17,"5":17,"6":17,"7":17,"class":15,"function":17,"import":17,The:[21,22],abstractnod:1,add:15,add_on:4,advanc:[20,21],api:0,ar:20,axi:1,basi:4,between:19,build:[18,22],choos:17,cite:11,compon:[1,18,22],connect:15,connect_stack:15,content:2,contract:[15,19],contract_:15,contract_between:15,contract_between_:15,contract_edg:15,convmp:14,convmpslay:14,convpep:14,convtre:14,convump:14,convumpslay:14,convupep:14,convutre:14,copi:12,creat:[18,23],custom:22,data:17,dataset:[6,7,8,9,10],decomposit:3,defin:[6,7,8,9],differ:[10,21],differenti:19,disconnect:15,discret:4,distinguish:19,div:15,dmrg:[7,8],document:11,download:17,edg:[1,15],einsum:15,embed:4,empti:12,everyth:22,exampl:[5,11],faster:20,first:[17,22],how:[18,20,22],hybrid:[6,8,23],hyperparamet:17,initi:12,instal:[11,13],instanti:[10,17],introduct:[17,18,19,20,21,22],layer:9,librari:17,licens:11,like:[7,8,15],loss:17,manag:20,mat_to_mpo:3,matrix:19,memori:20,mode:20,model:[6,7,8,10,14,17,22,23],mp:[7,8,10,14],mpo:14,mpsdata:14,mpslayer:14,mul:15,name:21,network:[1,6,9,17,18,19,23],neural:[6,9,23],node:[1,15,18,19,21],notebook:11,ones:12,oper:[15,19,20],optim:17,our:22,paramnod:[1,19],paramstacknod:1,pep:14,permut:15,permute_:15,poli:4,product:19,prune:[10,17],put:22,qr:15,qr_:15,rand:12,randn:12,refer:0,renorm:15,requir:11,reserv:21,retrain:10,rq:15,rq_:15,run:20,save:20,set:17,setup:[17,18],skip:20,split:15,split_:15,stack:15,stacked_einsum:15,stackedg:1,stacknod:1,start:17,state:19,step:[17,18,19,20,21,22],store:20,sub:15,subclass:22,successor:1,svd:15,svd_:15,svdr:15,svdr_:15,tensor:[1,9,15,17,18,19,20,23],tensori:6,tensorkrowch:[11,17,18,20],tensornetwork:[18,20,22],time:20,togeth:22,tprod:15,train:[6,7,8,9,10,17],tree:14,tutori:[11,16],type:21,ump:14,umpo:14,umpslay:14,unbind:15,unit:4,upep:14,utre:14,vec_to_mp:3,wai:10,zero:12}}) \ No newline at end of file diff --git a/docs/_build/html/tutorials.html b/docs/_build/html/tutorials.html index 46ed10e..07e2f16 100644 --- a/docs/_build/html/tutorials.html +++ b/docs/_build/html/tutorials.html @@ -6,7 +6,7 @@ - Tutorials — TensorKrowch 1.1.2 documentation + Tutorials — TensorKrowch 1.1.3 documentation diff --git a/docs/_build/html/tutorials/0_first_steps.html b/docs/_build/html/tutorials/0_first_steps.html index 1373161..a914266 100644 --- a/docs/_build/html/tutorials/0_first_steps.html +++ b/docs/_build/html/tutorials/0_first_steps.html @@ -6,7 +6,7 @@ - First Steps with TensorKrowch — TensorKrowch 1.1.2 documentation + First Steps with TensorKrowch — TensorKrowch 1.1.3 documentation @@ -619,7 +619,7 @@

    4. Instantiate the Tensor Network Model
    # Check if GPU is available
    -device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
    +device = torch.device('cuda:0' if torch.cuda.is_available() else 'cpu')
     
     # Instantiate model
     mps = tk.models.MPSLayer(n_features=image_size[0] * image_size[1] + 1,
    diff --git a/docs/_build/html/tutorials/1_creating_tensor_network.html b/docs/_build/html/tutorials/1_creating_tensor_network.html
    index 63483dc..cab5a5b 100644
    --- a/docs/_build/html/tutorials/1_creating_tensor_network.html
    +++ b/docs/_build/html/tutorials/1_creating_tensor_network.html
    @@ -6,7 +6,7 @@
         
         
     
    -    Creating a Tensor Network in TensorKrowch — TensorKrowch 1.1.2 documentation
    +    Creating a Tensor Network in TensorKrowch — TensorKrowch 1.1.3 documentation
         
       
       
    diff --git a/docs/_build/html/tutorials/2_contracting_tensor_network.html b/docs/_build/html/tutorials/2_contracting_tensor_network.html
    index e9e6c2d..3dacbac 100644
    --- a/docs/_build/html/tutorials/2_contracting_tensor_network.html
    +++ b/docs/_build/html/tutorials/2_contracting_tensor_network.html
    @@ -6,7 +6,7 @@
         
         
     
    -    Contracting and Differentiating the Tensor Network — TensorKrowch 1.1.2 documentation
    +    Contracting and Differentiating the Tensor Network — TensorKrowch 1.1.3 documentation
         
       
       
    diff --git a/docs/_build/html/tutorials/3_memory_management.html b/docs/_build/html/tutorials/3_memory_management.html
    index 4a9c611..4181205 100644
    --- a/docs/_build/html/tutorials/3_memory_management.html
    +++ b/docs/_build/html/tutorials/3_memory_management.html
    @@ -6,7 +6,7 @@
         
         
     
    -    How to save Memory and Time with TensorKrowch (ADVANCED) — TensorKrowch 1.1.2 documentation
    +    How to save Memory and Time with TensorKrowch (ADVANCED) — TensorKrowch 1.1.3 documentation
         
       
       
    diff --git a/docs/_build/html/tutorials/4_types_of_nodes.html b/docs/_build/html/tutorials/4_types_of_nodes.html
    index e9f766a..a5aa028 100644
    --- a/docs/_build/html/tutorials/4_types_of_nodes.html
    +++ b/docs/_build/html/tutorials/4_types_of_nodes.html
    @@ -6,7 +6,7 @@
         
         
     
    -    The different Types of Nodes (ADVANCED) — TensorKrowch 1.1.2 documentation
    +    The different Types of Nodes (ADVANCED) — TensorKrowch 1.1.3 documentation
         
       
       
    diff --git a/docs/_build/html/tutorials/5_subclass_tensor_network.html b/docs/_build/html/tutorials/5_subclass_tensor_network.html
    index 14bb3c3..607a572 100644
    --- a/docs/_build/html/tutorials/5_subclass_tensor_network.html
    +++ b/docs/_build/html/tutorials/5_subclass_tensor_network.html
    @@ -6,7 +6,7 @@
         
         
     
    -    How to subclass TensorNetwork to build Custom Models — TensorKrowch 1.1.2 documentation
    +    How to subclass TensorNetwork to build Custom Models — TensorKrowch 1.1.3 documentation
         
       
       
    diff --git a/docs/_build/html/tutorials/6_mix_with_pytorch.html b/docs/_build/html/tutorials/6_mix_with_pytorch.html
    index bc91b62..5555ac7 100644
    --- a/docs/_build/html/tutorials/6_mix_with_pytorch.html
    +++ b/docs/_build/html/tutorials/6_mix_with_pytorch.html
    @@ -6,7 +6,7 @@
         
         
     
    -    Creating a Hybrid Neural-Tensor Network Model — TensorKrowch 1.1.2 documentation
    +    Creating a Hybrid Neural-Tensor Network Model — TensorKrowch 1.1.3 documentation
         
       
       
    diff --git a/docs/tutorials/0_first_steps.rst b/docs/tutorials/0_first_steps.rst
    index 05997e1..153719f 100644
    --- a/docs/tutorials/0_first_steps.rst
    +++ b/docs/tutorials/0_first_steps.rst
    @@ -134,7 +134,7 @@ possible classes.
     ::
     
         # Check if GPU is available
    -    device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
    +    device = torch.device('cuda:0' if torch.cuda.is_available() else 'cpu')
     
         # Instantiate model
         mps = tk.models.MPSLayer(n_features=image_size[0] * image_size[1] + 1,
    
    From 3ad9032d10fdfab3e38ea282d8f742e6927969c9 Mon Sep 17 00:00:00 2001
    From: joserapa98 
    Date: Wed, 15 May 2024 10:25:05 +0200
    Subject: [PATCH 14/14] Update version
    
    ---
     tensorkrowch/__init__.py | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/tensorkrowch/__init__.py b/tensorkrowch/__init__.py
    index 615eb13..52e9162 100644
    --- a/tensorkrowch/__init__.py
    +++ b/tensorkrowch/__init__.py
    @@ -6,7 +6,7 @@
     """
     
     # Version
    -__version__ = '1.1.3'
    +__version__ = '1.1.4'
     
     # Network components
     from tensorkrowch.components import Axis
    

    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Ú(p*t~jr<@p1M&yM(g29huQp;b!+hYkI!w|gC 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 diff --git a/docs/_build/doctrees/models.doctree b/docs/_build/doctrees/models.doctree index eb19824292d53f2486b706d3eded971590b649e6..3e21eec2f76e40e77113e6dff498d0a39b3a38f1 100644 GIT binary patch literal 1247823 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