wiki:2010CaoTme3

Version 2 (modified by jpc, 15 years ago) (diff)

--

Représentation d'une Structure Booléenne Multi-niveaux (EBM)

Les fichiers nécessaires à la réalisation de ce TME sont disponibles directement sur le réseau enseignement, dans le répertoire: ~jpc/M1-CAO/TME/3.public

Les différentes classes

Pour pouvoir implanter en mémoire une EBM il est nécessaire de disposer de trois classes:

  • Une classe de base Ebm
  • Une classe EbmExpr pour représenter les expressions (dérivant d'Ebm).
  • Une classe EbmVar pour reprséenter les variables (dérivant d'Ebm).

Les squelettes de ces classes sont fournis dans les fichiers Ebm.h, EbmExpr.h et EbmVar.h

La classe Ebm

class Ebm {
  public:
            unsigned int       litterals ();
            std::set<EbmVar*>  support   ();
            void               support   ( std::ostream& );
            void               display   ( std::ostream& );
            ValueType          eval      ();
    static  Ebm*               parse     ( std::string expression );
};

Principales méthodes de la classe Ebm:

  • litterals() : retourne le nombre de littéraux de l'EBM. C'est à dire le nombre de fois que des variables apparaissent dans l'expression.
  • support() : retourne le support de l'EBM sous forme d'ensemble (set<>) Le support est l'ensemble des variables nécessaire pour calculer la valeur de l'expression.
  • support(std::ostream&) : Affiche le support dans un flux, voir l'exemple d'éxécution du programme de test fourni plus bas.
  • display(std::ostream&) : Affiche l'EBM sous sa forme humainement lisible, en notation préfixée.
  • eval() : Calcule la valeur de l'expression booléenne. Le type de retour est un ValueType, c'est à dire une variable pouvant prendre trois valeurs: Low, High et Unknown (cf. CaoTypes.h).
  • parse() : Une fonction statique transformant une chaîne de caractères en une EBM.

La classe EbmVar

class EbmVar: public Ebm {
  private:
    static unsigned int                    _maxIndex;
    static std::map<std::string ,EbmVar*>  _byName;   // All variables storage.
    static std::map<unsigned int,EbmVar*>  _byIndex;
  private :    
             std::string   _name;       // Variable name.
             ValueType     _value;      // Logical value.
             unsigned int  _index;      // Unique index (for ROBDD)
  public:
                           EbmVar   ( std::string name, ValueType value=Low );
    virtual               ~EbmVar   ();
  public:
    inline   std::string   getName  ();
    inline   ValueType     getValue ();
    inline   unsigned int  getIndex ();
    inline   void          setValue ( ValueType value );
  // Operations sur le dictionnaire
    static   EbmVar*       get      ( unsigned int index );
    static   EbmVar*       get      ( std::string name );
};

Attributs de la classe EbmVar:

  • _name : Le nom de la variable (par ex. "a")
  • _value : La valeur actuellement affectée à la variable (Low, High ou Unknown).
  • _index : Un index permettant d'identifier de façon unique la variable. Cet index trouvera sont utilité dans le TME suivant, présentant les ROBDD.

Attributs statiques de la classe EbmVar:

  • _maxIndex : Le compteur utilisé pour générer des index uniques (mécanisme identique à celui utilisé pour les vecteurs lors du TME1).
  • _byName : Une table associative permettant de retrouver n'importe quelle variable sachant son nom.
  • _byIndex : Une table associative permettant de retrouver n'importe quelle variable sachant son index.

Principales méthodes de la classe EbmVar:

  • getName() : accesseur retournant le nom.
  • getIndex() : accesseur retournant l'index.
  • getValue() : accesseur retournant la valeur.
  • setValue() : modificateur de la valeur.
  • get() : deux surcharge différentes pour retrouver une variable par son nom ou par son index.

La classe EbmExpr

class EbmExpr : public Ebm {
  private:
             OperatorType     _operator;  // operateur de ce noeud
             std::list<Ebm*>  _operands;  // pointeurs sur les operandes 
  public:
                              EbmExpr     ( OperatorType, std::list<Ebm*>& operands );
    virtual                  ~EbmExpr     ();
    static   EbmExpr*         Not         ( Ebm* );
    static   EbmExpr*         Or          ( Ebm*, Ebm* );
    static   EbmExpr*         Or          ( Ebm*, Ebm*, Ebm* );
    static   EbmExpr*         Or          ( Ebm*, Ebm*, Ebm*, Ebm* );
    static   EbmExpr*         Xor         ( Ebm*, Ebm* );
    static   EbmExpr*         Xor         ( Ebm*, Ebm*, Ebm* );
    static   EbmExpr*         Xor         ( Ebm*, Ebm*, Ebm*, Ebm* );
    static   EbmExpr*         And         ( Ebm*, Ebm* );
    static   EbmExpr*         And         ( Ebm*, Ebm*, Ebm* );
    static   EbmExpr*         And         ( Ebm*, Ebm*, Ebm*, Ebm* );
  public:
    inline   OperatorType     getOperator ();
    inline   std::list<Ebm*>& getOperands ();
};

Attributs de la classe EbmExpr:

  • _operator : le type de l'opérateur (dans CaoTypes.h, parmis Not, And, Or ou Xor).
  • _operands : une liste de pointeurs vers les opérandes.

Principales méthodes de la classe EbmVar:

  • getOperator() : accesseur, retourne le type de l'opérateur.
  • getOperands() : accesseur, retourne une référence sur la liste des opérandes (pour éviter une copie inutile de la liste).
  • Or() : trois surcharges construisant une expression Or entre ses N opérandes. Le but de ces différentes fonctions est de cacher la construction de la liste des opérandes et l'allocation de l'EbmExpr résultante. Noter que cela implique une construction bottom-up de l'EBM complète. Voir l'exemple fourni.
  • And() et Xor() : idem.

Présentation des méthodes récursives

Exemple d'etat de la recursion.

Fonctionnement de la fonction getType()

Les templates map<> et set<>

Attachments (5)

Download all attachments as: .zip