void connected_components(Graph& g, ComponentMap& result)
{
  #pragma mta noalias g
  #pragma mta noalias result

  typedef typename graph_traits<Graph>::size_type size_type;
  typedef typename graph_traits<Graph>::vertex_descriptor vertex_descriptor;
  typedef typename graph_traits<Graph>::edge_descriptor edge_descriptor;
  typedef typename graph_traits<Graph>::thread_vertex_iterator
          thread_vertex_iterator;
  typedef typename graph_traits<Graph>::thread_edge_iterator
          thread_edge_iterator;

  size_type order = num_vertices(g);
  size_type size = num_edges(g);

  vertex_id_map<Graph> vid_map = get(_vertex_id_map, g);

  size_type stream_id = 0;
  size_type num_streams = 1;

  // Initialize each vertex to have itself as its leader.
  #pragma mta for all streams stream_id of num_streams
  {
    size_type start_pos = begin_block_range(order, stream_id, num_streams);
    size_type end_pos = end_block_range(order, stream_id, num_streams);

    thread_vertex_iterator verts = thread_vertices(start_pos, g);
    for ( ; start_pos != end_pos; ++start_pos, ++verts)
    {
      put(result, *verts, start_pos);
    }
  }

  // Find the highest degree vertex.
  size_type* degrees = new size_type[order];

  #pragma mta for all streams stream_id of num_streams
  {
    size_type start_pos = begin_block_range(order, stream_id, num_streams);
    size_type end_pos = end_block_range(order, stream_id, num_streams);

    thread_vertex_iterator verts = thread_vertices(start_pos, g);
    for ( ; start_pos != end_pos; ++start_pos, ++verts)
    {
      degrees[start_pos] = out_degree(*verts, g);
    }
  }

  size_type max_deg_vert_id = 0;
  size_type maxdeg = degrees[0];

  #pragma mta assert nodep
  for (size_type i = 1; i < order; i++)
  {
    if (degrees[i] > maxdeg)
    {
      maxdeg = degrees[i];
      max_deg_vert_id = i;
    }
  }

  delete [] degrees;

  vertex_descriptor max_deg_vert = *(thread_vertices(max_deg_vert_id, g));

  // Search from the highest degree vertex to label the giant component (GCC).

  detail::news_visitor<Graph, ComponentMap> nvis(result, max_deg_vert);
  breadth_first_search(g, max_deg_vert, nvis);

  size_type orphan_edges = 0;

  #pragma mta for all streams stream_id of num_streams
  {
    size_type start_pos = begin_block_range(size, stream_id, num_streams);
    size_type end_pos = end_block_range(size, stream_id, num_streams);

    size_type my_orphan_edges = 0;

    thread_edge_iterator tedgs = thread_edges(start_pos, g);
    for ( ; start_pos != end_pos; ++start_pos, ++tedgs)
    {
      edge_descriptor e = *tedgs;
      vertex_descriptor u = source(e, g);
      vertex_descriptor v = target(e, g);

      if (result[u] != max_deg_vert_id || result[v] != max_deg_vert_id)
      {
        ++my_orphan_edges;
      }
    }

    mt_incr(orphan_edges, my_orphan_edges);
  }

  size_type next_index = 0;

  size_type* srcs = new size_type[orphan_edges];
  size_type* dests = new size_type[orphan_edges];

  #pragma mta for all streams stream_id of num_streams
  {
    size_type start_pos = begin_block_range(size, stream_id, num_streams);
    size_type end_pos = end_block_range(size, stream_id, num_streams);

    thread_edge_iterator tedgs = thread_edges(start_pos, g);
    for ( ; start_pos != end_pos; ++start_pos, ++tedgs)
    {
      edge_descriptor e = *tedgs;
      vertex_descriptor u = source(e, g);
      vertex_descriptor v = target(e, g);

      if (result[u] != max_deg_vert_id || result[v] != max_deg_vert_id)
      {
        size_type my_ind = mt_incr(next_index, 1);
        srcs[my_ind] = get(vid_map, u);
        dests[my_ind] = get(vid_map, v);
      }
    }
  }

  edge_array_adapter<size_type> eaa(srcs, dests, order, orphan_edges);
  vertex_property_map<edge_array_adapter<size_type>, size_type>
    eaa_components(eaa);

  #pragma mta for all streams stream_id of num_streams
  {
    size_type start_pos = begin_block_range(order, stream_id, num_streams);
    size_type end_pos = end_block_range(order, stream_id, num_streams);

    thread_vertex_iterator verts = thread_vertices(start_pos, g);
    for ( ; start_pos != end_pos; ++start_pos, ++verts)
    {
      vertex_descriptor v = *verts;
      eaa_components[v] = result[v];
    }
  }

  shiloach_vishkin_no_init(eaa, eaa_components);

  #pragma mta for all streams stream_id of num_streams
  {
    size_type start_pos = begin_block_range(order, stream_id, num_streams);
    size_type end_pos = end_block_range(order, stream_id, num_streams);

    thread_vertex_iterator verts = thread_vertices(start_pos, g);
    for ( ; start_pos != end_pos; ++start_pos, ++verts)
    {
      vertex_descriptor v = *verts;
      result[v] = eaa_components[v];
    }
  }

  delete [] srcs;
  delete [] dests;
}
Exemplo n.º 2
0
void DockWnd::timer()
{
    if (++m_state >= 4) m_state = 0;
    ShowIcon needIcon = State;
    bool bBlinked = pClient->isConnecting();
    unsigned short msgType = 0;
    if (pMain->messages.size()) msgType = pMain->messages.back().type();
    switch (m_state){
    case 1:
        if (msgType){
            needIcon = Message;
        }else if (bBlinked){
            needIcon = Blinked;
        }
        break;
    case 2:
        if (msgType && bBlinked)
            needIcon = Blinked;
        break;
    case 3:
        if (msgType){
            needIcon = Message;
        }else if (bBlinked){
            needIcon = Blinked;
        }
        break;
    }
    if (needIcon == showIcon) return;
    showIcon = needIcon;
    switch (showIcon){
    case State:
        setIcon(Pict(pClient->getStatusIcon()));
        break;
    case Message:
        setIcon(Pict(SIMClient::getMessageIcon(msgType)));
        break;
    case Blinked:
        setIcon(Pict(SIMClient::getStatusIcon(ICQ_STATUS_ONLINE)));
        break;
    default:
        break;
    }
#ifndef WIN32
    if (inTray) return;
    const char *icon = pClient->getStatusIcon();
    const char *msg  = NULL;
    const char *bmsg = NULL;
    if (msgType) bmsg = SIMClient::getMessageIcon(msgType);
    if (bBlinked){
        if (m_state & 1){
            icon = SIMClient::getStatusIcon(ICQ_STATUS_ONLINE);
        }else{
            msg = bmsg;
        }
    }else{
        if (!(m_state & 1)){
            msg = bmsg;
        }
    }
    if (wharfIcon){
        wharfIcon->set(icon, msg);
        return;
    }
    const QIconSet &icons = Icon(icon);
    QPixmap nvis(icons.pixmap(QIconSet::Large, QIconSet::Normal));
    if (!bEnlightenment){
        resize(nvis.width(), nvis.height());
        if (msg){
            QPixmap msgPict = Pict(msg);
            QRegion *rgn = NULL;
            if (nvis.mask() && msgPict.mask()){
                rgn = new QRegion(*msgPict.mask());
                rgn->translate(nvis.width() - msgPict.width() - SMALL_PICT_OFFS,
                               nvis.height() - msgPict.height() - SMALL_PICT_OFFS);
                *rgn += *nvis.mask();
            }
            QPainter p;
            p.begin(&nvis);
            p.drawPixmap(nvis.width() - msgPict.width() - SMALL_PICT_OFFS,
                         nvis.height() - msgPict.height() - SMALL_PICT_OFFS, msgPict);
            p.end();
            if (rgn){
                setMask(*rgn);
                delete rgn;
            }
        }else{
            const QBitmap *mask = nvis.mask();
            if (mask) setMask(*mask);
        }
    }
    drawIcon = nvis;
    repaint();
#endif
}