Mathématiques du traitement du signal/Grapheur
Grapheur
modifierUn 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
modifierUn 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
modifierDans 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
xvalue
) - 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 logisStatic
: qui fige le nœudreset
: 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
modifierFabrication 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
modifierFactorisation des fonctions
modifierExemples commentés
modifierVoir 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.