13 #ifndef __defined_libdai_factor_h
14 #define __defined_libdai_factor_h
107 TFactor(
const std::vector<Var> &
vars,
const std::vector<T> &
p ) :
_vs(vars.begin(), vars.end(), vars.size()),
_p(p.size()) {
109 for(
size_t i = 0; i < vars.size(); i++ )
110 nrStates *= vars[i].states();
113 for(
size_t li = 0; li < p.size(); ++li )
114 _p.set( permindex.convertLinearIndex(li), p[li] );
121 void set(
size_t i, T val ) {
_p.set( i, val ); }
124 T
get(
size_t i )
const {
return _p[i]; }
227 x.
_p =
_p.inverse(zero);
237 x.
_p =
_p.normalized( norm );
344 _p.pwBinaryOp( g.
_p, op );
355 for(
size_t i = 0; i < N; i++, ++i_f, ++i_g )
356 _p.p().push_back( op( f.
_p[i_f], g.
_p[i_g] ) );
403 result.
_p =
_p.pwBinaryTr( g.
_p, op );
411 result.
_p.p().clear();
412 result.
_p.p().reserve( N );
413 for(
size_t i = 0; i < N; i++, ++i_f, ++i_g )
414 result.
_p.p().push_back( op(
_p[i_f], g[i_g] ) );
443 return binaryTr(g,std::multiplies<T>());
497 VarSet varsrem = _vs / vars;
503 for(
size_t i = 0; i < nrStates(); i++, ++i_vars, ++i_varsrem )
504 if( (
size_t)i_vars == varsState )
505 result.
set( i_varsrem, _p[i] );
512 VarSet res_vars = vars & _vs;
517 for(
size_t i = 0; i < _p.size(); i++, ++i_res )
518 res.
set( i_res, res[i_res] + _p[i] );
528 VarSet res_vars = vars & _vs;
533 for(
size_t i = 0; i < _p.size(); i++, ++i_res )
534 if( _p[i] > res.
_p[i_res] )
535 res.
set( i_res, _p[i] );
551 for(
size_t alpha1 = 0; alpha1 < i.
states(); alpha1++ )
552 for(
size_t alpha2 = 0; alpha2 < i.
states(); alpha2++ )
553 if( alpha2 != alpha1 )
554 for(
size_t beta1 = 0; beta1 < j.
states(); beta1++ )
555 for(
size_t beta2 = 0; beta2 < j.
states(); beta2++ )
556 if( beta2 != beta1 ) {
557 size_t as = 1, bs = 1;
562 T f1 = slice( ij, alpha1 * as + beta1 * bs ).p().divide( slice( ij, alpha2 * as + beta1 * bs ).p() ).max();
563 T f2 = slice( ij, alpha2 * as + beta2 * bs ).p().divide( slice( ij, alpha1 * as + beta2 * bs ).p() ).max();
569 return std::tanh( 0.25 *
std::log( max ) );
576 template<
typename T> std::ostream& operator<< (std::ostream& os, const TFactor<T>& f) {
577 os <<
"(" << f.vars() <<
", (";
578 for(
size_t i = 0; i < f.nrStates(); i++ )
579 os << (i == 0 ?
"" :
", ") << f[i];
594 return dist( f.
p(), g.
p(), dt );
626 Var i = *it; it++;
Var j = *it;