Пример #1
0
int main() {

#if defined(HAVE_AVX512F_INSTRUCTIONS)
    avx512f_gather_init();
#endif

    for(int w = 8; w <= 8192; w = 2 * w - 1) {
        printf(".");
        fflush(stdout);
        for(uint64_t value = 0; value < 256; value += 1) {
            if(!check_constant(w,value)) return -1;
        }
    }
    printf("\n");
    for(int w = 8; w <= 8192; w = 2 * w - 1) {
        printf(".");
        fflush(stdout);
        for(int runstart = 0; runstart < w * (int) sizeof(uint64_t); runstart+= w / 33 + 1) {
            for(int endstart = runstart; endstart < w * (int) sizeof(uint64_t); endstart += w / 11 + 1) {
                if(!check_continuous(w,runstart,endstart)) return -1;
            }
        }
    }
    printf("\n");
    for (int w = 8; w <= 8192; w = 2 * w - 1) {
        printf(".");
        fflush(stdout);
        for (int step = 1; step < w * (int) sizeof(uint64_t);
                step += w / 33 + 1) {
            if (!check_step(w, step))
                return -1;

        }
    }
    printf("\n");
    for (int w = 8; w <= 8192; w = 2 * w - 1) {
        printf(".");
        fflush(stdout);
        for (int start = 0; start < w * (int) sizeof(uint64_t);
                start += w / 11 + 1) {
            if (!check_exponential_step(w, start))
                return -1;

        }
    }
    printf("\n");
    printf("Code looks ok.\n");
    return 0;
}
Пример #2
0
int MovementModel::check_path(const UnitStack& stack, const Path& path) const {
    StackMovePoints points(stack);
    unsigned int step_num = 0;
    Point current_position = stack.position;
    while (step_num < path.size()) {
        Point next_position = path[step_num];
        if (distance_between(current_position, next_position) != 1)
            break;
        if (!check_step(stack, &points, path, step_num))
            break;
        current_position = next_position;
        step_num++;
    }
    return step_num;
}
int main()
{
  int i;
  tree_type tree;
  init_tree(tree);
  #pragma omp parallel
  #pragma omp single
  {
    #pragma omp task
      start_background_work();
    for (i = 0; i < max_steps; i++)
    {
        #pragma omp taskgroup
        {
           #pragma omp task
             compute_tree(tree);
        } // wait on tree traversal in this step
        check_step();
    }
  } // only now is background work required to be complete
  print_results();
  return 0;
}
Пример #4
0
void fixed_degree_task::make_randomization_step()
{
  undirected_graph& graph_ = gr_data_->graph_;
  std::future<edge> e1_future = pool_.enqueue([&]()->edge {return boost::random_edge(graph_, rand_generator_);});
  edge e2 = boost::random_edge(graph_, rand_generator_);
  vertex vs2 = boost::source(e2, graph_);
  vertex vt2 = boost::target(e2, graph_);
  edge e1 = e1_future.get();
  vertex vs1 = boost::source(e1, graph_);
  vertex vt1 = boost::target(e1, graph_);
  while(e1 == e2 || vs1 == vs2 || vt1 == vt2 || vs1 == vt2 || vt1 == vs2 ||
    boost::edge(vs1, vs2, graph_).second ||
    boost::edge(vt1, vt2, graph_).second)
  {
    //std::future<edge> e1_future = pool_.enqueue([&]()->edge {return boost::random_edge(graph_, rand_generator_);});
    e2 = boost::random_edge(graph_, rand_generator_);
    vs2 = boost::source(e2, graph_);
    vt2 = boost::target(e2, graph_);

    //e1 = e1_future.get();
    //vs1 = boost::source(e1, graph_);
    //vt1 = boost::target(e1, graph_);
  }
  assert(e1 != e2 && vs1 != vs2 && vt1 != vt2 &&
    !boost::edge(vs1, vs2, graph_).second &&
    !boost::edge(vt1, vt2, graph_).second);

  // removing edges
  boost::remove_edge(e1, graph_);
  boost::remove_edge(e2, graph_);
  assert(!boost::edge(vs1, vt1, graph_).second &&
    !boost::edge(vs2, vt2, graph_).second);
  
  int removed = 0;
  int added = 0;

  int removed1 = 0;
  int added1 = 0;

  std::future<void> result1 = pool_.enqueue([&]()
  {
    adjacency_iterator v, v_end;
    for(boost::tie(v, v_end) = boost::adjacent_vertices(vs1, graph_); v != v_end; ++v)
    {
      if(*v != vt1 && boost::edge(*v, vt1, graph_).second)
      {
        ++removed1;
      }
    }
  });

  std::future<void> result2 = pool_.enqueue([&]()
  {
    adjacency_iterator v, v_end;
    for(boost::tie(v, v_end) = boost::adjacent_vertices(vs1, graph_); v != v_end; ++v)
    {
      if(*v != vs2 && boost::edge(*v, vs2, graph_).second)
      {
        ++added1;
      }
    }
  });

  std::future<void> result3 = pool_.enqueue([&]()
  {
    adjacency_iterator v, v_end;
    for(boost::tie(v, v_end) = boost::adjacent_vertices(vt2, graph_); v != v_end; ++v)
    {
      if(*v != vs2 && boost::edge(*v, vs2, graph_).second)
      {
        ++removed;
      }
    }
  });

  adjacency_iterator v, v_end;
  for(boost::tie(v, v_end) = boost::adjacent_vertices(vt2, graph_); v != v_end; ++v)
  {
    if(*v != vt1 && boost::edge(*v, vt1, graph_).second)
    {
      ++added;
    }
  }

  result1.get();
  result2.get();
  result3.get();

  added += added1;
  removed += removed1;
  boost::add_edge(vs1, vs2, graph_);
  boost::add_edge(vt1, vt2, graph_);
  int delta = added - removed;

  if(check_step(delta))
  {
    num_triangles_ += delta;
  }
  else
  {
    // revert made changes
    boost::add_edge(vs1, vt1, graph_);
    boost::add_edge(vs2, vt2, graph_);
    boost::remove_edge(vs1, vs2, graph_);
    boost::remove_edge(vt1, vt2, graph_);
  }
}
Пример #5
0
void random_switch_task::make_randomization_step()
{
  undirected_graph& graph_ = gr_data_->graph_;
  size_t removed = 0;
  size_t added = 0;

  edge edge_to_remove;
  vertex source1, target1;
  std::future<void> result = pool_.enqueue([&]()
  {
    edge_to_remove = boost::random_edge(graph_, rand_generator_);
    source1 = boost::source(edge_to_remove, graph_);
    target1 = boost::target(edge_to_remove, graph_);
    adjacency_iterator v, v_end;
    for(boost::tie(v, v_end) = boost::adjacent_vertices(source1, graph_); v != v_end; ++v)
    {
      if(*v != target1 && boost::edge(*v, target1, graph_).second)
      {
        ++removed;
      }
    }
  });

  boost::graph_traits<undirected_graph>::edges_size_type added_edge_num = 0;
  std::pair<vertex, vertex> edge_to_add;
  assert(non_existing_edges_.size() > 0);
  added_edge_num = (*var_generator_)();
  edge_to_add = non_existing_edges_[added_edge_num];
  assert(!boost::edge(edge_to_add.first, edge_to_add.second, graph_).second);

  adjacency_iterator v, v_end;
  for(boost::tie(v, v_end) = boost::adjacent_vertices(edge_to_add.first, graph_); v != v_end; ++v)
  {
    if(boost::edge(*v, edge_to_add.second, graph_).second)
    {
      ++added;
    }
  }

  result.get();

  if((edge_to_add.first == source1 && boost::edge(edge_to_add.second, target1, graph_).second) ||
     (edge_to_add.first == target1 && boost::edge(edge_to_add.second, source1, graph_).second) ||
     (edge_to_add.second == source1 && boost::edge(edge_to_add.first, target1, graph_).second) ||
     (edge_to_add.second == target1 && boost::edge(edge_to_add.first, source1, graph_).second))
  {
    --added;
  }

  int delta = added - removed;
  if(!check_step(delta))
  {
    return;
  }
  boost::remove_edge(edge_to_remove, graph_);
  //std::pair<vertex, vertex> edge_to_add = non_existing_edges_[added_edge_num];
  boost::add_edge(edge_to_add.first, edge_to_add.second, graph_);
  non_existing_edges_[added_edge_num] = std::make_pair(source1, target1);
  num_triangles_ += delta;
  //non_existing_edges_.erase(non_existing_edges_.begin() + added_edge_num);
  //non_existing_edges_.push_back(std::make_pair(source1, target1));
}