< Summary

Information
Class: Intentum.Core.Healthcare.HealthcareRules
Assembly: Intentum.Core
File(s): /home/runner/work/Intentum/Intentum/src/Intentum.Core/Healthcare/HealthcareRules.cs
Line coverage
100%
Covered lines: 117
Uncovered lines: 0
Coverable lines: 117
Total lines: 142
Line coverage: 100%
Branch coverage
85%
Covered branches: 46
Total branches: 54
Branch coverage: 85.1%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Cyclomatic complexity NPath complexity Sequence coverage
PatientDeterioration(...)100%88100%
MedicationConflict(...)100%22100%
HospitalReadmissionRisk(...)100%44100%
SepsisAlert(...)100%88100%
FallRisk(...)87.5%88100%
AbnormalLabResult(...)62.5%88100%
TreatmentNonCompliance(...)75%88100%
EmergencyTriage(...)75%88100%
AllRules()100%11100%

File(s)

/home/runner/work/Intentum/Intentum/src/Intentum.Core/Healthcare/HealthcareRules.cs

#LineLine coverage
 1using Intentum.Core.Behavior;
 2using Intentum.Core.Models;
 3
 4namespace Intentum.Core.Healthcare;
 5
 6public static class HealthcareRules
 7{
 8    public static Func<BehaviorSpace, RuleMatch?> PatientDeterioration(
 49        double confidence = 0.9) => space =>
 310    {
 311        var vitalAlerts = space.Events.Count(e =>
 712            e.Action.Contains("vital.signs.alert", StringComparison.OrdinalIgnoreCase) ||
 713            e.Action.Contains("VitalAlert", StringComparison.OrdinalIgnoreCase));
 314        var rapidResponse = space.Events.Any(e =>
 715            e.Action.Contains("rapid.response", StringComparison.OrdinalIgnoreCase) ||
 716            e.Action.Contains("RapidResponse", StringComparison.OrdinalIgnoreCase));
 417
 318        if (vitalAlerts >= 1 && rapidResponse)
 119            return new RuleMatch("PatientDeterioration", confidence,
 120                $"Vital alerts: {vitalAlerts}, rapid response: true");
 221        if (vitalAlerts >= 2)
 122            return new RuleMatch("PatientDeterioration", confidence * 0.7,
 123                $"Multiple vital alerts: {vitalAlerts}, no rapid response");
 124        return null;
 725    };
 26
 27    public static Func<BehaviorSpace, RuleMatch?> MedicationConflict(
 328        double confidence = 0.85) => space =>
 229    {
 230        var medicationOrders = space.Events.Count(e =>
 531            e.Action.StartsWith("medication.ordered", StringComparison.OrdinalIgnoreCase));
 332
 233        if (medicationOrders >= 2)
 134            return new RuleMatch("MedicationConflict", confidence,
 135                $"Distinct medication orders: {medicationOrders}");
 136        return null;
 537    };
 38
 39    public static Func<BehaviorSpace, RuleMatch?> HospitalReadmissionRisk(
 340        double confidence = 0.8) => space =>
 241    {
 242        var discharged = space.Events.Any(e =>
 443            e.Action.Contains("discharge", StringComparison.OrdinalIgnoreCase));
 244        var symptoms = space.Events.Count(e =>
 545            e.Action.Contains("symptom.report", StringComparison.OrdinalIgnoreCase));
 246        var followUp = space.Events.Any(e =>
 547            e.Action.Contains("followup.visit", StringComparison.OrdinalIgnoreCase));
 348
 249        if (discharged && (symptoms >= 1 || followUp))
 150            return new RuleMatch("HospitalReadmissionRisk", confidence,
 151                $"Discharged: true, symptoms: {symptoms}, follow-up: {followUp}");
 152        return null;
 553    };
 54
 55    public static Func<BehaviorSpace, RuleMatch?> SepsisAlert(
 356        double confidence = 0.95) => space =>
 257    {
 258        var infectionConfirmed = space.Events.Any(e =>
 459            e.Action.Contains("infection.confirmed", StringComparison.OrdinalIgnoreCase) ||
 460            e.Action.Contains("InfectionConfirmed", StringComparison.OrdinalIgnoreCase));
 261        var abnormalVitals = space.Events.Count(e =>
 562            e.Action.Contains("vital.abnormal", StringComparison.OrdinalIgnoreCase) ||
 563            e.Action.Contains("AbnormalVital", StringComparison.OrdinalIgnoreCase));
 364
 265        if (infectionConfirmed && abnormalVitals >= 1)
 166            return new RuleMatch("SepsisAlert", confidence,
 167                $"Infection confirmed: true, abnormal vitals: {abnormalVitals}");
 168        return null;
 569    };
 70
 71    public static Func<BehaviorSpace, RuleMatch?> FallRisk(
 372        double confidence = 0.8) => space =>
 273    {
 274        var signals = space.Events.Count(e =>
 475            e.Action.Contains("mobility.issue", StringComparison.OrdinalIgnoreCase) ||
 476            e.Action.Contains("age.fall.risk", StringComparison.OrdinalIgnoreCase) ||
 477            e.Action.Contains("fall.incident", StringComparison.OrdinalIgnoreCase) ||
 478            e.Action.Contains("balance.problem", StringComparison.OrdinalIgnoreCase));
 379
 280        if (signals >= 2)
 181            return new RuleMatch("FallRisk", confidence,
 182                $"Fall risk signals: {signals}");
 183        return null;
 584    };
 85
 86    public static Func<BehaviorSpace, RuleMatch?> AbnormalLabResult(
 387        double confidence = 0.9) => space =>
 288    {
 289        var signals = space.Events.Count(e =>
 390            e.Action.Contains("lab.critical", StringComparison.OrdinalIgnoreCase) ||
 391            e.Action.Contains("lab.trend.abnormal", StringComparison.OrdinalIgnoreCase) ||
 392            e.Action.Contains("lab.result.abnormal", StringComparison.OrdinalIgnoreCase) ||
 393            e.Action.Contains("lab.panic.value", StringComparison.OrdinalIgnoreCase));
 394
 295        if (signals >= 1)
 196            return new RuleMatch("AbnormalLabResult", confidence,
 197                $"Abnormal lab signals: {signals}");
 198        return null;
 599    };
 100
 101    public static Func<BehaviorSpace, RuleMatch?> TreatmentNonCompliance(
 3102        double confidence = 0.75) => space =>
 2103    {
 2104        var signals = space.Events.Count(e =>
 4105            e.Action.Contains("appointment.missed", StringComparison.OrdinalIgnoreCase) ||
 4106            e.Action.Contains("medication.gap", StringComparison.OrdinalIgnoreCase) ||
 4107            e.Action.Contains("treatment.refused", StringComparison.OrdinalIgnoreCase) ||
 4108            e.Action.Contains("followup.missed", StringComparison.OrdinalIgnoreCase));
 3109
 2110        if (signals >= 2)
 1111            return new RuleMatch("TreatmentNonCompliance", confidence,
 1112                $"Compliance signals: {signals}");
 1113        return null;
 5114    };
 115
 116    public static Func<BehaviorSpace, RuleMatch?> EmergencyTriage(
 3117        double confidence = 0.85) => space =>
 2118    {
 2119        var signals = space.Events.Count(e =>
 4120            e.Action.Contains("symptom.severe", StringComparison.OrdinalIgnoreCase) ||
 4121            e.Action.Contains("triage.urgent", StringComparison.OrdinalIgnoreCase) ||
 4122            e.Action.Contains("wait.time.critical", StringComparison.OrdinalIgnoreCase) ||
 4123            e.Action.Contains("resource.shortage", StringComparison.OrdinalIgnoreCase));
 3124
 2125        if (signals >= 2)
 1126            return new RuleMatch("EmergencyTriage", confidence,
 1127                $"Triage signals: {signals}");
 1128        return null;
 5129    };
 130
 131    public static IReadOnlyList<Func<BehaviorSpace, RuleMatch?>> AllRules() =>
 1132    [
 1133        SepsisAlert(),
 1134        PatientDeterioration(),
 1135        MedicationConflict(),
 1136        HospitalReadmissionRisk(),
 1137        FallRisk(),
 1138        AbnormalLabResult(),
 1139        TreatmentNonCompliance(),
 1140        EmergencyTriage()
 1141    ];
 142}