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

Factory which builds a PRM<GUM_SCALAR>. More...

#include <PRMType.h>

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

Public Member Functions

Constructors & destructor
 PRMFactory ()
 Default constructor. More...
 
 PRMFactory (PRM< GUM_SCALAR > *prm)
 This constructor let you set on which PRM instance the factory works. More...
 
 PRMFactory (const PRMFactory &from)=delete
 Copy constructor. Don't use it. More...
 
PRMFactoryoperator= (const PRMFactory &from)=delete
 Copy operator. Don't use it. More...
 
virtual ~PRMFactory ()
 Destructor. More...
 
Getters & Setters
PRM< GUM_SCALAR > * prm () const
 Returns a pointer on the PRM<GUM_SCALAR> created by this factory. More...
 
virtual PRMObject::prm_type currentType () const override
 
virtual PRMObjectgetCurrent () override
 
virtual const PRMObjectgetCurrent () const override
 Returns a pointer on the PRM<GUM_SCALAR> created by this factory. More...
 
virtual PRMObjectcloseCurrent () override
 Close current object being built. More...
 
virtual std::string currentPackage () const override
 
PRMClass< GUM_SCALAR > & retrieveClass (const std::string &name)
 Returns a reference over a Class<GUM_SCALAR> given its name. More...
 
PRMTyperetrieveType (const std::string &name)
 Returns a reference over a PRMType given its name. More...
 
PRMTyperetrieveCommonType (const std::vector< PRMClassElement< GUM_SCALAR > * > &elts)
 Returns a pointer on the PRM<GUM_SCALAR> created by this factory. More...
 
Package construction methods.
virtual void pushPackage (const std::string &name) override
 Define the current package. More...
 
virtual std::string popPackage () override
 Pop the current package from the package stack. More...
 
virtual void addImport (const std::string &name) override
 Add an import for namespace lookup. More...
 
PRMType construction methods.
virtual void startDiscreteType (const std::string &name, std::string super="") override
 Start a discrete subtype declaration. More...
 
virtual void addLabel (const std::string &l, std::string ext="") override
 Add a label to the current discrete type. More...
 
virtual void endDiscreteType () override
 End the current discrete type declaration. More...
 
virtual void startDiscretizedType (const std::string &name) override
 Start a discretized type declaration. More...
 
virtual void addTick (double tick) override
 Add a tick to the current discretized type. More...
 
virtual void endDiscretizedType () override
 End the current discretized type declaration. More...
 
virtual void addRangeType (const std::string &name, long minVal, long maxVal) override
 Add a range variable type declaration. More...
 
several checks for parsers
virtual bool isClassOrInterface (const std::string &type) const override
 
virtual bool isArrayInCurrentSystem (const std::string &name) const override
 
Class<GUM_SCALAR> construction models.
virtual void startClass (const std::string &c, const std::string &ext="", const Set< std::string > *implements=nullptr, bool delayInheritance=false) override
 Tells the factory that we start a class declaration. More...
 
virtual void continueClass (const std::string &c) override
 Continue the declaration of a class. More...
 
virtual void endClass (bool checkImplementations=true) override
 Tells the factory that we finished a class declaration. More...
 
PRMInterface<GUM_SCALAR> construction models.
virtual void startInterface (const std::string &i, const std::string &ext="", bool delayInheritance=false) override
 Tells the factory that we start an interface declaration. More...
 
virtual void continueInterface (const std::string &name) override
 Continue the declaration of an interface. More...
 
virtual void addAttribute (const std::string &type, const std::string &name) override
 Add an attribute to an interface. More...
 
virtual void endInterface () override
 Tells the factory that we finished an interface declaration. More...
 
Attributes construction methods.
virtual void addAttribute (PRMAttribute< GUM_SCALAR > *attr)
 Add an already created attribute to the current class. More...
 
virtual void startAttribute (const std::string &type, const std::string &name, bool scalar_atttr=false) override
 Tells the factory that we start an attribute declaration. More...
 
virtual void continueAttribute (const std::string &name) override
 Continues the declaration of an attribute. More...
 
virtual void addParent (const std::string &name) override
 Tells the factory that we add a parent to the current declared attribute. More...
 
void setRawCPFByLines (const std::vector< GUM_SCALAR > &array)
 Gives the factory the CPF in its raw form. More...
 
void setRawCPFByColumns (const std::vector< GUM_SCALAR > &array)
 Gives the factory the CPF in its raw form. More...
 
virtual void setCPFByRule (const std::vector< std::string > &labels, const std::vector< GUM_SCALAR > &values)
 Fills the CPF using a rule. More...
 
virtual void setCPFByRule (const std::vector< std::string > &labels, const std::vector< std::string > &values) override
 Fills the CPF using a rule and gum::Formula. More...
 
virtual void setRawCPFByFloatLines (const std::vector< float > &array) override
 Gives the factory the CPF in its raw form. More...
 
virtual void setRawCPFByFloatColumns (const std::vector< float > &array) override
 Gives the factory the CPF in its raw form. More...
 
virtual void setRawCPFByColumns (const std::vector< std::string > &array) override
 Gives the factory the CPF in its raw form use gum::Formula. More...
 
virtual void setRawCPFByLines (const std::vector< std::string > &array) override
 Gives the factory the CPF in its raw form using gum::Formula. More...
 
virtual void setCPFByFloatRule (const std::vector< std::string > &labels, const std::vector< float > &values) override
 Fills the CPF using a rule. More...
 
virtual void endAttribute () override
 Tells the factory that we finished declaring an attribute. More...
 
Parameters construction methods.
void addParameter (const std::string &type, const std::string &name, double value) override
 Add a parameter to the current class with a default value. More...
 
Aggregator and function construction methods.
virtual void addAggregator (const std::string &name, const std::string &agg_type, const std::vector< std::string > &chains, const std::vector< std::string > &params, std::string type="") override
 Add an aggregator in the current declared class. More...
 
void startAggregator (const std::string &name, const std::string &agg_type, const std::string &rv_type, const std::vector< std::string > &params)
 Start an aggregator declaration. More...
 
void continueAggregator (const std::string &name)
 Conitnues an aggregator declaration. More...
 
void endAggregator ()
 Finishes an aggregate declaration. More...
 
virtual void addNoisyOrCompound (const std::string &name, const std::vector< std::string > &chains, const std::vector< float > &numbers, float leak, const std::vector< std::string > &label) override
 Add a compound noisy-or as an PRMAttribute<GUM_SCALAR> to the current Class<GUM_SCALAR>. More...
 
PRMReferenceSlot<GUM_SCALAR> construction methods.
virtual void addReferenceSlot (const std::string &type, const std::string &name, bool isArray) override
 Tells the factory that we started declaring a slot. More...
 
Systems constructions methods.
virtual void startSystem (const std::string &name) override
 Tells the factory that we started declaring a model. More...
 
virtual void endSystem () override
 Tells the factory that we finished declaring a model. More...
 
virtual void addInstance (const std::string &type, const std::string &name) override
 Add an instance to the model. More...
 
void addInstance (const std::string &type, const std::string &name, const HashTable< std::string, double > &params) override
 Add an instance with params as values of type's parameters. More...
 
virtual void addArray (const std::string &type, const std::string &name, Size size) override
 Creates an array with the given number of instances of the given type. More...
 
virtual void incArray (const std::string &l_i, const std::string &r_i) override
 Add an instance to an array. More...
 
virtual void setReferenceSlot (const std::string &left_instance, const std::string &left_reference, const std::string &right_instance) override
 Instantiate a reference in the current model. More...
 
virtual void setReferenceSlot (const std::string &l_i, const std::string &r_i) override
 Instantiate a reference in the current model. More...
 

Detailed Description

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

Factory which builds a PRM<GUM_SCALAR>.

The Factory always create one PRM<GUM_SCALAR> which is not deleted with the factory, so be very careful to delete the PRM<GUM_SCALAR> built by this factory.

The factory does not allow any sequence of calls, if you call a method when the factory is in an incoherent state it will raise a FactoryInvalidState exception.

Keep in mind that most methods could raise gum::FatalError if something unexpected happens, since the framework is meant to evolve it is possible.

See also
PRM<GUM_SCALAR> PRMObject

Definition at line 47 of file PRMType.h.

Constructor & Destructor Documentation

◆ PRMFactory() [1/3]

template<typename GUM_SCALAR >
INLINE gum::prm::PRMFactory< GUM_SCALAR >::PRMFactory ( )

Default constructor.

Definition at line 1348 of file PRMFactory_tpl.h.

1348  {
1349  GUM_CONSTRUCTOR(PRMFactory);
1350  __prm = new PRM< GUM_SCALAR >();
1351  }
PRM< GUM_SCALAR > * __prm
The pointer on the PRM<GUM_SCALAR> built by this factory.
Definition: PRMFactory.h:1046
PRMFactory()
Default constructor.

◆ PRMFactory() [2/3]

template<typename GUM_SCALAR >
INLINE gum::prm::PRMFactory< GUM_SCALAR >::PRMFactory ( PRM< GUM_SCALAR > *  prm)

This constructor let you set on which PRM instance the factory works.

Definition at line 1354 of file PRMFactory_tpl.h.

1354  :
1355  IPRMFactory(), __prm(prm) {
1356  GUM_CONSTRUCTOR(PRMFactory);
1357  }
PRM< GUM_SCALAR > * __prm
The pointer on the PRM<GUM_SCALAR> built by this factory.
Definition: PRMFactory.h:1046
PRMFactory()
Default constructor.
PRM< GUM_SCALAR > * prm() const
Returns a pointer on the PRM<GUM_SCALAR> created by this factory.

◆ PRMFactory() [3/3]

template<typename GUM_SCALAR>
gum::prm::PRMFactory< GUM_SCALAR >::PRMFactory ( const PRMFactory< GUM_SCALAR > &  from)
delete

Copy constructor. Don't use it.

◆ ~PRMFactory()

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

Destructor.

Definition at line 1360 of file PRMFactory_tpl.h.

References gum::prm::PRMFactory< GUM_SCALAR >::__namespaces.

1360  {
1361  GUM_DESTRUCTOR(PRMFactory);
1362  while (!__namespaces.empty()) {
1363  auto ns = __namespaces.back();
1364  __namespaces.pop_back();
1365  delete ns;
1366  }
1367  }
PRMFactory()
Default constructor.
std::vector< List< std::string > *> __namespaces
Set of all declared namespaces.
Definition: PRMFactory.h:1043

Member Function Documentation

◆ __addInstance()

template<typename GUM_SCALAR >
INLINE void gum::prm::PRMFactory< GUM_SCALAR >::__addInstance ( PRMClass< GUM_SCALAR > *  type,
const std::string &  name 
)
private

Adds a instance to the current model.

Definition at line 1738 of file PRMFactory_tpl.h.

References gum::prm::PRMFactory< GUM_SCALAR >::__checkStack(), gum::prm::PRMInstance< GUM_SCALAR >::add(), and gum::prm::PRMObject::SYSTEM.

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

1739  {
1740  PRMInstance< GUM_SCALAR >* i = nullptr;
1741  try {
1742  auto s = static_cast< PRMSystem< GUM_SCALAR >* >(
1744  i = new PRMInstance< GUM_SCALAR >(name, *type);
1745  s->add(i);
1746 
1747  } catch (OperationNotAllowed&) {
1748  if (i) { delete i; }
1749  throw;
1750  }
1751  }
PRMObject * __checkStack(Idx i, PRMObject::prm_type obj_type)
Return a pointer on a PRMObject at __stack.size() - i position after checking the type of the object ...
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ __addParent() [1/2]

template<typename GUM_SCALAR >
INLINE void gum::prm::PRMFactory< GUM_SCALAR >::__addParent ( PRMClassElementContainer< GUM_SCALAR > *  c,
PRMAttribute< GUM_SCALAR > *  agg,
const std::string &  name 
)
private

Add a parent to an attribute.

Definition at line 248 of file PRMFactory_tpl.h.

References gum::prm::PRMClassElementContainer< GUM_SCALAR >::add(), gum::prm::PRMClassElementContainer< GUM_SCALAR >::addArc(), gum::prm::PRMClassElement< GUM_SCALAR >::elt_type(), gum::prm::PRMClassElementContainer< GUM_SCALAR >::get(), GUM_ERROR, gum::prm::PRMSlotChain< GUM_SCALAR >::isMultiple(), and gum::prm::PRMObject::name().

251  {
252  try {
253  PRMClassElement< GUM_SCALAR >& elt = c->get(name);
254 
255  switch (elt.elt_type()) {
257  GUM_ERROR(OperationNotAllowed,
258  "can not add a reference slot as a parent of an attribute");
259  break;
260  }
261 
263  if (static_cast< PRMSlotChain< GUM_SCALAR >& >(elt).isMultiple()) {
264  GUM_ERROR(OperationNotAllowed,
265  "can not add a multiple slot chain to an attribute");
266  }
267 
268  c->addArc(name, a->name());
269 
270  break;
271  }
272 
275  c->addArc(name, a->name());
276  break;
277  }
278 
279  default: { GUM_ERROR(FatalError, "unknown ClassElement<GUM_SCALAR>"); }
280  }
281  } catch (NotFound&) {
282  // Check if name is a slot chain
283  PRMSlotChain< GUM_SCALAR >* sc = __buildSlotChain(c, name);
284 
285  if (sc == nullptr) {
286  std::string msg =
287  "found no ClassElement<GUM_SCALAR> with the given name ";
288  GUM_ERROR(NotFound, msg + name);
289  } else if (!sc->isMultiple()) {
290  c->add(sc);
291  c->addArc(sc->name(), a->name());
292  } else {
293  delete sc;
294  GUM_ERROR(OperationNotAllowed,
295  "Impossible to add a multiple reference slot as"
296  " direct parent of an PRMAttribute<GUM_SCALAR>.");
297  }
298  }
299  }
PRMSlotChain< GUM_SCALAR > * __buildSlotChain(PRMClassElementContainer< GUM_SCALAR > *start, const std::string &name)
This methods build a PRMSlotChain<GUM_SCALAR> given a starting element and a string.
#define GUM_ERROR(type, msg)
Definition: exceptions.h:52
+ Here is the call graph for this function:

◆ __addParent() [2/2]

template<typename GUM_SCALAR >
INLINE void gum::prm::PRMFactory< GUM_SCALAR >::__addParent ( PRMClass< GUM_SCALAR > *  c,
PRMAggregate< GUM_SCALAR > *  agg,
const std::string &  name 
)
private

Add a parent to an aggregate.

Definition at line 615 of file PRMFactory_tpl.h.

References gum::prm::PRMClass< GUM_SCALAR >::addArc(), gum::prm::PRMAggregate< GUM_SCALAR >::agg_type(), GUM_ERROR, gum::prm::PRMAggregate< GUM_SCALAR >::hasLabel(), gum::prm::PRMAggregate< GUM_SCALAR >::labelValue(), gum::prm::PRMClassElement< GUM_SCALAR >::safeName(), and gum::prm::PRMAggregate< GUM_SCALAR >::setLabel().

617  {
618  auto chains = std::vector< std::string >{name};
619  auto inputs = std::vector< PRMClassElement< GUM_SCALAR >* >();
620  __retrieveInputs(c, chains, inputs);
621 
622  switch (agg->agg_type()) {
625  if (inputs.front()->type() != *(__retrieveType("boolean"))) {
626  GUM_ERROR(WrongType, "expected booleans");
627  }
628 
629  break;
630  }
631 
635  if (!agg->hasLabel()) {
636  auto param = agg->labelValue();
637  Idx label_idx = 0;
638 
639  while (label_idx < inputs.front()->type()->domainSize()) {
640  if (inputs.front()->type()->label(label_idx) == param) { break; }
641 
642  ++label_idx;
643  }
644 
645  if (label_idx == inputs.front()->type()->domainSize()) {
646  GUM_ERROR(NotFound, "could not find label");
647  }
648 
649  agg->setLabel(label_idx);
650  }
651 
652  break;
653  }
654 
659  break;
660  }
661 
662  default: { GUM_ERROR(FatalError, "Unknown aggregator."); }
663  }
664 
665  c->addArc(inputs.front()->safeName(), agg->safeName());
666  }
PRMType * __retrieveType(const std::string &name) const
Returns a pointer on a PRMType given it&#39;s name. Since the type can be given either with it&#39;s local na...
#define GUM_ERROR(type, msg)
Definition: exceptions.h:52
bool __retrieveInputs(PRMClass< GUM_SCALAR > *c, const std::vector< std::string > &chains, std::vector< PRMClassElement< GUM_SCALAR > * > &inputs)
Retrieve inputs for an PRMAggregate.
+ Here is the call graph for this function:

◆ __addPrefix()

template<typename GUM_SCALAR >
INLINE std::string gum::prm::PRMFactory< GUM_SCALAR >::__addPrefix ( const std::string &  str) const
private

Adds __prefix to str iff __prefix != "".

Definition at line 1755 of file PRMFactory_tpl.h.

References gum::prm::PRMFactory< GUM_SCALAR >::__packages.

Referenced by gum::prm::PRMFactory< GUM_SCALAR >::addRangeType(), gum::prm::PRMFactory< GUM_SCALAR >::startDiscreteType(), gum::prm::PRMFactory< GUM_SCALAR >::startDiscretizedType(), and gum::prm::PRMFactory< GUM_SCALAR >::startSystem().

1755  {
1756  if (!__packages.empty()) {
1757  std::string full_name = __packages.back();
1758  full_name.append(".");
1759  full_name.append(str);
1760  return full_name;
1761  } else {
1762  return str;
1763  }
1764  }
std::vector< std::string > __packages
The prefix used for classes and types names. It is normally the namespace of the corresponding compil...
Definition: PRMFactory.h:1040
+ Here is the caller graph for this function:

◆ __buildAggregateCPF()

template<typename GUM_SCALAR>
void gum::prm::PRMFactory< GUM_SCALAR >::__buildAggregateCPF ( PRMSystem< GUM_SCALAR > *  model)
private

Builds all Aggregates CPF in the given model. This must be called after all the slot chains have been generated.

◆ __buildSlotChain()

template<typename GUM_SCALAR >
INLINE PRMSlotChain< GUM_SCALAR > * gum::prm::PRMFactory< GUM_SCALAR >::__buildSlotChain ( PRMClassElementContainer< GUM_SCALAR > *  start,
const std::string &  name 
)
private

This methods build a PRMSlotChain<GUM_SCALAR> given a starting element and a string.

Returns
Return a pointer over a PRMSlotChain<GUM_SCALAR> or 0 if no PRMSlotChain<GUM_SCALAR> could be built.

Definition at line 949 of file PRMFactory_tpl.h.

References gum::SequenceImplementation< Key, Alloc, std::is_scalar< Key >::value >::back(), gum::prm::decomposePath(), gum::prm::PRMClassElementContainer< GUM_SCALAR >::get(), gum::SequenceImplementation< Key, Alloc, std::is_scalar< Key >::value >::insert(), gum::prm::PRMClassElementContainer< GUM_SCALAR >::setOutputNode(), gum::SequenceImplementation< Key, Alloc, std::is_scalar< Key >::value >::size(), and gum::prm::PRMReferenceSlot< GUM_SCALAR >::slotType().

950  {
951  std::vector< std::string > v;
952  decomposePath(name, v);
953  PRMClassElementContainer< GUM_SCALAR >* current = start;
954  PRMReferenceSlot< GUM_SCALAR >* ref = nullptr;
955  Sequence< PRMClassElement< GUM_SCALAR >* > elts;
956 
957  for (size_t i = 0; i < v.size(); ++i) {
958  try {
959  switch (current->get(v[i]).elt_type()) {
961  ref = &(static_cast< PRMReferenceSlot< GUM_SCALAR >& >(
962  current->get(v[i])));
963  elts.insert(ref);
964  current = &(/*const_cast<PRMClassElementContainer<GUM_SCALAR>&>*/ (
965  ref->slotType()));
966  break;
967 
970 
971  if (i == v.size() - 1) {
972  elts.insert(&(current->get(v[i])));
973  break;
974  } else {
975  return nullptr;
976  }
977 
978  default: { return nullptr; }
979  }
980  } catch (NotFound&) { return nullptr; }
981  }
982 
983  GUM_ASSERT(v.size() == elts.size());
984 
985  current->setOutputNode(*(elts.back()), true);
986 
987  return new PRMSlotChain< GUM_SCALAR >(name, elts);
988  }
void decomposePath(const std::string &path, std::vector< std::string > &v)
Decompose a string in a vector of strings using "." as separators.
Definition: utils_prm.cpp:27
+ Here is the call graph for this function:

