Esempio n. 1
0
        internal int GetTopToken(int[] context)
        {
            var result = -1;

            var contextLimit = context.Length;
            var contextStart = Math.Max(0, contextLimit - _width + 1);

            var scanStart = contextStart;
            TokenPredictorDatabase leafDatabase = null;

            for (; leafDatabase == null && scanStart < contextLimit; scanStart++)
            {
                leafDatabase = _database.GetChild(context, scanStart, contextLimit - scanStart);
            }

            if (leafDatabase != null)
            {
                var tokens = leafDatabase.GetTopRanked();

                for (; 1 < tokens.Count && scanStart < contextLimit; scanStart++)
                {
                    leafDatabase = _database.GetChild(context, scanStart, contextLimit - scanStart);
                    Debug.Assert(leafDatabase != null);

                    tokens = leafDatabase.GetTopRanked(tokens);
                }

                Debug.Assert(result == -1);
                foreach (var token in tokens)
                {
                    if (result < token)
                    {
                        result = token;
                    }
                }
            }

            return(result);
        }
        internal TokenPredictorDatabase GetChild(int[] context, int index, int length)
        {
            TokenPredictorDatabase database;

            if (_children != null)
            {
                database = _children.GetChild(context, index, length);
            }
            else
            {
                database = null;
            }

            return(database);
        }