Ejemplo n.º 1
0
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); 
	}
}
Ejemplo n.º 2
0
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);
}
Ejemplo n.º 3
0
// 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);
}
Ejemplo n.º 4
0
 // ----------------------------------------------------------------------
 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;
 }