◆ __buildSlotChains()

template<typename GUM_SCALAR>
void gum::prm::PRMFactory< GUM_SCALAR >::__buildSlotChains ( PRMSystem< GUM_SCALAR > *  model)
private

Builds all PRMSlotChain<GUM_SCALAR><PRMInstance<GUM_SCALAR>> in the given model.

Exceptions
OperationNotAllowedIf reference slots are left un affected

◆ __checkInterfaceImplementation()

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

Check if c implements correctly all his interfaces.

Definition at line 103 of file PRMFactory_tpl.h.

References gum::prm::PRMClass< GUM_SCALAR >::get(), GUM_ERROR, gum::prm::PRMClass< GUM_SCALAR >::implements(), gum::prm::PRMObject::name(), and gum::prm::PRMReferenceSlot< GUM_SCALAR >::slotType().

104  {
105  try {
106  for (const auto& i : c->implements()) {
107  try {
108  for (const auto& node : i->containerDag().nodes()) {
109  std::string name = i->get(node).name();
110 
111  switch (i->get(node).elt_type()) {
114  if ((c->get(name).elt_type()
116  || (c->get(name).elt_type()
118  if (!c->get(name).type().isSubTypeOf(i->get(name).type())) {
119  std::stringstream msg;
120  msg << "class " << c->name()
121  << " does not respect interface ";
122  GUM_ERROR(TypeError, msg.str() + i->name());
123  }
124  } else {
125  std::stringstream msg;
126  msg << "class " << c->name() << " does not respect interface ";
127  GUM_ERROR(TypeError, msg.str() + i->name());
128  }
129 
130  break;
131  }
132 
134  if (c->get(name).elt_type()
136  const PRMReferenceSlot< GUM_SCALAR >& ref_i =
137  static_cast< const PRMReferenceSlot< GUM_SCALAR >& >(
138  i->get(name));
139  const PRMReferenceSlot< GUM_SCALAR >& ref_this =
140  static_cast< const PRMReferenceSlot< GUM_SCALAR >& >(
141  c->get(name));
142 
143  if (!ref_this.slotType().isSubTypeOf(ref_i.slotType())) {
144  std::stringstream msg;
145  msg << "class " << c->name()
146  << " does not respect interface ";
147  GUM_ERROR(TypeError, msg.str() + i->name());
148  }
149  } else {
150  std::stringstream msg;
151  msg << "class " << c->name() << " does not respect interface ";
152  GUM_ERROR(TypeError, msg.str() + i->name());
153  }
154 
155  break;
156  }
157 
159  // Nothing to check: they are automatically inherited
160  break;
161  }
162 
163  default: {
164  std::string msg =
165  "unexpected ClassElement<GUM_SCALAR> in interface ";
166  GUM_ERROR(FatalError, msg + i->name());
167  }
168  }
169  }
170  } catch (NotFound&) {
171  std::stringstream msg;
172  msg << "class " << c->name() << " does not respect interface ";
173  GUM_ERROR(TypeError, msg.str() + i->name());
174  }
175  }
176  } catch (NotFound&) {
177  // this Class<GUM_SCALAR> does not implement any
178  // PRMInterface<GUM_SCALAR>
179  }
180  }
#define GUM_ERROR(type, msg)
Definition: exceptions.h:52
+ Here is the call graph for this function:

◆ __checkStack() [1/2]

template<typename GUM_SCALAR >
INLINE PRMObject * gum::prm::PRMFactory< GUM_SCALAR >::__checkStack ( Idx  i,
PRMObject::prm_type  obj_type 
)
private

Return a pointer on a PRMObject at __stack.size() - i position after checking the type of the object given obj_type.

Exceptions
FactoryInvalidStateRaised if the stack isn't consistent with the

Definition at line 1768 of file PRMFactory_tpl.h.

References gum::prm::PRMFactory< GUM_SCALAR >::__stack, GUM_ERROR, and gum::prm::PRMObject::obj_type().

Referenced by gum::prm::PRMFactory< GUM_SCALAR >::__addInstance(), gum::prm::PRMFactory< GUM_SCALAR >::addAttribute(), gum::prm::PRMFactory< GUM_SCALAR >::addLabel(), gum::prm::PRMFactory< GUM_SCALAR >::addTick(), gum::prm::PRMFactory< GUM_SCALAR >::endAttribute(), gum::prm::PRMFactory< GUM_SCALAR >::endDiscreteType(), gum::prm::PRMFactory< GUM_SCALAR >::endDiscretizedType(), gum::prm::PRMFactory< GUM_SCALAR >::endInterface(), gum::prm::PRMFactory< GUM_SCALAR >::endSystem(), gum::prm::PRMFactory< GUM_SCALAR >::setRawCPFByColumns(), and gum::prm::PRMFactory< GUM_SCALAR >::setRawCPFByLines().

1769  {
1770  // Don't forget that Idx are unsigned int
1771  if (__stack.size() - i > __stack.size()) {
1772  GUM_ERROR(FactoryInvalidState, "illegal sequence of calls");
1773  }
1774 
1775  PRMObject* obj = __stack[__stack.size() - i];
1776 
1777  if (obj->obj_type() != obj_type) {
1778  GUM_ERROR(FactoryInvalidState, "illegal sequence of calls");
1779  }
1780 
1781  return obj;
1782  }
std::vector< PRMObject *> __stack
A stack used to keep track of created PRMObject.
Definition: PRMFactory.h:1049
#define GUM_ERROR(type, msg)
Definition: exceptions.h:52
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ __checkStack() [2/2]

template<typename GUM_SCALAR >
INLINE PRMClassElement< GUM_SCALAR > * gum::prm::PRMFactory< GUM_SCALAR >::__checkStack ( Idx  i,
typename PRMClassElement< GUM_SCALAR >::ClassElementType  obj_type 
)
private

Adds __prefix to str iff __prefix != "".

Definition at line 1803 of file PRMFactory_tpl.h.

References gum::prm::PRMFactory< GUM_SCALAR >::__stack, gum::prm::PRMClassElement< GUM_SCALAR >::elt_type(), and GUM_ERROR.

1804  {
1805  // Don't forget that Idx are unsigned int
1806  if (__stack.size() - i > __stack.size()) {
1807  GUM_ERROR(FactoryInvalidState, "illegal sequence of calls");
1808  }
1809 
1810  PRMClassElement< GUM_SCALAR >* obj =
1811  dynamic_cast< PRMClassElement< GUM_SCALAR >* >(
1812  __stack[__stack.size() - i]);
1813 
1814  if (obj == 0) {
1815  GUM_ERROR(FactoryInvalidState, "illegal sequence of calls");
1816  }
1817 
1818  if (obj->elt_type() != elt_type) {
1819  GUM_ERROR(FactoryInvalidState, "illegal sequence of calls");
1820  }
1821 
1822  return obj;
1823  }
std::vector< PRMObject *> __stack
A stack used to keep track of created PRMObject.
Definition: PRMFactory.h:1049
#define GUM_ERROR(type, msg)
Definition: exceptions.h:52
+ Here is the call graph for this function:

◆ __checkStackContainter()

template<typename GUM_SCALAR >
INLINE PRMClassElementContainer< GUM_SCALAR > * gum::prm::PRMFactory< GUM_SCALAR >::__checkStackContainter ( Idx  i)
private

Adds __prefix to str iff __prefix != "".

Definition at line 1786 of file PRMFactory_tpl.h.

References gum::prm::PRMFactory< GUM_SCALAR >::__stack, gum::prm::PRMObject::CLASS, GUM_ERROR, gum::prm::PRMObject::obj_type(), and gum::prm::PRMObject::PRM_INTERFACE.

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

1786  {
1787  // Don't forget that Idx are unsigned int
1788  if (__stack.size() - i > __stack.size()) {
1789  GUM_ERROR(FactoryInvalidState, "illegal sequence of calls");
1790  }
1791 
1792  PRMObject* obj = __stack[__stack.size() - i];
1793 
1794  if ((obj->obj_type() == PRMObject::prm_type::CLASS)
1795  || (obj->obj_type() == PRMObject::prm_type::PRM_INTERFACE)) {
1796  return static_cast< PRMClassElementContainer< GUM_SCALAR >* >(obj);
1797  } else {
1798  GUM_ERROR(FactoryInvalidState, "illegal sequence of calls");
1799  }
1800  }
std::vector< PRMObject *> __stack
A stack used to keep track of created PRMObject.
Definition: PRMFactory.h:1049
#define GUM_ERROR(type, msg)
Definition: exceptions.h:52
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ __fill_sc_in_vector()

template<typename GUM_SCALAR>
void gum::prm::PRMFactory< GUM_SCALAR >::__fill_sc_in_vector ( std::vector< std::string > &  v,
const std::string &  str 
)
private

Decompose a string in v using dots ('.') as delimiters.

◆ __instantiateSlotChain()

template<typename GUM_SCALAR>
void gum::prm::PRMFactory< GUM_SCALAR >::__instantiateSlotChain ( PRMSystem< GUM_SCALAR > *  model,
PRMInstance< GUM_SCALAR > *  inst,
PRMReferenceSlot< GUM_SCALAR > *  ref,
PRMSlotChain< GUM_SCALAR > *  sc 
)
private

Instantiate a slot chain in the given instance.

◆ __retrieveClass()

template<typename GUM_SCALAR >
PRMClass< GUM_SCALAR > * gum::prm::PRMFactory< GUM_SCALAR >::__retrieveClass ( const std::string &  name) const
private

Returns a pointer on a class given it's name. Used when building models, meaning that the class name can either be local (need to add the current prefix) or global (no prefix needed).

Exceptions
NotFoundIf no class matching the name is found.
See also
PRMFactory::__retrieveType

Definition at line 1244 of file PRMFactory_tpl.h.

References GUM_ERROR.

Referenced by gum::prm::PRMFactory< GUM_SCALAR >::addInstance(), gum::prm::PRMFactory< GUM_SCALAR >::isClassOrInterface(), and gum::prm::PRMFactory< GUM_SCALAR >::retrieveClass().

1244  {
1245  PRMClass< GUM_SCALAR >* a_class = nullptr;
1246  std::string full_name;
1247 
1248  // Looking for the type using its name
1249  if (__prm->__classMap.exists(name)) {
1250  a_class = __prm->__classMap[name];
1251  full_name = name;
1252  }
1253 
1254  // Looking for the type using current package
1255  std::string prefixed = __addPrefix(name);
1256  if (__prm->__classMap.exists(prefixed)) {
1257  if (a_class == nullptr) {
1258  a_class = __prm->__classMap[prefixed];
1259  full_name = prefixed;
1260  } else if (full_name != prefixed) {
1261  GUM_ERROR(DuplicateElement,
1262  "Class name '" << name
1263  << "' is ambiguous: specify full name.");
1264  }
1265  }
1266 
1267  // Looking for the class using all declared namespaces
1268  if (!__namespaces.empty()) {
1269  auto ns_list = __namespaces.back();
1270  for (gum::Size i = 0; i < ns_list->size(); ++i) {
1271  std::string ns = (*ns_list)[i];
1272  std::string ns_name = ns + "." + name;
1273  if (__prm->__classMap.exists(ns_name)) {
1274  if (a_class == 0) {
1275  a_class = __prm->__classMap[ns_name];
1276  full_name = ns_name;
1277  } else if (full_name != ns_name) {
1278  GUM_ERROR(DuplicateElement,
1279  "Class name '" << name
1280  << "' is ambiguous: specify full name.");
1281  }
1282  }
1283  }
1284  }
1285 
1286  if (a_class == 0) {
1287  GUM_ERROR(NotFound, "Class '" << name << "' not found, check imports.");
1288  }
1289 
1290  return a_class;
1291  }
PRM< GUM_SCALAR > * __prm
The pointer on the PRM<GUM_SCALAR> built by this factory.
Definition: PRMFactory.h:1046
std::string __addPrefix(const std::string &str) const
Adds __prefix to str iff __prefix != "".
std::vector< List< std::string > *> __namespaces
Set of all declared namespaces.
Definition: PRMFactory.h:1043
std::size_t Size
In aGrUM, hashed values are unsigned long int.
Definition: types.h:45
#define GUM_ERROR(type, msg)
Definition: exceptions.h:52
+ Here is the caller graph for this function:

◆ __retrieveCommonType()

template<typename GUM_SCALAR >
INLINE PRMType * gum::prm::PRMFactory< GUM_SCALAR >::__retrieveCommonType ( const std::vector< PRMClassElement< GUM_SCALAR > * > &  elts)
private

Retrieve the common PRMType of a vector of PRMClassElement<GUM_SCALAR>.

The vector elts must only contains PRMClassElement<GUM_SCALAR> with a PRMType, i.e. PRMAttribute<GUM_SCALAR>, PRMAggregate and PRMSlotChain<GUM_SCALAR>. If not a WrongClassElement is raised.

A common PRMType is PRMType t such as t.isSuperTypeOf(elts[i]) for 0 < i < elts.size(), where elts is a PRMType container.

Parameters
eltsA vector of PRMClassElement<GUM_SCALAR>.
Returns
Returns the common super PRMType of all PRMClassElement<GUM_SCALAR> un elts.
Exceptions
WrongClassElementRaised if elts contains a PRMClassElement<GUM_SCALAR> without a PRMType.
NotFoundRaised if there exists no common super type of all PRMClassElement<GUM_SCALAR> in elts.

Definition at line 1051 of file PRMFactory_tpl.h.

References gum::HashTable< Key, Val, Alloc >::exists(), GUM_ERROR, gum::HashTable< Key, Val, Alloc >::insert(), and gum::Variable::name().

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

1052  {
1053  const PRMType* current = nullptr;
1055  // Finding all types and super types
1056 
1057  for (const auto& elt : elts) {
1058  try {
1059  current = &((*elt).type());
1060 
1061  while (current != 0) {
1062  // Filling counters
1063  if (counters.exists(current->name())) {
1064  ++(counters[current->name()]);
1065  } else {
1066  counters.insert(current->name(), 1);
1067  }
1068 
1069  // Loop guard
1070  if (current->isSubType()) {
1071  current = &(current->superType());
1072  } else {
1073  current = nullptr;
1074  }
1075  }
1076  } catch (OperationNotAllowed&) {
1077  GUM_ERROR(WrongClassElement,
1078  "found a ClassElement<GUM_SCALAR> without a type");
1079  }
1080  }
1081 
1082  // We need to find the most specialized (i.e. max depth) common type
1083  current = nullptr;
1084 
1085  int max_depth = -1;
1086 
1087  int current_depth = 0;
1088 
1089  for (const auto& elt : counters) {
1090  if ((elt.second) == elts.size()) {
1091  current_depth = __typeDepth(__retrieveType(elt.first));
1092 
1093  if (current_depth > max_depth) {
1094  max_depth = current_depth;
1095  current = __retrieveType(elt.first);
1096  }
1097  }
1098  }
1099 
1100  if (current) { return const_cast< PRMType* >(current); }
1101 
1102  GUM_ERROR(NotFound, "could not find a common type");
1103  }
PRMType * __retrieveType(const std::string &name) const
Returns a pointer on a PRMType given it&#39;s name. Since the type can be given either with it&#39;s local na...
bool exists(const Key &key) const
Checks whether there exists an element with a given key in the hashtable.
int __typeDepth(const PRMType *t)
Returns the inheritance depth of a PRMType.
value_type & insert(const Key &key, const Val &val)
Adds a new element (actually a copy of this element) into the hash table.
#define GUM_ERROR(type, msg)
Definition: exceptions.h:52
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ __retrieveInputs()

template<typename GUM_SCALAR >
INLINE bool gum::prm::PRMFactory< GUM_SCALAR >::__retrieveInputs ( PRMClass< GUM_SCALAR > *  c,
const std::vector< std::string > &  chains,
std::vector< PRMClassElement< GUM_SCALAR > * > &  inputs 
)
private

Retrieve inputs for an PRMAggregate.

The vector chains contains names of the PRMAggregate inputs. If a name does not match an existing PRMClassElement<GUM_SCALAR> in c, then a call to PRMFactory::__buildSlotChains() is made. Such created PRMSlotChain<GUM_SCALAR> are added to c.

Parameters
cThe class in which the PRMAggregate is defined.
chainsVector of the PRMAggregate inputs names.
inputsVector filled with the PRMClassElement<GUM_SCALAR> matching the names in chains.
Returns
true if there was at least one slotchain in chains.
Exceptions
NotFoundRaised if a name in chains does not match a legal PRMSlotChain<GUM_SCALAR> or an existing PRMClassElement<GUM_SCALAR> in c.

Definition at line 991 of file PRMFactory_tpl.h.

References gum::prm::PRMClass< GUM_SCALAR >::add(), gum::prm::PRMSlotChain< GUM_SCALAR >::chain(), gum::prm::PRMClass< GUM_SCALAR >::get(), GUM_ERROR, gum::prm::PRMClassElement< GUM_SCALAR >::isSlotChain(), gum::prm::PRMSlotChain< GUM_SCALAR >::lastElt(), and gum::Variable::name().

994  {
995  bool retVal = false;
996 
997  for (size_t i = 0; i < chains.size(); ++i) {
998  try {
999  inputs.push_back(&(c->get(chains[i])));
1000  retVal = retVal
1001  || PRMClassElement< GUM_SCALAR >::isSlotChain(*(inputs.back()));
1002  } catch (NotFound&) {
1003  inputs.push_back(__buildSlotChain(c, chains[i]));
1004  retVal = true;
1005 
1006  if (inputs.back()) {
1007  c->add(inputs.back());
1008  } else {
1009  GUM_ERROR(NotFound, "unknown slot chain");
1010  }
1011  }
1012  }
1013 
1014  PRMType* t = __retrieveCommonType(inputs);
1015 
1016  std::vector< std::pair< PRMClassElement< GUM_SCALAR >*,
1017  PRMClassElement< GUM_SCALAR >* > >
1018  toAdd;
1019 
1020  for (const auto& elt : inputs) {
1021  if ((*elt).type() != (*t)) {
1023  PRMSlotChain< GUM_SCALAR >* sc =
1024  static_cast< PRMSlotChain< GUM_SCALAR >* >(elt);
1025  std::stringstream name;
1026 
1027  for (Size idx = 0; idx < sc->chain().size() - 1; ++idx) {
1028  name << sc->chain().atPos(idx)->name() << ".";
1029  }
1030 
1031  name << ".(" << t->name() << ")" << sc->lastElt().name();
1032 
1033  try {
1034  toAdd.push_back(std::make_pair(elt, &(c->get(name.str()))));
1035  } catch (NotFound&) {
1036  toAdd.push_back(
1037  std::make_pair(elt, __buildSlotChain(c, name.str())));
1038  }
1039  } else {
1040  std::stringstream name;
1041  name << "(" << t->name() << ")" << elt->name();
1042  toAdd.push_back(std::make_pair(elt, &(c->get(name.str()))));
1043  }
1044  }
1045  }
1046 
1047  return retVal;
1048  }
PRMType * __retrieveCommonType(const std::vector< PRMClassElement< GUM_SCALAR > * > &elts)
Retrieve the common PRMType of a vector of PRMClassElement<GUM_SCALAR>.
PRMSlotChain< GUM_SCALAR > * __buildSlotChain(PRMClassElementContainer< GUM_SCALAR > *start, const std::string &name)
This methods build a PRMSlotChain<GUM_SCALAR> given a starting element and a string.
static INLINE bool isSlotChain(const PRMClassElement< GUM_SCALAR > &elt)
Return true if obj is of type PRMSlotChain.
std::size_t Size
In aGrUM, hashed values are unsigned long int.
Definition: types.h:45
#define GUM_ERROR(type, msg)
Definition: exceptions.h:52
+ Here is the call graph for this function:

◆ __retrieveInstanceSequence()

