patDict = OrderedDict(sorted({}.items(), key= lambda t:t[1])) #axis dict, patient mode
medDict =  OrderedDict(sorted({}.items(), key= lambda t:t[1])) #axis dict, med mode
jdDict = OrderedDict(sorted({}.items(), key= lambda t:t[1])) #axis dict, jd mode
jdrangeDict = OrderedDict(sorted({}.items(), key= lambda t:t[1])) #axis dict, jdrange mode
for pt in l_patients_for_tensor:
    patDict[pt] = len(patDict)
for med in l_med_names_unique: 
    medDict[med] = len(medDict)
for jdrange in l_jdrange_names_unique:
    jdrangeDict[jdrange] = len(jdrangeDict)
axisDict = {0: patDict, 1: jdrangeDict, 2:medDict}


#df_MAP_CHANGE = df_MAP_CHANGE_finite[df_MAP_CHANGE_finite['RUID'].isin(l_patients_for_tensor)]
df_MAP_CHANGE['MAP_CHANGE_GOOD'] = df_MAP_CHANGE['MEDIAN_MAP_CHANGE']<=-2 
df_MAP_CHANGE['MAP_CHANGE_GOOD'] = df_MAP_CHANGE['MAP_CHANGE_GOOD'].astype('int')
df_MAP_CHANGE = df_MAP_CHANGE.sort(['RUID'], ascending=1)
l_patClass_allpts = df_MAP_CHANGE['MAP_CHANGE_GOOD'] #patient classifications
l_patClass_allfinitepts = list(df_MAP_CHANGE[df_MAP_CHANGE.RUID.isin(l_all_pts_with_MEDS_JDRANGE)]['MAP_CHANGE_GOOD'])

od_patClass_for_tensor = OrderedDict(zip(patDict.keys(), l_patClass_allfinitepts)) #OrderedDict of patient classifications

#save the tensor
tensorIO.saveSingleTensor(sparse_tensor_all_finite, axisDict, od_patClass_for_tensor, "htn-allfinite-tensor-{0}.dat") #


############################################################################################################
############################################################################################################
############################################################################################################

# build SPARSE tensor from our data
nparr_data_by_pt = np.array(l_data_pt_med_jdrange)
num_dims = len(nparr_data_by_pt.shape)
nnz = np.nonzero(nparr_data_by_pt)
data_values = nparr_data_by_pt[nnz].flatten()
data_values = np.reshape(data_values, (len(data_values), 1))
nonzero_subs = np.zeros((len(data_values), num_dims))
nonzero_subs.dtype = 'int'
for n in range(num_dims):
    nonzero_subs[:, n] = nnz[n]
sparse_tensor_first_10_ruid = sptensor.sptensor(nonzero_subs, data_values)


#save the tensor
tensorIO.saveSingleTensor(sparse_tensor_first_10_ruid, axisDict, od_patClass_first_10_ruid, "htn-first10-tensor-{0}.dat") #

### LEFT OFF HERE: june 25, 6pm ##################################################################

## load the tensor #######
loaded_X, loaded_axisDict, loaded_classDict = tensorIO.loadSingleTensor("htn-first10-tensor-{0}.dat")

## do the decomposition ######
#store the data in "data"
data = {'exptID': exptID, 'size': MSize, 'sparsity': AFill, "rank": R, "alpha": alpha, "gamma": gamma}

def calculateValues(TM, M):
    fms = TM.greedy_fms(M)
    fos = TM.greedy_fos(M)
    nnz = tensorTools.countTensorNNZ(M)
    return fms, fos, nnz
                                 key=lambda t: t[1]))  #axis dict, jdrange mode
for pt in l_patients_for_tensor:
    patDict[pt] = len(patDict)
for med in l_med_names_unique:
    medDict[med] = len(medDict)
for jdrange in l_jdrange_names_unique:
    jdrangeDict[jdrange] = len(jdrangeDict)
axisDict = {0: patDict, 1: jdrangeDict, 2: medDict}

#df_MAP_CHANGE = df_MAP_CHANGE_finite[df_MAP_CHANGE_finite['RUID'].isin(l_patients_for_tensor)]
df_MAP_CHANGE['MAP_CHANGE_GOOD'] = df_MAP_CHANGE['MEDIAN_MAP_CHANGE'] <= -2
df_MAP_CHANGE['MAP_CHANGE_GOOD'] = df_MAP_CHANGE['MAP_CHANGE_GOOD'].astype(
    'int')
df_MAP_CHANGE = df_MAP_CHANGE.sort(['RUID'], ascending=1)
l_patClass_allpts = df_MAP_CHANGE['MAP_CHANGE_GOOD']  #patient classifications
l_patClass_allfinitepts = list(df_MAP_CHANGE[df_MAP_CHANGE.RUID.isin(
    l_all_pts_with_MEDS_JDRANGE)]['MAP_CHANGE_GOOD'])

od_patClass_for_tensor = OrderedDict(
    zip(patDict.keys(),
        l_patClass_allfinitepts))  #OrderedDict of patient classifications

#save the tensor
tensorIO.saveSingleTensor(sparse_tensor_all_finite, axisDict,
                          od_patClass_for_tensor,
                          "htn-allfinite-tensor-{0}.dat")  #

############################################################################################################
############################################################################################################
############################################################################################################