[docs]classBlockDiagonalMatrixGenerator(BaseGenerator):"""The block diagonal Boolean matrix generator. This generation procedure produces factor matrices U and V with C1P (contiguous-1 property). The factors form a block diagonal matrix with overlap configuration (when overlap < 0, there's no overlap). The matrix is sorted by nature upon generation. Parameters ---------- m : int The number of rows in X. n : int, optional The number of columns in X. k : int, optional The rank. overlap : list of 2 floats in (-inf, 1.0) Overlap ratio for factor U (overlap among columns) and factor V (overlap among rows). """def__init__(self,m,n,k,overlap=[0.0,0.0]):super().__init__()self.check_params(m=m,n=n,k=k,overlap=overlap)assertself.overlap[0]<1andself.overlap[1]<1
[docs]defgenerate(self,seed=None):'''Generate a matrix. '''self.check_params(seed=seed)self.generate_factors()self.boolean_matmul()# self.sorted_index()# self.set_factor_info()self.to_sparse(type='csr')
[docs]defgenerate_factor(self,n,k,overlap):'''Generate a factor. '''L=n/(k-(k-1)*overlap)points_start=np.linspace(start=0,stop=n-L,num=k,endpoint=True,dtype=int)points_end=np.linspace(start=L,stop=n,num=k,endpoint=True,dtype=int)# build the C1P factor sparse matrixX=lil_matrix((n,k))forcinrange(k):X[points_start[c]:points_end[c],c]=1returnX