aGrUM  0.14.2
gum::prm::PRMClass< GUM_SCALAR > Class Template Reference

A PRMClass is an object of a PRM representing a fragment of a Bayesian Network which can be instantiated in PRMInstance. More...

#include <agrum/PRM/elements/PRMClass.h>

+ Inheritance diagram for gum::prm::PRMClass< GUM_SCALAR >:
+ Collaboration diagram for gum::prm::PRMClass< GUM_SCALAR >:

Public Member Functions

Constructors & destructor.
 PRMClass (const std::string &name)
 Default constructor. More...
 
 PRMClass (const std::string &name, PRMClass< GUM_SCALAR > &super, bool delayInheritance=false)
 Constructor for building a subclass of super. More...
 
 PRMClass (const std::string &name, const Set< PRMInterface< GUM_SCALAR > * > &set, bool delayInheritance=false)
 Constructor for building a Class<GUM_SCALAR> implementing several each interface in set. More...
 
 PRMClass (const std::string &name, PRMClass< GUM_SCALAR > &super, const Set< PRMInterface< GUM_SCALAR > * > &set, bool delayInheritance=false)
 Constructor for building a subclass of super and implementing each interface in set. More...
 
 PRMClass (const PRMClass< GUM_SCALAR > &source)=delete
 Copy constructor. More...
 
 PRMClass (const PRMClass< GUM_SCALAR > &&source)=delete
 Move constructor. More...
 
PRMClass< GUM_SCALAR > & operator= (const PRMClass< GUM_SCALAR > &source)=delete
 Copy operator. Don't use it. More...
 
PRMClass< GUM_SCALAR > & operator= (const PRMClass< GUM_SCALAR > &&source)=delete
 Move operator. Don't use it. More...
 
virtual ~PRMClass ()
 Destructor. More...
 
virtual PRMObject::prm_type obj_type () const
 Implementation of pure virtual method of PRMObject. More...
 
Graphical operator
PRMClassElement< GUM_SCALAR > & get (NodeId id)
 See gum::prm::PRMClassElementContainer<GUM_SCALAR>::get(NodeId). More...
 
const PRMClassElement< GUM_SCALAR > & get (NodeId id) const
 See gum::prm::PRMClassElementContainer<GUM_SCALAR>::get(NodeId). More...
 
PRMClassElement<GUM_SCALAR> getters and setters
virtual bool isOutputNode (const PRMClassElement< GUM_SCALAR > &elt) const
 Returns true if elt is an output node. More...
 
bool isCastDescendant (const std::string &safe_name) const
 Return true if the attribute named safe_name is a cast descendant. More...
 
PRMClassElement< GUM_SCALAR > & get (const std::string &name)
 See gum::prm::PRMClassElementContainer<GUM_SCALAR>::get(const std::string&). More...
 
const PRMClassElement< GUM_SCALAR > & get (const std::string &name) const
 See gum::prm::PRMClassElementContainer<GUM_SCALAR>::get(const std::string&). More...
 
virtual NodeId add (PRMClassElement< GUM_SCALAR > *elt)
 See gum::prm::add(PRMClassElement<GUM_SCALAR>*). More...
 
virtual NodeId overload (PRMClassElement< GUM_SCALAR > *elt)
 See gum::prm::overload(PRMClassElement<GUM_SCALAR>*). More...
 
virtual void addArc (const std::string &tail, const std::string &head)
 See gum::prm::PRMClassElementContainer<GUM_SCALAR>::addArc(). More...
 
const Set< PRMAttribute< GUM_SCALAR > *> & attributes () const
 Returns the set of PRMAttribute<GUM_SCALAR> of this Class<GUM_SCALAR>. More...
 
const Set< PRMParameter< GUM_SCALAR > *> & parameters () const
 Returns the set of parameters of this Class<GUM_SCALAR>. More...
 
HashTable< std::string, const PRMParameter< GUM_SCALAR > *> scope () const
 Returns all the parameters in the scope of this class. More...
 
const Set< PRMAggregate< GUM_SCALAR > *> & aggregates () const
 Returns the set of PRMAggregate<GUM_SCALAR> of this Class<GUM_SCALAR>. More...
 
const Set< PRMReferenceSlot< GUM_SCALAR > *> & referenceSlots () const
 Returns the set of PRMReferenceSlot<GUM_SCALAR> of this Class<GUM_SCALAR>. More...
 
const Set< PRMSlotChain< GUM_SCALAR > *> & slotChains () const
 Returns the set of PRMSlotChain<GUM_SCALAR> of this Class<GUM_SCALAR>. More...
 
Inheritance methods
virtual bool isSubTypeOf (const PRMClassElementContainer< GUM_SCALAR > &cec) const
 Test if this Class<GUM_SCALAR> is a subclass of cec. More...
 
const PRMClass< GUM_SCALAR > & super () const
 Returns the super Class<GUM_SCALAR> of this Class<GUM_SCALAR>. More...
 
const Set< PRMInterface< GUM_SCALAR > *> & implements () const
 Returns the Set of PRMInterface<GUM_SCALAR> implemented by this Class<GUM_SCALAR>. More...
 
const Set< PRMClass< GUM_SCALAR > *> & extensions () const
 Returns the set of Class<GUM_SCALAR> which are direct sub-Class<GUM_SCALAR> of this Class<GUM_SCALAR>. More...
 
Getters & setters operators
PRMClassElement< GUM_SCALAR > & operator[] (NodeId id)
 See gum::prm::PRMClassElementContainer<GUM_SCALAR>::operator[](NodeId). More...
 
const PRMClassElement< GUM_SCALAR > & operator[] (NodeId id) const
 See gum::prm::PRMClassElementContainer<GUM_SCALAR>::operator[](NodeId). More...
 
PRMClassElement< GUM_SCALAR > & operator[] (const std::string &name)
 See gum::prm::PRMClassElementContainer<GUM_SCALAR>::operator[](const std::string&). More...
 
const PRMClassElement< GUM_SCALAR > & operator[] (const std::string &name) const
 See gum::prm::PRMClassElementContainer<GUM_SCALAR>::operator[](const std::string&). More...
 
For custom inheritance
void inheritReferenceSlots ()
 
void inheritParameters ()
 
void inheritAttributes ()
 
void inheritAggregates ()
 
void inheritSlotChains ()
 
void initializeInheritance ()
 
void completeInheritance (const std::string &attr)
 
Getters on the gum::PRMClassElement<GUM_SCALAR>.
virtual bool belongsTo (const PRMClassElement< GUM_SCALAR > &elt) const
 Returns true if elt belongs to this PRMClassElementContainer. More...
 
virtual bool exists (const std::string &name) const
 Returns true if a member with the given name exists in this PRMClassElementContainer or in the PRMClassElementContainer hierarchy. More...
 
virtual bool isInputNode (const PRMClassElement< GUM_SCALAR > &elt) const
 Returns true if the node is an input node. More...
 
virtual void setInputNode (const PRMClassElement< GUM_SCALAR > &elt, bool b)
 Set the input flag value of id at b. More...
 
virtual void setOutputNode (const PRMClassElement< GUM_SCALAR > &elt, bool b)
 Set the output flag value of id at b. More...
 
virtual bool isInnerNode (const PRMClassElement< GUM_SCALAR > &elt) const
 Returns true if the node is an inner node. More...
 
Graphical operator
virtual bool exists (NodeId id) const
 Returns true if a member with the given id exists in this PRMClassElementContainer or in the PRMClassElementContainer hierarchy. More...
 
virtual const DAGcontainerDag () const
 Returns the gum::DAG of this PRMClassElementContainer. More...
 
Inheritance getters and setters
virtual bool isSuperTypeOf (const PRMClassElementContainer< GUM_SCALAR > &cec) const
 Test if this PRMClassElementContainer is a super type of cec. More...
 
Getters & setters.
const std::string & name () const
 Returns the name of this object. More...
 
void name (const std::string &name)
 Change the name of the PRM Object. More...
 
Operators
bool operator== (const PRMObject &obj) const
 To PRMObject are equal if they have the same name (which is unique). More...
 
bool operator!= (const PRMObject &obj) const
 To PRMObject are equal if they have the same name (which is unique). More...
 

Protected Member Functions

virtual const DAG_dag () const
 returns a constant reference over this interface's dag. More...
 
virtual DAG_dag ()
 Returns a non constant reference over this PRMInterface<GUM_SCALAR>'s DAG. More...
 
void _findAllSubtypes (Set< PRMClassElementContainer< GUM_SCALAR > * > &set)
 Fills set with all the subtypes of this Class<GUM_SCALAR>. More...
 
void _updateDescendants (const PRMClassElement< GUM_SCALAR > &elt)
 See gum::prm::PRMClassElementContainer<GUM_SCALAR>(const PRMClassElement<GUM_SCALAR>&). More...
 
virtual std::pair< bool, bool > & _getIOFlag (const PRMClassElement< GUM_SCALAR > &elt)
 Returns the IO flags of a PRMClassElement<GUM_SCALAR>. More...
 
virtual const std::pair< bool, bool > & _getIOFlag (const PRMClassElement< GUM_SCALAR > &elt) const
 Returns the IO flags of a PRMClassElement<GUM_SCALAR>. More...
 
virtual void _setIOFlag (const PRMClassElement< GUM_SCALAR > &elt, const std::pair< bool, bool > &flags)
 Defines the IO flags of a PRMClassElement<GUM_SCALAR>. More...
 
virtual void _copyIOFlags (const PRMClassElementContainer< GUM_SCALAR > &c)
 Copy the IO Flags of c in this PRMClassElementContainer. More...
 

Friends

class PRMInterface< GUM_SCALAR >
 

PRMClassElement<GUM_SCALAR> members

HashTable< std::string, PRMClassElement< GUM_SCALAR > *> __nameMap
 Mapping between a member's name and itself. Used for fast access to a member given it's name. More...
 
Set< PRMAttribute< GUM_SCALAR > *> __attributes
 The sequence of PRMAttribute<GUM_SCALAR>s. More...
 
Set< PRMReferenceSlot< GUM_SCALAR > *> __referenceSlots
 The sequence of PRMReferenceSlot<GUM_SCALAR>. More...
 
Set< PRMAggregate< GUM_SCALAR > *> __aggregates
 The sequence of aggregate. More...
 
Set< PRMSlotChain< GUM_SCALAR > *> __slotChains
 The set of gum::PRMSlotChain<GUM_SCALAR>s. More...
 
Set< PRMParameter< GUM_SCALAR > *> __parameters
 The Set of parameters in this Class<GUM_SCALAR>. More...
 
void __addCastDescendants (PRMClassElement< GUM_SCALAR > *attr)
 Recursively adds cast descendant of attr in this Class<GUM_SCALAR>. More...
 
void __addCastDescendants (PRMAttribute< GUM_SCALAR > *start, PRMAttribute< GUM_SCALAR > *end)
 Recursively adds cast descendant from start to end in this Class<GUM_SCALAR>. More...
 

Inheritance members

PRMClass< GUM_SCALAR > * __superClass
 The alternate PRMClassElementContainer<GUM_SCALAR> searched for elements defined in this. Note that this is first searched for gum::PRMClassElement<GUM_SCALAR>. More...
 
Set< PRMInterface< GUM_SCALAR > *> * __implements
 The Set of implemented interface of this. More...
 
Set< PRMClass< GUM_SCALAR > *> __extensions
 The set of Class<GUM_SCALAR> which are extension of this Class<GUM_SCALAR> (i.e. direct subtypes). More...
 
Bijection< const DiscreteVariable *, const DiscreteVariable *> * __bijection
 The bijection between variables in super and variables in this The bijection's firsts are attributes in this and its seconds are attributes in c. More...
 
HashFunc< PRMClassElementContainer< GUM_SCALAR > *> __dummy_hashfunc
 a dummy member used to fix a compilation issue in clang4 More...
 
void __inheritClass (const PRMClass< GUM_SCALAR > &c)
 Proceed with the copy when this inherits c. More...
 
void __implementInterfaces (bool delayInheritance)
 Proceed with the implementation of interfaces. More...
 
void __checkInterfaces (PRMClassElement< GUM_SCALAR > *elt)
 Check that a given element respects all the class interfaces. More...
 
void __checkInterface (PRMClassElement< GUM_SCALAR > *elt, PRMInterface< GUM_SCALAR > *i)
 Check that a given element respects a specific interface. More...
 
void __checkRefInterfaces (PRMReferenceSlot< GUM_SCALAR > *elt)
 Check that a given element respects all the class interfaces. More...
 
void __checkRefInterface (PRMReferenceSlot< GUM_SCALAR > *elt, PRMInterface< GUM_SCALAR > *i)
 Check that a given element respects a specific interface. More...
 
void __addIOInterfaceFlags (PRMClassElement< GUM_SCALAR > *elt)
 Check if elt is present in an implementation. If it is, its IO flags are updated. More...
 
void __addExtension (PRMClass< GUM_SCALAR > *c)
 This method is called when a sub-Class<GUM_SCALAR> of this Class<GUM_SCALAR> is created. More...
 
bool __checkOverloadLegality (const PRMClassElement< GUM_SCALAR > *overloaded, const PRMClassElement< GUM_SCALAR > *overloader)
 Return true of overloaded can be overload by overloader. More...
 
void __overloadAttribute (PRMAttribute< GUM_SCALAR > *overloader, PRMAttribute< GUM_SCALAR > *overloaded)
 Overloads an attribute. More...
 
void __overloadAggregate (PRMAggregate< GUM_SCALAR > *overloader, PRMClassElement< GUM_SCALAR > *overloaded)
 Overloads an aggregate. More...
 
void __overloadReference (PRMReferenceSlot< GUM_SCALAR > *overloader, PRMReferenceSlot< GUM_SCALAR > *overloaded)
 Overloads a reference slot. More...
 
void __overloadParameter (PRMParameter< GUM_SCALAR > *overloader, PRMParameter< GUM_SCALAR > *overloaded)
 Overloads a parameter. More...
 

Built-in types.

enum  prm_type : char {
  prm_type::ALL, prm_type::CLASS, prm_type::PRM_INTERFACE, prm_type::CLASS_ELT,
  prm_type::TYPE, prm_type::SYSTEM, prm_type::INSTANCE
}
 Enumeration of the different types of objects handled by a PRM. More...
 
static std::string LEFT_CAST ()
 Enumeration of the different types of objects handled by a PRM. More...
 
static std::string RIGHT_CAST ()
 Enumeration of the different types of objects handled by a PRM. More...
 
static std::string enum2str (prm_type type)
 Returns the string representation of a PRMObject. More...
 
static INLINE bool isClass (const PRMObject &obj)
 Returns true if obj_ptr is of type Class. More...
 
static INLINE bool isInterface (const PRMObject &obj)
 Returns true if obj_ptr is of type PRMInterface. More...
 
static INLINE bool isInstance (const PRMObject &obj)
 Returns true if obj_ptr is of type PRMInstance. More...
 

Detailed Description

template<typename GUM_SCALAR>
class gum::prm::PRMClass< GUM_SCALAR >

A PRMClass is an object of a PRM representing a fragment of a Bayesian Network which can be instantiated in PRMInstance.

See also
PRMClassElement

Definition at line 63 of file PRMClass.h.

Member Enumeration Documentation

◆ prm_type

enum gum::prm::PRMObject::prm_type : char
stronginherited

Enumeration of the different types of objects handled by a PRM.

The "all" type is used to tell that we want any kind of PRMType (useful with iterators for example). No PRMObject will ever have "all" as type.

Enumerator
ALL 
CLASS 
PRM_INTERFACE 
CLASS_ELT 
TYPE 
SYSTEM 
INSTANCE 

Definition at line 66 of file PRMObject.h.

66  : char {
67  ALL,
68  CLASS,
69  PRM_INTERFACE,
70  CLASS_ELT,
71  TYPE,
72  SYSTEM,
73  INSTANCE
74  };

Constructor & Destructor Documentation

◆ PRMClass() [1/6]

template<typename GUM_SCALAR >
gum::prm::PRMClass< GUM_SCALAR >::PRMClass ( const std::string &  name)
explicit

Default constructor.

Parameters
nameThe class name.

Definition at line 37 of file PRMClass_tpl.h.

37  :
38  PRMClassElementContainer< GUM_SCALAR >(name), __superClass(nullptr),
39  __implements(nullptr), __bijection(nullptr) {
40  GUM_CONSTRUCTOR(PRMClass);
41  }
PRMClass< GUM_SCALAR > * __superClass
The alternate PRMClassElementContainer<GUM_SCALAR> searched for elements defined in this...
Definition: PRMClass.h:388
const std::string & name() const
Returns the name of this object.
Definition: PRMObject_inl.h:32
Set< PRMInterface< GUM_SCALAR > *> * __implements
The Set of implemented interface of this.
Definition: PRMClass.h:391
Bijection< const DiscreteVariable *, const DiscreteVariable *> * __bijection
The bijection between variables in super and variables in this The bijection&#39;s firsts are attributes ...
Definition: PRMClass.h:400
PRMClass(const std::string &name)
Default constructor.
Definition: PRMClass_tpl.h:37

◆ PRMClass() [2/6]

template<typename GUM_SCALAR>
gum::prm::PRMClass< GUM_SCALAR >::PRMClass ( const std::string &  name,
PRMClass< GUM_SCALAR > &  super,
bool  delayInheritance = false 
)

Constructor for building a subclass of super.

Parameters
nameThe subclass name.
superThe super Class<GUM_SCALAR> of this.
delayInheritanceIf true, inheritance will be delayed.

Definition at line 44 of file PRMClass_tpl.h.

