28 double *tmp_vec =
gv_calloc(n,
sizeof(
double));
29 double *last_vec =
gv_calloc(n,
sizeof(
double));
32 const int Max_iterations = 30 * n;
40 double *
const evals =
gv_calloc(neigs,
sizeof(evals[0]));
41 for (i = 0; i < neigs; i++) {
42 double *
const curr_vector = eigs[i];
45 for (
int j = 0; j < n; j++)
46 curr_vector[j] = rand() % 100;
48 for (
int j = 0; j < i; j++) {
52 double len =
norm(curr_vector, n - 1);
67 for (
int j = 0; j < i; j++) {
72 if (len < 1e-10 || iteration > Max_iterations) {
79 }
while (fabs(angle) <
tol);
80 evals[i] = angle *
len;
86 for (; i < neigs; i++) {
90 double *
const curr_vector = eigs[i];
92 for (
int j = 0; j < n; j++)
93 curr_vector[j] = rand() % 100;
95 for (
int j = 0; j < i; j++) {
99 const double len =
norm(curr_vector, n - 1);
105 for (i = 0; i < neigs - 1; i++) {
106 int largest_index = i;
107 double largest_eval = evals[largest_index];
108 for (
int j = i + 1; j < neigs; j++) {
109 if (largest_eval < evals[j]) {
111 largest_eval = evals[largest_index];
114 if (largest_index != i) {
119 evals[largest_index] = evals[i];
120 evals[i] = largest_eval;
128 return iteration <= Max_iterations;
138 double *storage =
gv_calloc(dim1 * dim3,
sizeof(
double));
141 for (i = 0; i < dim1; i++) {
146 for (i = 0; i < dim1; i++) {
147 for (j = 0; j < dim3; j++) {
149 for (k = 0; k < dim2; k++) {
150 sum +=
A[i][k] *
B[k][j];
158 int dim2,
float ***
CC) {
165 float *storage =
gv_calloc(dim1 * dim2,
sizeof(
A[0]));
168 for (i = 0; i < dim1; i++) {
173 for (i = 0; i < dim1; i++) {
176 const size_t nedges =
A[i].nedges;
177 for (j = 0; j < dim2; j++) {
179 for (
size_t k = 0; k <
nedges; k++) {
180 sum += ewgts[k] *
B[j][edges[k]];
182 C[i][j] = (float)(sum);
188void scadd(
double *vec1,
int end,
double fac,
double *vec2) {
191 for (i = end + 1; i; i--) {
192 (*vec1++) += fac * (*vec2++);
197double norm(
double *vec,
int end) {
209 for (i = n; i; i--) {
214 for (i = n; i; i--) {
225 for (i = 0; i < n; i++)
226 vec[i] = rand() %
RANGE;
232 double *restrict result) {
233 for (
int i = 0; i < n; i++) {
235 for (
size_t j = 0; j < matrix[i].
nedges; j++)
236 res += matrix[i].ewgts[j] * vector[matrix[i].edges[j]];
244 for (i = 0; i < n; i++) {
245 result[i] = vector1[i] - vector2[i];
251 for (i = 0; i < n; i++) {
252 result[i] = vector1[i] + vector2[i];
259 for (i = 0; i < n; i++) {
260 result[i] = vector[i] *
alpha;
264void copy_vector(
int n,
const double *restrict source,
double *restrict dest) {
266 for (i = 0; i < n; i++)
271 const double *vector2) {
274 for (i = 0; i < n; i++) {
275 result += vector1[i] * vector2[i];
282 double max_val = -1e50;
284 for (i = 0; i < n; i++)
285 max_val = fmax(max_val, fabs(vector[i]));
291 double *vector,
double *result) {
297 for (i = 0; i < dim1; i++) {
299 for (j = 0; j < dim2; j++)
300 res += matrix[j][i] * vector[j];
306 const double *vector,
double *restrict result) {
309 for (
int i = 0; i < dim1; i++) {
311 for (
int j = 0; j < dim2; j++)
312 res += matrix[i][j] * vector[j];
329 for (i = n; i; i--) {
334 for (i = n; i; i--) {
340 const float *vector,
float *restrict result) {
343 for (
int i = 0; i < n; i++) {
346 for (
int index = 0, i = 0; i < n; i++) {
347 const float vector_i = vector[i];
349 float res = packed_matrix[index++] * vector_i;
351 for (
int j = i + 1; j < n; j++, index++) {
352 res += packed_matrix[index] * vector[j];
353 result[j] += packed_matrix[index] * vector_i;
362 for (i = 0; i < n; i++) {
363 result[i] = vector1[i] - vector2[i];
369 for (i = 0; i < n; i++) {
370 result[i] = vector1[i] + vector2[i];
377 for (i = 0; i < n; i++) {
378 vector1[i] = vector1[i] +
alpha * vector2[i];
384 for (i = 0; i < n; i++)
391 for (i = 0; i < n; i++) {
392 result += vector1[i] * vector2[i];
400 for (i = 0; i < n; i++)
406 float max_val = -1e30f;
407 for (i = 0; i < n; i++)
408 max_val = fmaxf(max_val, fabsf(vector[i]));
415 for (i = 0; i < n; i++) {
422 for (i = 0; i < n; i++) {
424 vec[i] = 1.0f / vec[i];
431 for (i = 0; i < n; i++) {
432 if (source[i] >= 0.0) {
433 target[i] = sqrtf(source[i]);
440 for (i = 0; i < n; i++) {
442 vec[i] = 1.0f / sqrtf(vec[i]);
Memory allocation wrappers that exit on failure.
static void * gv_calloc(size_t nmemb, size_t size)
static double len(glCompPoint p)
double vectors_inner_product(int n, const double *vector1, const double *vector2)
void orthog1f(int n, float *vec)
void right_mult_with_vector_d(double *const *matrix, int dim1, int dim2, const double *vector, double *restrict result)
void right_mult_with_vector_transpose(double **matrix, int dim1, int dim2, double *vector, double *result)
void init_vec_orth1(int n, double *vec)
void invert_vec(int n, float *vec)
void copy_vector(int n, const double *restrict source, double *restrict dest)
void mult_sparse_dense_mat_transpose(vtx_data *A, double **B, int dim1, int dim2, float ***CC)
void invert_sqrt_vec(int n, float *vec)
double max_absf(int n, float *vector)
void vectors_additionf(int n, float *vector1, float *vector2, float *result)
void set_vector_valf(int n, float val, float *result)
void orthog1(int n, double *vec)
void copy_vectorf(int n, float *source, float *dest)
void sqrt_vecf(int n, float *source, float *target)
bool power_iteration(double *const *square_mat, int n, int neigs, double **eigs)
void right_mult_with_vector(const vtx_data *matrix, int n, const double *vector, double *restrict result)
void scadd(double *vec1, int end, double fac, double *vec2)
void mult_dense_mat_d(double **A, float **B, int dim1, int dim2, int dim3, double ***CC)
void vectors_mult_additionf(int n, float *vector1, float alpha, float *vector2)
void square_vec(int n, float *vec)
static const double p_iteration_threshold
double max_abs(int n, double *vector)
void right_mult_with_vector_ff(const float *packed_matrix, int n, const float *vector, float *restrict result)
double norm(double *vec, int end)
void vectors_subtraction(int n, double *vector1, double *vector2, double *result)
void vectors_addition(int n, double *vector1, double *vector2, double *result)
void vectors_scalar_mult(int n, const double *vector, double alpha, double *result)
void vectors_subtractionf(int n, float *vector1, float *vector2, float *result)
double vectors_inner_productf(int n, float *vector1, float *vector2)
static int nedges
total no. of edges used in routing
size_t nedges
no. of neighbors, including self