template<typename GUM_SCALAR>
std::string gum::prm::PRMFactory< GUM_SCALAR >::__retrieveInstanceSequence ( PRMInstance< GUM_SCALAR > *  inst,
Sequence< PRMInstance< GUM_SCALAR > * > &  seq,
PRMSlotChain< GUM_SCALAR > *  sc 
)
private

Fill seq with the sequence of instance build using inst as the instantiation of sc->__class and seeking each instantiation of reference in sc.

Returns
Returns the name of the corresponding PRMSlotChain<GUM_SCALAR>.

◆ __retrieveInterface()

template<typename GUM_SCALAR >
PRMInterface< GUM_SCALAR > * gum::prm::PRMFactory< GUM_SCALAR >::__retrieveInterface ( const std::string &  name) const
private

Returns a pointer on an interface given it's name. Used when building models, meaning that the interface name can either be local (need to add the current prefix) or global (no prefix needed).

Exceptions
NotFoundIf no class matching the name is found.
See also
PRMFactory::__retrieveType

Definition at line 1294 of file PRMFactory_tpl.h.

References GUM_ERROR.

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

1295  {
1296  PRMInterface< GUM_SCALAR >* interface = nullptr;
1297  std::string full_name;
1298 
1299  // Looking for the type using its name
1300  if (__prm->__interfaceMap.exists(name)) {
1301  interface = __prm->__interfaceMap[name];
1302  full_name = name;
1303  }
1304 
1305  // Looking for the type using current package
1306  std::string prefixed = __addPrefix(name);
1307  if (__prm->__interfaceMap.exists(prefixed)) {
1308  if (interface == nullptr) {
1309  interface = __prm->__interfaceMap[prefixed];
1310  full_name = prefixed;
1311  } else if (full_name != prefixed) {
1312  GUM_ERROR(DuplicateElement,
1313  "Interface name '" << name
1314  << "' is ambiguous: specify full name.");
1315  }
1316  }
1317 
1318  // Looking for the interf using all declared namespaces
1319  if (!__namespaces.empty()) {
1320  auto ns_list = __namespaces.back();
1321  // for( const auto & ns : *(__namespaces.top()) ) {
1322  for (gum::Size i = 0; i < ns_list->size(); ++i) {
1323  std::string ns = (*ns_list)[i];
1324  std::string ns_name = ns + "." + name;
1325 
1326  if (__prm->__interfaceMap.exists(ns_name)) {
1327  if (interface == nullptr) {
1328  interface = __prm->__interfaceMap[ns_name];
1329  full_name = ns_name;
1330  } else if (full_name != ns_name) {
1331  GUM_ERROR(DuplicateElement,
1332  "Interface name '"
1333  << name << "' is ambiguous: specify full name.");
1334  }
1335  }
1336  }
1337  }
1338 
1339  if (interface == nullptr) {
1340  GUM_ERROR(NotFound,
1341  "Interface '" << name << "' not found, check imports.");
1342  }
1343 
1344  return interface;
1345  }
PRM< GUM_SCALAR > * __prm
The pointer on the PRM<GUM_SCALAR> built by this factory.
Definition: PRMFactory.h:1046
std::string __addPrefix(const std::string &str) const
Adds __prefix to str iff __prefix != "".
std::vector< List< std::string > *> __namespaces
Set of all declared namespaces.
Definition: PRMFactory.h:1043
std::size_t Size
In aGrUM, hashed values are unsigned long int.
Definition: types.h:45
#define GUM_ERROR(type, msg)
Definition: exceptions.h:52
+ Here is the caller graph for this function:

◆ __retrieveType()

template<typename GUM_SCALAR >
INLINE PRMType * gum::prm::PRMFactory< GUM_SCALAR >::__retrieveType ( const std::string &  name) const
private

Returns a pointer on a PRMType given it's name. Since the type can be given either with it's local name (without the prefix), full name (with the prefix) or can come from an import unit, or maybe one day with a using declaration we need some processing to find it.

The following precedences on finding the name is used:

  • name
  • prefix.name
  • import_1.name
  • import_2.name
  • ...
  • import_N.name In the case a local name is used multiple time, it's preferable to use it's full name.
    Exceptions
    OperationNotAllowedIf the type is undeclared.

Definition at line 1176 of file PRMFactory_tpl.h.

References GUM_ERROR.

Referenced by gum::prm::PRMFactory< GUM_SCALAR >::retrieveType(), gum::prm::PRMFactory< GUM_SCALAR >::startAttribute(), and gum::prm::PRMFactory< GUM_SCALAR >::startDiscreteType().

1176  {
1177  PRMType* type = nullptr;
1178  std::string full_name;
1179 
1180  // Looking for the type using its name
1181  if (__prm->__typeMap.exists(name)) {
1182  type = __prm->__typeMap[name];
1183  full_name = name;
1184  }
1185 
1186  // Looking for the type in current package
1187  std::string prefixed = __addPrefix(name);
1188  if (__prm->__typeMap.exists(prefixed)) {
1189  if (type == 0) {
1190  type = __prm->__typeMap[prefixed];
1191  full_name = prefixed;
1192  } else if (full_name != prefixed) {
1193  GUM_ERROR(DuplicateElement,
1194  "Type name '" << name << "' is ambiguous: specify full name.");
1195  }
1196  }
1197 
1198  // Looking for the type relatively to current package
1199  std::string relatif_ns = currentPackage();
1200  size_t last_dot = relatif_ns.find_last_of('.');
1201  if (last_dot != std::string::npos) {
1202  relatif_ns = relatif_ns.substr(0, last_dot) + '.' + name;
1203  if (__prm->__typeMap.exists(relatif_ns)) {
1204  if (type == 0) {
1205  type = __prm->__typeMap[relatif_ns];
1206  full_name = relatif_ns;
1207  } else if (full_name != relatif_ns) {
1208  GUM_ERROR(DuplicateElement,
1209  "Type name '" << name
1210  << "' is ambiguous: specify full name.");
1211  }
1212  }
1213  }
1214 
1215 
1216  // Looking for the type using all declared namespaces
1217  if (!__namespaces.empty()) {
1218  auto ns_list = __namespaces.back();
1219  for (gum::Size i = 0; i < ns_list->size(); ++i) {
1220  std::string ns = (*ns_list)[i];
1221  std::string ns_name = ns + "." + name;
1222  if (__prm->__typeMap.exists(ns_name)) {
1223  if (type == 0) {
1224  type = __prm->__typeMap[ns_name];
1225  full_name = ns_name;
1226  } else if (full_name != ns_name) {
1227  GUM_ERROR(DuplicateElement,
1228  "Type name '" << name
1229  << "' is ambiguous: specify full name.");
1230  }
1231  }
1232  }
1233  }
1234 
1235  if (type == 0) {
1236  GUM_ERROR(NotFound, "Type '" << name << "' not found, check imports.");
1237  }
1238 
1239  return type;
1240  }
PRM< GUM_SCALAR > * __prm
The pointer on the PRM<GUM_SCALAR> built by this factory.
Definition: PRMFactory.h:1046
virtual std::string currentPackage() const override
std::string __addPrefix(const std::string &str) const
Adds __prefix to str iff __prefix != "".
std::vector< List< std::string > *> __namespaces
Set of all declared namespaces.
Definition: PRMFactory.h:1043
std::size_t Size
In aGrUM, hashed values are unsigned long int.
Definition: types.h:45
#define GUM_ERROR(type, msg)
Definition: exceptions.h:52
+ Here is the caller graph for this function:

◆ __typeDepth()

template<typename GUM_SCALAR >
INLINE int gum::prm::PRMFactory< GUM_SCALAR >::__typeDepth ( const PRMType t)
private

Returns the inheritance depth of a PRMType.

This used by PRMFactory::__retrieveCommonType. This returns 0 if t does not have a super type.

Parameters
tThe PRMType for which we compute its depth.
Returns
Returns the depth of t.

Definition at line 1826 of file PRMFactory_tpl.h.

1826  {
1827  int depth = 0;
1828  const PRMType* current = t;
1829 
1830  while (current->isSubType()) {
1831  ++depth;
1832  current = &(current->superType());
1833  }
1834 
1835  return depth;
1836  }

◆ addAggregator()

template<typename GUM_SCALAR >
INLINE void gum::prm::PRMFactory< GUM_SCALAR >::addAggregator ( const std::string &  name,
const std::string &  agg_type,
const std::vector< std::string > &  chains,
const std::vector< std::string > &  params,
std::string  type = "" 
)
overridevirtual

Add an aggregator in the current declared class.

If at least one parent of an aggregator is a PRMSlotChain<GUM_SCALAR>, then all of it's parents must be PRMSlotChain<GUM_SCALAR>. When an aggregator parents are only composed of PRMAttribute<GUM_SCALAR> and PRMAggregate, then it is directly added as an PRMAttribute<GUM_SCALAR> to it's Class<GUM_SCALAR>.

Parameters
nameThe name of this aggregator.
agg_typeThe name of the aggregator type of this aggregator.
chainsThe set of chains on which this aggregate applies.
paramsThe list of parameters for this aggregator.
typeSome aggregators have a user defined type, use this parameter to define it.
Exceptions
OperationNotAllowedRaised if one or more parameters misses or are not correct.
WrongTypeRaised if the aggregator's type or one or more of the chains are not of the good type.

Implements gum::prm::IPRMFactory.

Definition at line 675 of file PRMFactory_tpl.h.

References gum::prm::PRMClass< GUM_SCALAR >::add(), gum::prm::PRMClass< GUM_SCALAR >::addArc(), gum::prm::PRMAggregate< GUM_SCALAR >::buildImpl(), gum::prm::PRMObject::CLASS, GUM_ERROR, gum::prm::PRMAggregate< GUM_SCALAR >::label(), gum::prm::PRMObject::name(), gum::prm::PRMClass< GUM_SCALAR >::overload(), gum::prm::PRMClassElement< GUM_SCALAR >::safeName(), gum::prm::PRMAggregate< GUM_SCALAR >::str2enum(), and gum::prm::PRMAggregate< GUM_SCALAR >::type().

Referenced by gum::prm::ClusteredLayerGenerator< GUM_SCALAR >::__generateClass(), gum::prm::LayerGenerator< GUM_SCALAR >::__generateClasses(), and gum::prm::ClusteredLayerGenerator< GUM_SCALAR >::__generateCluster().

680  {
681  PRMClass< GUM_SCALAR >* c = static_cast< PRMClass< GUM_SCALAR >* >(
683  // Checking call legality
684 
685  if (chains.size() == 0) {
686  GUM_ERROR(OperationNotAllowed,
687  "a PRMAggregate<GUM_SCALAR> requires at least one parent");
688  }
689 
690  // Retrieving the parents of the aggregate
691  std::vector< PRMClassElement< GUM_SCALAR >* > inputs;
692 
693  // This helps knowing if the aggregate has parents outside the current
694  // class
695  // (see below)
696  bool hasSC = __retrieveInputs(c, chains, inputs);
697 
698  // Checking that all inputs shares the same PRMType (trivial
699  // if
700  // inputs.size() == 1)
701  if (inputs.size() > 1) {
702  for (auto iter = inputs.begin() + 1; iter != inputs.end(); ++iter) {
703  if ((**(iter - 1)).type() != (**iter).type()) {
704  GUM_ERROR(WrongType, "found different types");
705  }
706  }
707  }
708 
709  // Different treatments for different types of aggregate.
710  PRMAggregate< GUM_SCALAR >* agg = nullptr;
711 
712  switch (PRMAggregate< GUM_SCALAR >::str2enum(agg_type)) {
715  if (inputs.front()->type() != *(__retrieveType("boolean"))) {
716  GUM_ERROR(WrongType, "expected booleans");
717  }
718  if (params.size() != 0) {
719  GUM_ERROR(OperationNotAllowed, "invalid number of paramaters");
720  }
721 
722  agg = new PRMAggregate< GUM_SCALAR >(
723  name,
725  inputs.front()->type());
726 
727  break;
728  }
729 
732  if (params.size() != 1) {
733  GUM_ERROR(OperationNotAllowed, "invalid number of parameters");
734  }
735 
736  Idx label_idx = 0;
737 
738  while (label_idx < inputs.front()->type()->domainSize()) {
739  if (inputs.front()->type()->label(label_idx) == params.front()) {
740  break;
741  }
742 
743  ++label_idx;
744  }
745 
746  if (label_idx == inputs.front()->type()->domainSize()) {
747  GUM_ERROR(NotFound, "could not find label");
748  }
749 
750  // Creating and adding the PRMAggregate<GUM_SCALAR>
751  agg = new PRMAggregate< GUM_SCALAR >(
752  name,
754  *(__retrieveType("boolean")),
755  label_idx);
756  agg->label();
757 
758  break;
759  }
760 
765  if (params.size() != 0) {
766  GUM_ERROR(OperationNotAllowed, "invalid number of parameters");
767  }
768 
769  auto output_type = __retrieveType(type);
770 
771  // Creating and adding the PRMAggregate<GUM_SCALAR>
772  agg = new PRMAggregate< GUM_SCALAR >(
773  name, PRMAggregate< GUM_SCALAR >::str2enum(agg_type), *output_type);
774 
775  break;
776  }
777 
779  if (params.size() != 1) {
780  GUM_ERROR(OperationNotAllowed, "invalid number of parameters");
781  }
782 
783  Idx label_idx = 0;
784 
785  while (label_idx < inputs.front()->type()->domainSize()) {
786  if (inputs.front()->type()->label(label_idx) == params.front()) {
787  break;
788  }
789 
790  ++label_idx;
791  }
792 
793  if (label_idx == inputs.front()->type()->domainSize()) {
794  GUM_ERROR(NotFound, "could not find label");
795  }
796 
797  auto output_type = __retrieveType(type);
798 
799  // Creating and adding the PRMAggregate<GUM_SCALAR>
800  agg = new PRMAggregate< GUM_SCALAR >(
801  name,
803  *output_type,
804  label_idx);
805 
806  break;
807  }
808 
809  default: { GUM_ERROR(FatalError, "Unknown aggregator."); }
810  }
811 
812  std::string safe_name = agg->safeName();
813 
814  try {
815  if (hasSC) {
816  try {
817  c->add(agg);
818  } catch (DuplicateElement&) { c->overload(agg); }
819  } else {
820  // Inner aggregators can be directly used as attributes
821  auto attr = new PRMScalarAttribute< GUM_SCALAR >(
822  agg->name(), agg->type(), agg->buildImpl());
823 
824  try {
825  c->add(attr);
826  } catch (DuplicateElement&) { c->overload(attr); }
827 
828  delete agg;
829  }
830  } catch (DuplicateElement&) {
831  delete agg;
832  throw;
833  }
834 
835  for (const auto& elt : inputs) {
836  c->addArc(elt->safeName(), safe_name);
837  }
838  }
static AggregateType str2enum(const std::string &str)
Static method which returns the AggregateType given its string representation.
Definition: PRMAggregate.h:97
PRMType * __retrieveType(const std::string &name) const
Returns a pointer on a PRMType given it&#39;s name. Since the type can be given either with it&#39;s local na...
PRMObject * __checkStack(Idx i, PRMObject::prm_type obj_type)
Return a pointer on a PRMObject at __stack.size() - i position after checking the type of the object ...
#define GUM_ERROR(type, msg)
Definition: exceptions.h:52
bool __retrieveInputs(PRMClass< GUM_SCALAR > *c, const std::vector< std::string > &chains, std::vector< PRMClassElement< GUM_SCALAR > * > &inputs)
Retrieve inputs for an PRMAggregate.
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ addArray()

template<typename GUM_SCALAR >
INLINE void gum::prm::PRMFactory< GUM_SCALAR >::addArray ( const std::string &  type,
const std::string &  name,
Size  size 
)
overridevirtual

Creates an array with the given number of instances of the given type.

PRMInstance<GUM_SCALAR> are name using "name" as prefix and adding the suffix "[i]", with "i" being the position of the instance in the array.

Implements gum::prm::IPRMFactory.

Definition at line 866 of file PRMFactory_tpl.h.

References gum::prm::PRMSystem< GUM_SCALAR >::add(), gum::prm::PRMSystem< GUM_SCALAR >::addArray(), and gum::prm::PRMObject::SYSTEM.

Referenced by gum::prm::o3prm::O3SystemFactory< GUM_SCALAR >::__addInstances().

