PageRank,网页排名,又称网页级别、Google左侧排名或佩奇排名,是一种由[1] 根据网页之间相互的超链接计算的技术,而作为网页排名的要素之一,以Google公司创办人拉里·佩奇(Larry Page)之姓来命名。Google用它来体现网页的相关性和重要性,在搜索引擎优化操作中是经常被用来评估网页优化的成效因素之一。Google的创始人拉里·佩奇和谢尔盖·布林于1998年在斯坦福大学发明了这项技术。 PageRank通过网络浩瀚的超链接关系来确定一个页面的等级。Google把从A页面到B页面的链接解释为A页面给B页面投票,Google根据投票来源(甚至来源的来源,即链接到A页面的页面)和投票目标的等级来决定新的等级。简单的说,一个高等级的页面可以使其他低等级页面的等级提升。
#include <stdio.h>
#include <string.h>
#include <math.h>
#include "GraphLite.h"
#define VERTEX_CLASS_NAME(name) PageRankVertex##name
#define EPS 1e-6
class VERTEX_CLASS_NAME(InputFormatter):
public InputFormatter {
public:
int64_t getVertexNum() {
unsigned long long n;
sscanf(m_ptotal_vertex_line,
"%lld", &n);
printf(
"at class PageRankVertexInputFormatter: m_total_vertex= %lld \n",n);
m_total_vertex= n;
return m_total_vertex;
}
int64_t getEdgeNum() {
unsigned long long n;
sscanf(m_ptotal_edge_line,
"%lld", &n);
m_total_edge= n;
printf(
"at class PageRankVertexInputFormatter: m_total_edge= %lld \n",n);
return m_total_edge;
}
int getVertexValueSize() {
m_n_value_size =
sizeof(
double);
return m_n_value_size;
}
int getEdgeValueSize() {
m_e_value_size =
sizeof(
double);
return m_e_value_size;
}
int getMessageValueSize() {
m_m_value_size =
sizeof(
double);
return m_m_value_size;
}
void loadGraph() {
unsigned long long last_vertex;
unsigned long long from;
unsigned long long to;
double weight =
0;
double value =
1;
int outdegree =
0;
const char *line= getEdgeLine();
sscanf(line,
"%lld %lld", &from, &to);
addEdge(from, to, &weight);
last_vertex = from;
++outdegree;
printf(
"Excute loadGraph() , m_total_edge= %ld\n",m_total_edge);
for (int64_t i =
1; i < m_total_edge; ++i) {
line= getEdgeLine();
sscanf(line,
"%lld %lld", &from, &to);
if (last_vertex != from) {
addVertex(last_vertex, &value, outdegree);
last_vertex = from;
outdegree =
1;
}
else {
++outdegree;
}
addEdge(from, to, &weight);
}
addVertex(last_vertex, &value, outdegree);
}
};
class VERTEX_CLASS_NAME(OutputFormatter):
public OutputFormatter {
public:
void writeResult() {
int64_t vid;
double value;
char s[
1024];
for (ResultIterator r_iter; ! r_iter.done(); r_iter.next() ) {
r_iter.getIdValue(vid, &value);
int n =
sprintf(s,
"%lld: %f\n", (
unsigned long long)vid, value);
writeNextResLine(s, n);
}
}
};
class VERTEX_CLASS_NAME(Aggregator):
public Aggregator<
double> {
public:
void init() {
m_global =
0;
m_local =
0;
}
void* getGlobal() {
return &m_global;
}
void setGlobal(
const void* p) {
m_global = * (
double *)p;
}
void* getLocal() {
return &m_local;
}
void merge(
const void* p) {
m_global += * (
double *)p;
printf(
"excute merge() on PageRankAggregator class, m_global= %lf\n",m_global);
}
void accumulate(
const void* p) {
m_local += * (
double *)p;
printf(
"excute accumulate() on PageRankAggregator class, m_local= %lf\n",m_local);
}
};
class VERTEX_CLASS_NAME():
public Vertex <
double,
double,
double> {
public:
void compute(MessageIterator* pmsgs) {
printf(
"Excute compute(), MessageIterrator *pmsgs, pmsgs.size= %d\n ",pmsgs->m_vector_size);
double val;
if (getSuperstep() ==
0) {
val=
1.0;
printf(
"getSuperstep()==0 val=%lf\n",getValue());
}
else {
if (getSuperstep() >=
2) {
double global_val = * (
double *)getAggrGlobal(
0);
if (global_val < EPS) {
printf(
"at compute() on PageRankVertex class, global_val==%lf\n",global_val);
voteToHalt();
return;
}
}
double sum =
0;
for ( ; ! pmsgs->done(); pmsgs->next() ) {
sum += pmsgs->getValue();
}
val =
0.15 +
0.85 * sum;
double acc =
fabs(getValue() - val);
accumulateAggr(
0, &acc);
* mutableValue() = val;
}
const int64_t n = getOutEdgeIterator().size();
sendMessageToAllNeighbors(val / n);
}
};
class VERTEX_CLASS_NAME(Graph):
public Graph {
public:
VERTEX_CLASS_NAME(Aggregator)* aggregator;
public:
void init(
int argc,
char* argv[]) {
setNumHosts(
5);
setHost(
0,
"localhost",
1411);
setHost(
1,
"localhost",
1421);
setHost(
2,
"localhost",
1431);
setHost(
3,
"localhost",
1441);
setHost(
4,
"localhost",
1451);
if (argc <
3) {
printf (
"Usage: %s <input path> <output path>\n", argv[
0]);
exit(
1);
}
m_pin_path = argv[
1];
m_pout_path = argv[
2];
aggregator =
new VERTEX_CLASS_NAME(Aggregator)[
1];
regNumAggr(
1);
regAggr(
0, &aggregator[
0]);
}
void term() {
delete[] aggregator;
}
};
extern "C" Graph* create_graph() {
Graph* pgraph =
new VERTEX_CLASS_NAME(Graph);
pgraph->m_pin_formatter =
new VERTEX_CLASS_NAME(InputFormatter);
pgraph->m_pout_formatter =
new VERTEX_CLASS_NAME(OutputFormatter);
pgraph->m_pver_base =
new VERTEX_CLASS_NAME();
return pgraph;
}
extern "C" void destroy_graph(Graph* pobject) {
delete ( VERTEX_CLASS_NAME()* )(pobject->m_pver_base);
delete ( VERTEX_CLASS_NAME(OutputFormatter)* )(pobject->m_pout_formatter);
delete ( VERTEX_CLASS_NAME(InputFormatter)* )(pobject->m_pin_formatter);
delete ( VERTEX_CLASS_NAME(Graph)* )pobject;
}
转载请注明原文地址: https://ju.6miu.com/read-667041.html