QSS/fr

Introduction
QSS est une extension de DEVS dont l'objectif est l'intégration numérique d'équations différentielles ordinaires (EDO). La méthode repose sur le principe de la discrétisation de l'espace des valeurs au lieu de l'espace du temps. Elle est développée par Ernesto Kofman.

Il existe deux façons de manipuler les EDO dans VLE :
 * soit de manière individuelle : un modèle par équation ;
 * soit sous forme d'un système : un modèle pour un ensemble d'équations ;

Si vous ne voulez pas utiliser QSS, et donc son schéma numérique, vous pouvez utiliser l'extension DESS qui est une encapsulation de schémas numériques plus traditionnels à pas de temps fixe (Euler, Runge-Kunta, par exemple).

QSS::Simple
La classe QSS::Simple prend en charge la modélisation d'une EDO par modèle.

La structure
Il faut définir deux types de port :
 * les ports d'entrée et sortie pour la synchronisation lorsque l'on couple plusieurs QSS : update ;
 * les ports d'entrée pour la perturbation du QSS : perturb ;

Les ports update sont définis en entrée et en sortie si le QSS intègre des variables gérées par d'autres QSS ou tout autre modèle gérant l'évolution d'une variable numérique. Pour ces autres modèles, il faut qu'il respecte un certain protocole.

Tous les ports sont optionnels :
 * si vous ne voulez pas autoriser les perturbations, pas de ports perturb;
 * si votre QSS n'est pas intégré dans un graphe de modèles numériques et donc ne dépend pas d'autres modèles ou ne rendre pas en jeu dans d'autres modèles numériques, pas de port update.

Si plusieurs QSS (dans notre exemple m1 et m2) sont mutuellement dépendants, il faut connecter les ports update ensemble.

Naturellement, si seulement m2 a besoin de la variable gérée par m1 alors seule ma première connexion est nécessaire.

Les initialisations
Les initialisations se divisent en deux groupes :
 * les inits pour le modèle lui-même : les paramètres de l'équation, par exemple ;
 * les inits pour QSS

QSS nécessite la valeur du pas de quantification (precision), la valeur en dessus de laquelle on considère le gradient comme nul (threshold) et la valeur initiale de la variable à intégrer ("value"). Cette liste se termine par le nom de la valeur à intégrer (name). Ce nom servira à l'initialisation du graphe de QSS dans le cas de QSS couplés.

Il existe deux autres inits pour paramétrer votre QSS.

Si votre QSS ne dépend pas d'autres variables numériques, alors il faut ajouter :

Par défaut, on considère qu'un QSS dépend d'autres variables numériques. Si votre QSS ne dépend pas d'autres QSS et qu'en plus, vous n'avez pas de modèle qui est intéressé par l'évolution continue de la variable intégrée alors il faut ajouter :

Comment écrire un modèle à base de QSS::Simple ?
L'écriture d'un modèle passe par la construction d'une sous-classe de vle::extension::QSS::Simple. Une méthode est à définir ainsi que le constructeur et le destructeur :
 * le constructeur pour la gestion de l'initialisation des paramètres définis dans le vpz sous forme suivante :


 * compute pour le calcul du gradient.

Voici un exemple d'header :

Voici maintenant un exemple d'initialisation de l'extrait précédent de vpz.

La deuxième étape consiste à définir la variable gérée par l'équation et les variables externes. Pour cela, il faut déclarer, comme attribut de la classe, un attribut du type Var pour la variable gérée par l'équation et Ext pour les autres.

Par exemple, si l'équation M gère la variable X et dépend de deux variables Y et Z, voici la déclaration à réaliser :

Ensuite, il faut faire le lien entre la variable C++ de manipulation de la variable et l'identifiant utilisé. Cela se déroule dans le constructeur.

La méthode de calcul du gradient fait intervenir la valeur de la variable à intégrer, les paramètres s'ils existent et les valeurs des variables numériques gérées par d'autres QSS ou par des modèles numériques. L'opérateur est utilisé pour l'accès aux valeurs.

Dans l'exemple, a et b sont les paramètres de l'équation, X, la valeur de la variable à intégrer et Y permet d'obtenir la valeur de la variable "externe" nommée Y.

QSS::Multiple
La classe QSS::Multiple prend en charge la modélisation de plusieurs EDO par modèle.

La structure
Elle est similaire à celle de QSS::Simple, la différence étant que au lieu d'avoir un unique port d'entrée et de sortie update, il faut maintenant utiliser autant de ports que de variable d'état prises en charge par le modèle.

