Program Listing for File graph_cc.hpp

Return to documentation for file (src/graph_cc.hpp)

/***
 *  $Id$
 **
 *  File: graph_cc.hpp
 *  Created: May 9, 2012
 *
 *  Author: Olga Wodo, Baskar Ganapathysubramanian
 *  Copyright (c) 2012 Olga Wodo, Baskar Ganapthysubramanian
 *  See accompanying LICENSE.
 *
 *  This file is part of GraSPI.
 */

#ifndef GRAPH_CC_HPP
#define GRAPH_CC_HPP

#include "graspi_types.hpp"
#include "graspi_predicates.hpp"

#include <boost/graph/connected_components.hpp>
#include <boost/graph/filtered_graph.hpp>

namespace graspi{
    inline void identify_connected_components(
                                              graspi::graph_t* G,
                                              const vertex_colors_t& C,
                                              vertex_ccs_t& vCC ){

        connect_same_color pred(*G, C);
        boost::filtered_graph<graspi::graph_t,connect_same_color> FG(*G, pred);

        int size_of_G = boost::num_vertices(*G);
        vCC.resize(size_of_G, 0);

        boost::connected_components(FG, &vCC[0]);
    }//identify_connected_components


    inline int determine_number_of_CCs(
                                       const graspi::vertex_ccs_t& vCC,
                                       const graspi::dim_g_t& d_g){

        int max_index = 0;
        // find max index
        for (unsigned int i = 0; i < vCC.size(); ++i) {
            std::cout << "id,cc: " << i << " " << vCC[i] << std::endl;
            if(vCC[i] > max_index)
                max_index = vCC[i];
        }
        int number_of_conn_comp =  max_index + 1;
        // correct nOfCC - subtract meta vertices that are identified as separate CC
        return number_of_conn_comp - d_g.n_meta_total();
    }//determine_number_of_CCs


    inline void
    determine_basic_stats_of_ccs( graspi::graph_t* G,
                                 const graspi::dim_g_t& d_g,
                                 graspi::ccs_t& CCs,
                                 const graspi::vertex_colors_t& C,
                                 const graspi::vertex_ccs_t&   vCCs ){

        std::vector<int>::const_iterator it = max_element( vCCs.begin(),
                                                          vCCs.end() );
        CCs.resize( (*it)+1 );

#ifdef DEBUG
        std::cout << "Total number of connected components" << *it << std::endl;
#endif
        for (unsigned int  i = 0; i < vCCs.size(); i++){
            CCs[vCCs[i]].color = C[i];
            CCs[vCCs[i]].size++;
        }

        unsigned int size_of_G = boost::num_vertices(*G);

        // determine all vertices connected to the bottom electrode
        std::set<int> comp_conn_to_electrode;
        graspi::vertex_t source = d_g.id_blue(); // bottom electrode index
        graspi::graph_t::adjacency_iterator u, u_end;
        boost::tie(u, u_end) = boost::adjacent_vertices(source, *G);
        for (; u != u_end; ++u) {
            comp_conn_to_electrode.insert(vCCs[*u]);
        }

#ifdef DEBUG
        std::cout << "Id of connected components connected to bottom " << std::endl;
        copy(comp_conn_to_electrode.begin(), comp_conn_to_electrode.end(),
             std::ostream_iterator<int>(std::cout, " "));
        std::cout << std::endl;
#endif

        // pass info about connectivity to bottom electrode to data of components
        for(unsigned int  i = 0; i < CCs.size(); i++ ){
            if( comp_conn_to_electrode.find(i) != comp_conn_to_electrode.end() )
                CCs[i].if_connected_to_electrode += 1;
        }

        // determine all vertices connected to the top electrode
        comp_conn_to_electrode.clear();
        source = d_g.id_red(); // top electrode index
        boost::tie(u, u_end) = boost::adjacent_vertices(source, *G);
        for (; u != u_end; ++u) {
            comp_conn_to_electrode.insert(vCCs[*u]);
        }

#ifdef DEBUG
        std::cout << "Id of connected components conn to top " << std::endl;
        std::set<int>::iterator its = comp_conn_to_electrode.begin();
        for (int i = 0; i < comp_conn_to_electrode.size(); i++){
            int id = *its;
            std::cout << id << " " << CCs[id].color << std::endl;
            its++;
        }
        std::cout << std::endl;
#endif


        // pass info about connectivity to top electrode to data of components
        for(unsigned int  i = 0; i < CCs.size(); i++ ){
            if( comp_conn_to_electrode.find(i) != comp_conn_to_electrode.end() )
                CCs[i].if_connected_to_electrode += 2;
        }
    }//determine_basic_stats_of_ccs




}
#endif