using System;

namespace ZeroLevel.HNSW.Services
{
    internal sealed class ProbabilityLayerNumberGenerator
    {
        private readonly float[] _probabilities;

        internal ProbabilityLayerNumberGenerator(int maxLayers, int M)
        {
            _probabilities = new float[maxLayers];
            var m_L = 1.0f / Math.Log(M);
            for (int i = 0; i < maxLayers; i++)
            {
                _probabilities[i] = (float)(Math.Exp(-i / m_L) * (1 - Math.Exp(-1 / m_L)));
            }
        }

        internal int GetRandomLayer()
        {
            var probability = DefaultRandomGenerator.Instance.NextFloat();
            for (int i = 0; i < _probabilities.Length; i++)
            {
                if (probability > _probabilities[i])
                    return i;
            }
            return 0;
        }
    }
}
