[docs]defis_toeplitz_matrix(mat):""" Checks if ``matrix`` has a Toeplitz structure Parameters ---------- mat : np.ndarray Input array to check Returns ------- Boolean indicating if Toeplitz matrix """n,m=mat.shape# Horizontal diagonalsforoffinrange(1,m):ifnp.ptp(np.diagonal(mat,offset=off)):returnFalse# Vertical diagonalsforoffinrange(1,n):ifnp.ptp(np.diagonal(mat,offset=-off)):returnFalse# we only reach here when all elements # in given diagonal are same returnTrue
# Currently recursive, TODO: improve efficiency
[docs]defis_toeplitz_tensor(tensor,modes=None):""" Checks if ``tensor`` has Toeplitz structure Parameters ---------- tensor : Tensor Input tensor to check Returns ------- Boolean indicating if Toeplitz matrix """iftensor.order<=2:returnis_toeplitz_matrix(tensor.data)ifmodesisNone:modes=[0,1]sz=np.asarray(tensor.shape)availmodes=np.setdiff1d(np.arange(len(sz)),modes)foridx,modeinenumerate(availmodes):dim=sz[mode]# Go through each dimforiinrange(dim):t=tensor.access(i,mode)t=Tensor(t)ifnot(is_toeplitz_tensor(t)):print("Wrong slice: \n{}\n{}".format(t,(i,idx)))returnFalsereturnTrue
[docs]defis_super_symmetric(tensor):""" Checks if ``tensor`` has supers-symmetric structure Parameters ---------- tensor : Tensor Input tensor to check Returns ------- Boolean indicating if super-symmetric tensor """tensor=tensor.dataidx=np.arange(len(tensor.shape))inds=itertools.permutations(idx)foriininds:s=np.transpose(tensor,np.array(i))ifnotnp.allclose(tensor,s,atol=1e-4,equal_nan=True):print("{}\n is not the same as \n{}".format(tensor,s))returnFalsereturnTrue