46  :
47  PRMClassElementContainer< GUM_SCALAR >(name),
48  __superClass(&super), __implements(nullptr),
50  new Bijection< const DiscreteVariable*, const DiscreteVariable* >()) {
51  GUM_CONSTRUCTOR(PRMClass);
52  if (!delayInheritance) {
53  __dag = super.containerDag();
55  }
56  }
PRMClass< GUM_SCALAR > * __superClass
The alternate PRMClassElementContainer<GUM_SCALAR> searched for elements defined in this...
Definition: PRMClass.h:388
const std::string & name() const
Returns the name of this object.
Definition: PRMObject_inl.h:32
Set< PRMInterface< GUM_SCALAR > *> * __implements
The Set of implemented interface of this.
Definition: PRMClass.h:391
Bijection< const DiscreteVariable *, const DiscreteVariable *> * __bijection
The bijection between variables in super and variables in this The bijection&#39;s firsts are attributes ...
Definition: PRMClass.h:400
DAG __dag
The dag representing dependencies between formal attributes and slots.
Definition: PRMClass.h:339
PRMClass(const std::string &name)
Default constructor.
Definition: PRMClass_tpl.h:37
void __inheritClass(const PRMClass< GUM_SCALAR > &c)
Proceed with the copy when this inherits c.
Definition: PRMClass_tpl.h:312
const PRMClass< GUM_SCALAR > & super() const
Returns the super Class<GUM_SCALAR> of this Class<GUM_SCALAR>.

◆ PRMClass() [3/6]

template<typename GUM_SCALAR>
gum::prm::PRMClass< GUM_SCALAR >::PRMClass ( const std::string &  name,
const Set< PRMInterface< GUM_SCALAR > * > &  set,
bool  delayInheritance = false 
)

Constructor for building a Class<GUM_SCALAR> implementing several each interface in set.

Parameters
nameThe sub class name.
setThe Set of implemented interfaces.
delayInheritanceIf true, inheritance will be delayed.

Definition at line 59 of file PRMClass_tpl.h.

61  :
62  PRMClassElementContainer< GUM_SCALAR >(name),
63  __superClass(nullptr),
64  __implements(new Set< PRMInterface< GUM_SCALAR >* >(set)),
65  __bijection(nullptr) {
66  GUM_CONSTRUCTOR(PRMClass);
67 
68  if (!delayInheritance) { __implementInterfaces(false); }
69  }
PRMClass< GUM_SCALAR > * __superClass
The alternate PRMClassElementContainer<GUM_SCALAR> searched for elements defined in this...
Definition: PRMClass.h:388
const std::string & name() const
Returns the name of this object.
Definition: PRMObject_inl.h:32
friend class PRMInterface< GUM_SCALAR >
Definition: PRMClass.h:64
Set< PRMInterface< GUM_SCALAR > *> * __implements
The Set of implemented interface of this.
Definition: PRMClass.h:391
Bijection< const DiscreteVariable *, const DiscreteVariable *> * __bijection
The bijection between variables in super and variables in this The bijection&#39;s firsts are attributes ...
Definition: PRMClass.h:400
void __implementInterfaces(bool delayInheritance)
Proceed with the implementation of interfaces.
Definition: PRMClass_tpl.h:99
PRMClass(const std::string &name)
Default constructor.
Definition: PRMClass_tpl.h:37

◆ PRMClass() [4/6]

template<typename GUM_SCALAR>
gum::prm::PRMClass< GUM_SCALAR >::PRMClass ( const std::string &  name,
PRMClass< GUM_SCALAR > &  super,
const Set< PRMInterface< GUM_SCALAR > * > &  set,
bool  delayInheritance = false 
)

Constructor for building a subclass of super and implementing each interface in set.

Parameters
nameThe sub class name.
superThe super Class<GUM_SCALAR> of this.
setThe Set of implemented interfaces.
delayInheritanceIf true, inheritance will be delayed.

Definition at line 72 of file PRMClass_tpl.h.

75  :
76  PRMClassElementContainer< GUM_SCALAR >(name),
77  __superClass(&super), __implements(nullptr),
79  new Bijection< const DiscreteVariable*, const DiscreteVariable* >()) {
80  GUM_CONSTRUCTOR(PRMClass);
81  if (!delayInheritance) {
82  __dag = super.containerDag();
84  }
85 
86  // Adding other implementation
87  if (__implements == nullptr) { // super has not created __implements
88  __implements = new Set< PRMInterface< GUM_SCALAR >* >(set);
89  } else { // we just add the new implementations
90  for (const auto elt : set) {
91  __implements->insert(elt);
92  }
93  }
94 
95  if (!delayInheritance) { __implementInterfaces(false); }
96  }
PRMClass< GUM_SCALAR > * __superClass
The alternate PRMClassElementContainer<GUM_SCALAR> searched for elements defined in this...
Definition: PRMClass.h:388
const std::string & name() const
Returns the name of this object.
Definition: PRMObject_inl.h:32
Set< PRMInterface< GUM_SCALAR > *> * __implements
The Set of implemented interface of this.
Definition: PRMClass.h:391
Bijection< const DiscreteVariable *, const DiscreteVariable *> * __bijection
The bijection between variables in super and variables in this The bijection&#39;s firsts are attributes ...
Definition: PRMClass.h:400
DAG __dag
The dag representing dependencies between formal attributes and slots.
Definition: PRMClass.h:339
void __implementInterfaces(bool delayInheritance)
Proceed with the implementation of interfaces.
Definition: PRMClass_tpl.h:99
PRMClass(const std::string &name)
Default constructor.
Definition: PRMClass_tpl.h:37
void __inheritClass(const PRMClass< GUM_SCALAR > &c)
Proceed with the copy when this inherits c.
Definition: PRMClass_tpl.h:312
const PRMClass< GUM_SCALAR > & super() const
Returns the super Class<GUM_SCALAR> of this Class<GUM_SCALAR>.

◆ PRMClass() [5/6]

template<typename GUM_SCALAR>
gum::prm::PRMClass< GUM_SCALAR >::PRMClass ( const PRMClass< GUM_SCALAR > &  source)
delete

Copy constructor.

◆ PRMClass() [6/6]

template<typename GUM_SCALAR>
gum::prm::PRMClass< GUM_SCALAR >::PRMClass ( const PRMClass< GUM_SCALAR > &&  source)
delete

Move constructor.

◆ ~PRMClass()

template<typename GUM_SCALAR >
gum::prm::PRMClass< GUM_SCALAR >::~PRMClass ( )
virtual

Destructor.

Definition at line 117 of file PRMClass_tpl.h.

117  {
118  GUM_DESTRUCTOR(PRMClass);
119 
120  for (const auto& elt : __nodeIdMap) {
121  delete elt.second;
122  }
123 
124  if (__implements) { delete __implements; }
125 
126  if (__bijection) { delete __bijection; }
127  }
NodeProperty< PRMClassElement< GUM_SCALAR > *> __nodeIdMap
Mapping between node&#39;s id and their name (being an attribute or a slot). Used for fast access to a me...
Definition: PRMClass.h:343
Set< PRMInterface< GUM_SCALAR > *> * __implements
The Set of implemented interface of this.
Definition: PRMClass.h:391
Bijection< const DiscreteVariable *, const DiscreteVariable *> * __bijection
The bijection between variables in super and variables in this The bijection&#39;s firsts are attributes ...
Definition: PRMClass.h:400
PRMClass(const std::string &name)
Default constructor.
Definition: PRMClass_tpl.h:37

Member Function Documentation

◆ __addCastDescendants() [1/2]

template<typename GUM_SCALAR>
void gum::prm::PRMClass< GUM_SCALAR >::__addCastDescendants ( PRMClassElement< GUM_SCALAR > *  attr)
private

Recursively adds cast descendant of attr in this Class<GUM_SCALAR>.

Definition at line 692 of file PRMClass_tpl.h.

693  {
694  auto parent = attr;
695  PRMAttribute< GUM_SCALAR >* child = 0;
696 
697  while (parent->type().isSubType()) {
698  child = parent->getCastDescendant();
699 
700  // Check if id was reserved by one of the class interfaces
701  bool found = false;
702  try {
703  for (auto i : implements()) {
704  if (i->exists(child->safeName())) {
705  child->setId(i->get(child->safeName()).id());
706  found = true;
707  break;
708  }
709  }
710  } catch (NotFound&) {
711  // No interface
712  }
713  if (!found) {
714  child->setId(nextNodeId());
715  __dag.addNodeWithId(child->id());
716  }
717  __nodeIdMap.insert(child->id(), child);
718  // Only use child's safe name when adding to the name map!
719  __nameMap.insert(child->safeName(), child);
720  __attributes.insert(child);
721  // Do not use Class<GUM_SCALAR>::insertArc(), child's CPF is already
722  // initialized properly
723  __dag.addArc(parent->id(), child->id());
724 
725  parent = child;
726  }
727  }
const Set< PRMInterface< GUM_SCALAR > *> & implements() const
Returns the Set of PRMInterface<GUM_SCALAR> implemented by this Class<GUM_SCALAR>.
virtual void addNodeWithId(const NodeId id)
try to insert a node with the given id
NodeProperty< PRMClassElement< GUM_SCALAR > *> __nodeIdMap
Mapping between node&#39;s id and their name (being an attribute or a slot). Used for fast access to a me...
Definition: PRMClass.h:343
DAG __dag
The dag representing dependencies between formal attributes and slots.
Definition: PRMClass.h:339
virtual void addArc(const NodeId tail, const NodeId head)
insert a new arc into the directed graph
Definition: DAG_inl.h:40
NodeId nextNodeId()
Returns the next value of an unique counter for PRM&#39;s node id.
Definition: utils_prm.cpp:63
Set< PRMAttribute< GUM_SCALAR > *> __attributes
The sequence of PRMAttribute<GUM_SCALAR>s.
Definition: PRMClass.h:356
HashTable< std::string, PRMClassElement< GUM_SCALAR > *> __nameMap
Mapping between a member&#39;s name and itself. Used for fast access to a member given it&#39;s name...
Definition: PRMClass.h:353

◆ __addCastDescendants() [2/2]

template<typename GUM_SCALAR>
void gum::prm::PRMClass< GUM_SCALAR >::__addCastDescendants ( PRMAttribute< GUM_SCALAR > *  start,
PRMAttribute< GUM_SCALAR > *  end 
)
private

Recursively adds cast descendant from start to end in this Class<GUM_SCALAR>.

Definition at line 940 of file PRMClass_tpl.h.

941  {
942  PRMAttribute< GUM_SCALAR >* parent = start;
943  PRMAttribute< GUM_SCALAR >* child = 0;
944 
945  while (parent->type().superType() != end->type()) {
946  child = parent->getCastDescendant();
947  child->setId(nextNodeId());
948  __nodeIdMap.insert(child->id(), child);
949  __dag.addNodeWithId(child->id());
950  // Only use child's safe name when adding to the name map!
951  __nameMap.insert(child->safeName(), child);
952  __attributes.insert(child);
953  __addIOInterfaceFlags(child);
954  // Do not use Class<GUM_SCALAR>::insertArc(), child's CPF is already
955  // initialized properly
956  __dag.addArc(parent->id(), child->id());
957  parent = child;
958  }
959 
960  parent->setAsCastDescendant(end);
961  __dag.addArc(parent->id(), end->id());
962  }
virtual void addNodeWithId(const NodeId id)
try to insert a node with the given id
NodeProperty< PRMClassElement< GUM_SCALAR > *> __nodeIdMap
Mapping between node&#39;s id and their name (being an attribute or a slot). Used for fast access to a me...
Definition: PRMClass.h:343
DAG __dag
The dag representing dependencies between formal attributes and slots.
Definition: PRMClass.h:339
virtual void addArc(const NodeId tail, const NodeId head)
insert a new arc into the directed graph
Definition: DAG_inl.h:40
NodeId nextNodeId()
Returns the next value of an unique counter for PRM&#39;s node id.
Definition: utils_prm.cpp:63
void __addIOInterfaceFlags(PRMClassElement< GUM_SCALAR > *elt)
Check if elt is present in an implementation. If it is, its IO flags are updated. ...
Definition: PRMClass_tpl.h:974
Set< PRMAttribute< GUM_SCALAR > *> __attributes
The sequence of PRMAttribute<GUM_SCALAR>s.
Definition: PRMClass.h:356
HashTable< std::string, PRMClassElement< GUM_SCALAR > *> __nameMap
Mapping between a member&#39;s name and itself. Used for fast access to a member given it&#39;s name...
Definition: PRMClass.h:353

◆ __addExtension()

template<typename GUM_SCALAR>
INLINE void gum::prm::PRMClass< GUM_SCALAR >::__addExtension ( PRMClass< GUM_SCALAR > *  c)
private

This method is called when a sub-Class<GUM_SCALAR> of this Class<GUM_SCALAR> is created.

Parameters
cThe Class<GUM_SCALAR> added as a direct sub-Class<GUM_SCALAR> of this.
Exceptions
DuplicateElementRaised if c is already a sub-Class<GUM_SCALAR> of this.

Definition at line 1256 of file PRMClass_tpl.h.

Referenced by gum::prm::PRMClass< double >::__inheritClass(), and gum::prm::PRMClass< double >::initializeInheritance().

1256  {
1257  __extensions.insert(c);
1258  }
Set< PRMClass< GUM_SCALAR > *> __extensions
The set of Class<GUM_SCALAR> which are extension of this Class<GUM_SCALAR> (i.e. direct subtypes)...
Definition: PRMClass.h:395
+ Here is the caller graph for this function:

◆ __addIOInterfaceFlags()

template<typename GUM_SCALAR>
void gum::prm::PRMClass< GUM_SCALAR >::__addIOInterfaceFlags ( PRMClassElement< GUM_SCALAR > *  elt)
private

Check if elt is present in an implementation. If it is, its IO flags are updated.

Definition at line 974 of file PRMClass_tpl.h.

975  {
976  // We only add IO Flags if elt matches is required by and interface
977  if (__implements != nullptr) {
978  for (const auto impl : *__implements) {
980  while (super) {
981  // If the attribute is defined in an interface, we set it as an
982  // OutputNode
983  if (impl->exists(elt->name())) {
984  try {
985  this->_getIOFlag(*elt).second = true;
986  } catch (NotFound&) {
987  this->_setIOFlag(*elt, std::make_pair(false, true));
988  }
989  }
990  try {
991  super = &(super->super());
992  } catch (NotFound&) { super = nullptr; }
993  }
994  }
995  }
996  }
friend class PRMInterface< GUM_SCALAR >
Definition: PRMClass.h:64
Set< PRMInterface< GUM_SCALAR > *> * __implements
The Set of implemented interface of this.
Definition: PRMClass.h:391
virtual std::pair< bool, bool > & _getIOFlag(const PRMClassElement< GUM_SCALAR > &elt)
Returns the IO flags of a PRMClassElement<GUM_SCALAR>.
virtual void _setIOFlag(const PRMClassElement< GUM_SCALAR > &elt, const std::pair< bool, bool > &flags)
Defines the IO flags of a PRMClassElement<GUM_SCALAR>.
const PRMClass< GUM_SCALAR > & super() const
Returns the super Class<GUM_SCALAR> of this Class<GUM_SCALAR>.

◆ __checkInterface()

template<typename GUM_SCALAR>
void gum::prm::PRMClass< GUM_SCALAR >::__checkInterface ( PRMClassElement< GUM_SCALAR > *  elt,
PRMInterface< GUM_SCALAR > *  i 
)
private

Check that a given element respects a specific interface.

Definition at line 539 of file PRMClass_tpl.h.

540  {
541  const auto& i_elt = i->get(elt->name());
542  bool is_attr = PRMClassElement< GUM_SCALAR >::isAttribute(i_elt);
543  bool is_agg = PRMClassElement< GUM_SCALAR >::isAggregate(i_elt);
544 
545  if (!(is_attr || is_agg)) {
546  GUM_ERROR(OperationNotAllowed, "Class does not respect it's interface");
547  }
548 
549  if (!elt->type().isSubTypeOf(i_elt.type())) {
550  GUM_ERROR(OperationNotAllowed,
551  "Attribute type does not respect class interface");
552  }
553 
554  if (elt->type() != i_elt.type()) {
555  if (!this->exists(i_elt.safeName())) {
556  GUM_ERROR(OperationNotAllowed,
557  "Attribute type does not respect class interface");
558  }
559  elt = &(this->get(i_elt.safeName()));
560  }
561 
562  // Node must be reserved by constructor
563  if (!__dag.existsNode(i_elt.id())) {
564  GUM_ERROR(FatalError, "Class does not reserved implemented nodes");
565  }
566 
567  // Removing unused node and changing to proper node
568  if (elt->id() != i_elt.id()) {
569  // Update cast descendants
570  for (auto child : __dag.children(elt->id())) {
571  __dag.addArc(i_elt.id(), child);
572  }
573  __dag.eraseNode(elt->id());
574  }
575  __nodeIdMap.erase(elt->id());
576  elt->setId(i_elt.id());
577  __nodeIdMap.insert(elt->id(), elt);
578  }
NodeProperty< PRMClassElement< GUM_SCALAR > *> __nodeIdMap
Mapping between node&#39;s id and their name (being an attribute or a slot). Used for fast access to a me...
Definition: PRMClass.h:343
virtual bool exists(const std::string &name) const
Returns true if a member with the given name exists in this PRMClassElementContainer or in the PRMCla...
static INLINE bool isAttribute(const PRMClassElement< GUM_SCALAR > &elt)
Returns true if obj_ptr is of type PRMAttribute.
DAG __dag
The dag representing dependencies between formal attributes and slots.
Definition: PRMClass.h:339
virtual void addArc(const NodeId tail, const NodeId head)
insert a new arc into the directed graph
Definition: DAG_inl.h:40
bool existsNode(const NodeId id) const
returns true iff the NodeGraphPart contains the given nodeId
const NodeSet & children(const NodeId id) const
returns the set of nodes with arc outgoing from a given node
static INLINE bool isAggregate(const PRMClassElement< GUM_SCALAR > &elt)
Return true if obj is of type PRMAggregate.
virtual void eraseNode(const NodeId id)
remove a node and its adjacent arcs from the graph
Definition: diGraph_inl.h:66
#define GUM_ERROR(type, msg)
Definition: exceptions.h:52

