29 #ifndef GUM_MARKOV_NET_H 30 #define GUM_MARKOV_NET_H 34 #include <agrum/agrum.h> 36 #include <agrum/tools/core/hashTable.h> 38 #include <agrum/MN/IMarkovNet.h> 39 #include <agrum/tools/multidim/potential.h> 41 #include <agrum/BN/BayesNet.h> 71 template <
typename GUM_SCALAR >
72 class MarkovNet:
public IMarkovNet< GUM_SCALAR > {
96 static MarkovNet< GUM_SCALAR > fastPrototype(
const std::string& dotlike, Size domainSize = 2);
103 static MarkovNet< GUM_SCALAR > fromBN(
const BayesNet< GUM_SCALAR >& bn);
120 explicit MarkovNet(std::string name);
125 virtual ~MarkovNet()
final;
130 MarkovNet(
const MarkovNet< GUM_SCALAR >& source);
144 MarkovNet< GUM_SCALAR >& operator=(
const MarkovNet< GUM_SCALAR >& source);
159 virtual const Potential< GUM_SCALAR >& factor(
const NodeSet& varIds)
const final;
161 virtual const Potential< GUM_SCALAR >&
162 factor(
const std::vector< std::string >& varnames)
const final;
169 virtual const NodeSet& smallestFactorFromNode(NodeId node)
const final;
175 virtual const FactorTable< GUM_SCALAR >& factors()
const final;
182 virtual const VariableNodeMap& variableNodeMap()
const final;
198 NodeId add(
const DiscreteVariable& var);
211 NodeId add(
const std::string& name,
unsigned int nbrmod);
230 NodeId add(
const DiscreteVariable& var, NodeId id);
247 void erase(NodeId varId);
252 void erase(
const std::string& name);
264 void erase(
const DiscreteVariable& var);
276 const DiscreteVariable& variable(NodeId id)
const final;
284 const DiscreteVariable& variable(
const std::string& name)
const {
285 return variable(idFromName(name));
297 void changeVariableName(NodeId id,
const std::string& new_name);
302 void changeVariableName(
const std::string& name,
const std::string& new_name) {
303 changeVariableName(idFromName(name), new_name);
316 void changeVariableLabel(NodeId id,
const std::string& old_label,
const std::string& new_label);
321 void changeVariableLabel(
const std::string& name,
322 const std::string& old_label,
323 const std::string& new_label) {
324 changeVariableLabel(idFromName(name), old_label, new_label);
335 NodeId nodeId(
const DiscreteVariable& var)
const final;
345 NodeId idFromName(
const std::string& name)
const final;
356 const DiscreteVariable& variableFromName(
const std::string& name)
const final;
377 const Potential< GUM_SCALAR >& addFactor(
const std::vector< std::string >& varnames);
379 const Potential< GUM_SCALAR >& addFactor(
const NodeSet& vars);
381 const Potential< GUM_SCALAR >& addFactor(
const Potential< GUM_SCALAR >& factor);
389 void eraseFactor(
const NodeSet& vars);
391 void eraseFactor(
const std::vector< std::string >& varnames);
396 void generateFactors()
const;
399 void generateFactor(
const NodeSet& vars)
const;
403 void beginTopologyTransformation();
405 void endTopologyTransformation();
408 bool _topologyTransformationInProgress_;
411 void _clearFactors_();
414 void _copyFactors_(
const MarkovNet< GUM_SCALAR >& source);
417 void _rebuildGraph_();
420 VariableNodeMap _varMap_;
423 FactorTable< GUM_SCALAR > _factors_;
425 const Potential< GUM_SCALAR >* _addFactor_(
const NodeSet& vars,
426 const Potential< GUM_SCALAR >* src =
nullptr);
428 void _eraseFactor_(
const NodeSet& vars);
431 using IMarkovNet< GUM_SCALAR >::graph;
432 using IMarkovNet< GUM_SCALAR >::size;
433 using IMarkovNet< GUM_SCALAR >::nodes;
434 using IMarkovNet< GUM_SCALAR >::log10DomainSize;
438 template <
typename GUM_SCALAR >
439 std::ostream& operator<<(std::ostream& output,
const MarkovNet< GUM_SCALAR >& bn);
442 #ifndef GUM_NO_EXTERN_TEMPLATE_CLASS 444 extern template class MarkovNet<
double >;
450 #include <agrum/MN/MarkovNet_tpl.h> INLINE void emplace(Args &&... args)