< Summary

Information
Class: Intentum.Core.Pipeline.RuleBasedInferenceStep
Assembly: Intentum.Core
File(s): /home/runner/work/Intentum/Intentum/src/Intentum.Core/Pipeline/RuleBasedInferenceStep.cs
Line coverage
100%
Covered lines: 28
Uncovered lines: 0
Coverable lines: 28
Total lines: 54
Line coverage: 100%
Branch coverage
100%
Covered branches: 4
Total branches: 4
Branch coverage: 100%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Cyclomatic complexity NPath complexity Sequence coverage
.ctor(...)100%11100%
Infer(...)100%44100%

File(s)

/home/runner/work/Intentum/Intentum/src/Intentum.Core/Pipeline/RuleBasedInferenceStep.cs

#LineLine coverage
 1using Intentum.Core.Behavior;
 2using Intentum.Core.Intents;
 3using Intentum.Core.Models;
 4
 5namespace Intentum.Core.Pipeline;
 6
 7/// <summary>
 8/// Rule-based inference step: evaluates rules against behavior space and vector; returns raw result (name, score, signa
 9/// Used by IntentResolutionPipeline; also used by RuleBasedIntentModel internally.
 10/// </summary>
 11public sealed class RuleBasedInferenceStep : IIntentInferenceStep
 12{
 13    private readonly IReadOnlyList<Func<BehaviorSpace, RuleMatch?>> _rules;
 14
 15    /// <summary>
 16    /// Creates a rule-based inference step with the given rules. First matching rule wins.
 17    /// </summary>
 818    public RuleBasedInferenceStep(IEnumerable<Func<BehaviorSpace, RuleMatch?>> rules)
 819    {
 820        _rules = rules.ToList();
 821    }
 22
 23    /// <inheritdoc />
 24    public IntentInferenceResult Infer(BehaviorSpace behaviorSpace, BehaviorVector vector)
 825    {
 3326        foreach (var rule in _rules)
 827        {
 828            var match = rule(behaviorSpace);
 829            if (match == null)
 130                continue;
 31
 732            var score = Math.Clamp(match.Score, 0, 1);
 733            var signals = vector.Dimensions.Select(d =>
 1734                new IntentSignal("rule", d.Key, d.Value)).ToList();
 35
 736            return new IntentInferenceResult(
 737                Name: match.Name,
 738                Score: score,
 739                Signals: signals,
 740                Reasoning: match.Reasoning
 741            );
 42        }
 43
 144        var unknownSignals = vector.Dimensions.Select(d =>
 245            new IntentSignal("rule", d.Key, d.Value)).ToList();
 46
 147        return new IntentInferenceResult(
 148            Name: "Unknown",
 149            Score: 0,
 150            Signals: unknownSignals,
 151            Reasoning: "No rule matched"
 152        );
 853    }
 54}