67 lines
1.9 KiB
C++
67 lines
1.9 KiB
C++
#include <cassert>
|
|
#include <cstdlib>
|
|
#include <ctime>
|
|
|
|
#include "chain-random-walk.h"
|
|
|
|
namespace {
|
|
constexpr int default_size = 7;
|
|
constexpr int default_steps = 100000000;
|
|
constexpr int outlines = 25;
|
|
}
|
|
|
|
/* first argument: array size
|
|
* second argument: number of steps
|
|
*/
|
|
int main(int argc, char** argv)
|
|
{
|
|
long size = default_size;
|
|
if(argc > 1) size = std::atol(argv[1]);
|
|
assert(size > 0);
|
|
|
|
long steps = default_steps;
|
|
if(argc > 2) steps = std::atol(argv[2]);
|
|
assert(steps > 0);
|
|
|
|
long outfreq = steps / outlines;
|
|
if(outfreq < 1) outfreq = 1;
|
|
|
|
/* the configuration is given by an array of float numbers */
|
|
float* present_configuration = new float[size]();
|
|
|
|
/* store the one with greatest deviation between min and max element */
|
|
float* extreme_configuration = present_configuration;
|
|
float extreme_elongation = 0.0;
|
|
double el_sum = 0.0;
|
|
double el_avg = 0.0;
|
|
|
|
std::srand(std::time(nullptr)); // initialize the random number generator
|
|
|
|
for(long i = 0; i < steps; i++)
|
|
{
|
|
if(i % outfreq == 0)
|
|
crw::output(i, size, present_configuration, extreme_configuration, el_avg);
|
|
|
|
/* here we are calling the random walk step;
|
|
* this returns a new configuration (float array) on the heap
|
|
*/
|
|
|
|
// Simple fix to memleak:
|
|
float* old_configuration = present_configuration;
|
|
present_configuration = crw::step(size, present_configuration);
|
|
delete[] old_configuration;
|
|
float present_elongation = crw::elongation(size, present_configuration);
|
|
|
|
if(present_elongation > extreme_elongation)
|
|
{
|
|
extreme_configuration = present_configuration;
|
|
extreme_elongation = present_elongation;
|
|
}
|
|
el_sum += present_elongation;
|
|
el_avg = el_sum / (i + 1.0);
|
|
}
|
|
crw::output(steps, size, present_configuration, extreme_configuration, el_avg);
|
|
|
|
delete[] present_configuration;
|
|
}
|