Exemple #1
0
/* Build a DFS code from a given graph.
 */
void
DFSCode::fromGraph (Graph &g)
{
	clear ();

	EdgeList edges;
	for (unsigned int from = 0 ; from < g.size () ; ++from) {
		if (get_forward_root (g, g[from], edges) == false)
			continue;

		for (EdgeList::iterator it = edges.begin () ; it != edges.end () ; ++it)
			push (from, (*it)->to, g[(*it)->from].label, (*it)->elabel, g[(*it)->to].label);
	}
}
void graph_miner_mpi_dyn::run_intern(void)
{

  types::EdgeList edges;
  Projected_map3 root;
  int single_edge_dfscodes = 0;


  for(unsigned int from = 0; from < graph.size(); ++from) {
    if(get_forward_root(graph, graph[from], edges)) {   // get the edge list of the node g[from] in graph g
      for(types::EdgeList::iterator it = edges.begin(); it != edges.end(); ++it) {
        //embeddings with a single edge
        if(root.count(graph[from].label) == 0 || root[graph[from].label].count((*it)->elabel) == 0 || root[graph[from].label][(*it)->elabel].count(graph[(*it)->to].label) == 0) {
          single_edge_dfscodes++;
          DEBUG(*logger, "single edge DFS code : (0,1," << graph[from].label << "," << (*it)->elabel << "," << graph[(*it)->to].label << ")" );
        }
        root[graph[from].label][(*it)->elabel][graph[(*it)->to].label].push(0, *it, 0);          //projected (PDFS vector) entry: graph id (always 0 for single graph), edge pointer and null PDFS
      }  //for
    }   // if
  }   // for from
  //} // for id


  int dfscodes_per_rank =  (int) ceil((single_edge_dfscodes * 1.0) / numtasks);
  int start_index = rank * dfscodes_per_rank;
  int end_index = start_index + dfscodes_per_rank - 1;
  if (end_index > single_edge_dfscodes - 1)
    end_index = single_edge_dfscodes - 1;

  DEBUG(*(graph_miner::logger), "start index = " << start_index << " , end index = " << end_index << endl);

  std::deque<types::DFS> tmp;
  dfs_task_queue.push_back(tmp);

  int index = 0;
  for(Projected_iterator3 fromlabel = root.begin(); fromlabel != root.end(); ++fromlabel) {
    for(Projected_iterator2 elabel = fromlabel->second.begin(); elabel != fromlabel->second.end(); ++elabel) {
      for(Projected_iterator1 tolabel = elabel->second.begin();
          tolabel != elabel->second.end(); ++tolabel) {

        if( index >= start_index && index <= end_index ) {
          // Build the initial two-node graph.  It will be grownrecursively within project.

          DFS dfs(0, 1, fromlabel->first, elabel->first, tolabel->first);
          dfs_task_queue[0].push_back(dfs);
          //std::cout << dfs.to_string() << endl;
        }
        index++;

      } // for tolabel
    } // for elabel
  } // for fromlabel

  //std::cout<<"size = " << dfs_task_queue[0].size() << std::endl;

  //while(dfs_task_queue[0].size() > 0){
  while(computation_end == false) {

    if(dfs_task_queue[0].size() == 0) {
      is_working = false;
      embeddings_regeneration_level = 0;
      task_split_level = 0;
      load_balance();

    }else{
      //this is done in process_received_data, so not required here
      //is_working = true;

      DFS dfs = dfs_task_queue[0].front();
      dfs_task_queue[0].pop_front();
      DEBUG(*(graph_miner::logger), "popped dfs = " << dfs.to_string() );
      load_balance();

      DFS_CODE.push(0, 1, dfs.fromlabel, dfs.elabel, dfs.tolabel);
      current_dfs_level = 1;

      //INFO(*(graph_miner::logger), "embeddings regeneration level = " << embeddings_regeneration_level);
      if(embeddings_regeneration_level < 1)
        project(root[dfs.fromlabel][dfs.elabel][dfs.tolabel], 1);                    //Projected (PDFS vector): each entry contains graph id 0, edge pointer, null PDFS
      else
        regenerate_embeddings(root[dfs.fromlabel][dfs.elabel][dfs.tolabel], 1);

      current_dfs_level = 0;
      DFS_CODE.pop();
      if(dfs_task_queue[0].size() == 0) {
        DEBUG(*(graph_miner::logger),"processor " << rank << " is idle, has token = " << has_token);
        if(has_token == true)
          DEBUG(*(graph_miner::logger),"processor " << rank << " token color = " << get_token_color(token_color));
      }
    }
  }

} // void graph_miner_mpi_dyn::run_intern(void)