package edu.stanford.nlp.semparse.open.util;
import fig.basic.ListUtils;
/**
* VectorAverager computes the term-wise average of several vectors.
* It also computes term-wise minimum and maximum.
*/
public class VectorAverager {
final int dim;
double[] aggregate, min, max;
int count = 0;
double sumFactors = 0;
public VectorAverager(int numDimensions) {
dim = numDimensions;
aggregate = new double[dim];
}
public void add(double[] vector) {
if (vector == null) return;
count++;
sumFactors++;
if (min == null) min = vector.clone();
if (max == null) max = vector.clone();
for (int i = 0; i < dim; i++) {
aggregate[i] += vector[i];
}
}
public void add(double[] vector, double factor) {
if (vector == null) return;
count++;
sumFactors += factor;
if (min == null) min = ListUtils.mult(factor, vector);
if (max == null) max = ListUtils.mult(factor, vector);
for (int i = 0; i < dim; i++) {
aggregate[i] += vector[i] * factor;
min[i] = Math.min(min[i], vector[i] * factor);
max[i] = Math.max(max[i], vector[i] * factor);
}
}
public double[] getSum() {
return aggregate.clone();
}
/*
public double[] getAverage() {
if (count == 0) return null;
double[] answer = new double[dim];
for (int i = 0; i < dim; i++)
answer[i] = aggregate[i] / count;
return answer;
}
*/
public double[] getAverage() {
if (sumFactors < 1e-6) return null;
double[] answer = new double[dim];
for (int i = 0; i < dim; i++)
answer[i] = aggregate[i] / sumFactors;
return answer;
}
public double[] getMin() {
if (count == 0) return null;
return min.clone();
}
public double[] getMax() {
if (count == 0) return null;
return max.clone();
}
/** Term-wise largest magnitude **/
public double[] getAbsMax() {
if (count == 0) return null;
double[] absMax = new double[dim];
for (int i = 0; i < dim; i++) {
absMax[i] = Math.max(Math.abs(max[i]), Math.abs(min[i]));
}
return absMax;
}
/** Min and Max concatenated **/
public double[] getMinmax() {
if (count == 0) return null;
double[] minmax = new double[dim * 2];
System.arraycopy(min, 0, minmax, 0, dim);
System.arraycopy(max, 0, minmax, dim, dim);
return minmax;
}
}