◆ __checkInterfaces()

template<typename GUM_SCALAR>
void gum::prm::PRMClass< GUM_SCALAR >::__checkInterfaces ( PRMClassElement< GUM_SCALAR > *  elt)
private

Check that a given element respects all the class interfaces.

Definition at line 526 of file PRMClass_tpl.h.

527  {
528  try {
529  for (auto i : implements()) {
530  if (i->exists(elt->name())) { __checkInterface(elt, i); }
531  }
532  } catch (NotFound&) {
533  // No interface
534  }
535  }
const Set< PRMInterface< GUM_SCALAR > *> & implements() const
Returns the Set of PRMInterface<GUM_SCALAR> implemented by this Class<GUM_SCALAR>.
void __checkInterface(PRMClassElement< GUM_SCALAR > *elt, PRMInterface< GUM_SCALAR > *i)
Check that a given element respects a specific interface.
Definition: PRMClass_tpl.h:539

◆ __checkOverloadLegality()

template<typename GUM_SCALAR>
INLINE bool gum::prm::PRMClass< GUM_SCALAR >::__checkOverloadLegality ( const PRMClassElement< GUM_SCALAR > *  overloaded,
const PRMClassElement< GUM_SCALAR > *  overloader 
)
private

Return true of overloaded can be overload by overloader.

Definition at line 1208 of file PRMClass_tpl.h.

1210  {
1211  if (overloaded->elt_type() != overloader->elt_type()) { return false; }
1212 
1213  switch (overloaded->elt_type()) {
1215  if (!overloader->type().isSubTypeOf(overloaded->type())) {
1216  return false;
1217  }
1218  break;
1219  }
1220 
1222  const auto& new_slot_type =
1223  static_cast< const PRMReferenceSlot< GUM_SCALAR >* >(overloader)
1224  ->slotType();
1225  const auto& old_slot_type =
1226  static_cast< const PRMReferenceSlot< GUM_SCALAR >* >(overloaded)
1227  ->slotType();
1228 
1229  if (!new_slot_type.isSubTypeOf(old_slot_type)) { return false; }
1230 
1231  break;
1232  }
1233 
1235  auto overloaded_param =
1236  static_cast< const PRMParameter< GUM_SCALAR >* >(overloaded);
1237  auto overloader_param =
1238  static_cast< const PRMParameter< GUM_SCALAR >* >(overloader);
1239 
1240  return overloaded_param->valueType() == overloader_param->valueType();
1241  break;
1242  }
1243 
1244  default: { return false; }
1245  }
1246  return true;
1247  }

◆ __checkRefInterface()

template<typename GUM_SCALAR>
void gum::prm::PRMClass< GUM_SCALAR >::__checkRefInterface ( PRMReferenceSlot< GUM_SCALAR > *  elt,
PRMInterface< GUM_SCALAR > *  i 
)
private

Check that a given element respects a specific interface.

Definition at line 593 of file PRMClass_tpl.h.

594  {
595  auto& i_elt = i->get(ref->name());
596  if (i_elt.elt_type() != ref->elt_type()) {
597  GUM_ERROR(OperationNotAllowed, "Class does not respect it's interface");
598  }
599  auto& i_ref = static_cast< PRMReferenceSlot< GUM_SCALAR >& >(i_elt);
600  if (!ref->slotType().isSubTypeOf(i_ref.slotType())) {
601  GUM_ERROR(OperationNotAllowed,
602  "ReferenceSlot type does not respect class interface");
603  }
604  // Node must be reserved by constructor
605  if (!__dag.exists(i_ref.id())) {
606  GUM_ERROR(FatalError,
607  "class " << this->name() << " does not respect interface "
608  << i->name() << " implementation");
609  }
610  // Removing unused node and changin to propoer node
611  if (ref->id() != i_ref.id()) { __dag.eraseNode(ref->id()); }
612  __nodeIdMap.erase(ref->id());
613  ref->setId(i_ref.id());
614  __nodeIdMap.insert(ref->id(), ref);
615  }
const std::string & name() const
Returns the name of this object.
Definition: PRMObject_inl.h:32
NodeProperty< PRMClassElement< GUM_SCALAR > *> __nodeIdMap
Mapping between node&#39;s id and their name (being an attribute or a slot). Used for fast access to a me...
Definition: PRMClass.h:343
bool exists(const NodeId id) const
alias for existsNode
DAG __dag
The dag representing dependencies between formal attributes and slots.
Definition: PRMClass.h:339
virtual void eraseNode(const NodeId id)
remove a node and its adjacent arcs from the graph
Definition: diGraph_inl.h:66
#define GUM_ERROR(type, msg)
Definition: exceptions.h:52

◆ __checkRefInterfaces()

template<typename GUM_SCALAR>
void gum::prm::PRMClass< GUM_SCALAR >::__checkRefInterfaces ( PRMReferenceSlot< GUM_SCALAR > *  elt)
private

Check that a given element respects all the class interfaces.

Definition at line 581 of file PRMClass_tpl.h.

582  {
583  try {
584  for (auto i : implements()) {
585  if (i->exists(ref->name())) { __checkRefInterface(ref, i); }
586  }
587  } catch (NotFound&) {
588  // No interface to check
589  }
590  }
const Set< PRMInterface< GUM_SCALAR > *> & implements() const
Returns the Set of PRMInterface<GUM_SCALAR> implemented by this Class<GUM_SCALAR>.
void __checkRefInterface(PRMReferenceSlot< GUM_SCALAR > *elt, PRMInterface< GUM_SCALAR > *i)
Check that a given element respects a specific interface.
Definition: PRMClass_tpl.h:593

◆ __implementInterfaces()

template<typename GUM_SCALAR >
void gum::prm::PRMClass< GUM_SCALAR >::__implementInterfaces ( bool  delayInheritance)
private

Proceed with the implementation of interfaces.

Definition at line 99 of file PRMClass_tpl.h.

99  {
100  for (const auto impl : *__implements) {
101  impl->__addImplementation(this);
102  if ((!__superClass) || (!super().isSubTypeOf(*impl))
103  || delayedInheritance) {
104  // Reserve reference id in DAG
105  for (auto ref : impl->referenceSlots()) {
106  __dag.addNodeWithId(ref->id());
107  }
108  // Reserve attribute id in DAG
109  for (auto attr : impl->attributes()) {
110  __dag.addNodeWithId(attr->id());
111  }
112  }
113  }
114  }
virtual void addNodeWithId(const NodeId id)
try to insert a node with the given id
PRMClass< GUM_SCALAR > * __superClass
The alternate PRMClassElementContainer<GUM_SCALAR> searched for elements defined in this...
Definition: PRMClass.h:388
Set< PRMInterface< GUM_SCALAR > *> * __implements
The Set of implemented interface of this.
Definition: PRMClass.h:391
DAG __dag
The dag representing dependencies between formal attributes and slots.
Definition: PRMClass.h:339
virtual bool isSubTypeOf(const PRMClassElementContainer< GUM_SCALAR > &cec) const
Test if this Class<GUM_SCALAR> is a subclass of cec.
Definition: PRMClass_tpl.h:442
const PRMClass< GUM_SCALAR > & super() const
Returns the super Class<GUM_SCALAR> of this Class<GUM_SCALAR>.

◆ __inheritClass()

template<typename GUM_SCALAR>
void gum::prm::PRMClass< GUM_SCALAR >::__inheritClass ( const PRMClass< GUM_SCALAR > &  c)
private

Proceed with the copy when this inherits c.

Definition at line 312 of file PRMClass_tpl.h.

312  {
313  if (__superClass) {
314  __superClass->__addExtension(this);
315  // Adding implemented interfaces of c, if any
316  if (c.__implements) {
317  if (!__implements) {
318  __implements =
319  new Set< PRMInterface< GUM_SCALAR >* >(*(c.__implements));
320  } else {
321  for (auto i : *(c.__implements)) {
322  __implements->insert(i);
323  }
324  }
325  }
326 
327  // Copying attributes, the bijection's firsts are attributes in this and
328  // its
329  // seconds are attributes
330  // in c.
331  Bijection< const DiscreteVariable*, const DiscreteVariable* > bij;
332 
333  // Copying parameters
334  for (const auto c_param : c.__parameters) {
335  auto param = new PRMParameter< GUM_SCALAR >(
336  c_param->name(), c_param->valueType(), c_param->value());
337 
338  __parameters.insert(param);
339 
340  param->setId(c_param->id());
341  __nodeIdMap.insert(param->id(), param);
342  __nameMap.insert(param->name(), param);
343  }
344 
345  // Copying attributes
346  for (const auto c_attr : c.__attributes) {
347  // using multiDimSparse to prevent unecessary memory allocation for
348  // large arrays (the potentials are copied latter)
349  auto attr = c_attr->newFactory(*this);
350 
351  bij.insert(&(c_attr->type().variable()), &(attr->type().variable()));
352  attr->setId(c_attr->id());
353  __nodeIdMap.insert(attr->id(), attr);
354  __attributes.insert(attr);
355 
356  if (c.__nameMap[c_attr->name()] == c.__nameMap[c_attr->safeName()]) {
357  __nameMap.insert(attr->name(), attr);
358  }
359 
360  __nameMap.insert(attr->safeName(), attr);
361  }
362 
363  // Copying aggregates
364  for (const auto c_agg : c.__aggregates) {
365  PRMAggregate< GUM_SCALAR >* agg = nullptr;
366 
367  try {
368  agg = new PRMAggregate< GUM_SCALAR >(
369  c_agg->name(), c_agg->agg_type(), c_agg->type(), c_agg->label());
370  } catch (OperationNotAllowed&) {
371  agg = new PRMAggregate< GUM_SCALAR >(
372  c_agg->name(), c_agg->agg_type(), c_agg->type());
373  }
374 
375  bij.insert(&(c_agg->type().variable()), &(agg->type().variable()));
376  agg->setId(c_agg->id());
377  __nodeIdMap.insert(agg->id(), agg);
378  __aggregates.insert(agg);
379 
380  if (c.__nameMap[c_agg->name()] == c.__nameMap[c_agg->safeName()])
381  __nameMap.insert(agg->name(), agg);
382 
383  __nameMap.insert(agg->safeName(), agg);
384  }
385 
386  // Copying reference slots
387  for (const auto c_refslot : c.__referenceSlots) {
388  PRMReferenceSlot< GUM_SCALAR >* ref = new PRMReferenceSlot< GUM_SCALAR >(
389  c_refslot->name(),
390  const_cast< PRMClassElementContainer< GUM_SCALAR >& >(
391  c_refslot->slotType()),
392  c_refslot->isArray());
393 
394  ref->setId(c_refslot->id());
395  __nodeIdMap.insert(ref->id(), ref);
396  __referenceSlots.insert(ref);
397 
398  if (c.__nameMap[c_refslot->name()] == c.__nameMap[c_refslot->safeName()])
399  __nameMap.insert(ref->name(), ref);
400 
401  __nameMap.insert(ref->safeName(), ref);
402  }
403 
404  // Copying slot chains
405  for (const auto c_slotchain : c.__slotChains) {
406  // We just need to change the first PRMReferenceSlot<GUM_SCALAR> in
407  // the
408  // chain
409  Sequence< PRMClassElement< GUM_SCALAR >* > chain(c_slotchain->chain());
410 
411  chain.setAtPos(0, __nameMap[c_slotchain->chain().front()->name()]);
412 
413  PRMSlotChain< GUM_SCALAR >* sc =
414  new PRMSlotChain< GUM_SCALAR >(c_slotchain->name(), chain);
415  bij.insert(&(c_slotchain->type().variable()), &(sc->type().variable()));
416  sc->setId(c_slotchain->id());
417  __nodeIdMap.insert(sc->id(), sc);
418  __slotChains.insert(sc);
419 
420  __nameMap.insert(sc->name(), sc);
421  __nameMap.insert(sc->safeName(), sc);
422  }
423 
424  // Copying dependencies yield by arcs
425  for (const auto& arc : c.containerDag().arcs()) {
426  __nodeIdMap[arc.tail()]->addChild(*(__nodeIdMap[arc.head()]));
427  __nodeIdMap[arc.head()]->addParent(*(__nodeIdMap[arc.tail()]));
428  }
429 
430  // Copying the IO flag
431  this->_copyIOFlags(c);
432  // Copying content of CPF
433  for (const auto attr : c.__attributes) {
434  auto a = static_cast< PRMAttribute< GUM_SCALAR >* >(
435  __nameMap[attr->safeName()]);
436  a->copyCpf(bij, *attr);
437  }
438  }
439  }
PRMClass< GUM_SCALAR > * __superClass
The alternate PRMClassElementContainer<GUM_SCALAR> searched for elements defined in this...
Definition: PRMClass.h:388
Set< PRMReferenceSlot< GUM_SCALAR > *> __referenceSlots
The sequence of PRMReferenceSlot<GUM_SCALAR>.
Definition: PRMClass.h:359
NodeProperty< PRMClassElement< GUM_SCALAR > *> __nodeIdMap
Mapping between node&#39;s id and their name (being an attribute or a slot). Used for fast access to a me...
Definition: PRMClass.h:343
Set< PRMAggregate< GUM_SCALAR > *> __aggregates
The sequence of aggregate.
Definition: PRMClass.h:362
virtual void _copyIOFlags(const PRMClassElementContainer< GUM_SCALAR > &c)
Copy the IO Flags of c in this PRMClassElementContainer.
Set< PRMSlotChain< GUM_SCALAR > *> __slotChains
The set of gum::PRMSlotChain<GUM_SCALAR>s.
Definition: PRMClass.h:365
Set< PRMInterface< GUM_SCALAR > *> * __implements
The Set of implemented interface of this.
Definition: PRMClass.h:391
Set< PRMAttribute< GUM_SCALAR > *> __attributes
The sequence of PRMAttribute<GUM_SCALAR>s.
Definition: PRMClass.h:356
HashTable< std::string, PRMClassElement< GUM_SCALAR > *> __nameMap
Mapping between a member&#39;s name and itself. Used for fast access to a member given it&#39;s name...
Definition: PRMClass.h:353
Set< PRMParameter< GUM_SCALAR > *> __parameters
The Set of parameters in this Class<GUM_SCALAR>.
Definition: PRMClass.h:368

◆ __overloadAggregate()

template<typename GUM_SCALAR>
INLINE void gum::prm::PRMClass< GUM_SCALAR >::__overloadAggregate ( PRMAggregate< GUM_SCALAR > *  overloader,
PRMClassElement< GUM_SCALAR > *  overloaded 
)
private

Overloads an aggregate.

Definition at line 1200 of file PRMClass_tpl.h.

1202  {
1203  __nameMap.insert(overloader->safeName(), overloader);
1204  __aggregates.insert(overloader);
1205  }
Set< PRMAggregate< GUM_SCALAR > *> __aggregates
The sequence of aggregate.
Definition: PRMClass.h:362
HashTable< std::string, PRMClassElement< GUM_SCALAR > *> __nameMap
Mapping between a member&#39;s name and itself. Used for fast access to a member given it&#39;s name...
Definition: PRMClass.h:353

◆ __overloadAttribute()

template<typename GUM_SCALAR>
void gum::prm::PRMClass< GUM_SCALAR >::__overloadAttribute ( PRMAttribute< GUM_SCALAR > *  overloader,
PRMAttribute< GUM_SCALAR > *  overloaded 
)
private

Overloads an attribute.

Definition at line 804 of file PRMClass_tpl.h.

806  {
807  __dag.eraseParents(overloaded->id());
808 
809  // Checking if we have to add cast descendant
810  if (overloader->type() != overloaded->type()) {
811  overloader->setId(nextNodeId());
812  __dag.addNodeWithId(overloader->id());
813  __nodeIdMap.insert(overloader->id(), overloader);
814  __nameMap[overloader->name()] = overloader;
815  __nameMap.insert(overloader->safeName(), overloader);
816  __attributes.insert(overloader);
817  __addCastDescendants(overloader, overloaded);
818  } else {
819  overloader->setId(overloaded->id());
820  __nodeIdMap[overloader->id()] = overloader;
821  __nameMap[overloader->name()] = overloader;
822  __nameMap[overloader->safeName()] = overloader;
823  __attributes.erase(overloaded);
824  __attributes.insert(overloader);
825  overloader->overload(overloaded);
826  delete overloaded;
827  }
828  }
virtual void addNodeWithId(const NodeId id)
try to insert a node with the given id
NodeProperty< PRMClassElement< GUM_SCALAR > *> __nodeIdMap
Mapping between node&#39;s id and their name (being an attribute or a slot). Used for fast access to a me...
Definition: PRMClass.h:343
DAG __dag
The dag representing dependencies between formal attributes and slots.
Definition: PRMClass.h:339
NodeId nextNodeId()
Returns the next value of an unique counter for PRM&#39;s node id.
Definition: utils_prm.cpp:63
Set< PRMAttribute< GUM_SCALAR > *> __attributes
The sequence of PRMAttribute<GUM_SCALAR>s.
Definition: PRMClass.h:356
HashTable< std::string, PRMClassElement< GUM_SCALAR > *> __nameMap
Mapping between a member&#39;s name and itself. Used for fast access to a member given it&#39;s name...
Definition: PRMClass.h:353
void __addCastDescendants(PRMClassElement< GUM_SCALAR > *attr)
Recursively adds cast descendant of attr in this Class<GUM_SCALAR>.
Definition: PRMClass_tpl.h:692
void eraseParents(const NodeId id)
erase all the parents of a given node

◆ __overloadParameter()

