1 #ifndef MTTOOLBOX_ALGORITHM_BEST_BITS_HPP 
    2 #define MTTOOLBOX_ALGORITHM_BEST_BITS_HPP 
   38 #if __cplusplus >= 201103L 
   41 #define MTTOOLBOX_USE_TR1 
   56 #if defined(MTTOOLBOX_USE_TR1) 
   57     using std::tr1::shared_ptr;
 
   59     using std::shared_ptr;
 
  120             param = 
new U[param_num];
 
  121             for (
int i = 0; i < param_num; i++) {
 
  141             ss << dec << delta << 
":";
 
  142             for (
int i = 0; i < size; i++) {
 
  143                 ss << hex << setw(8) << setfill(
'0') << param[i] << 
",";
 
  187     template<
typename U, 
typename V = U>
 
  232                           const int shift_values[],
 
  236             obSize = bit_size<U>();
 
  237             bit_len = out_bit_length;
 
  239             shifts = 
new int[size];
 
  240             num_pat = size * (size + 1) / 2;
 
  241             for (
int i = 0; i < size; i++) {
 
  242                 shifts[i] = shift_values[i];
 
  286                        bool verbose = 
false) {
 
  289                 cout << 
"searching from MSB" << endl;
 
  291             shared_ptr<tempp> initial(
new tempp(size));
 
  293             for (
int i = 0; i < size; i++) {
 
  294                 initial->param[i] = 0;
 
  296             vector<shared_ptr<tempp> > params;
 
  297             params.push_back(initial);
 
  300             cout << 
"DEBUG: bit_len = " << dec << bit_len << endl;
 
  302             for (
int p = 0; p < limit; p++) {
 
  303                 vector<shared_ptr<tempp> > current;
 
  305                 for (
unsigned int i = 0; i < params.size(); i++) {
 
  306                     search_best_temper(rand, p, *params[i],
 
  309                 delta = rand.
bitSize() * obSize;
 
  310                 for (
unsigned int i = 0; i < current.size(); i++) {
 
  311                     if (current[i]->delta < delta) {
 
  312                         delta = current[i]->delta;
 
  316                 cout << 
"DEBUG: delta = " << dec << delta << endl;
 
  319                     cout << 
"delta = " << dec << delta << endl;
 
  322                 for (
unsigned int i = 0; i < current.size(); i++) {
 
  323                     if (current[i]->delta == delta) {
 
  324                         params.push_back(current[i]);
 
  330             for (
int i = 0; i < size; i++) {
 
  335                 cout << 
"delta = " << dec << delta << endl;
 
  378                                 vector<shared_ptr<tempp> >& current,
 
  380             int delta = rand.
bitSize() * obSize;
 
  384             num_pat = size * (size + 1) / 2;
 
  385             for (int32_t i = (1 << num_pat) -1; i >= 0; i--) {
 
  386                 if (! inRange(i, v_bit)) {
 
  389                 shared_ptr<tempp> pattern(
new tempp(size));
 
  390                 make_pattern(*pattern, i, v_bit, para);
 
  392                 cout << 
"pattern:" << pattern->toString() << endl;
 
  394                 for (
int j = 0; j < size; j++) {
 
  397                 pattern->delta = get_equidist(rand, v_bit + 1);
 
  399                     cout << 
"pattern->delta:" << dec << pattern->delta << endl;
 
  401                 if (pattern->delta <= delta) {
 
  402                     current.push_back(pattern);
 
  403                     delta = pattern->delta;
 
  426         int get_equidist(TemperingCalculatable<U, V>& rand,
 
  428             AlgorithmEquidistribution<U, V> sb(rand, bit_length);
 
  430             return sb.get_all_equidist(veq);
 
  460         void make_pattern(tempp& result,
 
  461                           int pat, 
int v, 
const tempp& para)
 const {
 
  463             for (
int i = 0; i < result.size; i++) {
 
  464                 result.param[i] = para.param[i];
 
  467             para_mask = (~para_mask) >> v;
 
  471             U mask = 1 << (num_pat - 1);
 
  475                 if ((pat & mask) && (obSize > v + sum + 1)) {
 
  476                     result.param[index] |= (one << (obSize - v - sum - 1))
 
  478                 } 
else if (((pat & mask) == 0) && (obSize > v + sum + 1)) {
 
  479                     result.param[index] &= ~(one << (obSize - v - sum - 1));
 
  492             cout << 
"make_pattern:" << dec << pat << 
"," 
  493                  << dec << v << 
"," << result.toString()
 
  494                  << hex << para_mask << endl;
 
  522         bool inRange(
int pat, 
int v)
 const {
 
  526             U mask = 1 << (num_pat - 1);
 
  529                 if ((pat & mask) && (v + shifts[index] + sum > obSize)) {
 
  545 #if defined(MTTOOLBOX_USE_TR1) 
  546 #undef MTTOOLBOX_USE_TR1 
  548 #endif // MTTOOLBOX_ALGORITHM_BEST_BITS_HPP 
Abstruct class for searching tempering parameters. 
 
Calculate dimension of equi-distribution of output of pseudo random number generators. 
 
Abstract class for searching tempering parameters.