13 #ifndef __defined_libdai_index_h
14 #define __defined_libdai_index_h
75 for( ; j != forVars.
end() && *j <= *i; ++j ) {
76 _ranges.push_back( j->states() );
77 _sum.push_back( (*i == *j) ? sum : 0 );
81 for( ; j != forVars.
end(); ++j ) {
82 _ranges.push_back( j->states() );
96 operator size_t()
const {
106 while( i <
_state.size() ) {
159 size_t N = vars.size();
163 for(
size_t i = 0; i < N; ++i )
165 _ranges.push_back( vars[N - 1 - i].states() );
167 _ranges.push_back( vars[i].states() );
170 VarSet vs( vars.begin(), vars.end(), N );
176 size_t ind = find( vars.begin(), vars.end(), *vs_i ) - vars.begin();
178 _sigma.push_back( N - 1 - ind );
192 std::vector<size_t> vi;
195 for(
size_t k = 0; k < N; k++ ) {
196 vi.push_back( li %
_ranges[k] );
204 for(
size_t k = 0; k < N; k++ ) {
205 sigma_li += vi[
_sigma[k]] * prod;
233 std::vector<size_t> invRanges( N, 0 );
234 std::vector<size_t> invSigma( N, 0 );
235 for(
size_t i = 0; i < N; i++ ) {
237 invRanges[i] =
_ranges[_sigma[i]];
239 return Permute( invRanges, invSigma );
280 operator size_t()
const {
297 for( i = 0; i !=
_indices.size(); i++ ) {
369 if( linearState == 0 )
375 linearState /= (
BigInt)v->states();
383 insert( s.begin(), s.end() );
396 operator size_t()
const {
402 template<
typename InputIterator>
403 void insert( InputIterator b, InputIterator e ) {
409 state = this->operator()( vars );
413 const std::map<Var,size_t>&
get()
const {
return states; }
416 operator const std::map<Var,size_t>& ()
const {
return states; }
420 states_type::const_iterator entry =
states.find( v );
421 if( entry ==
states.end() )
424 return entry->second;
432 states_type::const_iterator entry =
states.find( *v );
433 if( entry !=
states.end() )
434 vs_state += (
BigInt)entry->second * prod;
435 prod *= (
BigInt)v->states();
444 states_type::iterator entry =
states.begin();
445 while( entry !=
states.end() ) {
446 if( ++(entry->second) < entry->first.states() )
451 if( entry ==
states.end() )
463 return(
state >= 0 );
469 for( states_type::iterator s =
states.begin(); s !=
states.end(); s++ )