void extend ( LegOccurrences &legoccurrencesdata, EdgeLabel minlabel, EdgeLabel neglect ) {
  // we're trying hard to avoid repeated destructor/constructor calls for complex types like vectors.
  // better reuse previously allocated memory, if possible!
  vector<LegOccurrence> &legoccurrences = legoccurrencesdata.elements;
  int lastself[candidatelegsoccurrences.size ()];
  
  for ( int i = 0; i < candidatelegsoccurrences.size (); i++ ) {
    candidatelegsoccurrences[i].elements.resize ( 0 );
    candidatelegsoccurrences[i].parent = &legoccurrencesdata;
    candidatelegsoccurrences[i].number = legoccurrencesdata.number + 1;
    candidatelegsoccurrences[i].maxdegree = 0;
    candidatelegsoccurrences[i].selfjoin = 0;
    lastself[i] = NOTID;
    candidatelegsoccurrences[i].frequency = 0;
  }

  closelegsoccsused = false; // we are lazy with the initialization of close leg arrays, as we may not need them at all in
                             // many cases
  for ( OccurrenceId i = 0; i < legoccurrences.size (); i++ ) {
    LegOccurrence &legocc = legoccurrences[i];
    DatabaseTreePtr tree = database.trees[legocc.tid];
    DatabaseTreeNode &node = tree->nodes[legocc.tonodeid];
    for ( int j = 0; j < node.edges.size (); j++ ) {
      if ( node.edges[j].tonode != legocc.fromnodeid ) {
	EdgeLabel edgelabel = node.edges[j].edgelabel;
        int number = nocycle ( tree, node, node.edges[j].tonode, i, &legoccurrencesdata );
        if ( number == 0 ) {
	  if ( edgelabel >= minlabel && edgelabel != neglect ) {
            vector<LegOccurrence> &candidatelegsoccs = candidatelegsoccurrences[edgelabel].elements;
            if ( candidatelegsoccs.empty () )
  	      candidatelegsoccurrences[edgelabel].frequency++;
	    else {
	      if ( candidatelegsoccs.back ().tid != legocc.tid )
  	        candidatelegsoccurrences[edgelabel].frequency++;
	      if ( candidatelegsoccs.back ().occurrenceid == i &&
                lastself[edgelabel] != legocc.tid ) {
                lastself[edgelabel] = legocc.tid;
                candidatelegsoccurrences[edgelabel].selfjoin++;
              }
            }
            candidatelegsoccs.push_back ( LegOccurrence ( legocc.tid, i, node.edges[j].tonode, legocc.tonodeid ) );
	    setmax ( candidatelegsoccurrences[edgelabel].maxdegree, database.trees[legocc.tid]->nodes[node.edges[j].tonode].edges.size () );
	  }
        }
        else if ( number - 1 != graphstate.nodes.back().edges[0].tonode ) {
          candidateCloseLegsAllocate ( number, legoccurrencesdata.number + 1 );

          vector<CloseLegOccurrence> &candidatelegsoccs = candidatecloselegsoccs[number][edgelabel].elements;
          if ( !candidatelegsoccs.size () || candidatelegsoccs.back ().tid != legocc.tid )
	    candidatecloselegsoccs[number][edgelabel].frequency++;
          candidatelegsoccs.push_back ( CloseLegOccurrence ( legocc.tid, i ) );
          setmax ( candidatelegsoccurrences[edgelabel].maxdegree, database.trees[legocc.tid]->nodes[node.edges[j].tonode].edges.size () );
        }
      }
    }
  }
}
Ejemplo n.º 2
0
void bbrc_extend ( LastLegOccurrences &legoccurrencesdata ) {
  // we're trying hard to avoid repeated destructor/constructor calls for complex types like vectors.
  // better reuse previously allocated memory, if possible!
  
  

  vector<LastLegOccurrence> &legoccurrences = legoccurrencesdata.elements;   ///////////////////////////////////////AM : BUG!!!



  LastTid lastself[fm::last_Lastcandidatelegsoccurrences.size ()];

  for ( int i = 0; i < (int) fm::last_Lastcandidatelegsoccurrences.size (); i++ ) {
    fm::last_Lastcandidatelegsoccurrences[i].elements.resize ( 0 );
    //fm::last_Lastcandidatelegsoccurrences[i].elements.reserve ( legoccurrences.size () ); // increases memory usage, but also speed!
    fm::last_Lastcandidatelegsoccurrences[i].parent = &legoccurrencesdata;
    fm::last_Lastcandidatelegsoccurrences[i].number = legoccurrencesdata.number + 1;
    fm::last_Lastcandidatelegsoccurrences[i].maxdegree = 0;
    fm::last_Lastcandidatelegsoccurrences[i].frequency = 0;
    fm::last_Lastcandidatelegsoccurrences[i].selfjoin = 0;
    lastself[i] = NOTID;
  }

  fm::last_Lastcloselegsoccsused = false; // we are lazy with the initialization of close leg arrays, as we may not need them at all in
                             // many cases

  for ( LastOccurrenceId i = 0; i < legoccurrences.size (); i++ ) {
    LastLegOccurrence &legocc = legoccurrences[i];
    LastDatabaseTreePtr tree = fm::last_database->trees[legocc.tid];
    LastDatabaseTreeNode &node = tree->nodes[legocc.tonodeid];
    for ( int j = 0; j < node.edges.size (); j++ ) {
      if ( node.edges[j].tonode != legocc.fromnodeid ) {
      	LastEdgeLabel edgelabel = node.edges[j].edgelabel;

        int number = nocycle ( tree, node, node.edges[j].tonode, i, &legoccurrencesdata );

        if ( number == 0 ) {
          vector<LastLegOccurrence> &candidatelegsoccs = fm::last_Lastcandidatelegsoccurrences[edgelabel].elements;
          if ( candidatelegsoccs.empty () )  fm::last_Lastcandidatelegsoccurrences[edgelabel].frequency++;
          else {

	            if ( candidatelegsoccs.back ().tid != legocc.tid )
        	        fm::last_Lastcandidatelegsoccurrences[edgelabel].frequency++;

	            if ( candidatelegsoccs.back ().occurrenceid == i &&
	                lastself[edgelabel] != legocc.tid ) {
                    lastself[edgelabel] = legocc.tid;
	                fm::last_Lastcandidatelegsoccurrences[edgelabel].selfjoin++;
	            }

          }
          candidatelegsoccs.push_back ( LastLegOccurrence ( legocc.tid, i, node.edges[j].tonode, legocc.tonodeid ) );
          Lastsetmax ( fm::last_Lastcandidatelegsoccurrences[edgelabel].maxdegree, fm::last_database->trees[legocc.tid]->nodes[node.edges[j].tonode].edges.size () );
        }

        else if ( number - 1 != fm::last_graphstate->nodes.back().edges[0].tonode ) {
            candidateLastCloseLastLegsAllocate ( number, legoccurrencesdata.number + 1 );
            vector<CloseLastLegOccurrence> &candidatelegsoccs = fm::last_candidatecloselegsoccs[number][edgelabel].elements;
            if ( !candidatelegsoccs.size () || candidatelegsoccs.back ().tid != legocc.tid )
	            fm::last_candidatecloselegsoccs[number][edgelabel].frequency++;
            candidatelegsoccs.push_back ( CloseLastLegOccurrence ( legocc.tid, i ) );
            Lastsetmax ( fm::last_Lastcandidatelegsoccurrences[edgelabel].maxdegree, fm::last_database->trees[legocc.tid]->nodes[node.edges[j].tonode].edges.size () );
        }

      }
    }
  }
}