Mathématiques du traitement du signal/Grapheur

Grapheur

modifier

Un grapheur est un système informatique permettant de manipuler des graphes de traitements algorithmiques. Ils rendent possible le chaînage (l'assemblage) de modules (ou nœuds) algorithmiques, ainsi que leur exécution.

Un chapitre du mémoire d'habilitation à diriger les recherches de Jérôme Lacaille est très éclairant sur les grapheurs.

Exemple de grapheur en langage R

modifier

Un grapheur simple en langage R est disponible sous licence GNU sur le site PhiMaTeX de sourceforge ; sa dernière version est téléchargeable ici.

Ce grapheur est commenté afin d'exposer les points nécessaires au bon fonctionnement d'un tel système.

Format du graphe de traitement

modifier

Dans le cadre d'une implémentation en R, un graphe de traitement va être incarné par une liste de nœuds. Chaque nœud représentera un traitement. Il y aura un nœud supplémentaire (pompeusement appelé global-node) qui contiendra des informations globales sur le graphe de traitement (comme son mode d'exécution courant, ou le dernier chaînage exécuté).

Chaque nœud va avoir plusieurs propriétés, qui vont permettent de le décrire ; le minimum est :

  • un numéro d'identifiant unique : id
  • le nom du nœud (name), qui permet de s'y référer plus simplement que par son numéro d'id
  • la fonction algorithmique attachée au nœud : rfun
  • les paramètres du nœud : params, structuré en une liste de couples nom-valeur (name x value)
  • ses connexions vers d'autres nœuds : coutput
  • ses connections provenant d'autres nœuds : cinput ; il s'agit d'une matrice   dont la n-ème ligne contient, pour la connexion n, le nom du module pointé (ou pointeur), suivi du numéro de la connexion concernée
  • sa mémoire interne : memory
  • la valeur du signal de sortie, lorsque c'est applicable : outputs

Il existe d'autres propriétés, qui sont manipulées par le grapheur lui-même :

  • verbose : qui détermine le niveau des sorties relatives au nœud qui seront dans le log
  • isStatic : qui fige le nœud
  • reset : qui signale que le nœud est en mode reset (cf plus loin)
  • buffer : qui signifie que le nœud est en mode buffeur

ces propriétés ne doivent être manipulées que par le grapheur.

En outre, le nœud global a des propriétés particulières, qui permettent au grapheur de savoir où il en est dans les traitements.

Manipulation des nœuds

modifier

Fabrication d'un nœud vide

# make node
makeNode <- function( id, ...) {
 z<-list(...);
 if(is.list(id)) {
   z$id = length(id)+1;
 }
 else {
   z$id = id;
   }
 return(z)
}

connecter deux nœuds au sein d'une liste de nœuds il s'agit de remplir les propriétés cinput et coutput des nœuds respectifs.

# connect nodes
connectNodes <- function( listOfNodes, first, second, inputField="cinput", outputField="coutput") {
 if( length(first)==1 )
   first = list(first, 1);
 if( length(second)==1 )
   second = list(second, 1);
 firstId  = getNodeId( listOfNodes, first1);
 secondId = getNodeId( listOfNodes, second1);
 out1     = listOfNodesfirstIdoutputField;
 in2      = listOfNodessecondIdinputField;
 out1     = rbind(out1, c(secondId, second2));
 in2      = rbind(in2 , c(firstId,  first2));
 listOfNodesfirstIdoutputField = out1;
 listOfNodessecondIdinputField = in2;
 return( listOfNodes)
}

Manipulation et exécution du graphe

modifier

Factorisation des fonctions

modifier

Exemples commentés

modifier

Voir la version graphique de l'enchaînement de traitements que nous allons suivre grâce à rgraph.r.

L'interface permettant d'importer des graphiques graphml (dessinés par yed, en utilisant son module graphml) dans rgraph est disponible dans awk sur PhiMaTeX.