25standardize(
double* orthog,
int nvtxs)
29 for (i=0; i<nvtxs; i++)
34 for (i=0; i<nvtxs; i++)
41 if (fabs(
len) < DBL_EPSILON) {
49mat_mult_vec_orthog(
float** mat,
int dim1,
int dim2,
double* vec,
50 double* result,
double* orthog)
56 for (i=0; i<dim1; i++) {
58 for (j=0; j<dim2; j++) {
59 sum += mat[i][j]*vec[j];
63 assert(orthog !=
NULL);
69power_iteration_orthog(
float** square_mat,
int n,
int neigs,
76 double *tmp_vec =
gv_calloc(n,
sizeof(
double));
77 double *last_vec =
gv_calloc(n,
sizeof(
double));
91 for (i=0; i<neigs; i++) {
92 curr_vector = eigs[i];
96 curr_vector[j] = rand()%100;
99 assert(orthog !=
NULL);
103 for (j=0; j<i; j++) {
116 mat_mult_vec_orthog(square_mat,n,n,curr_vector,tmp_vec,orthog);
120 for (j=0; j<i; j++) {
134 }
while (fabs(angle)<
tol);
141 for (; i<neigs; i++) {
146 curr_vector = eigs[i];
149 curr_vector[j] = rand()%100;
151 for (j=0; j<i; j++) {
162 for (i=0; i<neigs-1; i++) {
164 largest_eval=evals[largest_index];
165 for (j=i+1; j<neigs; j++) {
166 if (largest_eval<evals[j]) {
168 largest_eval=evals[largest_index];
171 if (largest_index!=i) {
176 evals[largest_index]=evals[i];
177 evals[i]=largest_eval;
186compute_avgs(
DistType** Dij,
int n,
float* all_avg)
188 float* row_avg =
gv_calloc(n,
sizeof(
float));
190 double sum=0, sum_row;
192 for (i=0; i<n; i++) {
194 for (j=0; j<n; j++) {
195 sum+=(double)Dij[i][j]*(
double)Dij[i][j];
196 sum_row+=(double)Dij[i][j]*(
double)Dij[i][j];
198 row_avg[i]=(float)sum_row/n;
200 *all_avg=(float)sum/(n*n);
208 float *storage =
gv_calloc(n * n,
sizeof(
float));
209 float **Bij =
gv_calloc(n,
sizeof(
float *));
214 Bij[i] = storage+i*n;
216 row_avg = compute_avgs(Dij, n, &all_avg);
217 for (i=0; i<n; i++) {
218 for (j=0; j<=i; j++) {
219 Bij[i][j]=-(float)Dij[i][j]*Dij[i][j]+row_avg[i]+row_avg[j]-all_avg;
228CMDS_orthog(
int n,
int dim,
double** eigs,
double tol,
232 float** Bij = compute_Bij(Dij, n);
235 assert(orthog !=
NULL);
236 double *orthog_aux =
gv_calloc(n,
sizeof(
double));
237 for (i=0; i<n; i++) {
238 orthog_aux[i]=orthog[i];
240 standardize(orthog_aux,n);
241 power_iteration_orthog(Bij, n,
dim, eigs, evals, orthog_aux,
tol);
243 for (i=0; i<
dim; i++) {
244 for (j=0; j<n; j++) {
245 eigs[i][j]*=sqrt(fabs(evals[i]));
252#define SCALE_FACTOR 256
254int IMDS_given_dim(
vtx_data*
graph,
int n,
double* given_coords,
255 double* new_coords,
double conj_tol)
259 double* x = given_coords;
261 double* y = new_coords;
262 double **
const lap =
gv_calloc(n,
sizeof(
double *));
263 double *balance =
gv_calloc(n,
sizeof(
double));
271 for (
int i = 0; i < n; i++)
272 for (
int j = 0; j < n; j++)
273 Dij[i][j]*=SCALE_FACTOR;
280 for (
int i = 1; i < n; i++) {
281 for (
int j = 0; j < i; j++) {
282 sum1+=1.0/(Dij[i][j])*fabs(x[i]-x[j]);
283 sum2+=1.0/(Dij[i][j]*Dij[i][j])*fabs(x[i]-x[j])*fabs(x[i]-x[j]);
286 uniLength = isinf(sum2) ? 0 : sum1 / sum2;
287 for (
int i = 0; i < n; i++)
292 CMDS_orthog(n, 1, &y, conj_tol, x, Dij);
295 double *f_storage =
gv_calloc(n * n,
sizeof(
double));
297 for (
int i = 0; i < n; i++) {
298 lap[i]=f_storage+i*n;
300 for (
int j = 0; j < n; j++) {
303 degree -= lap[i][j] = -1.0 / ((double)Dij[i][j] * Dij[i][j]);
314 for (
int i = 1; i < n; i++) {
315 const double pos_i = x[i];
316 for (
int j = 0; j < i; j++) {
317 diff=(double)Dij[i][j]*(
double)Dij[i][j]-(pos_i-x[j])*(pos_i-x[j]);
318 Dij[i][j]=Dij[j][i]=diff>0 ? (
DistType)sqrt(diff) : 0;
324 for (
int i = 0; i < n; i++) {
325 const double pos_i = y[i];
327 for (
int j = 0; j < n; j++) {
331 balance[i]+=Dij[i][j]*(-lap[i][j]);
334 balance[i]-=Dij[i][j]*(-lap[i][j]);
339 for (converged=
false,iterations2=0; iterations2<200 && !converged; iterations2++) {
345 for (
int i = 0; i < n; i++) {
346 const double pos_i = y[i];
348 for (
int j = 0; j < n; j++) {
352 b+=Dij[i][j]*(-lap[i][j]);
356 b-=Dij[i][j]*(-lap[i][j]);
361 fabs(1 - b / balance[i]) > 1e-5) {
368 for (
int i = 0; !(fabs(uniLength) < DBL_EPSILON) && i < n; i++) {
Memory allocation wrappers that exit on failure.
static void * gv_calloc(size_t nmemb, size_t size)
int conjugate_gradient_d(double **A, double *x, double *b, int n, double tol, int max_iterations, bool ortho1)
static double norm(int n, const double *x)
static double len(glCompPoint p)
static void cleanup(void)
Agraph_t * graph(char *name)
Arithmetic helper functions.
static bool is_exactly_zero(double v)
is a value precisely 0.0?
static bool is_exactly_equal(double a, double b)
are two values precisely the same?
DistType ** compute_apsp(vtx_data *graph, int n)
double vectors_inner_product(int n, const double *vector1, const double *vector2)
void copy_vector(int n, const double *restrict source, double *restrict dest)
void scadd(double *vec1, int end, double fac, double *vec2)
static const double p_iteration_threshold
void vectors_scalar_mult(int n, const double *vector, double alpha, double *result)