Program Listing for File mapping_utils.hpp

Return to documentation for file (include/uitsl/math/mapping_utils.hpp)

#pragma once
#ifndef UITSL_MATH_MAPPING_UTILS_HPP_INCLUDE
#define UITSL_MATH_MAPPING_UTILS_HPP_INCLUDE

#include <cmath>

#include "../../../third-party/Empirical/source/base/vector.h"

using Point = emp::vector<size_t>;
using Dims = emp::vector<size_t>;

namespace uitsl {

size_t linear_encode(const Point& p, const Dims& dims) {
    size_t mx = 1;
    size_t encoded = 0;
    for (size_t i = 0; i < dims.size(); ++i) {
        encoded += p[i] * mx;
        mx *= dims[i];
    }
    return encoded;
}

Point linear_decode(size_t r, const Dims& dims) {
    emp::vector<size_t> decoded;
    for (size_t i = 0; i < dims.size(); ++i) {
        decoded.push_back(r % dims[i]);
        r /= dims[i];
    }
    return decoded;
}

// TODO: add a Hilbert curve variant

} // namespace uitsl

#endif // #ifndef UITSL_MATH_MAPPING_UTILS_HPP_INCLUDE