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)); }
private double ComputeScore(string subject, string subjectLw, StringScorerQuery optionsPreparedQuery) { return(Scorer.ComputeScore(subject, subjectLw, optionsPreparedQuery)); }
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()); }
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); }