868  {
869  PRMSystem< GUM_SCALAR >* model = static_cast< PRMSystem< GUM_SCALAR >* >(
871  PRMClass< GUM_SCALAR >* c = __retrieveClass(type);
872  PRMInstance< GUM_SCALAR >* inst = 0;
873 
874  try {
875  model->addArray(name, *c);
876 
877  for (Size i = 0; i < size; ++i) {
878  std::stringstream elt_name;
879  elt_name << name << "[" << i << "]";
880  inst = new PRMInstance< GUM_SCALAR >(elt_name.str(), *c);
881  model->add(name, inst);
882  }
883  } catch (TypeError&) {
884  delete inst;
885  throw;
886  } catch (NotFound&) {
887  delete inst;
888  throw;
889  }
890  }
PRMClass< GUM_SCALAR > * __retrieveClass(const std::string &name) const
Returns a pointer on a class given it&#39;s name. Used when building models, meaning that the class name ...
PRMObject * __checkStack(Idx i, PRMObject::prm_type obj_type)
Return a pointer on a PRMObject at __stack.size() - i position after checking the type of the object ...
std::size_t Size
In aGrUM, hashed values are unsigned long int.
Definition: types.h:45
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ addAttribute() [1/2]

template<typename GUM_SCALAR >
INLINE void gum::prm::PRMFactory< GUM_SCALAR >::addAttribute ( const std::string &  type,
const std::string &  name 
)
overridevirtual

Add an attribute to an interface.

Implements gum::prm::IPRMFactory.

Definition at line 1578 of file PRMFactory_tpl.h.

References gum::prm::PRMFactory< GUM_SCALAR >::__checkStack(), gum::prm::PRMFactory< GUM_SCALAR >::endAttribute(), gum::prm::PRMObject::PRM_INTERFACE, and gum::prm::PRMFactory< GUM_SCALAR >::startAttribute().

Referenced by gum::prm::ClusteredLayerGenerator< GUM_SCALAR >::__generateInterfaces(), gum::prm::LayerGenerator< GUM_SCALAR >::__generateInterfaces(), and gum::prm::o3prm::O3InterfaceFactory< GUM_SCALAR >::buildElements().

1579  {
1581  startAttribute(type, name);
1582  endAttribute();
1583  }
virtual void endAttribute() override
Tells the factory that we finished declaring an attribute.
virtual void startAttribute(const std::string &type, const std::string &name, bool scalar_atttr=false) override
Tells the factory that we start an attribute declaration.
PRMObject * __checkStack(Idx i, PRMObject::prm_type obj_type)
Return a pointer on a PRMObject at __stack.size() - i position after checking the type of the object ...
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ addAttribute() [2/2]

template<typename GUM_SCALAR >
INLINE void gum::prm::PRMFactory< GUM_SCALAR >::addAttribute ( PRMAttribute< GUM_SCALAR > *  attr)
virtual

Add an already created attribute to the current class.

Use this method when you must add functions, such as Noisy-Or.

Use this method when you need to add functions, such as Noisy-Or. The attribute CPT is checked for parents and arcs will be added using the DiscreteVariable pointers, thus be careful to use those of the attributes, aggregates and slotchains of the current class. gum::prm::Class<GUM_SCALAR>::insertArc() will be called for each found parent of attr, so you should overload gum::prm::PRMAttribute<GUM_SCALAR>::addParent() to prevent duplication errors. Such class exists: gum::prm::PRMFuncAttribute .

The pointer is given to the class, so do not worry about deleting it.

Parameters
attrThe attribute added to the current class.
Exceptions
NotFoundRaised if one of the DiscreteVariable in attr CPT does not match any PRMClassElement<GUM_SCALAR> in this.

Definition at line 222 of file PRMFactory_tpl.h.

References gum::prm::PRMClass< GUM_SCALAR >::add(), gum::prm::PRMClass< GUM_SCALAR >::addArc(), gum::prm::PRMObject::CLASS, gum::prm::PRMClassElementContainer< GUM_SCALAR >::containerDag(), gum::prm::PRMAttribute< GUM_SCALAR >::cpf(), gum::SequenceImplementation< Key, Alloc, std::is_scalar< Key >::value >::exists(), gum::prm::PRMClass< GUM_SCALAR >::get(), GUM_ERROR, gum::prm::PRMClassElement< GUM_SCALAR >::safeName(), gum::prm::PRMAttribute< GUM_SCALAR >::type(), and gum::prm::PRMType::variable().

222  {
223  PRMClass< GUM_SCALAR >* c = static_cast< PRMClass< GUM_SCALAR >* >(
225  c->add(attr);
226  Size count = 0;
227  const Sequence< const DiscreteVariable* >& vars =
228  attr->cpf().variablesSequence();
229 
230  for (const auto& node : c->containerDag().nodes()) {
231  try {
232  if (vars.exists(&(c->get(node).type().variable()))) {
233  ++count;
234 
235  if (&(attr->type().variable()) != &(c->get(node).type().variable())) {
236  c->addArc(c->get(node).safeName(), attr->safeName());
237  }
238  }
239  } catch (OperationNotAllowed&) {}
240  }
241 
242  if (count != attr->cpf().variablesSequence().size()) {
243  GUM_ERROR(NotFound, "unable to found all parents of this attribute");
244  }
245  }
PRMObject * __checkStack(Idx i, PRMObject::prm_type obj_type)
Return a pointer on a PRMObject at __stack.size() - i position after checking the type of the object ...
std::size_t Size
In aGrUM, hashed values are unsigned long int.
Definition: types.h:45
#define GUM_ERROR(type, msg)
Definition: exceptions.h:52
+ Here is the call graph for this function:

◆ addImport()

template<typename GUM_SCALAR >
INLINE void gum::prm::PRMFactory< GUM_SCALAR >::addImport ( const std::string &  name)
overridevirtual

Add an import for namespace lookup.

When loading a module, you should push all import declarations using this method. The order in which you add imports will impact name resolution (first found, first used).

Imports are sync with packages: when you push a new package a new empty list of imports is added. When you pop a package the current list of imports is discarded and the previous one is restored.

Parameters
nameThe name of the package for all further objects.

Implements gum::prm::IPRMFactory.

Definition at line 1863 of file PRMFactory_tpl.h.

References gum::prm::PRMFactory< GUM_SCALAR >::__namespaces, and GUM_ERROR.

1863  {
1864  if (name.size() == 0) {
1865  GUM_ERROR(OperationNotAllowed, "illegal import name");
1866  }
1867  if (__namespaces.empty()) {
1868  __namespaces.push_back(new List< std::string >());
1869  }
1870  __namespaces.back()->push_back(name);
1871  }
std::vector< List< std::string > *> __namespaces
Set of all declared namespaces.
Definition: PRMFactory.h:1043
#define GUM_ERROR(type, msg)
Definition: exceptions.h:52

◆ addInstance() [1/2]

template<typename GUM_SCALAR >
INLINE void gum::prm::PRMFactory< GUM_SCALAR >::addInstance ( const std::string &  type,
const std::string &  name 
)
overridevirtual

Add an instance to the model.

Implements gum::prm::IPRMFactory.

Definition at line 1656 of file PRMFactory_tpl.h.

References gum::prm::PRMFactory< GUM_SCALAR >::__addInstance(), and gum::prm::PRMFactory< GUM_SCALAR >::__retrieveClass().

Referenced by gum::prm::o3prm::O3SystemFactory< GUM_SCALAR >::__addInstances(), gum::prm::LayerGenerator< GUM_SCALAR >::__generateSystem(), and gum::prm::ClusteredLayerGenerator< GUM_SCALAR >::__generateSystem().

1657  {
1658  auto c = __retrieveClass(type);
1659 
1660  // If class contains parameters, calls the proper addIsntance method
1661  if (c->parameters().size() > 0) {
1663  addInstance(type, name, params);
1664 
1665  } else {
1666  __addInstance(c, name);
1667  }
1668  }
virtual void addInstance(const std::string &type, const std::string &name) override
Add an instance to the model.
void __addInstance(PRMClass< GUM_SCALAR > *type, const std::string &name)
Adds a instance to the current model.
PRMClass< GUM_SCALAR > * __retrieveClass(const std::string &name) const
Returns a pointer on a class given it&#39;s name. Used when building models, meaning that the class name ...
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ addInstance() [2/2]

template<typename GUM_SCALAR >
INLINE void gum::prm::PRMFactory< GUM_SCALAR >::addInstance ( const std::string &  type,
const std::string &  name,
const HashTable< std::string, double > &  params 
)
overridevirtual

Add an instance with params as values of type's parameters.

Implements gum::prm::IPRMFactory.

Definition at line 1671 of file PRMFactory_tpl.h.

References gum::prm::PRMFactory< GUM_SCALAR >::__addInstance(), gum::prm::PRMFactory< GUM_SCALAR >::__packages, gum::prm::PRMFactory< GUM_SCALAR >::__retrieveClass(), gum::prm::PRMFactory< GUM_SCALAR >::addParameter(), gum::HashTable< Key, Val, Alloc >::empty(), gum::prm::PRMFactory< GUM_SCALAR >::endClass(), GUM_ERROR, gum::HashTable< Key, Val, Alloc >::insert(), and gum::prm::PRMFactory< GUM_SCALAR >::startClass().

1674  {
1675  auto c = __retrieveClass(type);
1676 
1677  if (c->parameters().empty()) {
1678  if (params.empty()) {
1679  __addInstance(c, name);
1680  } else {
1681  GUM_ERROR(OperationNotAllowed,
1682  "Class " + type + " does not have parameters");
1683  }
1684 
1685  } else {
1686  auto my_params = params;
1687  // Adding all parameters to my_params
1688  for (const auto& p : c->parameters()) {
1689  if (!my_params.exists(p->name())) {
1690  my_params.insert(p->name(), p->value());
1691  }
1692  }
1693 
1694  // Building sub class name using my_params
1695  std::stringstream sBuff;
1696  sBuff << c->name() << "<";
1697 
1698  for (const auto& p : my_params) {
1699  sBuff << p.first << "=" << p.second << ",";
1700  }
1701 
1702  // Removing last , and adding closing >
1703  std::string sub_c = sBuff.str().substr(0, sBuff.str().size() - 1) + ">";
1704 
1705  // Adding class in current package
1706  try {
1707  auto pck_cpy = __packages;
1708  __packages.clear();
1709 
1710  startClass(sub_c, c->name());
1711 
1712  // Update inherited parameters
1713  for (auto p : my_params) {
1714  auto type = static_cast< PRMParameter< GUM_SCALAR >& >(c->get(p.first))
1715  .valueType();
1716  if (type == PRMParameter< GUM_SCALAR >::ParameterType::INT) {
1717  addParameter("int", p.first, p.second);
1718 
1719  } else {
1720  addParameter("real", p.first, p.second);
1721  }
1722  }
1723 
1724  endClass();
1725 
1726  __packages = pck_cpy;
1727 
1728  } catch (DuplicateElement&) {
1729  // Sub Class already exists in this system
1730  }
1731  c = __retrieveClass(sub_c);
1732  __addInstance(c, name);
1733  }
1734  }
void __addInstance(PRMClass< GUM_SCALAR > *type, const std::string &name)
Adds a instance to the current model.
virtual void startClass(const std::string &c, const std::string &ext="", const Set< std::string > *implements=nullptr, bool delayInheritance=false) override
Tells the factory that we start a class declaration.
std::vector< std::string > __packages
The prefix used for classes and types names. It is normally the namespace of the corresponding compil...
Definition: PRMFactory.h:1040
virtual void endClass(bool checkImplementations=true) override
Tells the factory that we finished a class declaration.
PRMClass< GUM_SCALAR > * __retrieveClass(const std::string &name) const
Returns a pointer on a class given it&#39;s name. Used when building models, meaning that the class name ...
void addParameter(const std::string &type, const std::string &name, double value) override
Add a parameter to the current class with a default value.
value_type & insert(const Key &key, const Val &val)
Adds a new element (actually a copy of this element) into the hash table.
bool empty() const noexcept
Indicates whether the hash table is empty.
#define GUM_ERROR(type, msg)
Definition: exceptions.h:52
+ Here is the call graph for this function:

◆ addLabel()

template<typename GUM_SCALAR >
INLINE void gum::prm::PRMFactory< GUM_SCALAR >::addLabel ( const std::string &  l,
std::string  ext = "" 
)
overridevirtual

Add a label to the current discrete type.

Parameters
lThe label value.
extThe super type label for which l is an extension.
Exceptions
OperationNotAllowedRaised if the current type does not have a super type, see PRMFactory::addLabel(const std::string&).
DuplicateElementRaised if a label with the same value already exists.
NotFoundRaised if ext does not match any label in the current type's super type.

Implements gum::prm::IPRMFactory.

Definition at line 1431 of file PRMFactory_tpl.h.

References gum::prm::PRMFactory< GUM_SCALAR >::__checkStack(), gum::LabelizedVariable::addLabel(), gum::DiscreteVariable::domainSize(), GUM_ERROR, gum::DiscreteVariable::label(), and gum::prm::PRMObject::TYPE.

Referenced by gum::prm::o3prm::O3TypeFactory< GUM_SCALAR >::__buildTypes(), gum::prm::ClusteredLayerGenerator< GUM_SCALAR >::__generateType(), and gum::prm::LayerGenerator< GUM_SCALAR >::__generateType().

1432  {
1433  if (extends == "") {
1434  PRMType* t =
1435  static_cast< PRMType* >(__checkStack(1, PRMObject::prm_type::TYPE));
1436  LabelizedVariable* var = dynamic_cast< LabelizedVariable* >(t->__var);
1437 
1438  if (!var) {
1439  GUM_ERROR(FatalError,
1440  "the current type's variable is not a LabelizedVariable.");
1441  } else if (t->__superType) {
1442  GUM_ERROR(OperationNotAllowed, "current type is a subtype.");
1443  }
1444 
1445  try {
1446  var->addLabel(l);
1447  } catch (DuplicateElement&) {
1448  GUM_ERROR(DuplicateElement, "a label '" << l << "' already exists");
1449  }
1450  } else {
1451  PRMType* t =
1452  static_cast< PRMType* >(__checkStack(1, PRMObject::prm_type::TYPE));
1453  LabelizedVariable* var = dynamic_cast< LabelizedVariable* >(t->__var);
1454 
1455  if (!var) {
1456  GUM_ERROR(FatalError,
1457  "the current type's variable is not a LabelizedVariable.");
1458  } else if (!t->__superType) {
1459  GUM_ERROR(OperationNotAllowed, "current type is not a subtype.");
1460  }
1461 
1462  bool found = false;
1463 
1464  for (Idx i = 0; i < t->__superType->__var->domainSize(); ++i) {
1465  if (t->__superType->__var->label(i) == extends) {
1466  try {
1467  var->addLabel(l);
1468  } catch (DuplicateElement&) {
1469  GUM_ERROR(DuplicateElement, "a label '" << l << "' already exists");
1470  }
1471 
1472  t->__label_map->push_back(i);
1473 
1474  found = true;
1475  break;
1476  }
1477  }
1478 
1479  if (!found) { GUM_ERROR(NotFound, "inexistent label in super type."); }
1480  }
1481  }
PRMObject * __checkStack(Idx i, PRMObject::prm_type obj_type)
Return a pointer on a PRMObject at __stack.size() - i position after checking the type of the object ...
#define GUM_ERROR(type, msg)
Definition: exceptions.h:52
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ addNoisyOrCompound()

template<typename GUM_SCALAR >
INLINE void gum::prm::PRMFactory< GUM_SCALAR >::addNoisyOrCompound ( const std::string &  name,
const std::vector< std::string > &  chains,
const std::vector< float > &  numbers,
float  leak,
const std::vector< std::string > &  label 
)
overridevirtual

Add a compound noisy-or as an PRMAttribute<GUM_SCALAR> to the current Class<GUM_SCALAR>.

The type of a noisy-or must be a boolean.

Parameters
namethe name of the PRMAttribute<GUM_SCALAR> added as a noisy-or.
chainsthe list of parents of the noisy-or.
numbersthe list of weights for each parent. Can consist of only one value which will be applied to all the parents.
leakthe leak
labelthe label on which the noisy-or applies, can be an empty string (the noisy-or will behave as if chains are all booleans).
Exceptions
NotFoundRaised if one of the chains or the label is not found.
FactoryInvalidStateRaised if a Class<GUM_SCALAR> is not the current declared PRMObject.
OperationNotAllowedRaised if for some reasons the parameters are invalid.

Implements gum::prm::IPRMFactory.

Definition at line 1106 of file PRMFactory_tpl.h.

References gum::prm::PRMClass< GUM_SCALAR >::add(), gum::prm::PRMClassElement< GUM_SCALAR >::cast(), gum::MultiDimICIModel< GUM_SCALAR >::causalWeight(), gum::prm::PRMObject::CLASS, gum::prm::PRMClassElementContainer< GUM_SCALAR >::exists(), gum::prm::PRMClass< GUM_SCALAR >::get(), and GUM_ERROR.

1111  {
1113  GUM_ERROR(gum::FactoryInvalidState, "invalid state to add a noisy-or");
1114  }
1115 
1116  PRMClass< GUM_SCALAR >* c =
1117  dynamic_cast< gum::prm::PRMClass< GUM_SCALAR >* >(getCurrent());
1118 
1119  std::vector< PRMClassElement< GUM_SCALAR >* > parents;
1120 
1121  for (const auto& elt : chains)
1122  parents.push_back(&(c->get(elt)));
1123 
1124  PRMType* common_type = __retrieveCommonType(parents);
1125 
1126  for (size_t idx = 0; idx < parents.size(); ++idx) {
1127  if (parents[idx]->type() != (*common_type)) {
1128  PRMClassElement< GUM_SCALAR >* parent = parents[idx];
1129  // Either safe_name is an non existing slot chain or an existing cast
1130  // descendant
1131  std::string safe_name = parent->cast(*common_type);
1132 
1133  if (!c->exists(safe_name)) {
1135  parents[idx] = __buildSlotChain(c, safe_name);
1136  c->add(parents[idx]);
1137  } else {
1138  GUM_ERROR(NotFound, "unable to find parent");
1139  }
1140  } else {
1141  parents[idx] = &(c->get(safe_name));
1142  }
1143  }
1144  }
1145 
1146  if (numbers.size() == 1) {
1147  auto impl =
1148  new gum::MultiDimNoisyORCompound< GUM_SCALAR >(leak, numbers.front());
1149  auto attr = new PRMScalarAttribute< GUM_SCALAR >(
1150  name, retrieveType("boolean"), impl);
1151  addAttribute(attr);
1152  } else if (numbers.size() == parents.size()) {
1157  name, retrieveType("boolean"), noisy);
1158 
1159  for (size_t idx = 0; idx < numbers.size(); ++idx) {
1160  noisy->causalWeight(parents[idx]->type().variable(), numbers[idx]);
1161  }
1162 
1163  addAttribute(attr);
1164  } else {
1165  GUM_ERROR(OperationNotAllowed, "invalid parameters for a noisy or");
1166  }
1167 
1168  if (!labels.empty()) {
1169  GUM_ERROR(OperationNotAllowed,
1170  "labels definitions not handle for noisy-or");
1171  }
1172  }
PRMType & retrieveType(const std::string &name)
Returns a reference over a PRMType given its name.
virtual void addAttribute(const std::string &type, const std::string &name) override
Add an attribute to an interface.
PRMType * __retrieveCommonType(const std::vector< PRMClassElement< GUM_SCALAR > * > &elts)
Retrieve the common PRMType of a vector of PRMClassElement<GUM_SCALAR>.
virtual PRMObject::prm_type currentType() const override
<agrum/PRM/elements/funcAttribute.h>
PRMSlotChain< GUM_SCALAR > * __buildSlotChain(PRMClassElementContainer< GUM_SCALAR > *start, const std::string &name)
This methods build a PRMSlotChain<GUM_SCALAR> given a starting element and a string.
virtual PRMObject * getCurrent() override
A PRMClass is an object of a PRM representing a fragment of a Bayesian Network which can be instantia...
Definition: PRMClass.h:63
GUM_SCALAR causalWeight(const DiscreteVariable &v) const
Copy of a multiDimICIModel.
static INLINE bool isSlotChain(const PRMClassElement< GUM_SCALAR > &elt)
Return true if obj is of type PRMSlotChain.
#define GUM_ERROR(type, msg)
Definition: exceptions.h:52
+ Here is the call graph for this function:

◆ addParameter()

template<typename GUM_SCALAR >
INLINE void gum::prm::PRMFactory< GUM_SCALAR >::addParameter ( const std::string &  type,
const std::string &  name,
double  value 
)
overridevirtual

Add a parameter to the current class with a default value.

A parameter with a default value is an PRMAttribute<GUM_SCALAR> (aka mutable PRMAttribute<GUM_SCALAR>) with no parents and with a CPF filled with 1.

Parameters
typeThe type of this parameter.
nameThe name of this parameter.
valueThe label used as default value for this parameter.

Implements gum::prm::IPRMFactory.

Definition at line 542 of file PRMFactory_tpl.h.

References gum::prm::PRMObject::CLASS.

Referenced by gum::prm::o3prm::O3ClassFactory< GUM_SCALAR >::__addParameters(), and gum::prm::PRMFactory< GUM_SCALAR >::addInstance().

