17 #ifndef __defined_libdai_factorsp_h
18 #define __defined_libdai_factorsp_h
58 template <
typename T,
typename spvector_type>
111 TFactorSp(
const std::vector<Var> &
vars,
const std::vector<T> &
p ) :
_vs(vars.begin(), vars.end(), vars.size()),
_p(p.size()) {
113 for(
size_t i = 0; i < vars.size(); i++ )
114 nrStates *= vars[i].states();
117 for(
size_t li = 0; li < p.size(); ++li )
118 _p.set( permindex.convertLinearIndex(li), p[li] );
125 void set(
size_t i, T val ) {
_p.set( i, val ); }
128 T
get(
size_t i )
const {
return _p[i]; }
231 x.
_p =
_p.inverse(zero);
241 x.
_p =
_p.normalized( norm );
348 _p.pwBinaryOp( g.
_p, op );
390 _p.pwBinaryOp( g.
_p, std::multiplies<T>() );
392 *
this =
pointwiseOp( *
this, g, std::multiplies<T>(),
p().def() == (T)0 && g.
p().def() == (T)0 );
459 return pointwiseOp( *
this, g, std::multiplies<T>(),
p().def() == (T)0 && g.
p().def() == (T)0 );
513 VarSet varsrem = _vs / vars;
517 State s( _vs, it->first );
519 if( vars_s == varsState )
543 VarSet res_vars = vars & _vs;
547 VarSet rem(_vs / res_vars);
550 State s(_vs, it->first);
552 result.set( res_vars_s, result[res_vars_s] - p().def() + it->second );
569 result.normalize( NORMPROB );
576 VarSet res_vars = vars & _vs;
578 VarSet rem(_vs / res_vars);
581 State s( _vs, it->first );
583 if( it->second > result[res_vars_s] )
584 result.
set( res_vars_s, it->second );
615 for(
size_t alpha1 = 0; alpha1 < i.
states(); alpha1++ )
616 for(
size_t alpha2 = 0; alpha2 < i.
states(); alpha2++ )
617 if( alpha2 != alpha1 )
618 for(
size_t beta1 = 0; beta1 < j.
states(); beta1++ )
619 for(
size_t beta2 = 0; beta2 < j.
states(); beta2++ )
620 if( beta2 != beta1 ) {
621 size_t as = 1, bs = 1;
626 T f1 = slice( ij, alpha1 * as + beta1 * bs ).p().divide( slice( ij, alpha2 * as + beta1 * bs ).p() ).max();
627 T f2 = slice( ij, alpha2 * as + beta2 * bs ).p().divide( slice( ij, alpha1 * as + beta2 * bs ).p() ).max();
633 return std::tanh( 0.25 *
std::log( max ) );
649 result.
p() = f.
p().pwBinaryTr( g.
p(), op );
668 bool compatible =
true;
670 if( fs(*v) != gs(*v) )
674 fgs.
insert( gs.begin(), gs.end() );
675 result.set(
BigInt_size_t(fgs(un)), op( fit->second, git->second ) );
685 fgs.
insert( fs.begin(), fs.end() );
694 fgs.
insert( gs.begin(), gs.end() );
723 template<
typename T,
typename spvector_type> std::ostream& operator<< (std::ostream& os, const TFactorSp<T,spvector_type>& f) {
725 os <<
"(" << f.vars() <<
", (";
726 for(
size_t i = 0; i < f.nrStates(); i++ )
727 os << (i == 0 ?
"" :
", ") << f[i];
742 return dist( f.
p(), g.
p(), dt );
774 Var i = *it; it++;
Var j = *it;