KMR
flexdicemain.c
1 /* flexdicemain.c (2014-02-04) -*-Coding: us-ascii;-*- */
2 
3 /* FlexDice (main routine). See "flexdice.c". */
4 
5 /* ARGUMENTS (example):
6  % flexdice 3 indata outdir 4 5 7 403
7  1: dimension of input data (3)
8  2: input data file name (indata)
9  3: output directory name (outdir)
10  4: lower bound of the number of objects in dense cells (4)
11  5: dense cell factor (larger value requires higher density) (5)
12  6: limit of the number of layers (7)
13  7: hashtable size (403) */
14 
15 #include <stdio.h>
16 #include <stdlib.h>
17 #include <limits.h>
18 #include <math.h>
19 #include <assert.h>
20 #include "flexdice.h"
21 
22 static void make_data(int *data, int range, int dim, int m, int n);
23 
24 int
25 main(int argc, char **argv)
26 {
27  struct INPARA para_, *para = &para_;
28 
29  int datadash = (argc != 1);
30  if (datadash) {
31  assert(argc == 8);
32  para->dim = atoi(argv[1]);
33  para->dmin = atoi(argv[4]);
34  para->dfac = atoi(argv[5]);
35  para->nlayers = atoi(argv[6]);
36  para->hashsize = atoi(argv[7]);
37  para->infile = argv[2];
38  para->outdir = argv[3];
39  para->plot_cut_off = 10;
40  para->plot_noise = 1;
41  } else {
42  para->dim = 3;
43  para->dmin = 4;
44  para->dfac = 5;
45  para->nlayers = 7;
46  para->hashsize = 403;
47  para->infile = "indata";
48  para->outdir = "outdir";
49  para->plot_cut_off = 0;
50  para->plot_noise = 0;
51  }
52 
53  init_flexdice(argc, argv, para);
54  print_parameters(para);
55  struct CELL *input = create_cell(0, 0);
56  if (datadash) {
57  read_input(input, para);
58  } else {
59  int range = 10000;
60  int dim = para->dim;
61  int m = 20;
62  int n = 100;
63  int *data = malloc(sizeof(int) * (dim * m * n));
64  assert(data != 0);
65  make_data(data, range, dim, m, n);
66  set_input(input, para, data, (m * n));
67  free(data);
68  }
69 
70  flexdice(input, para);
71 
72  output_clusters();
73 
74  printf("CPU TIME: Phase1=%.3f Phase2=%.3f Total=%.3f (sec)\n",
75  (fxd.t[1] - fxd.t[0]), (fxd.t[2] - fxd.t[1]),
76  (fxd.t[2] - fxd.t[0]));
77 
78  printf("#clusters=%ld #dense-cells=%ld #noise-objects=%ld\n",
79  fxd.n_clusters, fxd.n_dense_cells, fxd.n_noise_objects);
80 
81  return 0;
82 }
83 
84 static double
85 RND()
86 {
87  double u, v, s;
88  do {
89  u = 2.0 * drand48() - 1.0;
90  v = 2.0 * drand48() - 1.0;
91  s = u * u + v * v;
92  } while (s >= 1.0 || s == 0.0);
93  double m = sqrt(-2.0 * log(s) / s);
94  return (u * m);
95 }
96 
97 #define BND(X,R) ((X < -R) ? -R : ((X > R) ? R : X))
98 
99 /* Generates M clusters of N data each. */
100 
101 static void
102 make_data(int *data, int range, int dim, int m, int n)
103 {
104  int p[dim];
105  double sdev = (0.01 * range);
106  assert(sdev * 10.0 < 1.0 * INT_MAX);
107  for (int j = 0; j < m; j++) {
108  for (int attr = 0; attr < dim; attr++) {
109  int v = (int)(range * (2.0 * drand48() - 1.0));
110  p[attr] = BND(v, range);
111  }
112  for (int i = 0; i < n; i++) {
113  for (int attr = 0; attr < dim; attr++) {
114  int v = (int)((RND() * sdev) + p[attr]);
115  data[dim * (n * j + i) + attr] = BND(v, range);
116  }
117  }
118  }
119 }
Definition: flexdice.h:79