< Summary

Information
Class: Intentum.Clustering.IntentClusterer
Assembly: Intentum.Clustering
File(s): /home/runner/work/Intentum/Intentum/src/Intentum.Clustering/IntentClusterer.cs
Line coverage
97%
Covered lines: 48
Uncovered lines: 1
Coverable lines: 49
Total lines: 75
Line coverage: 97.9%
Branch coverage
66%
Covered branches: 12
Total branches: 18
Branch coverage: 66.6%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Cyclomatic complexity NPath complexity Sequence coverage
ClusterByPatternAsync(...)100%11100%
ClusterByConfidenceScoreAsync(...)66.66%181896.42%

File(s)

/home/runner/work/Intentum/Intentum/src/Intentum.Clustering/IntentClusterer.cs

#LineLine coverage
 1using Intentum.Persistence.Repositories;
 2
 3namespace Intentum.Clustering;
 4
 5/// <summary>
 6/// Default implementation of intent clustering using pattern-based and score-based grouping.
 7/// </summary>
 8public sealed class IntentClusterer : IIntentClusterer
 9{
 10    /// <inheritdoc />
 11    public Task<IReadOnlyList<IntentCluster>> ClusterByPatternAsync(
 12        IReadOnlyList<IntentHistoryRecord> records,
 13        CancellationToken cancellationToken = default)
 314    {
 315        cancellationToken.ThrowIfCancellationRequested();
 16
 317        var groups = records
 518            .GroupBy(r => (r.ConfidenceLevel, r.Decision))
 319            .Select(g =>
 320            {
 321                var list = g.ToList();
 822                var ids = list.Select(x => x.Id).ToList();
 823                var scores = list.Select(x => x.ConfidenceScore).ToList();
 324                var avg = scores.Average();
 325                var min = scores.Min();
 326                var max = scores.Max();
 327                var id = $"{g.Key.ConfidenceLevel}_{g.Key.Decision}";
 328                var label = $"{g.Key.ConfidenceLevel} / {g.Key.Decision}";
 329                var summary = new ClusterSummary(avg, min, max);
 330                return new IntentCluster(id, label, ids, list.Count, summary);
 331            })
 232            .OrderByDescending(c => c.Count)
 333            .ToList();
 34
 335        return Task.FromResult<IReadOnlyList<IntentCluster>>(groups);
 336    }
 37
 38    /// <inheritdoc />
 39    public Task<IReadOnlyList<IntentCluster>> ClusterByConfidenceScoreAsync(
 40        IReadOnlyList<IntentHistoryRecord> records,
 41        int k = 3,
 42        CancellationToken cancellationToken = default)
 143    {
 144        cancellationToken.ThrowIfCancellationRequested();
 45
 146        if (k < 1) k = 1;
 147        var list = records.ToList();
 148        if (list.Count == 0)
 049            return Task.FromResult<IReadOnlyList<IntentCluster>>([]);
 50
 751        var scores = list.Select(r => r.ConfidenceScore).OrderBy(s => s).ToList();
 152        var minScore = scores[0];
 153        var maxScore = scores[^1];
 154        var range = maxScore - minScore;
 155        var bucketWidth = range <= 0 ? 1.0 : range / k;
 56
 157        var clusters = new List<IntentCluster>();
 858        for (var i = 0; i < k; i++)
 359        {
 360            var low = minScore + i * bucketWidth;
 361            var high = i == k - 1 ? maxScore + 0.001 : minScore + (i + 1) * bucketWidth;
 1262            var inBucket = list.Where(r => r.ConfidenceScore >= low && r.ConfidenceScore < high).ToList();
 663            var ids = inBucket.Select(x => x.Id).ToList();
 664            var bucketScores = inBucket.Select(x => x.ConfidenceScore).ToList();
 365            var avg = bucketScores.Count > 0 ? bucketScores.Average() : 0;
 366            var min = bucketScores.Count > 0 ? bucketScores.Min() : 0;
 367            var max = bucketScores.Count > 0 ? bucketScores.Max() : 0;
 368            var clusterId = $"ScoreBucket_{i}";
 369            var label = $"[{low:F2}, {high:F2})";
 370            clusters.Add(new IntentCluster(clusterId, label, ids, inBucket.Count, new ClusterSummary(avg, min, max)));
 371        }
 72
 173        return Task.FromResult<IReadOnlyList<IntentCluster>>(clusters);
 174    }
 75}