Program Listing for File assign_utils.hpp

Return to documentation for file (include/uitsl/utility/assign_utils.hpp)

#pragma once
#ifndef UITSL_UTILITY_ASSIGN_UTILS_HPP_INCLUDE
#define UITSL_UTILITY_ASSIGN_UTILS_HPP_INCLUDE

#include <functional>
#include <stddef.h>

namespace uitsl {

template<typename RETURN_TYPE>
struct AssignIntegrated {
  RETURN_TYPE operator()(const size_t & node_id) {
    return 0;
  }
};

template<typename RETURN_TYPE>
struct AssignSegregated {

  RETURN_TYPE operator()(const size_t & node_id) {
    return node_id;
  }

};


template<typename RETURN_TYPE>
struct AssignContiguously {

  const size_t num_groups;
  const size_t num_items;

  AssignContiguously(
    const size_t num_groups_,
    const size_t num_items_
  ) : num_groups(num_groups_)
  , num_items(num_items_)
  { ; }

  RETURN_TYPE operator()(const size_t & node_id) {
    return (node_id * num_groups / num_items) % num_groups;
  }

};

template<typename RETURN_TYPE>
struct AssignRoundRobin {

  const size_t num_groups;
  const size_t chunk;

  AssignRoundRobin(
    const size_t num_groups_,
    const size_t chunk_=1
  ) : num_groups(num_groups_)
  , chunk(chunk_)
  { ; }

  RETURN_TYPE operator()(const size_t & node_id) {
    return node_id / chunk % num_groups;
  }

};

} // namespace uitsl
// TODO assign_randomly
// make a vector of IDs, shuffle it, capture it,
// then return result of indexing into it

// TODO assign_chunkily (rename)
// arrange into n-dimensional volume
// then divvy into n-dimensional subcubes
// (special case of assign_contiguously)

#endif // #ifndef UITSL_UTILITY_ASSIGN_UTILS_HPP_INCLUDE