template<typename GUM_SCALAR>
void gum::prm::PRMClass< GUM_SCALAR >::__overloadParameter ( PRMParameter< GUM_SCALAR > *  overloader,
PRMParameter< GUM_SCALAR > *  overloaded 
)
private

Overloads a parameter.

Definition at line 927 of file PRMClass_tpl.h.

929  {
930  overloader->setId(overloaded->id());
931  __nodeIdMap[overloader->id()] = overloader;
932  __nameMap[overloader->name()] = overloader;
933  __nameMap[overloader->safeName()] = overloader;
934  __parameters.erase(overloaded);
935  __parameters.insert(overloader);
936  delete overloaded;
937  }
NodeProperty< PRMClassElement< GUM_SCALAR > *> __nodeIdMap
Mapping between node&#39;s id and their name (being an attribute or a slot). Used for fast access to a me...
Definition: PRMClass.h:343
HashTable< std::string, PRMClassElement< GUM_SCALAR > *> __nameMap
Mapping between a member&#39;s name and itself. Used for fast access to a member given it&#39;s name...
Definition: PRMClass.h:353
Set< PRMParameter< GUM_SCALAR > *> __parameters
The Set of parameters in this Class<GUM_SCALAR>.
Definition: PRMClass.h:368

◆ __overloadReference()

template<typename GUM_SCALAR>
void gum::prm::PRMClass< GUM_SCALAR >::__overloadReference ( PRMReferenceSlot< GUM_SCALAR > *  overloader,
PRMReferenceSlot< GUM_SCALAR > *  overloaded 
)
private

Overloads a reference slot.

Definition at line 831 of file PRMClass_tpl.h.

833  {
834  // Adding overloading reference
835  overloader->setId(overloaded->id());
836  __nodeIdMap[overloader->id()] = overloader;
837  __nameMap[overloader->name()] = overloader;
838  __nameMap.insert(overloader->safeName(), overloader);
839  __referenceSlots.insert(overloader);
840  PRMSlotChain< GUM_SCALAR >* sc = 0;
841  PRMReferenceSlot< GUM_SCALAR >* ref = 0;
842  PRMClassElement< GUM_SCALAR >* next = 0;
843  std::vector< PRMSlotChain< GUM_SCALAR >* > toRemove, toAdd;
844 
845  // Updating PRMSlotChain<GUM_SCALAR> which started with overloaded
846  for (const auto slotchain : __slotChains) {
847  // If the attribute pointed by this slotchain is overloaded, we need to
848  // change the slotchain
849  // names to it's safename version: ref.attr is replaced by
850  // ref.(type)attr.
851  if ((slotchain->chain().atPos(0) == overloaded)) {
852  Sequence< PRMClassElement< GUM_SCALAR >* > seq;
853  seq.insert(overloader);
854 
855  auto elt = ++(slotchain->chain().begin());
856 
857  while (elt != slotchain->chain().end()) {
858  ref = static_cast< PRMReferenceSlot< GUM_SCALAR >* >(seq.back());
859  next = &(ref->slotType().get((*elt)->name()));
860  seq.insert(next);
861  ++elt;
862  }
863 
864  // If the slotchain last element type changes, we change the slotchain
865  // to
866  // point towards the cast decendant
867  // with the correct type
868  if (seq.back()->type() != slotchain->lastElt().type()) {
869  seq.erase(seq.back());
870  seq.insert(&(static_cast< PRMReferenceSlot< GUM_SCALAR >* >(seq.back())
871  ->slotType()
872  .get(slotchain->lastElt().safeName())));
873  std::string sc_name;
874  std::string dot = ".";
875 
876  for (Size i = 0; i < seq.size() - 1; ++i) {
877  sc_name += seq.atPos(i)->name() + dot;
878  }
879 
880  sc_name += seq.back()->safeName();
881  sc = new PRMSlotChain< GUM_SCALAR >(sc_name, seq);
882  sc->setId(slotchain->id());
883 
884  for (const auto child : this->containerDag().children(sc->id())) {
885  auto& elt = get(child);
887  auto& attr = static_cast< PRMAttribute< GUM_SCALAR >& >(elt);
888  auto& old_type = slotchain->lastElt().type();
889  auto& new_type = sc->lastElt().type();
890  attr.swap(old_type, new_type);
891  } else {
892  GUM_ERROR(OperationNotAllowed, "unexpected ClassElement");
893  // get( child ).cpf().replace(
894  // slotchain->lastElt().type().variable(),
895  // sc->lastElt().type().variable() );
896  }
897  }
898 
899  toAdd.push_back(sc);
900  toRemove.push_back(slotchain);
901  } else {
902  // Types are identical, we just need to change the first reference
903  slotchain->chain().setAtPos(0, overloader);
904  }
905  }
906  }
907 
908  for (const auto torem : toRemove) {
909  __nameMap.erase(torem->name());
910  __slotChains.erase(torem);
911  delete torem;
912  }
913 
914  for (const auto toadd : toAdd) {
915  __nameMap.insert(toadd->name(), toadd);
916  __nodeIdMap[toadd->id()] = toadd;
917  __slotChains.insert(sc);
918  }
919 
920  // Removing overloaded PRMReferenceSlot<GUM_SCALAR>
921  __referenceSlots.erase(overloaded);
922  __nameMap.erase(overloaded->safeName());
923  delete overloaded;
924  }
Set< PRMReferenceSlot< GUM_SCALAR > *> __referenceSlots
The sequence of PRMReferenceSlot<GUM_SCALAR>.
Definition: PRMClass.h:359
NodeProperty< PRMClassElement< GUM_SCALAR > *> __nodeIdMap
Mapping between node&#39;s id and their name (being an attribute or a slot). Used for fast access to a me...
Definition: PRMClass.h:343
static INLINE bool isAttribute(const PRMClassElement< GUM_SCALAR > &elt)
Returns true if obj_ptr is of type PRMAttribute.
Set< PRMSlotChain< GUM_SCALAR > *> __slotChains
The set of gum::PRMSlotChain<GUM_SCALAR>s.
Definition: PRMClass.h:365
const NodeSet & children(const NodeId id) const
returns the set of nodes with arc outgoing from a given node
std::size_t Size
In aGrUM, hashed values are unsigned long int.
Definition: types.h:45
HashTable< std::string, PRMClassElement< GUM_SCALAR > *> __nameMap
Mapping between a member&#39;s name and itself. Used for fast access to a member given it&#39;s name...
Definition: PRMClass.h:353
virtual const DAG & containerDag() const
Returns the gum::DAG of this PRMClassElementContainer.
#define GUM_ERROR(type, msg)
Definition: exceptions.h:52

◆ _copyIOFlags()

template<typename GUM_SCALAR>
void gum::prm::PRMClassElementContainer< GUM_SCALAR >::_copyIOFlags ( const PRMClassElementContainer< GUM_SCALAR > &  c)
protectedvirtualinherited

Copy the IO Flags of c in this PRMClassElementContainer.

Parameters
cA PRMClassElementContainer.

Definition at line 34 of file PRMClassElementContainer_tpl.h.

35  {
36  for (const auto& flag : c.__IOFlags)
37  _setIOFlag(get(flag.first), flag.second);
38  }
virtual void _setIOFlag(const PRMClassElement< GUM_SCALAR > &elt, const std::pair< bool, bool > &flags)
Defines the IO flags of a PRMClassElement<GUM_SCALAR>.

◆ _dag() [1/2]

template<typename GUM_SCALAR >
INLINE const DAG & gum::prm::PRMClass< GUM_SCALAR >::_dag ( ) const
protectedvirtual

returns a constant reference over this interface's dag.

Implements gum::prm::PRMClassElementContainer< GUM_SCALAR >.

Definition at line 1015 of file PRMClass_tpl.h.

1015  {
1016  return __dag;
1017  }
DAG __dag
The dag representing dependencies between formal attributes and slots.
Definition: PRMClass.h:339

◆ _dag() [2/2]

template<typename GUM_SCALAR >
INLINE DAG & gum::prm::PRMClass< GUM_SCALAR >::_dag ( )
protectedvirtual

Returns a non constant reference over this PRMInterface<GUM_SCALAR>'s DAG.

Implements gum::prm::PRMClassElementContainer< GUM_SCALAR >.

Definition at line 1020 of file PRMClass_tpl.h.

1020  {
1021  return __dag;
1022  }
DAG __dag
The dag representing dependencies between formal attributes and slots.
Definition: PRMClass.h:339

◆ _findAllSubtypes()

template<typename GUM_SCALAR>
void gum::prm::PRMClass< GUM_SCALAR >::_findAllSubtypes ( Set< PRMClassElementContainer< GUM_SCALAR > * > &  set)
protectedvirtual

Fills set with all the subtypes of this Class<GUM_SCALAR>.

Implements gum::prm::PRMClassElementContainer< GUM_SCALAR >.

Definition at line 965 of file PRMClass_tpl.h.

Referenced by gum::prm::PRMClass< double >::_findAllSubtypes().

966  {
967  for (auto ext : __extensions) {
968  set.insert(ext);
969  ext->_findAllSubtypes(set);
970  }
971  }
Set< PRMClass< GUM_SCALAR > *> __extensions
The set of Class<GUM_SCALAR> which are extension of this Class<GUM_SCALAR> (i.e. direct subtypes)...
Definition: PRMClass.h:395
+ Here is the caller graph for this function:

◆ _getIOFlag() [1/2]

template<typename GUM_SCALAR>
INLINE std::pair< bool, bool > & gum::prm::PRMClassElementContainer< GUM_SCALAR >::_getIOFlag ( const PRMClassElement< GUM_SCALAR > &  elt)
protectedvirtualinherited

Returns the IO flags of a PRMClassElement<GUM_SCALAR>.

Parameters
eltThe PRMClassElement<GUM_SCALAR>.
Returns
elt's IO flags.
Exceptions
NotFoundRaised if elt does not have any IO flags.

Definition at line 128 of file PRMClassElementContainer_tpl.h.

129  {
130  try {
131  return __IOFlags[elt.safeName()];
132  } catch (NotFound&) {
133  GUM_ERROR(NotFound,
134  "this ClassElement<GUM_SCALAR> does not have any IO flags");
135  }
136  }
HashTable< std::string, std::pair< bool, bool > > __IOFlags
input / output flags, useful when inheriting or copying.
#define GUM_ERROR(type, msg)
Definition: exceptions.h:52

◆ _getIOFlag() [2/2]

template<typename GUM_SCALAR>
INLINE const std::pair< bool, bool > & gum::prm::PRMClassElementContainer< GUM_SCALAR >::_getIOFlag ( const PRMClassElement< GUM_SCALAR > &  elt) const
protectedvirtualinherited

Returns the IO flags of a PRMClassElement<GUM_SCALAR>.

Parameters
eltThe PRMClassElement<GUM_SCALAR>.
Returns
elt's IO flags.
Exceptions
NotFoundRaised if elt does not have any IO flags.

Definition at line 140 of file PRMClassElementContainer_tpl.h.

141  {
142  try {
143  return __IOFlags[elt.safeName()];
144  } catch (NotFound&) {
145  GUM_ERROR(NotFound,
146  "this ClassElement<GUM_SCALAR> does not have any IO flags");
147  }
148  }
HashTable< std::string, std::pair< bool, bool > > __IOFlags
input / output flags, useful when inheriting or copying.
#define GUM_ERROR(type, msg)
Definition: exceptions.h:52

◆ _setIOFlag()

template<typename GUM_SCALAR>
INLINE void gum::prm::PRMClassElementContainer< GUM_SCALAR >::_setIOFlag ( const PRMClassElement< GUM_SCALAR > &  elt,
const std::pair< bool, bool > &  flags 
)
protectedvirtualinherited

Defines the IO flags of a PRMClassElement<GUM_SCALAR>.

Parameters
eltThe PRMClassElement<GUM_SCALAR>.
flagsThe IO flags of elt. Overwrite any existing flags.
Returns
elt's IO flags.
Exceptions
NotFoundRaised if elt does not have any IO flags.

Definition at line 151 of file PRMClassElementContainer_tpl.h.

153  {
154  try {
155  __IOFlags[elt.safeName()] = flags;
156  } catch (NotFound&) { __IOFlags.insert(elt.safeName(), flags); }
157  }
HashTable< std::string, std::pair< bool, bool > > __IOFlags
input / output flags, useful when inheriting or copying.
value_type & insert(const Key &key, const Val &val)
Adds a new element (actually a copy of this element) into the hash table.

◆ _updateDescendants()

template<typename GUM_SCALAR>
void gum::prm::PRMClass< GUM_SCALAR >::_updateDescendants ( const PRMClassElement< GUM_SCALAR > &  elt)
protectedvirtual

See gum::prm::PRMClassElementContainer<GUM_SCALAR>(const PRMClassElement<GUM_SCALAR>&).

Implements gum::prm::PRMClassElementContainer< GUM_SCALAR >.

Definition at line 999 of file PRMClass_tpl.h.

1000  {
1001  // for ( const auto ext : __extensions ) {
1002  // // We test to prevent unnecessary recursive call from iter
1003  // if ( !ext->isOutputNode( elt ) ) {
1004  // ext->setOutputNode( elt, true );
1005  // }
1006  //}
1007  }

◆ add()

template<typename GUM_SCALAR>
NodeId gum::prm::PRMClass< GUM_SCALAR >::add ( PRMClassElement< GUM_SCALAR > *  elt)
virtual

See gum::prm::add(PRMClassElement<GUM_SCALAR>*).

Implements gum::prm::PRMClassElementContainer< GUM_SCALAR >.

Definition at line 618 of file PRMClass_tpl.h.

Referenced by gum::prm::PRMFactory< GUM_SCALAR >::__retrieveInputs(), gum::prm::PRMFactory< GUM_SCALAR >::addAggregator(), gum::prm::PRMFactory< GUM_SCALAR >::addAttribute(), gum::prm::PRMFactory< GUM_SCALAR >::addNoisyOrCompound(), and gum::prm::PRMFactory< GUM_SCALAR >::startAggregator().

618  {
619  if (__nameMap.exists(elt->name())) {
620  GUM_ERROR(DuplicateElement,
621  "name " << elt->name()
622  << " already used by another ClassElement");
623  }
624 
625  elt->setId(nextNodeId());
626  __dag.addNodeWithId(elt->id());
627  __nodeIdMap.insert(elt->id(), elt);
628  __nameMap.insert(elt->name(), elt);
629 
630  try {
631  __nameMap.insert(elt->safeName(), elt);
632  } catch (DuplicateElement& e) {
635  throw DuplicateElement(e);
636  }
637  }
638 
639  switch (elt->elt_type()) {
641  __attributes.insert(static_cast< PRMAttribute< GUM_SCALAR >* >(elt));
642  __addCastDescendants(static_cast< PRMAttribute< GUM_SCALAR >* >(elt));
643 
644  // Update attribute or cast descendant id to respect implemented
645  // interface
646  __checkInterfaces(elt);
647 
649  break;
650  }
651 
653  __aggregates.insert(static_cast< PRMAggregate< GUM_SCALAR >* >(elt));
654  __addCastDescendants(static_cast< PRMAttribute< GUM_SCALAR >* >(elt));
655 
656  // Update attribute or cast descendant id to respect implemented
657  // interface
658  __checkInterfaces(elt);
659 
661  break;
662  }
663 
665  auto ref = static_cast< PRMReferenceSlot< GUM_SCALAR >* >(elt);
666  __referenceSlots.insert(ref);
667 
668  // Updating ref's id if ref implements an interface
670  break;
671  }
672 
674  __slotChains.insert(static_cast< PRMSlotChain< GUM_SCALAR >* >(elt));
675  break;
676  }
677 
679  __parameters.insert(static_cast< PRMParameter< GUM_SCALAR >* >(elt));
680  break;
681  }
682 
683  default: {
684  GUM_ERROR(FatalError, "unknown ClassElement<GUM_SCALAR> type");
685  }
686  }
687 
688  return elt->id();
689  }
void __checkInterfaces(PRMClassElement< GUM_SCALAR > *elt)
Check that a given element respects all the class interfaces.
Definition: PRMClass_tpl.h:526
virtual void addNodeWithId(const NodeId id)
try to insert a node with the given id
Set< PRMReferenceSlot< GUM_SCALAR > *> __referenceSlots
The sequence of PRMReferenceSlot<GUM_SCALAR>.
Definition: PRMClass.h:359
static INLINE bool isParameter(const PRMClassElement< GUM_SCALAR > &elt)
Return true if obj is of type PRMParameter.
NodeProperty< PRMClassElement< GUM_SCALAR > *> __nodeIdMap
Mapping between node&#39;s id and their name (being an attribute or a slot). Used for fast access to a me...
Definition: PRMClass.h:343
Set< PRMAggregate< GUM_SCALAR > *> __aggregates
The sequence of aggregate.
Definition: PRMClass.h:362
void __checkRefInterfaces(PRMReferenceSlot< GUM_SCALAR > *elt)
Check that a given element respects all the class interfaces.
Definition: PRMClass_tpl.h:581
Set< PRMSlotChain< GUM_SCALAR > *> __slotChains
The set of gum::PRMSlotChain<GUM_SCALAR>s.
Definition: PRMClass.h:365
DAG __dag
The dag representing dependencies between formal attributes and slots.
Definition: PRMClass.h:339
NodeId nextNodeId()
Returns the next value of an unique counter for PRM&#39;s node id.
Definition: utils_prm.cpp:63
void __addIOInterfaceFlags(PRMClassElement< GUM_SCALAR > *elt)
Check if elt is present in an implementation. If it is, its IO flags are updated. ...
Definition: PRMClass_tpl.h:974
static INLINE bool isSlotChain(const PRMClassElement< GUM_SCALAR > &elt)
Return true if obj is of type PRMSlotChain.
Set< PRMAttribute< GUM_SCALAR > *> __attributes
The sequence of PRMAttribute<GUM_SCALAR>s.
Definition: PRMClass.h:356
HashTable< std::string, PRMClassElement< GUM_SCALAR > *> __nameMap
Mapping between a member&#39;s name and itself. Used for fast access to a member given it&#39;s name...
Definition: PRMClass.h:353
void __addCastDescendants(PRMClassElement< GUM_SCALAR > *attr)
Recursively adds cast descendant of attr in this Class<GUM_SCALAR>.
Definition: PRMClass_tpl.h:692
#define GUM_ERROR(type, msg)
Definition: exceptions.h:52
Set< PRMParameter< GUM_SCALAR > *> __parameters
The Set of parameters in this Class<GUM_SCALAR>.
Definition: PRMClass.h:368
+ Here is the caller graph for this function:

