< Summary

Information
Class: Intentum.Core.Education.EducationRules
Assembly: Intentum.Core
File(s): /home/runner/work/Intentum/Intentum/src/Intentum.Core/Education/EducationRules.cs
Line coverage
100%
Covered lines: 111
Uncovered lines: 0
Coverable lines: 111
Total lines: 138
Line coverage: 100%
Branch coverage
82%
Covered branches: 43
Total branches: 52
Branch coverage: 82.6%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Cyclomatic complexity NPath complexity Sequence coverage
StudentDropoutRisk(...)75%88100%
AcademicIntegrityViolation(...)87.5%88100%
CourseRecommendation(...)100%22100%
LearningResourceNeeds(...)100%22100%
EarlyWarning(...)62.5%88100%
InterventionRequired(...)100%88100%
GiftedStudent(...)75%88100%
CareerPathInterest(...)87.5%88100%
AllRules()100%11100%

File(s)

/home/runner/work/Intentum/Intentum/src/Intentum.Core/Education/EducationRules.cs

#LineLine coverage
 1using Intentum.Core.Behavior;
 2using Intentum.Core.Models;
 3
 4namespace Intentum.Core.Education;
 5
 6public static class EducationRules
 7{
 8    public static Func<BehaviorSpace, RuleMatch?> StudentDropoutRisk(
 39        double confidence = 0.85) => space =>
 210    {
 211        var signals = space.Events.Count(e =>
 412            e.Action.Contains("engagement.declining", StringComparison.OrdinalIgnoreCase) ||
 413            e.Action.Contains("assignment.missed", StringComparison.OrdinalIgnoreCase) ||
 414            e.Action.Contains("attendance.issue", StringComparison.OrdinalIgnoreCase) ||
 415            e.Action.Contains("grade.declining", StringComparison.OrdinalIgnoreCase));
 316
 217        if (signals >= 2)
 118            return new RuleMatch("StudentDropoutRisk", confidence,
 119                $"Risk signals: {signals}");
 120        return null;
 521    };
 22
 23    public static Func<BehaviorSpace, RuleMatch?> AcademicIntegrityViolation(
 324        double confidence = 0.9) => space =>
 225    {
 226        var signals = space.Events.Count(e =>
 427            e.Action.Contains("submission.rapid", StringComparison.OrdinalIgnoreCase) ||
 428            e.Action.Contains("submission.multiple.attempts", StringComparison.OrdinalIgnoreCase) ||
 429            e.Action.Contains("access.off.hours", StringComparison.OrdinalIgnoreCase) ||
 430            e.Action.Contains("copy.paste.excessive", StringComparison.OrdinalIgnoreCase));
 331
 232        if (signals >= 2)
 133            return new RuleMatch("AcademicIntegrityViolation", confidence,
 134                $"Integrity signals: {signals}");
 135        return null;
 536    };
 37
 38    public static Func<BehaviorSpace, RuleMatch?> CourseRecommendation(
 39        int minViews = 2,
 340        double confidence = 0.75) => space =>
 241    {
 242        var distinctCourseViews = space.Events
 343            .Where(e => e.Action.StartsWith("course.view.", StringComparison.OrdinalIgnoreCase))
 344            .Select(e => e.Action)
 245            .Distinct(StringComparer.OrdinalIgnoreCase)
 246            .Count();
 347
 248        if (distinctCourseViews >= minViews)
 149            return new RuleMatch("CourseRecommendation", confidence,
 150                $"Distinct course views: {distinctCourseViews}");
 151        return null;
 552    };
 53
 54    public static Func<BehaviorSpace, RuleMatch?> LearningResourceNeeds(
 355        double confidence = 0.8) => space =>
 256    {
 257        var signals = space.Events.Count(e =>
 558            e.Action.StartsWith("help.requested.", StringComparison.OrdinalIgnoreCase));
 359
 260        if (signals >= 2)
 161            return new RuleMatch("LearningResourceNeeds", confidence,
 162                $"Help requests: {signals}");
 163        return null;
 564    };
 65
 66    public static Func<BehaviorSpace, RuleMatch?> EarlyWarning(
 367        double confidence = 0.85) => space =>
 268    {
 269        var signals = space.Events.Count(e =>
 370            e.Action.Contains("grade.declining", StringComparison.OrdinalIgnoreCase) ||
 371            e.Action.Contains("behavioral.flag", StringComparison.OrdinalIgnoreCase) ||
 372            e.Action.Contains("performance.drop", StringComparison.OrdinalIgnoreCase) ||
 373            e.Action.Contains("teacher.concern", StringComparison.OrdinalIgnoreCase));
 374
 275        if (signals >= 1)
 176            return new RuleMatch("EarlyWarning", confidence,
 177                $"Warning signals: {signals}");
 178        return null;
 579    };
 80
 81    public static Func<BehaviorSpace, RuleMatch?> InterventionRequired(
 382        double confidence = 0.9) => space =>
 283    {
 284        var signals = space.Events.Count(e =>
 485            e.Action.Contains("intervention.declined", StringComparison.OrdinalIgnoreCase) ||
 486            e.Action.Contains("performance.sustained_low", StringComparison.OrdinalIgnoreCase) ||
 487            e.Action.Contains("support.resistant", StringComparison.OrdinalIgnoreCase) ||
 488            e.Action.Contains("progress.stagnant", StringComparison.OrdinalIgnoreCase));
 389
 290        if (signals >= 2)
 191            return new RuleMatch("InterventionRequired", confidence,
 192                $"Intervention signals: {signals}");
 193        return null;
 594    };
 95
 96    public static Func<BehaviorSpace, RuleMatch?> GiftedStudent(
 97        int minAdvancedActivities = 2,
 398        double confidence = 0.7) => space =>
 299    {
 2100        var signals = space.Events.Count(e =>
 5101            e.Action.Contains("course.advanced.completed", StringComparison.OrdinalIgnoreCase) ||
 5102            e.Action.Contains("enrichment.requested", StringComparison.OrdinalIgnoreCase) ||
 5103            e.Action.Contains("grade.exceeds", StringComparison.OrdinalIgnoreCase) ||
 5104            e.Action.Contains("acceleration.recommended", StringComparison.OrdinalIgnoreCase));
 3105
 2106        if (signals >= minAdvancedActivities)
 1107            return new RuleMatch("GiftedStudent", confidence,
 1108                $"Advanced activity signals: {signals}");
 1109        return null;
 5110    };
 111
 112    public static Func<BehaviorSpace, RuleMatch?> CareerPathInterest(
 3113        double confidence = 0.75) => space =>
 2114    {
 2115        var signals = space.Events.Count(e =>
 4116            e.Action.Contains("course.career_focused", StringComparison.OrdinalIgnoreCase) ||
 4117            e.Action.Contains("extracurricular.career", StringComparison.OrdinalIgnoreCase) ||
 4118            e.Action.Contains("internship.interested", StringComparison.OrdinalIgnoreCase) ||
 4119            e.Action.Contains("mentorship.requested", StringComparison.OrdinalIgnoreCase));
 3120
 2121        if (signals >= 2)
 1122            return new RuleMatch("CareerPathInterest", confidence,
 1123                $"Career signals: {signals}");
 1124        return null;
 5125    };
 126
 127    public static IReadOnlyList<Func<BehaviorSpace, RuleMatch?>> AllRules() =>
 1128    [
 1129        StudentDropoutRisk(),
 1130        AcademicIntegrityViolation(),
 1131        CourseRecommendation(),
 1132        LearningResourceNeeds(),
 1133        EarlyWarning(),
 1134        InterventionRequired(),
 1135        GiftedStudent(),
 1136        CareerPathInterest()
 1137    ];
 138}