1/* $Id$ $Revision$ */
2/* vim:set shiftwidth=4 ts=8: */
3
4/*************************************************************************
5 * Copyright (c) 2011 AT&T Intellectual Property
6 * All rights reserved. This program and the accompanying materials
7 * are made available under the terms of the Eclipse Public License v1.0
8 * which accompanies this distribution, and is available at
9 * http://www.eclipse.org/legal/epl-v10.html
10 *
11 * Contributors: See CVS logs. Details at http://www.graphviz.org/
12 *************************************************************************/
13
14#ifndef POST_PROCESS_H
15#define POST_PROCESS_H
16
17#include "spring_electrical.h"
18
19enum {SM_SCHEME_NORMAL, SM_SCHEME_NORMAL_ELABEL, SM_SCHEME_UNIFORM_STRESS, SM_SCHEME_MAXENT, SM_SCHEME_STRESS_APPROX, SM_SCHEME_STRESS};
20
21struct StressMajorizationSmoother_struct {
22 SparseMatrix D;/* distance matrix. The diagonal is removed hence the ia, ja structure is different from Lw and Lwd!! */
23 SparseMatrix Lw;/* the weighted laplacian. with offdiag = -1/w_ij */
24 SparseMatrix Lwd;/* the laplacian like matrix with offdiag = -scaling*d_ij/w_ij. RHS in stress majorization = Lwd.x */
25 real* lambda;
26 void (*data_deallocator)(void*);
27 void *data;
28 int scheme;
29 real scaling;/* scaling. It is multiplied to Lwd. need to divide coordinate x at the end of the stress majorization process */
30 real tol_cg;/* tolerance and maxit for conjugate gradient that solves the Laplacian system.
31 typically the Laplacian only needs to be solved very crudely as it is part of an
32 outer iteration.*/
33 int maxit_cg;
34};
35
36typedef struct StressMajorizationSmoother_struct *StressMajorizationSmoother;
37
38void StressMajorizationSmoother_delete(StressMajorizationSmoother sm);
39
40enum {IDEAL_GRAPH_DIST, IDEAL_AVG_DIST, IDEAL_POWER_DIST};
41StressMajorizationSmoother StressMajorizationSmoother2_new(SparseMatrix A, int dim, real lambda, real *x, int ideal_dist_scheme);
42
43real StressMajorizationSmoother_smooth(StressMajorizationSmoother sm, int dim, real *x, int maxit, real tol);
44/*-------------------- triangle/neirhborhood graph based smoother ------------------- */
45typedef StressMajorizationSmoother TriangleSmoother;
46
47#define TriangleSmoother_struct StressMajorizationSmoother_struct
48
49void TriangleSmoother_delete(TriangleSmoother sm);
50
51TriangleSmoother TriangleSmoother_new(SparseMatrix A, int dim, real lambda, real *x, int use_triangularization);
52
53void TriangleSmoother_smooth(TriangleSmoother sm, int dim, real *x);
54
55
56
57/*------------------ spring and spring-electrical based smoother */
58
59struct SpringSmoother_struct {
60 SparseMatrix D;
61 spring_electrical_control ctrl;
62};
63
64typedef struct SpringSmoother_struct *SpringSmoother;
65
66SpringSmoother SpringSmoother_new(SparseMatrix A, int dim, spring_electrical_control ctrl, real *x);
67
68void SpringSmoother_delete(SpringSmoother sm);
69
70void SpringSmoother_smooth(SpringSmoother sm, SparseMatrix A, real *node_weights, int dim, real *x);
71/*------------------------------------------------------------------*/
72
73void post_process_smoothing(int dim, SparseMatrix A, spring_electrical_control ctrl, real *node_weights, real *x, int *flag);
74
75/*-------------------- sparse stress majorizationp ------------------- */
76typedef StressMajorizationSmoother SparseStressMajorizationSmoother;
77
78#define SparseStressMajorizationSmoother_struct StressMajorizationSmoother_struct
79
80void SparseStressMajorizationSmoother_delete(SparseStressMajorizationSmoother sm);
81
82enum {WEIGHTING_SCHEME_NONE, WEIGHTING_SCHEME_INV_DIST, WEIGHTING_SCHEME_SQR_DIST};
83SparseStressMajorizationSmoother SparseStressMajorizationSmoother_new(SparseMatrix A, int dim, real lambda, real *x,
84 int weighting_scheme, int scale_initial_coord);
85
86real SparseStressMajorizationSmoother_smooth(SparseStressMajorizationSmoother sm, int dim, real *x, int maxit_sm, real tol);
87
88real get_stress(int m, int dim, int *iw, int *jw, real *w, real *d, real *x, real scaling, void *data, int weighted);
89
90real get_full_stress(SparseMatrix A, int dim, real *x, int weighting_scheme);
91void dump_distance_edge_length(char *outfile, SparseMatrix A, int dim, real *x);
92
93/*--------------------------------------------------------------*/
94
95#endif
96
97