void label_node(struct SNPfrags* snpfrag, int node,int comp) // DFS search routine for connected component { int i=0; if (snpfrag[node].component == -1) { // fprintf(stdout," called %d node edges %d %d \n",node,snpfrag[node].edges,comp); snpfrag[node].component = comp; snpfrag[comp].csize++; for (i=0;i<snpfrag[node].edges;i++) label_node(snpfrag,snpfrag[node].elist[i].snp,comp); } }
void add_edges_fosmids(struct fragment* Flist,int fragments,struct SNPfrags* snpfrag,int snps,int* components) { int i=0,j=0,t=0,k=0,iter=0,maxdeg=0,avgdeg=0, mdelta=0,t1=0,t2=0,l=0; char allele; int csnps=0; for (i=0;i<snps;i++) snpfrag[i].edges=0; int varlist[4096]; char allelelist[4096]; int vars=0; for (i=0;i<fragments;i++) { // generate list of variants and alleles vars=0; for (j=0;j<Flist[i].blocks;j++) { for (k=0;k<Flist[i].list[j].len;k++) { varlist[vars] = Flist[i].list[j].offset+k; allelelist[vars] = Flist[i].list[j].hap[k]; vars++; if (vars >= 4096) break; } } // add edge between adjacent pair of variants in each fragment for (j=0;j<vars-1;j++) { t1 = varlist[j]; t2 = varlist[j+1]; snpfrag[t1].elist[snpfrag[t1].edges].snp = t2; snpfrag[t1].elist[snpfrag[t1].edges].frag = i; snpfrag[t1].elist[snpfrag[t1].edges].p[0] = allelelist[j]; snpfrag[t1].elist[snpfrag[t1].edges].p[1] = allelelist[k]; snpfrag[t1].edges++; snpfrag[t2].elist[snpfrag[t2].edges].snp = t1; snpfrag[t2].elist[snpfrag[t2].edges].frag = i; snpfrag[t2].elist[snpfrag[t2].edges].p[1] = allelelist[j]; snpfrag[t2].elist[snpfrag[t2].edges].p[0] = allelelist[k]; snpfrag[t2].edges++; } } // elist contains duplicates (due to multiple fragments), telist does not, feb 5 2013 // sort all edges lists once for all by snp number, this can be done faster using QSORT, see later code... for (i=0;i<snps;i++) qsort(snpfrag[i].elist,snpfrag[i].edges,sizeof(struct edge),edge_compare); for (i=0;i<snps;i++) { if (snpfrag[i].edges > maxdeg) maxdeg = snpfrag[i].edges; avgdeg += snpfrag[i].frags; if (snpfrag[i].edges ==0) continue; csnps++; if (snpfrag[i].component != -1) continue; // already labeled with component snpfrag[i].component = i; for (j=0;j<snpfrag[i].edges;j++) label_node(snpfrag,snpfrag[i].elist[j].snp,i); } for (i=0;i<fragments;i++) Flist[i].component = snpfrag[Flist[i].list[0].offset].component; // each fragment has a component fixed *components=0; int nodes_in_graph=0; for (i=0;i<snps;i++) { if (snpfrag[i].component ==i && snpfrag[i].csize > 1) { (*components)++; nodes_in_graph += snpfrag[i].csize; } //else if (snpfrag[i].component ==i || snpfrag[i].edges ==0) singletons++; } fprintf(stdout,"\nnumber of non-trivial connected components %d max-Degree %d connected variants %d coverage-per-variant %f \n",*components,maxdeg,nodes_in_graph,(double)avgdeg/(double)csnps); fprintf(stderr,"\nnumber of non-trivial connected components %d max-Degree %d connected variants %d coverage-per-variant %f \n",*components,maxdeg,nodes_in_graph,(double)avgdeg/(double)csnps); }
// for each fragment: add all pairwise edges between all variants in it, complexity = O(k^2) for 'k' length fragment void add_edges(struct fragment* Flist,int fragments,struct SNPfrags* snpfrag,int snps,int* components) { int i=0,j=0,t=0,k=0,iter=0,maxdeg=0,avgdeg=0, mdelta=0; int csnps=0; for (i=0;i<snps;i++) snpfrag[i].edges=0; for (i=0;i<fragments;i++) { for (j=0;j<Flist[i].blocks;j++) { for (k=0;k<Flist[i].list[j].len;k++) { for (t=0;t<Flist[i].blocks;t++) { for (iter=0;iter<Flist[i].list[t].len;iter++) { if (Flist[i].list[j].offset+k == Flist[i].list[t].offset+iter) continue; if (Flist[i].list[j].offset +k - Flist[i].list[t].offset+iter > mdelta) mdelta = Flist[i].list[j].offset +k - Flist[i].list[t].offset+iter; snpfrag[Flist[i].list[t].offset+iter].elist[snpfrag[Flist[i].list[t].offset+iter].edges].snp = Flist[i].list[j].offset+k; snpfrag[Flist[i].list[j].offset+k].elist[snpfrag[Flist[i].list[j].offset+k].edges].frag = i; snpfrag[Flist[i].list[t].offset+iter].elist[snpfrag[Flist[i].list[t].offset+iter].edges].frag = i; snpfrag[Flist[i].list[t].offset+iter].elist[snpfrag[Flist[i].list[t].offset+iter].edges].p[0] = Flist[i].list[t].hap[iter]; snpfrag[Flist[i].list[t].offset+iter].elist[snpfrag[Flist[i].list[t].offset+iter].edges].p[1] = Flist[i].list[j].hap[k] ; snpfrag[Flist[i].list[t].offset+iter].edges++; } } } } } // elist contains duplicates (due to multiple fragments), telist does not, feb 5 2013 // sort all edges lists once for all by snp number, this can be done faster using QSORT, see later code... for (i=0;i<snps;i++) qsort(snpfrag[i].elist,snpfrag[i].edges,sizeof(struct edge),edge_compare); for (i=0;i<snps;i++) { //fprintf(stdout," snp %d edges %d || ",i,snpfrag[i].edges); for (j=0;j<snpfrag[i].edges;j++) fprintf(stdout,"%d ",snpfrag[i].elist[j]); fprintf(stdout,"\n"); getchar(); if (snpfrag[i].edges > maxdeg) maxdeg = snpfrag[i].edges; avgdeg += snpfrag[i].frags; // edit here june 7 2012 if (snpfrag[i].edges ==0) continue; csnps++; if (snpfrag[i].component != -1) continue; // already labeled with component snpfrag[i].component = i; for (j=0;j<snpfrag[i].edges;j++) label_node(snpfrag,snpfrag[i].elist[j].snp,i); } for (i=0;i<fragments;i++) Flist[i].component = snpfrag[Flist[i].list[0].offset].component; // each fragment has a component fixed *components=0; int nodes_in_graph=0; for (i=0;i<snps;i++) { if (snpfrag[i].component ==i && snpfrag[i].csize > 1) { (*components)++; nodes_in_graph += snpfrag[i].csize; } //else if (snpfrag[i].component ==i || snpfrag[i].edges ==0) singletons++; } fprintf(stdout,"\nno of non-trivial connected components %d max-Degree %d connected variants %d coverage-per-variant %f \n",*components,maxdeg,nodes_in_graph,(double)avgdeg/(double)csnps); fprintf(stderr,"\nno of non-trivial connected components %d max-Degree %d connected variants %d coverage-per-variant %f \n",*components,maxdeg,nodes_in_graph,(double)avgdeg/(double)csnps); }
// ---------------------------------------------------------------------- shawn::Node* DefaultNodeGenerator:: generate_node( const shawn::Vec& pos ) throw( std::runtime_error ) { shawn::Node* v = allocate_node(); set_position(*v,pos); label_node(*v); add_processors(*v,proc_factories_); assert( simulation_controller_w().has_world() ); add_to_world(*v,simulation_controller_w().world_w()); return v; }