24standardize(
double* orthog,
int nvtxs)
28 for (i=0; i<nvtxs; i++)
33 for (i=0; i<nvtxs; i++)
40 if (fabs(
len) < DBL_EPSILON) {
48mat_mult_vec_orthog(
float** mat,
int dim1,
int dim2,
double* vec,
49 double* result,
double* orthog)
55 for (i=0; i<dim1; i++) {
57 for (j=0; j<dim2; j++) {
58 sum += mat[i][j]*vec[j];
62 assert(orthog !=
NULL);
68power_iteration_orthog(
float** square_mat,
int n,
int neigs,
75 double *tmp_vec =
gv_calloc(n,
sizeof(
double));
76 double *last_vec =
gv_calloc(n,
sizeof(
double));
90 for (i=0; i<neigs; i++) {
91 curr_vector = eigs[i];
95 curr_vector[j] = rand()%100;
98 assert(orthog !=
NULL);
102 for (j=0; j<i; j++) {
115 mat_mult_vec_orthog(square_mat,n,n,curr_vector,tmp_vec,orthog);
119 for (j=0; j<i; j++) {
133 }
while (fabs(angle)<
tol);
140 for (; i<neigs; i++) {
145 curr_vector = eigs[i];
148 curr_vector[j] = rand()%100;
150 for (j=0; j<i; j++) {
161 for (i=0; i<neigs-1; i++) {
163 largest_eval=evals[largest_index];
164 for (j=i+1; j<neigs; j++) {
165 if (largest_eval<evals[j]) {
167 largest_eval=evals[largest_index];
170 if (largest_index!=i) {
175 evals[largest_index]=evals[i];
176 evals[i]=largest_eval;
185compute_avgs(
DistType** Dij,
int n,
float* all_avg)
187 float* row_avg =
gv_calloc(n,
sizeof(
float));
189 double sum=0, sum_row;
191 for (i=0; i<n; i++) {
193 for (j=0; j<n; j++) {
194 sum+=(double)Dij[i][j]*(
double)Dij[i][j];
195 sum_row+=(double)Dij[i][j]*(
double)Dij[i][j];
197 row_avg[i]=(float)sum_row/n;
199 *all_avg=(float)sum/(n*n);
207 float *storage =
gv_calloc(n * n,
sizeof(
float));
208 float **Bij =
gv_calloc(n,
sizeof(
float *));
213 Bij[i] = storage+i*n;
215 row_avg = compute_avgs(Dij, n, &all_avg);
216 for (i=0; i<n; i++) {
217 for (j=0; j<=i; j++) {
218 Bij[i][j]=-(float)Dij[i][j]*Dij[i][j]+row_avg[i]+row_avg[j]-all_avg;
227CMDS_orthog(
int n,
int dim,
double** eigs,
double tol,
231 float** Bij = compute_Bij(Dij, n);
234 assert(orthog !=
NULL);
235 double *orthog_aux =
gv_calloc(n,
sizeof(
double));
236 for (i=0; i<n; i++) {
237 orthog_aux[i]=orthog[i];
239 standardize(orthog_aux,n);
240 power_iteration_orthog(Bij, n,
dim, eigs, evals, orthog_aux,
tol);
242 for (i=0; i<
dim; i++) {
243 for (j=0; j<n; j++) {
244 eigs[i][j]*=sqrt(fabs(evals[i]));
251#define SCALE_FACTOR 256
253int IMDS_given_dim(
vtx_data*
graph,
int n,
double* given_coords,
254 double* new_coords,
double conj_tol)
259 double* x = given_coords;
261 double* y = new_coords;
262 float **lap =
gv_calloc(n,
sizeof(
float *));
265 double *balance =
gv_calloc(n,
sizeof(
double));
276 Dij[i][j]*=SCALE_FACTOR;
282 for (sum1=sum2=0,i=1; i<n; i++) {
283 for (j=0; j<i; j++) {
284 sum1+=1.0/(Dij[i][j])*fabs(x[i]-x[j]);
285 sum2+=1.0/(Dij[i][j]*Dij[i][j])*fabs(x[i]-x[j])*fabs(x[i]-x[j]);
288 uniLength = isinf(sum2) ? 0 : sum1 / sum2;
294 CMDS_orthog(n, 1, &y, conj_tol, x, Dij);
297 float *f_storage =
gv_calloc(n * n,
sizeof(
float));
299 for (i=0; i<n; i++) {
300 lap[i]=f_storage+i*n;
302 for (j=0; j<n; j++) {
305 degree-=lap[i][j]=-1.0f/((float)Dij[i][j]*(
float)Dij[i][j]);
316 for (i=1; i<n; i++) {
318 for (j=0; j<i; j++) {
319 diff=(double)Dij[i][j]*(
double)Dij[i][j]-(pos_i-x[j])*(pos_i-x[j]);
320 Dij[i][j]=Dij[j][i]=diff>0 ? (
DistType)sqrt(diff) : 0;
326 for (i=0; i<n; i++) {
329 for (j=0; j<n; j++) {
333 balance[i]+=Dij[i][j]*(-lap[i][j]);
336 balance[i]-=Dij[i][j]*(-lap[i][j]);
341 for (converged=
false,iterations2=0; iterations2<200 && !converged; iterations2++) {
347 for (i=0; i<n; i++) {
350 for (j=0; j<n; j++) {
354 b+=Dij[i][j]*(-lap[i][j]);
358 b-=Dij[i][j]*(-lap[i][j]);
362 if ((b != balance[i]) && (fabs(1-b/balance[i])>1e-5)) {
369 for (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_f(float **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)
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)