in para_graph_sampler/graph_engine/backend/ParallelSampler.cpp [145:231]
bool ParallelSampler::read_PPR_from_binary_file(
std::string name_in_neighs,
std::string name_in_scores,
int k,
float alpha,
float epsilon
) {
if (name_in_neighs.length() == 0 || name_in_scores.length() == 0) {
return false;
}
std::ifstream fin_neighs(name_in_neighs, std::ios::in | std::ios::binary);
std::ifstream fin_scores(name_in_scores, std::ios::in | std::ios::binary);
if (fin_neighs.good() && fin_scores.good()) {
if (fin_neighs.is_open()) {
float alpha_ = -1.;
float epsilon_ = -1.;
int k_ = -1;
unsigned int root_cnt = -1;
fin_neighs.read((char*)&alpha_, sizeof(alpha_));
fin_neighs.read((char*)&epsilon_, sizeof(epsilon_));
fin_neighs.read((char*)&k_, sizeof(k_));
if (alpha_ != alpha || epsilon_ > 1.1*epsilon || epsilon_ < 0.9*epsilon || k_ < k) {
fin_neighs.close();
return false;
}
std::cout << "meta data matches" << std::endl;
fin_neighs.read((char*)&root_cnt, sizeof(root_cnt));
for (unsigned int i = 0; i < root_cnt; i++) {
assert(static_cast<NodeType>(root_cnt) == graph_full.num_nodes);
unsigned int deg_; // NOTE: if change dtype here, need to change the write function too.
fin_neighs.read((char*)°_, sizeof(deg_));
auto deg_clip = std::min(static_cast<NodeType>(deg_), static_cast<NodeType>(k));
for (NodeType j = 0; j < static_cast<NodeType>(deg_); j++) {
NodeType nidx;
fin_neighs.read((char*)&nidx, sizeof(nidx));
if (j < deg_clip) {
top_ppr_neighs[i].push_back(nidx);
}
}
}
} else {
fin_neighs.close();
return false;
}
fin_neighs.close();
if (fin_scores.is_open()) {
float alpha_ = -1.;
float epsilon_ = -1.;
int k_ = -1;
unsigned int root_cnt = -1;
fin_scores.read((char*)&alpha_, sizeof(alpha_));
fin_scores.read((char*)&epsilon_, sizeof(epsilon_));
fin_scores.read((char*)&k_, sizeof(k_));
if (alpha_ != alpha || epsilon_ > 1.1*epsilon || epsilon_ < 0.9*epsilon || k_ < k) {
fin_scores.close();
std::fill(top_ppr_neighs.begin(), top_ppr_neighs.end(), std::vector<NodeType>());
return false;
}
std::cout << "meta data matches" << std::endl;
fin_scores.read((char*)&root_cnt, sizeof(root_cnt));
for (unsigned int i = 0; i < root_cnt; i++) {
assert(static_cast<NodeType>(root_cnt) == graph_full.num_nodes);
unsigned int deg_;
fin_scores.read((char*)°_, sizeof(deg_));
auto deg_clip = std::min(deg_, static_cast<unsigned int>(k));
for (unsigned int j = 0; j < deg_; j++) {
PPRType nscore;
fin_scores.read((char*)&nscore, sizeof(nscore));
if (j < deg_clip) {
top_ppr_scores[i].push_back(nscore);
if (j > 0) {
assert(top_ppr_scores[i][j-1] + 1e-25 >= top_ppr_scores[i][j]);
}
}
}
}
} else {
fin_scores.close();
std::fill(top_ppr_scores.begin(), top_ppr_scores.end(), std::vector<PPRType>());
return false;
}
fin_scores.close();
return true;
} else {
return false;
}
}