#include "popinfovector.h"
#include "popinfoindexvector.h"
#include "conversionindex.h"
#include "mathfunc.h"
#include "popinfo.h"
#include "errorhandler.h"
#include "gadget.h"
#include "global.h"
void PopInfoVector::Sum(const PopInfoVector* const Number, const ConversionIndex& CI) {
int i;
for (i = 0; i < size; i++)
v[i].setToZero();
for (i = CI.minLength(); i < CI.maxLength(); i++)
v[CI.getPos(i)] += (*Number)[i];
}
void PopInfoIndexVector::Add(const PopInfoIndexVector& Addition,
const ConversionIndex& CI, double ratio) {
if (isZero(ratio))
return;
PopInfo pop;
int l, minl, maxl;
if (CI.isSameDl()) {
int offset = CI.getOffset();
minl = max(this->minCol(), Addition.minCol() + offset);
maxl = min(this->maxCol(), Addition.maxCol() + offset);
for (l = minl; l < maxl; l++) {
pop = Addition[l - offset];
pop *= ratio;
v[l] += pop;
}
} else {
if (CI.isFiner()) {
minl = max(this->minCol(), CI.minPos(Addition.minCol()));
maxl = min(this->maxCol(), CI.maxPos(Addition.maxCol() - 1) + 1);
for (l = minl; l < maxl; l++) {
pop = Addition[CI.getPos(l)];
pop *= ratio;
v[l] += pop;
v[l].N /= CI.getNumPos(l); //JMB CI.getNumPos() should never be zero
}
} else {
minl = max(CI.minPos(this->minCol()), Addition.minCol());
maxl = min(CI.maxPos(this->maxCol() - 1) + 1, Addition.maxCol());
for (l = minl; l < maxl; l++) {
pop = Addition[l];
pop *= ratio;
v[CI.getPos(l)] += pop;
}
}
}
}
void PopInfoIndexVector::Add(const PopInfoIndexVector& Addition,
const ConversionIndex& CI, const DoubleVector& Ratio, double ratio) {
if (isZero(ratio))
return;
PopInfo pop;
int l, minl, maxl;
if (CI.isSameDl()) {
int offset = CI.getOffset();
minl = max(this->minCol(), Addition.minCol() + offset);
maxl = min(this->maxCol(), Addition.maxCol() + offset);
if (maxl > Ratio.Size() + offset)
maxl = Ratio.Size() + offset;
for (l = minl; l < maxl; l++) {
pop = Addition[l - offset];
pop *= (ratio * Ratio[l - offset]);
v[l] += pop;
}
} else {
if (CI.isFiner()) {
minl = max(this->minCol(), CI.minPos(Addition.minCol()));
maxl = min(this->maxCol(), CI.maxPos(Addition.maxCol() - 1) + 1);
for (l = minl; l < maxl; l++) {
pop = Addition[CI.getPos(l)];
pop *= (ratio * Ratio[CI.getPos(l)]);
v[l] += pop;
v[l].N /= CI.getNumPos(l); //JMB CI.getNumPos() should never be zero
}
} else {
minl = max(CI.minPos(this->minCol()), Addition.minCol());
maxl = min(CI.maxPos(this->maxCol() - 1) + 1, Addition.maxCol());
if (maxl > Ratio.Size())
maxl = Ratio.Size();
for (l = minl; l < maxl; l++) {
pop = Addition[l];
pop *= (ratio * Ratio[l]);
v[CI.getPos(l)] += pop;
}
}
}
}