/// <summary>
        /// The Previous.
        /// </summary>
        /// <param name="offsetBase">The offsetBase<see cref="int"/>.</param>
        /// <param name="offsetFactor">The offsetFactor<see cref="int"/>.</param>
        /// <param name="indexOffset">The indexOffset<see cref="int"/>.</param>
        /// <param name="x">The x<see cref="int"/>.</param>
        /// <returns>The <see cref="int"/>.</returns>
        public override int Previous(int offsetBase, int offsetFactor, int indexOffset, int x)
        {
            if (max != NULL_KEY && x > max)
            {
                return(max);
            }

            BaseSpectrum scopesItem;
            int          x_highest = highest(x);
            int          scopesKey;

            scopesKey = offsetBase + (indexOffset * parentSqrt) + x_highest;

            int minimumLow = NULL_KEY;

            if (scopes.TryGet(scopesKey, out scopesItem))
            {
                minimumLow = scopesItem.IndexMin;
            }

            if (minimumLow != NULL_KEY && lowest(x) > minimumLow)
            {
                int _offset = scopesItem.Previous(offsetBase + (offsetFactor * parentSqrt),
                                                  (offsetFactor * parentSqrt),
                                                  (indexOffset * parentSqrt) + x_highest,
                                                  lowest(x));
                return(index(x_highest, _offset));
            }

            if (sigmaNode == null)
            {
                return(NULL_KEY);
            }

            //======================//
            //from sigmaNode part
            //======================//
            int predecessorCluster = sigmaNode.Previous(x_highest);

            if (predecessorCluster == NULL_KEY)
            {
                if (min != NULL_KEY && x > min)
                {
                    return(min);
                }

                return(NULL_KEY);
            }
            scopesKey = offsetBase + (indexOffset * parentSqrt) + predecessorCluster;

            scopes.TryGet(scopesKey, out scopesItem);
            int offset = scopesItem.IndexMax;

            return(index(predecessorCluster, offset));
        }