Beispiel #1
0
/*************************************************
Function:
    call_heavygraph
Description:
    The main function for contig step . its processes are as below:
    1. Solve repeat
    2. Merge bubble(clean bubble is optional for multikmer)
    3. Remove weak edge and low coverage edge
    4. Cut tips
    5. Iterate multikmer(optional)
Input:
    @see display_contig_usage ()
Output:
    The files below:
    1. *.contig
    2. *.ContigIndex
    3. *.update.edge
    4. *.Arc
    5. *.read           [optional]
    6. *.preGraphBasic  [optional]
Return:
    None.
*************************************************/
int call_heavygraph ( int argc, char ** argv )
{
	time_t start_t, stop_t, time_bef, time_aft;
	time ( &start_t );
	boolean ret;
	fprintf ( stderr, "\n********************\n" );
	fprintf ( stderr, "Contig\n" );
	fprintf ( stderr, "********************\n\n" );
	initenv ( argc, argv );
	loadVertex ( graphfile );
	loadEdge ( graphfile );

	if ( repeatSolve )
	{
		ret = loadPathBin ( graphfile );
	}

	swapedge();
	sortedge();
	freshArc();

	if ( repeatSolve )
	{
		time ( &time_bef );

		//      ret = loadPathBin (graphfile);
		if ( ret )
		{
			solveReps ();
		}
		else
		{
			fprintf ( stderr, "Repeat solving can't be done...\n" );
		}

		time ( &time_aft );
		fprintf ( stderr, "Time spent on solving repeat: %ds.\n", ( int ) ( time_aft - time_bef ) );
	}

	//edgecvg_bar(edge_array,num_ed,graphfile,100);

	if ( !iter && M > 0 )
	{
		time ( &time_bef );
		bubblePinch ( 0.90, graphfile, M, 0, 1 );
		time ( &time_aft );
		fprintf ( stderr, "Time spent on pinching bubbles: %ds.\n", ( int ) ( time_aft - time_bef ) );
	}

	if ( iter && cleanBubble && M > 0 )
	{
		time ( &time_bef );
		clean = 1;
		long long oldpinCounter = 0;
		long long min = 10;
		int times = 0;

		while ( min >= 10 )
		{
			times++;

			if ( times >= 4 ) { break; }

			bubblePinch ( 0.90, graphfile, M, 1, 0 );
			min = pinCounter;
			fprintf ( stderr, "%lld clean bubbles merged.\n", pinCounter );
		}

		time ( &time_aft );
		fprintf ( stderr, "Time spent on pinching clean bubbles: %ds.\n", ( int ) ( time_aft - time_bef ) );
		clean = 0;
	}

	if ( deLowEdge )
	{
		removeWeakEdges ( 2 * overlaplen, 1 );
		removeLowCovEdges ( 2 * overlaplen, deLowEdge, !iter );
	}

	cutTipsInGraph ( 0, 0, !iter );

	if ( iter )
	{
		Iterate ( shortrdsfile, graphfile, maxk, M ); //keepReadFile,

		if ( M > 0 )
		{
			time ( &time_bef );
			bubblePinch ( 0.90, graphfile, M, 1, 0 );
			time ( &time_aft );
			fprintf ( stderr, "Time spent on pinching bubbles: %ds.\n", ( int ) ( time_aft - time_bef ) );
		}

		freshpreGraphBasic ( iter, maxk, graphfile );
	}

	//output_graph(graphfile);
	output_contig ( edge_array, num_ed, graphfile, overlaplen + 1 );
	output_updated_edges ( graphfile );
	output_heavyArcs ( graphfile );

	if ( vt_array )
	{
		free ( ( void * ) vt_array );
		vt_array = NULL;
	}

	if ( edge_array )
	{
		free_edge_array ( edge_array, num_ed_limit );
		edge_array = NULL;
	}

	destroyArcMem ();
	time ( &stop_t );
	fprintf ( stderr, "\nTime spent on constructing contig: %dm.\n\n", ( int ) ( stop_t - start_t ) / 60 );
	return 0;
}
void routerFinder::advGreedySoluation(int vertexNum,int edgeNum,int (*edgeData)[4],
                        int setSizeRec,int *includeSet,
                        int& total_cost,std::vector<int>& final_path)
{
    int (*reverse_edge)[4] = new int[edgeNum][4];

    for (int i = 0; i < edgeNum; ++i) {
        reverse_edge[i][0] = edgeData[i][0];
        reverse_edge[i][1] = edgeData[i][2];
        reverse_edge[i][2] = edgeData[i][1];
        reverse_edge[i][3] = edgeData[i][3];
    }

    std::vector<vertex> verteix = loadVerterix(vertexNum);
    loadEdge(edgeData, edgeNum, verteix);

     std::vector<vertex> reverse_verteix = loadVerterix(vertexNum);
    loadEdge(reverse_edge, edgeNum, reverse_verteix);

    bool visited[600];
    bool reverse_visited[600];
    int parent[20];
    int reverse_parent[20];
    for (int i = 0; i < vertexNum; ++i) {
        visited[i] = false;
        reverse_visited[i] = false;
        parent[i] = -1;
        reverse_parent[i] = -1;
    }

    int setSize = setSizeRec;
    int sourceID = includeSet[0];
    int meetID = includeSet[setSizeRec-1];


    node* distance;
    node* reverse_dist;
    float judge[52] = {0};

    int maxIndex = 0;
    int selectIndex = 0;
    float maxRec = INF;
    float k_value = 0.6;

    std::vector<int> temp_path;

    for (;setSize > 1; --setSize) {

        distance = dijkstra(sourceID,verteix,includeSet,setSize,visited,parent);
        reverse_dist = dijkstra(meetID,reverse_verteix,includeSet,setSize,reverse_visited,reverse_parent);

        if (setSize == 2) {
            selectIndex = meetID;
        }else{
            for (int i = 1; i < setSize-1; ++i) {
                judge[i] = k_value*distance[includeSet[i]].w+(1-k_value)*reverse_dist[includeSet[i]].w;
                if (maxRec > judge[i]) {
                    maxRec = judge[i];
                    maxIndex = i;
                    selectIndex = includeSet[i];
                }
            }
        }

        //把选中的点交换到末尾去,includeSet的逆顺就是 需要通过的点的通过顺序
        int tempx = includeSet[setSize-2];
        includeSet[setSize-2] = includeSet[maxIndex];
        includeSet[maxIndex] = tempx;

        tempx = includeSet[setSize-1];
        includeSet[setSize-1] = includeSet[setSize-2];
        includeSet[setSize-2] = tempx;

        for (int i = 0; i < setSizeRec; ++i) {
             std::cout << includeSet[i] << "|";
        }
         std::cout <<  std::endl;

        int tempIndex = selectIndex;
        //update isSelected
        while (tempIndex != -1) {
            //到达某个选中的点可能回通过另外选中的点
            int pindex = isInclude(parent[tempIndex],includeSet,setSize);
            if( pindex != 0 ){

                int tempx = includeSet[setSize-3];
                includeSet[setSize-3] = includeSet[pindex];
                includeSet[pindex] = tempx;

                tempx = includeSet[setSize-2];
                includeSet[setSize-2] = includeSet[setSize-3];
                includeSet[setSize-3] = tempx;

                --setSize;
            }
            verteix[tempIndex].isSelected = true;
            reverse_verteix[tempIndex].isSelected = true;

            //纪录结果
            temp_path.push_back(tempIndex);

            tempIndex = parent[tempIndex];

        }

        int tempPathSize = temp_path.size();
        for (int i = temp_path.size()-1; i > 0; --i) {
            final_path.push_back(temp_path[i]);
        }
        if (setSize == 2) {
            final_path.push_back(temp_path[0]);
        }
        temp_path.clear();

        //重置visited parent maxRec
        for (int i = 0; i < vertexNum; ++i) {
            visited[i] = false;
            reverse_visited[i] = false;
            parent[i] = -1;
            reverse_parent[i] = -1;
        }
        total_cost += distance[selectIndex].w;

        //无解处理
        if (total_cost >= INF) {

        }
        maxRec = INF;

        //更改起点再计算
        sourceID = selectIndex;

    }

    //    for (int i = setSizeRec-1; i >= 0; --i) {
    //        cout << includeSet[i] << "|";
    //    }
    std:: cout <<  std::endl;
    for (int i = 0; i < final_path.size(); ++i) {
         std::cout << final_path[i] << "|";
    }
     std::cout <<  std::endl;
     std::cout << total_cost;
}