Compare commits

..

2 Commits
c ... main

Author SHA1 Message Date
323e821344 Stash 2023-02-19 16:52:56 +00:00
0ae7892998 A lot of shit you don't want 2023-02-17 15:38:16 +00:00
12 changed files with 3336 additions and 1159 deletions

3
.gitignore vendored
View File

@ -110,6 +110,3 @@ fabric.properties
# Android studio 3.1+ serialized cache file
.idea/caches/build_file_checksums.ser
/run
*.jl

View File

@ -4,43 +4,96 @@
#include "DLASystem.h"
using std::cout;
using std::endl;
#include <utility>
// this function gets called every step,
// if there is an active particle then it gets moved,
// if not then add a particle
void DLASystem::update() {
this->frame++;
bool DLASystem::Update() {
if (lastParticleIsActive == 1) {
moveLastParticle();
} else if (this->particleList.size() < (size_t) endNum) {
} else if (numParticles < endNum) {
addParticleOnAddCircle();
setParticleActive();
} else {
this->running = false;
return false;
}
return true;
}
void DLASystem::clearParticles() {
// delete particles and the particle list
for (int i = 0; i < numParticles; i++) {
delete particleList[i];
}
particleList.clear();
numParticles = 0;
}
// remove any existing particles and setup initial condition
void DLASystem::Reset() {
// stop running
running = 0;
clearParticles();
lastParticleIsActive = 0;
// set the grid to zero
for (int i = 0; i < gridSize; i++) {
for (int j = 0; j < gridSize; j++) {
grid[i][j] = 0;
}
}
// setup initial condition and parameters
addCircle = 10;
killCircle = 2.0 * addCircle;
clusterRadius = 0.0;
// add a single particle at the origin
double pos[] = {0.0, 0.0};
addParticle(pos);
// set the view
int InitialViewSize = 40;
setViewSize(InitialViewSize);
}
// set the value of a grid cell for a particular position
// note the position has the initial particle at (0,0)
// but this corresponds to the middle of the grid array ie grid[ halfGrid ][ halfGrid ]
void DLASystem::setGrid(std::array<double, 2> pos, int val) {
*index_grid(pos) = val;
void DLASystem::setGrid(double pos[], int val) {
int halfGrid = gridSize / 2;
grid[(int) (pos[0] + halfGrid)][(int) (pos[1] + halfGrid)] = val;
}
// read the grid cell for a given position
int DLASystem::readGrid(std::array<double, 2> pos) {
return *index_grid(pos);
int DLASystem::readGrid(double pos[]) {
int halfGrid = gridSize / 2;
return grid[(int) (pos[0] + halfGrid)][(int) (pos[1] + halfGrid)];
}
// check if the cluster is big enough and we should stop:
// to be safe, we need the killCircle to be at least 2 less than the edge of the grid
int DLASystem::checkStop() {
if (killCircle + 2 >= gridSize / 2) {
pauseRunning();
cout << "STOP" << endl;
// glutPostRedisplay(); // update display
return 1;
} else return 0;
}
// add a particle to the system at a specific position
void DLASystem::addParticle(std::array<double, 2> pos) {
void DLASystem::addParticle(double pos[]) {
// create a new particle
auto *p = new Particle(pos);
Particle *p = new Particle(pos);
// push_back means "add this to the end of the list"
particleList.push_back(p);
numParticles++;
// pos coordinates should be -gridSize/2 < x < gridSize/2
setGrid(pos, 1);
@ -50,19 +103,20 @@ void DLASystem::addParticle(std::array<double, 2> pos) {
// if we hit an occupied site then we do nothing except print a message
// (this should never happen)
void DLASystem::addParticleOnAddCircle() {
double pos[2];
double theta = rgen.random01() * 2 * M_PI;
std::array<double, 2> pos{ceil(addCircle * cos(theta)), ceil(addCircle * sin(theta))};
if (readGrid(pos) == 0) {
pos[0] = ceil(addCircle * cos(theta));
pos[1] = ceil(addCircle * sin(theta));
if (readGrid(pos) == 0)
addParticle(pos);
} else {
else
cout << "FAIL " << pos[0] << " " << pos[1] << endl;
}
}
// send back the position of a neighbour of a given grid cell
// NOTE: there is no check that the neighbour is inside the grid,
// this has to be done separately...
void DLASystem::setPosNeighbour(std::array<double, 2> &setpos, const std::array<double, 2> pos, int val) {
void DLASystem::setPosNeighbour(double setpos[], double pos[], int val) {
switch (val) {
case 0:
setpos[0] = pos[0] + 1.0;
@ -83,68 +137,95 @@ void DLASystem::setPosNeighbour(std::array<double, 2> &setpos, const std::array<
}
}
// if the view is smaller than the kill circle then increase the view area (zoom out)
void DLASystem::updateViewSize() {
double mult = 1.2;
if (viewSize < 2.0 * killCircle) {
setViewSize(viewSize * mult);
}
}
// set the view to be the size of the add circle (ie zoom in on the cluster)
void DLASystem::viewAddCircle() {
setViewSize(2.0 * addCircle); // factor of 2 is to go from radius to diameter
}
// when we add a particle to the cluster, we should update the cluster radius
// and the sizes of the addCircle and the killCircle
void DLASystem::updateClusterRadius(std::array<double, 2> pos) {
double newRadius = distanceFromOrigin(pos);
if (newRadius > clusterRadius) {
clusterRadius = newRadius;
void DLASystem::updateClusterRadius(double pos[]) {
double rr = distanceFromOrigin(pos);
if (rr > clusterRadius) {
clusterRadius = rr;
// this is how big addCircle is supposed to be:
// either 20% more than cluster radius, or at least 5 bigger.
double check = clusterRadius * addRatio;
if (check < clusterRadius + 5) {
if (check < clusterRadius + 5)
check = clusterRadius + 5;
}
// if it is smaller then update everything...
if (addCircle < check) {
addCircle = check;
killCircle = killRatio * addCircle;
updateViewSize();
}
if (killCircle + 2 >= gridSize / 2) {
std::cerr << "Early Exit" << endl;
this->running = false;
}
checkStop();
}
}
// make a random move of the last particle in the particleList
void DLASystem::moveLastParticle() {
int direction = rgen.randomInt(4); // pick a random number in the range 0-3, which direction do we hop?
std::array<double, 2> newpos{};
int rr = rgen.randomInt(4); // pick a random number in the range 0-3, which direction do we hop?
double newpos[2];
Particle *lastP = particleList[this->particleList.size() - 1];
Particle *lastP = particleList[numParticles - 1];
setPosNeighbour(newpos, lastP->pos, direction);
setPosNeighbour(newpos, lastP->pos, rr);
if (distanceFromOrigin(newpos) > killCircle) {
//cout << "#deleting particle" << endl;
setGrid(lastP->pos, 0);
particleList.pop_back(); // remove particle from particleList
numParticles--;
setParticleInactive();
} else if (readGrid(newpos) == 0) {
}
// check if destination is empty
else if (readGrid(newpos) == 0) {
setGrid(lastP->pos, 0); // set the old grid site to empty
// update the position
particleList[this->particleList.size() - 1]->pos[0] = newpos[0];
particleList[this->particleList.size() - 1]->pos[1] = newpos[1];
particleList[numParticles - 1]->pos[0] = newpos[0];
particleList[numParticles - 1]->pos[1] = newpos[1];
setGrid(lastP->pos, 1); // set the new grid site to be occupied
// check if we stick
if (checkStick() && this->rgen.random01() <= this->stickProbability) {
this->csv_out << frame << "," << lastP->pos[0] << "," << lastP->pos[1] << endl;
if (checkStick()) {
this->csv_out << newpos[0] << "," << newpos[1] << "\n";
this->csv_out.flush();
//cout << "stick" << endl;
setParticleInactive(); // make the particle inactive (stuck)
updateClusterRadius(lastP->pos); // update the cluster radius, addCircle, etc.
if (numParticles % 100 == 0 && logfile.is_open()) {
logfile << numParticles << " " << clusterRadius << endl;
}
}
} else {
// if we get to here then we are trying to move to an occupied site
// (this should never happen as long as the sticking probability is 1.0)
cout << "reject " << rr << endl;
cout << lastP->pos[0] << " " << lastP->pos[1] << endl;
//cout << newpos[0] << " " << newpos[1] << " " << (int)newpos[0] << endl;
//printOccupied();
}
}
// check if the last particle should stick (to a neighbour)
int DLASystem::checkStick() {
Particle *lastP = particleList[this->particleList.size() - 1];
Particle *lastP = particleList[numParticles - 1];
int result = 0;
// loop over neighbours
for (int i = 0; i < 4; i++) {
std::array<double, 2> checkpos{};
double checkpos[2];
setPosNeighbour(checkpos, lastP->pos, i);
// if the neighbour is occupied...
if (readGrid(checkpos) == 1)
@ -155,44 +236,42 @@ int DLASystem::checkStick() {
// constructor
DLASystem::DLASystem(Config config)
: stickProbability(config.stickProbability),
grid(gridSize * gridSize),
csv_out(std::move(config.csv)),
endNum(config.maxParticles),
frame(0),
running(false),
lastParticleIsActive(false) {
cout << "GridSize: " << gridSize << endl;
rgen.setSeed(config.seed);
DLASystem::DLASystem(ofstream out_file) {
cout << "creating system, gridSize " << gridSize << endl;
numParticles = 0;
endNum = 1000;
csv_out = std::move(out_file);
/*
* Handle grid data structure.
* */
// Add particle to the centre of the grid to start
std::array<double, 2> pos{0.0, 0.0};
addParticle(pos);
// allocate memory for the grid, remember to free the memory in destructor
grid = new int *[gridSize];
for (int i = 0; i < gridSize; i++) {
grid[i] = new int[gridSize];
}
slowNotFast = 0;
running = true;
// Make sure to include the central location in our csv.
this->csv_out << 0 << "," << 0 << "," << 0 << std::endl;
// reset initial parameters
Reset();
/*
* System behaviour parameters
* */
addRatio = 1.2; // how much bigger the addCircle should be, compared to cluster radius
killRatio = 1.7; // how much bigger is the killCircle, compared to the addCircle
addCircle = 10;
killCircle = 2.0 * addCircle;
clusterRadius = 0.0;
// this opens a logfile, if we want to...
//logfile.open("opfile.txt");
}
// destructor
DLASystem::~DLASystem() {
// strictly we should not print inside the destructor but never mind...
cout << "deleting system" << endl;
// delete the particles
particleList.clear();
clearParticles();
// delete the grid
for (int i = 0; i < gridSize; i++)
delete[] grid[i];
delete[] grid;
if (csv_out.is_open()) {
csv_out.flush();
csv_out.close();
if (this->csv_out.is_open()) {
this->csv_out.close();
}
}

View File

@ -2,12 +2,12 @@
#include <iostream>
#include <fstream>
#include <cstdio>
#include <stdio.h>
#include <vector>
#define _USE_MATH_DEFINES
#include <cmath>
#include <math.h>
#include <random>
#include <string>
#include <sstream>
@ -15,21 +15,17 @@
#include "Particle.h"
#include "rnd.h"
class Config {
public:
int seed;
double stickProbability;
std::ofstream csv;
int maxParticles;
using namespace std;
Config(int argc, char **argv);
};
class DLASystem {
private:
// these are private variables and functions that the user will not see
public:
// list of particles
std::vector<Particle *> particleList;
vector<Particle *> particleList;
int numParticles;
// delete particles and clear the particle list
void clearParticles();
// size of cluster
double clusterRadius;
@ -37,17 +33,21 @@ private:
double addCircle;
double killCircle;
double stickProbability;
ofstream csv_out;
// size of grid
static const int gridSize = 1600;
std::vector<int> grid;
int **grid; // this will be a 2d array that stores whether each site is occupied
// the window draws only part of the grid, viewSize controls how much...
double viewSize;
double drawScale;
// random number generator, class name is rnd, instance is rgen
rnd rgen;
// output file (not used at the moment)
std::ofstream csv_out;
ofstream logfile;
// number of particles at which the simulation will stop
// (the value is set in constructor)
@ -57,52 +57,77 @@ private:
double addRatio; // how much bigger the addCircle should be, compared to cluster radius
double killRatio; // how much bigger is the killCircle, compared to the addCircle
int frame;
int *index_grid(std::array<double, 2> pos) {
int halfGrid = gridSize / 2;
int i = (int) (pos[0] + halfGrid);
int j = (int) (pos[1] + halfGrid);
int ij = i * gridSize + j;
return &grid[ij];
}
public:
// these are public variables and functions
// update the system: if there is an active particle then move it,
// else create a new particle (on the adding circle)
void update();
bool Update();
// draw particles as squares
void DrawSquares();
// is the simulation running (1) or paused (0) ?
bool running;
int running;
// slowNotFast is +1 for slow running, 0 for fast
int slowNotFast;
// lastParticleIsActive is +1 if there is an active particle in the system, otherwise 0
int lastParticleIsActive;
// constructor
explicit DLASystem(Config config);
DLASystem(ofstream output);
// destructor
~DLASystem();
// delete all particles and reset
void Reset();
// this sets the seed for the random numbers
void setSeed(int s) { rgen.setSeed(s); }
void setRunning() { running = true; }
// check whether we should stop (eg the cluster has reached the edge of the grid)
int checkStop();
void pauseRunning() { running = false; }
// stop/start the algorithm
void setRunning() { if (checkStop() == 0) running = 1; }
void pauseRunning() { running = 0; }
// set whether it runs fast or slow
void setSlow() { slowNotFast = 1; }
void setFast() { slowNotFast = 0; }
void setSuperFast() { slowNotFast = -1; }
// set which part of the grid is visible on the screen
// basically the screen shows co-ordinates -vv < x < vv
// where vv is the input value
void setViewSize(double vv) {
viewSize = vv;
drawScale = 2.0 / viewSize;
}
// if the killcircle is almost as big as the view then increase the view
void updateViewSize();
// set the view to be the approx size of the addCircle
void viewAddCircle();
// if pos is outside the cluster radius then set clusterRadius to be the distance to pos.
void updateClusterRadius(std::array<double, 2> pos);
void updateClusterRadius(double pos[]);
// set and read grid entries associated with a given position
void setGrid(std::array<double, 2> pos, int val);
void setGrid(double pos[], int val);
int readGrid(std::array<double, 2> pos);
int readGrid(double pos[]);
// return the distance of a given point from the origin
double distanceFromOrigin(std::array<double, 2> pos) {
double distanceFromOrigin(double pos[]) {
return sqrt(pos[0] * pos[0] + pos[1] * pos[1]);
}
@ -112,14 +137,14 @@ public:
void setParticleInactive() { lastParticleIsActive = 0; }
// add a particle at pos
void addParticle(std::array<double, 2> pos);
void addParticle(double pos[]);
// add a particle at a random point on the addCircle
void addParticleOnAddCircle();
// assign setpos to the position of a neighbour of pos
// which neighbour we look at is determined by val (=0,1,2,3)
void setPosNeighbour(std::array<double, 2> &setpos, std::array<double, 2> pos, int val);
void setPosNeighbour(double setpos[], double pos[], int val);
// this attempts to move the last particle in the List to a random neighbour
// if the neighbour is occupied then nothing happens

View File

@ -14,7 +14,7 @@ CXXFLAGS = -Wall -Wextra -g -O0 -std=c++20 -stdlib=libc++
IFLAGS = -I/usr/local/include -I/usr/include
LFLAGS = -L/usr/local/lib -lm
LFLAGS = -L/usr/local/lib -lm -framework OpenGL -framework GLUT
# ------------------------------------------
# FOR GENERIC MAKEFILE:

View File

@ -1,14 +1,22 @@
#pragma once
#include <array>
class Particle {
public:
static const int dim = 2; // we are in two dimensions
std::array<double, dim> pos{};
double *pos; // pointer to an array of size dim, to store the position
// constructor, with a specified initial pos
explicit Particle(std::array<double, dim> pos) {
this->pos[0] = pos[0];
this->pos[1] = pos[1];
// default constructor
Particle() {
pos = new double[dim];
}
// constructor, with a specified initial position
Particle(double set_pos[]) {
pos = new double[dim];
for (int d = 0; d < dim; d++)
pos[d] = set_pos[d];
}
// destructor
~Particle() { delete[] pos; }
};

2087
example.csv Normal file

File diff suppressed because one or more lines are too long

View File

@ -1,3 +0,0 @@
#!/usr/bin/env bash
parallel "../run {1} {2} {3}" ::: $(seq 0 10) ::: $(seq 0 0.05 1) ::: $(seq 2000 1000 10000)

View File

@ -1,58 +1,43 @@
#include <iostream>
#include <vector>
#include <cmath>
#include <string>
#include "DLASystem.h"
using std::cout;
using std::endl;
using namespace std;
/*
* In a proper project I would write a better argument parser, don't care here, just exit with an error if it is wrong.
* */
Config::Config(int argc, char **argv) {
if (argc != 4) {
exit(1);
} else {
this->seed = std::stoi(argv[1]);
this->stickProbability = std::stod(argv[2]);
this->maxParticles = std::stoi(argv[3]);
// functions which are needed for openGL go into a namespace so that we can identify them
namespace drawFuncs {
void handleKeypress(unsigned char key, int x, int y);
if (stickProbability <= 0 || stickProbability > 1) {
exit(1);
}
void display(void);
std::stringstream str;
// Ensure the output file name contains all information required to replicate data
str << "./out-" << seed << '-' << stickProbability << "-" << maxParticles << ".csv";
std::ofstream csv_out(str.str());
this->csv = std::move(csv_out);
void update(int val);
// Add headers to csv output
this->csv << "frame" << "," << "x" << "," << "y" << std::endl;
cout <<
"seed: " << seed << ", " <<
"stickProbability: " << stickProbability << ", " <<
"maxParticles: " << maxParticles <<
endl;
}
void introMessage();
}
// this is a global pointer, which is how we access the system itself
DLASystem *sys;
int main(int argc, char **argv) {
Config config(argc, argv);
const auto seed = std::stoi(argv[1]);
char buffer[20];
snprintf(buffer, 20, "seed-%i.csv", seed);
const auto p1 = std::chrono::system_clock::now();
std::ofstream myfile;
myfile.open(buffer);
// Create the system
auto *sys = new DLASystem(std::move(config));
sys->setRunning();
// create the system
sys = new DLASystem(std::move(myfile));
/*
* NOTE: We run at max speed as rendering is handled by a different engine so we don't need to care.
* */
while (sys->running) {
sys->update();
// this is the seed for the random numbers
cout << "setting seed " << seed << endl;
sys->setSeed(seed);
while (sys->Update()) {
}
cout << sys->numParticles;
return 0;
}

File diff suppressed because it is too large Load Diff

BIN
run Executable file

Binary file not shown.

999
seed-2.csv Normal file
View File

@ -0,0 +1,999 @@
0,-1
-1,0
-1,1
0,-2
0,-3
-1,-2
1,-1
0,1
-1,-3
0,2
0,3
0,4
-1,3
1,-3
1,3
2,-1
-1,4
2,-3
-2,4
2,-4
0,-4
-3,4
3,-4
-4,4
-1,-1
0,-5
0,5
-4,5
4,-4
2,3
-5,4
0,-6
2,4
1,5
3,4
-5,5
3,3
3,5
5,-4
2,-5
5,-3
0,-7
6,-4
5,-2
1,-7
7,-4
4,5
7,-5
6,-2
0,-8
3,6
-4,6
0,6
-2,-3
-1,-6
4,3
-1,-8
-4,7
-2,-4
-5,3
-4,8
-1,-9
3,7
3,8
4,6
8,-5
-4,9
4,2
5,6
7,-2
7,-6
-6,3
-1,-10
-5,9
-1,-11
-3,8
-2,-11
5,3
-5,10
9,-5
-5,11
-3,-3
10,-5
8,-2
-5,12
-2,-9
4,8
10,-6
-1,-12
-3,-11
11,-6
12,-6
-3,-12
-6,2
-4,-3
-7,3
0,-12
2,8
6,6
-5,8
-7,4
-6,10
1,-12
5,8
12,-5
-2,-6
4,9
-4,-11
2,-12
2,9
-6,12
2,-6
-6,9
-3,-6
12,-4
-5,-11
4,-5
7,6
11,-4
-2,-12
-1,-13
-8,3
-7,12
-5,-10
12,-7
2,-13
-7,13
-6,13
1,8
-9,3
-10,3
6,8
12,-3
6,9
-6,5
13,-7
6,10
-10,2
-5,13
8,6
-6,8
11,-7
-7,8
8,-6
-6,14
-10,4
-8,13
6,11
-11,3
2,-11
-5,14
5,11
14,-7
3,-11
12,-2
-6,1
-12,3
14,-8
2,-14
15,-8
-12,4
-2,-13
6,12
15,-9
15,-7
-4,14
9,6
13,-4
-4,15
-3,15
13,-2
14,-9
15,-10
-13,3
16,-10
9,7
2,-15
-14,3
3,-15
-8,12
9,8
13,-1
17,-10
-15,3
-12,5
10,7
14,-4
11,7
-6,-11
-6,15
-6,-12
-8,14
18,-10
-7,-11
17,-11
3,-13
11,6
-14,2
12,6
-9,14
12,-8
-14,4
-5,15
-9,15
14,-1
-16,3
17,-12
-6,-13
-9,16
-8,16
13,0
15,-11
14,0
-6,16
-7,-13
-6,-10
14,1
-16,4
-7,-14
17,-13
-5,16
-5,-13
-8,17
-16,2
-16,5
-7,-15
-16,1
-5,-14
18,-13
-8,-15
18,-14
10,8
19,-13
-9,17
-6,17
-13,5
-2,15
-16,0
-17,1
15,-12
13,6
-8,8
12,5
14,-12
-18,1
19,-14
-8,18
-17,3
7,12
-19,1
-8,-13
2,-16
-5,-15
-20,1
13,-12
-8,-11
18,-15
-7,-16
7,13
-9,-15
6,13
15,-6
17,-15
-8,9
19,-15
-17,5
19,-16
-9,18
19,-17
-9,19
19,-12
-9,-16
19,-18
-10,-15
20,-18
21,-18
3,-16
7,14
15,1
-12,2
21,-17
-9,-13
15,-1
-7,-17
-13,6
8,12
21,-16
-2,14
16,1
7,15
10,9
-20,0
19,-11
-10,-13
17,-16
11,9
9,12
3,-17
8,15
7,16
-20,2
13,7
-7,1
-2,16
-6,-17
22,-18
22,-19
17,1
-17,6
-8,-17
14,7
-10,5
7,17
15,2
8,16
23,-19
9,15
-21,0
18,-18
21,-19
-1,16
-9,-11
-8,-10
24,-19
-17,7
18,-19
-21,-1
-11,-13
25,-19
-11,-15
17,2
9,16
26,-19
-7,18
25,-20
20,-11
-12,-15
-5,-17
26,-18
10,16
11,16
15,7
-10,-11
24,-18
-9,-17
7,18
-14,1
12,9
25,-21
26,-21
11,17
-10,16
-5,-9
-22,0
3,-18
-14,0
0,16
-8,19
-23,0
0,17
-23,-1
-10,19
-21,2
18,-20
-18,3
-24,-1
18,2
27,-18
-1,17
16,-6
26,-22
18,1
28,-18
26,-17
20,-10
17,-20
7,19
-17,8
6,19
21,-20
-18,5
0,18
-11,-16
18,3
-19,5
-10,20
27,-22
20,-20
-8,-18
-5,-18
19,3
-25,-1
29,-18
-11,-11
30,-18
-4,-18
-12,-16
8,19
-24,-2
20,3
1,18
-21,3
18,-21
-1,18
21,-11
8,20
-3,-18
-26,-1
20,4
16,-20
4,-15
31,-18
5,19
-8,20
26,-23
28,-22
-13,-15
-8,21
-18,8
28,-23
-17,9
-21,4
-26,0
18,4
-18,9
18,5
-3,-19
-1,19
29,-22
-13,-16
-24,-3
-11,20
-26,-2
-21,5
22,-11
10,17
11,18
-10,17
11,19
-12,20
21,4
7,20
18,6
-24,-4
17,0
12,16
-2,-19
30,-17
-16,9
29,-23
13,16
26,-24
-8,22
-8,23
21,3
-24,-5
-24,-6
8,21
-11,17
-11,2
-19,6
29,-21
18,-9
-13,-17
19,-21
-16,10
-14,-17
21,-21
-8,24
32,-18
32,-19
6,20
-9,24
-8,-9
18,-22
-12,17
-27,-2
26,-25
-20,-1
-8,25
-2,19
14,16
-9,25
22,-12
3,-19
-13,-18
-28,-2
-28,-1
-27,-3
18,-8
25,-22
24,-22
33,-18
-13,-14
-22,5
22,4
14,-13
-23,5
22,3
-28,-3
-29,-1
-19,9
9,20
-28,-4
23,3
-14,-14
29,-24
-26,1
-24,5
23,4
23,-22
-12,16
-15,-17
23,-11
-4,-19
9,21
32,-20
-4,-20
24,-11
33,-20
11,20
-26,2
15,16
30,-16
10,21
11,21
-9,-18
-24,6
34,-20
-29,-4
3,-20
-8,26
6,21
-8,-19
18,-23
32,-21
33,-17
29,-25
-15,-14
25,-25
-15,-18
-7,26
-12,-18
-2,20
-27,2
-24,7
29,-26
-8,27
32,-22
21,2
24,3
11,22
12,22
2,-20
25,-11
-7,27
29,-27
2,-21
30,-15
34,-18
-16,-17
33,-16
-15,-19
29,-15
-8,28
13,22
29,-28
-2,-18
-24,8
-28,-5
26,-11
6,22
17,-23
30,-27
-6,26
33,-22
-29,0
16,-23
31,-27
-15,-13
25,-26
-12,21
21,5
32,-23
-2,21
15,17
11,23
29,-29
1,-21
-18,0
18,-24
18,-25
12,10
15,18
-29,-2
-28,2
-16,-19
29,-14
30,-29
-9,28
-9,9
35,-18
-25,-6
14,22
-14,-19
-13,21
-8,29
14,23
6,23
17,-25
23,-23
25,-27
29,-30
13,23
36,-18
27,-11
-13,16
-9,29
-7,29
34,-16
-17,-19
-16,-14
-30,-4
29,-31
15,19
6,24
-30,-5
32,-24
34,-15
-16,-20
25,3
-17,-14
1,-22
-16,11
-7,-19
15,23
-20,9
21,1
-7,30
-24,9
15,15
29,-32
-24,10
35,-15
34,-14
-6,29
-29,2
-16,-21
13,24
15,-23
25,4
-18,-19
17,-26
-17,-21
35,-14
-30,-2
35,-20
-24,11
-31,-5
15,24
19,-25
32,-27
37,-18
15,25
16,17
-25,5
36,-15
16,-26
-16,-22
-16,-23
-17,-23
-25,11
31,-29
-29,3
28,-32
-4,-21
26,4
6,25
36,-20
-17,-15
26,5
-17,-22
-31,-2
29,-33
-14,21
-12,-19
-10,29
38,-18
-25,10
38,-17
20,-25
39,-18
33,-27
24,-27
33,-28
40,-18
-30,2
-30,-6
41,-18
33,-29
-5,29
26,6
42,-18
-24,-7
-15,-23
27,6
-16,-24
-7,31
-13,22
43,-18
27,7
36,-21
-11,29
30,-33
28,-33
15,-22
-26,11
-25,-7
34,-28
-18,-20
17,-27
29,-13
14,25
27,-10
28,7
-10,30
41,-17
-11,30
-6,31
27,8
-30,0
29,-12
-24,-8
39,-19
-27,11
16,25
33,-30
-15,21
29,-11
16,26
-27,10
42,-17
-30,-7
-18,-22
27,-33
5,25
41,-16
-19,-22
31,-33
-29,4
26,-33
43,-19
27,9
19,-26
33,-31
27,10
-32,-2
44,-19
-12,29
43,-20
-13,23
-31,2
43,-21
-27,12
44,-20
15,-26
30,-34
5,26
-32,-1
-15,-24
-18,-23
-15,22
-5,26
28,10
42,-16
-20,10
-13,29
17,26
-30,-8
-28,10
5,27
26,3
11,24
6,27
-24,-9
-16,-25
43,-16
-3,-21
-27,13
-16,22
-29,10
18,26
16,19
44,-18
-2,-21
-12,28
4,27
44,-21
45,-18
33,-32
4,28
46,-18
17,19
-28,13
16,-27
26,2
-27,14
27,11
46,-19
-28,14
-7,32
34,-32
46,-17
-10,31
-19,-19
-29,13
2,-22
17,-28
42,-15
-17,-25
16,27
16,28
29,-10
-32,2
18,25
19,26
-13,28
-33,-1
-14,-23
-8,-20
16,-28
37,-21
26,-34
-6,-19
17,28
20,26
16,29
-7,33
-14,28
34,-31
-26,14
28,-34
-17,-26
-13,27
45,-21
46,-16
24,-28
-32,-5
46,-21
43,-15
17,29
28,-35
47,-19
45,-22
17,-29
14,26
-33,2
-20,-19
-17,22
18,29
15,8
45,-23
14,27
-34,-1
-35,-1
-14,23
46,-15
-10,32
34,-33
-34,2
-5,-21
-32,-6
43,-14
-13,26
46,-14
47,-17
-20,-22
25,-34
-2,-22
28,-29
28,6
-31,-8
47,-20
-25,14
-13,-23
5,28
-31,-9
28,11
-8,-21
46,-23
17,20
-36,-1
-21,-22
-7,34
27,2
47,-23
-7,35
48,-17
35,-28
35,-31
-13,-24
48,-19
47,-14
49,-17
17,-30
33,-14
42,-14
27,12
43,-22
-12,30
27,-9
46,-24
-29,5
18,30
19,30
-6,35
16,-30
29,6
20,25
13,27
-37,-1
-12,31
47,-24
33,-33
-4,26
-33,-6
-32,-9
-15,28
21,26
48,-23
18,31
22,26
-9,32
-15,29
-34,1
47,-25
48,-14
18,20
18,32
49,-18
-38,-1
45,-14
42,-13
-18,-25
21,25
49,-23
-39,-1
-39,0
45,-24
49,-14
31,-34
31,-35
-39,1
-16,29
-18,-26
4,29
22,27
42,-12
28,-36
25,-35
-40,-1
15,-21
32,-35
49,-13
29,-9
27,1
50,-23
-15,30
-27,15
49,-22
18,33
-8,-22
49,-15
-5,35
-34,-6
-18,-27
16,15
18,34
17,34
23,26
50,-13
-16,30
16,-31
-41,-1
35,-27
-34,3
50,-17
33,-35
-27,16
-42,-1
-41,-2
27,13
-2,-23
14,28
15,-28
16,-32
14,-23
-26,16
-18,-28
1 0 -1
2 -1 0
3 -1 1
4 0 -2
5 0 -3
6 -1 -2
7 1 -1
8 0 1
9 -1 -3
10 0 2
11 0 3
12 0 4
13 -1 3
14 1 -3
15 1 3
16 2 -1
17 -1 4
18 2 -3
19 -2 4
20 2 -4
21 0 -4
22 -3 4
23 3 -4
24 -4 4
25 -1 -1
26 0 -5
27 0 5
28 -4 5
29 4 -4
30 2 3
31 -5 4
32 0 -6
33 2 4
34 1 5
35 3 4
36 -5 5
37 3 3
38 3 5
39 5 -4
40 2 -5
41 5 -3
42 0 -7
43 6 -4
44 5 -2
45 1 -7
46 7 -4
47 4 5
48 7 -5
49 6 -2
50 0 -8
51 3 6
52 -4 6
53 0 6
54 -2 -3
55 -1 -6
56 4 3
57 -1 -8
58 -4 7
59 -2 -4
60 -5 3
61 -4 8
62 -1 -9
63 3 7
64 3 8
65 4 6
66 8 -5
67 -4 9
68 4 2
69 5 6
70 7 -2
71 7 -6
72 -6 3
73 -1 -10
74 -5 9
75 -1 -11
76 -3 8
77 -2 -11
78 5 3
79 -5 10
80 9 -5
81 -5 11
82 -3 -3
83 10 -5
84 8 -2
85 -5 12
86 -2 -9
87 4 8
88 10 -6
89 -1 -12
90 -3 -11
91 11 -6
92 12 -6
93 -3 -12
94 -6 2
95 -4 -3
96 -7 3
97 0 -12
98 2 8
99 6 6
100 -5 8
101 -7 4
102 -6 10
103 1 -12
104 5 8
105 12 -5
106 -2 -6
107 4 9
108 -4 -11
109 2 -12
110 2 9
111 -6 12
112 2 -6
113 -6 9
114 -3 -6
115 12 -4
116 -5 -11
117 4 -5
118 7 6
119 11 -4
120 -2 -12
121 -1 -13
122 -8 3
123 -7 12
124 -5 -10
125 12 -7
126 2 -13
127 -7 13
128 -6 13
129 1 8
130 -9 3
131 -10 3
132 6 8
133 12 -3
134 6 9
135 -6 5
136 13 -7
137 6 10
138 -10 2
139 -5 13
140 8 6
141 -6 8
142 11 -7
143 -7 8
144 8 -6
145 -6 14
146 -10 4
147 -8 13
148 6 11
149 -11 3
150 2 -11
151 -5 14
152 5 11
153 14 -7
154 3 -11
155 12 -2
156 -6 1
157 -12 3
158 14 -8
159 2 -14
160 15 -8
161 -12 4
162 -2 -13
163 6 12
164 15 -9
165 15 -7
166 -4 14
167 9 6
168 13 -4
169 -4 15
170 -3 15
171 13 -2
172 14 -9
173 15 -10
174 -13 3
175 16 -10
176 9 7
177 2 -15
178 -14 3
179 3 -15
180 -8 12
181 9 8
182 13 -1
183 17 -10
184 -15 3
185 -12 5
186 10 7
187 14 -4
188 11 7
189 -6 -11
190 -6 15
191 -6 -12
192 -8 14
193 18 -10
194 -7 -11
195 17 -11
196 3 -13
197 11 6
198 -14 2
199 12 6
200 -9 14
201 12 -8
202 -14 4
203 -5 15
204 -9 15
205 14 -1
206 -16 3
207 17 -12
208 -6 -13
209 -9 16
210 -8 16
211 13 0
212 15 -11
213 14 0
214 -6 16
215 -7 -13
216 -6 -10
217 14 1
218 -16 4
219 -7 -14
220 17 -13
221 -5 16
222 -5 -13
223 -8 17
224 -16 2
225 -16 5
226 -7 -15
227 -16 1
228 -5 -14
229 18 -13
230 -8 -15
231 18 -14
232 10 8
233 19 -13
234 -9 17
235 -6 17
236 -13 5
237 -2 15
238 -16 0
239 -17 1
240 15 -12
241 13 6
242 -8 8
243 12 5
244 14 -12
245 -18 1
246 19 -14
247 -8 18
248 -17 3
249 7 12
250 -19 1
251 -8 -13
252 2 -16
253 -5 -15
254 -20 1
255 13 -12
256 -8 -11
257 18 -15
258 -7 -16
259 7 13
260 -9 -15
261 6 13
262 15 -6
263 17 -15
264 -8 9
265 19 -15
266 -17 5
267 19 -16
268 -9 18
269 19 -17
270 -9 19
271 19 -12
272 -9 -16
273 19 -18
274 -10 -15
275 20 -18
276 21 -18
277 3 -16
278 7 14
279 15 1
280 -12 2
281 21 -17
282 -9 -13
283 15 -1
284 -7 -17
285 -13 6
286 8 12
287 21 -16
288 -2 14
289 16 1
290 7 15
291 10 9
292 -20 0
293 19 -11
294 -10 -13
295 17 -16
296 11 9
297 9 12
298 3 -17
299 8 15
300 7 16
301 -20 2
302 13 7
303 -7 1
304 -2 16
305 -6 -17
306 22 -18
307 22 -19
308 17 1
309 -17 6
310 -8 -17
311 14 7
312 -10 5
313 7 17
314 15 2
315 8 16
316 23 -19
317 9 15
318 -21 0
319 18 -18
320 21 -19
321 -1 16
322 -9 -11
323 -8 -10
324 24 -19
325 -17 7
326 18 -19
327 -21 -1
328 -11 -13
329 25 -19
330 -11 -15
331 17 2
332 9 16
333 26 -19
334 -7 18
335 25 -20
336 20 -11
337 -12 -15
338 -5 -17
339 26 -18
340 10 16
341 11 16
342 15 7
343 -10 -11
344 24 -18
345 -9 -17
346 7 18
347 -14 1
348 12 9
349 25 -21
350 26 -21
351 11 17
352 -10 16
353 -5 -9
354 -22 0
355 3 -18
356 -14 0
357 0 16
358 -8 19
359 -23 0
360 0 17
361 -23 -1
362 -10 19
363 -21 2
364 18 -20
365 -18 3
366 -24 -1
367 18 2
368 27 -18
369 -1 17
370 16 -6
371 26 -22
372 18 1
373 28 -18
374 26 -17
375 20 -10
376 17 -20
377 7 19
378 -17 8
379 6 19
380 21 -20
381 -18 5
382 0 18
383 -11 -16
384 18 3
385 -19 5
386 -10 20
387 27 -22
388 20 -20
389 -8 -18
390 -5 -18
391 19 3
392 -25 -1
393 29 -18
394 -11 -11
395 30 -18
396 -4 -18
397 -12 -16
398 8 19
399 -24 -2
400 20 3
401 1 18
402 -21 3
403 18 -21
404 -1 18
405 21 -11
406 8 20
407 -3 -18
408 -26 -1
409 20 4
410 16 -20
411 4 -15
412 31 -18
413 5 19
414 -8 20
415 26 -23
416 28 -22
417 -13 -15
418 -8 21
419 -18 8
420 28 -23
421 -17 9
422 -21 4
423 -26 0
424 18 4
425 -18 9
426 18 5
427 -3 -19
428 -1 19
429 29 -22
430 -13 -16
431 -24 -3
432 -11 20
433 -26 -2
434 -21 5
435 22 -11
436 10 17
437 11 18
438 -10 17
439 11 19
440 -12 20
441 21 4
442 7 20
443 18 6
444 -24 -4
445 17 0
446 12 16
447 -2 -19
448 30 -17
449 -16 9
450 29 -23
451 13 16
452 26 -24
453 -8 22
454 -8 23
455 21 3
456 -24 -5
457 -24 -6
458 8 21
459 -11 17
460 -11 2
461 -19 6
462 29 -21
463 18 -9
464 -13 -17
465 19 -21
466 -16 10
467 -14 -17
468 21 -21
469 -8 24
470 32 -18
471 32 -19
472 6 20
473 -9 24
474 -8 -9
475 18 -22
476 -12 17
477 -27 -2
478 26 -25
479 -20 -1
480 -8 25
481 -2 19
482 14 16
483 -9 25
484 22 -12
485 3 -19
486 -13 -18
487 -28 -2
488 -28 -1
489 -27 -3
490 18 -8
491 25 -22
492 24 -22
493 33 -18
494 -13 -14
495 -22 5
496 22 4
497 14 -13
498 -23 5
499 22 3
500 -28 -3
501 -29 -1
502 -19 9
503 9 20
504 -28 -4
505 23 3
506 -14 -14
507 29 -24
508 -26 1
509 -24 5
510 23 4
511 23 -22
512 -12 16
513 -15 -17
514 23 -11
515 -4 -19
516 9 21
517 32 -20
518 -4 -20
519 24 -11
520 33 -20
521 11 20
522 -26 2
523 15 16
524 30 -16
525 10 21
526 11 21
527 -9 -18
528 -24 6
529 34 -20
530 -29 -4
531 3 -20
532 -8 26
533 6 21
534 -8 -19
535 18 -23
536 32 -21
537 33 -17
538 29 -25
539 -15 -14
540 25 -25
541 -15 -18
542 -7 26
543 -12 -18
544 -2 20
545 -27 2
546 -24 7
547 29 -26
548 -8 27
549 32 -22
550 21 2
551 24 3
552 11 22
553 12 22
554 2 -20
555 25 -11
556 -7 27
557 29 -27
558 2 -21
559 30 -15
560 34 -18
561 -16 -17
562 33 -16
563 -15 -19
564 29 -15
565 -8 28
566 13 22
567 29 -28
568 -2 -18
569 -24 8
570 -28 -5
571 26 -11
572 6 22
573 17 -23
574 30 -27
575 -6 26
576 33 -22
577 -29 0
578 16 -23
579 31 -27
580 -15 -13
581 25 -26
582 -12 21
583 21 5
584 32 -23
585 -2 21
586 15 17
587 11 23
588 29 -29
589 1 -21
590 -18 0
591 18 -24
592 18 -25
593 12 10
594 15 18
595 -29 -2
596 -28 2
597 -16 -19
598 29 -14
599 30 -29
600 -9 28
601 -9 9
602 35 -18
603 -25 -6
604 14 22
605 -14 -19
606 -13 21
607 -8 29
608 14 23
609 6 23
610 17 -25
611 23 -23
612 25 -27
613 29 -30
614 13 23
615 36 -18
616 27 -11
617 -13 16
618 -9 29
619 -7 29
620 34 -16
621 -17 -19
622 -16 -14
623 -30 -4
624 29 -31
625 15 19
626 6 24
627 -30 -5
628 32 -24
629 34 -15
630 -16 -20
631 25 3
632 -17 -14
633 1 -22
634 -16 11
635 -7 -19
636 15 23
637 -20 9
638 21 1
639 -7 30
640 -24 9
641 15 15
642 29 -32
643 -24 10
644 35 -15
645 34 -14
646 -6 29
647 -29 2
648 -16 -21
649 13 24
650 15 -23
651 25 4
652 -18 -19
653 17 -26
654 -17 -21
655 35 -14
656 -30 -2
657 35 -20
658 -24 11
659 -31 -5
660 15 24
661 19 -25
662 32 -27
663 37 -18
664 15 25
665 16 17
666 -25 5
667 36 -15
668 16 -26
669 -16 -22
670 -16 -23
671 -17 -23
672 -25 11
673 31 -29
674 -29 3
675 28 -32
676 -4 -21
677 26 4
678 6 25
679 36 -20
680 -17 -15
681 26 5
682 -17 -22
683 -31 -2
684 29 -33
685 -14 21
686 -12 -19
687 -10 29
688 38 -18
689 -25 10
690 38 -17
691 20 -25
692 39 -18
693 33 -27
694 24 -27
695 33 -28
696 40 -18
697 -30 2
698 -30 -6
699 41 -18
700 33 -29
701 -5 29
702 26 6
703 42 -18
704 -24 -7
705 -15 -23
706 27 6
707 -16 -24
708 -7 31
709 -13 22
710 43 -18
711 27 7
712 36 -21
713 -11 29
714 30 -33
715 28 -33
716 15 -22
717 -26 11
718 -25 -7
719 34 -28
720 -18 -20
721 17 -27
722 29 -13
723 14 25
724 27 -10
725 28 7
726 -10 30
727 41 -17
728 -11 30
729 -6 31
730 27 8
731 -30 0
732 29 -12
733 -24 -8
734 39 -19
735 -27 11
736 16 25
737 33 -30
738 -15 21
739 29 -11
740 16 26
741 -27 10
742 42 -17
743 -30 -7
744 -18 -22
745 27 -33
746 5 25
747 41 -16
748 -19 -22
749 31 -33
750 -29 4
751 26 -33
752 43 -19
753 27 9
754 19 -26
755 33 -31
756 27 10
757 -32 -2
758 44 -19
759 -12 29
760 43 -20
761 -13 23
762 -31 2
763 43 -21
764 -27 12
765 44 -20
766 15 -26
767 30 -34
768 5 26
769 -32 -1
770 -15 -24
771 -18 -23
772 -15 22
773 -5 26
774 28 10
775 42 -16
776 -20 10
777 -13 29
778 17 26
779 -30 -8
780 -28 10
781 5 27
782 26 3
783 11 24
784 6 27
785 -24 -9
786 -16 -25
787 43 -16
788 -3 -21
789 -27 13
790 -16 22
791 -29 10
792 18 26
793 16 19
794 44 -18
795 -2 -21
796 -12 28
797 4 27
798 44 -21
799 45 -18
800 33 -32
801 4 28
802 46 -18
803 17 19
804 -28 13
805 16 -27
806 26 2
807 -27 14
808 27 11
809 46 -19
810 -28 14
811 -7 32
812 34 -32
813 46 -17
814 -10 31
815 -19 -19
816 -29 13
817 2 -22
818 17 -28
819 42 -15
820 -17 -25
821 16 27
822 16 28
823 29 -10
824 -32 2
825 18 25
826 19 26
827 -13 28
828 -33 -1
829 -14 -23
830 -8 -20
831 16 -28
832 37 -21
833 26 -34
834 -6 -19
835 17 28
836 20 26
837 16 29
838 -7 33
839 -14 28
840 34 -31
841 -26 14
842 28 -34
843 -17 -26
844 -13 27
845 45 -21
846 46 -16
847 24 -28
848 -32 -5
849 46 -21
850 43 -15
851 17 29
852 28 -35
853 47 -19
854 45 -22
855 17 -29
856 14 26
857 -33 2
858 -20 -19
859 -17 22
860 18 29
861 15 8
862 45 -23
863 14 27
864 -34 -1
865 -35 -1
866 -14 23
867 46 -15
868 -10 32
869 34 -33
870 -34 2
871 -5 -21
872 -32 -6
873 43 -14
874 -13 26
875 46 -14
876 47 -17
877 -20 -22
878 25 -34
879 -2 -22
880 28 -29
881 28 6
882 -31 -8
883 47 -20
884 -25 14
885 -13 -23
886 5 28
887 -31 -9
888 28 11
889 -8 -21
890 46 -23
891 17 20
892 -36 -1
893 -21 -22
894 -7 34
895 27 2
896 47 -23
897 -7 35
898 48 -17
899 35 -28
900 35 -31
901 -13 -24
902 48 -19
903 47 -14
904 49 -17
905 17 -30
906 33 -14
907 42 -14
908 27 12
909 43 -22
910 -12 30
911 27 -9
912 46 -24
913 -29 5
914 18 30
915 19 30
916 -6 35
917 16 -30
918 29 6
919 20 25
920 13 27
921 -37 -1
922 -12 31
923 47 -24
924 33 -33
925 -4 26
926 -33 -6
927 -32 -9
928 -15 28
929 21 26
930 48 -23
931 18 31
932 22 26
933 -9 32
934 -15 29
935 -34 1
936 47 -25
937 48 -14
938 18 20
939 18 32
940 49 -18
941 -38 -1
942 45 -14
943 42 -13
944 -18 -25
945 21 25
946 49 -23
947 -39 -1
948 -39 0
949 45 -24
950 49 -14
951 31 -34
952 31 -35
953 -39 1
954 -16 29
955 -18 -26
956 4 29
957 22 27
958 42 -12
959 28 -36
960 25 -35
961 -40 -1
962 15 -21
963 32 -35
964 49 -13
965 29 -9
966 27 1
967 50 -23
968 -15 30
969 -27 15
970 49 -22
971 18 33
972 -8 -22
973 49 -15
974 -5 35
975 -34 -6
976 -18 -27
977 16 15
978 18 34
979 17 34
980 23 26
981 50 -13
982 -16 30
983 16 -31
984 -41 -1
985 35 -27
986 -34 3
987 50 -17
988 33 -35
989 -27 16
990 -42 -1
991 -41 -2
992 27 13
993 -2 -23
994 14 28
995 15 -28
996 16 -32
997 14 -23
998 -26 16
999 -18 -28

1
seed-2.json Normal file

File diff suppressed because one or more lines are too long