18#define _USE_MATH_DEFINES
30#define QUOTED_TOKENSIZE "79"
31#define MAXSAMPLESIZE 65535
45static bool ReadNFloats(TFile *fp, uint16_t N,
float Buffer[]) {
46 const int kMaxLineSize = 1024;
47 char line[kMaxLineSize];
48 if (fp->FGets(line, kMaxLineSize) ==
nullptr) {
49 tprintf(
"Hit EOF in ReadNFloats!\n");
53 std::stringstream stream(line);
55 stream.imbue(std::locale::classic());
56 for (uint16_t
i = 0;
i < N;
i++) {
60 tprintf(
"Read of %u floats failed!\n", N);
75static void WriteNFloats(FILE *File, uint16_t N,
float Array[]) {
76 for (
int i = 0;
i < N;
i++) {
77 fprintf(File,
" %9.6f", Array[
i]);
89static void WriteProtoStyle(FILE *File,
PROTOSTYLE ProtoStyle) {
92 fprintf(File,
"spherical");
95 fprintf(File,
"elliptical");
98 fprintf(File,
"mixed");
101 fprintf(File,
"automatic");
117 const int kMaxLineSize = 100;
118 char line[kMaxLineSize];
136 for (
int i = 0;
i < N;
i++) {
138 char line[kMaxLineSize];
140 std::istringstream stream(line);
142 stream.imbue(std::locale::classic());
143 std::string linear_token;
144 stream >> linear_token;
145 std::string essential_token;
146 stream >> essential_token;
147 stream >> ParamDesc[
i].Min;
148 stream >> ParamDesc[
i].Max;
150 ParamDesc[
i].Circular = (linear_token[0] ==
'c');
151 ParamDesc[
i].NonEssential = (essential_token[0] !=
'e');
152 ParamDesc[
i].Range = ParamDesc[
i].Max - ParamDesc[
i].Min;
153 ParamDesc[
i].HalfRange = ParamDesc[
i].Range / 2;
154 ParamDesc[
i].MidRange = (ParamDesc[
i].Max + ParamDesc[
i].Min) / 2;
174 char line[kMaxLineSize];
175 if (fp->
FGets(line, kMaxLineSize) ==
nullptr ||
177 &SampleCount) != 3) {
178 tprintf(
"Invalid prototype: %s\n", line);
183 Proto->Significant = (sig_token[0] ==
's');
185 switch (shape_token[0]) {
196 tprintf(
"Invalid prototype style specification:%s\n", shape_token);
201 Proto->NumSamples = SampleCount;
203 Proto->Mean.resize(N);
204 ReadNFloats(fp, N, &Proto->Mean[0]);
206 switch (Proto->Style) {
208 ReadNFloats(fp, 1, &(Proto->Variance.Spherical));
209 Proto->Magnitude.Spherical = 1.0 / sqrt(2.0 * M_PI * Proto->Variance.Spherical);
210 Proto->TotalMagnitude = std::pow(Proto->Magnitude.Spherical,
static_cast<float>(N));
211 Proto->LogMagnitude = log(
static_cast<double>(Proto->TotalMagnitude));
212 Proto->Weight.Spherical = 1.0 / Proto->Variance.Spherical;
213 Proto->Distrib.clear();
216 Proto->Variance.Elliptical =
new float[N];
217 ReadNFloats(fp, N, Proto->Variance.Elliptical);
218 Proto->Magnitude.Elliptical =
new float[N];
219 Proto->Weight.Elliptical =
new float[N];
220 Proto->TotalMagnitude = 1.0;
221 for (
i = 0;
i < N;
i++) {
222 Proto->Magnitude.Elliptical[
i] = 1.0f / sqrt(2.0f * M_PI * Proto->Variance.Elliptical[
i]);
223 Proto->Weight.Elliptical[
i] = 1.0f / Proto->Variance.Elliptical[
i];
224 Proto->TotalMagnitude *= Proto->Magnitude.Elliptical[
i];
226 Proto->LogMagnitude = log(
static_cast<double>(Proto->TotalMagnitude));
227 Proto->Distrib.clear();
231 tprintf(
"Invalid prototype style\n");
247 for (
i = 0;
i < N;
i++) {
248 if (ParamDesc[
i].Circular) {
249 fprintf(
File,
"circular ");
251 fprintf(
File,
"linear ");
254 if (ParamDesc[
i].NonEssential) {
255 fprintf(
File,
"non-essential ");
257 fprintf(
File,
"essential ");
260 fprintf(
File,
"%10.6f %10.6f\n", ParamDesc[
i].Min, ParamDesc[
i].
Max);
275 fprintf(
File,
"significant ");
277 fprintf(
File,
"insignificant ");
281 WriteNFloats(
File, N, &Proto->
Mean[0]);
284 switch (Proto->
Style) {
292 for (
i = 0;
i < N;
i++) {
295 fprintf(
File,
" %9s",
"normal");
298 fprintf(
File,
" %9s",
"uniform");
301 fprintf(
File,
" %9s",
"random");
307 fprintf(
File,
"\n\t");
#define MAXSAMPLESIZE
max num of dimensions in feature space
#define TOKENSIZE
max size of tokens read from an input file
uint16_t ReadSampleSize(TFile *fp)
void tprintf(const char *format,...)
void WriteParamDesc(FILE *File, uint16_t N, const PARAM_DESC ParamDesc[])
void WritePrototype(FILE *File, uint16_t N, PROTOTYPE *Proto)
PROTOTYPE * ReadPrototype(TFile *fp, uint16_t N)
PARAM_DESC * ReadParamDesc(TFile *fp, uint16_t N)
char * FGets(char *buffer, int buffer_size)
std::vector< float > Mean
std::vector< DISTRIBUTION > Distrib