Présentation interactive de l'algorithme d'orientation Covid-19



Définition des orientations possibles

;; L'algorithme défini dans la documentation contient huit message
;; d'orientation possibles
(def orientations
  {:less_15
   "Cette application n’est pas faite pour les personnes de moins de 15 ans. Prenez contact avec votre médecin généraliste au moindre doute. En cas d’urgence, appelez le 15."
   :consultation_surveillance_1
   "Votre situation peut relever d’un COVID 19. Demandez une téléconsultation ou un médecin généraliste ou une visite à domicile. Appelez le 15 si une gêne respiratoire ou des difficultés importantes pour vous alimenter ou boire apparaissent pendant plus de 24 heures. En attendant et pour casser les chaînes de transmission, nous vous conseillons de vous isoler et de respecter les gestes barrières pour protéger vos proches."
   :consultation_surveillance_2
   "Votre situation peut relever d’un COVID 19. Demandez une téléconsultation ou un médecin généraliste ou une visite à domicile. Si vous n'arrivez pas à obtenir de consultation, appelez le 15. En attendant et pour casser les chaînes de transmission, nous vous conseillons de vous isoler et de respecter les gestes barrières pour protéger vos proches."
   :SAMU "Appelez le 15."
   :consultation_surveillance_3
   "Votre situation peut relever d’un COVID 19. Demandez une téléconsultation ou un médecin généraliste ou une visite à domicile (SOS médecins, etc.) En attendant et pour casser les chaînes de transmission, nous vous conseillons de vous isoler et de respecter les gestes barrières pour protéger vos proches."
   :consultation_surveillance_4
   "Votre situation peut relever d’un COVID 19. Un avis médical est recommandé. Au moindre doute, appelez le 15. Nous vous conseillons de rester à votre domicile. En attendant et pour casser les chaînes de transmission, nous vous conseillons de vous isoler et de respecter les gestes barrières pour protéger vos proches."
   :surveillance
   "Votre situation ne relève probablement pas du COVID 19. N’hésitez pas à contacter votre médecin en cas de doute. Vous pouvez refaire le test en cas de nouveau symptôme pour réévaluer la situation. Pour toute information concernant le COVID 19, composer le 0 800 130 000."})

Fonctions de prétraitement

;; Fonction de calcul de l'indice de masse corporelle
(defn compute-bmi [weight height]
  (/ weight (Math/pow (/ height 100.0) 2)))

;; Fonction pour réduire l'âge à la tranche d'âge
(defn get-age-range [reponse]
  (cond (< (:age reponse) 15) "inf_15"
        (< (:age reponse) 50) "from_15_to_49"
        (< (:age reponse) 70) "from_50_to_64"
        :else                 "sup_65"))

;; Fonction pour mettre le bmi, age-range dans la réponse, et
;; incrémenter les facteurs pronostiques ou de gravité
(defn preprocess-scores [reponse]
  (let [bmi-val   (compute-bmi (:weight reponse)
                               (:height reponse))
        age-range (get-age-range reponse)
        reponse   (merge reponse {:bmi bmi-val})
        reponse   (merge reponse {:age-range age-range})
        reponse   (update-in reponse [:pronostic-factors]
                             #(if (= (:age-range reponse) "sup_65") (inc %) %))
        reponse   (update-in reponse [:pronostic-factors]
                             #(if (>= bmi-val 30) (inc %) %))
        reponse   (dissoc reponse :weight :height :age)]
    ;; Renvoie la réponse remise en forme:
    reponse))

Fonction de calcul du résultat

;; Fonction pour calculer l'orientation en fonction de la réponse
(defn orientation [reponse]
  ;; Initialisation des valeurs d'entrées
  (let [reponse
        (preprocess-scores reponse)
        {:keys [bmi age-range agueusia_anosmia
                fever diarrhea cough sore_throat_aches
                minor-severity-factors
                major-severity-factors
                pronostic-factors]} reponse
        {:keys
         [less_15
          consultation_surveillance_1
          consultation_surveillance_2
          SAMU
          consultation_surveillance_3
          consultation_surveillance_4
          surveillance]}            orientations]
    ;; L'algorithme COVID19 proprement dit
    (cond
      ;; Branche 1
      (= age-range "inf_15")
      (do (println "Branch 1: less than 15 years")
          less_15)
      ;; Branche 2
      (>= major-severity-factors 1)
      (do (println "Branch 2: at least one major gravity factor")
          SAMU)
      ;; Branche 3
      (and fever cough)
      (do (println "Branch 3: fever and cough")
          (cond (= pronostic-factors 0)
                consultation_surveillance_3
                (>= pronostic-factors 1)
                (if (< minor-severity-factors 2)
                  consultation_surveillance_4
                  consultation_surveillance_2)))
      ;; Branche 4
      (or fever
          diarrhea
          (and cough sore_throat_aches)
          (and cough agueusia_anosmia)
          (and sore_throat_aches agueusia_anosmia))
      (do (println "Branch 4: fever and other symptoms")
          (cond (= pronostic-factors 0)
                (if (= minor-severity-factors 0)
                  (if (= age-range "from_15_to_49")
                    consultation_surveillance_3
                    consultation_surveillance_1)
                  consultation_surveillance_1)
                (>= pronostic-factors 1)
                (if (< minor-severity-factors 2)
                  consultation_surveillance_1
                  consultation_surveillance_2)))
      ;; Branche 5
      (or (and cough (not sore_throat_aches) (not agueusia_anosmia))
          (and (not cough) sore_throat_aches (not agueusia_anosmia))
          (and (not cough) (not sore_throat_aches) agueusia_anosmia))
      (do (println "Branch 5: no fever and one other symptom")
          (if (= pronostic-factors 0)
            consultation_surveillance_3
            consultation_surveillance_4))
      ;; Branche 6
      (and (not cough)
           (not sore_throat_aches)
           (not agueusia_anosmia))
      (do (println "Branche 6: no symptom")
          surveillance))))

Exemple de réponse

;; Vous pouvez modifier les valeurs ci-dessous.
(def exemple-de-reponse
  {:fever                  true  ; Dépend de la température
   :diarrhea               false ; Idem
   :cough                  true  ; Idem
   :sore_throat_aches      false ; Idem
   :agueusia_anosmia       false ; Idem
   :age                    62    ; Valeur normale
   :weight                 63    ; En kgs
   :height                 167   ; En centimètres
   :pronostic-factors      0     ; Voir première série de questions
   :minor-severity-factors 0     ; Fièvre >= 39°C ou alitement >= 50% temps diurne
   :major-severity-factors 0     ; Gêne respiratoire ou difficulté manger/boire
   })

Orientation calculée à partir de cette réponse

Changez l'exemple de réponse ci-dessus et voyez le résultat.

(orientation exemple-de-reponse)