clean up code
This commit is contained in:
		
							
								
								
									
										10
									
								
								main.py
									
									
									
									
									
								
							
							
						
						
									
										10
									
								
								main.py
									
									
									
									
									
								
							| @@ -25,19 +25,19 @@ def run_pagerank(matrix_path, epsilon, alpha): | |||||||
|         match = re.search(r"Read and convert matrix: (\d+\.\d+) seconds", output) |         match = re.search(r"Read and convert matrix: (\d+\.\d+) seconds", output) | ||||||
|         data["read_time"] = float(match.group(1)) if match else None |         data["read_time"] = float(match.group(1)) if match else None | ||||||
|  |  | ||||||
|         match = re.search(r"Pagerank: (\d+) Iterations", output) |         match = re.search(r"Pagerank \(power\): (\d+) Iterations", output) | ||||||
|         data["pagerank_iterations"] = int(match.group(1)) if match else None |         data["pagerank_iterations"] = int(match.group(1)) if match else None | ||||||
|  |  | ||||||
|         match = re.search(r"Pagerank: (\d+\.\d+) seconds", output) |         match = re.search(r"Pagerank \(power\): (\d+\.\d+) seconds", output) | ||||||
|         data["pagerank_time"] = float(match.group(1)) if match else None |         data["pagerank_time"] = float(match.group(1)) if match else None | ||||||
|  |  | ||||||
|         match = re.search(r"Gauss-Seidel: (\d+) Iterations", output) |         match = re.search(r"Gauß-Seidel: (\d+) Iterations", output) | ||||||
|         data["gauss_seidel_iterations"] = int(match.group(1)) if match else None |         data["gauss_seidel_iterations"] = int(match.group(1)) if match else None | ||||||
|  |  | ||||||
|         match = re.search(r"Gauss-Seidel: (\d+\.\d+) seconds", output) |         match = re.search(r"Gauß-Seidel: (\d+\.\d+) seconds", output) | ||||||
|         data["gauss_seidel_time"] = float(match.group(1)) if match else None |         data["gauss_seidel_time"] = float(match.group(1)) if match else None | ||||||
|  |  | ||||||
|         match = re.search(r"Difference norm Pagerank and Gauss-Seidel: (\d+\.\d+)", output) |         match = re.search(r"Difference norm Pagerank power and Gauß-Seidel: (\d+\.\d+)", output) | ||||||
|         data["diff_norm"] = float(match.group(1)) if match else None |         data["diff_norm"] = float(match.group(1)) if match else None | ||||||
|  |  | ||||||
|         return data |         return data | ||||||
|   | |||||||
| @@ -72,13 +72,10 @@ double* gauss_seidel_pagerank(const SparseMatrix *matrix, double epsilon, double | |||||||
|         // 5. convergence |         // 5. convergence | ||||||
|         diff = diff_norm_vector(x, x_old, N); |         diff = diff_norm_vector(x, x_old, N); | ||||||
|  |  | ||||||
|         // if ((++iter) % 10 == 0) { |  | ||||||
|         //     printf("Gauss-Seidel Iteration %d: diff = %.16f\n", iter, diff); |  | ||||||
|         // } |  | ||||||
|         ++iter; |         ++iter; | ||||||
|     } while (diff > epsilon); |     } while (diff > epsilon); | ||||||
|  |  | ||||||
|     printf("Gauss-Seidel: %d Iterations\n", iter); |     printf("Gauß-Seidel: %d Iterations\n", iter); | ||||||
|  |  | ||||||
|     free(x_old); |     free(x_old); | ||||||
|     free(f); |     free(f); | ||||||
|   | |||||||
							
								
								
									
										37
									
								
								src/main.c
									
									
									
									
									
								
							
							
						
						
									
										37
									
								
								src/main.c
									
									
									
									
									
								
							| @@ -12,34 +12,7 @@ | |||||||
