//! Construct a fast_discrete_assignment from a discrete_assignment
 fast_discrete_assignment(const discrete_assignment<MAX_DIM>& asg) : 
   _num_vars(asg.args().num_vars()), _index(asg.linear_index()) { 
   transposed = false;
   typename discrete_assignment<MAX_DIM>::const_iterator asg_it = asg.begin();
   for (size_t i = 0; i < _num_vars; ++i) {
     _vars[i] = asg.args().var(i);
     _asgs[i] = asg_it[i];
   }
     
   size_t multiple = 1;
   for (size_t i = 0;i < _num_vars; ++i) {
     _increment_step[i] = multiple;
     multiple *= _vars[i].size();
   }
 }
 //! Construct a fast_discrete_assignment from a discrete_assignment
 fast_discrete_assignment(const discrete_assignment<MAX_DIM>& asg) : 
   _index(asg.linear_index()) { 
   transposed = false;
   _num_vars = asg.args().num_vars();
   for (size_t i = 0;i < _num_vars; ++i) {
     _vars[i] = asg.args().var(i);
     _asgs[i] = asg.asg_at(i);
   }
     
   size_t multiple = 1;
   for (size_t i = 0;i < _num_vars; ++i) {
     _increment_step[i] = multiple;
     multiple *= _vars[i].size();
   }
 }