template <class T>
int k = 64;
CalculateGraphSketch<T>(graph, &graphAds);
int node_id = 3;
std::vector<int> ranking;
<T>(node_id,
graph,
&graph_sketch,
&ranking);
}
template<class T>
class DefaultReverseRankCallBacks {
public:
inline void Started(
int source_node_id,
graph::Graph<T>* graph) {
return; }
inline void NodePopedFromHeap(int poped_node_id, const RankData& heap_value) { return; }
inline bool ShouldPrune(int visited_node_id, const RankData& rank_data) { return false; }
inline bool ShouldStop() { return false; }
inline void RelaxedPath(int node_id) { }
};
template<class T>
class StopAfterReverseRankCallBacks {
public:
inline void InitStopAfterReverseRankCallBacks(int stop_after_rank) {
_stop_rank = stop_after_rank;
}
inline void Started(
int source_node_id,
graph::Graph<T>* graph) {
return; }
inline void NodePopedFromHeap(int poped_node_id, const RankData& heap_value) {
if (heap_value.rank <= _stop_rank) {
ranks[poped_node_id] = heap_value.rank;
}
}
inline bool ShouldPrune(int visited_node_id, const RankData& rank_data) {
return rank_data.rank > _stop_rank;
}
inline bool ShouldStop() { return false; }
inline void RelaxedPath(int node_id) { }
const std::unordered_map<int, int>& get_ranks() {
return ranks;
}
private:
int _stop_rank;
std::unordered_map<int, int> ranks;
};
void calculate_reverse_rank_up_to_100() {
int k = 64;
CalculateGraphSketch<graph::TUnDirectedGraph>(&graph, &graph_sketch);
int node_id = 3;
std::vector<int> ranking;
StopAfterReverseRankCallBacks<graph::TUnDirectedGraph> stop_after_100;
stop_after_100.InitStopAfterReverseRankCallBacks(100);
<graph::TUnDirectedGraph, StopAfterReverseRankCallBacks<graph::TUnDirectedGraph> >
(node_id,
&graph,
&graph_sketch,
&ranking,
&stop_after_100);
for (auto node_rank : stop_after_100.get_ranks()) {
EXPECT_TRUE(node_rank.second <= 100);
std::cout << "node id=" << node_rank.first << " rank=" << node_rank.second << std::endl;
}
}