/* * 组合数学中的选与不选例子 */ int subsum(int n,int a[],int cur,int m,int idx) { int i; #ifdef DEBUG printf("m:%d,cur:%d,idx:%d,n:%d\n",m,cur,idx,n); #endif if(m < 0 || idx > n) // || (m != 0 && cur > m)) return 0; else if(0 == m) { for(i = 0;i < idx;i++) printf("%d ",a[i]); printf("\n"); return 0; } for(i = cur;i < n;i++) if(i <= m) break; if(i != n) { a[idx] = i; subsum(n,a,i+1,m-i,idx+1); } if(cur <= m) subsum(n,a,cur+1,m,idx); return 0; }
int main(int argc,char *argv[]) { int a[10],n,m; n = 10; m = 11; printf("n:%d,m:%d\n",n,m); subsum(n,a,1,m,0); return 0; }
int main(){ int sum = 9; std::vector<int> num_set; num_set.push_back(3); num_set.push_back(34); num_set.push_back(4); num_set.push_back(12); num_set.push_back(5); num_set.push_back(2); SumArray sum_array(sum+1,0); SumMap sum_map(num_set.size()+1,sum_array); TakenMap taken_map(sum_map); int result = subsum(num_set,sum_map,taken_map,num_set.size(),sum); std::cout<<"result:"<<result<<std::endl; system("PAUSE"); }
void adajoint_chr(char **R_file_prefix, int *R_method, int *R_nperm, int *R_seed, int *R_nthread, int *R_nsnp, int *R_ngene, double *R_vU, double *R_score0, double *R_vV, int *R_vgene_idx, int *R_gene_start, int *R_gene_end, int *R_vgene_cutpoint, int *R_gene_cutpoint_start, int *R_gene_cutpoint_end, double *R_gene_pval, int *R_arr_rank, int *R_sel_id, int *R_marg_id){ int len_file_prefix = strlen(*R_file_prefix); char *file_prefix = new char[len_file_prefix + 1]; file_prefix[0] = '\0'; strcat(file_prefix, *R_file_prefix); int method = *R_method; assert(method == 1 || method == 2); int nperm = *R_nperm; int seed = *R_seed; int nthread = *R_nthread; int nsnp = *R_nsnp; int ngene = *R_ngene; fvec score0; fmat V; fmat U; load_score0(R_score0, score0, nsnp); load_cov(R_vV, V, nsnp); load_U(R_vU, U, nsnp); imat gene_idx; // index of SNPs in a gene load_gene_idx(R_vgene_idx, R_gene_start, R_gene_end, gene_idx, ngene); imat cutpoint; load_gene_cutpoint(R_vgene_cutpoint, R_gene_cutpoint_start, R_gene_cutpoint_end, cutpoint, ngene); string fprefix (file_prefix); svec gene_out (ngene, fprefix); for(int g = 0; g < ngene; ++g){ ostringstream gid; gid << g; gene_out[g] = gene_out[g] + string("GID.") + gid.str() + string(".bin"); } // write obs statistics for all genes imat sel_id(ngene); ivec marg_id(ngene); for(int g = 0; g < ngene; ++g){ fstream gout(gene_out[g].c_str(), ios::out | ios::binary); if(!gout){ error("Fail to write observed statistics to file"); } fvec S; fmat Sigma; extract_score(S, score0, gene_idx[g]); extract_cov(Sigma, V, gene_idx[g]); fvec s; int ncp = cutpoint[g].size(); int mc = cutpoint[g][ncp - 1]; if(method == 1){ search1(s, sel_id[g], marg_id[g], S, Sigma, mc); }else{//assert(method == 2) search2(s, sel_id[g], marg_id[g], S, Sigma, mc); } for(int k = 0; k < ncp; ++k){ float u = s[cutpoint[g][k]]; gout.write((char*)(&u), sizeof(u)); } gout.close(); } int i_sel_id = -1; for(int g = 0; g < ngene; ++g){ R_marg_id[g] = gene_idx[g][marg_id[g]] + 1; for(int k = 0; k < sel_id[g].size(); ++k){ ++i_sel_id; R_sel_id[i_sel_id] = gene_idx[g][sel_id[g][k]] + 1; } int nn = gene_idx[g].size() - sel_id[g].size(); while(nn){ ++i_sel_id; R_sel_id[i_sel_id] = -1; --nn; } } int ngap = min(10000, nperm); int nblock = nperm / ngap; for(int b = 0; b < nblock; ++b){ fmat null(ngap, fvec (nsnp, .0f)); drand48_data buf; // compute null score #pragma omp parallel num_threads(nthread) private(buf) { srand48_r(seed + b * nthread + omp_get_thread_num(), &buf); #pragma omp for for(int i = 0; i < ngap; ++i){ fvec rn; rnorm(buf, nsnp, rn); for(int j = 0; j < nsnp; ++j){ null[i][j] = .0f; for(int k = 0; k < nsnp; ++k){ null[i][j] += rn[k] * U[k][j]; } } } } // write null statistics to local files (per gene) #pragma omp parallel num_threads(min(nthread, ngene)) { #pragma omp for for(int g = 0; g < ngene; ++g){ ofstream gout; gout.open(gene_out[g].c_str(), ios::out | ios::binary | ios::app); if(!gout){ error("Fail to write null statistics to file"); } fmat Sigma; extract_cov(Sigma, V, gene_idx[g]); int ns = gene_idx[g].size(); int ncp = cutpoint[g].size(); int mc = cutpoint[g][ncp - 1]; for(int i = 0; i < ngap; ++i){ fvec S; extract_score(S, null[i], gene_idx[g]); fvec s; ivec sel_id; int marg_id; if(method == 1){ search1(s, sel_id, marg_id, S, Sigma, mc); }else{ search2(s, sel_id, marg_id, S, Sigma, mc); } for(int k = 0; k < ncp; ++k){ float u = s[cutpoint[g][k]]; gout.write((char*)(&u), sizeof(u)); } } gout.close(); } } //fmat().swap(null); } // read null statistics (per gene) int irk = -1; for(int g = 0; g < ngene; ++g){ int ncp = cutpoint[g].size(); vector<VecStat> stat(ncp, VecStat (nperm + 1, STAT0)); fstream gin(gene_out[g].c_str(), ios::in | ios::binary); for(int i = 0; i < nperm + 1; ++i){ for(int j = 0; j < ncp; ++j){ float s = .0f; gin.read((char*)(&s), sizeof(s)); stat[j][i].stat = s; stat[j][i].id = i; } } gin.close(); if(remove(gene_out[g].c_str())){ error("Cannot delete gene output file"); } imat arr_rank(ncp, ivec (nperm + 1, 0)); #pragma omp parallel num_threads(min(ncp, nthread)) { #pragma omp for for(int j = 0; j < ncp; ++j){ sort(stat[j].begin(), stat[j].end(), descending); for(int i = 0; i < nperm + 1; ++i){ int id = stat[j][i].id; arr_rank[j][id] = i; } } } vector<VecStat>().swap(stat); ivec gene_min_p (nperm + 1, -1); ivec subsum(nthread, 0); ivec subtie(nthread, 0); int m = nperm + 1; for(int j = 0; j < ncp; ++j){ ++irk; R_arr_rank[irk] = arr_rank[j][0]; if(arr_rank[j][0] < m){ m = arr_rank[j][0]; } } gene_min_p[0] = m; #pragma omp parallel num_threads(nthread) { #pragma omp for for(int i = 1; i < nperm + 1; ++i){ int tid = omp_get_thread_num(); int m = nperm + 1; for(int j = 0; j < ncp; ++j){ if(arr_rank[j][i] < m){ m = arr_rank[j][i]; } } gene_min_p[i] = m; if(gene_min_p[i] < gene_min_p[0]){ subsum[tid] += 1; }else if(gene_min_p[i] == gene_min_p[0]){ subtie[tid] += 1; }else{ ; } } } R_gene_pval[g] = 1.0; int rep = 0; for(int t = 0; t < nthread; ++t){ R_gene_pval[g] += subsum[t]; rep += subtie[t]; } R_gene_pval[g] += rep / 2.0; R_gene_pval[g] /= nperm + 1; fstream gout(gene_out[g].c_str(), ios::out | ios::binary); if(!gout){ error("Fail to write gene statistics to file"); } for(int i = 0; i < nperm + 1; ++i){ gout.write((char*)(&(gene_min_p[i])), sizeof(gene_min_p[i])); } gout.close(); } delete[] file_prefix; }
void artp3(char **R_file_prefix, int *R_nperm, int *R_nthread, int *R_ngene, int *R_group_id, int *R_gene_id, int *R_pathway_cutpoint, int *R_ncp, double *R_pathway_pval, int *R_arr_rank, double *R_gene_pval){ int len_file_prefix = strlen(*R_file_prefix); char *file_prefix = new char[len_file_prefix + 1]; file_prefix[0] = '\0'; strcat(file_prefix, *R_file_prefix); int nperm = *R_nperm; int nthread = *R_nthread; int ngene = *R_ngene; int ncp = *R_ncp; assert(nthread == 1); ivec group_id; load_group_id(R_group_id, group_id, ngene); ivec gene_id; load_gene_id(R_gene_id, gene_id, ngene); ivec pathway_cutpoint; load_pathway_cutpoint(R_pathway_cutpoint, pathway_cutpoint, ncp); int max_cutpoint = pathway_cutpoint[ncp - 1]; string fprefix (file_prefix); svec gene_out (ngene, fprefix); for(int g = 0; g < ngene; ++g){ ostringstream cid; cid << group_id[g]; ostringstream gid; gid << gene_id[g]; gene_out[g] = gene_out[g] + string(".CID.") + cid.str() + string(".GID.") + gid.str() + string(".bin"); } vector<VecMinp> gene_stat (ngene, VecMinp(nperm + 1, MINP0)); imat gene_p_stat (ngene, ivec(nperm + 1, -1)); for(int g = 0; g < ngene; ++g){ fstream gin(gene_out[g].c_str(), ios::in | ios::binary); //ivec zero_loc; for(int i = 0; i < nperm + 1; ++i){ gin.read((char*)(&(gene_stat[g][i].stat)), sizeof(gene_stat[g][i].stat)); gene_stat[g][i].id = i; } gin.close(); if(remove(gene_out[g].c_str())){ error("Cannot delete gene output file"); } sort(gene_stat[g].begin(), gene_stat[g].end()); for(int i = 0; i < nperm + 1; ++i){ int id = gene_stat[g][i].id; gene_p_stat[g][id] = i; } VecMinp().swap(gene_stat[g]); } vector<VecMinp>().swap(gene_stat); for(int g = 0; g < ngene; ++g){ R_gene_pval[g] = (gene_p_stat[g][0] + 1.0) / (nperm + 1); } vector<VecStat> stat(ncp, VecStat (nperm + 1, STAT0)); for(int i = 0; i < nperm + 1; ++i){ fvec s(ngene, .0f); for(int g = 0; g < ngene; ++g){ s[g] = (float) log((gene_p_stat[g][i] + 1.0) / (nperm + 1)); } if(ngene > 1){ sort(s.begin(), s.end()); for(int g = 1; g <= max_cutpoint; ++g){ s[g] += s[g - 1]; } } for(int k = 0; k < ncp; ++k){ float u = -s[pathway_cutpoint[k]]; stat[k][i].stat = u; stat[k][i].id = i; } } imat().swap(gene_p_stat); imat arr_rank(ncp, ivec (nperm + 1, 0)); for(int k = 0; k < ncp; ++k){ sort(stat[k].begin(), stat[k].end(), descending); for(int i = 0; i < nperm + 1; ++i){ int id = stat[k][i].id; arr_rank[k][id] = i; } VecStat().swap(stat[k]); } vector<VecStat>().swap(stat); ivec pathway_min_p(nperm + 1, -1); ivec subsum(nthread, 0); ivec subtie(nthread, 0); int m = nperm + 1; for(int k = 0; k < ncp; ++k){ R_arr_rank[k] = arr_rank[k][0]; if(arr_rank[k][0] < m){ m = arr_rank[k][0]; } } pathway_min_p[0] = m; for(int i = 1; i < nperm + 1; ++i){ int tid = 0; int m = nperm + 1; for(int k = 0; k < ncp; ++k){ if(arr_rank[k][i] < m){ m = arr_rank[k][i]; } } pathway_min_p[i] = m; if(pathway_min_p[i] < pathway_min_p[0]){ subsum[tid] += 1; }else if(pathway_min_p[i] == pathway_min_p[0]){ subtie[tid] += 1; }else{ ; } } *R_pathway_pval = 1.0; int rep = 0; for(int t = 0; t < nthread; ++t){ *R_pathway_pval += subsum[t]; rep += subtie[t]; } *R_pathway_pval += rep / 2.0; *R_pathway_pval /= nperm + 1; delete[] file_prefix; }
void artp3_chr(char **R_file_prefix, int *R_method, int *R_nperm, int *R_seed, int *R_nthread, int *R_nsnp, int *R_ngene, double *R_vU, double *R_score0, double *R_vV, int *R_vgene_idx, int *R_gene_start, int *R_gene_end, int *R_vgene_cutpoint, int *R_gene_cutpoint_start, int *R_gene_cutpoint_end, double *R_gene_pval, int *R_arr_rank, int *R_sel_id, int *R_marg_id){ int len_file_prefix = strlen(*R_file_prefix); char *file_prefix = new char[len_file_prefix + 1]; file_prefix[0] = '\0'; strcat(file_prefix, *R_file_prefix); int method = *R_method; assert(method == 3); if(method == 3){ ; } int nperm = *R_nperm; int seed = *R_seed; int nthread = *R_nthread; int nsnp = *R_nsnp; int ngene = *R_ngene; assert(nthread == 1); fvec score0; fvec sigma2; fmat U; fmat V; load_score0(R_score0, score0, nsnp); load_cov(R_vV, V, nsnp); load_sigma2(V, sigma2); load_U(R_vU, U, nsnp); imat gene_idx; // index of SNPs in a gene load_gene_idx(R_vgene_idx, R_gene_start, R_gene_end, gene_idx, ngene); imat cutpoint; load_gene_cutpoint(R_vgene_cutpoint, R_gene_cutpoint_start, R_gene_cutpoint_end, cutpoint, ngene); string fprefix (file_prefix); svec gene_out (ngene, fprefix); for(int g = 0; g < ngene; ++g){ ostringstream gid; gid << g; gene_out[g] = gene_out[g] + string("GID.") + gid.str() + string(".bin"); } // write obs statistics for all genes imat sel_id(ngene); ivec marg_id(ngene); for(int g = 0; g < ngene; ++g){ fstream gout(gene_out[g].c_str(), ios::out | ios::binary); if(!gout){ error("Fail to write observed statistics to file"); } int ns = gene_idx[g].size(); int ncp = cutpoint[g].size(); int max_cutpoint = cutpoint[g][ncp - 1]; fvec s (ns, .0f); VecStat vs (ns, STAT0); for(int j = 0; j < ns; ++j){ s[j] = score0[gene_idx[g][j]]; s[j] = pchisq(s[j] * s[j] / sigma2[gene_idx[g][j]], 1, false, true); vs[j].stat = -s[j]; vs[j].id = j; } sort(vs.begin(), vs.end(), descending); marg_id[g] = vs[0].id; for(int j = 0; j < ns; ++j){ sel_id[g].push_back(vs[j].id); } sort(s.begin(), s.end()); for(int j = 1; j <= max_cutpoint; ++j){ s[j] += s[j - 1]; } for(int k = 0; k < ncp; ++k){ float u = -s[cutpoint[g][k]]; gout.write((char*)(&u), sizeof(u)); } gout.close(); } int i_sel_id = -1; for(int g = 0; g < ngene; ++g){ R_marg_id[g] = gene_idx[g][marg_id[g]] + 1; for(int k = 0; k < sel_id[g].size(); ++k){ ++i_sel_id; R_sel_id[i_sel_id] = gene_idx[g][sel_id[g][k]] + 1; } int nn = gene_idx[g].size() - sel_id[g].size(); while(nn){ ++i_sel_id; R_sel_id[i_sel_id] = -1; --nn; } } int ngap = min(10000, nperm); int nblock = nperm / ngap; srand(seed); for(int b = 0; b < nblock; ++b){ fmat null(ngap, fvec (nsnp, .0f)); // compute null statistics for(int i = 0; i < ngap; ++i){ fvec rn; rnorm(nsnp, rn); for(int j = 0; j < nsnp; ++j){ null[i][j] = .0f; for(int k = 0; k < nsnp; ++k){ null[i][j] += rn[k] * U[k][j]; } null[i][j] = null[i][j] * null[i][j] / sigma2[j]; null[i][j] = pchisq(null[i][j], 1, false, true); } } // write null statistics to local files (per gene) for(int g = 0; g < ngene; ++g){ ofstream gout; gout.open(gene_out[g].c_str(), ios::out | ios::binary | ios::app); if(!gout){ error("Fail to write null statistics to file"); } int ns = gene_idx[g].size(); int ncp = cutpoint[g].size(); int max_cutpoint = cutpoint[g][ncp - 1]; for(int i = 0; i < ngap; ++i){ fvec s(ns, .0f); for(int j = 0; j < ns; ++j){ s[j] = null[i][gene_idx[g][j]]; } sort(s.begin(), s.end()); for(int j = 1; j <= max_cutpoint; ++j){ s[j] += s[j - 1]; } for(int k = 0; k < ncp; ++k){ float u = -s[cutpoint[g][k]]; gout.write((char*)(&u), sizeof(u)); } } gout.close(); } //fmat().swap(null); } // read null statistics (per gene) int irk = -1; for(int g = 0; g < ngene; ++g){ int ncp = cutpoint[g].size(); vector<VecStat> stat(ncp, VecStat (nperm + 1, STAT0)); fstream gin(gene_out[g].c_str(), ios::in | ios::binary); for(int i = 0; i < nperm + 1; ++i){ for(int j = 0; j < ncp; ++j){ float s = .0f; gin.read((char*)(&s), sizeof(s)); stat[j][i].stat = s; stat[j][i].id = i; } } gin.close(); if(remove(gene_out[g].c_str())){ error("Cannot delete gene output file"); } imat arr_rank(ncp, ivec (nperm + 1, 0)); for(int j = 0; j < ncp; ++j){ sort(stat[j].begin(), stat[j].end(), descending); for(int i = 0; i < nperm + 1; ++i){ int id = stat[j][i].id; arr_rank[j][id] = i; } } vector<VecStat>().swap(stat); ivec gene_min_p (nperm + 1, -1); ivec subsum(nthread, 0); ivec subtie(nthread, 0); int m = nperm + 1; for(int j = 0; j < ncp; ++j){ ++irk; R_arr_rank[irk] = arr_rank[j][0]; if(arr_rank[j][0] < m){ m = arr_rank[j][0]; } } gene_min_p[0] = m; for(int i = 1; i < nperm + 1; ++i){ int tid = 0; int m = nperm + 1; for(int j = 0; j < ncp; ++j){ if(arr_rank[j][i] < m){ m = arr_rank[j][i]; } } gene_min_p[i] = m; if(gene_min_p[i] < gene_min_p[0]){ subsum[tid] += 1; }else if(gene_min_p[i] == gene_min_p[0]){ subtie[tid] += 1; }else{ ; } } R_gene_pval[g] = 1.0; int rep = 0; for(int t = 0; t < nthread; ++t){ R_gene_pval[g] += subsum[t]; rep += subtie[t]; } R_gene_pval[g] += rep / 2.0; R_gene_pval[g] /= nperm + 1; fstream gout(gene_out[g].c_str(), ios::out | ios::binary); if(!gout){ error("Fail to write gene statistics to file"); } for(int i = 0; i < nperm + 1; ++i){ gout.write((char*)(&(gene_min_p[i])), sizeof(gene_min_p[i])); } gout.close(); } delete[] file_prefix; }