/* 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)