◆ addArc()

template<typename GUM_SCALAR >
void gum::prm::PRMClass< GUM_SCALAR >::addArc ( const std::string &  tail,
const std::string &  head 
)
virtual

See gum::prm::PRMClassElementContainer<GUM_SCALAR>::addArc().

Implements gum::prm::PRMClassElementContainer< GUM_SCALAR >.

Definition at line 480 of file PRMClass_tpl.h.

Referenced by gum::prm::PRMFactory< GUM_SCALAR >::__addParent(), gum::prm::PRMFactory< GUM_SCALAR >::addAggregator(), and gum::prm::PRMFactory< GUM_SCALAR >::addAttribute().

481  {
482  PRMClassElement< GUM_SCALAR >* tail = 0;
483  PRMClassElement< GUM_SCALAR >* head = 0;
484 
485  try {
486  tail = __nameMap[tail_name];
487  head = __nameMap[head_name];
488  } catch (NotFound&) {
489  GUM_ERROR(NotFound,
490  "tail and/or head of arc does not exists in this Class");
491  }
492 
493  if ((tail->elt_type() == PRMClassElement< GUM_SCALAR >::prm_refslot)
494  || (head->elt_type() == PRMClassElement< GUM_SCALAR >::prm_refslot)) {
495  GUM_ERROR(OperationNotAllowed,
496  "a PRMReferenceSlot<GUM_SCALAR> can "
497  "not on neither side of an arc");
498  }
499 
500  if ((tail->elt_type() == PRMClassElement< GUM_SCALAR >::prm_slotchain)
501  && (head->elt_type() == PRMClassElement< GUM_SCALAR >::prm_slotchain)) {
502  GUM_ERROR(OperationNotAllowed,
503  "illegal insertion of an arc between two SlotChain<GUM_SCALAR>");
504  }
505 
506  if (!__dag.existsArc(Arc(tail->id(), head->id()))) {
507  __dag.addArc(tail->id(), head->id());
508  } else {
509  GUM_ERROR(DuplicateElement,
510  "duplicate arc " << tail_name << "->" << head_name);
511  }
512 
513  get(tail->id()).addChild(get(head->id()));
514  get(head->id()).addParent(get(tail->id()));
515 
516  // Defining input / output nodes
517  if (tail->elt_type() == PRMClassElement< GUM_SCALAR >::prm_slotchain) {
518  PRMSlotChain< GUM_SCALAR >* sc =
519  static_cast< PRMSlotChain< GUM_SCALAR >* >(tail);
520  this->setInputNode(*head, true);
521  sc->end().setOutputNode(sc->end().get(sc->lastElt().safeName()), true);
522  }
523  }
virtual void setInputNode(const PRMClassElement< GUM_SCALAR > &elt, bool b)
Set the input flag value of id at b.
DAG __dag
The dag representing dependencies between formal attributes and slots.
Definition: PRMClass.h:339
virtual void addArc(const NodeId tail, const NodeId head)
insert a new arc into the directed graph
Definition: DAG_inl.h:40
HashTable< std::string, PRMClassElement< GUM_SCALAR > *> __nameMap
Mapping between a member&#39;s name and itself. Used for fast access to a member given it&#39;s name...
Definition: PRMClass.h:353
bool existsArc(const Arc &arc) const
indicates whether a given arc exists
#define GUM_ERROR(type, msg)
Definition: exceptions.h:52
+ Here is the caller graph for this function:

◆ aggregates()

template<typename GUM_SCALAR >
INLINE const Set< PRMAggregate< GUM_SCALAR > *> & gum::prm::PRMClass< GUM_SCALAR >::aggregates ( ) const

Returns the set of PRMAggregate<GUM_SCALAR> of this Class<GUM_SCALAR>.

Returns
Returns the set of PRMAggregate<GUM_SCALAR> of this Class<GUM_SCALAR>.

Definition at line 1139 of file PRMClass_tpl.h.

1139  {
1140  return __aggregates;
1141  }
Set< PRMAggregate< GUM_SCALAR > *> __aggregates
The sequence of aggregate.
Definition: PRMClass.h:362

◆ attributes()

template<typename GUM_SCALAR >
INLINE const Set< PRMAttribute< GUM_SCALAR > *> & gum::prm::PRMClass< GUM_SCALAR >::attributes ( ) const

Returns the set of PRMAttribute<GUM_SCALAR> of this Class<GUM_SCALAR>.

Returns
Returns the set of PRMAttribute<GUM_SCALAR> of this Class<GUM_SCALAR>.

Definition at line 1071 of file PRMClass_tpl.h.

1071  {
1072  return __attributes;
1073  }
Set< PRMAttribute< GUM_SCALAR > *> __attributes
The sequence of PRMAttribute<GUM_SCALAR>s.
Definition: PRMClass.h:356

◆ belongsTo()

template<typename GUM_SCALAR>
INLINE bool gum::prm::PRMClassElementContainer< GUM_SCALAR >::belongsTo ( const PRMClassElement< GUM_SCALAR > &  elt) const
virtualinherited

Returns true if elt belongs to this PRMClassElementContainer.

Parameters
eltA PRMClassElement<GUM_SCALAR>.
Returns
true if elt beglons to this PRMClassElementContainer.

Definition at line 174 of file PRMClassElementContainer_tpl.h.

175  {
176  try {
177  return &elt == &(get(elt.safeName()));
178  } catch (NotFound&) { return false; }
179  }

◆ completeInheritance()

template<typename GUM_SCALAR >
void gum::prm::PRMClass< GUM_SCALAR >::completeInheritance ( const std::string &  attr)

Definition at line 289 of file PRMClass_tpl.h.

289  {
290  if (__superClass) {
291  auto& elt = this->get(name);
294  GUM_ERROR(OperationNotAllowed,
295  "you can only complete inheritance for attributes");
296  }
297 
298  for (const auto& prnt : super().containerDag().parents(elt.id())) {
299  this->addArc(super().get(prnt).safeName(), elt.safeName());
300  }
301 
303  auto& attr = static_cast< PRMAttribute< GUM_SCALAR >& >(elt);
304  auto& super_attr =
305  static_cast< const PRMAttribute< GUM_SCALAR >& >(super().get(name));
306  attr.copyCpf(*__bijection, super_attr);
307  }
308  }
309  }
PRMClass< GUM_SCALAR > * __superClass
The alternate PRMClassElementContainer<GUM_SCALAR> searched for elements defined in this...
Definition: PRMClass.h:388
const std::string & name() const
Returns the name of this object.
Definition: PRMObject_inl.h:32
static INLINE bool isAttribute(const PRMClassElement< GUM_SCALAR > &elt)
Returns true if obj_ptr is of type PRMAttribute.
Bijection< const DiscreteVariable *, const DiscreteVariable *> * __bijection
The bijection between variables in super and variables in this The bijection&#39;s firsts are attributes ...
Definition: PRMClass.h:400
virtual void addArc(const std::string &tail, const std::string &head)
See gum::prm::PRMClassElementContainer<GUM_SCALAR>::addArc().
Definition: PRMClass_tpl.h:480
const PRMClass< GUM_SCALAR > & super() const
Returns the super Class<GUM_SCALAR> of this Class<GUM_SCALAR>.
static INLINE bool isAggregate(const PRMClassElement< GUM_SCALAR > &elt)
Return true if obj is of type PRMAggregate.
virtual const DAG & containerDag() const
Returns the gum::DAG of this PRMClassElementContainer.
#define GUM_ERROR(type, msg)
Definition: exceptions.h:52

◆ containerDag()

template<typename GUM_SCALAR >
INLINE const DAG & gum::prm::PRMClassElementContainer< GUM_SCALAR >::containerDag ( ) const
virtualinherited

Returns the gum::DAG of this PRMClassElementContainer.

Be very careful when using NodeId with PRMClassElement<GUM_SCALAR>: there is no guarantee that an inherited PRMClassElement<GUM_SCALAR> will have the same NodeId than its superclass counterpart.

When dealing with different classes and interfaces ALWAYS use safe-name as identifier.

Returns
the DAG of this PRMClassElementContainer.

Definition at line 183 of file PRMClassElementContainer_tpl.h.

Referenced by gum::prm::ClassDependencyGraph< GUM_SCALAR >::__addArcs(), gum::prm::PRMClass< double >::__inheritClass(), gum::prm::ClassBayesNet< GUM_SCALAR >::__init(), gum::prm::SVED< GUM_SCALAR >::__initLiftedNodes(), gum::prm::SVE< GUM_SCALAR >::__initLiftedNodes(), gum::prm::PRMFactory< GUM_SCALAR >::addAttribute(), operator<<(), and gum::prm::PRMClass< double >::PRMClass().

183  {
184  return _dag();
185  }
virtual const DAG & _dag() const =0
+ Here is the caller graph for this function:

◆ enum2str()

static std::string gum::prm::PRMObject::enum2str ( prm_type  type)
inlinestaticinherited

Returns the string representation of a PRMObject.

Definition at line 80 of file PRMObject.h.

References gum::prm::PRMObject::CLASS, gum::prm::PRMObject::CLASS_ELT, gum::prm::PRMObject::INSTANCE, gum::prm::PRMObject::PRM_INTERFACE, gum::prm::PRMObject::SYSTEM, and gum::prm::PRMObject::TYPE.

Referenced by gum::prm::operator<<().

80  {
81  switch (type) {
82  case prm_type::CLASS: return "PRMType::CLASS";
83 
84  case prm_type::CLASS_ELT: return "PRMType::CLASS_ELT";
85 
86  case prm_type::TYPE: return "PRMType::TYPE";
87 
88  case prm_type::SYSTEM: return "PRMType::SYSTEM";
89 
90  case prm_type::INSTANCE: return "PRMType::INSTANCE";
91 
92  case prm_type::PRM_INTERFACE: return "PRMType::PRM_INTERFACE";
93 
94  default: return "unknown";
95  }
96  }
+ Here is the caller graph for this function:

◆ exists() [1/2]

template<typename GUM_SCALAR >
INLINE bool gum::prm::PRMClassElementContainer< GUM_SCALAR >::exists ( const std::string &  name) const
virtualinherited

Returns true if a member with the given name exists in this PRMClassElementContainer or in the PRMClassElementContainer hierarchy.

Definition at line 165 of file PRMClassElementContainer_tpl.h.

Referenced by gum::prm::o3prm::O3ClassFactory< GUM_SCALAR >::__checkLocalParent(), gum::prm::o3prm::O3SystemFactory< GUM_SCALAR >::__checkParameters(), gum::prm::o3prm::O3ClassFactory< GUM_SCALAR >::__checkSlotChainLink(), gum::prm::PRMFactory< GUM_SCALAR >::addNoisyOrCompound(), gum::prm::PRMFactory< GUM_SCALAR >::continueAggregator(), gum::prm::PRMFactory< GUM_SCALAR >::continueAttribute(), gum::prm::PRMClassElementContainer< double >::exists(), and gum::prm::PRMFactory< GUM_SCALAR >::startAttribute().

166  {
167  try {
168  get(name);
169  return true;
170  } catch (NotFound&) { return false; }
171  }
const std::string & name() const
Returns the name of this object.
Definition: PRMObject_inl.h:32
+ Here is the caller graph for this function:

◆ exists() [2/2]

template<typename GUM_SCALAR >
INLINE bool gum::prm::PRMClassElementContainer< GUM_SCALAR >::exists ( NodeId  id) const
virtualinherited

Returns true if a member with the given id exists in this PRMClassElementContainer or in the PRMClassElementContainer hierarchy.

Parameters
idA NodeId.
Returns
true if id matches a PRMClassElement<GUM_SCALAR>.

Definition at line 160 of file PRMClassElementContainer_tpl.h.

160  {
161  return containerDag().exists(id);
162  }
bool exists(const NodeId id) const
alias for existsNode
virtual const DAG & containerDag() const
Returns the gum::DAG of this PRMClassElementContainer.

◆ extensions()

template<typename GUM_SCALAR >
INLINE const Set< PRMClass< GUM_SCALAR > *> & gum::prm::PRMClass< GUM_SCALAR >::extensions ( ) const

Returns the set of Class<GUM_SCALAR> which are direct sub-Class<GUM_SCALAR> of this Class<GUM_SCALAR>.

Definition at line 1251 of file PRMClass_tpl.h.

1251  {
1252  return __extensions;
1253  }
Set< PRMClass< GUM_SCALAR > *> __extensions
The set of Class<GUM_SCALAR> which are extension of this Class<GUM_SCALAR> (i.e. direct subtypes)...
Definition: PRMClass.h:395

◆ get() [1/4]

template<typename GUM_SCALAR >
INLINE PRMClassElement< GUM_SCALAR > & gum::prm::PRMClass< GUM_SCALAR >::get ( NodeId  id)
virtual

See gum::prm::PRMClassElementContainer<GUM_SCALAR>::get(NodeId).

Implements gum::prm::PRMClassElementContainer< GUM_SCALAR >.

Definition at line 1025 of file PRMClass_tpl.h.

Referenced by gum::prm::PRMFactory< GUM_SCALAR >::__checkInterfaceImplementation(), gum::prm::o3prm::O3ClassFactory< GUM_SCALAR >::__checkLocalParent(), gum::prm::o3prm::O3SystemFactory< GUM_SCALAR >::__checkParameters(), gum::prm::o3prm::O3ClassFactory< GUM_SCALAR >::__checkRawCPT(), gum::prm::ClassBayesNet< GUM_SCALAR >::__init(), gum::prm::SVED< GUM_SCALAR >::__initLiftedNodes(), gum::prm::SVE< GUM_SCALAR >::__initLiftedNodes(), gum::prm::PRMFactory< GUM_SCALAR >::__retrieveInputs(), gum::prm::PRMFactory< GUM_SCALAR >::addAttribute(), and gum::prm::PRMFactory< GUM_SCALAR >::addNoisyOrCompound().

1025  {
1026  try {
1027  return *(__nodeIdMap[id]);
1028  } catch (NotFound&) {
1029  GUM_ERROR(NotFound, "no ClassElement<GUM_SCALAR> with the given NodeId");
1030  }
1031  }
NodeProperty< PRMClassElement< GUM_SCALAR > *> __nodeIdMap
Mapping between node&#39;s id and their name (being an attribute or a slot). Used for fast access to a me...
Definition: PRMClass.h:343
#define GUM_ERROR(type, msg)
Definition: exceptions.h:52
+ Here is the caller graph for this function:

◆ get() [2/4]

template<typename GUM_SCALAR >
INLINE const PRMClassElement< GUM_SCALAR > & gum::prm::PRMClass< GUM_SCALAR >::get ( NodeId  id) const
virtual

See gum::prm::PRMClassElementContainer<GUM_SCALAR>::get(NodeId).

Implements gum::prm::PRMClassElementContainer< GUM_SCALAR >.

Definition at line 1035 of file PRMClass_tpl.h.

1035  {
1036  try {
1037  return *(__nodeIdMap[id]);
1038  } catch (NotFound&) {
1039  GUM_ERROR(NotFound,
1040  "no ClassElement<GUM_SCALAR> with the given NodeId (" << id
1041  << ")");
1042  }
1043  }
NodeProperty< PRMClassElement< GUM_SCALAR > *> __nodeIdMap
Mapping between node&#39;s id and their name (being an attribute or a slot). Used for fast access to a me...
Definition: PRMClass.h:343
#define GUM_ERROR(type, msg)
Definition: exceptions.h:52

◆ get() [3/4]

template<typename GUM_SCALAR >
INLINE PRMClassElement< GUM_SCALAR > & gum::prm::PRMClass< GUM_SCALAR >::get ( const std::string &  name)
virtual

See gum::prm::PRMClassElementContainer<GUM_SCALAR>::get(const std::string&).

Implements gum::prm::PRMClassElementContainer< GUM_SCALAR >.

Definition at line 1047 of file PRMClass_tpl.h.

1047  {
1048  try {
1049  return *(__nameMap[name]);
1050  } catch (NotFound&) {
1051  GUM_ERROR(NotFound,
1052  "no ClassElement<GUM_SCALAR> with the given name (" << name
1053  << ")");
1054  }
1055  }
const std::string & name() const
Returns the name of this object.
Definition: PRMObject_inl.h:32
HashTable< std::string, PRMClassElement< GUM_SCALAR > *> __nameMap
Mapping between a member&#39;s name and itself. Used for fast access to a member given it&#39;s name...
Definition: PRMClass.h:353
#define GUM_ERROR(type, msg)
Definition: exceptions.h:52

◆ get() [4/4]

template<typename GUM_SCALAR >
INLINE const PRMClassElement< GUM_SCALAR > & gum::prm::PRMClass< GUM_SCALAR >::get ( const std::string &  name) const
virtual

See gum::prm::PRMClassElementContainer<GUM_SCALAR>::get(const std::string&).

Implements gum::prm::PRMClassElementContainer< GUM_SCALAR >.

Definition at line 1059 of file PRMClass_tpl.h.

