23 #include "../base/vector.h" 24 #include "../tools/BitVector.h" 25 #include "../tools/math.h" 26 #include "../tools/memo_function.h" 27 #include "../tools/Random.h" 58 NKLandscape() : N(0), K(0), state_count(0), total_count(0), landscape() { ; }
68 , total_count(N * state_count)
83 for (
auto & ltable : landscape) {
84 ltable.resize(state_count);
85 for (
double & pos : ltable) {
95 state_count = emp::IntPow<size_t>(2,K+1);
96 total_count = N * state_count;
102 size_t GetN()
const {
return N; }
104 size_t GetK()
const {
return K; }
114 emp_assert(state < state_count, state, state_count);
115 return landscape[n][state];
121 double total = landscape[0][states[0]];
122 for (
size_t i = 1; i < N; i++) total +=
GetFitness(i,states[i]);
132 genome |= (genome << N);
135 size_t mask = emp::MaskLow<size_t>(K+1);
136 for (
size_t i = 0; i < N; i++) {
137 const size_t cur_val = (genome >> i).GetUInt(0) & mask;
138 const double cur_fit =
GetFitness(i, cur_val);
144 void SetState(
size_t n,
size_t state,
double in_fit) { landscape[n][state] = in_fit; }
147 for (
size_t i = 0; i < num_states; i++) {
170 : N(_N), K(_K), landscape(N), masks(N)
173 for (
size_t n = 0; n < N; n++) {
178 for (
size_t k = 0; k < K; k++) masks[n][(n+k)%N] = 1;
185 size_t GetN()
const {
return N; }
186 size_t GetK()
const {
return K; }
190 return landscape[n](state);
197 for (
size_t n = 0; n < N; n++) {
198 total += landscape[n](genome & masks[n]);
void Reset(emp::Random &random)
Randomize the landscape without changing the landscape size.
Definition: NK.h:78
double GetFitness(size_t n, size_t state) const
Definition: NK.h:113
double GetFitness(const BitVector &genome) const
Definition: NK.h:192
NKLandscape(size_t _N, size_t _K, emp::Random &random)
Definition: NK.h:65
double GetFitness(std::vector< size_t > states) const
Get the fitness of a whole bitstring.
Definition: NK.h:119
static constexpr TYPE IntPow(TYPE base, TYPE exp)
A fast method for calculating exponents for int types.
Definition: math.h:163
BitVector & Resize(size_t new_bits)
Resize this BitVector to have the specified number of bits.
Definition: BitVector.h:297
A versatile and non-patterned pseudo-random-number generator (Mersenne Twister).
Definition: ce_random.h:52
A drop-in replacement for std::vector<bool>, but with extra bitwise logic features.
Definition: BitVector.h:39
void Config(size_t _N, size_t _K, emp::Random &random)
Configure for new values of N and K.
Definition: NK.h:92
NKLandscape()
Definition: NK.h:58
size_t GetStateCount() const
Get the number of posssible states for a given site.
Definition: NK.h:106
constexpr uint32_t GetUInt(const uint32_t max)
Definition: ce_random.h:191
NKLandscape & operator=(const NKLandscape &)=delete
void SetState(size_t n, size_t state, double in_fit)
Definition: NK.h:144
size_t GetTotalCount() const
Definition: NK.h:109
void RandomizeStates(Random &random, size_t num_states=1)
Definition: NK.h:146
constexpr double GetDouble()
Definition: ce_random.h:166
~NKLandscapeMemo()
Definition: NK.h:181
size_t GetK() const
Definition: NK.h:186
void resize(size_t new_size)
Definition: vector.h:161
size_t GetN() const
Definition: NK.h:185
~NKLandscape()
Definition: NK.h:73
If we are in emscripten, make sure to include the header.
Definition: array.h:37
Build a debug wrapper emp::vector around std::vector.
Definition: vector.h:42
#define emp_assert(...)
Definition: assert.h:199
double GetFitness(size_t n, const BitVector &state) const
Definition: NK.h:188
double GetFitness(BitVector genome) const
Get the fitness of a whole bitstring (pass by value so can be modified.)
Definition: NK.h:127
size_t GetN() const
Returns N.
Definition: NK.h:102
size_t GetSize() const
How many bits do we currently have?
Definition: BitVector.h:368
size_t GetK() const
Returns K.
Definition: NK.h:104
NKLandscapeMemo(size_t _N, size_t _K, emp::Random &random)
Definition: NK.h:169