nabla delta (not working)
This commit is contained in:
		
							
								
								
									
										100
									
								
								src/nabladelta.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										100
									
								
								src/nabladelta.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,100 @@ | |||||||
|  | #include "nabladelta.h" | ||||||
|  | #include "matrix_operation.h" | ||||||
|  | #include <stdlib.h> | ||||||
|  | #include <math.h> | ||||||
|  | #include <float.h> | ||||||
|  | #include <stdio.h> | ||||||
|  |  | ||||||
|  | double* nabladelta(const SparseMatrix *matrix, double epsilon) { | ||||||
|  |     int N = matrix->num_nodes; | ||||||
|  |     int num_arcs = matrix->num_arcs; | ||||||
|  |  | ||||||
|  |     double *nabla = malloc(N * sizeof(double)); | ||||||
|  |     double *delta = malloc(N * sizeof(double)); | ||||||
|  |     double *X = malloc(N * sizeof(double)); | ||||||
|  |     double *Y = malloc(N * sizeof(double)); | ||||||
|  |     double *temp = malloc(N * sizeof(double)); | ||||||
|  |  | ||||||
|  |     if (!nabla || !delta || !X || !Y || !temp) { | ||||||
|  |         fprintf(stderr, "Memory allocation failed\n"); | ||||||
|  |         exit(EXIT_FAILURE); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     // Initialize nabla, delta | ||||||
|  |     // ∇[j] = min(i, G[i, j]),  nabla(j) = minimum of column j | ||||||
|  |     // ∆[j] = max(i, G[i, j]),  delta(j) = maximum of column j | ||||||
|  |  | ||||||
|  |     for (int j = 0; j < N; j++) { | ||||||
|  |         nabla[j] = 0.0; | ||||||
|  |         delta[j] = 0.0; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     for (int i = 0; i < num_arcs; i++) { | ||||||
|  |         int j = matrix->arcs[i].dest; | ||||||
|  |         double value = matrix->arcs[i].value; | ||||||
|  |  | ||||||
|  |         if (value < nabla[j]) { | ||||||
|  |             nabla[j] = value; | ||||||
|  |         } | ||||||
|  |         if (value > delta[j]) { | ||||||
|  |             delta[j] = value; | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     // 1. X(0) ← ∇ | ||||||
|  |     // 2. Y (0) ← ∆ | ||||||
|  |     for (int i = 0; i < N; i++) { | ||||||
|  |         X[i] = nabla[i]; | ||||||
|  |         Y[i] = delta[i]; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     // 3. | ||||||
|  |     double diff = 1.0; | ||||||
|  |     int iter = 0; | ||||||
|  |     while (diff > epsilon) { | ||||||
|  |         // ||X|| is norm 1 | ||||||
|  |         double X_norm1 = 0.0; | ||||||
|  |         double Y_norm1 = 0.0; | ||||||
|  |         for (int i = 0; i < N; i++) { | ||||||
|  |             X_norm1 += X[i]; | ||||||
|  |             Y_norm1 += Y[i]; | ||||||
|  |         } | ||||||
|  |         printf("Iteration %d: ||X|| = %f\n", iter, X_norm1); | ||||||
|  |         printf("Iteration %d: ||Y|| = %f\n", iter, Y_norm1); | ||||||
|  |  | ||||||
|  |  | ||||||
|  |         // (a): X(k+1) = max(X(k), X(k)G + nabla(1 - ||X(k)||)) | ||||||
|  |         multiply_vector_matrix_parallel(X, matrix, temp);  // X(k)*G | ||||||
|  |  | ||||||
|  |         for (int i = 0; i < N; i++) { | ||||||
|  |             double update = temp[i] + nabla[i] * (1.0 - X_norm1); | ||||||
|  |             X[i] = fmax(X[i], update); | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         // (b): Y(k+1) = min(Y(k), Y(k)G + Delta(1 - ||Y(k)||)) | ||||||
|  |         multiply_vector_matrix_parallel(Y, matrix, temp);  // Y(k)*G | ||||||
|  |  | ||||||
|  |         for (int i = 0; i < N; i++) { | ||||||
|  |             double update = temp[i] + delta[i] * (1.0 - Y_norm1); | ||||||
|  |             Y[i] = fmin(Y[i], update); | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         // (c): ||X(k) - Y(k)|| < ε | ||||||
|  |         diff = 0.0; | ||||||
|  |         for (int i = 0; i < N; i++) { | ||||||
|  |             diff += fabs(X[i] - Y[i]); | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         if ((++iter)%5 == 0) { | ||||||
|  |             printf("Iteration %d: diff = %.16f\n", iter, diff); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     free(nabla); | ||||||
|  |     free(delta); | ||||||
|  |     free(Y); | ||||||
|  |     free(temp); | ||||||
|  |  | ||||||
|  |     // X~pi~Y (convergence) | ||||||
|  |     return X; | ||||||
|  | } | ||||||
							
								
								
									
										8
									
								
								src/nabladelta.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								src/nabladelta.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,8 @@ | |||||||
|  | #ifndef NABLADELTA_H | ||||||
|  | #define NABLADELTA_H | ||||||
|  |  | ||||||
|  | #include "sparse_matrix.h" | ||||||
|  |  | ||||||
|  | double* nabladelta(const SparseMatrix *matrix, double epsilon); | ||||||
|  |  | ||||||
|  | #endif | ||||||
		Reference in New Issue
	
	Block a user