1059  {
1060  try {
1061  return *(__nameMap[name]);
1062  } catch (NotFound&) {
1063  GUM_ERROR(NotFound,
1064  "no ClassElement<GUM_SCALAR> with the given name (" << name
1065  << ")");
1066  }
1067  }
const std::string & name() const
Returns the name of this object.
Definition: PRMObject_inl.h:32
HashTable< std::string, PRMClassElement< GUM_SCALAR > *> __nameMap
Mapping between a member&#39;s name and itself. Used for fast access to a member given it&#39;s name...
Definition: PRMClass.h:353
#define GUM_ERROR(type, msg)
Definition: exceptions.h:52

◆ implements()

template<typename GUM_SCALAR >
INLINE const Set< PRMInterface< GUM_SCALAR > *> & gum::prm::PRMClass< GUM_SCALAR >::implements ( ) const

Returns the Set of PRMInterface<GUM_SCALAR> implemented by this Class<GUM_SCALAR>.

Returns
Returns the Set of PRMInterface<GUM_SCALAR> implemented by this Class<GUM_SCALAR>.
Exceptions
NotFoundRaised if this Class<GUM_SCALAR> doesn't implement any PRMInterface<GUM_SCALAR>.

Definition at line 1166 of file PRMClass_tpl.h.

Referenced by gum::prm::PRMFactory< GUM_SCALAR >::__checkInterfaceImplementation().

1166  {
1167  if (__implements) {
1168  return *__implements;
1169  } else {
1170  GUM_ERROR(NotFound,
1171  "this Class does not implement any Interface<GUM_SCALAR>");
1172  }
1173  }
Set< PRMInterface< GUM_SCALAR > *> * __implements
The Set of implemented interface of this.
Definition: PRMClass.h:391
#define GUM_ERROR(type, msg)
Definition: exceptions.h:52
+ Here is the caller graph for this function:

◆ inheritAggregates()

template<typename GUM_SCALAR >
void gum::prm::PRMClass< GUM_SCALAR >::inheritAggregates ( )

Definition at line 223 of file PRMClass_tpl.h.

223  {
224  if (__superClass) {
225  for (const auto c_agg : __superClass->__aggregates) {
226  PRMAggregate< GUM_SCALAR >* agg = nullptr;
227 
228  try {
229  agg = new PRMAggregate< GUM_SCALAR >(
230  c_agg->name(), c_agg->agg_type(), c_agg->type(), c_agg->label());
231  } catch (OperationNotAllowed&) {
232  agg = new PRMAggregate< GUM_SCALAR >(
233  c_agg->name(), c_agg->agg_type(), c_agg->type());
234  agg->sharedLabel(c_agg->sharedLabel());
235  agg->setLabel(c_agg->labelValue());
236  }
237 
238  __bijection->insert(&(c_agg->type().variable()),
239  &(agg->type().variable()));
240  agg->setId(c_agg->id());
241  __dag.addNodeWithId(agg->id());
242  __nodeIdMap.insert(agg->id(), agg);
243  __aggregates.insert(agg);
244 
245  if (__superClass->__nameMap[c_agg->name()]
246  == __superClass->__nameMap[c_agg->safeName()])
247  __nameMap.insert(agg->name(), agg);
248 
249  __nameMap.insert(agg->safeName(), agg);
250  }
251  }
252  }
virtual void addNodeWithId(const NodeId id)
try to insert a node with the given id
PRMClass< GUM_SCALAR > * __superClass
The alternate PRMClassElementContainer<GUM_SCALAR> searched for elements defined in this...
Definition: PRMClass.h:388
NodeProperty< PRMClassElement< GUM_SCALAR > *> __nodeIdMap
Mapping between node&#39;s id and their name (being an attribute or a slot). Used for fast access to a me...
Definition: PRMClass.h:343
Set< PRMAggregate< GUM_SCALAR > *> __aggregates
The sequence of aggregate.
Definition: PRMClass.h:362
Bijection< const DiscreteVariable *, const DiscreteVariable *> * __bijection
The bijection between variables in super and variables in this The bijection&#39;s firsts are attributes ...
Definition: PRMClass.h:400
DAG __dag
The dag representing dependencies between formal attributes and slots.
Definition: PRMClass.h:339
HashTable< std::string, PRMClassElement< GUM_SCALAR > *> __nameMap
Mapping between a member&#39;s name and itself. Used for fast access to a member given it&#39;s name...
Definition: PRMClass.h:353

◆ inheritAttributes()

template<typename GUM_SCALAR >
void gum::prm::PRMClass< GUM_SCALAR >::inheritAttributes ( )

Definition at line 194 of file PRMClass_tpl.h.

194  {
195  if (__superClass) {
196  for (const auto c_attr : __superClass->__attributes) {
197  // using multiDimSparse to prevent unecessary memory allocation for
198  // large arrays (the potentials are copied latter)
199  auto attr = c_attr->newFactory(*this);
200 
201  __bijection->insert(&(c_attr->type().variable()),
202  &(attr->type().variable()));
203  attr->setId(c_attr->id());
204  try {
205  __dag.addNodeWithId(attr->id());
206  } catch (gum::Exception&) {
207  // Node reserved by an interface
208  }
209  __nodeIdMap.insert(attr->id(), attr);
210  __attributes.insert(attr);
211 
212  if (__superClass->__nameMap[c_attr->name()]
213  == __superClass->__nameMap[c_attr->safeName()]) {
214  __nameMap.insert(attr->name(), attr);
215  }
216 
217  __nameMap.insert(attr->safeName(), attr);
218  }
219  }
220  }
virtual void addNodeWithId(const NodeId id)
try to insert a node with the given id
PRMClass< GUM_SCALAR > * __superClass
The alternate PRMClassElementContainer<GUM_SCALAR> searched for elements defined in this...
Definition: PRMClass.h:388
NodeProperty< PRMClassElement< GUM_SCALAR > *> __nodeIdMap
Mapping between node&#39;s id and their name (being an attribute or a slot). Used for fast access to a me...
Definition: PRMClass.h:343
Bijection< const DiscreteVariable *, const DiscreteVariable *> * __bijection
The bijection between variables in super and variables in this The bijection&#39;s firsts are attributes ...
Definition: PRMClass.h:400
DAG __dag
The dag representing dependencies between formal attributes and slots.
Definition: PRMClass.h:339
Base class for all aGrUM&#39;s exceptions.
Definition: exceptions.h:103
Set< PRMAttribute< GUM_SCALAR > *> __attributes
The sequence of PRMAttribute<GUM_SCALAR>s.
Definition: PRMClass.h:356
HashTable< std::string, PRMClassElement< GUM_SCALAR > *> __nameMap
Mapping between a member&#39;s name and itself. Used for fast access to a member given it&#39;s name...
Definition: PRMClass.h:353

◆ inheritParameters()

template<typename GUM_SCALAR >
void gum::prm::PRMClass< GUM_SCALAR >::inheritParameters ( )

Definition at line 176 of file PRMClass_tpl.h.

176  {
177  if (__superClass) {
178  // Copying parameters
179  for (const auto c_param : __superClass->__parameters) {
180  auto param = new PRMParameter< GUM_SCALAR >(
181  c_param->name(), c_param->valueType(), c_param->value());
182 
183  __parameters.insert(param);
184 
185  param->setId(c_param->id());
186  __dag.addNodeWithId(param->id());
187  __nodeIdMap.insert(param->id(), param);
188  __nameMap.insert(param->name(), param);
189  }
190  }
191  }
virtual void addNodeWithId(const NodeId id)
try to insert a node with the given id
PRMClass< GUM_SCALAR > * __superClass
The alternate PRMClassElementContainer<GUM_SCALAR> searched for elements defined in this...
Definition: PRMClass.h:388
NodeProperty< PRMClassElement< GUM_SCALAR > *> __nodeIdMap
Mapping between node&#39;s id and their name (being an attribute or a slot). Used for fast access to a me...
Definition: PRMClass.h:343
DAG __dag
The dag representing dependencies between formal attributes and slots.
Definition: PRMClass.h:339
HashTable< std::string, PRMClassElement< GUM_SCALAR > *> __nameMap
Mapping between a member&#39;s name and itself. Used for fast access to a member given it&#39;s name...
Definition: PRMClass.h:353
Set< PRMParameter< GUM_SCALAR > *> __parameters
The Set of parameters in this Class<GUM_SCALAR>.
Definition: PRMClass.h:368

◆ inheritReferenceSlots()

template<typename GUM_SCALAR >
void gum::prm::PRMClass< GUM_SCALAR >::inheritReferenceSlots ( )

Definition at line 149 of file PRMClass_tpl.h.

149  {
150  if (__superClass) {
151  // Copying reference slots
152  for (const auto c_refslot : __superClass->__referenceSlots) {
153  auto ref = new PRMReferenceSlot< GUM_SCALAR >(
154  c_refslot->name(),
155  const_cast< PRMClassElementContainer< GUM_SCALAR >& >(
156  c_refslot->slotType()),
157  c_refslot->isArray());
158 
159  ref->setId(c_refslot->id());
160  // Not reserved by an interface
161  if (!__dag.existsNode(ref->id())) { __dag.addNodeWithId(ref->id()); }
162  __nodeIdMap.insert(ref->id(), ref);
163  __referenceSlots.insert(ref);
164 
165  if (__superClass->__nameMap[c_refslot->name()]
166  == __superClass->__nameMap[c_refslot->safeName()]) {
167  __nameMap.insert(ref->name(), ref);
168  }
169 
170  __nameMap.insert(ref->safeName(), ref);
171  }
172  }
173  }
virtual void addNodeWithId(const NodeId id)
try to insert a node with the given id
PRMClass< GUM_SCALAR > * __superClass
The alternate PRMClassElementContainer<GUM_SCALAR> searched for elements defined in this...
Definition: PRMClass.h:388
Set< PRMReferenceSlot< GUM_SCALAR > *> __referenceSlots
The sequence of PRMReferenceSlot<GUM_SCALAR>.
Definition: PRMClass.h:359
NodeProperty< PRMClassElement< GUM_SCALAR > *> __nodeIdMap
Mapping between node&#39;s id and their name (being an attribute or a slot). Used for fast access to a me...
Definition: PRMClass.h:343
DAG __dag
The dag representing dependencies between formal attributes and slots.
Definition: PRMClass.h:339
bool existsNode(const NodeId id) const
returns true iff the NodeGraphPart contains the given nodeId
HashTable< std::string, PRMClassElement< GUM_SCALAR > *> __nameMap
Mapping between a member&#39;s name and itself. Used for fast access to a member given it&#39;s name...
Definition: PRMClass.h:353

◆ inheritSlotChains()

template<typename GUM_SCALAR >
void gum::prm::PRMClass< GUM_SCALAR >::inheritSlotChains ( )

Definition at line 255 of file PRMClass_tpl.h.

255  {
256  if (__superClass) {
257  // Copying slot chains
258  for (const auto c_sc : __superClass->__slotChains) {
259  // Because of aggregators, some slotchains may exists already
260  if (!(__nameMap.exists(c_sc->name())
261  && __nameMap.exists(c_sc->safeName()))) {
262  // We just need to change the first PRMReferenceSlot<GUM_SCALAR> in
263  // the
264  // chain
265  auto chain = c_sc->chain();
266 
267  chain.setAtPos(0, __nameMap[c_sc->chain().front()->name()]);
268 
269  auto sc = new PRMSlotChain< GUM_SCALAR >(c_sc->name(), chain);
270  __bijection->insert(&(c_sc->type().variable()),
271  &(sc->type().variable()));
272  sc->setId(c_sc->id());
273  __dag.addNodeWithId(sc->id());
274  __nodeIdMap.insert(sc->id(), sc);
275  __slotChains.insert(sc);
276 
277  if (!__nameMap.exists(sc->name())) {
278  __nameMap.insert(sc->name(), sc);
279  }
280  if (!__nameMap.exists(sc->safeName())) {
281  __nameMap.insert(sc->safeName(), sc);
282  }
283  }
284  }
285  }
286  }
virtual void addNodeWithId(const NodeId id)
try to insert a node with the given id
PRMClass< GUM_SCALAR > * __superClass
The alternate PRMClassElementContainer<GUM_SCALAR> searched for elements defined in this...
Definition: PRMClass.h:388
NodeProperty< PRMClassElement< GUM_SCALAR > *> __nodeIdMap
Mapping between node&#39;s id and their name (being an attribute or a slot). Used for fast access to a me...
Definition: PRMClass.h:343
Set< PRMSlotChain< GUM_SCALAR > *> __slotChains
The set of gum::PRMSlotChain<GUM_SCALAR>s.
Definition: PRMClass.h:365
Bijection< const DiscreteVariable *, const DiscreteVariable *> * __bijection
The bijection between variables in super and variables in this The bijection&#39;s firsts are attributes ...
Definition: PRMClass.h:400
DAG __dag
The dag representing dependencies between formal attributes and slots.
Definition: PRMClass.h:339
HashTable< std::string, PRMClassElement< GUM_SCALAR > *> __nameMap
Mapping between a member&#39;s name and itself. Used for fast access to a member given it&#39;s name...
Definition: PRMClass.h:353

◆ initializeInheritance()

template<typename GUM_SCALAR >
void gum::prm::PRMClass< GUM_SCALAR >::initializeInheritance ( )

Definition at line 130 of file PRMClass_tpl.h.

130  {
131  if (__superClass) {
132  __superClass->__addExtension(this);
133  // Adding implemented interfaces, if any
134  if (__superClass->__implements) {
135  if (!__implements) {
136  __implements = new Set< PRMInterface< GUM_SCALAR >* >(
137  *(__superClass->__implements));
138  } else {
139  for (auto i : *(__superClass->__implements)) {
140  __implements->insert(i);
141  }
142  }
143  }
144  }
145  if (__implements) { __implementInterfaces(true); }
146  }
PRMClass< GUM_SCALAR > * __superClass
The alternate PRMClassElementContainer<GUM_SCALAR> searched for elements defined in this...
Definition: PRMClass.h:388
Set< PRMInterface< GUM_SCALAR > *> * __implements
The Set of implemented interface of this.
Definition: PRMClass.h:391
void __implementInterfaces(bool delayInheritance)
Proceed with the implementation of interfaces.
Definition: PRMClass_tpl.h:99

◆ isCastDescendant()

template<typename GUM_SCALAR >
INLINE bool gum::prm::PRMClass< GUM_SCALAR >::isCastDescendant ( const std::string &  safe_name) const

Return true if the attribute named safe_name is a cast descendant.

Cast descendant are automatically added PRMAttribute<GUM_SCALAR> for type casting.

Parameters
safe_nameThe safe name of an PRMAttribute<GUM_SCALAR> of this class.
Returns
true if safe_name is a cast descendant.
Exceptions
NotFoundRaised if safe_name does not name an PRMAttribute<GUM_SCALAR> in this Class<GUM_SCALAR>.

Definition at line 1261 of file PRMClass_tpl.h.

1262  {
1263  const PRMClassElement< GUM_SCALAR >& elt = get(safe_name);
1264 
1265  try {
1266  return elt.type().name() == get(elt.name()).type().name();
1267  } catch (OperationNotAllowed&) {
1268  GUM_ERROR(NotFound, "no attribute with the given name");
1269  }
1270  }
#define GUM_ERROR(type, msg)
Definition: exceptions.h:52

◆ isClass()

static INLINE bool gum::prm::PRMObject::isClass ( const PRMObject obj)
inlinestaticinherited

Returns true if obj_ptr is of type Class.

Definition at line 99 of file PRMObject.h.

References gum::prm::PRMObject::CLASS, and gum::prm::PRMObject::obj_type().

Referenced by gum::prm::PRMFactory< GUM_SCALAR >::startAttribute().

99  {
100  return obj.obj_type() == prm_type::CLASS;
101  }
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ isInnerNode()

template<typename GUM_SCALAR>
INLINE bool gum::prm::PRMClassElementContainer< GUM_SCALAR >::isInnerNode ( const PRMClassElement< GUM_SCALAR > &  elt) const
virtualinherited

Returns true if the node is an inner node.

PRMAttribute or PRMAggregate can either be input, output, both or internal nodes.

By defaut, attributes and aggregates are inner nodes.

Parameters
eltA PRMClassElement<GUM_SCALAR>.
Returns
true if elt is an inner node.
Exceptions
NotFoundRaised if NodeId does'nt match any PRMClassElement<GUM_SCALAR> in this.
WrongClassElementRaised if NodeId is neither an PRMAttribute nor an PRMAggregate.

Definition at line 113 of file PRMClassElementContainer_tpl.h.

Referenced by gum::prm::SVE< GUM_SCALAR >::__initLiftedNodes().

114  {
115  try {
116  return !(_getIOFlag(elt).first || _getIOFlag(elt).second);
117  } catch (NotFound&) { return true; }
118  }
virtual std::pair< bool, bool > & _getIOFlag(const PRMClassElement< GUM_SCALAR > &elt)
Returns the IO flags of a PRMClassElement<GUM_SCALAR>.
+ Here is the caller graph for this function:

◆ isInputNode()

template<typename GUM_SCALAR>
INLINE bool gum::prm::PRMClassElementContainer< GUM_SCALAR >::isInputNode ( const PRMClassElement< GUM_SCALAR > &  elt) const
virtualinherited

Returns true if the node is an input node.

PRMAttribute or PRMAggregate can either be input, output, both or internal nodes.

By defaut, attributes and aggregates are inner nodes.

Parameters
eltA PRMClassElement<GUM_SCALAR>.
Returns
Returns true if id is an input node.

Definition at line 69 of file PRMClassElementContainer_tpl.h.

70  {
71  try {
72  return _getIOFlag(elt).first;
73  } catch (NotFound&) { return false; }
74  }
virtual std::pair< bool, bool > & _getIOFlag(const PRMClassElement< GUM_SCALAR > &elt)
Returns the IO flags of a PRMClassElement<GUM_SCALAR>.