| #include <string.h> | #include <string.h> | ||||||
| #include <stdio.h> | #include <stdio.h> | ||||||
| #include <stdlib.h> | #include <stdlib.h> | ||||||
|  | #include "ranking_utils.h" | ||||||
| static double *values_for_sort; |  | ||||||
| int cmp_desc(const void *a, const void *b) { |  | ||||||
|     int ia = *(const int*)a; |  | ||||||
|     int ib = *(const int*)b; |  | ||||||
|     if (values_for_sort[ia] < values_for_sort[ib]) return  1; |  | ||||||
|     if (values_for_sort[ia] > values_for_sort[ib]) return -1; |  | ||||||
|     return 0; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| void print_top_k(const char *name, double *pi, int n, int k) { |  | ||||||
|     int *idx = malloc(n * sizeof(int)); |  | ||||||
|     if(!idx) { |  | ||||||
|         fprintf(stderr, "malloc failed\n"); |  | ||||||
|         return; |  | ||||||
|     } |  | ||||||
|     for (int i = 0; i < n; i++) idx[i] = i; |  | ||||||
|  |  | ||||||
|     values_for_sort = pi; |  | ||||||
|     qsort(idx, n, sizeof(int), cmp_desc); |  | ||||||
|  |  | ||||||
|     printf("Top %d entries of %s:\n", k, name); |  | ||||||
|     for (int i = 0; i < k && i < n; i++) { |  | ||||||
|         int node = idx[i]; |  | ||||||
|         printf("  %2d: node %d → %.8f\n", i+1, node, pi[node]); |  | ||||||
|     } |  | ||||||
|     free(idx); |  | ||||||
| } |  | ||||||
|  |  | ||||||
|  |  | ||||||
| void test_stationary_distribution(const char *path, double epsilon, double alpha) { | void test_stationary_distribution(const char *path, double epsilon, double alpha) { | ||||||
| @@ -62,21 +35,21 @@ void test_stationary_distribution(const char *path, double epsilon, double alpha | |||||||
|     gettimeofday(&tvstart, NULL); |     gettimeofday(&tvstart, NULL); | ||||||
|     double *pi_power = pagerank(matrix, epsilon, alpha); |     double *pi_power = pagerank(matrix, epsilon, alpha); | ||||||
|     gettimeofday(&tvend, NULL); |     gettimeofday(&tvend, NULL); | ||||||
|     print_time_diff("Pagerank", &tvstart, &tvend); |     print_time_diff("Pagerank (power)", &tvstart, &tvend); | ||||||
|  |  | ||||||
|     gettimeofday(&tvstart, NULL); |     gettimeofday(&tvstart, NULL); | ||||||
|     double *pi_new = gauss_seidel_pagerank(matrix, epsilon, alpha); |     double *pi_new = gauss_seidel_pagerank(matrix, epsilon, alpha); | ||||||
|  |  | ||||||
|     gettimeofday(&tvend, NULL); |     gettimeofday(&tvend, NULL); | ||||||
|     print_time_diff("Gauss-Seidel", &tvstart, &tvend); |     print_time_diff("Gauß-Seidel", &tvstart, &tvend); | ||||||
|  |  | ||||||
|     double diff = diff_norm_vector(pi_power, pi_new, matrix->num_nodes); |     double diff = diff_norm_vector(pi_power, pi_new, matrix->num_nodes); | ||||||
|     printf("Difference norm Pagerank and Gauss-Seidel: %.16f\n", diff); |     printf("Difference norm Pagerank power and Gauß-Seidel: %.16f\n", diff); | ||||||
|  |  | ||||||
|     int n = matrix->num_nodes; |     int n = matrix->num_nodes; | ||||||
|     int k = 10; |     int k = 10; | ||||||
|     print_top_k("pagerank (power)", pi_power, n, k); |     print_top_k("pagerank (power)", pi_power, n, k); | ||||||
|     print_top_k("pagerank (Gauss–Seidel)", pi_new,    n, k); |     print_top_k("pagerank (Gauß–Seidel)", pi_new, n, k); | ||||||
|  |  | ||||||
|     free(pi_power); |     free(pi_power); | ||||||
|     free(pi_new); |     free(pi_new); | ||||||
|   | |||||||
| @@ -64,14 +64,11 @@ double* pagerank(const SparseMatrix *matrix, double epsilon, double alpha) { | |||||||
|         pi = pi_new; |         pi = pi_new; | ||||||
|         pi_new = malloc(vec_size); |         pi_new = malloc(vec_size); | ||||||
|  |  | ||||||
|         // if ((++iter)%1 == 0) { |  | ||||||
|         //     printf("Iteration %d: diff = %.16f\n", iter, diff); |  | ||||||
|         // } |  | ||||||
|         ++iter; |         ++iter; | ||||||
|         free(temp); |         free(temp); | ||||||
|     } while (diff > epsilon); |     } while (diff > epsilon); | ||||||
|  |  | ||||||
|     printf("Pagerank: %d Iterations\n", iter); |     printf("Pagerank (power): %d Iterations\n", iter); | ||||||
|  |  | ||||||
|     free(pi_new); |     free(pi_new); | ||||||
|     free(f); |     free(f); | ||||||
|   | |||||||
							
								
								
									
										40
									
								
								src/ranking_utils.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										40
									
								
								src/ranking_utils.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,40 @@ | |||||||
|  | #include <stdio.h> | ||||||
|  | #include <stdlib.h> | ||||||
|  | #include "ranking_utils.h" | ||||||
|  |  | ||||||
|  | typedef struct { | ||||||
|  |     int index; | ||||||
|  |     double value; | ||||||
|  | } IndexedValue; | ||||||
|  |  | ||||||
|  | // descending order sort for indexed stationary distribution values | ||||||
|  | static int cmp_desc_struct(const void *a, const void *b) { | ||||||
|  |     const IndexedValue *ia = (const IndexedValue *)a; | ||||||
|  |     const IndexedValue *ib = (const IndexedValue *)b; | ||||||
|  |     if (ia->value < ib->value) return 1; | ||||||
|  |     if (ia->value > ib->value) return -1; | ||||||
|  |     return 0; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void print_top_k(const char *name, double *pi, int n, int k) { | ||||||
|  |  | ||||||
|  |     IndexedValue *ivals = malloc(n * sizeof(IndexedValue)); | ||||||
|  |     if (!ivals) { | ||||||
|  |         fprintf(stderr, "malloc failed\n"); | ||||||
|  |         return; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     for (int i = 0; i < n; i++) { | ||||||
|  |         ivals[i].index = i; | ||||||
|  |         ivals[i].value = pi[i]; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     qsort(ivals, n, sizeof(IndexedValue), cmp_desc_struct); | ||||||
|  |  | ||||||
|  |     printf("Top %d entries of %s:\n", k, name); | ||||||
|  |     for (int i = 0; i < k && i < n; i++) { | ||||||
|  |         printf("  %2d: node %d -> %.8f\n", i + 1, ivals[i].index, ivals[i].value); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     free(ivals); | ||||||
|  | } | ||||||
							
								
								
									
										6
									
								
								src/ranking_utils.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								src/ranking_utils.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,6 @@ | |||||||
|  | #ifndef RANKING_UTILS_H | ||||||
|  | #define RANKING_UTILS_H | ||||||
|  |  | ||||||
|  | void print_top_k(const char *name, double *pi, int n, int k); | ||||||
|  |  | ||||||
|  | #endif | ||||||
		Reference in New Issue
	
	Block a user