graph_generation.cc 4.55 KB
Newer Older
Tiago Peixoto's avatar
Tiago Peixoto committed
1
2
// graph-tool -- a general graph modification and manipulation thingy
//
Tiago Peixoto's avatar
Tiago Peixoto committed
3
// Copyright (C) 2006-2013 Tiago de Paula Peixoto <tiago@skewed.de>
Tiago Peixoto's avatar
Tiago Peixoto committed
4
5
6
//
// This program is free software; you can redistribute it and/or
// modify it under the terms of the GNU General Public License
Tiago Peixoto's avatar
Tiago Peixoto committed
7
// as published by the Free Software Foundation; either version 3
Tiago Peixoto's avatar
Tiago Peixoto committed
8
9
10
11
12
13
14
15
// 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
16
17
// along with this program. If not, see <http://www.gnu.org/licenses/>.

Tiago Peixoto's avatar
Tiago Peixoto committed
18
#include "graph.hh"
19
20
21
22
#include "graph_util.hh"
#include "graph_filtering.hh"
#include "graph_generation.hh"
#include <boost/python.hpp>
Tiago Peixoto's avatar
Tiago Peixoto committed
23
24
25
26
27

using namespace std;
using namespace boost;
using namespace graph_tool;

28
class PythonFuncWrap
Tiago Peixoto's avatar
Tiago Peixoto committed
29
{
30
public:
31
    PythonFuncWrap(python::object o): _o(o) {}
32

33
    pair<size_t, size_t> operator()(size_t i) const
Tiago Peixoto's avatar
Tiago Peixoto committed
34
    {
35
        python::object ret = _o(i);
36
        return python::extract<pair<size_t,size_t> >(ret);
Tiago Peixoto's avatar
Tiago Peixoto committed
37
38
    }

39
    size_t operator()(size_t i, bool) const
Tiago Peixoto's avatar
Tiago Peixoto committed
40
    {
41
        python::object ret = _o(i);
42
        return python::extract<size_t>(ret);
43
44
    }

45
private:
46
47
48
    python::object _o;
};

49
50
void generate_graph(GraphInterface& gi, size_t N, python::object deg_sample,
                    bool uncorrelated, bool no_parallel, bool no_self_loops,
51
                    bool undirected, rng_t& rng, bool verbose, bool verify)
Tiago Peixoto's avatar
Tiago Peixoto committed
52
{
53
54
55
56
57
58
59
60
61
62
63
    typedef graph_tool::detail::get_all_graph_views::apply<
    graph_tool::detail::scalar_pairs, mpl::bool_<false>,
        mpl::bool_<false>, mpl::bool_<false>,
        mpl::bool_<true>, mpl::bool_<true> >::type graph_views;

    if (undirected)
        gi.SetDirected(false);

    if (uncorrelated)
    {
        run_action<graph_views>()
64
            (gi, bind<void>(gen_graph(), _1, N,
65
66
                            PythonFuncWrap(deg_sample),
                            no_parallel, no_self_loops,
67
                            ref(rng), verbose, verify))();
68
69
70
71
    }
    else
    {
        run_action<graph_views>()
72
            (gi, bind<void>(gen_graph(), _1, N,
73
74
                            PythonFuncWrap(deg_sample),
                            no_parallel, no_self_loops,
75
                            ref(rng), verbose, verify))();
76
77
    }
}
78

79
80
size_t random_rewire(GraphInterface& gi, string strat, size_t niter,
                     bool no_sweep, bool self_loops, bool parallel_edges,
81
                     python::object corr_prob, boost::any block,
82
                     bool cache, rng_t& rng, bool verbose);
Tiago Peixoto's avatar
Tiago Peixoto committed
83
84
void predecessor_graph(GraphInterface& gi, GraphInterface& gpi,
                       boost::any pred_map);
85
86
void line_graph(GraphInterface& gi, GraphInterface& lgi,
                boost::any edge_index);
87
88
python::tuple graph_union(GraphInterface& ugi, GraphInterface& gi,
                          boost::any avprop);
Tiago Peixoto's avatar
Tiago Peixoto committed
89
90
91
92
93
94
void vertex_property_union(GraphInterface& ugi, GraphInterface& gi,
                           boost::any p_vprop, boost::any p_eprop,
                           boost::any uprop, boost::any prop);
void edge_property_union(GraphInterface& ugi, GraphInterface& gi,
                         boost::any p_vprop, boost::any p_eprop,
                         boost::any uprop, boost::any prop);
95
void triangulation(GraphInterface& gi, python::object points, boost::any pos,
96
                   string type, bool periodic);
97
98
99
void lattice(GraphInterface& gi, python::object oshape, bool periodic);
void geometric(GraphInterface& gi, python::object opoints, double r,
               python::object orange, bool periodic, boost::any pos);
100
void price(GraphInterface& gi, size_t N, double gamma, double c, size_t m,
101
           rng_t& rng);
Tiago Peixoto's avatar
Tiago Peixoto committed
102
void complete(GraphInterface& gi, size_t N, bool directed, bool self_loops);
Tiago Peixoto's avatar
Tiago Peixoto committed
103
void circular(GraphInterface& gi, size_t N, size_t k, bool directed, bool self_loops);
104
105
106

using namespace boost::python;

107
108
BOOST_PYTHON_MODULE(libgraph_tool_generation)
{
109
    def("gen_graph", &generate_graph);
110
    def("random_rewire", &random_rewire);
Tiago Peixoto's avatar
Tiago Peixoto committed
111
    def("predecessor_graph", &predecessor_graph);
112
    def("line_graph", &line_graph);
Tiago Peixoto's avatar
Tiago Peixoto committed
113
114
115
    def("graph_union", &graph_union);
    def("vertex_property_union", &vertex_property_union);
    def("edge_property_union", &edge_property_union);
116
    def("triangulation", &triangulation);
117
118
    def("lattice", &lattice);
    def("geometric", &geometric);
119
    def("price", &price);
Tiago Peixoto's avatar
Tiago Peixoto committed
120
    def("complete", &complete);
Tiago Peixoto's avatar
Tiago Peixoto committed
121
    def("circular", &circular);
Tiago Peixoto's avatar
Tiago Peixoto committed
122
}