#include "readaggregation.h"
#include "readfunc.h"
#include "errorhandler.h"
#include "gadget.h"
#include "global.h"
int readAggregation(CommentStream& infile, IntMatrix& agg, CharPtrVector& aggindex) {
int i, j, tmp;
char text[MaxStrLength];
strncpy(text, "", MaxStrLength);
agg.Reset();
aggindex.Reset();
i = tmp = 0;
infile >> ws;
while (!infile.eof()) {
aggindex.resize(new char[MaxStrLength]);
strncpy(aggindex[i], "", MaxStrLength);
infile >> aggindex[i];
agg.AddRows(1, 0, 0);
infile.getLine(text, MaxStrLength);
if (infile.fail())
handle.logFileMessage(LOGFAIL, "failed to read aggregation vector");
istringstream line(text);
line >> ws;
while (!line.eof()) {
line >> tmp >> ws;
if (line.fail() && !line.eof())
handle.logFileMessage(LOGFAIL, "failed to read aggregation vector");
agg[i].resize(1, tmp);
}
infile >> ws;
i++;
}
//check that the labels are unique
for (i = 0; i < aggindex.Size(); i++)
for (j = 0; j < aggindex.Size(); j++)
if ((strcasecmp(aggindex[i], aggindex[j]) == 0) && (i != j))
handle.logMessage(LOGFAIL, "Error in aggregation file - repeated label", aggindex[i]);
handle.logMessage(LOGMESSAGE, "Read aggregation file - number of entries", aggindex.Size());
return aggindex.Size();
}
int readAggregation(CommentStream& infile, IntVector& agg, CharPtrVector& aggindex) {
int i, j;
i = 0;
agg.Reset();
aggindex.Reset();
infile >> ws;
while (!infile.eof()) {
aggindex.resize(new char[MaxStrLength]);
strncpy(aggindex[i], "", MaxStrLength);
agg.resize(1, 0);
infile >> aggindex[i] >> agg[i] >> ws;
i++;
}
//check that the labels are unique
for (i = 0; i < aggindex.Size(); i++)
for (j = 0; j < aggindex.Size(); j++)
if ((strcasecmp(aggindex[i], aggindex[j]) == 0) && (i != j))
handle.logMessage(LOGFAIL, "Error in aggregation file - repeated label", aggindex[i]);
handle.logMessage(LOGMESSAGE, "Read aggregation file - number of entries", aggindex.Size());
return aggindex.Size();
}
int readLengthAggregation(CommentStream& infile, DoubleVector& lengths, CharPtrVector& lenindex) {
int i, j;
double dblA, dblB;
i = 0;
lengths.Reset();
lenindex.Reset();
infile >> ws;
while (!infile.eof()) {
lenindex.resize(new char[MaxStrLength]);
strncpy(lenindex[i], "", MaxStrLength);
infile >> lenindex[i] >> dblA >> dblB >> ws;
if (i == 0)
lengths.resize(1, dblA); //first length entry to be read
if (isEqual(lengths[i], dblA))
lengths.resize(1, dblB); //add next length entry
else
handle.logMessage(LOGFAIL, "Error in length aggregation - lengths not consecutive");
i++;
}
//check that the labels are unique
for (i = 0; i < lenindex.Size(); i++)
for (j = 0; j < lenindex.Size(); j++)
if ((strcasecmp(lenindex[i], lenindex[j]) == 0) && (i != j))
handle.logMessage(LOGFAIL, "Error in length aggregation file - repeated label", lenindex[i]);
handle.logMessage(LOGMESSAGE, "Read length aggregation file - number of entries", lenindex.Size());
return lenindex.Size();
}
int readPreyAggregation(CommentStream& infile, CharPtrMatrix& preynames,
DoubleMatrix& preylengths, FormulaMatrix& digestioncoeff,
CharPtrVector& preyindex, Keeper* const keeper) {
int i, j, k;
char text[MaxStrLength];
strncpy(text, "", MaxStrLength);
i = j = 0;
preylengths.Reset();
preyindex.Reset();
infile >> ws;
while (!infile.eof()) {
preyindex.resize(new char[MaxStrLength]);
strncpy(preyindex[i], "", MaxStrLength);
infile >> preyindex[i];
j = 0;
preynames.resize();
infile >> text >> ws;
while (!infile.eof() && (strcasecmp(text, "lengths") != 0)) {
preynames[i].resize(new char[strlen(text) + 1]);
strcpy(preynames[i][j++], text);
infile >> text >> ws;
}
if (strcasecmp(text, "lengths") != 0)
handle.logFileUnexpected(LOGFAIL, "lengths", text);
//JMB - changed so that only 2 lengths are read in
preylengths.AddRows(1, 2, 0.0);
infile >> preylengths[i][0] >> preylengths[i][1] >> text >> ws;
if (strcasecmp(text, "digestioncoefficients") != 0)
handle.logFileUnexpected(LOGFAIL, "digestioncoefficients", text);
//JMB - changed so that only 3 elements are read in
digestioncoeff.AddRows(1, 3, 0);
for (k = 0; k < 3; k++)
if (!(infile >> digestioncoeff[i][k]))
handle.logFileMessage(LOGFAIL, "invalid format for digestion coefficient vector");
digestioncoeff[i].Inform(keeper);
infile >> ws;
i++;
}
//check that the labels are unique
for (i = 0; i < preyindex.Size(); i++)
for (j = 0; j < preyindex.Size(); j++)
if ((strcasecmp(preyindex[i], preyindex[j]) == 0) && (i != j))
handle.logMessage(LOGFAIL, "Error in prey aggregation file - repeated label", preyindex[i]);
handle.logMessage(LOGMESSAGE, "Read prey aggregation file - number of entries", preyindex.Size());
return preyindex.Size();
}