codebook.c (2513B)
1 #include <stdlib.h> 2 #include "tabledesign.h" 3 4 void split(double **table, double *delta, int order, int npredictors, double scale) 5 { 6 int i, j; 7 8 for (i = 0; i < npredictors; i++) 9 { 10 for (j = 0; j <= order; j++) 11 { 12 table[i + npredictors][j] = table[i][j] + delta[j] * scale; 13 } 14 } 15 } 16 17 void refine(double **table, int order, int npredictors, double **data, int dataSize, int refineIters, UNUSED double unused) 18 { 19 int iter; // spD8 20 double **rsums; 21 int *counts; // spD0 22 double *temp_s7; 23 double dist; 24 double dummy; // spC0 25 double bestValue; 26 int bestIndex; 27 int i, j; 28 29 rsums = malloc(npredictors * sizeof(double*)); 30 for (i = 0; i < npredictors; i++) 31 { 32 rsums[i] = malloc((order + 1) * sizeof(double)); 33 } 34 35 counts = malloc(npredictors * sizeof(int)); 36 temp_s7 = malloc((order + 1) * sizeof(double)); 37 38 for (iter = 0; iter < refineIters; iter++) 39 { 40 for (i = 0; i < npredictors; i++) 41 { 42 counts[i] = 0; 43 for (j = 0; j <= order; j++) 44 { 45 rsums[i][j] = 0.0; 46 } 47 } 48 49 for (i = 0; i < dataSize; i++) 50 { 51 bestValue = 1e30; 52 bestIndex = 0; 53 54 for (j = 0; j < npredictors; j++) 55 { 56 dist = model_dist(table[j], data[i], order); 57 if (dist < bestValue) 58 { 59 bestValue = dist; 60 bestIndex = j; 61 } 62 } 63 64 counts[bestIndex]++; 65 rfroma(data[i], order, temp_s7); 66 for (j = 0; j <= order; j++) 67 { 68 rsums[bestIndex][j] += temp_s7[j]; 69 } 70 } 71 72 for (i = 0; i < npredictors; i++) 73 { 74 if (counts[i] > 0) 75 { 76 for (j = 0; j <= order; j++) 77 { 78 rsums[i][j] /= counts[i]; 79 } 80 } 81 } 82 83 for (i = 0; i < npredictors; i++) 84 { 85 durbin(rsums[i], order, temp_s7, table[i], &dummy); 86 87 for (j = 1; j <= order; j++) 88 { 89 if (temp_s7[j] >= 1.0) temp_s7[j] = 0.9999999999; 90 if (temp_s7[j] <= -1.0) temp_s7[j] = -0.9999999999; 91 } 92 93 afromk(temp_s7, table[i], order); 94 } 95 } 96 97 free(counts); 98 for (i = 0; i < npredictors; i++) 99 { 100 free(rsums[i]); 101 } 102 free(rsums); 103 free(temp_s7); 104 }