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 * std::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 >
308 this->
apply([](GUM_SCALAR x) {
return std::log2(x); });
312 template <
typename GUM_SCALAR >
318 "BNdistance between potentials with different numbers of dimensions");
322 "A variable in the argument does not belong to the potential.");
330 GUM_SCALAR res =
static_cast< GUM_SCALAR
>(0);
332 GUM_SCALAR x = this->
get(inst);
333 GUM_SCALAR y = p.
get(inst);
334 if (static_cast< GUM_SCALAR >(0) == x)
337 if (static_cast< GUM_SCALAR >(0) == y)
340 "The argument has a 0 at " << inst
341 <<
" while the potential has not.")
343 res += x * std::log2(x / y);
348 template <
typename GUM_SCALAR >
350 this->
apply([](GUM_SCALAR x) {
361 template <
typename GUM_SCALAR >
368 GUM_SCALAR s =
sum();
370 if (s != (GUM_SCALAR)0) {
371 this->
apply([s](GUM_SCALAR x) {
return x / s; });
377 template <
typename GUM_SCALAR >
381 if (this->
_empty_value != static_cast< GUM_SCALAR >(0)) {
385 "Normalization for a potential that sum to 0 in " << *
this);
392 GUM_SCALAR s = (GUM_SCALAR)0.0;
394 s += this->
get(inst);
395 if (s == (GUM_SCALAR)0.0) {
397 "Normalization for a potential that sum to 0 in " << *
this);
399 if (s != (GUM_SCALAR)1.0) {
401 this->
set(inst, this->
get(inst) / s);
409 template <
typename GUM_SCALAR >
412 this->
apply([v](GUM_SCALAR x) {
return x * v; });
416 template <
typename GUM_SCALAR >
419 this->
apply([v](GUM_SCALAR x) {
return x + v; });
423 template <
typename GUM_SCALAR >
425 this->
apply([](GUM_SCALAR x) {
return 1 / x; });
429 template <
typename GUM_SCALAR >
438 template <
typename GUM_SCALAR >
448 template <
typename GUM_SCALAR >
457 template <
typename GUM_SCALAR >
465 template <
typename GUM_SCALAR >
475 template <
typename GUM_SCALAR >
485 template <
typename GUM_SCALAR >
495 template <
typename GUM_SCALAR >
505 template <
typename GUM_SCALAR >
508 p.
apply([](GUM_SCALAR x) {
509 if (x != static_cast< GUM_SCALAR >(0))
510 return static_cast< GUM_SCALAR >(1);
512 return static_cast< GUM_SCALAR
>(0);
517 template <
typename GUM_SCALAR >
528 template <
typename GUM_SCALAR >
530 const std::vector< const DiscreteVariable* >& vars)
const {
531 if (vars.size() != this->
nbrDim())
533 "The vector contains " << vars.size() <<
" variables instead of " 534 << this->
nbrDim() <<
".");
535 for (
const auto var: vars) {
538 "A variable in the vector does not belong to the potential.");
543 for (
const auto var: vars)
551 template <
typename GUM_SCALAR >
556 "The variable to put first does not belong to the potential");
560 std::vector< const DiscreteVariable* > vars;
568 template <
typename GUM_SCALAR >
577 template <
typename GUM_SCALAR >
579 if (this->
nbrDim() != 1) {
583 GUM_SCALAR r =
static_cast< GUM_SCALAR
>(
randomProba());
587 if (r <= 0)
return Ip.
val(0);
592 template <
typename GUM_SCALAR >
600 template <
typename GUM_SCALAR >
609 if (this->
get(I) == v) res.
insert(I);
614 template <
typename GUM_SCALAR >
619 template <
typename GUM_SCALAR >
624 template <
typename GUM_SCALAR >
626 std::vector< GUM_SCALAR > v;
637 }
while (sum == 0.0);
643 template <
typename GUM_SCALAR >
646 return this->
random().normalize();
649 template <
typename GUM_SCALAR >
652 return this->
random().normalizeAsCPT();
655 template <
typename GUM_SCALAR >
658 if ((alpha < GUM_SCALAR(0.0)) || (alpha > GUM_SCALAR(1.0))) {
Copyright 2005-2020 Pierre-Henri WUILLEMIN () et Christophe GONZALES () info_at_agrum_dot_org.
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
multiply (each value of) *this by v
MultiDimDecorator< GUM_SCALAR > & operator=(const MultiDimDecorator &from) noexcept
copy operator
const Potential< GUM_SCALAR > & inverse(void) const
the function to inverse (each value of) *this
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-2020 Pierre-Henri WUILLEMIN () et Christophe GONZALES () info_at_agrum_dot_org.
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-2020 Pierre-Henri WUILLEMIN () et Christophe GONZALES () info_at_agrum_dot_org.
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
const Potential< GUM_SCALAR > & log2() const
apply $log_2(x)$ on every element of the container
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/tools/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
add v to (each value of) *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)