nabla delta (not working)
This commit is contained in:
parent
405552aafa
commit
b1c6a1dd00
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
|
Loading…
x
Reference in New Issue
Block a user