def check_design_matrix(ifgram_file, weight_func='var'): """ Check Rank of Design matrix for weighted inversion """ date12_list = ifgramStack(ifgram_file).get_date12_list(dropIfgram=True) A = ifgramStack.get_design_matrix4timeseries(date12_list)[0] if weight_func == 'no': if np.linalg.matrix_rank(A) < A.shape[1]: print( 'WARNING: singular design matrix! Inversion result can be biased!' ) print('continue using its SVD solution on all pixels') else: if np.linalg.matrix_rank(A) < A.shape[1]: print('ERROR: singular design matrix!') print( ' Input network of interferograms is not fully connected!') print(' Can not invert the weighted least square solution.') print('You could try:') print( ' 1) Add more interferograms to make the network fully connected:' ) print(' a.k.a., no multiple subsets nor network islands') print(" 2) Use '-w no' option for non-weighted SVD solution.") raise Exception() return A
def read_network_info(inps): ext = os.path.splitext(inps.file)[1] print('read temporal/spatial baseline info from file:', inps.file) ## 1. Read date, pbase, date12 and coherence if ext == '.h5': inps.date12List = ifgramStack(inps.file).get_date12_list(dropIfgram=False) inps.dateList = ifgramStack(inps.file).get_date_list(dropIfgram=False) inps.pbaseList = ifgramStack(inps.file).get_perp_baseline_timeseries(dropIfgram=False) inps.cohList = ut.spatial_average(inps.file, datasetName=inps.dsetName, maskFile=inps.maskFile, saveList=True, checkAoi=False)[0] elif ext == '.txt': inps.date12List = np.loadtxt(inps.file, dtype=bytes).astype(str)[:,0].tolist() # date12List --> dateList mDates = [i.split('_')[0] for i in inps.date12List] sDates = [i.split('_')[1] for i in inps.date12List] inps.dateList = sorted(list(set(mDates + sDates))) # pbase12List + date12List --> pbaseList pbase12List = np.loadtxt(inps.file, dtype=bytes).astype(float)[:,3] A = ifgramStack.get_design_matrix4timeseries(inps.date12List)[0] inps.pbaseList = np.zeros(len(inps.dateList), dtype=np.float32) inps.pbaseList[1:] = np.linalg.lstsq(A, np.array(pbase12List), rcond=None)[0] # cohList inps.cohList = np.loadtxt(inps.file, dtype=bytes).astype(float)[:,1] else: raise ValueError('un-recognized input file extention:', ext) print('number of acquisitions: {}'.format(len(inps.dateList))) print('number of interferograms: {}'.format(len(inps.date12List))) # Optional: Read dropped date12 / date inps.dateList_drop = [] inps.date12List_drop = [] if ext == '.h5': inps.date12List_keep = ifgramStack(inps.file).get_date12_list(dropIfgram=True) inps.date12List_drop = sorted(list(set(inps.date12List) - set(inps.date12List_keep))) print('-'*50) print('number of interferograms marked as drop: {}'.format(len(inps.date12List_drop))) print('number of interferograms marked as keep: {}'.format(len(inps.date12List_keep))) mDates = [i.split('_')[0] for i in inps.date12List_keep] sDates = [i.split('_')[1] for i in inps.date12List_keep] inps.dateList_keep = sorted(list(set(mDates + sDates))) inps.dateList_drop = sorted(list(set(inps.dateList) - set(inps.dateList_keep))) print('number of acquisitions marked as drop: {}'.format(len(inps.dateList_drop))) if len(inps.dateList_drop) > 0: print(inps.dateList_drop) return inps