//1. Class BiGraph_ME: #include "MutuallyExclusive.h" set mySetIntersection(set s1, set s2) { set L_rets; set::iterator iset1,iset2; for (iset1 = s1.begin(); iset1 != s1.end(); iset1++) { iset2 = s2.find(*iset1); if (iset2 != s2.end()) { L_rets.insert(*iset1); } } return L_rets; } void printSet(set p_s) { set::iterator iset; for (iset=p_s.begin(); iset!=p_s.end(); iset++) { cout<<*iset<<"; "; } cout<<'\n'; } list mySplit(string str, string deli) { int st=0; list ret; int idx1,idx2; idx1=-1; for (int i=0; i edges; }; class BiGraph_ME { public: //int mVertex[maxGraphSize],mVertexStatus[maxGraphSize],mCoverTumorNO[maxGraphSize]; int mCoverTumorNO[maxGraphSize]; set mVertex; double mWeight[maxGraphSize]; int mVertexNo; set mNeighborOrg[maxGraphSize],mNeighborCur[maxGraphSize]; string mVertexID2Name[maxGraphSize]; int tempLevel; int mTumorNo; BiGraph_ME(const BiGraph_ME& p); BiGraph_ME(); BiGraph_ME(biGraphString& g); int findNodeMaxDegree(); int findKeyNode3Degree(); int findMidNode4Path(); BiGraph_ME subGraph(set p_nodes); void delete_nodes(set p_nodes); void add_nodes(set p_nodes); list connected_components(); ME_mutation WMEM_cover_2(); ME_mutation WMEM_cover_3(); ME_mutation WMEM_cover_main(); void printGraph(); void printSolution(ME_mutation p_solu); void printSolution_gene(ME_mutation p_solu); }; BiGraph_ME::BiGraph_ME(const BiGraph_ME& p) { mVertexNo = p.mVertexNo; set::iterator iset,inode; int i; for (inode = (p.mVertex).begin(); inode != (p.mVertex).end(); inode++) { i = *inode; mVertex.insert(i); mCoverTumorNO[i] = p.mCoverTumorNO[i]; mVertexID2Name[i] = p.mVertexID2Name[i]; mWeight[i] = p.mWeight[i]; for (iset=p.mNeighborOrg[i].begin(); iset!=p.mNeighborOrg[i].end(); iset++) { mNeighborOrg[i].insert(*iset); } for (iset=p.mNeighborCur[i].begin(); iset!=p.mNeighborCur[i].end(); iset++) { mNeighborCur[i].insert(*iset); } } } BiGraph_ME::BiGraph_ME() { mVertexNo = 0; } BiGraph_ME::BiGraph_ME(biGraphString& g) { int count,nIdx; set biTumors[maxGraphSize]; list::iterator inodes,iedges; inodes = (g.edges).begin(); //cout<<"\n----"< edges; edges = mySplit(*inodes, "|"); //cout<<"\n----size"<<(edges.size()-2)<<'\n'; mCoverTumorNO[nIdx] = (edges.size()-2); iedges = edges.begin(); count = -1; while(iedges!=edges.end()) { count += 1; if (count ==0) { //cout<<"\n\n-----------Node: "<<*iedges<<"---"< L_tumors; set::iterator iL_tumors; for (int i=0; i cset = mySetIntersection(biTumors[i],biTumors[j]); if (cset.size()>0) { mNeighborOrg[i].insert(j); mNeighborOrg[j].insert(i); mNeighborCur[i].insert(j); mNeighborCur[j].insert(i); if (countCom<0) { printSet(biTumors[i]); printSet(biTumors[j]); printSet(cset); //cout<<"------\n"; countCom += 1; } } } } //for (int i=0; i::iterator inode; inode=mVertex.begin(); L_rets = *inode; for (inode=mVertex.begin(); inode != mVertex.end(); inode++) { if (mNeighborCur[L_rets].size()::iterator inode; inode=mVertex.begin(); L_rets = *inode; for (inode=mVertex.begin(); inode != mVertex.end(); inode++) { if (mNeighborCur[L_rets].size()>mNeighborCur[*inode].size()) { L_rets = *inode; } } if (mNeighborCur[L_rets].size()>=3) { return L_rets; } int countLen = 1; set tpNode; tpNode.insert(L_rets); while (countLen>0) { for (inode = mNeighborCur[L_rets].begin(); inode != mNeighborCur[L_rets].end(); inode++) { if (tpNode.find(*inode)==tpNode.end()) { L_rets = *inode; tpNode.insert(*inode); break; } } if (mNeighborCur[L_rets].size()==3) { break; } } //cout<<"\n----node33"<::iterator inode; inode=mVertex.begin(); L_rets = *inode; if (mVertex.size()<=2) { return L_rets; } st = 0; for (inode=mVertex.begin(); inode != mVertex.end(); inode++) { if (mNeighborCur[*inode].size()==1) { L_rets = *inode; st = 1; break; } } if (st == 0) { return L_rets; } int countLen = (mVertex.size()/2); set tpNode; tpNode.insert(L_rets); while (countLen>0) { for (inode = mNeighborCur[L_rets].begin(); inode != mNeighborCur[L_rets].end(); inode++) { if (tpNode.find(*inode)==tpNode.end()) { L_rets = *inode; tpNode.insert(*inode); countLen -= 1; break; } } } //cout<<"----"< p_nodes) { BiGraph_ME L_subGraph; int i; set::iterator iset,inode; for (inode = p_nodes.begin(); inode != p_nodes.end(); inode++) { i = *inode; L_subGraph.mVertex.insert(i); L_subGraph.mCoverTumorNO[i] = mCoverTumorNO[i]; L_subGraph.mWeight[i] = mWeight[i]; L_subGraph.mVertexID2Name[i] = mVertexID2Name[i]; for (iset=mNeighborCur[i].begin(); iset!=mNeighborCur[i].end(); iset++) { L_subGraph.mNeighborOrg[i].insert(*iset); L_subGraph.mNeighborCur[i].insert(*iset); } } L_subGraph.mVertexNo = mVertexNo; //cout<<"\n========\n"; //L_subGraph.printGraph(); return L_subGraph; } void BiGraph_ME::delete_nodes(set p_nodes) { set::iterator iset,iset2,iset3; for (iset=p_nodes.begin(); iset != p_nodes.end(); iset++) { mVertex.erase(*iset); } for (iset=p_nodes.begin(); iset != p_nodes.end(); iset++) { for (iset2 = mNeighborCur[*iset].begin(); iset2 != mNeighborCur[*iset].end(); iset2++) { iset3 = mVertex.find(*iset2); if (iset3 != mVertex.end()) { mNeighborCur[*iset2].erase(*iset); } } } } void BiGraph_ME::add_nodes(set p_nodes) { set::iterator iset,iset2,iset3; for (iset=p_nodes.begin(); iset != p_nodes.end(); iset++) { mVertex.insert(*iset); } for (iset=p_nodes.begin(); iset != p_nodes.end(); iset++) { for (iset2 = mNeighborCur[*iset].begin(); iset2 != mNeighborCur[*iset].end(); iset2++) { iset3 = mVertex.find(*iset2); if (iset3 != mVertex.end()) { mNeighborCur[*iset2].insert(*iset); mNeighborCur[*iset].insert(*iset2); } } } } list BiGraph_ME::connected_components() { list L_rets; int tempStatus[maxGraphSize]; set::iterator iset; for (int i = 0; i0) { set t_nodes,nei_old,nei_new; set::iterator inei_old,inei_new; nei_old.insert(i); while (nei_old.size()>0) { for (inei_old = nei_old.begin(); inei_old != nei_old.end(); inei_old++) { tempStatus[*inei_old] = -1; t_nodes.insert(*inei_old); for (inei_new = mNeighborCur[*inei_old].begin(); inei_new != mNeighborCur[*inei_old].end(); inei_new++) { if (tempStatus[*inei_new]>0) { nei_new.insert(*inei_new); } } } nei_old.clear(); for (inei_new=nei_new.begin(); inei_new!=nei_new.end(); inei_new++) { nei_old.insert(*inei_new); } nei_new.clear(); } BiGraph_ME tGraph = subGraph(t_nodes); //cout<<"\n========+++\n"; //tGraph.printGraph(); L_rets.push_back(tGraph); } } /* list::iterator iret; for (iret=L_rets.begin(); iret!=L_rets.end(); iret++) { cout<<"\n-----comp:"; (*iret).printGraph(); }*/ return L_rets; } void BiGraph_ME::printGraph() { set::iterator iset; int i; for (iset = mVertex.begin(); iset != mVertex.end(); iset++) { i = *iset; set::iterator inei; cout<<"\n--"< L_comp = connected_components(); //int tp = 1; //if (tp<0) if (L_comp.size()>1) { list::iterator icomp; for (icomp=L_comp.begin(); icomp!=L_comp.end(); icomp++) { BiGraph_ME sGraph(*icomp); //cout<<"\n2==="< lset1; set::iterator iset1; midx = findMidNode4Path(); //cout<<"\n***mid="< L_comp = connected_components(); //int tp = 1; //if (tp<0) if (L_comp.size()>1) { list::iterator icomp; for (icomp=L_comp.begin(); icomp!=L_comp.end(); icomp++) { BiGraph_ME sGraph(*icomp); //cout<<"\n3==="< lset1; set::iterator iset1; midx1 = findNodeMaxDegree(); //cout<<"\n***max= "< L_comp = connected_components(); //int tp = 1; //if (tp<0) if (L_comp.size()>1) { list::iterator icomp; for (icomp=L_comp.begin(); icomp!=L_comp.end(); icomp++) { BiGraph_ME sGraph(*icomp); //cout<<"\nm==="< lset1; set::iterator iset1; midx = findNodeMaxDegree(); //cout<<"\n***max= "<