24 double *tmp_vec =
gv_calloc(n,
sizeof(
double));
25 double *last_vec =
gv_calloc(n,
sizeof(
double));
28 const int Max_iterations = 30 * n;
36 double *
const evals =
gv_calloc(neigs,
sizeof(evals[0]));
37 for (i = 0; i < neigs; i++) {
38 double *
const curr_vector = eigs[i];
41 for (
int j = 0; j < n; j++)
42 curr_vector[j] = rand() % 100;
44 for (
int j = 0; j < i; j++) {
48 double len =
norm(curr_vector, n - 1);
64 for (
int j = 0; j < i; j++) {
69 if (len < 1e-10 || iteration > Max_iterations) {
76 }
while (fabs(angle) <
tol);
77 evals[i] = angle *
len;
82 for (; i < neigs; i++) {
86 double *
const curr_vector = eigs[i];
88 for (
int j = 0; j < n; j++)
89 curr_vector[j] = rand() % 100;
91 for (
int j = 0; j < i; j++) {
95 const double len =
norm(curr_vector, n - 1);
102 for (i = 0; i < neigs - 1; i++) {
103 int largest_index = i;
104 double largest_eval = evals[largest_index];
105 for (
int j = i + 1; j < neigs; j++) {
106 if (largest_eval < evals[j]) {
108 largest_eval = evals[largest_index];
111 if (largest_index != i) {
116 evals[largest_index] = evals[i];
117 evals[i] = largest_eval;
125 return iteration <= Max_iterations;
134 float *storage =
gv_calloc(dim1 * dim3,
sizeof(storage[0]));
137 for (
int i = 0; i < dim1; i++) {
142 for (
int i = 0; i < dim1; i++) {
143 for (
int j = 0; j < dim3; j++) {
145 for (
int k = 0; k < dim2; k++) {
146 sum +=
A[i][k] *
B[k][j];
148 C[i][j] = (float)sum;
162 double *storage =
gv_calloc(dim1 * dim3,
sizeof(
double));
165 for (i = 0; i < dim1; i++) {
170 for (i = 0; i < dim1; i++) {
171 for (j = 0; j < dim3; j++) {
173 for (k = 0; k < dim2; k++) {
174 sum +=
A[i][k] *
B[k][j];
183 int dim2,
float ***
CC)
191 float *storage =
gv_calloc(dim1 * dim2,
sizeof(
A[0]));
194 for (i = 0; i < dim1; i++) {
199 for (i = 0; i < dim1; i++) {
202 const size_t nedges =
A[i].nedges;
203 for (j = 0; j < dim2; j++) {
205 for (
size_t k = 0; k <
nedges; k++) {
206 sum += ewgts[k] *
B[j][edges[k]];
208 C[i][j] = (float) (sum);
214void scadd(
double *vec1,
int end,
double fac,
double *vec2) {
217 for (i = end + 1; i; i--) {
218 (*vec1++) += fac * (*vec2++);
223double norm(
double *vec,
int end) {
236 for (i = n; i; i--) {
241 for (i = n; i; i--) {
253 for (i = 0; i < n; i++)
254 vec[i] = rand() %
RANGE;
266 for (i = 0; i < n; i++) {
268 for (
size_t j = 0; j < matrix[i].
nedges; j++)
269 res += matrix[i].ewgts[j] * vector[matrix[i].edges[j]];
281 for (i = 0; i < n; i++) {
283 for (j = 0; j < n; j++)
284 res += matrix[i][j] * vector[j];
294 for (i = 0; i < n; i++) {
295 result[i] = vector1[i] - vector2[i];
303 for (i = 0; i < n; i++) {
304 result[i] = vector1[i] + vector2[i];
311 for (i = 0; i < n; i++) {
312 result[i] = vector[i] *
alpha;
316void copy_vector(
int n,
const double *restrict source,
double *restrict dest) {
318 for (i = 0; i < n; i++)
323 const double *vector2) {
326 for (i = 0; i < n; i++) {
327 result += vector1[i] * vector2[i];
335 double max_val = -1e50;
337 for (i = 0; i < n; i++)
338 max_val = fmax(max_val, fabs(vector[i]));
346 double *vector,
double *result)
353 for (i = 0; i < dim1; i++) {
355 for (j = 0; j < dim2; j++)
356 res += matrix[j][i] * vector[j];
362 double *vector,
double *result) {
368 for (i = 0; i < dim1; i++) {
370 for (j = 0; j < dim2; j++)
371 res += matrix[i][j] * vector[j];
389 for (i = n; i; i--) {
394 for (i = n; i; i--) {
400 (
float *packed_matrix,
int n,
float *vector,
float *result) {
406 for (i = 0; i < n; i++) {
409 for (index = 0, i = 0; i < n; i++) {
411 vector_i = vector[i];
413 res += packed_matrix[index++] * vector_i;
415 for (j = i + 1; j < n; j++, index++) {
416 res += packed_matrix[index] * vector[j];
417 result[j] += packed_matrix[index] * vector_i;
427 for (i = 0; i < n; i++) {
428 result[i] = vector1[i] - vector2[i];
436 for (i = 0; i < n; i++) {
437 result[i] = vector1[i] + vector2[i];
445 for (i = 0; i < n; i++) {
446 vector1[i] = vector1[i] +
alpha * vector2[i];
453 for (i = 0; i < n; i++)
461 for (i = 0; i < n; i++) {
462 result += vector1[i] * vector2[i];
471 for (i = 0; i < n; i++)
478 for (i = 0; i < n; i++)
485 float max_val = -1e30f;
486 for (i = 0; i < n; i++)
487 max_val = fmaxf(max_val, fabsf(vector[i]));
495 for (i = 0; i < n; i++) {
503 for (i = 0; i < n; i++) {
505 vec[i] = 1.0f / vec[i];
513 for (i = 0; i < n; i++) {
514 if (source[i] >= 0.0) {
515 target[i] = sqrtf(source[i]);
523 for (i = 0; i < n; i++) {
525 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, double *vector, double *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 right_mult_with_vector(vtx_data *matrix, int n, double *vector, double *result)
void invert_vec(int n, float *vec)
void copy_vector(int n, const double *restrict source, double *restrict dest)
void right_mult_with_vector_f(float **matrix, int n, double *vector, double *result)
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 mult_dense_mat(double **A, float **B, int dim1, int dim2, int dim3, float ***CC)
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)
void set_vector_val(int n, double val, double *result)
bool power_iteration(double *const *square_mat, int n, int neigs, double **eigs)
void scadd(double *vec1, int end, double fac, double *vec2)
void right_mult_with_vector_ff(float *packed_matrix, int n, float *vector, float *result)
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)
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