All Distance Sketch  0.1
All distance sketch based algorithms
t_skim_dijkstra.h
1 #ifndef SRC_ALGORITHMS_T_SKIM_DIJKSTRA_H_
2 #define SRC_ALGORITHMS_T_SKIM_DIJKSTRA_H_
3 
4 #include "./t_skim.h"
5 
6 namespace all_distance_sketch {
7 
10 template <class Z>
11 class TSkimApproxSeedExactCover : public TSkimBase<Z> {
12  public:
13  void InitTSkim(int T,
14  int K_all_distance_sketch,
15  int min_influence_for_seed,
16  std::vector<std::vector<int>>* reverse_refernce,
17  Cover * cover,
18  graph::Graph<Z>* graph) {
19  K_all_distance_sketch_ = K_all_distance_sketch;
20  graph_sketch_ = NULL;
21  reverse_refernce_ = reverse_refernce;
22  TSkimBase<Z>::InitTSkimBase(T, min_influence_for_seed, cover, graph);
23  }
24 
25  void set_graph_sketch(GraphSketch* graph_sketch) {
26  graph_sketch_ = graph_sketch;
27  }
28 
29  int AddSeed(int seed, std::unordered_map<int, int>* influence_change) {
30  LOG_M(DEBUG3, "seed node = " << seed);
31  return TSkimBase<Z>::UpdateCover(seed, influence_change, (*reverse_refernce_)[seed]);
32  }
33 
34  const std::vector<int>& CalculateVisitedNodes(int source_node_id) {
35  NodeIdRandomIdData source_node_details(source_node_id, graph_sketch_->GetNodeRandomId(source_node_id));
36  NodeSketch * source_sketch = graph_sketch_->GetNodeSketch(source_node_details);
37  double distance = source_sketch->GetDistanceCoverNeighborhood(this->T_);
38  typename Z::TNode source(source_node_id);
39  LOG_M(DEBUG3, "Running from node=" << source_node_id << " T=" << this->T_ << " Distance=" << distance);
40  call_backs_.InitTSkimDijkstraCallBacksDistancePrune(distance);
41  PrunedDijkstra< Z, TSkimDijkstraCallBacksDistancePrune<Z> > (source,
42  TSkimBase<Z>::graph_,
43  &call_backs_,
44  &param_);
45  return call_backs_.get_visited_nodes();
46  }
47 
48  int Run() {
49  TSkimBase<Z>::PreRunInit();
50  GraphSketch local_graph_sketch;
51  this->graph_->Transpose(&graph_transpose_);
52  if (graph_sketch_ == NULL) {
53  graph_sketch_ = &local_graph_sketch;
54  graph_sketch_->InitGraphSketch(K_all_distance_sketch_, this->graph_->GetMxNId());
55  CalculateGraphSketch<Z>(&graph_transpose_, graph_sketch_);
56  }
57  reverse_rank_call_backs_.InitTSkimReverseRankCallBacks(this->T_);
58  reverse_rank_call_backs_.SetWantedNodes(this->wanted_nodes_);
59  call_backs_.SetWantedNodes(this->rankees_nodes_);
60  return TSkimBase<Z>::Run(false);
61  }
62 
63  private:
64  int K_all_distance_sketch_;
65  graph::Graph<Z> graph_transpose_;
66  GraphSketch* graph_sketch_;
67  TSkimReverseRankCallBacks<Z> reverse_rank_call_backs_;
68  DijkstraParams param_;
69  TSkimDijkstraCallBacksDistancePrune<Z> call_backs_;
70  std::vector<std::vector<int>>* reverse_refernce_;
71 };
72 
73 template <class Z>
74 class TSkimExactComputationBased : public TSkimBase<Z> {
75  public:
76  void InitTSkim(int T,
77  Cover * cover,
78  std::vector<std::vector<int> >* reachable_nodes,
79  std::vector<std::vector<int> >* reverse_refernce,
80  graph::Graph<Z>* graph) {
81  reverse_refernce_ = reverse_refernce;
82  reachable_nodes_ = reachable_nodes;
83  TSkimBase<Z>::InitTSkimBase(T, INT_MAX, cover, graph);
84  }
85 
86  int AddSeed(int seed, std::unordered_map<int, int>* influence_change) {
87  LOG_M(DEBUG3, "seed node = " << seed << " seed cover size=" << (*reverse_refernce_)[seed].size());
88  int num_covered = TSkimBase<Z>::UpdateCover(seed, influence_change, (*reverse_refernce_)[seed]);
89  LOG_M(DEBUG3, "seed node = " << seed << " num_covered=" << num_covered);
90  return num_covered;
91  }
92 
93  const std::vector<int>& CalculateVisitedNodes(int source_node_id) {
94  return (*reachable_nodes_)[source_node_id];
95  }
96 
97  private:
98  std::vector<std::vector<int> >* reachable_nodes_;
99  std::vector<std::vector<int> >* reverse_refernce_;
100 };
101 
102 
103 template <class Z>
104 class TSkimApproxVsExact : public TSkimBase<Z> {
105  public:
106  void InitTSkim(int T,
107  int K_all_distance_sketch,
108  int min_influence_for_seed,
109  std::vector<std::vector<int>>* reverse_refernce,
110  Cover * cover,
111  graph::Graph<Z>* graph) {
112  K_all_distance_sketch_ = K_all_distance_sketch;
113  graph_sketch_approx = NULL;
114  TSkimBase<Z>::InitTSkimBase(T, min_influence_for_seed, cover, graph);
115  }
116 
117  int AddSeed(int seed, std::unordered_map<int, int>* influence_change) {
118  LOG_M(DEBUG3, "seed node = " << seed);
119  std::vector<int> ranking;
120  return TSkimBase<Z>::UpdateCover(seed, influence_change, reverse_rank_call_backs_.get_visited_nodes());
121  }
122 
123  const std::vector<int>& CalculateVisitedNodes(int source_node_id) {
124  NodeIdRandomIdData source_node_details(source_node_id, graph_sketch_approx->GetNodeRandomId(source_node_id));
125  NodeSketch * source_sketch = graph_sketch_approx->GetNodeSketch(source_node_details);
126  double distance = source_sketch->GetDistanceCoverNeighborhood(this->T_);
127  typename Z::TNode source(source_node_id);
128  LOG_M(DEBUG3, "Running from node=" << source_node_id << " T=" << this->T_ << " Distance=" << distance);
129  call_backs_.InitTSkimDijkstraCallBacksDistancePrune(distance);
130  PrunedDijkstra< Z, TSkimDijkstraCallBacksDistancePrune<Z> > (source,
131  TSkimBase<Z>::graph_,
132  &call_backs_,
133  &param_);
134  return call_backs_.get_visited_nodes();
135  }
136 
137  int Run() {
138  TSkimBase<Z>::PreRunInit();
139  GraphSketch local_graph_sketch_approx;
140  graph_sketch_approx = &local_graph_sketch_approx;
141  graph_sketch_approx->GetNodesDistributionLean();
142  this->graph_->Transpose(&graph_transpose_);
143  CalculateGraphSketch<Z>(&graph_transpose_, graph_sketch_approx);
144  reverse_rank_call_backs_.InitTSkimReverseRankCallBacks(this->T_);
145  reverse_rank_call_backs_.SetWantedNodes(this->wanted_nodes_);
146  call_backs_.SetWantedNodes(this->rankees_nodes_);
147  return TSkimBase<Z>::Run(false);
148  }
149 
150  private:
151  int K_all_distance_sketch_;
152  graph::Graph<Z> graph_transpose_;
153  GraphSketch* graph_sketch_approx;
154  TSkimReverseRankCallBacks<Z> reverse_rank_call_backs_;
155  DijkstraParams param_;
156  TSkimDijkstraCallBacksDistancePrune<Z> call_backs_;
157  std::unordered_map<int , std::set<int> > coveres;
158  std::unordered_map<int, int> exact_influence_;
159  std::vector<std::vector<int>>* reverse_refernce;
160 };
161 
162 
163 template<class Z>
164 void ExactCoverGreedy(graph::Graph<Z>* graph,
165  int T,
166  std::vector<std::vector<NodeIdDistanceData> >* reachable_nodes) {
167  reachable_nodes->resize(graph->GetMxNId());
168  CollectorNodesUpToTRank<Z> collect_nodes_call_backs;
169  int j = 0;
170  for (auto it = graph->BegNI(); it != graph->EndNI(); it++) {
171  j++;
172  if (j % 1000 == 0) {
173  std::cout << j << "/" << graph->GetMxNId() << std::endl;
174  }
175  int node_id = it.GetId();
176  DijkstraParams params;
177  typename Z::TNode source(node_id);
178  collect_nodes_call_backs.InitCollectorNodesUpToTRank(T+1);
179  PrunedDijkstra<Z, CollectorNodesUpToTRank<Z> > (source,
180  graph,
181  &collect_nodes_call_backs,
182  &params);
183  (*reachable_nodes)[node_id] = collect_nodes_call_backs.get_nodes_found();
184  }
185 }
186 
190 } // namespace all_distance_sketch
191 
192 #endif // SRC_ALGORITHMS_T_SKIM_DIJKSTRA_H_
void InitGraphSketch(unsigned int K, int max_node_id, const std::vector< int > *nodes_id=NULL)
Init the class.
Definition: graph_sketch.h:28
Single node sketch.
Definition: node_sketch.h:204
Definition: common.h:53
Contains all TSkim influence maximization algorithms.
const std::vector< RandomId > * GetNodesDistributionLean() const
returns the random id that was given to each node
Definition: graph_sketch.h:366
Data structure for the graph sketch.
Definition: graph_sketch.h:17
Cover extracted by the influence maximization algorithms.
Definition: t_skim.h:34