#include "missing.h" Missing::Missing(const vector & missing_site, const map & hap_list, const vector & content, int size){ if(size==0) return; this->size = size; // # of SNPs this->count=0; this->ind_clus=0; this->ind_1df=0; gcode = new int[size]; memset(gcode,0,size*sizeof(int)); for(int i=0;i *vec; if(missing_site.size()==size){ vec = new vector(); vec->push_back(gcode); } else vec = complete_missing_genotype(0); int vsize = vec->size(); for(int i=0;i > hv = geno->get_hap_vec(); if(hv.size()>0) missing_pat_genotype.push_back(geno); else delete geno; } if(vsize>1){ for(int k=0;kclear(); delete vec; keep(missing_site,hap_list,content); dim = sites.size(); int row=hap_list.size(); if(row==0) row=1<0){ weight = new double*[dim]; for(int i=0;i *complete_geno_code = missing_pat_genotype[i]->get_geno_code(); int complete_geno = complete_geno_code->size(); for(int j=0;j *Missing::complete_missing_genotype(int index){ int code = gcode[index]; if(index==size-1){ vector *vec = new vector(); if(code==-1){ int *a1 = new int[size]; memset(a1,0,size*sizeof(int)); a1[size-1] = code; vec->push_back(a1); } else if(code==0){ int *a1 = new int[size]; int *a2 = new int[size]; int *a3 = new int[size]; memset(a1,0,size*sizeof(int)); memset(a2,0,size*sizeof(int)); memset(a3,0,size*sizeof(int)); a1[size-1]=0; a2[size-1]=1; a3[size-1]=2; vec->push_back(a1); vec->push_back(a2); vec->push_back(a3); } return vec; } vector *vec = complete_missing_genotype(index+1); int pos = index; if(code==-1){ for(int i=0;isize();i++) (*vec)[i][pos] = code; return vec; } // else if code == 0 int vsize = vec->size(); for(int i=0;ipush_back(a1); vec->push_back(a2); } return vec; } void Missing::set_weight(map, double> & geno_freq_table, map, int> & hap_pair_map, int **count){ int col = missing_pat_genotype.size(); for(int i=0;i > hv = missing_pat_genotype[i]->get_hap_vec(); if(hv.size()==1){ gfreq[i] = geno_freq_table[hv[0]]; loc = hap_pair_map[hv[0]]; for(int j=0;j0) weight[j][i] = double(count[sites[j]][loc])/2.0; } } else if(hv.size()>1){ for(int j=0;j0) weight[k][i]+=count[sites[k]][loc]*geno_freq_table[hv[j]]; } } for(int j=0;j, double> & geno_freq_table){ for(int i=0;i0){ nonzero.push_back(i); break; } } } for(int i=0;i & hap_freq_table, map, int> & hap_pair_map, int **count, double **rst){ int row = hap_freq_table.size(); for(int i=0;i > hv = missing_pat_genotype[i]->get_hap_vec(); if(hv.size()>1){ memset(matrix1,0,(row-1)*sizeof(double)); for(int j=0;j0){ for(int l=0;l & hap_freq_table, double **mul_clus, int col_clus){ if(dim>0){ ind_clus = 1; int row = hap_freq_table.size(); derivative_clus = multiply(derivative,dim,row-1,mul_clus,row-1,col_clus); } } void Missing::compute_derivative_1df(map & hap_freq_table, double **mul_1df, int col_1df){ if(dim>0){ ind_1df = 1; int row = hap_freq_table.size(); derivative_1df = multiply(derivative,dim,row-1,mul_1df,row-1,col_1df); } } void Missing::keep(const vector & missing_site, const map & hap_list, const vector & content){ sites.clear(); int tot = 1<0 && missing_site.size() hcom_hinc; if(hap_list.size()==0 || hap_list.size()==tot){ int *hcode = new int[size]; memset(hcode,0,size*sizeof(int)); vector *vec=complete_missing_haplotype(hcode,0); for(int i=0;iclear(); delete vec; } else{ int hap_num = content.size(); for(int i=0;i e_map; int loc=0; map::iterator iter = hcom_hinc.begin(); while(iter!=hcom_hinc.end()){ int h_part = iter->second; if(e_map.find(h_part)==e_map.end()) e_map[h_part] = loc; loc++; iter++; } loc=0; iter = e_map.begin(); while(loc!=e_map.size()-1){ sites.push_back(iter->second); iter++; loc++; } } } vector *Missing::complete_missing_haplotype(int *hcode, int index){ int code = hcode[index]; if(index==size-1){ vector *vec = new vector(); if(code==-1){ int *a1 = new int[size]; memset(a1,0,size*sizeof(int)); a1[size-1] = code; vec->push_back(a1); } else if(code==0){ int *a1 = new int[size]; int *a2 = new int[size]; memset(a1,0,size*sizeof(int)); memset(a2,0,size*sizeof(int)); a1[size-1]=0; a2[size-1]=1; vec->push_back(a1); vec->push_back(a2); } return vec; } vector *vec = complete_missing_haplotype(hcode,index+1); int pos = index; if(code==-1){ for(int i=0;isize();i++) (*vec)[i][pos] = code; return vec; } // else if code == 0 int vsize = vec->size(); for(int i=0;ipush_back(a1); } return vec; } Missing::~Missing(){ delete[] gcode; for(int i=0;i0){ for(int i=0;i & s_vec, int m){ for(int i=0;i