1 #ifndef PRPACK_SOLVER
2 #define PRPACK_SOLVER
3 #include "prpack_base_graph.h"
4 #include "prpack_csc.h"
5 #include "prpack_csr.h"
6 #include "prpack_edge_list.h"
7 #include "prpack_preprocessed_ge_graph.h"
8 #include "prpack_preprocessed_gs_graph.h"
9 #include "prpack_preprocessed_scc_graph.h"
10 #include "prpack_preprocessed_schur_graph.h"
11 #include "prpack_result.h"
12 
13 // TODO Make this a user configurable variable
14 #define PRPACK_SOLVER_MAX_ITERS 1000000
15 
16 namespace prpack {
17 
18     // Solver class.
19     class prpack_solver {
20         private:
21             // instance variables
22             double read_time;
23             prpack_base_graph* bg;
24             prpack_preprocessed_ge_graph* geg;
25             prpack_preprocessed_gs_graph* gsg;
26             prpack_preprocessed_schur_graph* sg;
27             prpack_preprocessed_scc_graph* sccg;
28 			bool owns_bg;
29             // methods
30             void initialize();
31             static prpack_result* solve_via_ge(
32                     const double alpha,
33                     const double tol,
34                     const int num_vs,
35                     const double* matrix,
36                     const double* uv);
37             static prpack_result* solve_via_ge_uv(
38                     const double alpha,
39                     const double tol,
40                     const int num_vs,
41                     const double* matrix,
42                     const double* d,
43                     const double* u,
44                     const double* v);
45             static prpack_result* solve_via_gs(
46                     const double alpha,
47                     const double tol,
48                     const int num_vs,
49                     const int num_es,
50                     const int* heads,
51                     const int* tails,
52                     const double* vals,
53                     const double* ii,
54                     const double* d,
55                     const double* num_outlinks,
56                     const double* u,
57                     const double* v);
58             static prpack_result* solve_via_gs_err(
59                     const double alpha,
60                     const double tol,
61                     const int num_vs,
62                     const int num_es,
63                     const int* heads,
64                     const int* tails,
65                     const double* ii,
66                     const double* num_outlinks,
67                     const double* u,
68                     const double* v);
69             static prpack_result* solve_via_schur_gs(
70                     const double alpha,
71                     const double tol,
72                     const int num_vs,
73                     const int num_no_in_vs,
74                     const int num_no_out_vs,
75                     const int num_es,
76                     const int* heads,
77                     const int* tails,
78                     const double* vals,
79                     const double* ii,
80                     const double* d,
81                     const double* num_outlinks,
82                     const double* uv,
83                     const int* encoding,
84                     const int* decoding,
85                     const bool should_normalize = true);
86             static prpack_result* solve_via_schur_gs_uv(
87                     const double alpha,
88                     const double tol,
89                     const int num_vs,
90                     const int num_no_in_vs,
91                     const int num_no_out_vs,
92                     const int num_es,
93                     const int* heads,
94                     const int* tails,
95                     const double* vals,
96                     const double* ii,
97                     const double* d,
98                     const double* num_outlinks,
99                     const double* u,
100                     const double* v,
101                     const int* encoding,
102                     const int* decoding);
103             static prpack_result* solve_via_scc_gs(
104                     const double alpha,
105                     const double tol,
106                     const int num_vs,
107                     const int num_es_inside,
108                     const int* heads_inside,
109                     const int* tails_inside,
110                     const double* vals_inside,
111                     const int num_es_outside,
112                     const int* heads_outside,
113                     const int* tails_outside,
114                     const double* vals_outside,
115                     const double* ii,
116                     const double* d,
117                     const double* num_outlinks,
118                     const double* uv,
119                     const int num_comps,
120                     const int* divisions,
121                     const int* encoding,
122                     const int* decoding,
123                     const bool should_normalize = true);
124             static prpack_result* solve_via_scc_gs_uv(
125                     const double alpha,
126                     const double tol,
127                     const int num_vs,
128                     const int num_es_inside,
129                     const int* heads_inside,
130                     const int* tails_inside,
131                     const double* vals_inside,
132                     const int num_es_outside,
133                     const int* heads_outside,
134                     const int* tails_outside,
135                     const double* vals_outside,
136                     const double* ii,
137                     const double* d,
138                     const double* num_outlinks,
139                     const double* u,
140                     const double* v,
141                     const int num_comps,
142                     const int* divisions,
143                     const int* encoding,
144                     const int* decoding);
145             static void ge(const int sz, double* A, double* b);
146             static void normalize(const int length, double* x);
147             static prpack_result* combine_uv(
148                     const int num_vs,
149                     const double* d,
150                     const double* num_outlinks,
151                     const int* encoding,
152                     const double alpha,
153                     const prpack_result* ret_u,
154                     const prpack_result* ret_v);
155         public:
156             // constructors
157             prpack_solver(const prpack_csc* g);
158             prpack_solver(const prpack_int64_csc* g);
159             prpack_solver(const prpack_csr* g);
160             prpack_solver(const prpack_edge_list* g);
161             prpack_solver(prpack_base_graph* g, bool owns_bg=true);
162             prpack_solver(const char* filename, const char* format, const bool weighted);
163             // destructor
164             ~prpack_solver();
165             // methods
166             int get_num_vs();
167             prpack_result* solve(const double alpha, const double tol, const char* method);
168             prpack_result* solve(
169                     const double alpha,
170                     const double tol,
171                     const double* u,
172                     const double* v,
173                     const char* method);
174     };
175 
176 }
177 
178 #endif
179