def write_stra_matC(myfile, coeff_idx, coeffs, idx, dim_name, dims, level): mat_name = (getName(coeff_idx))[0] nonzero_coeffs = [coeff for coeff in coeffs if is_nonzero(coeff)] #add = 'std::array<unsigned, ' + str(len(nonzero_coeffs)) + '> ' + mat_name + str(idx) + '_subid = {' #add += ', '.join(['%s' % getActualBlockIndex( coeff_idx, i, dims, level ) \ # for i, c in enumerate(coeffs) if is_nonzero(c)]) #add += '};' #write_line(myfile, 1, add) add = 'std::array<T*,' + str( len(nonzero_coeffs)) + '> ' + mat_name + str(idx) + '_list = {' #add += ', '.join( [ str(c) for i, c in enumerate(coeffs) if is_nonzero(c) ] ) add += ', '.join([ 'const_cast<T*>(%s)' % (getBlockName(coeff_idx, i, dims, level)) for i, c in enumerate(coeffs) if is_nonzero(c) ]) add += '};' write_line(myfile, 1, add) add = 'std::array<T,' + str( len(nonzero_coeffs)) + '> ' + mat_name + str(idx) + '_coeff_list = {' add += ', '.join([str(c) for i, c in enumerate(coeffs) if is_nonzero(c)]) add += '};' write_line(myfile, 1, add)
def write_stra_matAB(myfile, coeff_idx, coeffs, idx, dim_name, dims, level): mat_name = (getName(coeff_idx))[0] nonzero_coeffs = [coeff for coeff in coeffs if is_nonzero(coeff)] add = 'std::array<unsigned, ' + str( len(nonzero_coeffs)) + '> ' + mat_name + str(idx) + '_subid = {' add += ', '.join(['%s' % getActualBlockIndex( coeff_idx, i, dims, level ) \ for i, c in enumerate(coeffs) if is_nonzero(c)]) add += '};' write_line(myfile, 1, add) add = 'std::array<T,' + str( len(nonzero_coeffs)) + '> ' + mat_name + str(idx) + '_coeff_list = {' add += ', '.join([str(c) for i, c in enumerate(coeffs) if is_nonzero(c)]) add += '};' write_line(myfile, 1, add) add = 'stra_tensor_view<T,' + str(len(nonzero_coeffs)) + '> ' add += mat_name + 'v' + str(idx) add += '(my_len_' + dim_name[0] + ', ' add += 'my_len_' + dim_name[1] + ', ' add += mat_name + '_divisor, const_cast<T*>(' + mat_name + '), ' add += mat_name + str(idx) + '_subid, ' + mat_name + str( idx) + '_coeff_list, ' add += 'my_stride_' + mat_name + '_' + dim_name[0] + ',' add += ' my_stride_' + mat_name + '_' + dim_name[1] add += ');' write_line(myfile, 1, add)
def write_stra_mat(myfile, coeff_idx, coeffs, idx, dim_name, dims, level): mat_name = (getName(coeff_idx))[0] nonzero_coeffs = [coeff for coeff in coeffs if is_nonzero(coeff)] add = 'stra_matrix_view<T,' + str(len(nonzero_coeffs)) + '> ' add += mat_name + 'v' + str(idx) + '({' + dim_name + '}, {' #add += ', '.join( ['const_cast<T*>(%s)' % (getSubMatName(coeff_idx, i, dims, level) ) for i, c in enumerate(coeffs) if is_nonzero(c)] ) add += ', '.join([ 'const_cast<T*>(%s)' % (getBlockName(coeff_idx, i, dims, level)) for i, c in enumerate(coeffs) if is_nonzero(c) ]) add += '}, {' add += ', '.join([str(c) for i, c in enumerate(coeffs) if is_nonzero(c)]) add += '}, {rs_' + mat_name + ', cs_' + mat_name + '});' write_line(myfile, 1, add)
def getActualBlockIndex( coeff_idx, item_idx, dims, level=1 ): my_mat_name = ( getName( coeff_idx ) )[ 0 ] if( coeff_idx == 0 ): mm = dims[0] nn = dims[1] elif( coeff_idx == 1 ): mm = dims[1] nn = dims[2] elif( coeff_idx == 2 ): mm = dims[0] nn = dims[2] else: print "Wrong coeff_idx\n" #my_partition_ii = item_idx / nn #my_partition_jj = item_idx % nn submat_idx = "" dividend = item_idx mm_base = 1 nn_base = 1 ii_idx = 0 jj_idx = 0 for level_idx in range( level ): remainder = dividend % ( mm * nn ) #remainder -> i, j (m_axis, n_axis) ii = remainder / nn jj = remainder % nn ii_idx = ii * mm_base + ii_idx jj_idx = jj * nn_base + jj_idx #submat_idx = str(remainder) + submat_idx dividend = dividend / ( mm * nn ) mm_base = mm_base * mm nn_base = nn_base * nn #return [ str(ii_idx), str(jj_idx) ] return str(ii_idx * nn_base + jj_idx)