00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 #include <digcola.h>
00018 #ifdef DIGCOLA
00019 #include "kkutils.h"
00020
00021 static int* given_levels = NULL;
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052 double
00053 compute_hierarchy(vtx_data* graph, int n, double abs_tol, double relative_tol,
00054 double* given_coords, int** orderingp, int** levelsp, int* num_levelsp)
00055 {
00056 double* y;
00057 int i;
00058 double spread;
00059 int use_given_levels=FALSE;
00060 int* ordering;
00061 int* levels;
00062 double tol;
00063 double hierarchy_span;
00064 int num_levels;
00065
00066
00067 if (given_coords) {
00068 y = given_coords;
00069 }
00070 else {
00071 y = N_GNEW(n,double);
00072 compute_y_coords(graph, n, y, n);
00073 }
00074
00075
00076 *orderingp = ordering = N_NEW(n, int);
00077 for (i=0; i<n; i++) {
00078 ordering[i] = i;
00079 }
00080 quicksort_place(y, ordering, 0,n-1);
00081
00082 spread = y[ordering[n-1]]-y[ordering[0]];
00083
00084
00085 if (given_levels) {
00086 use_given_levels=TRUE;
00087 for (i=0; i<n; i++) {
00088 use_given_levels = use_given_levels && given_levels[i]>=0;
00089 }
00090 }
00091 if (use_given_levels) {
00092 for (i=0; i<n; i++) {
00093 y[i] = given_levels[i];
00094 ordering[i] = i;
00095 }
00096 quicksort_place(y, ordering, 0,n-1);
00097 }
00098
00099
00100
00101
00102
00103 hierarchy_span = y[ordering[n-1]]-y[ordering[0]];
00104 tol = MAX(abs_tol, relative_tol*hierarchy_span/(n-1));
00105
00106
00107
00108
00109
00110 num_levels = 0;
00111 for (i=1; i<n; i++) {
00112 if (y[ordering[i]] - y[ordering[i-1]] > tol) {
00113 num_levels++;
00114 }
00115 }
00116 *num_levelsp = num_levels;
00117 if (num_levels==0) {
00118 *levelsp = levels = N_GNEW(1, int);
00119 levels[0] = n;
00120 }
00121 else {
00122 int count=0;
00123 *levelsp = levels = N_GNEW(num_levels, int);
00124 for (i=1; i<n; i++) {
00125 if (y[ordering[i]] - y[ordering[i-1]] > tol) {
00126 levels[count++] = i;
00127 }
00128 }
00129 }
00130 if (!given_coords) {
00131 free(y);
00132 }
00133
00134 return spread;
00135 }
00136
00137 #endif
00138