Example #1
0
        private static int[] BasenameMatch(string subject, string subject_lw, StringScorerQuery preparedQuery, string pathSeparator)
        {
            var end = subject.Length - 1;

            while (subject[end] == Convert.ToChar(pathSeparator))
            {
                end--;
            }

            var basePos = subject.LastIndexOf(pathSeparator, end);

            if (basePos == -1)
            {
                return(new int[0]);
            }

            var depth = preparedQuery.Depth;

            while (depth-- > 0)
            {
                basePos = subject.LastIndexOf(pathSeparator, basePos - 1);
                if (basePos == -1)
                {
                    return(new int[0]);
                }
            }

            basePos++;
            end++;

            return(ComputeMatch(subject.Slice(basePos, end), subject_lw.Slice(basePos, end), preparedQuery, basePos));
        }
Example #2
0
 private double ComputeScore(string subject, string subjectLw, StringScorerQuery optionsPreparedQuery)
 {
     return(Scorer.ComputeScore(subject, subjectLw, optionsPreparedQuery));
 }
Example #3
0
        private static int[] ComputeMatch(string subject, string subject_lw, StringScorerQuery preparedQuery, int offset = 0)
        {
            var query      = preparedQuery.Query;
            var query_lw   = preparedQuery.QueryLw;
            var m          = subject.Length;
            var n          = query.Length;
            var acro_score = AcronymResult.ScoreAcronyms(subject, subject_lw, query, query_lw).Score;

            var score_row = new double[n];
            var csc_row   = new double[n];

            var trace = new double[m * n];
            var pos   = -1;
            var j     = -1;

            while (++j < n)
            {
                score_row[j] = 0;
                csc_row[j]   = 0;
            }

            var   i    = -1;
            Moves?move = null;

            while (++i < m)
            {
                var score    = 0.0;
                var score_up = 0.0;
                var csc_diag = 0.0;
                var si_lw    = subject_lw[i];

                j = -1;

                while (++j < n)
                {
                    var csc_score  = 0.0;
                    var align      = 0.0;
                    var score_diag = score_up;

                    if (query_lw[j] == si_lw)
                    {
                        var start = ScorerUtil.IsWordStart(i, subject, subject_lw);
                        csc_score = csc_diag > 0 ? csc_diag : Scorer.ScoreConsecutives(subject, subject_lw, query, query_lw, i, j, start);
                        align     = score_diag + Scorer.ScoreCharacter(i, j, start, acro_score, csc_score);
                    }

                    score_up = score_row[j];
                    csc_diag = csc_row[j];

                    if (score > score_up)
                    {
                        move = Moves.LEFT;
                    }
                    else
                    {
                        score = score_up;
                        move  = Moves.UP;
                    }

                    if (align > score)
                    {
                        score = align;
                        move  = Moves.DIAGONAL;
                    }
                    else
                    {
                        csc_score = 0;
                    }

                    score_row[j] = score;
                    csc_row[j]   = csc_score;
                    trace[++pos] = score > 0 ? (int)move.Value : (int)Moves.STOP;
                }
            }

            i   = m - 1;
            j   = n - 1;
            pos = i * n + j;

            var backtrack = true;
            var matches   = new List <int>();

            while (backtrack && i >= 0 && j >= 0)
            {
                switch ((Moves)trace[pos])
                {
                case Moves.UP:
                    i--;
                    pos -= n;
                    break;

                case Moves.LEFT:
                    j--;
                    pos--;
                    break;

                case Moves.DIAGONAL:
                    matches.Add(i + offset);
                    j--;
                    i--;
                    pos -= n + 1;
                    break;

                default:
                    backtrack = false;
                    break;
                }
            }

            matches.Reverse();

            return(matches.ToArray());
        }
Example #4
0
        public static double ComputeScore(string subject, string subjectLw, StringScorerQuery preparedQuery)
        {
            var query   = preparedQuery.Query;
            var queryLw = preparedQuery.QueryLw;

            var score = 0.0;
            var m     = subject.Length;
            var n     = query.Length;

            var acro      = AcronymResult.ScoreAcronyms(subject, subjectLw, query, queryLw);
            var acroScore = acro.Score;

            if (acro.Count == n)
            {
                return(Scorer.ScoreExact(n, m, acroScore, acro.Pos));
            }

            var pos = subjectLw.IndexOf(queryLw);

            if (pos > -1)
            {
                return(ScoreExactMatch(subject, subjectLw, query, queryLw, pos, n, m));
            }

            var scoreRow = new double[n];
            var cscRow   = new double[n];
            var sz       = Scorer.ScoreSize(n, m);

            var missBudget       = Math.Ceiling(CONST_MISS_COEFF * n) + 5;
            var missLeft         = missBudget;
            var cscShouldRebuild = true;

            var j = -1;

            while (++j < n)
            {
                scoreRow[j] = 0;
                cscRow[j]   = 0;
            }

            var i = -1;

            while (++i < m)
            {
                var siLW = subjectLw[i];

                if (!preparedQuery.CharCodes.Contains(siLW))
                {
                    if (cscShouldRebuild)
                    {
                        j = -1;
                        while (++j < n)
                        {
                            cscRow[j] = 0;
                        }

                        cscShouldRebuild = false;
                    }
                    continue;
                }

                score = 0.0;
                var scoreDiag  = 0.0;
                var cscDiag    = 0.0;
                var recordMiss = true;
                cscShouldRebuild = true;

                j = -1;
                while (++j < n)
                {
                    var scoreUp = scoreRow[j];
                    if (scoreUp > score)
                    {
                        score = scoreUp;
                    }

                    var cscScore = 0.0;

                    if (queryLw[j] == siLW)
                    {
                        var start = ScorerUtil.IsWordStart(i, subject, subjectLw);

                        if (cscDiag > 0)
                        {
                            cscScore = cscDiag;
                        }
                        else
                        {
                            cscScore = Scorer.ScoreConsecutives(subject, subjectLw, query, queryLw, i, j, start);
                        }

                        var align = scoreDiag + Scorer.ScoreCharacter(i, j, start, acroScore, cscScore);

                        if (align > score)
                        {
                            score    = align;
                            missLeft = missBudget;
                        }
                        else
                        {
                            if (recordMiss && --missLeft <= 0)
                            {
                                return(Math.Max(score, scoreRow[n - 1]) * sz);
                            }
                            else
                            {
                                recordMiss = false;
                            }
                        }
                    }

                    scoreDiag   = scoreUp;
                    cscDiag     = cscRow[j];
                    cscRow[j]   = cscScore;
                    scoreRow[j] = score;
                }
            }

            score = scoreRow[n - 1];

            return(score * sz);
        }