544  {
545  auto c = static_cast< PRMClass< GUM_SCALAR >* >(
547 
548  PRMParameter< GUM_SCALAR >* p = nullptr;
549  if (type == "int") {
550  p = new PRMParameter< GUM_SCALAR >(
551  name,
552  PRMParameter< GUM_SCALAR >::ParameterType::INT,
553  (GUM_SCALAR)value);
554  } else if (type == "real") {
555  p = new PRMParameter< GUM_SCALAR >(
556  name,
557  PRMParameter< GUM_SCALAR >::ParameterType::REAL,
558  (GUM_SCALAR)value);
559  }
560 
561  try {
562  c->add(p);
563  } catch (DuplicateElement&) { c->overload(p); }
564  }
PRMObject * __checkStack(Idx i, PRMObject::prm_type obj_type)
Return a pointer on a PRMObject at __stack.size() - i position after checking the type of the object ...
+ Here is the caller graph for this function:

◆ addParent()

template<typename GUM_SCALAR >
INLINE void gum::prm::PRMFactory< GUM_SCALAR >::addParent ( const std::string &  name)
overridevirtual

Tells the factory that we add a parent to the current declared attribute.

The name can refer to an already declared attribute or aggregate of the same class. It can also be a slot chain only if there is no multiple reference in it.

Exceptions
OperationNotAllowedRaised if the given operation is illegal.

Implements gum::prm::IPRMFactory.

Definition at line 303 of file PRMFactory_tpl.h.

Referenced by gum::prm::o3prm::O3ClassFactory< GUM_SCALAR >::__completeAggregates(), gum::prm::o3prm::O3ClassFactory< GUM_SCALAR >::__completeAttribute(), gum::prm::ClusteredLayerGenerator< GUM_SCALAR >::__generateClass(), gum::prm::LayerGenerator< GUM_SCALAR >::__generateClasses(), and gum::prm::ClusteredLayerGenerator< GUM_SCALAR >::__generateCluster().

303  {
304  PRMClassElementContainer< GUM_SCALAR >* c = __checkStackContainter(2);
305  try {
306  // Retrieving pointers
307  PRMAttribute< GUM_SCALAR >* a = static_cast< PRMAttribute< GUM_SCALAR >* >(
309  __addParent(c, a, name);
310  } catch (FactoryInvalidState&) {
311  auto agg = static_cast< PRMAggregate< GUM_SCALAR >* >(
313  __addParent(static_cast< PRMClass< GUM_SCALAR >* >(c), agg, name);
314  }
315  }
PRMClassElementContainer< GUM_SCALAR > * __checkStackContainter(Idx i)
Adds __prefix to str iff __prefix != "".
void __addParent(PRMClassElementContainer< GUM_SCALAR > *c, PRMAttribute< GUM_SCALAR > *agg, const std::string &name)
Add a parent to an attribute.
PRMObject * __checkStack(Idx i, PRMObject::prm_type obj_type)
Return a pointer on a PRMObject at __stack.size() - i position after checking the type of the object ...
+ Here is the caller graph for this function:

◆ addRangeType()

template<typename GUM_SCALAR >
INLINE void gum::prm::PRMFactory< GUM_SCALAR >::addRangeType ( const std::string &  name,
long  minVal,
long  maxVal 
)
overridevirtual

Add a range variable type declaration.

Parameters
nameThe variable's name
minValThe variable's lower bound.
maxValThe variable's upper bound.
Exceptions
DuplicateElementRaised if an object with the same name already exists.
OperationNotAllowedRaised if the range variable is not a valid discrete type.

Implements gum::prm::IPRMFactory.

Definition at line 1549 of file PRMFactory_tpl.h.

References gum::prm::PRMFactory< GUM_SCALAR >::__addPrefix(), gum::prm::PRMFactory< GUM_SCALAR >::__prm, and GUM_ERROR.

Referenced by gum::prm::o3prm::O3TypeFactory< GUM_SCALAR >::__buildIntTypes().

1551  {
1552  std::string real_name = __addPrefix(name);
1553  if (__prm->__typeMap.exists(real_name)) {
1554  std::stringstream msg;
1555  msg << "\"" << real_name << "' is already used.";
1556  GUM_ERROR(DuplicateElement, msg.str());
1557  }
1558 
1559  auto var = RangeVariable(real_name, "", minVal, maxVal);
1560  auto t = new PRMType(var);
1561 
1562  if (t->variable().domainSize() < 2) {
1563  GUM_ERROR(OperationNotAllowed,
1564  "current type is not a valid discrete type");
1565  }
1566 
1567  __prm->__typeMap.insert(t->name(), t);
1568  __prm->__types.insert(t);
1569  }
PRM< GUM_SCALAR > * __prm
The pointer on the PRM<GUM_SCALAR> built by this factory.
Definition: PRMFactory.h:1046
std::string __addPrefix(const std::string &str) const
Adds __prefix to str iff __prefix != "".
#define GUM_ERROR(type, msg)
Definition: exceptions.h:52
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ addReferenceSlot()

template<typename GUM_SCALAR >
INLINE void gum::prm::PRMFactory< GUM_SCALAR >::addReferenceSlot ( const std::string &  type,
const std::string &  name,
bool  isArray 
)
overridevirtual

Tells the factory that we started declaring a slot.

Exceptions
OperationNotAllowedRaised if the given operation is illegal.

Implements gum::prm::IPRMFactory.

Definition at line 841 of file PRMFactory_tpl.h.

References gum::prm::PRMClassElementContainer< GUM_SCALAR >::add(), GUM_ERROR, and gum::prm::PRMClassElementContainer< GUM_SCALAR >::overload().

Referenced by gum::prm::o3prm::O3ClassFactory< GUM_SCALAR >::__addReferenceSlots(), gum::prm::ClusteredLayerGenerator< GUM_SCALAR >::__generateClass(), gum::prm::LayerGenerator< GUM_SCALAR >::__generateClasses(), gum::prm::ClusteredLayerGenerator< GUM_SCALAR >::__generateCluster(), gum::prm::ClusteredLayerGenerator< GUM_SCALAR >::__generateInterfaces(), gum::prm::LayerGenerator< GUM_SCALAR >::__generateInterfaces(), and gum::prm::o3prm::O3InterfaceFactory< GUM_SCALAR >::buildElements().

843  {
844  PRMClassElementContainer< GUM_SCALAR >* owner = __checkStackContainter(1);
845  PRMClassElementContainer< GUM_SCALAR >* slotType = 0;
846 
847  try {
848  slotType = __retrieveClass(type);
849  } catch (NotFound&) {
850  try {
851  slotType = __retrieveInterface(type);
852  } catch (NotFound&) {
853  GUM_ERROR(NotFound, "unknown ReferenceSlot<GUM_SCALAR> slot type");
854  }
855  }
856 
857  PRMReferenceSlot< GUM_SCALAR >* ref =
858  new PRMReferenceSlot< GUM_SCALAR >(name, *slotType, isArray);
859 
860  try {
861  owner->add(ref);
862  } catch (DuplicateElement&) { owner->overload(ref); }
863  }
PRMClassElementContainer< GUM_SCALAR > * __checkStackContainter(Idx i)
Adds __prefix to str iff __prefix != "".
PRMClass< GUM_SCALAR > * __retrieveClass(const std::string &name) const
Returns a pointer on a class given it&#39;s name. Used when building models, meaning that the class name ...
PRMInterface< GUM_SCALAR > * __retrieveInterface(const std::string &name) const
Returns a pointer on an interface given it&#39;s name. Used when building models, meaning that the interf...
#define GUM_ERROR(type, msg)
Definition: exceptions.h:52
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ addTick()

template<typename GUM_SCALAR >
INLINE void gum::prm::PRMFactory< GUM_SCALAR >::addTick ( double  tick)
overridevirtual

Add a tick to the current discretized type.

Parameters
tickThe tick value.

Implements gum::prm::IPRMFactory.

Definition at line 1514 of file PRMFactory_tpl.h.

References gum::prm::PRMFactory< GUM_SCALAR >::__checkStack(), gum::DiscretizedVariable< T_TICKS >::addTick(), GUM_ERROR, and gum::prm::PRMObject::TYPE.

Referenced by gum::prm::o3prm::O3TypeFactory< GUM_SCALAR >::__buildRealTypes().

1514  {
1515  PRMType* t =
1516  static_cast< PRMType* >(__checkStack(1, PRMObject::prm_type::TYPE));
1517  DiscretizedVariable< double >* var =
1518  dynamic_cast< DiscretizedVariable< double >* >(t->__var);
1519 
1520  if (!var) {
1521  GUM_ERROR(FatalError,
1522  "the current type's variable is not a LabelizedVariable.");
1523  }
1524 
1525  try {
1526  var->addTick(tick);
1527  } catch (DefaultInLabel&) {
1528  GUM_ERROR(OperationNotAllowed, "tick already in used for this variable");
1529  }
1530  }
PRMObject * __checkStack(Idx i, PRMObject::prm_type obj_type)
Return a pointer on a PRMObject at __stack.size() - i position after checking the type of the object ...
#define GUM_ERROR(type, msg)
Definition: exceptions.h:52
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ closeCurrent()

template<typename GUM_SCALAR >
INLINE PRMObject * gum::prm::PRMFactory< GUM_SCALAR >::closeCurrent ( )
overridevirtual

Close current object being built.

Nothing is done in particular except removing the current object from the factory's stack. If the object was not added to a container it will not be deleted properly, so you might want to delete it yourself (at your own risks!).

Returns
Returns the top most object removed in this factory's stack before. If their is no such object, 0 is returned.

Implements gum::prm::IPRMFactory.

Definition at line 1396 of file PRMFactory_tpl.h.

References gum::prm::PRMFactory< GUM_SCALAR >::__stack.

1396  {
1397  if (__stack.size() > 0) {
1398  PRMObject* obj = __stack.back();
1399  __stack.pop_back();
1400  return obj;
1401  } else {
1402  return 0;
1403  }
1404  }
std::vector< PRMObject *> __stack
A stack used to keep track of created PRMObject.
Definition: PRMFactory.h:1049

◆ continueAggregator()

template<typename GUM_SCALAR >
INLINE void gum::prm::PRMFactory< GUM_SCALAR >::continueAggregator ( const std::string &  name)

Conitnues an aggregator declaration.

Definition at line 603 of file PRMFactory_tpl.h.

References gum::prm::PRMClassElementContainer< GUM_SCALAR >::exists(), gum::prm::PRMClassElementContainer< GUM_SCALAR >::get(), and GUM_ERROR.

Referenced by gum::prm::o3prm::O3ClassFactory< GUM_SCALAR >::__completeAggregates().

603  {
604  PRMClassElementContainer< GUM_SCALAR >* c = __checkStackContainter(1);
605  if (!c->exists(name)) { GUM_ERROR(NotFound, name << "not found"); }
606  auto& agg = c->get(name);
608  GUM_ERROR(OperationNotAllowed, name << " not an aggregate");
609  }
610  __stack.push_back(&agg);
611  }
std::vector< PRMObject *> __stack
A stack used to keep track of created PRMObject.
Definition: PRMFactory.h:1049
PRMClassElementContainer< GUM_SCALAR > * __checkStackContainter(Idx i)
Adds __prefix to str iff __prefix != "".
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 call graph for this function:
+ Here is the caller graph for this function:

◆ continueAttribute()

template<typename GUM_SCALAR >
INLINE void gum::prm::PRMFactory< GUM_SCALAR >::continueAttribute ( const std::string &  name)
overridevirtual

Continues the declaration of an attribute.

Implements gum::prm::IPRMFactory.

Definition at line 1617 of file PRMFactory_tpl.h.

References gum::prm::PRMFactory< GUM_SCALAR >::__checkStackContainter(), gum::prm::PRMFactory< GUM_SCALAR >::__stack, gum::prm::PRMClassElementContainer< GUM_SCALAR >::exists(), gum::prm::PRMClassElementContainer< GUM_SCALAR >::get(), and GUM_ERROR.

Referenced by gum::prm::o3prm::O3ClassFactory< GUM_SCALAR >::__completeAttribute().

1617  {
1618  PRMClassElementContainer< GUM_SCALAR >* c = __checkStackContainter(1);
1619  if (!c->exists(name)) { GUM_ERROR(NotFound, name << "not found"); }
1620  auto& a = c->get(name);
1622  GUM_ERROR(OperationNotAllowed, name << " not an attribute");
1623  }
1624  __stack.push_back(&a);
1625  }
std::vector< PRMObject *> __stack
A stack used to keep track of created PRMObject.
Definition: PRMFactory.h:1049
PRMClassElementContainer< GUM_SCALAR > * __checkStackContainter(Idx i)
Adds __prefix to str iff __prefix != "".
static INLINE bool isAttribute(const PRMClassElement< GUM_SCALAR > &elt)
Returns true if obj_ptr is of type PRMAttribute.
#define GUM_ERROR(type, msg)
Definition: exceptions.h:52
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ continueClass()

template<typename GUM_SCALAR >
INLINE void gum::prm::PRMFactory< GUM_SCALAR >::continueClass ( const std::string &  c)
overridevirtual

Continue the declaration of a class.

Implements gum::prm::IPRMFactory.

Definition at line 82 of file PRMFactory_tpl.h.

References GUM_ERROR.

Referenced by gum::prm::o3prm::O3ClassFactory< GUM_SCALAR >::__addReferenceSlots(), gum::prm::o3prm::O3ClassFactory< GUM_SCALAR >::__declareAggregates(), gum::prm::o3prm::O3ClassFactory< GUM_SCALAR >::__declareAttribute(), gum::prm::o3prm::O3ClassFactory< GUM_SCALAR >::buildParameters(), gum::prm::o3prm::O3ClassFactory< GUM_SCALAR >::completeAggregates(), and gum::prm::o3prm::O3ClassFactory< GUM_SCALAR >::completeAttributes().

82  {
83  std::string real_name = __addPrefix(name);
84  if (!(__prm->__classMap.exists(real_name))) {
85  std::stringstream msg;
86  msg << "'" << real_name << "' not found";
87  GUM_ERROR(NotFound, msg.str());
88  }
89  __stack.push_back(&(__prm->getClass(real_name)));
90  }
PRM< GUM_SCALAR > * __prm
The pointer on the PRM<GUM_SCALAR> built by this factory.
Definition: PRMFactory.h:1046
std::vector< PRMObject *> __stack
A stack used to keep track of created PRMObject.
Definition: PRMFactory.h:1049
std::string __addPrefix(const std::string &str) const
Adds __prefix to str iff __prefix != "".
#define GUM_ERROR(type, msg)
Definition: exceptions.h:52
+ Here is the caller graph for this function:

◆ continueInterface()

template<typename GUM_SCALAR >
INLINE void gum::prm::PRMFactory< GUM_SCALAR >::continueInterface ( const std::string &  name)
overridevirtual

Continue the declaration of an interface.

Implements gum::prm::IPRMFactory.

Definition at line 210 of file PRMFactory_tpl.h.

References GUM_ERROR.

Referenced by gum::prm::o3prm::O3InterfaceFactory< GUM_SCALAR >::buildElements().

210  {
211  std::string real_name = __addPrefix(name);
212  if (!__prm->__interfaceMap.exists(real_name)) {
213  GUM_ERROR(DuplicateElement, "'" << real_name << "' not found.");
214  }
215 
216  PRMInterface< GUM_SCALAR >* i = __retrieveInterface(real_name);
217  __stack.push_back(i);
218  }
PRM< GUM_SCALAR > * __prm
The pointer on the PRM<GUM_SCALAR> built by this factory.
Definition: PRMFactory.h:1046
std::vector< PRMObject *> __stack
A stack used to keep track of created PRMObject.
Definition: PRMFactory.h:1049
std::string __addPrefix(const std::string &str) const
Adds __prefix to str iff __prefix != "".
PRMInterface< GUM_SCALAR > * __retrieveInterface(const std::string &name) const
Returns a pointer on an interface given it&#39;s name. Used when building models, meaning that the interf...
#define GUM_ERROR(type, msg)
Definition: exceptions.h:52
+ Here is the caller graph for this function:

◆ currentPackage()

template<typename GUM_SCALAR >
INLINE std::string gum::prm::PRMFactory< GUM_SCALAR >::currentPackage ( ) const
overridevirtual
Returns
Returns the current package name.

Implements gum::prm::IPRMFactory.

Definition at line 1407 of file PRMFactory_tpl.h.

References gum::prm::PRMFactory< GUM_SCALAR >::__packages.

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

1407  {
1408  return (__packages.empty()) ? "" : __packages.back();
1409  }
std::vector< std::string > __packages
The prefix used for classes and types names. It is normally the namespace of the corresponding compil...
Definition: PRMFactory.h:1040
+ Here is the caller graph for this function:

◆ currentType()

template<typename GUM_SCALAR >
INLINE PRMObject::prm_type gum::prm::PRMFactory< GUM_SCALAR >::currentType ( ) const
overridevirtual
Returns
Returns the PRMObject type of the object begin built.
Exceptions
NotFoundif no type is being built.

Implements gum::prm::IPRMFactory.

Definition at line 1375 of file PRMFactory_tpl.h.

References gum::prm::PRMFactory< GUM_SCALAR >::__stack, and GUM_ERROR.

1375  {
1376  if (__stack.size() == 0) { GUM_ERROR(NotFound, "no object being built"); }
1377 
1378  return __stack.back()->obj_type();
1379  }
std::vector< PRMObject *> __stack
A stack used to keep track of created PRMObject.
Definition: PRMFactory.h:1049
#define GUM_ERROR(type, msg)
Definition: exceptions.h:52

◆ endAggregator()

template<typename GUM_SCALAR >
INLINE void gum::prm::PRMFactory< GUM_SCALAR >::endAggregator ( )

Finishes an aggregate declaration.

Definition at line 669 of file PRMFactory_tpl.h.

Referenced by gum::prm::o3prm::O3ClassFactory< GUM_SCALAR >::__completeAggregates(), and gum::prm::o3prm::O3ClassFactory< GUM_SCALAR >::__declareAggregates().

669  {
671  __stack.pop_back();
672  }
std::vector< PRMObject *> __stack
A stack used to keep track of created PRMObject.
Definition: PRMFactory.h:1049
PRMObject * __checkStack(Idx i, PRMObject::prm_type obj_type)
Return a pointer on a PRMObject at __stack.size() - i position after checking the type of the object ...
+ Here is the caller graph for this function:

◆ endAttribute()

template<typename GUM_SCALAR >
INLINE void gum::prm::PRMFactory< GUM_SCALAR >::endAttribute ( )
overridevirtual

Tells the factory that we finished declaring an attribute.

Exceptions
OperationNotAllowedRaised if the given operation is illegal.

Implements gum::prm::IPRMFactory.

Definition at line 1628 of file PRMFactory_tpl.h.

References gum::prm::PRMFactory< GUM_SCALAR >::__checkStack(), and gum::prm::PRMFactory< GUM_SCALAR >::__stack.

Referenced by gum::prm::o3prm::O3ClassFactory< GUM_SCALAR >::__completeAttribute(), gum::prm::o3prm::O3ClassFactory< GUM_SCALAR >::__declareAttribute(), gum::prm::ClusteredLayerGenerator< GUM_SCALAR >::__generateClass(), gum::prm::LayerGenerator< GUM_SCALAR >::__generateClasses(), gum::prm::ClusteredLayerGenerator< GUM_SCALAR >::__generateCluster(), and gum::prm::PRMFactory< GUM_SCALAR >::addAttribute().

1628  {
1630  __stack.pop_back();
1631  }
std::vector< PRMObject *> __stack
A stack used to keep track of created PRMObject.
Definition: PRMFactory.h:1049
PRMObject * __checkStack(Idx i, PRMObject::prm_type obj_type)
Return a pointer on a PRMObject at __stack.size() - i position after checking the type of the object ...
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ endClass()

template<typename GUM_SCALAR >
INLINE void gum::prm::PRMFactory< GUM_SCALAR >::endClass ( bool  checkImplementations = true)
overridevirtual

Tells the factory that we finished a class declaration.

Exceptions
TypeErrorRaised if the current Class<GUM_SCALAR> does not respect one of it's PRMInterface<GUM_SCALAR>.

Implements gum::prm::IPRMFactory.

Definition at line 93 of file PRMFactory_tpl.h.

References gum::prm::PRMObject::CLASS.

Referenced by gum::prm::o3prm::O3ClassFactory< GUM_SCALAR >::__addReferenceSlots(), gum::prm::o3prm::O3ClassFactory< GUM_SCALAR >::__declareAggregates(), gum::prm::o3prm::O3ClassFactory< GUM_SCALAR >::__declareAttribute(), gum::prm::ClusteredLayerGenerator< GUM_SCALAR >::__generateClass(), gum::prm::LayerGenerator< GUM_SCALAR >::__generateClasses(), gum::prm::ClusteredLayerGenerator< GUM_SCALAR >::__generateCluster(), gum::prm::PRMFactory< GUM_SCALAR >::addInstance(), gum::prm::o3prm::O3ClassFactory< GUM_SCALAR >::buildClasses(), gum::prm::o3prm::O3ClassFactory< GUM_SCALAR >::buildParameters(), gum::prm::o3prm::O3ClassFactory< GUM_SCALAR >::completeAggregates(), and gum::prm::o3prm::O3ClassFactory< GUM_SCALAR >::completeAttributes().

93  {
94  PRMClass< GUM_SCALAR >* c = static_cast< PRMClass< GUM_SCALAR >* >(
96 
97  if (checkImplementations) { __checkInterfaceImplementation(c); }
98 
99  __stack.pop_back();
100  }
std::vector< PRMObject *> __stack
A stack used to keep track of created PRMObject.
Definition: PRMFactory.h:1049
void __checkInterfaceImplementation(PRMClass< GUM_SCALAR > *c)
Check if c implements correctly all his interfaces.
PRMObject * __checkStack(Idx i, PRMObject::prm_type obj_type)
Return a pointer on a PRMObject at __stack.size() - i position after checking the type of the object ...
+ Here is the caller graph for this function:

◆ endDiscreteType()

template<typename GUM_SCALAR >
INLINE void gum::prm::PRMFactory< GUM_SCALAR >::endDiscreteType ( )
overridevirtual

End the current discrete type declaration.

Exceptions
OperationNotAllowedRaised if the current type is not a valid discrete type.

Implements gum::prm::IPRMFactory.

Definition at line 1484 of file PRMFactory_tpl.h.

References gum::prm::PRMFactory< GUM_SCALAR >::__checkStack(), gum::prm::PRMFactory< GUM_SCALAR >::__prm, gum::prm::PRMFactory< GUM_SCALAR >::__stack, gum::DiscreteVariable::domainSize(), GUM_ERROR, gum::Variable::name(), and gum::prm::PRMObject::TYPE.

Referenced by gum::prm::o3prm::O3TypeFactory< GUM_SCALAR >::__buildTypes(), gum::prm::ClusteredLayerGenerator< GUM_SCALAR >::__generateType(), and gum::prm::LayerGenerator< GUM_SCALAR >::__generateType().

1484  {
1485  PRMType* t =
1486  static_cast< PRMType* >(__checkStack(1, PRMObject::prm_type::TYPE));
1487 
1488  if (!t->__isValid()) {
1489  GUM_ERROR(OperationNotAllowed, "current type is not a valid subtype");
1490  } else if (t->variable().domainSize() < 2) {
1491  GUM_ERROR(OperationNotAllowed,
1492  "current type is not a valid discrete type");
1493  }
1494 
1495  __prm->__typeMap.insert(t->name(), t);
1496 
1497  __prm->__types.insert(t);
1498  __stack.pop_back();
1499  }
PRM< GUM_SCALAR > * __prm
The pointer on the PRM<GUM_SCALAR> built by this factory.
Definition: PRMFactory.h:1046
std::vector< PRMObject *> __stack
A stack used to keep track of created PRMObject.
Definition: PRMFactory.h:1049
PRMObject * __checkStack(Idx i, PRMObject::prm_type obj_type)
Return a pointer on a PRMObject at __stack.size() - i position after checking the type of the object ...
#define GUM_ERROR(type, msg)
Definition: exceptions.h:52
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ endDiscretizedType()

template<typename GUM_SCALAR >
INLINE void gum::prm::PRMFactory< GUM_SCALAR >::endDiscretizedType ( )
overridevirtual

End the current discretized type declaration.

Exceptions
OperationNotAllowedRaised if the current type is not a valid discrete type.

Implements gum::prm::IPRMFactory.

Definition at line 1533 of file PRMFactory_tpl.h.

References gum::prm::PRMFactory< GUM_SCALAR >::__checkStack(), gum::prm::PRMFactory< GUM_SCALAR >::__prm, gum::prm::PRMFactory< GUM_SCALAR >::__stack, gum::DiscreteVariable::domainSize(), GUM_ERROR, gum::Variable::name(), and gum::prm::PRMObject::TYPE.

Referenced by gum::prm::o3prm::O3TypeFactory< GUM_SCALAR >::__buildRealTypes().

1533  {
1534  PRMType* t =
1535  static_cast< PRMType* >(__checkStack(1, PRMObject::prm_type::TYPE));
1536 
1537  if (t->variable().domainSize() < 2) {
1538  GUM_ERROR(OperationNotAllowed,
1539  "current type is not a valid discrete type");
1540  }
1541 
1542  __prm->__typeMap.insert(t->name(), t);
1543 
1544  __prm->__types.insert(t);
1545  __stack.pop_back();
1546  }
PRM< GUM_SCALAR > * __prm
The pointer on the PRM<GUM_SCALAR> built by this factory.
Definition: PRMFactory.h:1046
std::vector< PRMObject *> __stack
A stack used to keep track of created PRMObject.
Definition: PRMFactory.h:1049
PRMObject * __checkStack(Idx i, PRMObject::prm_type obj_type)
Return a pointer on a PRMObject at __stack.size() - i position after checking the type of the object ...
#define GUM_ERROR(type, msg)
Definition: exceptions.h:52
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ endInterface()

template<typename GUM_SCALAR >
INLINE void gum::prm::PRMFactory< GUM_SCALAR >::endInterface ( )
overridevirtual

Tells the factory that we finished an interface declaration.

Implements gum::prm::IPRMFactory.

Definition at line 1572 of file PRMFactory_tpl.h.

References gum::prm::PRMFactory< GUM_SCALAR >::__checkStack(), gum::prm::PRMFactory< GUM_SCALAR >::__stack, and gum::prm::PRMObject::PRM_INTERFACE.

Referenced by gum::prm::ClusteredLayerGenerator< GUM_SCALAR >::__generateInterfaces(), gum::prm::LayerGenerator< GUM_SCALAR >::__generateInterfaces(), gum::prm::o3prm::O3InterfaceFactory< GUM_SCALAR >::buildElements(), and gum::prm::o3prm::O3InterfaceFactory< GUM_SCALAR >::buildInterfaces().

1572  {
1574  __stack.pop_back();
1575  }
std::vector< PRMObject *> __stack
A stack used to keep track of created PRMObject.
Definition: PRMFactory.h:1049
PRMObject * __checkStack(Idx i, PRMObject::prm_type obj_type)
Return a pointer on a PRMObject at __stack.size() - i position after checking the type of the object ...
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ endSystem()

template<typename GUM_SCALAR >
INLINE void gum::prm::PRMFactory< GUM_SCALAR >::endSystem ( )
overridevirtual

Tells the factory that we finished declaring a model.

Exceptions
OperationNotAllowedRaised if the given operation is illegal.

Implements gum::prm::IPRMFactory.

Definition at line 1646 of file PRMFactory_tpl.h.

References gum::prm::PRMFactory< GUM_SCALAR >::__checkStack(), gum::prm::PRMFactory< GUM_SCALAR >::__stack, GUM_ERROR, gum::prm::PRMSystem< GUM_SCALAR >::instantiate(), and gum::prm::PRMObject::SYSTEM.

Referenced by gum::prm::LayerGenerator< GUM_SCALAR >::__generateSystem(), gum::prm::ClusteredLayerGenerator< GUM_SCALAR >::__generateSystem(), and gum::prm::o3prm::O3SystemFactory< GUM_SCALAR >::build().

1646  {
1647  try {
1648  PRMSystem< GUM_SCALAR >* model = static_cast< PRMSystem< GUM_SCALAR >* >(
1650  __stack.pop_back();
1651  model->instantiate();
1652  } catch (Exception&) { GUM_ERROR(FatalError, "could not create system"); }
1653  }
std::vector< PRMObject *> __stack
A stack used to keep track of created PRMObject.
Definition: PRMFactory.h:1049
PRMObject * __checkStack(Idx i, PRMObject::prm_type obj_type)
Return a pointer on a PRMObject at __stack.size() - i position after checking the type of the object ...
#define GUM_ERROR(type, msg)
Definition: exceptions.h:52
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ getCurrent() [1/2]

template<typename GUM_SCALAR >
INLINE PRMObject * gum::prm::PRMFactory< GUM_SCALAR >::getCurrent ( )
overridevirtual
Returns
the current PRMObject being built by this factory.
Exceptions
NotFoundif nothing is being built.

Implements gum::prm::IPRMFactory.

Definition at line 1382 of file PRMFactory_tpl.h.

References gum::prm::PRMFactory< GUM_SCALAR >::__stack, and GUM_ERROR.

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

1382  {
1383  if (__stack.size() == 0) { GUM_ERROR(NotFound, "no object being built"); }
1384 
1385  return __stack.back();
1386  }
std::vector< PRMObject *> __stack
A stack used to keep track of created PRMObject.
Definition: PRMFactory.h:1049
#define GUM_ERROR(type, msg)
Definition: exceptions.h:52
+ Here is the caller graph for this function:

◆ getCurrent() [2/2]

template<typename GUM_SCALAR >
INLINE const PRMObject * gum::prm::PRMFactory< GUM_SCALAR >::getCurrent ( ) const
overridevirtual

Returns a pointer on the PRM<GUM_SCALAR> created by this factory.

This pointer will not be deleted when the factory is destroyed.

Returns
Returns the PRM<GUM_SCALAR> created by this factory.

Implements gum::prm::IPRMFactory.

Definition at line 1389 of file PRMFactory_tpl.h.

References gum::prm::PRMFactory< GUM_SCALAR >::__stack, and GUM_ERROR.

1389  {
1390  if (__stack.size() == 0) { GUM_ERROR(NotFound, "no object being built"); }
1391 
1392  return __stack.back();
1393  }
std::vector< PRMObject *> __stack
A stack used to keep track of created PRMObject.
Definition: PRMFactory.h:1049
#define GUM_ERROR(type, msg)
Definition: exceptions.h:52

◆ incArray()

template<typename GUM_SCALAR >
INLINE void gum::prm::PRMFactory< GUM_SCALAR >::incArray ( const std::string &  l_i,
const std::string &  r_i 
)
overridevirtual

Add an instance to an array.

Implements gum::prm::IPRMFactory.

Definition at line 893 of file PRMFactory_tpl.h.

References gum::prm::PRMSystem< GUM_SCALAR >::add(), gum::prm::PRMSystem< GUM_SCALAR >::get(), GUM_ERROR, gum::prm::PRMSystem< GUM_SCALAR >::isArray(), gum::prm::PRMSystem< GUM_SCALAR >::isInstance(), and gum::prm::PRMObject::SYSTEM.

894  {
895  PRMSystem< GUM_SCALAR >* model = static_cast< PRMSystem< GUM_SCALAR >* >(
897 
898  if (model->isArray(l_i)) {
899  if (model->isInstance(r_i)) {
900  model->add(l_i, model->get(r_i));
901  } else {
902  GUM_ERROR(NotFound, "right value is not an instance");
903  }
904  } else {
905  GUM_ERROR(NotFound, "left value is no an array");
906  }
907  }
PRMObject * __checkStack(Idx i, PRMObject::prm_type obj_type)
Return a pointer on a PRMObject at __stack.size() - i position after checking the type of the object ...
#define GUM_ERROR(type, msg)
Definition: exceptions.h:52
+ Here is the call graph for this function:

◆ isArrayInCurrentSystem()

template<typename GUM_SCALAR >
INLINE bool gum::prm::PRMFactory< GUM_SCALAR >::isArrayInCurrentSystem ( const std::string &  name) const
overridevirtual

Implements gum::prm::IPRMFactory.

Definition at line 1927 of file PRMFactory_tpl.h.

References gum::prm::PRMFactory< GUM_SCALAR >::getCurrent(), and gum::prm::PRMSystem< GUM_SCALAR >::isArray().

1928  {
1929  const PRMSystem< GUM_SCALAR >* system =
1930  static_cast< const PRMSystem< GUM_SCALAR >* >(getCurrent());
1931  return (system && system->isArray(name));
1932  }
virtual PRMObject * getCurrent() override
+ Here is the call graph for this function:

◆ isClassOrInterface()

template<typename GUM_SCALAR >
INLINE bool gum::prm::PRMFactory< GUM_SCALAR >::isClassOrInterface ( const std::string &  type) const
overridevirtual

Implements gum::prm::IPRMFactory.

Definition at line 1907 of file PRMFactory_tpl.h.

References gum::prm::PRMFactory< GUM_SCALAR >::__retrieveClass(), and gum::prm::PRMFactory< GUM_SCALAR >::__retrieveInterface().

1908  {
1909  try {
1910  __retrieveClass(type);
1911  return true;
1912 
1913  } catch (NotFound&) {
1914  } catch (DuplicateElement&) {}
1915 
1916  try {
1917  __retrieveInterface(type);
1918  return true;
1919 
1920  } catch (NotFound&) {
1921  } catch (DuplicateElement&) {}
1922 
1923  return false;
1924  }
PRMClass< GUM_SCALAR > * __retrieveClass(const std::string &name) const
Returns a pointer on a class given it&#39;s name. Used when building models, meaning that the class name ...
PRMInterface< GUM_SCALAR > * __retrieveInterface(const std::string &name) const
Returns a pointer on an interface given it&#39;s name. Used when building models, meaning that the interf...
+ Here is the call graph for this function:

◆ operator=()

template<typename GUM_SCALAR>
PRMFactory& gum::prm::PRMFactory< GUM_SCALAR >::operator= ( const PRMFactory< GUM_SCALAR > &  from)
delete

Copy operator. Don't use it.

◆ popPackage()

template<typename GUM_SCALAR >
INLINE std::string gum::prm::PRMFactory< GUM_SCALAR >::popPackage ( )
overridevirtual

Pop the current package from the package stack.

Returns
the popped package or an empty string if there was nothing to pop.

Implements gum::prm::IPRMFactory.

Definition at line 1845 of file PRMFactory_tpl.h.

References gum::prm::PRMFactory< GUM_SCALAR >::__namespaces, gum::prm::PRMFactory< GUM_SCALAR >::__packages, and gum::prm::PRMFactory< GUM_SCALAR >::currentPackage().

1845  {
1846  std::string plop = currentPackage();
1847 
1848  if (!__packages.empty()) {
1849  std::string s = __packages.back();
1850  __packages.pop_back();
1851 
1852  if (__namespaces.size() > 0) {
1853  delete __namespaces.back();
1854  __namespaces.pop_back();
1855  }
1856  return s;
1857  }
1858 
1859  return plop;
1860  }
virtual std::string currentPackage() const override
std::vector< std::string > __packages
The prefix used for classes and types names. It is normally the namespace of the corresponding compil...
Definition: PRMFactory.h:1040
std::vector< List< std::string > *> __namespaces
Set of all declared namespaces.
Definition: PRMFactory.h:1043
+ Here is the call graph for this function:

◆ prm()

template<typename GUM_SCALAR >
INLINE PRM< GUM_SCALAR > * gum::prm::PRMFactory< GUM_SCALAR >::prm ( ) const

Returns a pointer on the PRM<GUM_SCALAR> created by this factory.

This pointer will not be deleted when the factory is destroyed.

Returns
Returns the PRM<GUM_SCALAR> created by this factory.

Definition at line 1370 of file PRMFactory_tpl.h.

References gum::prm::PRMFactory< GUM_SCALAR >::__prm.

Referenced by gum::prm::ClusteredLayerGenerator< GUM_SCALAR >::generate(), and gum::prm::LayerGenerator< GUM_SCALAR >::generate().

1370  {
1371  return __prm;
1372  }
PRM< GUM_SCALAR > * __prm
The pointer on the PRM<GUM_SCALAR> built by this factory.
Definition: PRMFactory.h:1046
+ Here is the caller graph for this function:

◆ pushPackage()

template<typename GUM_SCALAR >
INLINE void gum::prm::PRMFactory< GUM_SCALAR >::pushPackage ( const std::string &  name)
overridevirtual

Define the current package.

A stack is used to keep track of packages given the different imports.

Parameters
nameThe name of the package for all further objects.

Implements gum::prm::IPRMFactory.

Definition at line 1839 of file PRMFactory_tpl.h.

References gum::prm::PRMFactory< GUM_SCALAR >::__namespaces, and gum::prm::PRMFactory< GUM_SCALAR >::__packages.

1839  {
1840  __packages.push_back(name);
1841  __namespaces.push_back(new List< std::string >());
1842  }
std::vector< std::string > __packages
The prefix used for classes and types names. It is normally the namespace of the corresponding compil...
Definition: PRMFactory.h:1040
std::vector< List< std::string > *> __namespaces
Set of all declared namespaces.
Definition: PRMFactory.h:1043

◆ retrieveClass()

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

Returns a reference over a Class<GUM_SCALAR> given its name.

This methods adds if necessary the current package as a prefix to name.

Parameters
nameThe name of the Class<GUM_SCALAR>.
Returns
the Class<GUM_SCALAR> with the given name.
Exceptions
NotFoundif no Class<GUM_SCALAR> matches the given name.

Definition at line 1889 of file PRMFactory_tpl.h.

References gum::prm::PRMFactory< GUM_SCALAR >::__retrieveClass().

Referenced by gum::prm::ClusteredLayerGenerator< GUM_SCALAR >::__generateClass(), gum::prm::LayerGenerator< GUM_SCALAR >::__generateClasses(), and gum::prm::ClusteredLayerGenerator< GUM_SCALAR >::__generateCluster().

1889  {
1890  return *__retrieveClass(name);
1891  }
PRMClass< GUM_SCALAR > * __retrieveClass(const std::string &name) const
Returns a pointer on a class given it&#39;s name. Used when building models, meaning that the class name ...
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ retrieveCommonType()

template<typename GUM_SCALAR >
INLINE PRMType & gum::prm::PRMFactory< GUM_SCALAR >::retrieveCommonType ( const std::vector< PRMClassElement< GUM_SCALAR > * > &  elts)

Returns a pointer on the PRM<GUM_SCALAR> created by this factory.

This pointer will not be deleted when the factory is destroyed.

Returns
Returns the PRM<GUM_SCALAR> created by this factory.

Definition at line 1900 of file PRMFactory_tpl.h.

References gum::prm::PRMFactory< GUM_SCALAR >::__retrieveCommonType().

1901  {
1902  return *(__retrieveCommonType(elts));
1903  }
PRMType * __retrieveCommonType(const std::vector< PRMClassElement< GUM_SCALAR > * > &elts)
Retrieve the common PRMType of a vector of PRMClassElement<GUM_SCALAR>.
+ Here is the call graph for this function:

◆ retrieveType()

template<typename GUM_SCALAR >
INLINE PRMType & gum::prm::PRMFactory< GUM_SCALAR >::retrieveType ( const std::string &  name)

Returns a reference over a PRMType given its name.

This methods adds if necessary the current package as a prefix to name.

Parameters
nameThe name of the PRMType.
Returns
the PRMType with the given name.
Exceptions
NotFoundif no PRMType matches the given name.

Definition at line 1895 of file PRMFactory_tpl.h.

References gum::prm::PRMFactory< GUM_SCALAR >::__retrieveType().

1895  {
1896  return *__retrieveType(name);
1897  }
PRMType * __retrieveType(const std::string &name) const
Returns a pointer on a PRMType given it&#39;s name. Since the type can be given either with it&#39;s local na...
+ Here is the call graph for this function:

◆ setCPFByFloatRule()

template<typename GUM_SCALAR >
INLINE void gum::prm::PRMFactory< GUM_SCALAR >::setCPFByFloatRule ( const std::vector< std::string > &  labels,
const std::vector< float > &  values 
)
overridevirtual

Fills the CPF using a rule.

The labels vector is filled with one of each parent's labels or with a wildcard ("*"). If a wildcard is used then all values of the corresponding parents are used. The sequence of parents must be the declaration order used when adding the current attribute's parents.

Parameters
labelsThe value of each parents.
valuesThe probability values of the current attribute given the values in parenst.

Implements gum::prm::IPRMFactory.

Definition at line 393 of file PRMFactory_tpl.h.

References GUM_ERROR.

395  {
396  auto a = static_cast< PRMAttribute< GUM_SCALAR >* >(
398 
399  if ((parents.size() + 1) != a->cpf().variablesSequence().size()) {
400  GUM_ERROR(OperationNotAllowed, "wrong number of parents");
401  }
402 
403  if (values.size() != a->type().variable().domainSize()) {
404  GUM_ERROR(OperationNotAllowed, "wrong number of values");
405  }
406 
407  std::vector< GUM_SCALAR > values2(values.begin(), values.end());
408  setCPFByRule(parents, values2);
409  }
virtual void setCPFByRule(const std::vector< std::string > &labels, const std::vector< GUM_SCALAR > &values)
Fills the CPF using a rule.
PRMObject * __checkStack(Idx i, PRMObject::prm_type obj_type)
Return a pointer on a PRMObject at __stack.size() - i position after checking the type of the object ...
#define GUM_ERROR(type, msg)
Definition: exceptions.h:52

◆ setCPFByRule() [1/2]

template<typename GUM_SCALAR >
INLINE void gum::prm::PRMFactory< GUM_SCALAR >::setCPFByRule ( const std::vector< std::string > &  labels,
const std::vector< GUM_SCALAR > &  values 
)
virtual

Fills the CPF using a rule.

The labels vector is filled with one of each parent's labels or with a wildcard ("*"). If a wildcard is used then all values of the corresponding parents are used. The sequence of parents must be the declaration order used when adding the current attribute's parents.

Parameters
labelsThe value of each parents.
valuesThe probability values of the current attribute given the values in parents.

Definition at line 412 of file PRMFactory_tpl.h.

References gum::Instantiation::chgVal(), gum::DiscreteVariable::domainSize(), GUM_ERROR, gum::DiscreteVariable::label(), gum::Instantiation::setVals(), and gum::to_string().

Referenced by gum::prm::o3prm::O3ClassFactory< GUM_SCALAR >::__completeAttribute().

414  {
415  auto a = static_cast< PRMAttribute< GUM_SCALAR >* >(
417 
418  if ((parents.size() + 1) != a->cpf().variablesSequence().size()) {
419  GUM_ERROR(OperationNotAllowed, "wrong number of parents");
420  }
421 
422  if (values.size() != a->type().variable().domainSize()) {
423  GUM_ERROR(OperationNotAllowed, "wrong number of values");
424  }
425 
426  if (dynamic_cast< PRMFormAttribute< GUM_SCALAR >* >(a)) {
427  auto form = static_cast< PRMFormAttribute< GUM_SCALAR >* >(a);
428  // jnst holds parents with a specific value (not "*")
429  // knst holds parents without a specific value ("*")
430  Instantiation jnst, knst;
431  const DiscreteVariable* var = 0;
432  // not_used Size pos = 0;
433  bool found = false;
434 
435  for (Idx i = 0; i < parents.size(); ++i) {
436  var = form->formulas().variablesSequence().atPos(1 + i);
437 
438  if (parents[i] == "*") {
439  knst.add(*var);
440  } else {
441  jnst.add(*var);
442  // not_used pos = 0;
443  found = false;
444 
445  for (Size j = 0; j < var->domainSize(); ++j) {
446  if (var->label(j) == parents[i]) {
447  jnst.chgVal(*var, j);
448  found = true;
449  break;
450  }
451  }
452 
453  if (!found) {
454  std::string msg = "could not find label ";
455  GUM_ERROR(NotFound, msg + parents[i]);
456  }
457  }
458  }
459 
460  Instantiation inst(form->formulas());
461  inst.setVals(jnst);
462 
463  for (Size i = 0; i < form->type()->domainSize(); ++i) {
464  inst.chgVal(form->type().variable(), i);
465 
466  for (inst.setFirstIn(knst); !inst.end(); inst.incIn(knst)) {
467  form->formulas().set(inst, std::to_string(values[i]));
468  }
469  }
470 
471  } else {
472  GUM_ERROR(OperationNotAllowed, "invalide attribute type");
473  }
474  }
std::string to_string(const Formula &f)
Definition: formula_inl.h:479
PRMObject * __checkStack(Idx i, PRMObject::prm_type obj_type)
Return a pointer on a PRMObject at __stack.size() - i position after checking the type of the object ...
std::size_t Size
In aGrUM, hashed values are unsigned long int.
Definition: types.h:45
#define GUM_ERROR(type, msg)
Definition: exceptions.h:52
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ setCPFByRule() [2/2]

template<typename GUM_SCALAR >
INLINE void gum::prm::PRMFactory< GUM_SCALAR >::setCPFByRule ( const std::vector< std::string > &  labels,
const std::vector< std::string > &  values 
)
overridevirtual

Fills the CPF using a rule and gum::Formula.

The labels vector is filled with one of each parent's labels or with a wildcard ("*"). If a wildcard is used then all values of the corresponding parents are used. The sequence of parents must be the declaration order used when adding the current attribute's parents.

Parameters
labelsThe value of each parents.
valuesThe probability values of the current attribute given the values in parents.

Implements gum::prm::IPRMFactory.

Definition at line 477 of file PRMFactory_tpl.h.

References gum::Instantiation::chgVal(), gum::DiscreteVariable::domainSize(), GUM_ERROR, gum::DiscreteVariable::label(), and gum::Instantiation::setVals().

479  {
480  auto a = static_cast< PRMAttribute< GUM_SCALAR >* >(
482 
483  if ((parents.size() + 1) != a->cpf().variablesSequence().size()) {
484  GUM_ERROR(OperationNotAllowed, "wrong number of parents");
485  }
486 
487  if (values.size() != a->type().variable().domainSize()) {
488  GUM_ERROR(OperationNotAllowed, "wrong number of values");
489  }
490 
491  if (dynamic_cast< PRMFormAttribute< GUM_SCALAR >* >(a)) {
492  auto form = static_cast< PRMFormAttribute< GUM_SCALAR >* >(a);
493  // jnst holds parents with a specific value (not "*")
494  // knst holds parents without a specific value ("*")
495  Instantiation jnst, knst;
496  const DiscreteVariable* var = 0;
497  // not_used Size pos = 0;
498  bool found = false;
499 
500  for (Idx i = 0; i < parents.size(); ++i) {
501  var = form->formulas().variablesSequence().atPos(1 + i);
502 
503  if (parents[i] == "*") {
504  knst.add(*var);
505  } else {
506  jnst.add(*var);
507  // not_used pos = 0;
508  found = false;
509 
510  for (Size j = 0; j < var->domainSize(); ++j) {
511  if (var->label(j) == parents[i]) {
512  jnst.chgVal(*var, j);
513  found = true;
514  break;
515  }
516  }
517 
518  if (!found) {
519  std::string msg = "could not find label ";
520  GUM_ERROR(NotFound, msg + parents[i]);
521  }
522  }
523  }
524 
525  Instantiation inst(form->formulas());
526  inst.setVals(jnst);
527 
528  for (Size i = 0; i < form->type()->domainSize(); ++i) {
529  inst.chgVal(form->type().variable(), i);
530 
531  for (inst.setFirstIn(knst); !inst.end(); inst.incIn(knst)) {
532  form->formulas().set(inst, values[i]);
533  }
534  }
535 
536  } else {
537  GUM_ERROR(OperationNotAllowed, "invalide attribute type");
538  }
539  }
PRMObject * __checkStack(Idx i, PRMObject::prm_type obj_type)
Return a pointer on a PRMObject at __stack.size() - i position after checking the type of the object ...
std::size_t Size
In aGrUM, hashed values are unsigned long int.
Definition: types.h:45
#define GUM_ERROR(type, msg)
Definition: exceptions.h:52
+ Here is the call graph for this function:

◆ setRawCPFByColumns() [1/2]

template<typename GUM_SCALAR >
INLINE void gum::prm::PRMFactory< GUM_SCALAR >::setRawCPFByColumns ( const std::vector< GUM_SCALAR > &  array)

Gives the factory the CPF in its raw form.

The creation of the CPF is left to the factory because we do not know what level of complexity for CPF implementation can be handled by the PRM<GUM_SCALAR> implementation.

How to fill a CPT? If you want to fill the CPT of P(A|B,C) with A, B and C boolean variables ( {f, t}, the order is important), then the following array is valid:

//P(A|f,f),P(A|f,t),P(A|t,f),P(A|t,t)
[ 0.2, 0.7, 0.5, 0.01,
0.8, 0.3, 0.5, 0.99]

See PRMFactory::setRawCPFByLines() for more details.

Exceptions
OperationNotAllowedRaised if the given operation is illegal.

Definition at line 360 of file PRMFactory_tpl.h.

References gum::Instantiation::add(), gum::prm::PRMAttribute< GUM_SCALAR >::cpf(), and GUM_ERROR.

Referenced by gum::prm::o3prm::O3ClassFactory< GUM_SCALAR >::__completeAttribute().

361  {
362  PRMAttribute< GUM_SCALAR >* a = static_cast< PRMAttribute< GUM_SCALAR >* >(
364 
365  if (a->cpf().domainSize() != array.size()) {
366  GUM_ERROR(OperationNotAllowed, "illegal CPF size");
367  }
368 
369  if (a->cpf().nbrDim() == 1) {
370  setRawCPFByLines(array);
371 
372  } else {
373  Instantiation inst(a->cpf());
374  Instantiation jnst;
375  for (auto idx = inst.variablesSequence().rbegin();
376  idx != inst.variablesSequence().rend();
377  --idx) {
378  jnst.add(**idx);
379  }
380 
381  jnst.setFirst();
382  auto idx = (std::size_t)0;
383  while ((!jnst.end()) && idx < array.size()) {
384  inst.setVals(jnst);
385  a->cpf().set(inst, array[idx]);
386  jnst.inc();
387  ++idx;
388  }
389  }
390  }
void setRawCPFByLines(const std::vector< GUM_SCALAR > &array)
Gives the factory the CPF in its raw form.
PRMObject * __checkStack(Idx i, PRMObject::prm_type obj_type)
Return a pointer on a PRMObject at __stack.size() - i position after checking the type of the object ...
#define GUM_ERROR(type, msg)
Definition: exceptions.h:52
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ setRawCPFByColumns() [2/2]

template<typename GUM_SCALAR >
INLINE void gum::prm::PRMFactory< GUM_SCALAR >::setRawCPFByColumns ( const std::vector< std::string > &  array)
overridevirtual

Gives the factory the CPF in its raw form use gum::Formula.

The creation of the CPF is left to the factory because we do not know what level of complexity for CPF implementation can be handled by the PRM<GUM_SCALAR> implementation.

How to fill a CPT? If you want to fill the CPT of P(A|B,C) with A, B and C boolean variables ( {f, t}, the order is important), then the following array is valid:

//P(A|f,f),P(A|f,t),P(A|t,f),P(A|t,t)
[ 0.2, 0.7, 0.5, 0.01,
0.8, 0.3, 0.5, 0.99]

See PRMFactory::setRawCPFByLines() for more details.

Exceptions
OperationNotAllowedRaised if the given operation is illegal.

Implements gum::prm::IPRMFactory.

Definition at line 1935 of file PRMFactory_tpl.h.

References gum::prm::PRMFactory< GUM_SCALAR >::__checkStack(), gum::Instantiation::add(), gum::prm::PRMObject::CLASS, GUM_ERROR, and gum::prm::PRMFactory< GUM_SCALAR >::setRawCPFByLines().

1936  {
1938 
1939  auto a = static_cast< PRMFormAttribute< GUM_SCALAR >* >(
1941 
1942  if (a->formulas().domainSize() != array.size()) {
1943  GUM_ERROR(OperationNotAllowed, "illegal CPF size");
1944  }
1945 
1946  if (a->formulas().nbrDim() == 1) {
1947  setRawCPFByLines(array);
1948 
1949  } else {
1950  Instantiation inst(a->formulas());
1951  Instantiation jnst;
1952  for (auto idx = inst.variablesSequence().rbegin();
1953  idx != inst.variablesSequence().rend();
1954  --idx) {
1955  jnst.add(**idx);
1956  }
1957 
1958  jnst.setFirst();
1959  auto idx = (std::size_t)0;
1960  while ((!jnst.end()) && idx < array.size()) {
1961  inst.setVals(jnst);
1962  a->formulas().set(inst, array[idx]);
1963  jnst.inc();
1964  ++idx;
1965  }
1966 
1967  // Generate cpf by calling it
1968  a->cpf();
1969  }
1970  }
void setRawCPFByLines(const std::vector< GUM_SCALAR > &array)
Gives the factory the CPF in its raw form.
PRMObject * __checkStack(Idx i, PRMObject::prm_type obj_type)
Return a pointer on a PRMObject at __stack.size() - i position after checking the type of the object ...
#define GUM_ERROR(type, msg)
Definition: exceptions.h:52
+ Here is the call graph for this function:

◆ setRawCPFByFloatColumns()

template<typename GUM_SCALAR >
INLINE void gum::prm::PRMFactory< GUM_SCALAR >::setRawCPFByFloatColumns ( const std::vector< float > &  array)
overridevirtual

Gives the factory the CPF in its raw form.

The creation of the CPF is left to the factory because we do not know what level of complexity for CPF implementation can be handled by the PRM<GUM_SCALAR> implementation.

How to fill a CPT? If you want to fill the CPT of P(A|B,C) with A, B and C boolean variables ( {f, t}, the order is important), then the following array is valid:

//P(A|f,f),P(A|f,t),P(A|t,f),P(A|t,t)
[ 0.2, 0.7, 0.5, 0.01,
0.8, 0.3, 0.5, 0.99]

See PRMFactory::setRawCPFByLines() for more details.

Exceptions
OperationNotAllowedRaised if the given operation is illegal.

Implements gum::prm::IPRMFactory.

Definition at line 346 of file PRMFactory_tpl.h.

References gum::prm::PRMAttribute< GUM_SCALAR >::cpf(), and GUM_ERROR.

347  {
348  PRMAttribute< GUM_SCALAR >* a = static_cast< PRMAttribute< GUM_SCALAR >* >(
350 
351  if (a->cpf().domainSize() != array.size()) {
352  GUM_ERROR(OperationNotAllowed, "illegal CPF size");
353  }
354 
355  std::vector< GUM_SCALAR > array2(array.begin(), array.end());
356  setRawCPFByColumns(array2);
357  }
void setRawCPFByColumns(const std::vector< GUM_SCALAR > &array)
Gives the factory the CPF in its raw form.
PRMObject * __checkStack(Idx i, PRMObject::prm_type obj_type)
Return a pointer on a PRMObject at __stack.size() - i position after checking the type of the object ...
#define GUM_ERROR(type, msg)
Definition: exceptions.h:52
+ Here is the call graph for this function:

◆ setRawCPFByFloatLines()

template<typename GUM_SCALAR >
INLINE void gum::prm::PRMFactory< GUM_SCALAR >::setRawCPFByFloatLines ( const std::vector< float > &  array)
overridevirtual

Gives the factory the CPF in its raw form.

The creation of the CPF is left to the factory because we do not know what level of complexity for CPF implementation can be handled by the PRM<GUM_SCALAR> implementation.

How to fill a CPT? If you want to fill the CPT of P(A|B,C) with A, B and C boolean variables ( {f, t}, the order is important), then the following array is valid:

[0.20, 0.80, // P(f|f, f) = 0.20 and P(t|f, f) = 0.80
0.50, 0.50, // P(f|t, f) = 0.50 and P(t|t, f) = 0.50
0.70, 0.30, // P(f|f, t) = 0.70 and P(t|f, t) = 0.30
0.01, 0.99] // P(f|t, t) = 0.01 and P(t|t, t) = 0.99
Exceptions
OperationNotAllowedRaised if the given operation is illegal.

Implements gum::prm::IPRMFactory.

Definition at line 318 of file PRMFactory_tpl.h.

References gum::prm::PRMObject::CLASS, gum::prm::PRMAttribute< GUM_SCALAR >::cpf(), and GUM_ERROR.

319  {
320  PRMAttribute< GUM_SCALAR >* a = static_cast< PRMAttribute< GUM_SCALAR >* >(
323 
324  if (a->cpf().domainSize() != array.size())
325  GUM_ERROR(OperationNotAllowed, "illegal CPF size");
326 
327  std::vector< GUM_SCALAR > array2(array.begin(), array.end());
328  a->cpf().fillWith(array2);
329  }
PRMObject * __checkStack(Idx i, PRMObject::prm_type obj_type)
Return a pointer on a PRMObject at __stack.size() - i position after checking the type of the object ...
#define GUM_ERROR(type, msg)
Definition: exceptions.h:52
+ Here is the call graph for this function:

◆ setRawCPFByLines() [1/2]

template<typename GUM_SCALAR >
INLINE void gum::prm::PRMFactory< GUM_SCALAR >::setRawCPFByLines ( const std::vector< GUM_SCALAR > &  array)

Gives the factory the CPF in its raw form.

The creation of the CPF is left to the factory because we do not know what level of complexity for CPF implementation can be handled by the PRM<GUM_SCALAR> implementation.

How to fill a CPT? If you want to fill the CPT of P(A|B,C) with A, B and C boolean variables ( {f, t}, the order is important), then the following array is valid:

[0.20, 0.80, // P(f|f, f) = 0.20 and P(t|f, f) = 0.80
0.50, 0.50, // P(f|t, f) = 0.50 and P(t|t, f) = 0.50
0.70, 0.30, // P(f|f, t) = 0.70 and P(t|f, t) = 0.30
0.01, 0.99] // P(f|t, t) = 0.01 and P(t|t, t) = 0.99
Exceptions
OperationNotAllowedRaised if the given operation is illegal.

Definition at line 332 of file PRMFactory_tpl.h.

References gum::prm::PRMObject::CLASS, and GUM_ERROR.

Referenced by gum::prm::ClusteredLayerGenerator< GUM_SCALAR >::__generateClass(), gum::prm::LayerGenerator< GUM_SCALAR >::__generateClasses(), gum::prm::ClusteredLayerGenerator< GUM_SCALAR >::__generateCluster(), and gum::prm::PRMFactory< GUM_SCALAR >::setRawCPFByColumns().

333  {
335  auto a = static_cast< PRMAttribute< GUM_SCALAR >* >(elt);
337 
338  if (a->cpf().domainSize() != array.size()) {
339  GUM_ERROR(OperationNotAllowed, "illegal CPF size");
340  }
341 
342  a->cpf().fillWith(array);
343  }
PRMObject * __checkStack(Idx i, PRMObject::prm_type obj_type)
Return a pointer on a PRMObject at __stack.size() - i position after checking the type of the object ...
#define GUM_ERROR(type, msg)
Definition: exceptions.h:52
+ Here is the caller graph for this function:

◆ setRawCPFByLines() [2/2]

template<typename GUM_SCALAR >
INLINE void gum::prm::PRMFactory< GUM_SCALAR >::setRawCPFByLines ( const std::vector< std::string > &  array)
overridevirtual

Gives the factory the CPF in its raw form using gum::Formula.

The creation of the CPF is left to the factory because we do not know what level of complexity for CPF implementation can be handled by the PRM<GUM_SCALAR> implementation.

How to fill a CPT? If you want to fill the CPT of P(A|B,C) with A, B and C boolean variables ( {f, t}, the order is important), then the following array is valid:

[0.20, 0.80, // P(f|f, f) = 0.20 and P(t|f, f) = 0.80
0.50, 0.50, // P(f|t, f) = 0.50 and P(t|t, f) = 0.50
0.70, 0.30, // P(f|f, t) = 0.70 and P(t|f, t) = 0.30
0.01, 0.99] // P(f|t, t) = 0.01 and P(t|t, t) = 0.99
Exceptions
OperationNotAllowedRaised if the given operation is illegal.

Implements gum::prm::IPRMFactory.

Definition at line 1973 of file PRMFactory_tpl.h.

References gum::prm::PRMFactory< GUM_SCALAR >::__checkStack(), gum::prm::PRMObject::CLASS, and GUM_ERROR.

1974  {
1976 
1977  auto a = static_cast< PRMFormAttribute< GUM_SCALAR >* >(
1979 
1980  if (a->formulas().domainSize() != array.size()) {
1981  GUM_ERROR(OperationNotAllowed, "illegal CPF size");
1982  }
1983 
1984  a->formulas().populate(array);
1985 
1987  a->cpf();
1988  }
PRMObject * __checkStack(Idx i, PRMObject::prm_type obj_type)
Return a pointer on a PRMObject at __stack.size() - i position after checking the type of the object ...
#define GUM_ERROR(type, msg)
Definition: exceptions.h:52
+ Here is the call graph for this function:

◆ setReferenceSlot() [1/2]

template<typename GUM_SCALAR >
INLINE void gum::prm::PRMFactory< GUM_SCALAR >::setReferenceSlot ( const std::string &  left_instance,
const std::string &  left_reference,
const std::string &  right_instance 
)
overridevirtual

Instantiate a reference in the current model.

This is equivalent to the following SKOOL instruction: left_instance.left_reference = right_instance;

right_instance's type must be compatible with the slot type of left_reference.

Parameters
left_instanceThe name of an instance in the model.
left_referenceThe name of a reference of left_instance.
right_instanceThe name of an instance or an array of instances in the model.

Implements gum::prm::IPRMFactory.

Definition at line 910 of file PRMFactory_tpl.h.

References GUM_ERROR, and gum::prm::PRMObject::SYSTEM.

Referenced by gum::prm::o3prm::O3SystemFactory< GUM_SCALAR >::__addAssignments(), gum::prm::o3prm::O3SystemFactory< GUM_SCALAR >::__addIncrements(), gum::prm::LayerGenerator< GUM_SCALAR >::__generateSystem(), gum::prm::ClusteredLayerGenerator< GUM_SCALAR >::__generateSystem(), and gum::prm::PRMFactory< GUM_SCALAR >::setReferenceSlot().

911  {
912  auto model = static_cast< PRMSystem< GUM_SCALAR >* >(
914  std::vector< PRMInstance< GUM_SCALAR >* > lefts;
915  std::vector< PRMInstance< GUM_SCALAR >* > rights;
916 
917  if (model->isInstance(l_i)) {
918  lefts.push_back(&(model->get(l_i)));
919  } else if (model->isArray(l_i)) {
920  for (const auto& elt : model->getArray(l_i))
921  lefts.push_back(elt);
922  } else {
923  GUM_ERROR(NotFound, "left value does not name an instance or an array");
924  }
925 
926  if (model->isInstance(r_i)) {
927  rights.push_back(&(model->get(r_i)));
928  } else if (model->isArray(r_i)) {
929  for (const auto& elt : model->getArray(r_i))
930  rights.push_back(elt);
931  } else {
932  GUM_ERROR(NotFound, "left value does not name an instance or an array");
933  }
934 
935  for (const auto l : lefts) {
936  for (const auto r : rights) {
937  auto& elt = l->type().get(l_ref);
939  l->add(elt.id(), *r);
940 
941  } else {
942  GUM_ERROR(NotFound, "unfound reference slot");
943  }
944  }
945  }
946  }
static INLINE bool isReferenceSlot(const PRMClassElement< GUM_SCALAR > &elt)
Returns true if obj_ptr is of type PRMReferenceSlot.
PRMObject * __checkStack(Idx i, PRMObject::prm_type obj_type)
Return a pointer on a PRMObject at __stack.size() - i position after checking the type of the object ...
#define GUM_ERROR(type, msg)
Definition: exceptions.h:52
+ Here is the caller graph for this function:

◆ setReferenceSlot() [2/2]

template<typename GUM_SCALAR >
INLINE void gum::prm::PRMFactory< GUM_SCALAR >::setReferenceSlot ( const std::string &  l_i,
const std::string &  r_i 
)
overridevirtual

Instantiate a reference in the current model.

This is equivalent to the following SKOOL instruction: left_instance.left_reference = right_instance;

right_instance's type must be compatible with the slot type of left_reference.

Parameters
l_iA slot chain starting from an instance and ending over a reference slot.
r_iThe name of an instance or an array of instances in the model.

Implements gum::prm::IPRMFactory.

Definition at line 1875 of file PRMFactory_tpl.h.

References GUM_ERROR, and gum::prm::PRMFactory< GUM_SCALAR >::setReferenceSlot().

1876  {
1877  size_t pos = l_i.find_last_of('.');
1878 
1879  if (pos != std::string::npos) {
1880  std::string l_ref = l_i.substr(pos + 1, std::string::npos);
1881  setReferenceSlot(l_i.substr(0, pos), l_ref, r_i);
1882  } else {
1883  GUM_ERROR(NotFound, "left value does not name an instance or an array");
1884  }
1885  }
virtual void setReferenceSlot(const std::string &left_instance, const std::string &left_reference, const std::string &right_instance) override
Instantiate a reference in the current model.
#define GUM_ERROR(type, msg)
Definition: exceptions.h:52
+ Here is the call graph for this function:

◆ startAggregator()

template<typename GUM_SCALAR >
INLINE void gum::prm::PRMFactory< GUM_SCALAR >::startAggregator ( const std::string &  name,
const std::string &  agg_type,
const std::string &  rv_type,
const std::vector< std::string > &  params 
)

Start an aggregator declaration.

Parameters
nameThe aggregator's name.
agg_typeThe aggregtor's type (
See also
Aggregate::agg_type()).
Parameters
rv_typeThe aggregator's random variable type (
See also
Aggregate::type()).
Parameters
paramsThe aggregator's parameters.

Definition at line 567 of file PRMFactory_tpl.h.

References gum::prm::PRMClass< GUM_SCALAR >::add(), gum::prm::PRMObject::CLASS, GUM_ERROR, gum::prm::PRMClass< GUM_SCALAR >::overload(), and gum::prm::PRMAggregate< GUM_SCALAR >::str2enum().

Referenced by gum::prm::o3prm::O3ClassFactory< GUM_SCALAR >::__declareAggregates().

571  {
572  PRMClass< GUM_SCALAR >* c = static_cast< PRMClass< GUM_SCALAR >* >(
574 
575  auto agg = new PRMAggregate< GUM_SCALAR >(
576  name,
578  *__retrieveType(rv_type));
579 
580  try {
581  c->add(agg);
582  } catch (DuplicateElement&) { c->overload(agg); }
583 
584  switch (agg->agg_type()) {
588  if (params.size() != 1) {
589  GUM_ERROR(OperationNotAllowed, "aggregate requires a parameter");
590  }
591  agg->setLabel(params.front());
592  break;
593  }
594  default: {
595  // Nothing to do
596  }
597  }
598  __stack.push_back(agg);
599  }
std::vector< PRMObject *> __stack
A stack used to keep track of created PRMObject.
Definition: PRMFactory.h:1049
static AggregateType str2enum(const std::string &str)
Static method which returns the AggregateType given its string representation.
Definition: PRMAggregate.h:97
PRMType * __retrieveType(const std::string &name) const
Returns a pointer on a PRMType given it&#39;s name. Since the type can be given either with it&#39;s local na...
PRMObject * __checkStack(Idx i, PRMObject::prm_type obj_type)
Return a pointer on a PRMObject at __stack.size() - i position after checking the type of the object ...
#define GUM_ERROR(type, msg)
Definition: exceptions.h:52
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ startAttribute()

template<typename GUM_SCALAR >
INLINE void gum::prm::PRMFactory< GUM_SCALAR >::startAttribute ( const std::string &  type,
const std::string &  name,
bool  scalar_atttr = false 
)
overridevirtual

Tells the factory that we start an attribute declaration.

Exceptions
FatalErrorRaised if the given operation is illegal.

Implements gum::prm::IPRMFactory.

Definition at line 1586 of file PRMFactory_tpl.h.

References gum::prm::PRMFactory< GUM_SCALAR >::__checkStackContainter(), gum::prm::PRMFactory< GUM_SCALAR >::__retrieveType(), gum::prm::PRMFactory< GUM_SCALAR >::__stack, gum::prm::PRMClassElementContainer< GUM_SCALAR >::add(), gum::prm::PRMClassElementContainer< GUM_SCALAR >::exists(), gum::prm::PRMClassElement< GUM_SCALAR >::id(), gum::prm::PRMObject::isClass(), and gum::prm::PRMClassElementContainer< GUM_SCALAR >::overload().

Referenced by gum::prm::o3prm::O3ClassFactory< GUM_SCALAR >::__declareAttribute(), gum::prm::ClusteredLayerGenerator< GUM_SCALAR >::__generateClass(), gum::prm::LayerGenerator< GUM_SCALAR >::__generateClasses(), gum::prm::ClusteredLayerGenerator< GUM_SCALAR >::__generateCluster(), and gum::prm::PRMFactory< GUM_SCALAR >::addAttribute().

1588  {
1589  PRMClassElementContainer< GUM_SCALAR >* c = __checkStackContainter(1);
1590  PRMAttribute< GUM_SCALAR >* a = nullptr;
1591 
1592  if (PRMObject::isClass(*c) && (!scalar_attr)) {
1593  a = new PRMFormAttribute< GUM_SCALAR >(
1594  static_cast< PRMClass< GUM_SCALAR >& >(*c),
1595  name,
1596  *__retrieveType(type));
1597 
1598  } else {
1599  a = new PRMScalarAttribute< GUM_SCALAR >(name, *__retrieveType(type));
1600  }
1601 
1602  std::string dot = ".";
1603 
1604  try {
1605  try {
1606  c->add(a);
1607  } catch (DuplicateElement&) { c->overload(a); }
1608  } catch (Exception&) {
1609  if (a != nullptr && (!c->exists(a->id()))) { delete a; }
1610  }
1611 
1612  __stack.push_back(a);
1613  }
std::vector< PRMObject *> __stack
A stack used to keep track of created PRMObject.
Definition: PRMFactory.h:1049
static INLINE bool isClass(const PRMObject &obj)
Returns true if obj_ptr is of type Class.
Definition: PRMObject.h:99
PRMType * __retrieveType(const std::string &name) const
Returns a pointer on a PRMType given it&#39;s name. Since the type can be given either with it&#39;s local na...
PRMClassElementContainer< GUM_SCALAR > * __checkStackContainter(Idx i)
Adds __prefix to str iff __prefix != "".
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ startClass()

template<typename GUM_SCALAR >
INLINE void gum::prm::PRMFactory< GUM_SCALAR >::startClass ( const std::string &  c,
const std::string &  ext = "",
const Set< std::string > *  implements = nullptr,
bool  delayInheritance = false 
)
overridevirtual

Tells the factory that we start a class declaration.

Use the default values if you do not want c to be a subclass or to implement interfaces.

Parameters
cThe class name.
extThe name of the super class of c.
implementsThe list of interface implemented by c.
delayInheritanceIf true, the created gum::prm::Class inheritance will be delayed.
Exceptions
OperationNotAllowedRaised if the given operation is illegal.

Implements gum::prm::IPRMFactory.

Definition at line 45 of file PRMFactory_tpl.h.

References gum::Set< Key, Alloc >::empty(), GUM_ERROR, gum::Set< Key, Alloc >::insert(), and gum::prm::PRMObject::name().

Referenced by gum::prm::ClusteredLayerGenerator< GUM_SCALAR >::__generateClass(), gum::prm::LayerGenerator< GUM_SCALAR >::__generateClasses(), gum::prm::ClusteredLayerGenerator< GUM_SCALAR >::__generateCluster(), gum::prm::PRMFactory< GUM_SCALAR >::addInstance(), and gum::prm::o3prm::O3ClassFactory< GUM_SCALAR >::buildClasses().

48  {
49  std::string real_name = __addPrefix(name);
50  if (__prm->__classMap.exists(real_name)
51  || __prm->__interfaceMap.exists(real_name)) {
52  GUM_ERROR(DuplicateElement, "'" << real_name << "' is already used.");
53  }
54  PRMClass< GUM_SCALAR >* c = nullptr;
55  PRMClass< GUM_SCALAR >* mother = nullptr;
56  Set< PRMInterface< GUM_SCALAR >* > impl;
57 
58  if (implements != 0) {
59  for (const auto& imp : *implements) {
60  impl.insert(__retrieveInterface(imp));
61  }
62  }
63 
64  if (extends != "") { mother = __retrieveClass(extends); }
65 
66  if ((extends == "") && impl.empty()) {
67  c = new PRMClass< GUM_SCALAR >(real_name);
68  } else if ((extends != "") && impl.empty()) {
69  c = new PRMClass< GUM_SCALAR >(real_name, *mother, delayInheritance);
70  } else if ((extends == "") && (!impl.empty())) {
71  c = new PRMClass< GUM_SCALAR >(real_name, impl, delayInheritance);
72  } else if ((extends != "") && (!impl.empty())) {
73  c = new PRMClass< GUM_SCALAR >(real_name, *mother, impl, delayInheritance);
74  }
75 
76  __prm->__classMap.insert(c->name(), c);
77  __prm->__classes.insert(c);
78  __stack.push_back(c);
79  }
PRM< GUM_SCALAR > * __prm
The pointer on the PRM<GUM_SCALAR> built by this factory.
Definition: PRMFactory.h:1046
std::vector< PRMObject *> __stack
A stack used to keep track of created PRMObject.
Definition: PRMFactory.h:1049
std::string __addPrefix(const std::string &str) const
Adds __prefix to str iff __prefix != "".
PRMClass< GUM_SCALAR > * __retrieveClass(const std::string &name) const
Returns a pointer on a class given it&#39;s name. Used when building models, meaning that the class name ...
PRMInterface< GUM_SCALAR > * __retrieveInterface(const std::string &name) const
Returns a pointer on an interface given it&#39;s name. Used when building models, meaning that the interf...
#define GUM_ERROR(type, msg)
Definition: exceptions.h:52
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ startDiscreteType()

template<typename GUM_SCALAR >
INLINE void gum::prm::PRMFactory< GUM_SCALAR >::startDiscreteType ( const std::string &  name,
std::string  super = "" 
)
overridevirtual

Start a discrete subtype declaration.

Parameters
nameThe discrete type's name.
superThe super type of the declared discrete type.
Exceptions
DuplicateElementRaised if an object with the same name already exists.

Implements gum::prm::IPRMFactory.

Definition at line 1413 of file PRMFactory_tpl.h.

References gum::prm::PRMFactory< GUM_SCALAR >::__addPrefix(), gum::prm::PRMFactory< GUM_SCALAR >::__prm, gum::prm::PRMFactory< GUM_SCALAR >::__retrieveType(), gum::prm::PRMFactory< GUM_SCALAR >::__stack, and GUM_ERROR.

Referenced by gum::prm::o3prm::O3TypeFactory< GUM_SCALAR >::__buildTypes(), gum::prm::ClusteredLayerGenerator< GUM_SCALAR >::__generateType(), and gum::prm::LayerGenerator< GUM_SCALAR >::__generateType().

1414  {
1415  std::string real_name = __addPrefix(name);
1416  if (__prm->__typeMap.exists(real_name)) {
1417  GUM_ERROR(DuplicateElement, "'" << real_name << "' is already used.");
1418  }
1419  if (super == "") {
1420  auto t = new PRMType(LabelizedVariable(real_name, "", 0));
1421  __stack.push_back(t);
1422  } else {
1423  auto t = new PRMType(LabelizedVariable(real_name, "", 0));
1424  t->__superType = __retrieveType(super);
1425  t->__label_map = new std::vector< Idx >();
1426  __stack.push_back(t);
1427  }
1428  }
PRM< GUM_SCALAR > * __prm
The pointer on the PRM<GUM_SCALAR> built by this factory.
Definition: PRMFactory.h:1046
std::vector< PRMObject *> __stack
A stack used to keep track of created PRMObject.
Definition: PRMFactory.h:1049
PRMType * __retrieveType(const std::string &name) const
Returns a pointer on a PRMType given it&#39;s name. Since the type can be given either with it&#39;s local na...
std::string __addPrefix(const std::string &str) const
Adds __prefix to str iff __prefix != "".
#define GUM_ERROR(type, msg)
Definition: exceptions.h:52
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ startDiscretizedType()

template<typename GUM_SCALAR >
INLINE void gum::prm::PRMFactory< GUM_SCALAR >::startDiscretizedType ( const std::string &  name)
overridevirtual

Start a discretized type declaration.

Parameters
nameThe discretized type's name.
Exceptions
DuplicateElementRaised if an object with the same name already exists.

Implements gum::prm::IPRMFactory.

Definition at line 1503 of file PRMFactory_tpl.h.

References gum::prm::PRMFactory< GUM_SCALAR >::__addPrefix(), gum::prm::PRMFactory< GUM_SCALAR >::__prm, gum::prm::PRMFactory< GUM_SCALAR >::__stack, and GUM_ERROR.

Referenced by gum::prm::o3prm::O3TypeFactory< GUM_SCALAR >::__buildRealTypes().

1503  {
1504  std::string real_name = __addPrefix(name);
1505  if (__prm->__typeMap.exists(real_name)) {
1506  GUM_ERROR(DuplicateElement, "'" << real_name << "' is already used.");
1507  }
1508  auto var = DiscretizedVariable< double >(real_name, "");
1509  auto t = new PRMType(var);
1510  __stack.push_back(t);
1511  }
PRM< GUM_SCALAR > * __prm
The pointer on the PRM<GUM_SCALAR> built by this factory.
Definition: PRMFactory.h:1046
std::vector< PRMObject *> __stack
A stack used to keep track of created PRMObject.
Definition: PRMFactory.h:1049
std::string __addPrefix(const std::string &str) const
Adds __prefix to str iff __prefix != "".
#define GUM_ERROR(type, msg)
Definition: exceptions.h:52
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ startInterface()

template<typename GUM_SCALAR >
INLINE void gum::prm::PRMFactory< GUM_SCALAR >::startInterface ( const std::string &  i,
const std::string &  ext = "",
bool  delayInheritance = false 
)
overridevirtual

Tells the factory that we start an interface declaration.

Use the default values if you do not want c to be a subclass or to implement interfaces.

Parameters
iThe interface name.
extThe name of the super interface of i.
delayInheritanceIf true, the created gum::prm::PRMInterface inheritance will be delayed.
Exceptions
NotFoundRaised if ext does not match any declared PRMInterface<GUM_SCALAR>.

Implements gum::prm::IPRMFactory.

Definition at line 184 of file PRMFactory_tpl.h.

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

Referenced by gum::prm::ClusteredLayerGenerator< GUM_SCALAR >::__generateInterfaces(), gum::prm::LayerGenerator< GUM_SCALAR >::__generateInterfaces(), and gum::prm::o3prm::O3InterfaceFactory< GUM_SCALAR >::buildInterfaces().

186  {
187  std::string real_name = __addPrefix(name);
188  if (__prm->__classMap.exists(real_name)
189  || __prm->__interfaceMap.exists(real_name)) {
190  GUM_ERROR(DuplicateElement, "'" << real_name << "' is already used.");
191  }
192  PRMInterface< GUM_SCALAR >* i = nullptr;
193  PRMInterface< GUM_SCALAR >* super = nullptr;
194 
195  if (extends != "") { super = __retrieveInterface(extends); }
196 
197  if (super != nullptr) {
198  i = new PRMInterface< GUM_SCALAR >(real_name, *super, delayInheritance);
199  } else {
200  i = new PRMInterface< GUM_SCALAR >(real_name);
201  }
202 
203  __prm->__interfaceMap.insert(i->name(), i);
204  __prm->__interfaces.insert(i);
205  __stack.push_back(i);
206  }
PRM< GUM_SCALAR > * __prm
The pointer on the PRM<GUM_SCALAR> built by this factory.
Definition: PRMFactory.h:1046
std::vector< PRMObject *> __stack
A stack used to keep track of created PRMObject.
Definition: PRMFactory.h:1049
std::string __addPrefix(const std::string &str) const
Adds __prefix to str iff __prefix != "".
PRMInterface< GUM_SCALAR > * __retrieveInterface(const std::string &name) const
Returns a pointer on an interface given it&#39;s name. Used when building models, meaning that the interf...
#define GUM_ERROR(type, msg)
Definition: exceptions.h:52
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ startSystem()

template<typename GUM_SCALAR >
INLINE void gum::prm::PRMFactory< GUM_SCALAR >::startSystem ( const std::string &  name)
overridevirtual

Tells the factory that we started declaring a model.

Exceptions
OperationNotAllowedRaised if the given operation is illegal.

Implements gum::prm::IPRMFactory.

Definition at line 1634 of file PRMFactory_tpl.h.

References gum::prm::PRMFactory< GUM_SCALAR >::__addPrefix(), gum::prm::PRMFactory< GUM_SCALAR >::__prm, gum::prm::PRMFactory< GUM_SCALAR >::__stack, GUM_ERROR, and gum::prm::PRMObject::name().

Referenced by gum::prm::LayerGenerator< GUM_SCALAR >::__generateSystem(), gum::prm::ClusteredLayerGenerator< GUM_SCALAR >::__generateSystem(), and gum::prm::o3prm::O3SystemFactory< GUM_SCALAR >::build().

1634  {
1635  if (__prm->__systemMap.exists(name)) {
1636  GUM_ERROR(DuplicateElement, "'" << name << "' is already used.");
1637  }
1638  PRMSystem< GUM_SCALAR >* model =
1639  new PRMSystem< GUM_SCALAR >(__addPrefix(name));
1640  __stack.push_back(model);
1641  __prm->__systemMap.insert(model->name(), model);
1642  __prm->__systems.insert(model);
1643  }
PRM< GUM_SCALAR > * __prm
The pointer on the PRM<GUM_SCALAR> built by this factory.
Definition: PRMFactory.h:1046
std::vector< PRMObject *> __stack
A stack used to keep track of created PRMObject.
Definition: PRMFactory.h:1049
std::string __addPrefix(const std::string &str) const
Adds __prefix to str iff __prefix != "".
#define GUM_ERROR(type, msg)
Definition: exceptions.h:52
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

Member Data Documentation

◆ __agg_params

template<typename GUM_SCALAR>
HashTable< PRMAggregate< GUM_SCALAR >*, std::vector< std::string > > gum::prm::PRMFactory< GUM_SCALAR >::__agg_params
private

A mapping between aggregators and their parameters.

Definition at line 1053 of file PRMFactory.h.

◆ __namespaces

template<typename GUM_SCALAR>
std::vector< List< std::string >* > gum::prm::PRMFactory< GUM_SCALAR >::__namespaces
private

◆ __packages

template<typename GUM_SCALAR>
std::vector< std::string > gum::prm::PRMFactory< GUM_SCALAR >::__packages
private

◆ __prm

◆ __stack


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