36 template <
typename GUM_SCALAR >
42 template <
typename GUM_SCALAR >
45 bool delayInheritance) :
47 __superInterface(&super) {
49 if (!delayInheritance) { __inheritInterface(super); }
52 template <
typename GUM_SCALAR >
56 __dag(source.__dag), __superInterface(source.__superInterface) {
61 template <
typename GUM_SCALAR >
65 for (
const auto& elt : __nodeIdMap) {
70 template <
typename GUM_SCALAR >
72 if (__superInterface !=
nullptr) { __inheritInterface(*__superInterface); }
75 template <
typename GUM_SCALAR >
82 attr->
setId(i_attr->id());
83 __nodeIdMap.insert(attr->id(), attr);
84 __attributes.insert(attr);
87 __nameMap.insert(attr->name(), attr);
90 __nameMap.insert(attr->safeName(), attr);
91 __dag.addNodeWithId(attr->id());
102 ref->
setId(i_ref->id());
103 __nodeIdMap.insert(ref->id(), ref);
104 __referenceSlots.insert(ref);
107 __nameMap.insert(ref->name(), ref);
110 __nameMap.insert(ref->safeName(), ref);
111 __dag.addNodeWithId(ref->id());
115 template <
typename GUM_SCALAR >
117 if (__nameMap.exists(elt->
name())) {
119 "name '" << elt->
name()
120 <<
"' is already used by another ClassElement");
126 __nameMap.insert(attr->
name(), attr);
130 __dag.addNodeWithId(attr->
id());
131 __nodeIdMap.insert(attr->
id(), attr);
132 __nameMap.insert(attr->
safeName(), attr);
133 __attributes.insert(attr);
135 if (attr->
type().isSubType()) {
143 __dag.addNodeWithId(elt->
id());
144 __nodeIdMap.insert(elt->
id(), elt);
145 __referenceSlots.insert(
147 __nameMap.insert(elt->
name(), elt);
148 __nameMap.insert(elt->
safeName(), elt);
151 "illegal ClassElement<GUM_SCALAR> for an Interface");
157 template <
typename GUM_SCALAR >
161 if (!super().exists(overloader->
name())) {
163 "found no ClassElement<GUM_SCALAR> to overload");
167 "overload is possible only with sub interfaces");
171 if (overloaded == overloader) {
173 "duplicate ClassElement '" << overloader->
name() <<
"'");
175 if (!__checkOverloadLegality(overloaded, overloader)) {
181 auto attr_overloader =
183 auto attr_overloaded =
185 __overloadAttribute(attr_overloader, attr_overloaded);
190 auto ref_overloader =
192 auto ref_overloaded =
194 __overloadReferenceSlot(ref_overloader, ref_overloaded);
200 auto msg =
"element can ! be overloaded";
210 return overloader->
id();
213 template <
typename GUM_SCALAR >
217 if (overloader->
type() != overloaded->
type()) {
219 __dag.addNodeWithId(overloader->
id());
220 __nodeIdMap.insert(overloader->
id(), overloader);
221 __nameMap[overloader->
name()] = overloader;
222 __nameMap.insert(overloader->
safeName(), overloader);
223 __attributes.insert(overloader);
224 __addCastDescendants(overloader, overloaded);
226 overloader->
setId(overloaded->
id());
227 __nodeIdMap[overloader->
id()] = overloader;
228 __nameMap[overloader->
name()] = overloader;
229 __nameMap[overloader->
safeName()] = overloader;
230 __attributes.erase(overloaded);
231 __attributes.insert(overloader);
240 template <
typename GUM_SCALAR >
245 overloader->
setId(overloaded->
id());
246 __nodeIdMap[overloader->
id()] = overloader;
247 __nameMap[overloader->
name()] = overloader;
248 __nameMap.insert(overloader->
safeName(), overloader);
249 __referenceSlots.insert(overloader);
251 __referenceSlots.erase(overloaded);
252 __nameMap.erase(overloaded->
safeName());
256 template <
typename GUM_SCALAR >
262 while (parent->
type().superType() != end->
type()) {
265 __dag.addNodeWithId(child->
id());
266 __nodeIdMap.insert(child->
id(), child);
268 __nameMap.insert(child->
safeName(), child);
269 __attributes.insert(child);
278 template <
typename GUM_SCALAR >
285 if (!overloader->
type().isSubTypeOf(overloaded->
type())) {
return false; }
288 auto ref_overloader =
290 auto ref_overloaded =
292 if (!ref_overloader->slotType().isSubTypeOf(ref_overloaded->
slotType())) {
301 template <
typename GUM_SCALAR >
312 while (current != 0) {
313 if (current == &(cec))
return true;
327 template <
typename GUM_SCALAR >
342 template <
typename GUM_SCALAR >
345 return __nodeIdMap.
begin();
348 template <
typename GUM_SCALAR >
351 return __nodeIdMap.
end();
354 template <
typename GUM_SCALAR >
357 return __nodeIdMap.
begin();
360 template <
typename GUM_SCALAR >
363 return __nodeIdMap.
end();
366 template <
typename GUM_SCALAR >
368 const std::string& head) {
372 template <
typename GUM_SCALAR >
374 if (__superInterface)
375 return *__superInterface;
380 template <
typename GUM_SCALAR >
383 if (__superInterface)
384 return *__superInterface;
389 template <
typename GUM_SCALAR >
392 __implementations.insert(c);
395 template <
typename GUM_SCALAR >
398 __extensions.insert(i);
401 template <
typename GUM_SCALAR >
407 template <
typename GUM_SCALAR >
413 template <
typename GUM_SCALAR >
419 template <
typename GUM_SCALAR >
425 template <
typename GUM_SCALAR >
428 return PRMObject::prm_type::PRM_INTERFACE;
431 template <
typename GUM_SCALAR >
436 template <
typename GUM_SCALAR >
441 template <
typename GUM_SCALAR >
445 return *(__nodeIdMap[id]);
451 template <
typename GUM_SCALAR >
455 return *(__nodeIdMap[id]);
461 template <
typename GUM_SCALAR >
465 return *(__nameMap[name]);
471 template <
typename GUM_SCALAR >
475 return *(__nameMap[name]);
481 template <
typename GUM_SCALAR >
487 template <
typename GUM_SCALAR >
490 return __referenceSlots;
493 template <
typename GUM_SCALAR >
496 return __implementations;
499 template <
typename GUM_SCALAR >
502 return __implementations;
505 template <
typename GUM_SCALAR >
508 for (
const auto impl : __implementations) {
513 for (
const auto ext : __extensions) {
515 ext->_findAllSubtypes(
set);
519 template <
typename GUM_SCALAR >
523 if (!this->_getIOFlag(elt).second) {
524 for (
auto i : __implementations) {
525 if (i->isOutputNode(elt)) {
return true; }
528 if (__superInterface && __superInterface->isOutputNode(elt)) {
Unsafe Const Iterators for hashtablesHashTableConstIterator provides a fast but unsafe way to parse H...
virtual PRMAttribute< GUM_SCALAR > * getCastDescendant() const =0
Returns a proper cast descendant of this PRMAttribute.
const std::string & name() const
Returns the name of this object.
virtual PRMType & type()=0
See gum::PRMClassElement::type().
Copyright 2005-2019 Pierre-Henri WUILLEMIN et Christophe GONZALES (LIP6) {prenom.nom}_at_lip6.fr.
Unsafe Iterators for hashtablesHashTableIterator provides a fast but unsafe way to parse HashTables...
virtual prm_type obj_type() const =0
Returns the type of this object.
Abstract class representing an element of PRM class.
void _findAllSubtypes(Set< PRMClassElementContainer< GUM_SCALAR > * > &set)
Fills set with all the subtypes of this PRMInterface, this includes extensions and implementations...
Copyright 2005-2019 Pierre-Henri WUILLEMIN et Christophe GONZALES (LIP6) {prenom.nom}_at_lip6.fr.
Copyright 2005-2019 Pierre-Henri WUILLEMIN et Christophe GONZALES (LIP6) {prenom.nom}_at_lip6.fr.
A PRMReferenceSlot represent a relation between two PRMClassElementContainer.
PRMClassElementContainer< GUM_SCALAR > & slotType()
Returns the type of this slot, which is a PRMClassElementContainer (it is not the type of PRMObject)...
Representation of a setA Set is a structure that contains arbitrary elements.
const std::string & safeName() const
Returns the safe name of this PRMClassElement, if any.
prm_type
Enumeration of the different types of objects handled by a PRM.
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...
virtual void overload(PRMAttribute< GUM_SCALAR > *source)
Set this as overload of source (necessayr to preserver internal pointers for MultiDims).
PRMInterface(const std::string &name)
Default constructor.
An PRMInterface is implemented by a Class<GUM_SCALAR> and defines a set of PRMReferenceSlot<GUM_SCALA...
virtual ClassElementType elt_type() const =0
Return the type of class element this object is.
virtual PRMType & type()=0
Return a reference over the gum::PRMType of this class element.
NodeId nextNodeId()
Returns the next value of an unique counter for PRM's node id.
<agrum/PRM/classElementContainer.h>
NodeId id() const
Returns the NodeId of this element in it's class DAG.
virtual void setId(NodeId id)
Used to assign the id of this element.
Set< PRMAttribute< GUM_SCALAR > *> __attributes
The sequence of PRMAttribute<GUM_SCALAR>s.
A PRMClass is an object of a PRM representing a fragment of a Bayesian Network which can be instantia...
virtual void setAsCastDescendant(PRMAttribute< GUM_SCALAR > *attr)=0
Define attr as a cast descendant of this PRMAttribute.
const ClassEltIterator & end()
PRMInterface< GUM_SCALAR > * __superInterface
The alternate PRMClassElementContainer<GUM_SCALAR> searched for elements defined in this...
Set< PRMReferenceSlot< GUM_SCALAR > *> __referenceSlots
The sequence of PRMReferenceSlot<GUM_SCALAR>.
PRMAttribute is a member of a Class in a PRM.
<agrum/PRM/elements/scalarAttribute.h>
Size NodeId
Type for node ids.
#define GUM_ERROR(type, msg)