def backward_tensor(self, y):
        """
        Transforms a series of triangular matrices y to the packed representation x (tf.tensors)
        
        :param y: unpacked tensor with shape self.num_matrices, self.N, self.N
        :return: packed tensor with shape self.num_matrices, (self.N**2 + self.N) / 2
        """
        if self.squeeze:
            y = tf.expand_dims(y, axis=0)
        indices = np.vstack(np.tril_indices(self.N)).T
        indices = itertools.product(np.arange(self.num_matrices), indices)
        indices = np.array([np.hstack(x) for x in indices])
        triangular = tf.gather_nd(y, indices)
        return tf.reshape(triangular, [self.num_matrices, (self.N**2 + self.N) // 2])
def backward_tensor ( self , y ) : if self . squeeze : y = tf . expand_dims ( y , axis = 0 ) indices = np . vstack ( np . tril_indices ( self . N ) ) . T indices = itertools . product ( np . arange ( self . num_matrices ) , indices ) indices = np . array ( [ np . hstack ( x ) for x in indices ] ) triangular = tf . gather_nd ( y , indices ) return tf . reshape ( triangular , [ self . num_matrices , ( self . N ** 2 + self . N ) // 2 ] )
Transforms a series of triangular matrices y to the packed representation x (tf.tensors)
        
        :param y: unpacked tensor with shape self.num_matrices, self.N, self.N
        :return: packed tensor with shape self.num_matrices, (self.N**2 + self.N) / 2