Changes between Initial Version and Version 1 of 2010CaoTme3


Ignore:
Timestamp:
Mar 19, 2010, 6:44:10 PM (15 years ago)
Author:
jpc
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • 2010CaoTme3

    v1 v1  
     1[[PageOutline]]
     2
     3
     4= Représentation d'une Structure Booléenne Multi-niveaux (EBM) ==
     5
     6Les fichiers nécessaires à la réalisation de ce TME sont disponibles
     7directement sur le réseau enseignement, dans le répertoire:
     8{{{~jpc/M1-CAO/TME/3.public}}}
     9
     10
     11== Les différentes classes ==
     12
     13Pour pouvoir implanter en mémoire une {{{EBM}}} il est nécessaire de
     14disposer de trois classes:
     15
     16 * Une classe de base {{{Ebm}}}
     17 * Une classe {{{EbmExpr}}} pour représenter les expressions (dérivant d'{{{Ebm}}}).
     18 * Une classe {{{EbmVar}}} pour reprséenter les variables (dérivant d'{{{Ebm}}}).
     19
     20Les squelettes de ces classes sont fournis dans les fichiers {{{Ebm.h}}},
     21{{{EbmExpr.h}}} et {{{EbmVar.h}}}
     22
     23
     24=== La classe {{{Ebm}}} ===
     25
     26{{{
     27class Ebm {
     28  public:
     29            unsigned int       litterals ();
     30            std::set<EbmVar*>  support   ();
     31            void               support   ( std::ostream& );
     32            void               display   ( std::ostream& );
     33            ValueType          eval      ();
     34    static  Ebm*               parse     ( std::string expression );
     35};
     36}}}
     37
     38__Principales méthodes de la classe {{{Ebm}}}:__
     39 * {{{litterals()}}} : retourne le nombre de littéraux de l'{{{EBM}}}. C'est à dire le nombre
     40                       de fois que des variables apparaissent dans l'expression.
     41 * {{{support()}}}   : retourne le support de l'{{{EBM}}} sous forme d'ensemble ({{{set<>}}})
     42                       Le support est l'ensemble des variables nécessaire pour calculer la
     43                       valeur de l'expression.
     44 * {{{support(std::ostream&)}}} : Affiche le support dans un flux, voir l'exemple d'éxécution
     45                       du programme de test fourni plus bas.
     46 * {{{display(std::ostream&)}}} : Affiche l'{{{EBM}}} sous sa forme humainement lisible, en
     47                       notation ''préfixée''.
     48 * {{{eval()}}       : Calcule la valeur de l'expression booléenne. Le type de retour est un
     49                       {{{ValueType}}}, c'est à dire une variable pouvant prendre trois valeurs:
     50                       {{{Low}}}, {{{High}}} et {{{Unknown}}} (cf. {{{CaoTypes.h}}}.
     51 * {{{parse()}}}     : Une fonction statique transformant une chaîne de caractères en une
     52                       {{{EBM}}}.
     53
     54
     55=== La classe {{{EbmVar}}} ===
     56
     57{{{
     58class EbmVar: public Ebm {
     59  private:
     60    static unsigned int                    _maxIndex;
     61    static std::map<std::string ,EbmVar*>  _byName;   // All variables storage.
     62    static std::map<unsigned int,EbmVar*>  _byIndex;
     63  private :   
     64             std::string   _name;       // Variable name.
     65             ValueType     _value;      // Logical value.
     66             unsigned int  _index;      // Unique index (for ROBDD)
     67  public:
     68                           EbmVar   ( std::string name, ValueType value=Low );
     69    virtual               ~EbmVar   ();
     70  public:
     71    inline   std::string   getName  ();
     72    inline   ValueType     getValue ();
     73    inline   unsigned int  getIndex ();
     74    inline   void          setValue ( ValueType value );
     75  // Operations sur le dictionnaire
     76    static   EbmVar*       get      ( unsigned int index );
     77    static   EbmVar*       get      ( std::string name );
     78};
     79}}}
     80
     81
     82__Attributs de la classe {{{EbmVar}}}:__
     83 * {{{_name}}}  : Le nom de la variable (par ex. {{{"a"}}})
     84 * {{{_value}}} : La valeur actuellement affectée à la variable
     85                  ({{{Low}}}, {{{High}}} ou {{{Unknown}}}).
     86 * {{{_index}}} : Un index permettant d'identifier de façon unique la
     87                  variable. Cet index trouvera sont utilité dans le
     88                  TME suivant, présentant les {{{ROBDD}}}.
     89
     90
     91__Attributs ''statiques'' de la classe {{{EbmVar}}}:__
     92 * {{{_maxIndex}}} : Le compteur utilisé pour générer des index uniques
     93                     (mécanisme identique à celui utilisé pour les vecteurs
     94                      lors du TME1).
     95 * {{{_byName}}}   : Une table associative permettant de retrouver ''n'importe
     96                     quelle'' variable sachant son nom.
     97 * {{{_byIndex}}   : Une table associative permettant de retrouver ''n'importe
     98                     quelle'' variable sachant son index.
     99
     100__Principales méthodes de la classe {{{EbmVar}}}:__
     101 * {{{getName()}}}  : accesseur retournant le nom.
     102 * {{{getIndex()}}} : accesseur retournant l'index.
     103 * {{{getValue()}}} : accesseur retournant la valeur.
     104 * {{{setValue()}}} : modificateur de la valeur.
     105 * {{{get()}}}      : deux surcharge différentes pour retrouver une variable
     106                      par son nom ou par son index.
     107
     108
     109=== La classe {{{EbmExpr}}} ===
     110
     111{{{
     112class EbmExpr : public Ebm {
     113  private:
     114             OperatorType     _operator;  // operateur de ce noeud
     115             std::list<Ebm*>  _operands;  // pointeurs sur les operandes
     116  public:
     117                              EbmExpr     ( OperatorType, std::list<Ebm*>& operands );
     118    virtual                  ~EbmExpr     ();
     119    static   EbmExpr*         Not         ( Ebm* );
     120    static   EbmExpr*         Or          ( Ebm*, Ebm* );
     121    static   EbmExpr*         Or          ( Ebm*, Ebm*, Ebm* );
     122    static   EbmExpr*         Or          ( Ebm*, Ebm*, Ebm*, Ebm* );
     123    static   EbmExpr*         Xor         ( Ebm*, Ebm* );
     124    static   EbmExpr*         Xor         ( Ebm*, Ebm*, Ebm* );
     125    static   EbmExpr*         Xor         ( Ebm*, Ebm*, Ebm*, Ebm* );
     126    static   EbmExpr*         And         ( Ebm*, Ebm* );
     127    static   EbmExpr*         And         ( Ebm*, Ebm*, Ebm* );
     128    static   EbmExpr*         And         ( Ebm*, Ebm*, Ebm*, Ebm* );
     129  public:
     130    inline   OperatorType     getOperator ();
     131    inline   std::list<Ebm*>& getOperands ();
     132};
     133}}}
     134
     135
     136__Attributs de la classe {{{EbmExpr}}}:__
     137 * {{{_operator}}} : le type de l'opérateur (dans {{{CaoTypes.h}}}, parmis
     138                     {{{Not}}}, {{{And}}}, {{{Or}}} ou {{{Xor}}}).
     139 * {{{_operands}}} : une liste de pointeurs vers les opérandes.
     140
     141
     142__Principales méthodes de la classe {{{EbmVar}}}:__
     143 * {{{getOperator()}}} : accesseur, retourne le type de l'opérateur.
     144 * {{{getOperands()}}} : accesseur, retourne une référence sur la liste
     145                         des opérandes (pour éviter une copie inutile de
     146                         la liste).
     147 * {{{Or()}}}          : trois surcharges construisant une expression
     148                         {{{Or}}} entre ses {{{N}}} opérandes. Le but de ces
     149                         différentes fonctions est de cacher la construction
     150                         de la liste des opérandes et l'allocation de
     151                         l'{{{EbmExpr}}} résultante. Noter que cela implique
     152                         une construction ''bottom-up'' de l'{{{EBM}}} complète.
     153                         Voir l'exemple fourni.
     154 * {{{And()}}} et {{{Xor()}}} : idem.
     155
     156
     157== Présentation des méthodes récursives ==
     158
     159
     160== Fonctionnement de la fonction {{{getType()}}} ==
     161
     162
     163== Les ''templates'' {{{map<>}}} et {{{set<>}}} ==