package extractors.hog;

/**
 * This class provides an implementation for the {@link NormalizationMethod} interface realizing the
 * L2-Normalization.
 * 
 */
public class L2Normalization implements NormalizationMethod {

	// parameter
	private double epsilon;

	/**
	 * Constructs a {@link L2Normalization} object with the specified epsilon as parameter.
	 * 
	 * @param epsilon
	 */
	public L2Normalization(double epsilon) {
		this.epsilon = epsilon;
	}

	@Override
	public void normalize(double[] values) {
		double sumOfSquares = 0.0;
		for (int i = 0; i < values.length; i++) {
			sumOfSquares += values[i] * values[i];
		}
		double normalizationFactor = 1.0 / Math.sqrt(sumOfSquares + epsilon * epsilon);
		for (int i = 0; i < values.length; i++) {
			values[i] *= normalizationFactor;
		}
	}

	@Override
	public String toString() {
		return "L2_e" + (int) epsilon;
	}
}
