Architecture

Le MDE, le BRMS et l’inférence

Publié le : Auteur: Christian CHABOT 2 commentaires
architecture

A travers le titre de cet article que n’aurait pas renié Sergio Leone, on va montrer le rapprochement possible entre le MDE et le BRMS, deux mondes sans rapport apparent.

Le Model Driven Engineering, ou ingénierie dirigée par les modèles, place les modèles au cœur du processus d’élaboration et de construction du système informatique; le Business Rule Management System, ou système de gestion de règles métier, ambitionne quant à lui de mettre la logique décisionnelle métier au centre du système informatique.

On va voir que l’inférence permet d’établir un parallèle entre ces deux approches, où d’un côté le BRMS met en œuvre un moteur d’inférence qui applique des règles métiers sur une base de fait alimentée par des données métier, alors que le MDE met lui en œuvre des processus de transformation dans lesquels le moteur applique des règles de transformation sur des éléments de modèles.

Pour illustrer ce point nous allons utiliser deux outils open-source : la suite Mia-Studio côté MDE et le projet communautaire JBoss Rules côté BRMS.

JBoss Rules s’appuie sur Drools, un moteur d’inférence à chaînage avant accessible depuis une interface Java, qui fournit de nombreux exemples dans sa distribution. On se propose ici de reprendre l’exemple de la suite de Fibonacci pour le mettre en œuvre avec Mia-Transformation (téléchargeable ici), qui est le composant de la suite Mia-Studio permettant la mise au point et l’exécution de règles de transformation de modèles.

Cette petite illustration technique donnera l’opportunité d’analyser dans un prochain article les conséquences de cette approche du MDE

Analyse de l’exemple

Pour construire et rejouer l’exemple, on utilise une distribution Eclipse Modeling qui servira plus tard pour l’élaboration de la base de fait lors de la mise en œuvre de l’exemple avec Mia-Studio :

  • On déclare préalablement dans Eclipse la bibliothèque utilisateur DROOLS_5.4.0 dans laquelle on ajoute les binaires Drools présents dans le répertoire binairies de la distribution.
  • On crée ensuite le projet Java FibonacciDrools avec une dépendance vers la bibliothèque DROOLS_5.4.0 afin de pouvoir utiliser l’API Drools,
  • puis on ajoute au projet l’exemple défini dans le fichier examples/sources/src/main/java/org/drools/examples/FibonacciExample.java de la distribution,
  • on ajoute enfin le fichier de déclaration des règles examples/sources/src/main/resources/org/drools/examples/fibonacci/Fibonacci.drl.

NB: la distribution contient aussi tous les éléments  pour reconstruire et exécuter l’exemple avec Maven.

Comment fonctionne cet exemple ?

  • La classe org.drools.examples.Fibonacci décrit un élément de la suite; elle représente les faits manipulés par le moteur d’inférence.
  • Le fichier Fibonacci.drl définit les règles de calcul des éléments de la suite.
  • Pour lancer un calcul, on insère dans la base de fait  l’élément du rang N pour lequel on souhaite calculer la suite (instruction ksession.insert dans FibonacciExample.java).
  • L’exécution des règles produit l’ensemble des éléments de la suite jusqu’au rang N sous la forme d’instances de la classe org.drools.examples.Fibonacci
Recurse rule has inserted f10
Recurse rule has inserted f9
Recurse rule has inserted f8
Recurse rule has inserted f7
Recurse rule has inserted f6
Recurse rule has inserted f5
Recurse rule has inserted f4
Recurse rule has inserted f3
Recurse rule has inserted f2
Bootstrap rule has modified f1 == 1
Bootstrap rule has modified f2 == 1
Calculate rule has modified f3 == 2
Calculate rule has modified f4 == 3
Calculate rule has modified f5 == 5
Calculate rule has modified f6 == 8
Calculate rule has modified f7 == 13
Calculate rule has modified f8 == 21
Calculate rule has modified f9 == 34
Calculate rule has modified f10 == 55

 

Mise en œuvre avec Mia-Transformation

Définition du méta-modèle de données

Dans une première étape on va définir le méta-modèle de données, l’équivalent de la base de faits dans Drools, sur lequel les règles vont s’appliquer. On définit pour cela un langage dédié à notre suite de Fibonacci (DSL) en utilisant la technologie mise à disposition par le projet EMF d’Eclipse, en particulier la modélisation Ecore.

On crée donc à l’aide de la distribution d’Eclipse Modeling un modèle Ecore très simple sur la base de la définition de la classe Fibonacci :

Aperçu du modèle Ecore

On utilise ensuite ce modèle pour créer le  modèle de générateur EMF, à partir duquel on génère l’API d’accès à notre modèle de Fibonacci. On construit cette interface d’accès au modèle sous la forme d’un plugin à l’aide de la fonction d’export de projet d’Eclipse. Ce plugin est copié dans le répertoire common/metamodels/eclipse/plugins  de l’installation Mia-Studio afin de permettre la définition de règles utilisant ce DSL.

Ce processus de création d’un DSL est documenté en détail dans le manuel utilisateur de Mia-Transformation dans le chapitre sur la gestion avancée des modèles (§. Implémenter son méta-modèle en Java).

Définition du modèle de données

