public static Vector getNewUpdateValues(Vector oldUpdateValues, Vector oldGradient, Vector newGradient) {
		double lambdaPlus = 1.2;
		double lambdaMinus = 0.5;
		double min = 0.1;
		double max = 100;
		
		double[] newUpdateValues = new double[oldUpdateValues.getDimension()];
		for (int i = 0; i < newUpdateValues.length; i++) {
			double x = oldGradient.getAt(i) * newGradient.getAt(i);
			double updateValue = oldUpdateValues.getAt(i);
			
			if (x > 0)
				updateValue *= lambdaPlus;
			else if (x < 0)
				updateValue *= lambdaMinus;
			
			updateValue = clamp(Math.abs(updateValue), min, max);
			
			if (newGradient.getAt(i) > 0)
				newUpdateValues[i] = updateValue;
			else if (newGradient.getAt(i) < 0)
				newUpdateValues[i] = -updateValue;
		}
		
		return new Vector(newUpdateValues);
	}