Exemplo n.º 1
0
bool graph_miner_mpi_omp_hybrid::is_min(int thread_id)
{

  if(DFS_CODE_V[thread_id].size() == 1) {
    return (true);
  }

  DFS_CODE_V[thread_id].toGraph(GRAPH_IS_MIN_V[thread_id]);
  DFS_CODE_IS_MIN_V[thread_id].clear();

  Projected_map3 root;
  types::EdgeList edges;

  for(unsigned int from = 0; from < GRAPH_IS_MIN_V[thread_id].size(); ++from) {
    if(get_forward_root(GRAPH_IS_MIN_V[thread_id], GRAPH_IS_MIN_V[thread_id][from], edges)) {
      for(types::EdgeList::iterator it = edges.begin(); it != edges.end(); ++it) {
        root[GRAPH_IS_MIN_V[thread_id][from].label][(*it)->elabel][GRAPH_IS_MIN_V[thread_id][(*it)->to].label].push(0, *it, 0);
      } // for it
    } // if get_forward_root
  } // for from

  Projected_iterator3 fromlabel = root.begin();
  Projected_iterator2 elabel = fromlabel->second.begin();
  Projected_iterator1 tolabel = elabel->second.begin();

  DFS_CODE_IS_MIN_V[thread_id].push(0, 1, fromlabel->first, elabel->first, tolabel->first);

  return (project_is_min(thread_id,tolabel->second));
}
Exemplo n.º 2
0
bool graph_miner_mpi_omp_hybrid::is_min(Thread_private_data &gprv)
{

  if(gprv.DFS_CODE.size() == 1) {
    return (true);
  }

  gprv.DFS_CODE.toGraph(gprv.GRAPH_IS_MIN);
  gprv.DFS_CODE_IS_MIN.clear();

  Projected_map3 root;
  types::EdgeList edges;

  for(unsigned int from = 0; from < gprv.GRAPH_IS_MIN.size(); ++from) {
    if(get_forward_root(gprv.GRAPH_IS_MIN, gprv.GRAPH_IS_MIN[from], edges)) {
      for(types::EdgeList::iterator it = edges.begin(); it != edges.end(); ++it) {
        root[gprv.GRAPH_IS_MIN[from].label][(*it)->elabel][gprv.GRAPH_IS_MIN[(*it)->to].label].push(0, *it, 0);
      } // for it
    } // if get_forward_root
  } // for from

  Projected_iterator3 fromlabel = root.begin();
  Projected_iterator2 elabel = fromlabel->second.begin();
  Projected_iterator1 tolabel = elabel->second.begin();

  gprv.DFS_CODE_IS_MIN.push(0, 1, fromlabel->first, elabel->first, tolabel->first);

  return (project_is_min(gprv,tolabel->second));
}
Exemplo n.º 3
0
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)
void gSpan::run_intern()
{
    if(maxpat_min <= 1) {
//        std::cout << "TRANS.size() = " << TRANS.size() << std::endl;


        //Counting the frequency of all single vertex labels
        for(UINT id = 0; id<TRANS.size(); ++id)
        {

            for(UINT nid = 0; nid<TRANS[id].size(); ++nid)
            {

                if(singleVertex[id][TRANS[id][nid].label]==0)
                    singleVertexLabel[TRANS[id][nid].label] += 1;
                singleVertex[id][TRANS[id][nid].label] += 1;
            }

        }

        for(std::map<UINT,UINT>::iterator it = singleVertexLabel.begin(); it!=singleVertexLabel.end(); ++it)
        {
            if((*it).second < minsup)               //checking frequency of vertices with minimum support.
                continue;                           // Ignoring the infrequent vertices
            UINT frequent_label = (*it).first;
            //std::cout << "Frequent Label: " << frequent_label << std::endl;
            Graph g(directed);
            g.resize(1);
            g[0].label = frequent_label;


            // Didn't understand the purpose of this part
            std::vector<UINT> counts(TRANS.size());
            for(std::map<UINT, std::map<UINT, UINT> >::iterator it2 = singleVertex.begin(); it2 != singleVertex.end(); ++it2) {
                // std::cout << "(*it2).first = " << (*it2).first << "(*it2).second[frequent_label] = " << (*it2).second[frequent_label] << std::endl;
                counts[(*it2).first] = (*it2).second[frequent_label];
            }
        }
    }

    EdgeList edges;
    Projected_map3 root;

    for(UINT id=0; id< TRANS.size(); ++id)
    {
        Graph& g = TRANS[id];

        for(UINT from = 0; from < g.size(); ++from)
        {
            if(get_forward_root(g,g[from],edges))
            {
                for(EdgeList::iterator it = edges.begin(); it!= edges.end(); ++it)
                    root[g[from].label][(*it)->elabel][g[(*it)->to].label].push(id,*it,0);
            }
        }
    }

    std::vector<Graph>	List;
    std::vector<Projected> proj_vec;
    std::vector<string> FwEdge;
    char ch[1000];

    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)
            {
                std::cout << "0,1," << fromlabel->first << "," << elabel->first << "," << tolabel->first << std::endl;
                sprintf(ch,"%d %d %d %d %d",0,1,fromlabel->first,elabel->first,tolabel->first);
                FwEdge.push_back(ch);
                Projected proj = tolabel->second;
                proj_vec.push_back(proj);
            }
    }

    vector<Graph> sorted;
    int x[5];
//    //Initial 1-edge graph to start
    for(UINT i= 0; i< (int)FwEdge.size(); i++)
    {
        std::cout << FwEdge[i] << std::endl;
        sscanf(FwEdge[i].c_str(),"%d %d %d %d %d",&x[0],&x[1],&x[2],&x[3],&x[4]);
        //std::cout << FwEdge[i] << std::endl;
        DFS_CODE.push(x[0],x[1],x[2],x[3],x[4]);
        Graph g;
        DFS_CODE.toGraph(g);
//        Calculate_MDL(g,(UINT)NumOfLabels);
//        std::set<int> occurrence = total_occurance(proj_vec[i]);
//
//        g.MDL = EvaluateGraph(TRANS,g,occurrence);
        //g.occurrence = support_counts(proj_vec[i]);
        g.Frequency = support(proj_vec[i]);
        g.SET_COVER = (double)g.Frequency / (double) TRANS.size();
        sorted.push_back(g);
        //ListInsert(BestList,g,5);
//        std::cout << "MDL = "<< g.MDL << "vertex size = " << g.size() << "Support Count = " << support_counts(proj_vec[i])[0] << std::endl;
        project(proj_vec[i]);
        DFS_CODE.pop();
    }


    BestList.insert(BestList.end(),sorted.begin(),sorted.end());
//    for(UINT i=0;i<sorted.size();i++)
//    {
//        ListInsert(BestList,sorted[i],maxBest);
//    }
//

//    Graph g(directed);
//
//    g.resize(2);
//    g[0].label = 2;
//    g[0].used = false;
//    g[1].label = 3;
//    g[1].used = false;
//
//    g[0].push(0,1,1);
//    g[1].push(1,0,1);
//    g.buildEdge();
//    g.write();
//    Calculate_MDL(g,3);
//    std::set<int> ss;
//    ss.insert(0);
//    EvaluateGraph(TRANS,g,ss);
//
//    //std::cout <<"Testing G = " << g.MDL << std::endl;
//    exit(1);
    sorted.clear();
    List.clear();
    FwEdge.clear();
    proj_vec.clear();
}