37 template <
typename GUM_SCALAR >
45 template <
typename GUM_SCALAR >
53 template <
typename GUM_SCALAR >
65 template <
typename GUM_SCALAR >
73 template <
typename GUM_SCALAR >
94 template <
typename GUM_SCALAR >
98 if (&src ==
this)
return *
this;
104 template <
typename GUM_SCALAR >
108 if (&src ==
this)
return *
this;
116 template <
typename GUM_SCALAR >
122 template <
typename GUM_SCALAR >
126 this->
content()->newFactory()));
130 template <
typename GUM_SCALAR >
138 template <
typename GUM_SCALAR >
146 template <
typename GUM_SCALAR >
154 template <
typename GUM_SCALAR >
163 template <
typename GUM_SCALAR >
171 [](GUM_SCALAR z, GUM_SCALAR p) {
172 return (p == static_cast< GUM_SCALAR >(1))
174 : (z == static_cast< GUM_SCALAR >(1)) ? p : (p > z ? p : z);
176 static_cast< GUM_SCALAR
>(1));
179 if (res == static_cast< GUM_SCALAR >(1))
186 template <
typename GUM_SCALAR >
194 [](GUM_SCALAR z, GUM_SCALAR p) {
195 return (p == static_cast< GUM_SCALAR >(0))
197 : (z == static_cast< GUM_SCALAR >(0)) ? p : (p < z ? p : z);
199 static_cast< GUM_SCALAR
>(0));
202 if (res == static_cast< GUM_SCALAR >(0))
209 template <
typename GUM_SCALAR >
212 return static_cast< GUM_SCALAR
>(0);
216 [](GUM_SCALAR z, GUM_SCALAR p) {
217 return (p == 0.0) ? z : (z - p * log2(p));
222 template <
typename GUM_SCALAR >
229 template <
typename GUM_SCALAR >
236 template <
typename GUM_SCALAR >
249 "Variable <" << v->name() <<
"> not present in src.");
254 "Variables <" << v->name() <<
"> are not identical.");
260 for (Isrc.setFirst(); !Isrc.end(); ++Isrc) {
261 for (
Idx i = 0; i < this->
nbrDim(); i++) {
262 Idst.
chgVal(Isrc.variable(i).name(), Isrc.val(i));
264 this->
set(Idst, src.
get(Isrc));
270 template <
typename GUM_SCALAR >
273 const std::vector< std::string >& mapSrc)
const {
277 if (src.
nbrDim() != mapSrc.size()) {
279 "Potential and vector have not the same dimension.");
285 "Variables " << mapSrc[i] <<
" (in the argument) and " 287 <<
" have not the same dimension.");
293 for (Isrc.
setFirst(); !Isrc.
end(); ++Isrc, ++Idst) {
294 this->
set(Idst, src.
get(Isrc));
300 template <
typename GUM_SCALAR >
302 this->
apply([](GUM_SCALAR x) {
return x * x; });
306 template <
typename GUM_SCALAR >
312 "BNdistance between potentials with different numbers of dimensions");
316 "A variable in the argument does not belong to the potential.");
324 GUM_SCALAR res =
static_cast< GUM_SCALAR
>(0);
326 GUM_SCALAR x = this->
get(inst);
327 GUM_SCALAR y = p.
get(inst);
328 if (static_cast< GUM_SCALAR >(0) == x)
331 if (static_cast< GUM_SCALAR >(0) == y)
334 "The argument has a 0 at " << inst
335 <<
" while the potential has not.")
337 res += x * log2(x / y);
342 template <
typename GUM_SCALAR >
344 this->
apply([](GUM_SCALAR x) {
355 template <
typename GUM_SCALAR >
362 GUM_SCALAR s =
sum();
364 if (s != (GUM_SCALAR)0) {
365 this->
apply([s](GUM_SCALAR x) {
return x / s; });
371 template <
typename GUM_SCALAR >
375 if (this->
_empty_value != static_cast< GUM_SCALAR >(0)) {
379 "Normalization for a potential that sum to 0 in " << *
this);
386 GUM_SCALAR s = (GUM_SCALAR)0.0;
388 s += this->
get(inst);
389 if (s == (GUM_SCALAR)0.0) {
391 "Normalization for a potential that sum to 0 in " << *
this);
393 if (s != (GUM_SCALAR)1.0) {
395 this->
set(inst, this->
get(inst) / s);
403 template <
typename GUM_SCALAR >
406 this->
apply([v](GUM_SCALAR x) {
return x * v; });
410 template <
typename GUM_SCALAR >
413 this->
apply([v](GUM_SCALAR x) {
return x + v; });
417 template <
typename GUM_SCALAR >
426 template <
typename GUM_SCALAR >
436 template <
typename GUM_SCALAR >
445 template <
typename GUM_SCALAR >
453 template <
typename GUM_SCALAR >
463 template <
typename GUM_SCALAR >
473 template <
typename GUM_SCALAR >
483 template <
typename GUM_SCALAR >
493 template <
typename GUM_SCALAR >
496 p.
apply([](GUM_SCALAR x) {
497 if (x != static_cast< GUM_SCALAR >(0))
498 return static_cast< GUM_SCALAR >(1);
500 return static_cast< GUM_SCALAR
>(0);
505 template <
typename GUM_SCALAR >
516 template <
typename GUM_SCALAR >
518 const std::vector< const DiscreteVariable* >& vars)
const {
519 if (vars.size() != this->
nbrDim())
521 "The vector contains " << vars.size() <<
" variables instead of " 522 << this->
nbrDim() <<
".");
523 for (
const auto var : vars) {
526 "A variable in the vector does not belong to the potential.");
531 for (
const auto var : vars)
539 template <
typename GUM_SCALAR >
544 "The variable to put first does not belong to the potential");
548 std::vector< const DiscreteVariable* > vars;
556 template <
typename GUM_SCALAR >
565 template <
typename GUM_SCALAR >
567 if (this->
nbrDim() != 1) {
571 GUM_SCALAR r =
static_cast< GUM_SCALAR
>(
randomProba());
575 if (r <= 0)
return Ip.
val(0);
580 template <
typename GUM_SCALAR >
588 template <
typename GUM_SCALAR >
597 if (this->
get(I) == v) res.
insert(I);
602 template <
typename GUM_SCALAR >
607 template <
typename GUM_SCALAR >
612 template <
typename GUM_SCALAR >
614 std::vector< GUM_SCALAR > v;
625 }
while (sum == 0.0);
631 template <
typename GUM_SCALAR >
634 return this->
random().normalize();
637 template <
typename GUM_SCALAR >
640 return this->
random().normalizeAsCPT();
643 template <
typename GUM_SCALAR >
646 if ((alpha < GUM_SCALAR(0.0)) || (alpha > GUM_SCALAR(1.0))) {
Copyright 2005-2019 Pierre-Henri WUILLEMIN et Christophe GONZALES (LIP6) {prenom.nom}_at_lip6.fr.
bool contains(const Key &k) const
Indicates whether a given elements belong to the set.
aGrUM's Potential is a multi-dimensional array with tensor operators.
virtual void beginMultipleChanges() final
Default implementation of MultiDimContainer::set().
Potential< GUM_SCALAR > extract(const Instantiation &inst) const
create a new Potential extracted from *this given a partial instantiation
virtual Idx nbrDim() const final
Returns the number of vars in the multidimensional container.
MultiDimImplementation< GUM_SCALAR > * _content
The true container.
virtual bool empty() const =0
Returns true if no var is in *this.
virtual Size domainSize() const final
Returns the product of the variables domain size.
Potential< GUM_SCALAR > isNonZeroMap() const
create a boolean-like potential using the predicate isNonZero
GUM_SCALAR projectProduct(const MultiDimImplementation< GUM_SCALAR > &table, Instantiation *instantiation=0)
the function to be used to project a MultiDimImplementation using a Product
GUM_SCALAR min() const
min of all elements in the Potential
virtual GUM_SCALAR get(const Instantiation &i) const final
Default implementation of MultiDimContainer::get().
const Potential< GUM_SCALAR > & normalize() const
normalisation of this do nothing if sum is 0
GUM_SCALAR minNonZero() const
min of all non zero elements in the Potential
double randomProba()
Returns a random double between 0 and 1 included (i.e.
const Potential< GUM_SCALAR > & random() const
generate a random Potential with each parameter in [0,1]
GUM_SCALAR _empty_value
value of the MultiDimDecorator if no dimension.
const Potential< GUM_SCALAR > & scale(GUM_SCALAR v) const
create a new potential multiplied by v from *this
MultiDimDecorator< GUM_SCALAR > & operator=(const MultiDimDecorator &from) noexcept
copy operator
Instantiation & chgVal(const DiscreteVariable &v, Idx newval)
Assign newval to variable v in the Instantiation.
Base class for discrete random variable.
GUM_SCALAR KL(const Potential< GUM_SCALAR > &p) const
compute KL divergence between this and p Checks the compatibility and then compute KL divergence ...
Potential< GUM_SCALAR > margProdOut(const Set< const DiscreteVariable * > &del_vars) const
Projection using multiplication as operation (and implementation-optimized operations) ...
void incNotVar(const DiscreteVariable &v)
Operator increment for vars which are not v.
Copyright 2005-2019 Pierre-Henri WUILLEMIN et Christophe GONZALES (LIP6) {prenom.nom}_at_lip6.fr.
Abstract base class for all multi dimensionnal containers.
Set< Instantiation > argmin() const
set of instantiation corresponding to the min in the Potential
void incVar(const DiscreteVariable &v)
Operator increment for variable v only.
virtual bool empty() const final
Returns true if no var is in *this.
Idx val(Idx i) const
Returns the current value of the variable at position i.
Set< const DiscreteVariable *> _complementVars(const Set< const DiscreteVariable * > &del_vars) const
virtual const MultiDimImplementation< GUM_SCALAR > * content() const final
Returns the implementation for this object (may be *this).
Set< Instantiation > findAll(GUM_SCALAR v) const
set of instantiation corresponding to the parameter v in the Potential
virtual void populate(const std::vector< GUM_SCALAR > &v) const final
Automatically fills this MultiDimContainer with the values in v.
GUM_SCALAR product() const
product of all elements in the Potential
virtual Size domainSize() const =0
const Potential< GUM_SCALAR > & normalizeAsCPT() const
normalisation of this as a CPT
Potential< GUM_SCALAR > margProdIn(const Set< const DiscreteVariable * > &kept_vars) const
Projection using multiplication as operation (and implementation-optimized operations) ...
Copyright 2005-2019 Pierre-Henri WUILLEMIN et Christophe GONZALES (LIP6) {prenom.nom}_at_lip6.fr.
const Potential< GUM_SCALAR > & sq() const
apply $x^2$ on every element of the container
std::ostream & operator<<(std::ostream &output, const BayesNet< GUM_SCALAR > &bn)
Prints map's DAG in output using the Graphviz-dot format.
virtual void apply(std::function< GUM_SCALAR(GUM_SCALAR) > f) const final
Apply a function on every element of the container.
void inc()
Operator increment.
virtual void endMultipleChanges() final
Default implementation of MultiDimContainer::set().
virtual GUM_SCALAR reduce(std::function< GUM_SCALAR(GUM_SCALAR, GUM_SCALAR) > f, GUM_SCALAR base) const final
compute lfold for this container
Idx draw() const
get a value at random from a 1-D distribution
void setFirstVar(const DiscreteVariable &v)
Assign the first value in the Instantiation for var v.
const Potential< GUM_SCALAR > & fillWith(const Potential< GUM_SCALAR > &src) const
copy a Potential data using name of variables and labels (not necessarily the same variables in the s...
Potential< GUM_SCALAR > margSumIn(const Set< const DiscreteVariable * > &kept_vars) const
Projection using sum as operation (and implementation-optimized operations)
Set< Instantiation > argmax() const
set of instantiation corresponding to the max in the Potential
Potential< GUM_SCALAR > & operator=(const Potential< GUM_SCALAR > &src)
Default constructor.
virtual const DiscreteVariable & variable(Idx) const final
Returns a const ref to the ith var.
Multidimensional matrix stored as an array in memory.
GUM_SCALAR max() const
max of all elements in the Potential
Potential< GUM_SCALAR > reorganize(const std::vector< const DiscreteVariable * > &vars) const
create a new Potential with another order
const Potential< GUM_SCALAR > & abs() const
Apply abs on every element of the container.
virtual void copyFrom(const MultiDimContainer< GUM_SCALAR > &src) const
Basic copy of a MultiDimContainer.
Potential< GUM_SCALAR > margMaxIn(const Set< const DiscreteVariable * > &kept_vars) const
Projection using max as operation (and implementation-optimized operations)
virtual const MultiDimImplementation< GUM_SCALAR > * content() const =0
Returns the implementation for this object (may be *this).
GUM_SCALAR entropy() const
entropy of the Potential
Potential< GUM_SCALAR > margSumOut(const Set< const DiscreteVariable * > &del_vars) const
Projection using sum as operation (and implementation-optimized operations)
Class for assigning/browsing values to tuples of discrete variables.
Decorator design pattern in order to separate implementations from multidimensional matrix concepts...
GUM_SCALAR projectSum(const MultiDimImplementation< GUM_SCALAR > &table, Instantiation *instantiation=0)
the function to be used to project a MultiDimImplementation using a sum
virtual void add(const DiscreteVariable &v) final
Adds a new var to the variables of the multidimensional matrix.
GUM_SCALAR sum() const
sum of all elements in the Potential
GUM_SCALAR projectMin(const MultiDimImplementation< GUM_SCALAR > &table, Instantiation *instantiation=0)
the function to be used to project a MultiDimImplementation using a Min
GUM_SCALAR projectMax(const MultiDimImplementation< GUM_SCALAR > &table, Instantiation *instantiation=0)
the function to be used to project a MultiDimImplementation using a Max
virtual const std::string toString() const
the function to be used to add two Potentials
void setFirst()
Assign the first values to the tuple of the Instantiation.
const Potential< GUM_SCALAR > & randomCPT() const
generate a random CPT in the Potential
<agrum/multidim/multiDimImplementation.h>
virtual const Sequence< const DiscreteVariable *> & variablesSequence() const =0
Returns a const ref to the sequence of DiscreteVariable*.
Potential< GUM_SCALAR > margMaxOut(const Set< const DiscreteVariable * > &del_vars) const
Projection using max as operation (and implementation-optimized operations)
Size Idx
Type for indexes.
GUM_SCALAR maxNonOne() const
max of all non one elements in the Potential
Potential< GUM_SCALAR > margMinOut(const Set< const DiscreteVariable * > &del_vars) const
Projection using min as operation (and implementation-optimized operations)
void add(const DiscreteVariable &v) final
Adds a new variable in the Instantiation.
const Potential< GUM_SCALAR > & noising(GUM_SCALAR alpha) const
add a noise in a CPT by mixing (1-alpha)this+alpha.randomCPT()
virtual void fill(const GUM_SCALAR &d) const final
Default implementation of MultiDimContainer::set().
std::size_t Size
In aGrUM, hashed values are unsigned long int.
virtual const Sequence< const DiscreteVariable *> & variablesSequence() const final
Returns a const ref to the sequence of DiscreteVariable*.
const Potential< GUM_SCALAR > & translate(GUM_SCALAR v) const
create a new potential added with v from *this
virtual bool contains(const DiscreteVariable &var) const final
Returns true if var is in *this.
virtual Potential< GUM_SCALAR > * newFactory() const
Default implementation of MultiDimContainer::set().
const Potential< GUM_SCALAR > & randomDistribution() const
generate a random Distribution in the Potential
Potential()
Default constructor.
void insert(const Key &k)
Inserts a new element into the set.
Potential< GUM_SCALAR > putFirst(const DiscreteVariable *var) const
create a new Potential with a certain variable in first
#define GUM_ERROR(type, msg)
bool end() const
Returns true if the Instantiation reached the end.
virtual void extractFrom(const MultiDimContainer< GUM_SCALAR > &src, const Instantiation &mask)
Basic extraction of a MultiDimContainer.
Potential< GUM_SCALAR > margMinIn(const Set< const DiscreteVariable * > &kept_vars) const
Projection using min as operation (and implementation-optimized operations)