29 #define HOTELLING 1 // If true use Hotelling's test to decide where to split.
30 #define FTABLE_X 10 // Size of FTable.
31 #define FTABLE_Y 100 // Size of FTable.
35 {4052.19, 4999.52, 5403.34, 5624.62, 5763.65, 5858.97, 5928.33, 5981.10, 6022.50, 6055.85,},
36 {98.502, 99.000, 99.166, 99.249, 99.300, 99.333, 99.356, 99.374, 99.388, 99.399,},
37 {34.116, 30.816, 29.457, 28.710, 28.237, 27.911, 27.672, 27.489, 27.345, 27.229,},
38 {21.198, 18.000, 16.694, 15.977, 15.522, 15.207, 14.976, 14.799, 14.659, 14.546,},
39 {16.258, 13.274, 12.060, 11.392, 10.967, 10.672, 10.456, 10.289, 10.158, 10.051,},
40 {13.745, 10.925, 9.780, 9.148, 8.746, 8.466, 8.260, 8.102, 7.976, 7.874,},
41 {12.246, 9.547, 8.451, 7.847, 7.460, 7.191, 6.993, 6.840, 6.719, 6.620,},
42 {11.259, 8.649, 7.591, 7.006, 6.632, 6.371, 6.178, 6.029, 5.911, 5.814,},
43 {10.561, 8.022, 6.992, 6.422, 6.057, 5.802, 5.613, 5.467, 5.351, 5.257,},
44 {10.044, 7.559, 6.552, 5.994, 5.636, 5.386, 5.200, 5.057, 4.942, 4.849,},
45 { 9.646, 7.206, 6.217, 5.668, 5.316, 5.069, 4.886, 4.744, 4.632, 4.539,},
46 { 9.330, 6.927, 5.953, 5.412, 5.064, 4.821, 4.640, 4.499, 4.388, 4.296,},
47 { 9.074, 6.701, 5.739, 5.205, 4.862, 4.620, 4.441, 4.302, 4.191, 4.100,},
48 { 8.862, 6.515, 5.564, 5.035, 4.695, 4.456, 4.278, 4.140, 4.030, 3.939,},
49 { 8.683, 6.359, 5.417, 4.893, 4.556, 4.318, 4.142, 4.004, 3.895, 3.805,},
50 { 8.531, 6.226, 5.292, 4.773, 4.437, 4.202, 4.026, 3.890, 3.780, 3.691,},
51 { 8.400, 6.112, 5.185, 4.669, 4.336, 4.102, 3.927, 3.791, 3.682, 3.593,},
52 { 8.285, 6.013, 5.092, 4.579, 4.248, 4.015, 3.841, 3.705, 3.597, 3.508,},
53 { 8.185, 5.926, 5.010, 4.500, 4.171, 3.939, 3.765, 3.631, 3.523, 3.434,},
54 { 8.096, 5.849, 4.938, 4.431, 4.103, 3.871, 3.699, 3.564, 3.457, 3.368,},
55 { 8.017, 5.780, 4.874, 4.369, 4.042, 3.812, 3.640, 3.506, 3.398, 3.310,},
56 { 7.945, 5.719, 4.817, 4.313, 3.988, 3.758, 3.587, 3.453, 3.346, 3.258,},
57 { 7.881, 5.664, 4.765, 4.264, 3.939, 3.710, 3.539, 3.406, 3.299, 3.211,},
58 { 7.823, 5.614, 4.718, 4.218, 3.895, 3.667, 3.496, 3.363, 3.256, 3.168,},
59 { 7.770, 5.568, 4.675, 4.177, 3.855, 3.627, 3.457, 3.324, 3.217, 3.129,},
60 { 7.721, 5.526, 4.637, 4.140, 3.818, 3.591, 3.421, 3.288, 3.182, 3.094,},
61 { 7.677, 5.488, 4.601, 4.106, 3.785, 3.558, 3.388, 3.256, 3.149, 3.062,},
62 { 7.636, 5.453, 4.568, 4.074, 3.754, 3.528, 3.358, 3.226, 3.120, 3.032,},
63 { 7.598, 5.420, 4.538, 4.045, 3.725, 3.499, 3.330, 3.198, 3.092, 3.005,},
64 { 7.562, 5.390, 4.510, 4.018, 3.699, 3.473, 3.305, 3.173, 3.067, 2.979,},
65 { 7.530, 5.362, 4.484, 3.993, 3.675, 3.449, 3.281, 3.149, 3.043, 2.955,},
66 { 7.499, 5.336, 4.459, 3.969, 3.652, 3.427, 3.258, 3.127, 3.021, 2.934,},
67 { 7.471, 5.312, 4.437, 3.948, 3.630, 3.406, 3.238, 3.106, 3.000, 2.913,},
68 { 7.444, 5.289, 4.416, 3.927, 3.611, 3.386, 3.218, 3.087, 2.981, 2.894,},
69 { 7.419, 5.268, 4.396, 3.908, 3.592, 3.368, 3.200, 3.069, 2.963, 2.876,},
70 { 7.396, 5.248, 4.377, 3.890, 3.574, 3.351, 3.183, 3.052, 2.946, 2.859,},
71 { 7.373, 5.229, 4.360, 3.873, 3.558, 3.334, 3.167, 3.036, 2.930, 2.843,},
72 { 7.353, 5.211, 4.343, 3.858, 3.542, 3.319, 3.152, 3.021, 2.915, 2.828,},
73 { 7.333, 5.194, 4.327, 3.843, 3.528, 3.305, 3.137, 3.006, 2.901, 2.814,},
74 { 7.314, 5.179, 4.313, 3.828, 3.514, 3.291, 3.124, 2.993, 2.888, 2.801,},
75 { 7.296, 5.163, 4.299, 3.815, 3.501, 3.278, 3.111, 2.980, 2.875, 2.788,},
76 { 7.280, 5.149, 4.285, 3.802, 3.488, 3.266, 3.099, 2.968, 2.863, 2.776,},
77 { 7.264, 5.136, 4.273, 3.790, 3.476, 3.254, 3.087, 2.957, 2.851, 2.764,},
78 { 7.248, 5.123, 4.261, 3.778, 3.465, 3.243, 3.076, 2.946, 2.840, 2.754,},
79 { 7.234, 5.110, 4.249, 3.767, 3.454, 3.232, 3.066, 2.935, 2.830, 2.743,},
80 { 7.220, 5.099, 4.238, 3.757, 3.444, 3.222, 3.056, 2.925, 2.820, 2.733,},
81 { 7.207, 5.087, 4.228, 3.747, 3.434, 3.213, 3.046, 2.916, 2.811, 2.724,},
82 { 7.194, 5.077, 4.218, 3.737, 3.425, 3.204, 3.037, 2.907, 2.802, 2.715,},
83 { 7.182, 5.066, 4.208, 3.728, 3.416, 3.195, 3.028, 2.898, 2.793, 2.706,},
84 { 7.171, 5.057, 4.199, 3.720, 3.408, 3.186, 3.020, 2.890, 2.785, 2.698,},
85 { 7.159, 5.047, 4.191, 3.711, 3.400, 3.178, 3.012, 2.882, 2.777, 2.690,},
86 { 7.149, 5.038, 4.182, 3.703, 3.392, 3.171, 3.005, 2.874, 2.769, 2.683,},
87 { 7.139, 5.030, 4.174, 3.695, 3.384, 3.163, 2.997, 2.867, 2.762, 2.675,},
88 { 7.129, 5.021, 4.167, 3.688, 3.377, 3.156, 2.990, 2.860, 2.755, 2.668,},
89 { 7.119, 5.013, 4.159, 3.681, 3.370, 3.149, 2.983, 2.853, 2.748, 2.662,},
90 { 7.110, 5.006, 4.152, 3.674, 3.363, 3.143, 2.977, 2.847, 2.742, 2.655,},
91 { 7.102, 4.998, 4.145, 3.667, 3.357, 3.136, 2.971, 2.841, 2.736, 2.649,},
92 { 7.093, 4.991, 4.138, 3.661, 3.351, 3.130, 2.965, 2.835, 2.730, 2.643,},
93 { 7.085, 4.984, 4.132, 3.655, 3.345, 3.124, 2.959, 2.829, 2.724, 2.637,},
94 { 7.077, 4.977, 4.126, 3.649, 3.339, 3.119, 2.953, 2.823, 2.718, 2.632,},
95 { 7.070, 4.971, 4.120, 3.643, 3.333, 3.113, 2.948, 2.818, 2.713, 2.626,},
96 { 7.062, 4.965, 4.114, 3.638, 3.328, 3.108, 2.942, 2.813, 2.708, 2.621,},
97 { 7.055, 4.959, 4.109, 3.632, 3.323, 3.103, 2.937, 2.808, 2.703, 2.616,},
98 { 7.048, 4.953, 4.103, 3.627, 3.318, 3.098, 2.932, 2.803, 2.698, 2.611,},
99 { 7.042, 4.947, 4.098, 3.622, 3.313, 3.093, 2.928, 2.798, 2.693, 2.607,},
100 { 7.035, 4.942, 4.093, 3.618, 3.308, 3.088, 2.923, 2.793, 2.689, 2.602,},
101 { 7.029, 4.937, 4.088, 3.613, 3.304, 3.084, 2.919, 2.789, 2.684, 2.598,},
102 { 7.023, 4.932, 4.083, 3.608, 3.299, 3.080, 2.914, 2.785, 2.680, 2.593,},
103 { 7.017, 4.927, 4.079, 3.604, 3.295, 3.075, 2.910, 2.781, 2.676, 2.589,},
104 { 7.011, 4.922, 4.074, 3.600, 3.291, 3.071, 2.906, 2.777, 2.672, 2.585,},
105 { 7.006, 4.917, 4.070, 3.596, 3.287, 3.067, 2.902, 2.773, 2.668, 2.581,},
106 { 7.001, 4.913, 4.066, 3.591, 3.283, 3.063, 2.898, 2.769, 2.664, 2.578,},
107 { 6.995, 4.908, 4.062, 3.588, 3.279, 3.060, 2.895, 2.765, 2.660, 2.574,},
108 { 6.990, 4.904, 4.058, 3.584, 3.275, 3.056, 2.891, 2.762, 2.657, 2.570,},
109 { 6.985, 4.900, 4.054, 3.580, 3.272, 3.052, 2.887, 2.758, 2.653, 2.567,},
110 { 6.981, 4.896, 4.050, 3.577, 3.268, 3.049, 2.884, 2.755, 2.650, 2.563,},
111 { 6.976, 4.892, 4.047, 3.573, 3.265, 3.046, 2.881, 2.751, 2.647, 2.560,},
112 { 6.971, 4.888, 4.043, 3.570, 3.261, 3.042, 2.877, 2.748, 2.644, 2.557,},
113 { 6.967, 4.884, 4.040, 3.566, 3.258, 3.039, 2.874, 2.745, 2.640, 2.554,},
114 { 6.963, 4.881, 4.036, 3.563, 3.255, 3.036, 2.871, 2.742, 2.637, 2.551,},
115 { 6.958, 4.877, 4.033, 3.560, 3.252, 3.033, 2.868, 2.739, 2.634, 2.548,},
116 { 6.954, 4.874, 4.030, 3.557, 3.249, 3.030, 2.865, 2.736, 2.632, 2.545,},
117 { 6.950, 4.870, 4.027, 3.554, 3.246, 3.027, 2.863, 2.733, 2.629, 2.542,},
118 { 6.947, 4.867, 4.024, 3.551, 3.243, 3.025, 2.860, 2.731, 2.626, 2.539,},
119 { 6.943, 4.864, 4.021, 3.548, 3.240, 3.022, 2.857, 2.728, 2.623, 2.537,},
120 { 6.939, 4.861, 4.018, 3.545, 3.238, 3.019, 2.854, 2.725, 2.621, 2.534,},
121 { 6.935, 4.858, 4.015, 3.543, 3.235, 3.017, 2.852, 2.723, 2.618, 2.532,},
122 { 6.932, 4.855, 4.012, 3.540, 3.233, 3.014, 2.849, 2.720, 2.616, 2.529,},
123 { 6.928, 4.852, 4.010, 3.538, 3.230, 3.012, 2.847, 2.718, 2.613, 2.527,},
124 { 6.925, 4.849, 4.007, 3.535, 3.228, 3.009, 2.845, 2.715, 2.611, 2.524,},
125 { 6.922, 4.846, 4.004, 3.533, 3.225, 3.007, 2.842, 2.713, 2.609, 2.522,},
126 { 6.919, 4.844, 4.002, 3.530, 3.223, 3.004, 2.840, 2.711, 2.606, 2.520,},
127 { 6.915, 4.841, 3.999, 3.528, 3.221, 3.002, 2.838, 2.709, 2.604, 2.518,},
128 { 6.912, 4.838, 3.997, 3.525, 3.218, 3.000, 2.835, 2.706, 2.602, 2.515,},
129 { 6.909, 4.836, 3.995, 3.523, 3.216, 2.998, 2.833, 2.704, 2.600, 2.513,},
130 { 6.906, 4.833, 3.992, 3.521, 3.214, 2.996, 2.831, 2.702, 2.598, 2.511,},
131 { 6.904, 4.831, 3.990, 3.519, 3.212, 2.994, 2.829, 2.700, 2.596, 2.509,},
132 { 6.901, 4.829, 3.988, 3.517, 3.210, 2.992, 2.827, 2.698, 2.594, 2.507,},
133 { 6.898, 4.826, 3.986, 3.515, 3.208, 2.990, 2.825, 2.696, 2.592, 2.505,},
134 { 6.895, 4.824, 3.984, 3.513, 3.206, 2.988, 2.823, 2.694, 2.590, 2.503}
141 #define MINVARIANCE 0.0004
149 #define MINSAMPLESPERBUCKET 5
150 #define MINSAMPLES (MINBUCKETS * MINSAMPLESPERBUCKET)
151 #define MINSAMPLESNEEDED 1
159 #define BUCKETTABLESIZE 1024
160 #define NORMALEXTENT 3.0
202 #define Odd(N) ((N)%2)
203 #define Mirror(N,R) ((R) - (N) - 1)
204 #define Abs(N) ( ( (N) < 0 ) ? ( -(N) ) : (N) )
214 #define SqrtOf2Pi 2.506628275
216 static const FLOAT64 kNormalVariance =
218 static const FLOAT64 kNormalMagnitude =
220 static const FLOAT64 kNormalMean = BUCKETTABLESIZE / 2;
224 #define LOOKUPTABLESIZE 8
225 #define MAXDEGREESOFFREEDOM MAXBUCKETS
228 MINSAMPLES, 200, 400, 600, 800, 1000, 1500, 2000
372 void *FunctionParams,
382 double InvertMatrix(
const float* input,
int size,
float* inv);
412 for (i = 0; i < SampleSize; i++) {
420 (ParamDesc[i].
Max + ParamDesc[i].
Min) / 2;
458 "Can't add samples after they have been clustered");
472 Sample->
Mean[i] = Feature[i];
477 if (CharID >= Clusterer->
NumChar)
478 Clusterer->
NumChar = CharID + 1;
533 if (Clusterer !=
NULL) {
620 *SearchState =
pop (*SearchState);
624 *SearchState =
push (*SearchState, Cluster->
Right);
625 Cluster = Cluster->
Left;
640 return (Proto->
Mean[Dimension]);
654 switch (Proto->
Style) {
661 switch (Proto->
Distrib[Dimension]) {
767 int next = context->
next;
799 #define MAXNEIGHBORS 2
800 #define MAXDISTANCE MAX_FLOAT32
804 int NumberOfNeighbors;
810 &NumberOfNeighbors, (
void **)Neighbor, Dist);
815 for (i = 0; i < NumberOfNeighbors; i++) {
816 if ((Dist[i] < *Distance) && (Neighbor[i] != Cluster)) {
818 BestNeighbor = Neighbor[i];
891 for (i = N; i > 0; i--, ParamDesc++, m++, m1++, m2++) {
892 if (ParamDesc->Circular) {
896 if ((*m2 - *m1) > ParamDesc->HalfRange) {
897 *m = (n1 * *m1 + n2 * (*m2 - ParamDesc->Range)) / n;
898 if (*m < ParamDesc->Min)
899 *m += ParamDesc->Range;
901 else if ((*m1 - *m2) > ParamDesc->HalfRange) {
902 *m = (n1 * (*m1 - ParamDesc->Range) + n2 * *m2) / n;
903 if (*m < ParamDesc->Min)
904 *m += ParamDesc->Range;
907 *m = (n1 * *m1 + n2 * *m2) / n;
910 *m = (n1 * *m1 + n2 * *m2) / n;
943 ClusterStack =
pop (ClusterStack);
945 if (Prototype !=
NULL) {
949 ClusterStack =
push (ClusterStack, Cluster->
Right);
950 ClusterStack =
push (ClusterStack, Cluster->
Left);
1008 if (Proto !=
NULL) {
1118 const double kMagicSampleMargin = 0.0625;
1119 const double kFTableBoostMargin = 2.0;
1127 if (TotalDims < N + 1 || TotalDims < 2)
1129 const int kMatrixSize = N * N *
sizeof(
FLOAT32);
1134 for (
int i = 0; i < N; ++i) {
1135 int row_offset = i * N;
1137 for (
int j = 0; j < N; ++j) {
1139 Covariance[j + row_offset] = Statistics->
CoVariance[j + row_offset];
1141 Covariance[j + row_offset] = 0.0f;
1144 for (
int j = 0; j < N; ++j) {
1146 Covariance[j + row_offset] = 1.0f;
1148 Covariance[j + row_offset] = 0.0f;
1154 tprintf(
"Clustering error: Matrix inverse failed with error %g\n", err);
1157 for (
int dim = 0; dim < N; ++dim) {
1159 Delta[dim] = Left->
Mean[dim] - Right->
Mean[dim];
1167 for (
int x = 0; x < N; ++x) {
1169 for (
int y = 0; y < N; ++y) {
1170 temp += Inverse[y + N*x] * Delta[y];
1172 Tsq += Delta[x] * temp;
1181 double F = Tsq * (TotalDims - EssentialN - 1) / ((TotalDims - 2)*EssentialN);
1182 int Fx = EssentialN;
1186 int Fy = TotalDims - EssentialN - 1;
1190 double FTarget =
FTable[Fy][Fx];
1192 TotalDims >= Config->
MagicSamples * (1.0 - kMagicSampleMargin) &&
1193 TotalDims <= Config->
MagicSamples * (1.0 + kMagicSampleMargin)) {
1195 FTarget += kFTableBoostMargin;
1224 for (i = 0; i < Clusterer->
SampleSize; i++) {
1262 for (i = 0; i < Clusterer->
SampleSize; i++) {
1269 CoVariance[i * (Clusterer->
SampleSize + 1)]));
1312 for (i = 0; i < Clusterer->
SampleSize; i++) {
1322 if (RandomBuckets ==
NULL)
1331 if (UniformBuckets ==
NULL)
1342 if (i < Clusterer->SampleSize) {
1388 (Statistics->
Min[i] + Statistics->
Max[i]) / 2;
1390 (Statistics->
Max[i] - Statistics->
Min[i]) / 2;
1429 uinT32 SampleCountAdjustedForBias;
1443 for (i = 0; i < N; i++) {
1444 Statistics->
Min[i] = 0.0;
1445 Statistics->
Max[i] = 0.0;
1446 for (j = 0; j < N; j++, CoVariance++)
1452 for (i = 0; i < N; i++) {
1453 Distance[i] = Sample->
Mean[i] - Cluster->
Mean[i];
1454 if (ParamDesc[i].Circular) {
1455 if (Distance[i] > ParamDesc[i].HalfRange)
1456 Distance[i] -= ParamDesc[i].
Range;
1457 if (Distance[i] < -ParamDesc[i].HalfRange)
1458 Distance[i] += ParamDesc[i].
Range;
1460 if (Distance[i] < Statistics->
Min[i])
1461 Statistics->
Min[i] = Distance[i];
1462 if (Distance[i] > Statistics->
Max[i])
1463 Statistics->
Max[i] = Distance[i];
1466 for (i = 0; i < N; i++)
1467 for (j = 0; j < N; j++, CoVariance++)
1468 *CoVariance += Distance[i] * Distance[j];
1475 SampleCountAdjustedForBias = Cluster->
SampleCount - 1;
1477 SampleCountAdjustedForBias = 1;
1479 for (i = 0; i < N; i++)
1480 for (j = 0; j < N; j++, CoVariance++) {
1481 *CoVariance /= SampleCountAdjustedForBias;
1493 return (Statistics);
1558 for (i = 0; i < N; i++, CoVariance += N + 1) {
1596 for (i = 0; i < N; i++) {
1621 for (i = 0; i < N; i++)
1664 for (i = 0; i < N; i++, VARii += N + 1) {
1665 if (ParamDesc[i].NonEssential)
1668 VARjj = VARii + N + 1;
1669 CoVariance = VARii + 1;
1670 for (j = i + 1; j < N; j++, CoVariance++, VARjj += N + 1) {
1671 if (ParamDesc[j].NonEssential)
1674 if ((*VARii == 0.0) || (*VARjj == 0.0))
1675 CorrelationCoeff = 0.0;
1678 sqrt (sqrt (*CoVariance * *CoVariance / (*VARii * *VARjj)));
1679 if (CorrelationCoeff > Independence)
1715 if (Buckets ==
NULL) {
1716 Buckets =
MakeBuckets(Distribution, SampleCount, Confidence);
1784 Buckets->
Count[i] = 0;
1800 NextBucketBoundary = BucketProbability / 2;
1802 NextBucketBoundary = BucketProbability;
1806 (*DensityFunction[(int) Distribution]) (BUCKETTABLESIZE / 2);
1808 ProbDensity = (*DensityFunction[(int) Distribution]) (i + 1);
1809 ProbabilityDelta =
Integral (LastProbDensity, ProbDensity, 1.0);
1810 Probability += ProbabilityDelta;
1811 if (Probability > NextBucketBoundary) {
1812 if (CurrentBucket < Buckets->NumberOfBuckets - 1)
1814 NextBucketBoundary += BucketProbability;
1816 Buckets->
Bucket[i] = CurrentBucket;
1818 (
FLOAT32) (ProbabilityDelta * SampleCount);
1819 LastProbDensity = ProbDensity;
1823 (
FLOAT32) ((0.5 - Probability) * SampleCount);
1826 for (i = 0, j = BUCKETTABLESIZE - 1; i < j; i++, j--)
1863 if (SampleCount < kCountTable[0])
1864 return kBucketsTable[0];
1867 if (SampleCount <= kCountTable[Next]) {
1868 Slope = (
FLOAT32) (kBucketsTable[Next] - kBucketsTable[Last]) /
1869 (
FLOAT32) (kCountTable[Next] - kCountTable[Last]);
1870 return ((
uinT16) (kBucketsTable[Last] +
1871 Slope * (SampleCount - kCountTable[Last])));
1874 return kBucketsTable[Last];
1901 #define CHIACCURACY 0.01
1902 #define MINALPHA (1e-200)
1912 if (
Odd (DegreesOfFreedom))
1918 SearchKey.
Alpha = Alpha;
1922 if (OldChiSquared ==
NULL) {
1923 OldChiSquared =
NewChiStruct (DegreesOfFreedom, Alpha);
1963 Distance = x - kNormalMean;
1964 return kNormalMagnitude * exp(-0.5 * Distance * Distance / kNormalVariance);
1984 static FLOAT64 UniformDistributionDensity = (
FLOAT64) 1.0 / BUCKETTABLESIZE;
1987 return UniformDistributionDensity;
2010 return (f1 + f2) * Dx / 2.0;
2055 Buckets->
Count[i] = 0;
2057 if (StdDev == 0.0) {
2067 if (Sample->
Mean[Dim] > Mean)
2069 else if (Sample->
Mean[Dim] < Mean)
2073 Buckets->
Count[BucketID] += 1;
2130 x -= ParamDesc->
Range;
2131 else if (x - Mean < -ParamDesc->HalfRange)
2132 x += ParamDesc->
Range;
2135 X = ((x -
Mean) / StdDev) * kNormalStdDev + kNormalMean;
2138 if (X > BUCKETTABLESIZE - 1)
2139 return ((
uinT16) (BUCKETTABLESIZE - 1));
2172 x -= ParamDesc->
Range;
2173 else if (x - Mean < -ParamDesc->HalfRange)
2174 x += ParamDesc->
Range;
2177 X = ((x -
Mean) / (2 * StdDev) * BUCKETTABLESIZE + BUCKETTABLESIZE / 2.0);
2180 if (X > BUCKETTABLESIZE - 1)
2181 return (
uinT16) (BUCKETTABLESIZE - 1);
2210 TotalDifference = 0.0;
2213 TotalDifference += (FrequencyDifference * FrequencyDifference) /
2277 if (Cluster !=
NULL) {
2303 static uinT8 DegreeOffsets[] = { 3, 3, 1 };
2305 uinT16 AdjustedNumBuckets;
2307 AdjustedNumBuckets = HistogramBuckets - DegreeOffsets[(int) Distribution];
2308 if (
Odd (AdjustedNumBuckets))
2309 AdjustedNumBuckets++;
2310 return (AdjustedNumBuckets);
2351 return (arg1 == arg2);
2373 AdjustFactor = (((
FLOAT64) NewSampleCount) /
2400 Buckets->
Count[i] = 0;
2426 return (ChiStruct->
Alpha == SearchKey->
Alpha);
2449 NewChiStruct->
Alpha = Alpha;
2450 return (NewChiStruct);
2475 #define INITIALDELTA 0.1
2476 #define DELTARATIO 0.1
2490 f = (*Function) ((
CHISTRUCT *) FunctionParams, x);
2491 while (
Abs (LastPosX - LastNegX) > Accuracy) {
2500 ((*Function) ((
CHISTRUCT *) FunctionParams, x + Delta) -
f) / Delta;
2509 if (NewDelta < Delta)
2513 f = (*Function) ((
CHISTRUCT *) FunctionParams, x);
2553 for (i = 1; i <= N; i++) {
2554 Denominator *= 2 * i;
2556 SeriesTotal += PowerOfx / Denominator;
2558 return ((SeriesTotal * exp (-0.5 * x)) - ChiParams->
Alpha);
2595 #define ILLEGAL_CHAR 2
2598 static inT32 NumFlags = 0;
2603 inT32 NumCharInCluster;
2604 inT32 NumIllegalInCluster;
2609 NumIllegalInCluster = 0;
2611 if (Clusterer->
NumChar > NumFlags) {
2612 if (CharFlags !=
NULL)
2614 NumFlags = Clusterer->
NumChar;
2618 for (i = 0; i < NumFlags; i++)
2619 CharFlags[i] =
FALSE;
2625 if (CharFlags[CharID] ==
FALSE) {
2626 CharFlags[CharID] =
TRUE;
2629 if (CharFlags[CharID] ==
TRUE) {
2630 NumIllegalInCluster++;
2634 PercentIllegal = (
FLOAT32) NumIllegalInCluster / NumCharInCluster;
2635 if (PercentIllegal > MaxIllegal) {
2657 for (row = 0; row < size; row++) {
2658 for (col = 0; col < size; col++) {
2659 U[row][col] = input[row*size + col];
2660 L[row][col] = row == col ? 1.0 : 0.0;
2661 U_inv[row][col] = 0.0;
2666 for (col = 0; col < size; ++col) {
2669 double best_pivot = -1.0;
2670 for (row = col; row < size; ++row) {
2671 if (
Abs(U[row][col]) > best_pivot) {
2672 best_pivot =
Abs(U[row][col]);
2677 if (best_row != col) {
2678 for (
int k = 0; k < size; ++k) {
2679 double tmp = U[best_row][k];
2680 U[best_row][k] = U[col][k];
2682 tmp = L[best_row][k];
2683 L[best_row][k] = L[col][k];
2688 for (row = col + 1; row < size; ++row) {
2689 double ratio = -U[row][col] / U[col][col];
2690 for (
int j = col; j < size; ++j) {
2691 U[row][j] += U[col][j] * ratio;
2693 for (
int k = 0; k < size; ++k) {
2694 L[row][k] += L[col][k] * ratio;
2699 for (col = 0; col < size; ++col) {
2700 U_inv[col][col] = 1.0 / U[col][col];
2701 for (row = col - 1; row >= 0; --row) {
2703 for (
int k = col; k > row; --k) {
2704 total += U[row][k] * U_inv[k][col];
2706 U_inv[row][col] = -total / U[row][row];
2710 for (row = 0; row < size; row++) {
2711 for (col = 0; col < size; col++) {
2713 for (
int k = row; k < size; ++k) {
2714 sum += U_inv[row][k] * L[k][col];
2716 inv[row*size + col] = sum;
2720 double error_sum = 0.0;
2721 for (row = 0; row < size; row++) {
2722 for (col = 0; col < size; col++) {
2724 for (
int k = 0; k < size; ++k) {
2725 sum += input[row*size + k] * inv[k *size + col];
2728 error_sum +=
Abs(sum);