| 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 SPRING_ELECTRICAL_H |
| 15 | #define SPRING_ELECTRICAL_H |
| 16 | |
| 17 | #include <SparseMatrix.h> |
| 18 | |
| 19 | enum {ERROR_NOT_SQUARE_MATRIX = -100}; |
| 20 | |
| 21 | /* a flag to indicate that p should be set auto */ |
| 22 | #define AUTOP -1.0001234 |
| 23 | |
| 24 | enum {SMOOTHING_NONE, SMOOTHING_STRESS_MAJORIZATION_GRAPH_DIST, SMOOTHING_STRESS_MAJORIZATION_AVG_DIST, SMOOTHING_STRESS_MAJORIZATION_POWER_DIST, SMOOTHING_SPRING, SMOOTHING_TRIANGLE, SMOOTHING_RNG}; |
| 25 | |
| 26 | enum {QUAD_TREE_HYBRID_SIZE = 10000}; |
| 27 | |
| 28 | enum {QUAD_TREE_NONE = 0, QUAD_TREE_NORMAL, QUAD_TREE_FAST, QUAD_TREE_HYBRID}; |
| 29 | |
| 30 | enum {METHOD_STA = -1, METHOD_SPRING_ELECTRICAL, METHOD_SPRING_MAXENT, METHOD_STRESS_MAXENT, METHOD_STRESS_APPROX, METHOD_STRESS, METHOD_UNIFORM_STRESS, METHOD_FULL_STRESS, METHOD_NONE, METHOD_STO}; |
| 31 | |
| 32 | struct spring_electrical_control_struct { |
| 33 | real p;/*a negativve real number default to -1. repulsive force = dist^p */ |
| 34 | real q;/*a positive real number default to 2. attractive force = dist^q */ |
| 35 | int random_start;/* whether to apply SE from a random layout, or from exisiting layout */ |
| 36 | real K;/* the natural distance. If K < 0, K will be set to the average distance of an edge */ |
| 37 | real C;/* another parameter. f_a(i,j) = C*dist(i,j)^2/K * d_ij, f_r(i,j) = K^(3-p)/dist(i,j)^(-p). By default C = 0.2. */ |
| 38 | int multilevels;/* if <=1, single level */ |
| 39 | int multilevel_coarsen_scheme;/* pass on to Multilevel_control->coarsen_scheme */ |
| 40 | int multilevel_coarsen_mode;/* pass on to Multilevel_control->coarsen_mode */ |
| 41 | int quadtree_size;/* cut off size above which quadtree approximation is used */ |
| 42 | int max_qtree_level;/* max level of quadtree */ |
| 43 | real bh;/* Barnes-Hutt constant, if width(snode)/dist[i,snode] < bh, treat snode as a supernode. default 0.2*/ |
| 44 | real tol;/* minimum different between two subsequence config before terminating. ||x-xold|| < tol */ |
| 45 | int maxiter; |
| 46 | real cool;/* default 0.9 */ |
| 47 | real step;/* initial step size */ |
| 48 | int adaptive_cooling; |
| 49 | int random_seed; |
| 50 | int beautify_leaves; |
| 51 | int use_node_weights; |
| 52 | int smoothing; |
| 53 | int overlap; |
| 54 | int do_shrinking; |
| 55 | int tscheme; /* octree scheme. 0 (no octree), 1 (normal), 2 (fast) */ |
| 56 | int method;/* spring_electical, spring_maxent */ |
| 57 | real initial_scaling;/* how to scale the layout of the graph before passing to overlap removal algorithm. |
| 58 | positive values are absolute in points, negative values are relative |
| 59 | to average label size. |
| 60 | */ |
| 61 | real rotation;/* degree of rotation */ |
| 62 | int edge_labeling_scheme; /* specifying whether to treat node of the form |edgelabel|* as a special node representing an edge label. |
| 63 | 0 (no action, default), 1 (penalty based method to make that kind of node close to the center of its neighbor), |
| 64 | 1 (penalty based method to make that kind of node close to the old center of its neighbor), |
| 65 | 3 (two step process of overlap removal and straightening) */ |
| 66 | }; |
| 67 | |
| 68 | typedef struct spring_electrical_control_struct *spring_electrical_control; |
| 69 | |
| 70 | spring_electrical_control spring_electrical_control_new(void); |
| 71 | void spring_electrical_control_print(spring_electrical_control ctrl); |
| 72 | |
| 73 | void spring_electrical_embedding(int dim, SparseMatrix A0, spring_electrical_control ctrl, real *node_weights, real *x, int *flag); |
| 74 | void spring_electrical_embedding_fast(int dim, SparseMatrix A0, spring_electrical_control ctrl, real *node_weights, real *x, int *flag); |
| 75 | |
| 76 | void multilevel_spring_electrical_embedding(int dim, SparseMatrix A0, SparseMatrix D, spring_electrical_control ctrl, real *node_weights, real *label_sizes, |
| 77 | real *x, int n_edge_label_nodes, int *edge_label_nodes, int *flag); |
| 78 | |
| 79 | void export_embedding(FILE *fp, int dim, SparseMatrix A, real *x, real *width); |
| 80 | void spring_electrical_control_delete(spring_electrical_control ctrl); |
| 81 | void print_matrix(real *x, int n, int dim); |
| 82 | |
| 83 | real average_edge_length(SparseMatrix A, int dim, real *coord); |
| 84 | |
| 85 | void spring_electrical_spring_embedding(int dim, SparseMatrix A, SparseMatrix D, spring_electrical_control ctrl, real *node_weights, real *x, int *flag); |
| 86 | void force_print(FILE *fp, int n, int dim, real *x, real *force); |
| 87 | |
| 88 | enum {MAX_I = 20, OPT_UP = 1, OPT_DOWN = -1, OPT_INIT = 0}; |
| 89 | struct oned_optimizer_struct{ |
| 90 | int i; |
| 91 | real work[MAX_I+1]; |
| 92 | int direction; |
| 93 | }; |
| 94 | typedef struct oned_optimizer_struct *oned_optimizer; |
| 95 | void oned_optimizer_delete(oned_optimizer opt); |
| 96 | oned_optimizer oned_optimizer_new(int i); |
| 97 | void oned_optimizer_train(oned_optimizer opt, real work); |
| 98 | int oned_optimizer_get(oned_optimizer opt); |
| 99 | void interpolate_coord(int dim, SparseMatrix A, real *x); |
| 100 | int power_law_graph(SparseMatrix A); |
| 101 | void pcp_rotate(int n, int dim, real *x); |
| 102 | #endif |
| 103 | |