◆ isInstance()

static INLINE bool gum::prm::PRMObject::isInstance ( const PRMObject obj)
inlinestaticinherited

Returns true if obj_ptr is of type PRMInstance.

Definition at line 109 of file PRMObject.h.

References gum::prm::PRMObject::INSTANCE, gum::prm::PRMObject::name(), gum::prm::PRMObject::obj_type(), gum::prm::PRMObject::operator!=(), gum::prm::PRMObject::operator=(), gum::prm::PRMObject::operator==(), gum::prm::PRMObject::PRMObject(), and gum::prm::PRMObject::~PRMObject().

109  {
110  return obj.obj_type() == prm_type::INSTANCE;
111  }
+ Here is the call graph for this function:

◆ isInterface()

static INLINE bool gum::prm::PRMObject::isInterface ( const PRMObject obj)
inlinestaticinherited

Returns true if obj_ptr is of type PRMInterface.

Definition at line 104 of file PRMObject.h.

References gum::prm::PRMObject::obj_type(), and gum::prm::PRMObject::PRM_INTERFACE.

104  {
105  return obj.obj_type() == prm_type::PRM_INTERFACE;
106  }
+ Here is the call graph for this function:

◆ isOutputNode()

template<typename GUM_SCALAR>
INLINE bool gum::prm::PRMClass< GUM_SCALAR >::isOutputNode ( const PRMClassElement< GUM_SCALAR > &  elt) const
virtual

Returns true if elt is an output node.

Parameters
eltA node of this class.
Returns
Returns true if elt is an output node.

Implements gum::prm::PRMClassElementContainer< GUM_SCALAR >.

Definition at line 1273 of file PRMClass_tpl.h.

Referenced by gum::prm::SVED< GUM_SCALAR >::__initLiftedNodes(), and gum::prm::SVE< GUM_SCALAR >::__initLiftedNodes().

1274  {
1275  try {
1276  if (!this->_getIOFlag(elt).second) {
1277  if (__implements) {
1278  for (auto i : *__implements) {
1279  if (i->isOutputNode(elt)) { return true; }
1280  }
1281  }
1282 
1283  if (__superClass && (__superClass->isOutputNode(elt))) { return true; }
1284 
1285  } else {
1286  return true;
1287  }
1288  } catch (NotFound&) {}
1289  return false;
1290  }
PRMClass< GUM_SCALAR > * __superClass
The alternate PRMClassElementContainer<GUM_SCALAR> searched for elements defined in this...
Definition: PRMClass.h:388
Set< PRMInterface< GUM_SCALAR > *> * __implements
The Set of implemented interface of this.
Definition: PRMClass.h:391
virtual std::pair< bool, bool > & _getIOFlag(const PRMClassElement< GUM_SCALAR > &elt)
Returns the IO flags of a PRMClassElement<GUM_SCALAR>.
+ Here is the caller graph for this function:

◆ isSubTypeOf()

template<typename GUM_SCALAR>
bool gum::prm::PRMClass< GUM_SCALAR >::isSubTypeOf ( const PRMClassElementContainer< GUM_SCALAR > &  cec) const
virtual

Test if this Class<GUM_SCALAR> is a subclass of cec.

If cec is a Class<GUM_SCALAR> then this Class<GUM_SCALAR> is a subclass of cec if they are equal or there exists a superclass of this Class<GUM_SCALAR> which is equal to cec.

If cec is an PRMInterface<GUM_SCALAR> then this Class<GUM_SCALAR> is a subclass of cec if it implements cec or if there exists a superclass of this Class<GUM_SCALAR> which implements cec.

Parameters
cecThe PRMClassElementContainer<GUM_SCALAR> for which we determine if this Class<GUM_SCALAR> is a subclass of it.
Returns
Returns true if this Class<GUM_SCALAR> is a subclass of cec.

Implements gum::prm::PRMClassElementContainer< GUM_SCALAR >.

Definition at line 442 of file PRMClass_tpl.h.

443  {
444  switch (cec.obj_type()) {
446  const PRMClass< GUM_SCALAR >* current = this;
447 
448  while (current != 0) {
449  if (current == &(cec)) return true;
450 
451  current = current->__superClass;
452  }
453 
454  return false;
455  }
456 
458  if (__implements != nullptr) {
459  const PRMInterface< GUM_SCALAR >& i =
460  static_cast< const PRMInterface< GUM_SCALAR >& >(cec);
461 
462  if (__implements->exists(
463  const_cast< PRMInterface< GUM_SCALAR >* >(&i)))
464  return true;
465 
466  for (const auto impl : *__implements)
467  if (impl->isSubTypeOf(i)) return true;
468  }
469 
470  return false;
471  }
472 
473  default: {
474  GUM_ERROR(FatalError, "unknown ClassElementContainer<GUM_SCALAR>");
475  }
476  }
477  }
friend class PRMInterface< GUM_SCALAR >
Definition: PRMClass.h:64
Set< PRMInterface< GUM_SCALAR > *> * __implements
The Set of implemented interface of this.
Definition: PRMClass.h:391
#define GUM_ERROR(type, msg)
Definition: exceptions.h:52

◆ isSuperTypeOf()

template<typename GUM_SCALAR>
INLINE bool gum::prm::PRMClassElementContainer< GUM_SCALAR >::isSuperTypeOf ( const PRMClassElementContainer< GUM_SCALAR > &  cec) const
virtualinherited

Test if this PRMClassElementContainer is a super type of cec.

This returns cec.isSubTypeOf(*this).

Parameters
cec
Returns
return true if this PRMClassElementContainer is a super type of cec.

Definition at line 121 of file PRMClassElementContainer_tpl.h.

122  {
123  return cec.isSubTypeOf(*this);
124  }

◆ LEFT_CAST()

static std::string gum::prm::PRMObject::LEFT_CAST ( )
inlinestaticinherited

Enumeration of the different types of objects handled by a PRM.

The "all" type is used to tell that we want any kind of PRMType (useful with iterators for example). No PRMObject will ever have "all" as type.

Definition at line 76 of file PRMObject.h.

Referenced by gum::prm::decomposePath(), gum::prm::PRMFormAttribute< GUM_SCALAR >::PRMFormAttribute(), and gum::prm::PRMScalarAttribute< GUM_SCALAR >::PRMScalarAttribute().

76 { return "("; }
+ Here is the caller graph for this function:

◆ name() [1/2]

INLINE const std::string & gum::prm::PRMObject::name ( ) const
inherited

Returns the name of this object.

Definition at line 32 of file PRMObject_inl.h.

References gum::prm::PRMObject::__name.

Referenced by gum::prm::SVE< GUM_SCALAR >::__addDelayedVariable(), gum::prm::PRMClass< double >::__addIOInterfaceFlags(), gum::prm::PRMFactory< GUM_SCALAR >::__addParent(), gum::prm::PRMInstance< GUM_SCALAR >::__addReferingInstance(), gum::prm::PRMClass< double >::__checkInterface(), gum::prm::PRMFactory< GUM_SCALAR >::__checkInterfaceImplementation(), gum::prm::PRMClass< double >::__checkInterfaces(), gum::prm::o3prm::O3ClassFactory< GUM_SCALAR >::__checkRawCPT(), gum::prm::PRMClass< double >::__checkRefInterface(), gum::prm::PRMClass< double >::__checkRefInterfaces(), gum::prm::o3prm::O3ClassFactory< GUM_SCALAR >::__checkRuleCPTSumsTo1(), gum::prm::PRMInstance< GUM_SCALAR >::__copyAggregates(), gum::prm::PRMInstance< GUM_SCALAR >::__copyAttribute(), gum::prm::PRMSlotChain< double >::__copyLastElt(), gum::prm::PRMSystem< double >::__groundAttr(), gum::prm::PRMSystem< double >::__groundPotential(), gum::prm::PRMSystem< double >::__groundRef(), gum::prm::PRMClass< double >::__inheritClass(), gum::prm::PRMInterface< double >::__overloadAttribute(), gum::prm::PRMClass< double >::__overloadAttribute(), gum::prm::PRMClass< double >::__overloadParameter(), gum::prm::PRMClass< double >::__overloadReference(), gum::prm::PRMInterface< double >::__overloadReferenceSlot(), gum::prm::__print_attribute__(), gum::prm::__print_instance__(), gum::prm::gspan::StrictSearch< GUM_SCALAR >::__str(), gum::prm::StructuredInference< GUM_SCALAR >::__str(), gum::prm::PRMInterface< double >::add(), gum::prm::PRMSystem< double >::add(), gum::prm::PRMClass< double >::add(), gum::prm::PRMFactory< GUM_SCALAR >::addAggregator(), gum::prm::PRMFormAttribute< GUM_SCALAR >::addParent(), gum::prm::PRMScalarAttribute< GUM_SCALAR >::addParent(), gum::prm::PRMFormAttribute< GUM_SCALAR >::copy(), gum::prm::PRMScalarAttribute< GUM_SCALAR >::copy(), gum::prm::o3prmr::O3prmrInterpreter::findAttributeName(), gum::prm::o3prmr::O3prmrInterpreter::findInstanceName(), gum::prm::PRMFormAttribute< GUM_SCALAR >::getCastDescendant(), gum::prm::PRMScalarAttribute< GUM_SCALAR >::getCastDescendant(), gum::prm::PRMClass< double >::inheritAggregates(), gum::prm::PRMClass< double >::isCastDescendant(), gum::prm::PRMObject::isInstance(), gum::prm::PRMObject::name(), gum::prm::PRMType::name(), gum::prm::PRMFormAttribute< GUM_SCALAR >::newFactory(), gum::prm::PRMScalarAttribute< GUM_SCALAR >::newFactory(), gum::prm::PRMType::operator!=(), gum::prm::PRMObject::operator!=(), operator<<(), gum::prm::PRMType::operator==(), gum::prm::PRMObject::operator==(), gum::prm::PRMClass< double >::overload(), gum::prm::PRMInterface< double >::overload(), gum::prm::PRMFormAttribute< GUM_SCALAR >::PRMFormAttribute(), gum::prm::PRMReferenceSlot< double >::PRMReferenceSlot(), gum::prm::PRMScalarAttribute< GUM_SCALAR >::PRMScalarAttribute(), gum::prm::PRMFactory< GUM_SCALAR >::startClass(), gum::prm::PRMFactory< GUM_SCALAR >::startInterface(), gum::prm::PRMFactory< GUM_SCALAR >::startSystem(), and gum::prm::PRMAggregate< double >::str2enum().

32 { return __name; }
std::string __name
Definition: PRMObject.h:197

◆ name() [2/2]

INLINE void gum::prm::PRMObject::name ( const std::string &  name)
inherited

Change the name of the PRM Object.

Warning
Don't do this unless you know wath you are doing !

Definition at line 36 of file PRMObject_inl.h.

References gum::prm::PRMObject::__name, and gum::prm::PRMObject::name().

36 { __name = name; }
const std::string & name() const
Returns the name of this object.
Definition: PRMObject_inl.h:32
std::string __name
Definition: PRMObject.h:197
+ Here is the call graph for this function:

◆ obj_type()

template<typename GUM_SCALAR >
INLINE PRMObject::prm_type gum::prm::PRMClass< GUM_SCALAR >::obj_type ( ) const
virtual

Implementation of pure virtual method of PRMObject.

Implements gum::prm::PRMObject.

Definition at line 1010 of file PRMClass_tpl.h.

◆ operator!=()

INLINE bool gum::prm::PRMObject::operator!= ( const PRMObject obj) const
inherited

To PRMObject are equal if they have the same name (which is unique).

Definition at line 46 of file PRMObject_inl.h.

References gum::prm::PRMObject::__name, and gum::prm::PRMObject::name().

Referenced by gum::prm::PRMObject::isInstance().

46  {
47  return __name != obj.name();
48  }
std::string __name
Definition: PRMObject.h:197
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ operator=() [1/2]

template<typename GUM_SCALAR>
PRMClass< GUM_SCALAR >& gum::prm::PRMClass< GUM_SCALAR >::operator= ( const PRMClass< GUM_SCALAR > &  source)
delete

Copy operator. Don't use it.

◆ operator=() [2/2]

template<typename GUM_SCALAR>
PRMClass< GUM_SCALAR >& gum::prm::PRMClass< GUM_SCALAR >::operator= ( const PRMClass< GUM_SCALAR > &&  source)
delete

Move operator. Don't use it.

◆ operator==()

INLINE bool gum::prm::PRMObject::operator== ( const PRMObject obj) const
inherited

To PRMObject are equal if they have the same name (which is unique).

Definition at line 40 of file PRMObject_inl.h.

References gum::prm::PRMObject::__name, and gum::prm::PRMObject::name().

Referenced by gum::prm::PRMObject::isInstance().

40  {
41  return __name == obj.name();
42  }
std::string __name
Definition: PRMObject.h:197
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ operator[]() [1/4]

template<typename GUM_SCALAR >
INLINE PRMClassElement< GUM_SCALAR > & gum::prm::PRMClass< GUM_SCALAR >::operator[] ( NodeId  id)
virtual

See gum::prm::PRMClassElementContainer<GUM_SCALAR>::operator[](NodeId).

Implements gum::prm::PRMClassElementContainer< GUM_SCALAR >.

Definition at line 1177 of file PRMClass_tpl.h.

1177  {
1178  return get(id);
1179  }

◆ operator[]() [2/4]

template<typename GUM_SCALAR >
INLINE const PRMClassElement< GUM_SCALAR > & gum::prm::PRMClass< GUM_SCALAR >::operator[] ( NodeId  id) const
virtual

See gum::prm::PRMClassElementContainer<GUM_SCALAR>::operator[](NodeId).

Implements gum::prm::PRMClassElementContainer< GUM_SCALAR >.

Definition at line 1183 of file PRMClass_tpl.h.

1183  {
1184  return get(id);
1185  }

◆ operator[]() [3/4]

template<typename GUM_SCALAR >
INLINE PRMClassElement< GUM_SCALAR > & gum::prm::PRMClass< GUM_SCALAR >::operator[] ( const std::string &  name)
virtual

See gum::prm::PRMClassElementContainer<GUM_SCALAR>::operator[](const std::string&).

Implements gum::prm::PRMClassElementContainer< GUM_SCALAR >.

Definition at line 1189 of file PRMClass_tpl.h.

1189  {
1190  return get(name);
1191  }
const std::string & name() const
Returns the name of this object.
Definition: PRMObject_inl.h:32

◆ operator[]() [4/4]

template<typename GUM_SCALAR >
INLINE const PRMClassElement< GUM_SCALAR > & gum::prm::PRMClass< GUM_SCALAR >::operator[] ( const std::string &  name) const
virtual

See gum::prm::PRMClassElementContainer<GUM_SCALAR>::operator[](const std::string&).

Implements gum::prm::PRMClassElementContainer< GUM_SCALAR >.

Definition at line 1195 of file PRMClass_tpl.h.

1195  {
1196  return get(name);
1197  }
const std::string & name() const
Returns the name of this object.
Definition: PRMObject_inl.h:32

◆ overload()

template<typename GUM_SCALAR>
NodeId gum::prm::PRMClass< GUM_SCALAR >::overload ( PRMClassElement< GUM_SCALAR > *  elt)
virtual

See gum::prm::overload(PRMClassElement<GUM_SCALAR>*).

Implements gum::prm::PRMClassElementContainer< GUM_SCALAR >.

Definition at line 730 of file PRMClass_tpl.h.

Referenced by gum::prm::PRMFactory< GUM_SCALAR >::addAggregator(), and gum::prm::PRMFactory< GUM_SCALAR >::startAggregator().

731  {
732  try {
733  if (!super().exists(overloader->name())) {
734  GUM_ERROR(OperationNotAllowed,
735  "found no ClassElement<GUM_SCALAR> to overload");
736  }
737  } catch (NotFound&) {
738  GUM_ERROR(OperationNotAllowed,
739  "overload is possible only with subclasses");
740  }
741 
742  PRMClassElement< GUM_SCALAR >* overloaded = __nameMap[overloader->name()];
743  if (overloaded == overloader) {
744  GUM_ERROR(DuplicateElement,
745  "dupplicate ClassElement " << overloader->name());
746  }
747  // Checking overload legality
748  if (!__checkOverloadLegality(overloaded, overloader)) {
749  GUM_ERROR(OperationNotAllowed, "illegal overload");
750  }
751 
752  switch (overloader->elt_type()) {
754  auto overloader_attr =
755  static_cast< PRMAttribute< GUM_SCALAR >* >(overloader);
756  auto overloaded_attr =
757  static_cast< PRMAttribute< GUM_SCALAR >* >(overloaded);
758  __overloadAttribute(overloader_attr, overloaded_attr);
759  __addIOInterfaceFlags(overloader);
760  break;
761  }
762 
765  static_cast< PRMAggregate< GUM_SCALAR >* >(overloader), overloaded);
766  __addIOInterfaceFlags(overloader);
767  break;
768  }
769 
771  // __checkOverloadLegality guaranties that overloaded is a
772  // PRMReferenceSlot<GUM_SCALAR>
773  auto overloader_ref =
774  static_cast< PRMReferenceSlot< GUM_SCALAR >* >(overloader);
775  auto overloaded_ref =
776  static_cast< PRMReferenceSlot< GUM_SCALAR >* >(overloaded);
777  __overloadReference(overloader_ref, overloaded_ref);
778  break;
779  }
780 
782  GUM_ERROR(OperationNotAllowed,
783  "SlotChain<GUM_SCALAR> can not be overloaded");
784  break;
785  }
786 
788  auto overloaded_param =
789  static_cast< PRMParameter< GUM_SCALAR >* >(overloaded);
790  auto overloader_param =
791  static_cast< PRMParameter< GUM_SCALAR >* >(overloader);
792  __overloadParameter(overloader_param, overloaded_param);
793  break;
794  }
795  default: {
796  GUM_ERROR(OperationNotAllowed, "unknown ClassElement<GUM_SCALAR> type");
797  }
798  }
799 
800  return overloader->id();
801  }
void __overloadAttribute(PRMAttribute< GUM_SCALAR > *overloader, PRMAttribute< GUM_SCALAR > *overloaded)
Overloads an attribute.
Definition: PRMClass_tpl.h:804
bool __checkOverloadLegality(const PRMClassElement< GUM_SCALAR > *overloaded, const PRMClassElement< GUM_SCALAR > *overloader)
Return true of overloaded can be overload by overloader.
virtual bool exists(const std::string &name) const
Returns true if a member with the given name exists in this PRMClassElementContainer or in the PRMCla...
void __overloadAggregate(PRMAggregate< GUM_SCALAR > *overloader, PRMClassElement< GUM_SCALAR > *overloaded)
Overloads an aggregate.
void __overloadParameter(PRMParameter< GUM_SCALAR > *overloader, PRMParameter< GUM_SCALAR > *overloaded)
Overloads a parameter.
Definition: PRMClass_tpl.h:927
void __addIOInterfaceFlags(PRMClassElement< GUM_SCALAR > *elt)
Check if elt is present in an implementation. If it is, its IO flags are updated. ...
Definition: PRMClass_tpl.h:974
void __overloadReference(PRMReferenceSlot< GUM_SCALAR > *overloader, PRMReferenceSlot< GUM_SCALAR > *overloaded)
Overloads a reference slot.
Definition: PRMClass_tpl.h:831
const PRMClass< GUM_SCALAR > & super() const
Returns the super Class<GUM_SCALAR> of this Class<GUM_SCALAR>.
HashTable< std::string, PRMClassElement< GUM_SCALAR > *> __nameMap
Mapping between a member&#39;s name and itself. Used for fast access to a member given it&#39;s name...
Definition: PRMClass.h:353
#define GUM_ERROR(type, msg)
Definition: exceptions.h:52
+ Here is the caller graph for this function:

