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