]> git.proxmox.com Git - ceph.git/blobdiff - ceph/src/boost/libs/graph/example/actor_clustering.cpp
update source to Ceph Pacific 16.2.2
[ceph.git] / ceph / src / boost / libs / graph / example / actor_clustering.cpp
index 9b1b40221b14d5cee89a3de04a32ef2be7e817f2..5564a9e9c1196438d886b45821a710082f2c0ef9 100644 (file)
@@ -29,159 +29,191 @@ using namespace boost;
 
 struct Actor
 {
-  Actor(int id = -1) : id(id) {}
+    Actor(int id = -1) : id(id) {}
 
-  int id;
+    int id;
 };
 
-typedef adjacency_list<vecS, vecS, undirectedS, Actor,
-                       property<edge_centrality_t, double> > ActorGraph;
-typedef graph_traits<ActorGraph>::vertex_descriptor Vertex;
-typedef graph_traits<ActorGraph>::edge_descriptor Edge;
+typedef adjacency_list< vecS, vecS, undirectedS, Actor,
+    property< edge_centrality_t, double > >
+    ActorGraph;
+typedef graph_traits< ActorGraph >::vertex_descriptor Vertex;
+typedef graph_traits< ActorGraph >::edge_descriptor Edge;
 
 void load_actor_graph(std::istream& in, ActorGraph& g)
 {
-  std::map<int, Vertex> actors;
-
-  std::string line;
-  while (getline(in, line)) {
-    std::vector<Vertex> actors_in_movie;
-
-    // Map from the actor numbers on this line to the actor vertices
-    typedef tokenizer<char_separator<char> > Tok;
-    Tok tok(line, char_separator<char>(" "));
-    for (Tok::iterator id = tok.begin(); id != tok.end(); ++id) {
-      int actor_id = lexical_cast<int>(*id);
-      std::map<int, Vertex>::iterator v = actors.find(actor_id);
-      if (v == actors.end()) {
-        Vertex new_vertex = add_vertex(Actor(actor_id), g);
-        actors[actor_id] = new_vertex;
-        actors_in_movie.push_back(new_vertex);
-      } else {
-        actors_in_movie.push_back(v->second);
-      }
+    std::map< int, Vertex > actors;
+
+    std::string line;
+    while (getline(in, line))
+    {
+        std::vector< Vertex > actors_in_movie;
+
+        // Map from the actor numbers on this line to the actor vertices
+        typedef tokenizer< char_separator< char > > Tok;
+        Tok tok(line, char_separator< char >(" "));
+        for (Tok::iterator id = tok.begin(); id != tok.end(); ++id)
+        {
+            int actor_id = lexical_cast< int >(*id);
+            std::map< int, Vertex >::iterator v = actors.find(actor_id);
+            if (v == actors.end())
+            {
+                Vertex new_vertex = add_vertex(Actor(actor_id), g);
+                actors[actor_id] = new_vertex;
+                actors_in_movie.push_back(new_vertex);
+            }
+            else
+            {
+                actors_in_movie.push_back(v->second);
+            }
+        }
+
+        for (std::vector< Vertex >::iterator i = actors_in_movie.begin();
+             i != actors_in_movie.end(); ++i)
+        {
+            for (std::vector< Vertex >::iterator j = i + 1;
+                 j != actors_in_movie.end(); ++j)
+            {
+                if (!edge(*i, *j, g).second)
+                    add_edge(*i, *j, g);
+            }
+        }
     }
-
-    for (std::vector<Vertex>::iterator i = actors_in_movie.begin();
-         i != actors_in_movie.end(); ++i) {
-      for (std::vector<Vertex>::iterator j = i + 1; 
-           j != actors_in_movie.end(); ++j) {
-        if (!edge(*i, *j, g).second) add_edge(*i, *j, g);
-      }
-    }
-  }
 }
 
-template<typename Graph, typename VertexIndexMap, typename VertexNameMap>
-std::ostream& 
-write_pajek_graph(std::ostream& out, const Graph& g, 
-                  VertexIndexMap vertex_index, VertexNameMap vertex_name)
+template < typename Graph, typename VertexIndexMap, typename VertexNameMap >
+std::ostream& write_pajek_graph(std::ostream& out, const Graph& g,
+    VertexIndexMap vertex_index, VertexNameMap vertex_name)
 {
-  out << "*Vertices " << num_vertices(g) << '\n';
-  typedef typename graph_traits<Graph>::vertex_iterator vertex_iterator;
-  for (vertex_iterator v = vertices(g).first; v != vertices(g).second; ++v) {
-    out << get(vertex_index, *v)+1 << " \"" << get(vertex_name, *v) << "\"\n";
-  }
-
-  out << "*Edges\n";
-  typedef typename graph_traits<Graph>::edge_iterator edge_iterator;
-  for (edge_iterator e = edges(g).first; e != edges(g).second; ++e) {
-    out << get(vertex_index, source(*e, g))+1 << ' ' 
-        << get(vertex_index, target(*e, g))+1 << " 1.0\n"; // HACK!
-  }
-  return out;
+    out << "*Vertices " << num_vertices(g) << '\n';
+    typedef typename graph_traits< Graph >::vertex_iterator vertex_iterator;
+    for (vertex_iterator v = vertices(g).first; v != vertices(g).second; ++v)
+    {
+        out << get(vertex_index, *v) + 1 << " \"" << get(vertex_name, *v)
+            << "\"\n";
+    }
+
+    out << "*Edges\n";
+    typedef typename graph_traits< Graph >::edge_iterator edge_iterator;
+    for (edge_iterator e = edges(g).first; e != edges(g).second; ++e)
+    {
+        out << get(vertex_index, source(*e, g)) + 1 << ' '
+            << get(vertex_index, target(*e, g)) + 1 << " 1.0\n"; // HACK!
+    }
+    return out;
 }
 
-class actor_clustering_threshold : public bc_clustering_threshold<double>
+class actor_clustering_threshold : public bc_clustering_threshold< double >
 {
-  typedef bc_clustering_threshold<double> inherited;
-
- public:
-  actor_clustering_threshold(double threshold, const ActorGraph& g,
-                             bool normalize)
-    : inherited(threshold, g, normalize), iter(1) { }
-
-  bool operator()(double max_centrality, Edge e, const ActorGraph& g)
-  {
-    std::cout << "Iter: " << iter << " Max Centrality: " 
-              << (max_centrality / dividend) << std::endl;
-    ++iter;
-    return inherited::operator()(max_centrality, e, g);
-  }
-
- private:
-  unsigned int iter;
+    typedef bc_clustering_threshold< double > inherited;
+
+public:
+    actor_clustering_threshold(
+        double threshold, const ActorGraph& g, bool normalize)
+    : inherited(threshold, g, normalize), iter(1)
+    {
+    }
+
+    bool operator()(double max_centrality, Edge e, const ActorGraph& g)
+    {
+        std::cout << "Iter: " << iter
+                  << " Max Centrality: " << (max_centrality / dividend)
+                  << std::endl;
+        ++iter;
+        return inherited::operator()(max_centrality, e, g);
+    }
+
+private:
+    unsigned int iter;
 };
 
 int main(int argc, char* argv[])
 {
-  std::string in_file;
-  std::string out_file;
-  double threshold = -1.0;
-  bool normalize = false;
-
-  // Parse command-line options
-  {
-    int on_arg = 1;
-    while (on_arg < argc) {
-      std::string arg(argv[on_arg]);
-      if (arg == "-in") {
-        ++on_arg; assert(on_arg < argc);
-        in_file = argv[on_arg];
-      } else if (arg == "-out") {
-        ++on_arg; assert(on_arg < argc);
-        out_file = argv[on_arg];
-      } else if (arg == "-threshold") {
-        ++on_arg; assert(on_arg < argc);
-        threshold = lexical_cast<double>(argv[on_arg]);
-      } else if (arg == "-normalize") {
-        normalize = true;
-      } else {
-        std::cerr << "Unrecognized parameter \"" << arg << "\".\n";
-        return -1;
-      }
-      ++on_arg;
+    std::string in_file;
+    std::string out_file;
+    double threshold = -1.0;
+    bool normalize = false;
+
+    // Parse command-line options
+    {
+        int on_arg = 1;
+        while (on_arg < argc)
+        {
+            std::string arg(argv[on_arg]);
+            if (arg == "-in")
+            {
+                ++on_arg;
+                assert(on_arg < argc);
+                in_file = argv[on_arg];
+            }
+            else if (arg == "-out")
+            {
+                ++on_arg;
+                assert(on_arg < argc);
+                out_file = argv[on_arg];
+            }
+            else if (arg == "-threshold")
+            {
+                ++on_arg;
+                assert(on_arg < argc);
+                threshold = lexical_cast< double >(argv[on_arg]);
+            }
+            else if (arg == "-normalize")
+            {
+                normalize = true;
+            }
+            else
+            {
+                std::cerr << "Unrecognized parameter \"" << arg << "\".\n";
+                return -1;
+            }
+            ++on_arg;
+        }
+
+        if (in_file.empty() || out_file.empty() || threshold < 0)
+        {
+            std::cerr << "error: syntax is actor_clustering [options]\n\n"
+                      << "options are:\n"
+                      << "\t-in <infile>\tInput file\n"
+                      << "\t-out <outfile>\tOutput file\n"
+                      << "\t-threshold <value>\tA threshold value\n"
+                      << "\t-normalize\tNormalize edge centrality scores\n";
+            return -1;
+        }
     }
 
-    if (in_file.empty() || out_file.empty() || threshold < 0) {
-      std::cerr << "error: syntax is actor_clustering [options]\n\n"
-                << "options are:\n"
-                << "\t-in <infile>\tInput file\n"
-                << "\t-out <outfile>\tOutput file\n"
-                << "\t-threshold <value>\tA threshold value\n"
-                << "\t-normalize\tNormalize edge centrality scores\n";
-      return -1;
+    ActorGraph g;
+
+    // Load the actor graph
+    {
+        std::cout << "Building graph." << std::endl;
+        std::ifstream in(in_file.c_str());
+        if (!in)
+        {
+            std::cerr << "Unable to open file \"" << in_file
+                      << "\" for input.\n";
+            return -2;
+        }
+        load_actor_graph(in, g);
     }
-  }
-
-  ActorGraph g;
 
-  // Load the actor graph
-  {
-    std::cout << "Building graph." << std::endl;
-    std::ifstream in(in_file.c_str());
-    if (!in) {
-      std::cerr << "Unable to open file \"" << in_file << "\" for input.\n";
-      return -2;
-    }
-    load_actor_graph(in, g);
-  }
-
-  // Run the algorithm
-  std::cout << "Clusting..." << std::endl;
-  betweenness_centrality_clustering(g, 
-    actor_clustering_threshold(threshold, g, normalize), 
-    get(edge_centrality, g));
-
-  // Output the graph
-  {
-    std::cout << "Writing graph to file: " << out_file << std::endl;
-    std::ofstream out(out_file.c_str());
-    if (!out) {
-      std::cerr << "Unable to open file \"" << out_file << "\" for output.\n";
-      return -3;
+    // Run the algorithm
+    std::cout << "Clusting..." << std::endl;
+    betweenness_centrality_clustering(g,
+        actor_clustering_threshold(threshold, g, normalize),
+        get(edge_centrality, g));
+
+    // Output the graph
+    {
+        std::cout << "Writing graph to file: " << out_file << std::endl;
+        std::ofstream out(out_file.c_str());
+        if (!out)
+        {
+            std::cerr << "Unable to open file \"" << out_file
+                      << "\" for output.\n";
+            return -3;
+        }
+        write_pajek_graph(out, g, get(vertex_index, g), get(&Actor::id, g));
     }
-    write_pajek_graph(out, g, get(vertex_index, g), get(&Actor::id, g));
-  }
-  return 0;
+    return 0;
 }