static void FindSuperFamEdges(FamList &Fams, EdgeList &Edges) { const int FamCount = (int) Fams.size(); // Allocate triangular array Related[i][j], value is true // iff families i and j are related (i.e., there is a local // alignment between some member of i and some member of j). const int TriangleSize = (FamCount*(FamCount - 1))/2; bool *Related = all(bool, TriangleSize); zero(Related, bool, TriangleSize); for (PtrFamList p = Fams.begin(); p != Fams.end(); ++p) { FamData *Fam = *p; for (PtrFamData q = Fam->begin(); q != Fam->end(); ++q) { FamMemberData &FamMember = *q; int PileIndex = FamMember.PileIndex; const PileData &Pile = Piles[PileIndex]; const int FamIndex = Pile.FamIndex; if (-1 == FamIndex) continue; const int ImageCount = Pile.ImageCount; for (int ImageIndex = 0; ImageIndex < ImageCount; ++ImageIndex) { const PileImageData &Image = Pile.Images[ImageIndex]; const int PartnerPileIndex = Image.SIPile; if (PartnerPileIndex == PileIndex) continue; const PileData &PartnerPile = Piles[PartnerPileIndex]; const int PartnerFamIndex = PartnerPile.FamIndex; if (-1 == PartnerFamIndex || PartnerFamIndex == FamIndex) continue; const int Index = TriangleSubscript(FamCount, FamIndex, PartnerFamIndex); assert(Index >- 0 && Index < TriangleSize); Related[Index] = true; } } } Edges.clear(); for (int i = 0; i < FamCount; ++i) for (int j = i + 1; j < FamCount; ++j) { const int Index = TriangleSubscript(FamCount, i, j); if (Related[Index]) { // Log("R %d %d\n", i, j); EdgeData Edge; Edge.Node1 = i; Edge.Node2 = j; Edge.Rev = false; Edges.push_back(Edge); } } }
static void FindGlobalEdges(EdgeList &Edges, int MaxImageCount) { Edges.clear(); PILE_INDEX_TYPE *Partners = all(PILE_INDEX_TYPE, MaxImageCount); bool *PartnersRev = all(bool, MaxImageCount); for (int PileIndex = 0; PileIndex < PileCount; ++PileIndex) { PileData &Pile = Piles[PileIndex]; int PartnerCount; if (g_paramSingleHitCoverage) PartnerCount = FindGlobalEdgesPileSingle(Pile, PileIndex, Partners, PartnersRev); else PartnerCount = FindGlobalEdgesPileMulti(Pile, PileIndex, Partners, PartnersRev); AddEdges(Edges, PileIndex, Partners, PartnersRev, PartnerCount); } freemem(Partners); freemem(PartnersRev); }