graph_community_network_vavg.cc 5.59 KB
Newer Older
1 2
// graph-tool -- a general graph modification and manipulation thingy
//
Tiago Peixoto's avatar
Tiago Peixoto committed
3
// Copyright (C) 2006-2014 Tiago de Paula Peixoto <tiago@skewed.de>
4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71
//
// This program is free software; you can redistribute it and/or
// modify it under the terms of the GNU General Public License
// as published by the Free Software Foundation; either version 3
// of the License, or (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.

#include "graph_python_interface.hh"
#include "graph_filtering.hh"
#include "graph.hh"
#include "graph_selectors.hh"
#include "graph_properties.hh"

#include <boost/bind.hpp>
#include <boost/bind/placeholders.hpp>
#include <boost/mpl/push_back.hpp>
#include <boost/python.hpp>

#include "graph_community_network.hh"

using namespace std;
using namespace boost;

using namespace graph_tool;

typedef ConstantPropertyMap<int32_t,GraphInterface::vertex_t> no_vweight_map_t;
typedef property_map_type::apply<int32_t,GraphInterface::vertex_index_map_t>::type vcount_map_t;


struct get_weighted_vertex_property_dispatch
{
    template <class Graph, class VertexWeightMap, class Vprop>
    void operator()(const Graph& g, VertexWeightMap vweight, Vprop vprop,
                    boost::any atemp) const
    {
        typename Vprop::checked_t temp = boost::any_cast<typename Vprop::checked_t>(atemp);
        get_weighted_vertex_property()(g, vweight, vprop, temp.get_unchecked(num_vertices(g)));
    }
};


struct get_vertex_sum_dispatch
{
    template <class Graph, class CommunityGraph, class CommunityMap, class Vprop>
    void operator()(const Graph& g, CommunityGraph& cg, CommunityMap s_map,
                    boost::any acs_map, Vprop vprop, boost::any acvprop) const
    {
        typename CommunityMap::checked_t cs_map = boost::any_cast<typename CommunityMap::checked_t>(acs_map);
        typename Vprop::checked_t cvprop = boost::any_cast<typename Vprop::checked_t>(acvprop);
        get_vertex_community_property_sum()(g, cg, s_map,
                                            cs_map.get_unchecked(num_vertices(cg)), vprop,
                                            cvprop.get_unchecked(num_vertices(cg)));
    }
};


void community_network_vavg(GraphInterface& gi, GraphInterface& cgi,
                            boost::any community_property,
                            boost::any condensed_community_property,
                            boost::any vertex_count,
                            boost::any vweight,
Tiago Peixoto's avatar
Tiago Peixoto committed
72
                            boost::python::list avprops)
73
{
Tiago Peixoto's avatar
Tiago Peixoto committed
74
    typedef boost::mpl::push_back<writable_vertex_scalar_properties, no_vweight_map_t>::type
75 76 77 78 79 80 81 82 83
        vweight_properties;

    bool no_weight = false;
    if (vweight.empty())
    {
        no_weight = true;
        vweight = no_vweight_map_t(1);
    }

Tiago Peixoto's avatar
Tiago Peixoto committed
84 85 86 87 88 89
    typedef boost::mpl::insert_range<writable_vertex_scalar_properties,
                                     boost::mpl::end<writable_vertex_scalar_properties>::type,
                                     vertex_scalar_vector_properties>::type vprops_temp;
    typedef boost::mpl::push_back<vprops_temp,
                                  property_map_type::apply<boost::python::object,
                                                           GraphInterface::vertex_index_map_t>::type>::type
90 91
        vprops_t;

Tiago Peixoto's avatar
Tiago Peixoto committed
92
    for(int i = 0; i < boost::python::len(avprops); ++i)
93
    {
94 95 96
        boost::any vprop = boost::python::extract<any>(avprops[i][0])();
        boost::any temp = boost::python::extract<any>(avprops[i][1])();
        boost::any cvprop = boost::python::extract<any>(avprops[i][2])();
97 98 99 100 101

        if (!no_weight)
        {
            // compute weighted values to temp
            run_action<graph_tool::detail::always_directed>()
Tiago Peixoto's avatar
Tiago Peixoto committed
102 103 104
                (gi, std::bind(get_weighted_vertex_property_dispatch(),
                               placeholders::_1, placeholders::_2,
                               placeholders::_3, temp),
105 106 107 108 109
                 vweight_properties(), vprops_t())
                (vweight, vprop);

            // sum weighted values
            run_action<graph_tool::detail::always_directed>()
Tiago Peixoto's avatar
Tiago Peixoto committed
110 111 112 113 114
                (gi, std::bind(get_vertex_sum_dispatch(),
                               placeholders::_1, std::ref(cgi.GetGraph()),
                               placeholders::_2,
                               condensed_community_property,
                               placeholders::_3, cvprop),
115 116 117 118 119 120 121
                 writable_vertex_properties(), vprops_t())
                (community_property, temp);
        }
        else
        {
            // sum unweighted values
            run_action<graph_tool::detail::always_directed>()
Tiago Peixoto's avatar
Tiago Peixoto committed
122 123 124 125 126
                (gi, std::bind(get_vertex_sum_dispatch(),
                               placeholders::_1, std::ref(cgi.GetGraph()),
                               placeholders::_2,
                               condensed_community_property,
                               placeholders::_3, cvprop),
127 128 129 130 131 132
                 writable_vertex_properties(), vprops_t())
                (community_property, vprop);
        }

        // norm summed values
        run_action<graph_tool::detail::never_filtered>()
Tiago Peixoto's avatar
Tiago Peixoto committed
133 134
            (cgi, std::bind(get_vertex_community_property_norm(),
                            placeholders::_1, placeholders::_2, placeholders::_3),
135 136 137 138
             vweight_properties(), vprops_t())
            (vertex_count, cvprop);
    }
}