08 · Exemples des cas d’usage
Scripts recopiés des cas d’usage livrés
Orléans Flood Crisis — une zone de danger qui suit la Loire
Le pont George-V Generates le potentiel Loire flooding. Sa règle lit le capteur de niveau d’eau fixé sur le pont : à partir de 1,50 m la zone est active, centrée sur le capteur, avec un rayon de 50 m par mètre d’eau ; en dessous, elle est gelée et réduite.
George-V bridge –Generates→ Loire floodingexistence conditionNode sensor = $source <-[Fixed_Onto]- ("Loire water level - Orleans");
if(sensor.currentValue >= 1.5) {
Float radius = sensor.currentValue * 50;
$target.active();
$target.getGeoloc().setRadius(radius);
$target.getGeoloc().setPosition(sensor.getGeoloc().getPosition());
} else {
$target.freeze();
$target.getGeoloc().setRadius(0);
$target.getGeoloc().setPosition(null);
}
Le pont est Is_Susceptible_To cette zone, et cette condition génère le risque George-V bridge flood risk, qu’elle nomme : aucune arête ne relie la zone au risque. À partir de 2,50 m, les règles CEP du capteur écrivent sa probabilité par paliers : 0,2 à 2,50 m, 0,5 à 3,50 m, 0,8 à 4,00 m et 1 à 4,50 m. Sous 2,50 m aucun seuil CEP n’est jamais franchi : 2L fixe donc le palier bas, le risque est actif à 0,05 dès que la zone l’est.
George-V bridge –Is_Susceptible_To→ Loire floodingsusceptibility conditionNode risk = findNodeInstance("Risk", "George-V bridge flood risk");
Node zone = $target;
Node sensor = findNodeInstance("Sensor", "Loire water level - Orleans");
if(zone.isActive() && sensor.currentValue < 2.5 && risk.isFreeze()) {
risk.probability = 0.05;
risk.active();
risk.getGeoloc().setPosition(sensor.getGeoloc().getPosition());
}
if(zone.isFreeze() && sensor.currentValue < 2.5 && risk.isActive()) {
risk.probability = 0;
risk.freeze();
risk.getGeoloc().setPosition(null);
}
À 4,50 m la probabilité atteint 1 : la règle Creates de l’actualité Loire flood at George-V bridge l’active à l’endroit du risque et gèle le risque (if($source.probability >= 1), comme la règle par défaut). La crue ne se termine pas dès que l’eau baisse : le seuil du capteur qui l’a levée n’est relâché qu’une fois le niveau resté 6 heures sous 4,00 m (voir l’intercepteur Sensor).
Orléans Flood Crisis — attendre la fin de la crue avant de rouvrir
Dans les rôles de crise partagés, la fonction Mediation Wait until a bridge can be inspected se place entre Close a bridge to traffic et Inspect a bridge after a flood, reliées par de simples liens Implies. Sa durée est un intervalle de 6 à 24 h et elle scrute toutes les 5 s. Le processus déduit ferme le pont, puis l’attente retient l’inspection, et ce qui la suit, jusqu’à ce que la condition soit vraie ; les tâches qui la suivent sont planifiées dans une fenêtre, de l’attente la plus courte à la plus longue. La condition est générique : elle retrouve la crue par l’objectif pour lequel l’inspection a été déduite, la même fonction sert donc pour n’importe quel pont et n’importe quelle crue.
Wait until a bridge can be inspected (Mediation, Wait Until)Wait ConditionNode objective = $target.createdFor();
Node risk = objective -[Prevents]-> (Risk);
Node flood = risk -[Creates]-> (Actuality);
boolean cleared = flood == null || !flood.isActive();
boolean riskLow = risk == null || risk.probability < 0.8;
boolean reopen = cleared && riskLow;
reopen;
Dans la procédure corrective, Wait until the flood has receded se place de la même façon entre Cut the utility networks crossing a bridge et Restore the utility networks crossing a bridge (6 à 24 h, toutes les 5 s) : les réseaux sont rétablis une fois que la crue traitée par l’objectif n’est plus active.
Wait until the flood has receded (Mediation, Wait Until)Wait ConditionNode objective = $target.createdFor();
Node flood = objective -[Treats]-> (Actuality);
boolean cleared = flood == null || !flood.isActive();
cleared;
Barbecue — un risque de brûlure généré depuis la zone de danger
Le potentiel High Temperature est une zone de 6 m autour du barbecue, active tant que son capteur thermique indique 50 ou plus. Il Induces le risque modèle A Kid burns, sur le rôle Kid avec l’état redouté On fire, et son arête Generates depuis le barbecue fixe la zone de danger : danger zone radius (m) 6, contact distance (m) 1. r-io suite écrit la règle ci-dessous sur le Is_Susceptible_To de Kid vers High Temperature et la recopie sur l’arête d’Henri, qui a ce rôle (voir la chaîne causale). Elle pilote le risque A Kid burns: Henri Martinez (Martinez barbecue) : 0 au bord de la zone, 0,95 à 1 m, 1 en dessous ; hors de la zone, de 0,5 à 0,9 tant qu’Henri s’y dirige et l’atteint en moins de 120 s. Le Creates généré active A Kid burns: Henri Martinez quand Henri est On fire ou que le risque est certain.
Kid –Is_Susceptible_To→ High Temperaturesusceptibility condition, générée (extrait)Node resource = $source;
Node danger = $target;
Node risk1 = resource <-[Impacts]- ({"induced source": "node_0926822f-0309-8028-3c64-4647840e6c12"});
Node source1 = danger <-[Generates]- ("Martinez barbecue");
if(resource.getId() != null && risk1 != null) {
Node created1 = risk1 -[Creates]-> ();
if(source1 != null) {
if(source1.getId() != null) {
Float distance1 = resource.distanceToNode(source1);
if(danger.isActive() && distance1 != null && distance1 <= 6.0000) {
if(created1 == null) {
if(distance1 <= 1.0000) {
risk1.probability = 1;
} else {
Float remaining1 = 6.0000 - distance1;
risk1.probability = remaining1 * 0.1900;
}
risk1.getGeoloc().setPosition(resource.getGeoloc().getPosition());
risk1.active();
} else { // … la même chose, tant que l’actualité n’est pas active }
} else {
Float seconds1 = resource.secondsToReach(danger);
if(danger.isActive() && seconds1 != null && seconds1 >= 0 && seconds1 <= 120.0000) {
// hors de la zone, en route vers elle : de 0,5 deux minutes avant à 0,9
Float waited1 = 120.0000 - seconds1;
risk1.probability = waited1 * 0.0033 + 0.5;
…
} else {
if(risk1.isActive()) {
risk1.probability = 0;
risk1.freeze();
}
}
}
}
}
}
Le risque de noyade A Kid drowns suit la même loi depuis la zone Submersion de 10 m de la piscine ouverte. La piscine est un polygone : sa distance de contact vaut 0, donc distanceToNode rend 0 et le risque est certain dès qu’Henri est dedans ; son actualité vient quand Henri est Wet.
IMT Albi Healthcare — une règle de susceptibilité qui parcourt le graphe
Un logiciel de santé est Is_Susceptible_To le potentiel Danger of Electrical Failure. La règle parcourt les risques générés par ce potentiel et active chacun d’eux, avec son objectif de prévention, tant que le logiciel est dans la zone active et que le risque n’est pas encore certain.
Healthcare software –Is_Susceptible_To→ Danger of Electrical Failuresusceptibility conditionNode software = $source;
if(software.isInstanceOf("Good")) {
Node potential = $target;
List<Node> risks = software <-[Impacts]- ("Risk of software unavailability");
for(Node risk: risks) {
if(potential.isActive() && software.isInside(potential) && risk.probability < 1) {
risk.active();
if(risk <-[Prevents]- () != null) {
risk <-[Prevents]- ().active();
}
risk.getGeoloc().setPosition(software.getGeoloc().getPosition());
} else {
risk.freeze();
if(risk <-[Prevents]- () != null) {
risk <-[Prevents]- ().freeze();
}
risk.getGeoloc().setPosition(null);
}
}
}
IMT Albi Crisis — liens conditionnés et correctif qualifié
La fonction Confirm gas leak implique deux fonctions, chacune gardée par la réponse que le pompier donne dans la variable de sortie Confirmed gas leak. Les deux conditions sont exclusives : le processus déduit garde les deux branches et le moteur en suit une (voir liens conditionnés).
Confirm gas leak –Implies→ Cut off the local gas valve · Cut off the school gas supplyCondition Evaluation@Confirmed gas leak[Confirm gas leak] == "Yes and repairable"
@Confirmed gas leak[Confirm gas leak] == "Yes and non-repairable"
Quand la déduction retient un correctif pour un risque trouvé par la détection ML, le planificateur écrit la condition de l’Event_Flow attaché à la sous-tâche nominale. Le nom de l’actualité ne suffit pas, puisque la même Power outage peut être générée par plusieurs risques : la condition exige aussi que l’actualité soit créée par le risque validé (Creates, du risque vers l’actualité) (parcours des procédures correctives).
Nominal SubTask –Event_Flow→ sous-processus correctifCondition Evaluation (générée)Node triggerActuality = findNodeInstance("Actuality", "Power outage");
boolean generated = triggerActuality <-[Creates]- ("Power outages") != null;
boolean triggered = triggerActuality.isActive() && generated;
triggered;
Un risque de mise en œuvre attaché à une tâche reçoit plutôt un Exception_Flow, dont la condition générée ne surveille que l’actualité (parcours des procédures de reprise) :
Blood test Request –Exception_Flow→ sous-processus de repriseCondition Evaluation (générée)findNodeInstance("Actuality", "Healthcare software unavailability for Blood Test Request Function").isActive()