Esempio n. 1
0
 def calculate_divided_entropy(self, dot_index='all'):
     if operator.eq(dot_index, 'all'):
         dot_index = list(range(self.tensor_info['n_length']))
     elif isinstance(dot_index, int):
         dot_index = [dot_index]
     dot_index = tc.tensor(dot_index).reshape(-1)
     dot_index_sorted = dot_index.sort()
     entropy = dict()
     for ii in dot_index_sorted[0]:
         self.mps_regularization(ii)
         u, s, v = wf.tensor_svd(self.tensor_data[ii], index_right=2)
         s = s[s > 0]
         s /= s.norm()
         s_tmp = s ** 2
         entropy[ii] = -tc.einsum('a,a->', s_tmp, tc.log(s_tmp))
     return entropy
 def move_regular_center2forward(self):
     # self.reverse_mps()
     # self.move_regular_center2next()
     # self.reverse_mps()
     tensor_index = self.tensor_info['regular_center']
     u, s, v = wf.tensor_svd(self.tensor_data[tensor_index], index_left=0)
     if self.tensor_info['normalization_mode'] == 'on':
         s /= s.norm()
     s = s[s > self.tensor_info['cutoff']]
     dimension_middle = min([len(s), self.tensor_info['regular_bond_dimension']])
     u = u[:, 0:dimension_middle].reshape(-1, dimension_middle)
     s = s[0:dimension_middle]
     v = v[:, 0:dimension_middle].reshape(-1, dimension_middle)
     self.tensor_data[tensor_index] = v.t().reshape(
         dimension_middle, self.tensor_data[tensor_index].shape[1],
         self.tensor_data[tensor_index].shape[2])
     self.tensor_data[tensor_index - 1] = torch.einsum(
         'ijk,kl->ijl',
         [self.tensor_data[tensor_index - 1], u.mm(torch.diag(s))])
     self.tensor_info['regular_center'] -= 1
 def move_regular_center2next(self):
     # self.reverse_mps()
     # self.move_regular_center2forward()
     # self.reverse_mps()
     tensor_index = self.tensor_info['regular_center']
     u, s, v = wf.tensor_svd(self.tensor_data[tensor_index], index_right=2)
     if self.tensor_info['normalization_mode'] == 'on':
         s /= s.norm()
     s = s[s > self.tensor_info['cutoff']]
     dimension_middle = min([len(s), self.tensor_info['regular_bond_dimension']])
     u = u[:, 0:dimension_middle].reshape(-1, dimension_middle)
     s = s[0:dimension_middle]
     v = v[:, 0:dimension_middle].reshape(-1, dimension_middle)
     self.tensor_data[tensor_index] = u.reshape(
         self.tensor_data[tensor_index].shape[0],
         self.tensor_data[tensor_index].shape[1], dimension_middle)
     self.tensor_data[tensor_index + 1] = torch.einsum(
         'ij,jkl->ikl',
         [(torch.diag(s)).mm(v.t()), self.tensor_data[tensor_index+1]])
     self.tensor_info['regular_center'] += 1