HavoqGT
page_rank.hpp
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2013, Lawrence Livermore National Security, LLC.
3  * Produced at the Lawrence Livermore National Laboratory.
4  * Written by Roger Pearce <rpearce@llnl.gov>.
5  * LLNL-CODE-644630.
6  * All rights reserved.
7  *
8  * This file is part of HavoqGT, Version 0.1.
9  * For details, see https://computation.llnl.gov/casc/dcca-pub/dcca/Downloads.html
10  *
11  * Please also read this link – Our Notice and GNU Lesser General Public License.
12  * http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html
13  *
14  * This program is free software; you can redistribute it and/or modify it under
15  * the terms of the GNU Lesser General Public License (as published by the Free
16  * Software Foundation) version 2.1 dated February 1999.
17  *
18  * This program is distributed in the hope that it will be useful, but WITHOUT ANY
19  * WARRANTY; without even the IMPLIED WARRANTY OF MERCHANTABILITY or FITNESS FOR A
20  * PARTICULAR PURPOSE. See the terms and conditions of the GNU General Public
21  * License for more details.
22  *
23  * You should have received a copy of the GNU Lesser General Public License along
24  * with this program; if not, write to the Free Software Foundation, Inc.,
25  * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
26  *
27  * OUR NOTICE AND TERMS AND CONDITIONS OF THE GNU GENERAL PUBLIC LICENSE
28  *
29  * Our Preamble Notice
30  *
31  * A. This notice is required to be provided under our contract with the
32  * U.S. Department of Energy (DOE). This work was produced at the Lawrence
33  * Livermore National Laboratory under Contract No. DE-AC52-07NA27344 with the DOE.
34  *
35  * B. Neither the United States Government nor Lawrence Livermore National
36  * Security, LLC nor any of their employees, makes any warranty, express or
37  * implied, or assumes any liability or responsibility for the accuracy,
38  * completeness, or usefulness of any information, apparatus, product, or process
39  * disclosed, or represents that its use would not infringe privately-owned rights.
40  *
41  * C. Also, reference herein to any specific commercial products, process, or
42  * services by trade name, trademark, manufacturer or otherwise does not
43  * necessarily constitute or imply its endorsement, recommendation, or favoring by
44  * the United States Government or Lawrence Livermore National Security, LLC. The
45  * views and opinions of authors expressed herein do not necessarily state or
46  * reflect those of the United States Government or Lawrence Livermore National
47  * Security, LLC, and shall not be used for advertising or product endorsement
48  * purposes.
49  *
50  */
51 
52 
53 #ifndef HAVOQGT_MPI_PAGE_RANK_HPP_INCLUDED
54 #define HAVOQGT_MPI_PAGE_RANK_HPP_INCLUDED
55 
56 
57 
59 #include <boost/container/deque.hpp>
60 #include <vector>
61 
62 namespace havoqgt { namespace mpi {
63 
64 template <typename Visitor>
65 class pr_queue
66 {
67 
68 protected:
69  std::vector< Visitor > m_data;
70 public:
71  pr_queue() { }
72 
73  bool push(Visitor const & task)
74  {
75  m_data.push_back(task);
76  return true;
77  }
78 
79  void pop()
80  {
81  m_data.pop_back();
82  }
83 
84  Visitor const & top() //const
85  {
86  return m_data.back();
87  }
88 
89  size_t size() const
90  {
91  return m_data.size();;
92  }
93 
94  bool empty() const
95  {
96  return m_data.empty();
97  }
98 
99  void clear()
100  {
101  m_data.clear();
102  }
103 };
104 
105 
106 
107 template<typename Graph, typename PRData>
108 class pr_visitor {
109 public:
110  typedef typename Graph::vertex_locator vertex_locator;
111  pr_visitor(): rank(0) { }
112 
113  pr_visitor(vertex_locator _vertex, double _rank)
114  : vertex(_vertex)
115  , rank(_rank) { }
116 
117  pr_visitor(vertex_locator _vertex)
118  : vertex(_vertex)
119  , rank(0) { }
120 
121 
122  bool pre_visit() const {
123  rank_data()[vertex] += rank;
124  return false;
125  }
126 
127  template<typename VisitorQueueHandle>
128  bool visit(Graph& g, VisitorQueueHandle vis_queue) const {
129  double old_rank = 1;
130  uint64_t degree = g.degree(vertex);
131  double send_rank = 1;//old_rank / double(degree);
132 
133 
134  typedef typename Graph::edge_iterator eitr_type;
135  for(eitr_type eitr = g.edges_begin(vertex); eitr != g.edges_end(vertex); ++eitr) {
136  vertex_locator neighbor = eitr.target();
137  pr_visitor new_visitor( neighbor, send_rank);
138  vis_queue->queue_visitor(new_visitor);
139  }
140  return true;
141 
142  }
143 
144 
145  friend inline bool operator>(const pr_visitor& v1, const pr_visitor& v2) {
146  return false;
147  }
148 
149  friend inline bool operator<(const pr_visitor& v1, const pr_visitor& v2) {
150  return false;
151  }
152 
153  static PRData& rank_data(PRData* _data = NULL) {
154  static PRData* data;
155  if(_data) data = _data;
156  return *data;
157  }
158 
159 
160  vertex_locator vertex;
161  double rank;
162 };
163 
164 
165 template <typename TGraph, typename PRData>
166 void page_rank(TGraph& g, PRData& pr_data) {
167  typedef pr_visitor<TGraph, PRData> visitor_type;
168  visitor_type::rank_data(&pr_data);
169  typedef visitor_queue< visitor_type, pr_queue, TGraph > visitor_queue_type;
170 
171  visitor_queue_type vq(&g);
172  vq.init_visitor_traversal();
173  pr_data.all_reduce();
174 }
175 
176 
177 
178 }} //end namespace havoqgt::mpi
179 
180 
181 
182 
183 #endif //HAVOQGT_MPI_PAGE_RANK_HPP_INCLUDED
friend bool operator>(const pr_visitor &v1, const pr_visitor &v2)
Definition: page_rank.hpp:145
bool push(Visitor const &task)
Definition: page_rank.hpp:73
void page_rank(TGraph &g, PRData &pr_data)
Definition: page_rank.hpp:166
friend bool operator<(const pr_visitor &v1, const pr_visitor &v2)
Definition: page_rank.hpp:149
std::vector< Visitor > m_data
Definition: page_rank.hpp:69
bool empty() const
Definition: page_rank.hpp:94
Graph::vertex_locator vertex_locator
Definition: page_rank.hpp:110
vertex_locator vertex
Definition: page_rank.hpp:160
bool visit(Graph &g, VisitorQueueHandle vis_queue) const
Definition: page_rank.hpp:128
pr_visitor(vertex_locator _vertex)
Definition: page_rank.hpp:117
pr_visitor(vertex_locator _vertex, double _rank)
Definition: page_rank.hpp:113
static PRData & rank_data(PRData *_data=NULL)
Definition: page_rank.hpp:153
bool pre_visit() const
Definition: page_rank.hpp:122
Visitor const & top()
Definition: page_rank.hpp:84
size_t size() const
Definition: page_rank.hpp:89