◆ parameters()

template<typename GUM_SCALAR >
INLINE const Set< PRMParameter< GUM_SCALAR > *> & gum::prm::PRMClass< GUM_SCALAR >::parameters ( ) const

Returns the set of parameters of this Class<GUM_SCALAR>.

Returns
Returns the set of parameters of this Class<GUM_SCALAR>.

Definition at line 1077 of file PRMClass_tpl.h.

1077  {
1078  return __parameters;
1079  }
Set< PRMParameter< GUM_SCALAR > *> __parameters
The Set of parameters in this Class<GUM_SCALAR>.
Definition: PRMClass.h:368

◆ referenceSlots()

template<typename GUM_SCALAR >
INLINE const Set< PRMReferenceSlot< GUM_SCALAR > *> & gum::prm::PRMClass< GUM_SCALAR >::referenceSlots ( ) const

Returns the set of PRMReferenceSlot<GUM_SCALAR> of this Class<GUM_SCALAR>.

Returns
Returns the set of PRMReferenceSlot<GUM_SCALAR> of this Class<GUM_SCALAR>.

Definition at line 1145 of file PRMClass_tpl.h.

1145  {
1146  return __referenceSlots;
1147  }
Set< PRMReferenceSlot< GUM_SCALAR > *> __referenceSlots
The sequence of PRMReferenceSlot<GUM_SCALAR>.
Definition: PRMClass.h:359

◆ RIGHT_CAST()

static std::string gum::prm::PRMObject::RIGHT_CAST ( )
inlinestaticinherited

Enumeration of the different types of objects handled by a PRM.

The "all" type is used to tell that we want any kind of PRMType (useful with iterators for example). No PRMObject will ever have "all" as type.

Definition at line 77 of file PRMObject.h.

Referenced by gum::prm::decomposePath(), gum::prm::PRMFormAttribute< GUM_SCALAR >::PRMFormAttribute(), and gum::prm::PRMScalarAttribute< GUM_SCALAR >::PRMScalarAttribute().

77 { return ")"; }
+ Here is the caller graph for this function:

◆ scope()

template<typename GUM_SCALAR >
INLINE HashTable< std::string, const PRMParameter< GUM_SCALAR > *> gum::prm::PRMClass< GUM_SCALAR >::scope ( ) const

Returns all the parameters in the scope of this class.

&return all the parameters in the scope of this class.

Definition at line 1098 of file PRMClass_tpl.h.

Referenced by gum::prm::o3prm::O3ClassFactory< GUM_SCALAR >::__checkRawCPT(), and gum::prm::o3prm::O3ClassFactory< GUM_SCALAR >::__checkRuleCPT().

1098  {
1099  HashTable< std::string, const PRMParameter< GUM_SCALAR >* > params;
1100 
1101  for (const auto p : parameters()) {
1102  params.insert(p->name(), p);
1103  }
1104 
1105  std::queue< ParamScopeData< GUM_SCALAR > > queue;
1106 
1107  for (const auto ref : referenceSlots()) {
1108  if (PRMObject::isClass(ref->slotType())) {
1109  queue.push(ParamScopeData< GUM_SCALAR >("", *ref, 1));
1110  }
1111  }
1112 
1113  while (!queue.empty()) {
1114  auto data = queue.front();
1115  queue.pop();
1116 
1117  if (data.depth < 5) {
1118  for (const auto p : data.c->parameters()) {
1119  params.insert(data.prefix + p->name(), p);
1120  }
1121 
1122  for (const auto ref : data.c->referenceSlots()) {
1123  if (PRMObject::isClass(ref->slotType())) {
1124  queue.push(
1125  ParamScopeData< GUM_SCALAR >(data.prefix, *ref, data.depth + 1));
1126  }
1127  }
1128  } else {
1129  // @todo depth>5 is a workaround. Cycle detection is needed here !
1130  GUM_TRACE("Depth limit reached when looking up parameters");
1131  }
1132  }
1133 
1134  return params;
1135  }
static INLINE bool isClass(const PRMObject &obj)
Returns true if obj_ptr is of type Class.
Definition: PRMObject.h:99
const Set< PRMParameter< GUM_SCALAR > *> & parameters() const
Returns the set of parameters of this Class<GUM_SCALAR>.
const Set< PRMReferenceSlot< GUM_SCALAR > *> & referenceSlots() const
Returns the set of PRMReferenceSlot<GUM_SCALAR> of this Class<GUM_SCALAR>.
+ Here is the caller graph for this function:

◆ setInputNode()

template<typename GUM_SCALAR>
INLINE void gum::prm::PRMClassElementContainer< GUM_SCALAR >::setInputNode ( const PRMClassElement< GUM_SCALAR > &  elt,
bool  b 
)
virtualinherited

Set the input flag value of id at b.

PRMAttribute or PRMAggregate can either be input, output, both or internal nodes.

By defaut, attributes and aggregates are inner nodes.

Parameters
eltA PRMClassElement<GUM_SCALAR>.
bThe flag value.
Exceptions
NotFoundRaised if id does'nt match any PRMClassElement<GUM_SCALAR> in this.
WrongClassElementRaised if NodeId is neither an PRMAttribute nor an PRMAggregate.

Definition at line 77 of file PRMClassElementContainer_tpl.h.

78  {
79  if (!exists(elt.safeName())) {
80  GUM_ERROR(NotFound,
81  ": <" + elt.safeName() + "> is not in <" + name() + ">");
84  try {
85  _getIOFlag(elt).first = b;
86  } catch (NotFound&) { _setIOFlag(elt, std::make_pair(b, false)); }
87  } else {
88  GUM_ERROR(WrongClassElement,
89  "given id is not an PRMAttribute or an PRMAggregate");
90  }
91  }
const std::string & name() const
Returns the name of this object.
Definition: PRMObject_inl.h:32
virtual bool exists(const std::string &name) const
Returns true if a member with the given name exists in this PRMClassElementContainer or in the PRMCla...
static INLINE bool isAttribute(const PRMClassElement< GUM_SCALAR > &elt)
Returns true if obj_ptr is of type PRMAttribute.
virtual std::pair< bool, bool > & _getIOFlag(const PRMClassElement< GUM_SCALAR > &elt)
Returns the IO flags of a PRMClassElement<GUM_SCALAR>.
virtual void _setIOFlag(const PRMClassElement< GUM_SCALAR > &elt, const std::pair< bool, bool > &flags)
Defines the IO flags of a PRMClassElement<GUM_SCALAR>.
static INLINE bool isAggregate(const PRMClassElement< GUM_SCALAR > &elt)
Return true if obj is of type PRMAggregate.
#define GUM_ERROR(type, msg)
Definition: exceptions.h:52

◆ setOutputNode()

template<typename GUM_SCALAR>
INLINE void gum::prm::PRMClassElementContainer< GUM_SCALAR >::setOutputNode ( const PRMClassElement< GUM_SCALAR > &  elt,
bool  b 
)
virtualinherited

Set the output flag value of id at b.

PRMAttribute or PRMAggregate can either be input, output, both or internal nodes.

By defaut, attributes and aggregates are inner nodes.

Parameters
eltA PRMClassElement<GUM_SCALAR>.
bThe flag value.
Exceptions
NotFoundRaised if id does'nt match any PRMClassElement<GUM_SCALAR> in this.
WrongClassElementRaised if NodeId is neither an PRMAttribute nor an PRMAggregate.

Definition at line 94 of file PRMClassElementContainer_tpl.h.

Referenced by gum::prm::PRMFactory< GUM_SCALAR >::__buildSlotChain().

95  {
96  if (!exists(elt.safeName())) {
97  GUM_ERROR(NotFound, "<" + elt.safeName() + "> is not in <" + name() + ">");
100  try {
101  _getIOFlag(elt).second = b;
102  } catch (NotFound&) { _setIOFlag(elt, std::make_pair(false, b)); }
103 
104  if (b) { _updateDescendants(elt); }
105  } else {
106  GUM_ERROR(WrongClassElement,
107  "given ClassElement<GUM_SCALAR> is not an "
108  "PRMAttribute or an PRMAggregate");
109  }
110  }
const std::string & name() const
Returns the name of this object.
Definition: PRMObject_inl.h:32
virtual bool exists(const std::string &name) const
Returns true if a member with the given name exists in this PRMClassElementContainer or in the PRMCla...
static INLINE bool isAttribute(const PRMClassElement< GUM_SCALAR > &elt)
Returns true if obj_ptr is of type PRMAttribute.
virtual std::pair< bool, bool > & _getIOFlag(const PRMClassElement< GUM_SCALAR > &elt)
Returns the IO flags of a PRMClassElement<GUM_SCALAR>.
virtual void _setIOFlag(const PRMClassElement< GUM_SCALAR > &elt, const std::pair< bool, bool > &flags)
Defines the IO flags of a PRMClassElement<GUM_SCALAR>.
virtual void _updateDescendants(const PRMClassElement< GUM_SCALAR > &elt)=0
When a PRMClassElement<GUM_SCALAR> becomes an Output node we must update any the IO flags of every de...
static INLINE bool isAggregate(const PRMClassElement< GUM_SCALAR > &elt)
Return true if obj is of type PRMAggregate.
#define GUM_ERROR(type, msg)
Definition: exceptions.h:52
+ Here is the caller graph for this function:

◆ slotChains()

template<typename GUM_SCALAR >
INLINE const Set< PRMSlotChain< GUM_SCALAR > *> & gum::prm::PRMClass< GUM_SCALAR >::slotChains ( ) const

Returns the set of PRMSlotChain<GUM_SCALAR> of this Class<GUM_SCALAR>.

Returns
Returns the set of PRMSlotChain<GUM_SCALAR> of this Class<GUM_SCALAR>.

Definition at line 1151 of file PRMClass_tpl.h.

1151  {
1152  return __slotChains;
1153  }
Set< PRMSlotChain< GUM_SCALAR > *> __slotChains
The set of gum::PRMSlotChain<GUM_SCALAR>s.
Definition: PRMClass.h:365

◆ super()

template<typename GUM_SCALAR >
INLINE const PRMClass< GUM_SCALAR > & gum::prm::PRMClass< GUM_SCALAR >::super ( ) const

Returns the super Class<GUM_SCALAR> of this Class<GUM_SCALAR>.

Returns
Returns the super Class<GUM_SCALAR> of this Class<GUM_SCALAR>.
Exceptions
NotFoundRaised if this has no super Class<GUM_SCALAR>.

Definition at line 1156 of file PRMClass_tpl.h.

1156  {
1157  if (__superClass) {
1158  return *__superClass;
1159  } else {
1160  GUM_ERROR(NotFound, "this Class is not a subclass");
1161  }
1162  }
PRMClass< GUM_SCALAR > * __superClass
The alternate PRMClassElementContainer<GUM_SCALAR> searched for elements defined in this...
Definition: PRMClass.h:388
#define GUM_ERROR(type, msg)
Definition: exceptions.h:52

Friends And Related Function Documentation

◆ PRMInterface< GUM_SCALAR >

template<typename GUM_SCALAR>
friend class PRMInterface< GUM_SCALAR >
friend

Definition at line 64 of file PRMClass.h.

Member Data Documentation

◆ __aggregates

template<typename GUM_SCALAR>
Set< PRMAggregate< GUM_SCALAR >* > gum::prm::PRMClass< GUM_SCALAR >::__aggregates
private

The sequence of aggregate.

Definition at line 362 of file PRMClass.h.

Referenced by gum::prm::PRMClass< double >::__inheritClass().

◆ __attributes

template<typename GUM_SCALAR>
Set< PRMAttribute< GUM_SCALAR >* > gum::prm::PRMClass< GUM_SCALAR >::__attributes
private

The sequence of PRMAttribute<GUM_SCALAR>s.

Definition at line 356 of file PRMClass.h.

Referenced by gum::prm::PRMClass< double >::__inheritClass().

◆ __bijection

template<typename GUM_SCALAR>
Bijection< const DiscreteVariable*, const DiscreteVariable* >* gum::prm::PRMClass< GUM_SCALAR >::__bijection
private

The bijection between variables in super and variables in this The bijection's firsts are attributes in this and its seconds are attributes in c.

Definition at line 400 of file PRMClass.h.

◆ __dag

template<typename GUM_SCALAR>
DAG gum::prm::PRMClass< GUM_SCALAR >::__dag
private

The dag representing dependencies between formal attributes and slots.

Definition at line 339 of file PRMClass.h.

◆ __dummy_hashfunc

template<typename GUM_SCALAR>
HashFunc< PRMClassElementContainer< GUM_SCALAR >* > gum::prm::PRMClass< GUM_SCALAR >::__dummy_hashfunc
private

a dummy member used to fix a compilation issue in clang4

Definition at line 403 of file PRMClass.h.

◆ __extensions

template<typename GUM_SCALAR>
Set< PRMClass< GUM_SCALAR >* > gum::prm::PRMClass< GUM_SCALAR >::__extensions
private

The set of Class<GUM_SCALAR> which are extension of this Class<GUM_SCALAR> (i.e. direct subtypes).

Definition at line 395 of file PRMClass.h.

◆ __implements

template<typename GUM_SCALAR>
Set< PRMInterface< GUM_SCALAR >* >* gum::prm::PRMClass< GUM_SCALAR >::__implements
private

The Set of implemented interface of this.

Definition at line 391 of file PRMClass.h.

Referenced by gum::prm::PRMClass< double >::__inheritClass().

◆ __nameMap

template<typename GUM_SCALAR>
HashTable< std::string, PRMClassElement< GUM_SCALAR >* > gum::prm::PRMClass< GUM_SCALAR >::__nameMap
private

Mapping between a member's name and itself. Used for fast access to a member given it's name.

Definition at line 353 of file PRMClass.h.

Referenced by gum::prm::PRMClass< double >::__inheritClass().

◆ __nodeIdMap

template<typename GUM_SCALAR>
NodeProperty< PRMClassElement< GUM_SCALAR >* > gum::prm::PRMClass< GUM_SCALAR >::__nodeIdMap
private

Mapping between node's id and their name (being an attribute or a slot). Used for fast access to a member given it's node id.

Definition at line 343 of file PRMClass.h.

◆ __parameters

template<typename GUM_SCALAR>
Set< PRMParameter< GUM_SCALAR >* > gum::prm::PRMClass< GUM_SCALAR >::__parameters
private

The Set of parameters in this Class<GUM_SCALAR>.

Definition at line 368 of file PRMClass.h.

Referenced by gum::prm::PRMClass< double >::__inheritClass().

◆ __referenceSlots

template<typename GUM_SCALAR>
Set< PRMReferenceSlot< GUM_SCALAR >* > gum::prm::PRMClass< GUM_SCALAR >::__referenceSlots
private

The sequence of PRMReferenceSlot<GUM_SCALAR>.

Definition at line 359 of file PRMClass.h.

Referenced by gum::prm::PRMClass< double >::__inheritClass().

◆ __slotChains

template<typename GUM_SCALAR>
Set< PRMSlotChain< GUM_SCALAR >* > gum::prm::PRMClass< GUM_SCALAR >::__slotChains
private

The set of gum::PRMSlotChain<GUM_SCALAR>s.

Definition at line 365 of file PRMClass.h.

Referenced by gum::prm::PRMClass< double >::__inheritClass().

◆ __superClass

template<typename GUM_SCALAR>
PRMClass< GUM_SCALAR >* gum::prm::PRMClass< GUM_SCALAR >::__superClass
private

The alternate PRMClassElementContainer<GUM_SCALAR> searched for elements defined in this. Note that this is first searched for gum::PRMClassElement<GUM_SCALAR>.

Definition at line 388 of file PRMClass.h.

Referenced by gum::prm::PRMClass< double >::isSubTypeOf().


The documentation for this class was generated from the following files: