|  | @@ -132,7 +132,7 @@ public final class PanamaESVectorUtilSupport implements ESVectorUtilSupport {
 | 
	
		
			
				|  |  |                  FloatVector centeredVec = v.sub(c);
 | 
	
		
			
				|  |  |                  FloatVector deltaVec = centeredVec.sub(vecMeanVec);
 | 
	
		
			
				|  |  |                  norm2Vec = fma(centeredVec, centeredVec, norm2Vec);
 | 
	
		
			
				|  |  | -                vecMeanVec = vecMeanVec.add(deltaVec.div(count));
 | 
	
		
			
				|  |  | +                vecMeanVec = vecMeanVec.add(deltaVec.mul(1f / count));
 | 
	
		
			
				|  |  |                  FloatVector delta2Vec = centeredVec.sub(vecMeanVec);
 | 
	
		
			
				|  |  |                  m2Vec = fma(deltaVec, delta2Vec, m2Vec);
 | 
	
		
			
				|  |  |                  minVec = minVec.min(centeredVec);
 | 
	
	
		
			
				|  | @@ -214,7 +214,7 @@ public final class PanamaESVectorUtilSupport implements ESVectorUtilSupport {
 | 
	
		
			
				|  |  |                  FloatVector centeredVec = v.sub(c);
 | 
	
		
			
				|  |  |                  FloatVector deltaVec = centeredVec.sub(vecMeanVec);
 | 
	
		
			
				|  |  |                  norm2Vec = fma(centeredVec, centeredVec, norm2Vec);
 | 
	
		
			
				|  |  | -                vecMeanVec = vecMeanVec.add(deltaVec.div(count));
 | 
	
		
			
				|  |  | +                vecMeanVec = vecMeanVec.add(deltaVec.mul(1f / count));
 | 
	
		
			
				|  |  |                  FloatVector delta2Vec = centeredVec.sub(vecMeanVec);
 | 
	
		
			
				|  |  |                  m2Vec = fma(deltaVec, delta2Vec, m2Vec);
 | 
	
		
			
				|  |  |                  minVec = minVec.min(centeredVec);
 | 
	
	
		
			
				|  | @@ -278,6 +278,7 @@ public final class PanamaESVectorUtilSupport implements ESVectorUtilSupport {
 | 
	
		
			
				|  |  |          float dbb = 0;
 | 
	
		
			
				|  |  |          float dax = 0;
 | 
	
		
			
				|  |  |          float dbx = 0;
 | 
	
		
			
				|  |  | +        float invPmOnes = 1f / (points - 1f);
 | 
	
		
			
				|  |  |          // if the array size is large (> 2x platform vector size), it's worth the overhead to vectorize
 | 
	
		
			
				|  |  |          if (target.length > 2 * FLOAT_SPECIES.length()) {
 | 
	
		
			
				|  |  |              FloatVector daaVec = FloatVector.zero(FLOAT_SPECIES);
 | 
	
	
		
			
				|  | @@ -286,11 +287,11 @@ public final class PanamaESVectorUtilSupport implements ESVectorUtilSupport {
 | 
	
		
			
				|  |  |              FloatVector daxVec = FloatVector.zero(FLOAT_SPECIES);
 | 
	
		
			
				|  |  |              FloatVector dbxVec = FloatVector.zero(FLOAT_SPECIES);
 | 
	
		
			
				|  |  |              FloatVector ones = FloatVector.broadcast(FLOAT_SPECIES, 1f);
 | 
	
		
			
				|  |  | -            FloatVector pmOnes = FloatVector.broadcast(FLOAT_SPECIES, points - 1f);
 | 
	
		
			
				|  |  | +            FloatVector invPmOnesVec = FloatVector.broadcast(FLOAT_SPECIES, invPmOnes);
 | 
	
		
			
				|  |  |              for (; i < FLOAT_SPECIES.loopBound(target.length); i += FLOAT_SPECIES.length()) {
 | 
	
		
			
				|  |  |                  FloatVector v = FloatVector.fromArray(FLOAT_SPECIES, target, i);
 | 
	
		
			
				|  |  |                  FloatVector oVec = IntVector.fromArray(INTEGER_SPECIES, quantize, i).convert(VectorOperators.I2F, 0).reinterpretAsFloats();
 | 
	
		
			
				|  |  | -                FloatVector sVec = oVec.div(pmOnes);
 | 
	
		
			
				|  |  | +                FloatVector sVec = oVec.mul(invPmOnesVec);
 | 
	
		
			
				|  |  |                  FloatVector smVec = ones.sub(sVec);
 | 
	
		
			
				|  |  |                  daaVec = fma(smVec, smVec, daaVec);
 | 
	
		
			
				|  |  |                  dabVec = fma(smVec, sVec, dabVec);
 | 
	
	
		
			
				|  | @@ -307,7 +308,7 @@ public final class PanamaESVectorUtilSupport implements ESVectorUtilSupport {
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          for (; i < target.length; i++) {
 | 
	
		
			
				|  |  |              float k = quantize[i];
 | 
	
		
			
				|  |  | -            float s = k / (points - 1);
 | 
	
		
			
				|  |  | +            float s = k * invPmOnes;
 | 
	
		
			
				|  |  |              float ms = 1f - s;
 | 
	
		
			
				|  |  |              daa = fma(ms, ms, daa);
 | 
	
		
			
				|  |  |              dab = fma(ms, s, dab);
 | 
	
	
		
			
				|  | @@ -798,25 +799,26 @@ public final class PanamaESVectorUtilSupport implements ESVectorUtilSupport {
 | 
	
		
			
				|  |  |      @Override
 | 
	
		
			
				|  |  |      public int quantizeVectorWithIntervals(float[] vector, int[] destination, float lowInterval, float upperInterval, byte bits) {
 | 
	
		
			
				|  |  |          float nSteps = ((1 << bits) - 1);
 | 
	
		
			
				|  |  | -        float step = (upperInterval - lowInterval) / nSteps;
 | 
	
		
			
				|  |  | +        float invStep = nSteps / (upperInterval - lowInterval);
 | 
	
		
			
				|  |  |          int sumQuery = 0;
 | 
	
		
			
				|  |  |          int i = 0;
 | 
	
		
			
				|  |  |          if (vector.length > 2 * FLOAT_SPECIES.length()) {
 | 
	
		
			
				|  |  |              int limit = FLOAT_SPECIES.loopBound(vector.length);
 | 
	
		
			
				|  |  |              FloatVector lowVec = FloatVector.broadcast(FLOAT_SPECIES, lowInterval);
 | 
	
		
			
				|  |  |              FloatVector upperVec = FloatVector.broadcast(FLOAT_SPECIES, upperInterval);
 | 
	
		
			
				|  |  | -            FloatVector stepVec = FloatVector.broadcast(FLOAT_SPECIES, step);
 | 
	
		
			
				|  |  | +            FloatVector invStepVec = FloatVector.broadcast(FLOAT_SPECIES, invStep);
 | 
	
		
			
				|  |  |              for (; i < limit; i += FLOAT_SPECIES.length()) {
 | 
	
		
			
				|  |  |                  FloatVector v = FloatVector.fromArray(FLOAT_SPECIES, vector, i);
 | 
	
		
			
				|  |  |                  FloatVector xi = v.max(lowVec).min(upperVec); // clamp
 | 
	
		
			
				|  |  | -                IntVector assignment = xi.sub(lowVec).div(stepVec).add(0.5f).convert(VectorOperators.F2I, 0).reinterpretAsInts(); // round
 | 
	
		
			
				|  |  | +                // round
 | 
	
		
			
				|  |  | +                IntVector assignment = xi.sub(lowVec).mul(invStepVec).add(0.5f).convert(VectorOperators.F2I, 0).reinterpretAsInts();
 | 
	
		
			
				|  |  |                  sumQuery += assignment.reduceLanes(ADD);
 | 
	
		
			
				|  |  |                  assignment.intoArray(destination, i);
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |          for (; i < vector.length; i++) {
 | 
	
		
			
				|  |  |              float xi = Math.min(Math.max(vector[i], lowInterval), upperInterval);
 | 
	
		
			
				|  |  | -            int assignment = Math.round((xi - lowInterval) / step);
 | 
	
		
			
				|  |  | +            int assignment = Math.round((xi - lowInterval) * invStep);
 | 
	
		
			
				|  |  |              sumQuery += assignment;
 | 
	
		
			
				|  |  |              destination[i] = assignment;
 | 
	
		
			
				|  |  |          }
 |