Une fois le DSL défini, on crée le modèle qui servira au calcul des éléments de la suite de Fibonacci au rang N. On cherche ici à effectuer l’opération équivalente à l’instruction Drools ksession.insert : il suffit simplement d’instancier un modèle contenant un élément de la suite pour le rang souhaité (10 dans l’exemple). Cette instanciation d’un DSL Ecore peut se faire avec l’outil de création d’instance dynamique fourni par EMF ou à l’aide de l’éditeur réflexif construit à l’aide du générateur EMF comme dans l’étape précédente. On choisira la première approche comme l’illustrent les captures d’écrans suivantes :

Création dynamique d'instance Ecore

Modèle d'exemple

Définition des règles de transformation

Reste ensuite à définir les règles de transformation, encore une fois en s’inspirant dans l’exemple Drools du fichier de règles Fibonacci.drl. L’objectif de ce billet n’étant pas de former le lecteur à l’outil Mia-Tranformation, on renverra au tutoriel disponible dans la suite Mia-Studio ou en ligne. On peut cependant faire remarquer sans entrer dans trop de détails techniques qu’un moteur de transformation utilise la même logique de prédicats qu’un moteur d’inférence et que les règles de transformation sont par conséquent composées d’une partie conditionnelle (query), qui si elle est vérifiée entraine l’application du traitement défini dans la deuxième partie de la règle (action) sur le produit cartésien du n-uplet résultat du query.

Pour illustrer cette similitude dans la logique de construction des règles, voici la transcription de la relation de récurrence entre deux éléments de la suite Fn = Fn-1 + fn-2

Dans Drools :

rule Calculate
when
f1 : Fibonacci( s1 : sequence, value != -1 )
f2 : Fibonacci( sequence == (s1 + 1 ), value != -1 )
f3 : Fibonacci( s3 : sequence == (f2.sequence + 1 ), value == -1
then
modify ( f3 ) { value = f1.value + f2.value };
System.out.println( "Calculate rule has modified f" + s3 + " == " + f3.value );
end

Dans Mia-Transformation :

Si la syntaxe des règles change, on constate par exemple que le langage Mia-TL est moins expressif dans l’écriture des Query, la logique de la règle reste elle inchangée

La transcription des règles amène ainsi à la création de 3 règles Recurse, Bootstrap et Calculate conformes à la définition des règles Drools correspondantes (une capture d’écran des deux règles Recurse et Bootstrap est fournie en fin d’article). Il est important de noter ici que le moteur de transformation n’effectue par défaut qu’un seul passage sur les règles et qu’il faut donc activer l’option d’application récursive des règles sur le Rule Set qui contient les règles.

Exécution des règles

On charge dans l’outil Mia-Transformation le modèle d’exemple constitué dans l’étape précédente et on exécute les règles. Les traces d’exécution ajoutées aux règles, calquées sur les traces présentes dans les règles Drools pour faciliter la comparaison des résultats, sont les suivantes :

Recurse rule has inserted f9
Recurse rule has inserted f8
Recurse rule has inserted f7
Recurse rule has inserted f6
Recurse rule has inserted f5
Recurse rule has inserted f4
Recurse rule has inserted f3
Recurse rule has inserted f2
Bootstrap rule has modified f2 == 1

Le résultat n’est pas conforme à celui obtenu avec Drools et l’analyse du problème montre que la précédence d’application des règles n’est pas respectée : Drools utilise une notion de poids sur les règles (salience) étrangère à Mia-Transformation, qui applique une heuristique spécifique de parcours des règles comme l’illustre le schéma suivant :

Evaluation d'un Rule Set

Pour reproduire le mécanisme de salience, l’astuce consiste à isoler les règles dans des Rules Sets distincts en fonction de leurs poids respectifs, chacun de ces Rules Sets faisant partie d’un Rules Set parent commun. On place donc la règle Recurse qui possède le poids le plus important dans le premier Rule Set et les deux autres règles dans le suivant comme l’illustre la figure suivante pour les Rules Sets Core-Salience, Core-Salience-1 et Core-Salience-2 :


Après une nouvelle exécution, on retrouve bien dans le modèle chaque élément de la suite de Fibonacci jusqu’au rang N souhaité et les traces d’exécution sont cette fois-ci conformes à celles de l’exécution des règles Drools :

Recurse rule has inserted f9
Recurse rule has inserted f8
Recurse rule has inserted f7
Recurse rule has inserted f6
Recurse rule has inserted f5
Recurse rule has inserted f4
Recurse rule has inserted f3
Recurse rule has inserted f2
Recurse rule has inserted f1
Bootstrap rule has modified f2 == 1
Bootstrap rule has modified f1 == 1
Calculate rule has modified f3 == 2
Calculate rule has modified f4 == 3
Calculate rule has modified f5 == 5
Calculate rule has modified f6 == 8
Calculate rule has modified f7 == 13
Calculate rule has modified f8 == 21
Calculate rule has modified f9 == 34
Calculate rule has modified f10 == 55

 

On voit donc que l’on peut parfaitement effectuer de l’inférence avec un moteur de transformation, ce qui permet d’envisager différemment l’usage des modèles dans un processus MDE. Cet aspect sera analysé dans un prochain article.

Annexe

Transcription Mia-Transformation de la règle Recurse

Transcription Mia-Transformation de la règle Bootstrap

  • Lorrain Weber

    Juste une petite question : depuis quand mia-studio est-il open source ?

    • Christian CHABOT

      La sortie de Mia-Studio édition Community date de Juin 2012; elle est aussi disponible en téléchargement sur Programmez!.
      Petit rectificatif sur ce que j’ai écrit : il s’agit d’une version gratuite, limitée fonctionnellement principalement dans la mise au point des scripts, (matrice de comparaison des éditions ici) mais pas open-source.