Les initialisations
Les initialisations de active, dependent et threshold restent identiques à QSS::Simple. Les initialisations de name, value et precision sont quand à elles intégrées (dans cet ordre!) dans une unique structure variables prenant en charge les différentes variables d'état :

Comment écrire un modèle à base de QSS::Multiple ?
L'écriture d'un modèle passe par la construction d'une sous-classe de vle::extension::QSS::Multiple. Une méthode est à définir ainsi que le constructeur et le destructeur :
 * le constructeur pour la gestion de l'initialisation des paramètres définis dans le vpz sous forme suivante :


 * compute pour le calcul du gradient.

Voici un exemple d'header :

Voici maintenant un exemple d'initialisation de l'extrait précédent de vpz.

La deuxième étape consiste à définir les variables gérées par les équations et les variables externes. Pour cela, il faut déclarer, comme attribut de la classe, des attributs du type Var pour les variables gérées par les équations et Ext pour les autres.

Par exemple, si le système d'équation M gère les variables X et Y et dépend de d'une variable Z, voici la déclaration à réaliser :

Ensuite, il faut faire le lien entre les variables C++ de manipulation des variables et les identifiants utilisés. Cela se déroule dans le constructeur. On attribut à chaque variable d'état un identifiant entier qui sera le même que celui utilisé dans la méthode compute.

La méthode de calcul du gradient fait intervenir les valeurs des variables à intégrer, les paramètres s'ils existent et les valeurs des variables numériques gérées par d'autres QSS ou par des modèles numériques. L'opérateur est utilisé pour l'accès aux valeurs.

Dans l'exemple, a et b sont les paramètres de l'équation, X, Y, les valeurs des variables à intégrer et Z permet d'obtenir la valeur de la variable "externe" nommée Z.

Comment perturber un QSS ?
Pour perturber un QSS simple ou multiple, il suffit de se connecter sur le port d'entrée perturb et d'envoyer un événement transportant deux valeurs :
 * name avec le nom de la variable à perturber ;
 * value avec la nouvelle valeur de la variable.

Si pour déterminer cette nouvelle valeur, vous avez besoin de la valeur courante, :
 * se connecter sur le port "update" et vous recevrez les valeurs de la variable à chaque modification ;

Utilisation de l'option de seuils de détection
L'extension QSS simple (comme DESS simple) offre une option pour déclencher un événement instantané sur un port de sortie out lorsque la variable d'état franchit un seuil montant (S1) et/ou descendant (S2).

Pour activer cette option il faut d'une part rajouter un port de sortie out sur lequel l’événement sera produit

Et d'autre part ajouter les initialisations avec les valeurs voulues pour les front S1 et S2

Couplage avec un modèle non QSS
QSS propose d'être couplé avec tout modèle qui est capable de délivrer une valeur numérique. Par exemple, si vous avez un modèle de type équation aux différences ($$u(t+\Delta) = f(u(t), v(t), w(t), a, b, c)$$), ce modèle calcule à chaque pas de temps $$\Delta$$ sa nouvelle valeur. Si ce modèle pose sur un port de sortie cette valeur et que ce port est connecté au port update d'un QSS alors QSS prendra en charge cette valeur comme une variable externe qui peut être utilisée dans l'expression du gradient.

Voici la structure minimale d'un modèle non QSS doit posséder pour être couplé avec un QSS (note : nécessaire mais pas suffisant) :
 * port d'entrée : si le modèle non QSS dépend d'un ou de modèles QSS ;
 * port de sortie : Les événements à générer doivent posséder deux attributs, name et value ;
 * à t=0, le modèle doit poser sa valeur initiale sur le port de sortie comme indiqué ci-dessus ;
 * à chaque modification, le modèle doit poser sa nouvelle valeur sur le port de sortie.

Références

 * E. Kofman and S. Junco. Quantized state systems. a devs approach for continuous systems simulation. Transactions of the Society Computer Simulation International, 18(3) :123–132, 2001.
 * E. Kofman. A second order approximation for devs simulation of continuous systems. Transactions of the Society Computer Simulation International, 78(2) :76–89, 2002.
 * E. Kofman. A third order discrete event method for continuous system simulation. part i : Theory. In In Proceedings of RPIC’05, 2005.
 * E. Kofman. A third order discrete event method for continuous system simulation. part ii : Applications. In In Proceedings of RPIC’05, 2005.