Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
MorsGames
GitHub Repository: MorsGames/sm64plus
Path: blob/master/tools/sdk-tools/tabledesign/codebook.c
7861 views
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
}
105
106