diff --git a/.gitignore b/.gitignore index c49379b..85569c8 100644 --- a/.gitignore +++ b/.gitignore @@ -4,9 +4,12 @@ !*.hpp !*.sh !*.py +!*.i !Pipfile !Pipfile.lock !include/ !scripts/ !.gitignore + +sim.py diff --git a/.vscode/settings.json b/.vscode/settings.json index 541feb7..7645586 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -65,5 +65,6 @@ "map": "cpp", "list": "cpp", "sstream": "cpp" - } + }, + "C_Cpp.errorSquiggles": "Enabled" } \ No newline at end of file diff --git a/CMakeLists.txt b/CMakeLists.txt index faccaab..39f5126 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,24 +1,22 @@ cmake_minimum_required(VERSION 3.25) -project(test_econ_model) -execute_process(COMMAND bash ./scripts/setup-include.sh) -make_directory(bin) +project(sim_econ_model) include_directories(include/) -# fetch latest argparse -include(FetchContent) -FetchContent_Declare( - argparse - GIT_REPOSITORY https://github.com/p-ranav/argparse.git +find_package(SWIG 4.0 REQUIRED COMPONENTS python) +include(UseSWIG) + +include_directories(${CMAKE_CURRENT_SOURCE_DIR}) + +find_package(PythonLibs) +include_directories(${PYTHON_INCLUDE_PATH}) + +set_property(SOURCE sim.i PROPERTY CPLUSPLUS ON) +set_source_files_properties(sim.i + PROPERTIES + SWIG_FLAGS "" + SWIG_MODULE_NAME sim ) -FetchContent_MakeAvailable(argparse) - -add_executable(pop-simple pop-simple.cpp) -target_link_libraries(pop-simple argparse) -# add_executable(./bin/fixed-simple fixed-simple.cpp) -# add_executable(./bin/wealth-flow wealth-flow.cpp) - -# set(models "fixed-simple, lending, pop-simple") -# foreach(model models) -# add_executable(bin/${model} ${model}.cpp) -# endforeach() +# set_property(SOURCE sim.i PROPERTY ) +swig_add_library(sim TYPE MODULE LANGUAGE python SOURCES sim.i) +swig_link_libraries(sim ${PYTHON_LIBRARIES}) diff --git a/fixed-simple.cpp b/fixed-simple.cpp deleted file mode 100644 index 3194b99..0000000 --- a/fixed-simple.cpp +++ /dev/null @@ -1,17 +0,0 @@ -#include -#include - -std::vector balances; - -const int N = 10000; -const int DURATION = 1000; - -void frame_year() { - for (int i = 0; i < balances.size(); i++) { - // actions - } -} - -int main() { - return 0; -} diff --git a/include/population.hpp b/include/population.hpp new file mode 100644 index 0000000..d7d2cd6 --- /dev/null +++ b/include/population.hpp @@ -0,0 +1,17 @@ +#include + +/** + * @brief Logistic population growth + * + * @param year + * @param N_o + * @param N_f + * @param k + * @param total_duration + * @return int + */ +int logistic_population_func(int year, int N_o, int N_f, int k, int total_duration) { + // https://en.wikipedia.org//wiki/Logistic_function + return N_o + (N_f - N_o) / + (1 + exp(-k * (year - total_duration/2))); +} diff --git a/lending-wealth-flow.cpp b/lending-wealth-flow.cpp deleted file mode 100644 index 101421b..0000000 --- a/lending-wealth-flow.cpp +++ /dev/null @@ -1,20 +0,0 @@ -#include -#include -#include -#include -#include - -std::vector balances; - -const int N = 10000; -const int DURATION = 1000; - -void frame_year() { - for (int i = 0; i < balances.size(); i++) { - } -} - -int main() { - - return 0; -} diff --git a/pop-simple.cpp b/pop-simple.cpp deleted file mode 100644 index 41dc08e..0000000 --- a/pop-simple.cpp +++ /dev/null @@ -1,193 +0,0 @@ -// model with logistic population growth & basic -// inflation + estate redistribution systems - -#include -#include -#include -#include -#include -#include - -#include - -#include "econ.hpp" -#include "io.hpp" -#include "util.hpp" - -// std::map config; -argparse::ArgumentParser program("pop-simple"); - -#define arg(a) program[a] -#define iarg(a) std::stoi(program[a]) -#define farg(a) std::stof(program[a]) - -#define cset(k, v) config[k] = v -#define csetn(k, v) config[k] = std::to_string(v); - -std::vector ages; -std::vector balances; - -enum estate_mode { - EVEN_REDIST, - INHERITANCE -}; - -// used by kill_even_redist - -int redist_total = 0; -int redist_total_next = 0; - -// pop modeling functions - -/** - * @brief kill participant of ID and redistribute their wealth - * to all other remaining participants evenly - * - * @param id ID of participant to kill - */ -void kill_even_redist(int id) { - int bal = balances.at(id); - ages.erase(ages.begin()+id); - balances.erase(balances.begin()+id); - redist_total_next += bal; -} - -/** - * @brief kill participant of ID and give it to one random - * participant as inheritance - * - * @param id ID of participant to kill - */ -void kill_inheritance(int id) { - int bal = balances.at(id); - ages.erase(ages.begin()+id); - balances.erase(balances.begin()+id); - int recipient_id = random_item(balances, true); - balances.at(recipient_id) += bal; -} - -/** - * @brief Age all participants by 1 year & kill any that are - * over the age limit - * - * @param mode Redistribution mode - */ -void age_all(estate_mode mode) { - for (int i = 0; i < ages.size(); i++) { - ages.at(i) += 1; - if (ages.at(i) > iarg("MAX_AGE")) { - switch (mode) { - case INHERITANCE: - kill_inheritance(i); - break; - case EVEN_REDIST: - kill_even_redist(i); - break; - } - } - } -} - -int logistic_population_func(int year) { - // https://en.wikipedia.org//wiki/Logistic_function - return iarg("N_o") + (iarg("N_f") - iarg("N_o")) / - (1 + exp(-farg("GROWTH_RATE") * (year - ci("DURATION")/2))); -} - -void adjust_population(int year) { - int diff = logistic_population_func(year) - balances.size(); - if (diff > 0) { - for (int i = 0; i < diff; i++) { - ages.push_back(1); - balances.push_back(iarg("STARTING_BALANCE_NEW")); - } - } -} - -int main(int argc, char* argv[]) { - // set config via cli args - program.add_argument("estate", "-e") - .help("Estate distribution mode (redistribute, inheritance)") - .default_value(INHERITANCE); - - program.add_argument("time", "-t") - .help("Duration in years of simulation.") - .default_value(1000); - - try { - program.parse_args(argc, argv); - } - catch (const std::runtime_error& err) { - std::cerr << err.what() << std::endl; - std::cerr << program; - std::exit(1); - } - - // model params - csetn("MAX_AGE", 81); - csetn("INIT_BALANCE_EACH", 5000); - csetn("STARTING_BALANCE_NEW", 1000); // effectively inflation rate - // logistic growth params - csetn("N_o", 10); - csetn("N_f", 10000); - csetn("GROWTH_RATE", 0.04); - - // init state - ages.assign(ci("N_o"), 1); - balances.assign(ci("N_o"), ci("INIT_BALANCE_EACH")); - - // estate mode - // estate_mode emode = INHERITANCE; - estate_mode emode = EVEN_REDIST; - - for (int year = 0; year < ci("DURATION"); year++) { - // std::cout << year << "\t" << balances.size() << std::endl; - age_all(emode); - adjust_population(year); - for (int j = 0; j < balances.size(); j++) { - // redistribute estates - balances.at(j) += redist_total / balances.size(); - // make 3 arbitrary spending decisions -> 30% of savings - for (int k = 0; k < 3; k++) { - economic_decision_simple(balances, j, 0.1); - } - } - - if (year % 100 == 0) { - int avg = 0; - int avg_age = 0; - for (int i = 0; i < balances.size(); i++) { - avg += balances[i]; - } - for (int i = 0; i < balances.size(); i++) { - avg_age += ages[i]; - } - avg /= balances.size(); - avg_age /= ages.size(); - std::cout << std::endl; - std::cout << "year: " << year << std::endl; - std::cout << "avg bal: " << avg << std::endl; - std::cout << "avg age: " << avg_age << std::endl; - std::cout << "players: " << balances.size() << std::endl; - } - - // reset redist tally - redist_total = redist_total_next; - redist_total_next = 0; - } - - // std::sort(balances.begin(), balances.end(), std::greater()); - std::string ext; - switch (emode) { - case EVEN_REDIST: - ext = "even"; - break; - case INHERITANCE: - ext = "inheritance"; - break; - } - dump_balances_and_ages_csv(balances, ages, "pop-simple-results-"+ext); - std::cout << "Finished with " << balances.size() << " balances\n"; - - return 0; -} diff --git a/pop-simple.hpp b/pop-simple.hpp new file mode 100644 index 0000000..70b6b0b --- /dev/null +++ b/pop-simple.hpp @@ -0,0 +1,141 @@ +#include +#include +#include +#include +#include + +#include "util.hpp" +#include "population.hpp" +#include "econ.hpp" + +#define arg(a) program[a] +#define iarg(a) std::stoi(program[a]) +#define farg(a) std::stof(program[a]) + +#define cset(k, v) config[k] = v +#define csetn(k, v) config[k] = std::to_string(v); + +struct PopSimpleResult { + std::vector ages; + std::vector balances; +}; + +enum EstateMode { + EVEN_REDIST, + INHERITANCE +}; + +PopSimpleResult pop_simple( + int duration = 1000, + int max_age = 81, + int init_balance_each = 5000, + int starting_balance_new = 1000, + + // logistic function params + int N_o = 10, + int N_f = 10000, + float k = 0.04, + + // estate mode + std::string estate_mode = "inheritance" +) { + + std::vector ages; + std::vector balances; + ages.assign(N_o, 1); + balances.assign(N_o, init_balance_each); + + // estate mode + EstateMode emode = INHERITANCE; + + // Changed/used only if emode=redist + int redist_total = 0; + int redist_total_next = 0; + + for (int year = 0; year < duration; year++) { + // std::cout << year << "\t" << balances.size() << std::endl; + + // age all + for (int id = 0; id < ages.size(); id++) { + ages.at(id) += 1; + if (ages.at(id) > max_age) { + switch (emode) { + case INHERITANCE: { + int bal = balances.at(id); + ages.erase(ages.begin()+id); + balances.erase(balances.begin()+id); + int recipient_id = random_item(balances, true); + balances.at(recipient_id) += bal; + break; + } + case EVEN_REDIST: { + int bal = balances.at(id); + ages.erase(ages.begin()+id); + balances.erase(balances.begin()+id); + redist_total_next += bal; + break; + } + } + } + } + + // (roughly) simulate logistic population growth + int diff = logistic_population_func( + year, N_o, N_f, k, duration) - balances.size(); + if (diff > 0) { + for (int i = 0; i < diff; i++) { + ages.push_back(1); + balances.push_back(starting_balance_new); + } + } + + for (int j = 0; j < balances.size(); j++) { + // redistribute estates + balances.at(j) += redist_total / balances.size(); + // make 3 arbitrary spending decisions -> 30% of savings + for (int k = 0; k < 3; k++) { + economic_decision_simple(balances, j, 0.1); + } + } + + if (year % 100 == 0) { + int avg = 0; + int avg_age = 0; + for (int i = 0; i < balances.size(); i++) { + avg += balances[i]; + } + for (int i = 0; i < balances.size(); i++) { + avg_age += ages[i]; + } + avg /= balances.size(); + avg_age /= ages.size(); + std::cout << std::endl; + std::cout << "year: " << year << std::endl; + std::cout << "avg bal: " << avg << std::endl; + std::cout << "avg age: " << avg_age << std::endl; + std::cout << "players: " << balances.size() << std::endl; + } + + // reset redist tally + redist_total = redist_total_next; + redist_total_next = 0; + } + + // std::sort(balances.begin(), balances.end(), std::greater()); + std::string ext; + switch (emode) { + case EVEN_REDIST: + ext = "even"; + break; + case INHERITANCE: + ext = "inheritance"; + break; + } + // dump_balances_and_ages_csv(balances, ages, "pop-simple-results-"+ext); + std::cout << "Finished with " << balances.size() << " balances\n"; + + PopSimpleResult res; + res.ages = ages; + res.balances = ages; + return res; +} diff --git a/scripts/Pipfile b/scripts/Pipfile deleted file mode 100644 index a77256c..0000000 --- a/scripts/Pipfile +++ /dev/null @@ -1,14 +0,0 @@ -[[source]] -url = "https://pypi.org/simple" -verify_ssl = true -name = "pypi" - -[packages] -numpy = "*" -matplotlib = "*" -pandas = "*" - -[dev-packages] - -[requires] -python_version = "3.10" diff --git a/scripts/Pipfile.lock b/scripts/Pipfile.lock deleted file mode 100644 index 9219fd8..0000000 --- a/scripts/Pipfile.lock +++ /dev/null @@ -1,406 +0,0 @@ -{ - "_meta": { - "hash": { - "sha256": "a89ef53c6cdb3cc36d9c302eefeace96ed25637eefe3ff89b92bf006b473ff98" - }, - "pipfile-spec": 6, - "requires": { - "python_version": "3.10" - }, - "sources": [ - { - "name": "pypi", - "url": "https://pypi.org/simple", - "verify_ssl": true - } - ] - }, - "default": { - "contourpy": { - "hashes": [ - "sha256:0236875c5a0784215b49d00ebbe80c5b6b5d5244b3655a36dda88105334dea17", - "sha256:03d1b9c6b44a9e30d554654c72be89af94fab7510b4b9f62356c64c81cec8b7d", - "sha256:0537cc1195245bbe24f2913d1f9211b8f04eb203de9044630abd3664c6cc339c", - "sha256:06ca79e1efbbe2df795822df2fa173d1a2b38b6e0f047a0ec7903fbca1d1847e", - "sha256:08e8d09d96219ace6cb596506fb9b64ea5f270b2fb9121158b976d88871fcfd1", - "sha256:0b1e66346acfb17694d46175a0cea7d9036f12ed0c31dfe86f0f405eedde2bdd", - "sha256:0b97454ed5b1368b66ed414c754cba15b9750ce69938fc6153679787402e4cdf", - "sha256:0e4854cc02006ad6684ce092bdadab6f0912d131f91c2450ce6dbdea78ee3c0b", - "sha256:12a7dc8439544ed05c6553bf026d5e8fa7fad48d63958a95d61698df0e00092b", - "sha256:1b1ee48a130da4dd0eb8055bbab34abf3f6262957832fd575e0cab4979a15a41", - "sha256:1c0e1308307a75e07d1f1b5f0f56b5af84538a5e9027109a7bcf6cb47c434e72", - "sha256:1dedf4c64185a216c35eb488e6f433297c660321275734401760dafaeb0ad5c2", - "sha256:208bc904889c910d95aafcf7be9e677726df9ef71e216780170dbb7e37d118fa", - "sha256:211dfe2bd43bf5791d23afbe23a7952e8ac8b67591d24be3638cabb648b3a6eb", - "sha256:341330ed19074f956cb20877ad8d2ae50e458884bfa6a6df3ae28487cc76c768", - "sha256:344cb3badf6fc7316ad51835f56ac387bdf86c8e1b670904f18f437d70da4183", - "sha256:358f6364e4873f4d73360b35da30066f40387dd3c427a3e5432c6b28dd24a8fa", - "sha256:371f6570a81dfdddbb837ba432293a63b4babb942a9eb7aaa699997adfb53278", - "sha256:375d81366afd547b8558c4720337218345148bc2fcffa3a9870cab82b29667f2", - "sha256:3a1917d3941dd58732c449c810fa7ce46cc305ce9325a11261d740118b85e6f3", - "sha256:4081918147fc4c29fad328d5066cfc751da100a1098398742f9f364be63803fc", - "sha256:444fb776f58f4906d8d354eb6f6ce59d0a60f7b6a720da6c1ccb839db7c80eb9", - "sha256:46deb310a276cc5c1fd27958e358cce68b1e8a515fa5a574c670a504c3a3fe30", - "sha256:494efed2c761f0f37262815f9e3c4bb9917c5c69806abdee1d1cb6611a7174a0", - "sha256:50627bf76abb6ba291ad08db583161939c2c5fab38c38181b7833423ab9c7de3", - "sha256:5641927cc5ae66155d0c80195dc35726eae060e7defc18b7ab27600f39dd1fe7", - "sha256:5b117d29433fc8393b18a696d794961464e37afb34a6eeb8b2c37b5f4128a83e", - "sha256:613c665529899b5d9fade7e5d1760111a0b011231277a0d36c49f0d3d6914bd6", - "sha256:6e459ebb8bb5ee4c22c19cc000174f8059981971a33ce11e17dddf6aca97a142", - "sha256:6f56515e7c6fae4529b731f6c117752247bef9cdad2b12fc5ddf8ca6a50965a5", - "sha256:730c27978a0003b47b359935478b7d63fd8386dbb2dcd36c1e8de88cbfc1e9de", - "sha256:75a2e638042118118ab39d337da4c7908c1af74a8464cad59f19fbc5bbafec9b", - "sha256:78ced51807ccb2f45d4ea73aca339756d75d021069604c2fccd05390dc3c28eb", - "sha256:7ee394502026d68652c2824348a40bf50f31351a668977b51437131a90d777ea", - "sha256:8468b40528fa1e15181cccec4198623b55dcd58306f8815a793803f51f6c474a", - "sha256:84c593aeff7a0171f639da92cb86d24954bbb61f8a1b530f74eb750a14685832", - "sha256:913bac9d064cff033cf3719e855d4f1db9f1c179e0ecf3ba9fdef21c21c6a16a", - "sha256:9447c45df407d3ecb717d837af3b70cfef432138530712263730783b3d016512", - "sha256:9b0e7fe7f949fb719b206548e5cde2518ffb29936afa4303d8a1c4db43dcb675", - "sha256:9bc407a6af672da20da74823443707e38ece8b93a04009dca25856c2d9adadb1", - "sha256:9e8e686a6db92a46111a1ee0ee6f7fbfae4048f0019de207149f43ac1812cf95", - "sha256:9fc4e7973ed0e1fe689435842a6e6b330eb7ccc696080dda9a97b1a1b78e41db", - "sha256:a457ee72d9032e86730f62c5eeddf402e732fdf5ca8b13b41772aa8ae13a4563", - "sha256:a628bba09ba72e472bf7b31018b6281fd4cc903f0888049a3724afba13b6e0b8", - "sha256:a79d239fc22c3b8d9d3de492aa0c245533f4f4c7608e5749af866949c0f1b1b9", - "sha256:aa4674cf3fa2bd9c322982644967f01eed0c91bb890f624e0e0daf7a5c3383e9", - "sha256:acd2bd02f1a7adff3a1f33e431eb96ab6d7987b039d2946a9b39fe6fb16a1036", - "sha256:b3b1bd7577c530eaf9d2bc52d1a93fef50ac516a8b1062c3d1b9bcec9ebe329b", - "sha256:b48d94386f1994db7c70c76b5808c12e23ed7a4ee13693c2fc5ab109d60243c0", - "sha256:b64f747e92af7da3b85631a55d68c45a2d728b4036b03cdaba4bd94bcc85bd6f", - "sha256:b98c820608e2dca6442e786817f646d11057c09a23b68d2b3737e6dcb6e4a49b", - "sha256:c1baa49ab9fedbf19d40d93163b7d3e735d9cd8d5efe4cce9907902a6dad391f", - "sha256:c38c6536c2d71ca2f7e418acaf5bca30a3af7f2a2fa106083c7d738337848dbe", - "sha256:c78bfbc1a7bff053baf7e508449d2765964d67735c909b583204e3240a2aca45", - "sha256:cd2bc0c8f2e8de7dd89a7f1c10b8844e291bca17d359373203ef2e6100819edd", - "sha256:d2eff2af97ea0b61381828b1ad6cd249bbd41d280e53aea5cccd7b2b31b8225c", - "sha256:d8834c14b8c3dd849005e06703469db9bf96ba2d66a3f88ecc539c9a8982e0ee", - "sha256:d912f0154a20a80ea449daada904a7eb6941c83281a9fab95de50529bfc3a1da", - "sha256:da1ef35fd79be2926ba80fbb36327463e3656c02526e9b5b4c2b366588b74d9a", - "sha256:dbe6fe7a1166b1ddd7b6d887ea6fa8389d3f28b5ed3f73a8f40ece1fc5a3d340", - "sha256:dcd556c8fc37a342dd636d7eef150b1399f823a4462f8c968e11e1ebeabee769", - "sha256:e13b31d1b4b68db60b3b29f8e337908f328c7f05b9add4b1b5c74e0691180109", - "sha256:e1739496c2f0108013629aa095cc32a8c6363444361960c07493818d0dea2da4", - "sha256:e43255a83835a129ef98f75d13d643844d8c646b258bebd11e4a0975203e018f", - "sha256:e626cefff8491bce356221c22af5a3ea528b0b41fbabc719c00ae233819ea0bf", - "sha256:eadad75bf91897f922e0fb3dca1b322a58b1726a953f98c2e5f0606bd8408621", - "sha256:f33da6b5d19ad1bb5e7ad38bb8ba5c426d2178928bc2b2c44e8823ea0ecb6ff3", - "sha256:f4052a8a4926d4468416fc7d4b2a7b2a3e35f25b39f4061a7e2a3a2748c4fc48", - "sha256:f6ca38dd8d988eca8f07305125dec6f54ac1c518f1aaddcc14d08c01aebb6efc" - ], - "markers": "python_version >= '3.7'", - "version": "==1.0.6" - }, - "cycler": { - "hashes": [ - "sha256:3a27e95f763a428a739d2add979fa7494c912a32c17c4c38c4d5f082cad165a3", - "sha256:9c87405839a19696e837b3b818fed3f5f69f16f1eec1a1ad77e043dcea9c772f" - ], - "markers": "python_version >= '3.6'", - "version": "==0.11.0" - }, - "fonttools": { - "hashes": [ - "sha256:2bb244009f9bf3fa100fc3ead6aeb99febe5985fa20afbfbaa2f8946c2fbdaf1", - "sha256:820466f43c8be8c3009aef8b87e785014133508f0de64ec469e4efb643ae54fb" - ], - "markers": "python_version >= '3.7'", - "version": "==4.38.0" - }, - "kiwisolver": { - "hashes": [ - "sha256:02f79693ec433cb4b5f51694e8477ae83b3205768a6fb48ffba60549080e295b", - "sha256:03baab2d6b4a54ddbb43bba1a3a2d1627e82d205c5cf8f4c924dc49284b87166", - "sha256:1041feb4cda8708ce73bb4dcb9ce1ccf49d553bf87c3954bdfa46f0c3f77252c", - "sha256:10ee06759482c78bdb864f4109886dff7b8a56529bc1609d4f1112b93fe6423c", - "sha256:1d1573129aa0fd901076e2bfb4275a35f5b7aa60fbfb984499d661ec950320b0", - "sha256:283dffbf061a4ec60391d51e6155e372a1f7a4f5b15d59c8505339454f8989e4", - "sha256:28bc5b299f48150b5f822ce68624e445040595a4ac3d59251703779836eceff9", - "sha256:2a66fdfb34e05b705620dd567f5a03f239a088d5a3f321e7b6ac3239d22aa286", - "sha256:2e307eb9bd99801f82789b44bb45e9f541961831c7311521b13a6c85afc09767", - "sha256:2e407cb4bd5a13984a6c2c0fe1845e4e41e96f183e5e5cd4d77a857d9693494c", - "sha256:2f5e60fabb7343a836360c4f0919b8cd0d6dbf08ad2ca6b9cf90bf0c76a3c4f6", - "sha256:36dafec3d6d6088d34e2de6b85f9d8e2324eb734162fba59d2ba9ed7a2043d5b", - "sha256:3fe20f63c9ecee44560d0e7f116b3a747a5d7203376abeea292ab3152334d004", - "sha256:41dae968a94b1ef1897cb322b39360a0812661dba7c682aa45098eb8e193dbdf", - "sha256:4bd472dbe5e136f96a4b18f295d159d7f26fd399136f5b17b08c4e5f498cd494", - "sha256:4ea39b0ccc4f5d803e3337dd46bcce60b702be4d86fd0b3d7531ef10fd99a1ac", - "sha256:5853eb494c71e267912275e5586fe281444eb5e722de4e131cddf9d442615626", - "sha256:5bce61af018b0cb2055e0e72e7d65290d822d3feee430b7b8203d8a855e78766", - "sha256:6295ecd49304dcf3bfbfa45d9a081c96509e95f4b9d0eb7ee4ec0530c4a96514", - "sha256:62ac9cc684da4cf1778d07a89bf5f81b35834cb96ca523d3a7fb32509380cbf6", - "sha256:70e7c2e7b750585569564e2e5ca9845acfaa5da56ac46df68414f29fea97be9f", - "sha256:7577c1987baa3adc4b3c62c33bd1118c3ef5c8ddef36f0f2c950ae0b199e100d", - "sha256:75facbe9606748f43428fc91a43edb46c7ff68889b91fa31f53b58894503a191", - "sha256:787518a6789009c159453da4d6b683f468ef7a65bbde796bcea803ccf191058d", - "sha256:78d6601aed50c74e0ef02f4204da1816147a6d3fbdc8b3872d263338a9052c51", - "sha256:7c43e1e1206cd421cd92e6b3280d4385d41d7166b3ed577ac20444b6995a445f", - "sha256:81e38381b782cc7e1e46c4e14cd997ee6040768101aefc8fa3c24a4cc58e98f8", - "sha256:841293b17ad704d70c578f1f0013c890e219952169ce8a24ebc063eecf775454", - "sha256:872b8ca05c40d309ed13eb2e582cab0c5a05e81e987ab9c521bf05ad1d5cf5cb", - "sha256:877272cf6b4b7e94c9614f9b10140e198d2186363728ed0f701c6eee1baec1da", - "sha256:8c808594c88a025d4e322d5bb549282c93c8e1ba71b790f539567932722d7bd8", - "sha256:8ed58b8acf29798b036d347791141767ccf65eee7f26bde03a71c944449e53de", - "sha256:91672bacaa030f92fc2f43b620d7b337fd9a5af28b0d6ed3f77afc43c4a64b5a", - "sha256:968f44fdbf6dd757d12920d63b566eeb4d5b395fd2d00d29d7ef00a00582aac9", - "sha256:9f85003f5dfa867e86d53fac6f7e6f30c045673fa27b603c397753bebadc3008", - "sha256:a553dadda40fef6bfa1456dc4be49b113aa92c2a9a9e8711e955618cd69622e3", - "sha256:a68b62a02953b9841730db7797422f983935aeefceb1679f0fc85cbfbd311c32", - "sha256:abbe9fa13da955feb8202e215c4018f4bb57469b1b78c7a4c5c7b93001699938", - "sha256:ad881edc7ccb9d65b0224f4e4d05a1e85cf62d73aab798943df6d48ab0cd79a1", - "sha256:b1792d939ec70abe76f5054d3f36ed5656021dcad1322d1cc996d4e54165cef9", - "sha256:b428ef021242344340460fa4c9185d0b1f66fbdbfecc6c63eff4b7c29fad429d", - "sha256:b533558eae785e33e8c148a8d9921692a9fe5aa516efbdff8606e7d87b9d5824", - "sha256:ba59c92039ec0a66103b1d5fe588fa546373587a7d68f5c96f743c3396afc04b", - "sha256:bc8d3bd6c72b2dd9decf16ce70e20abcb3274ba01b4e1c96031e0c4067d1e7cd", - "sha256:bc9db8a3efb3e403e4ecc6cd9489ea2bac94244f80c78e27c31dcc00d2790ac2", - "sha256:bf7d9fce9bcc4752ca4a1b80aabd38f6d19009ea5cbda0e0856983cf6d0023f5", - "sha256:c2dbb44c3f7e6c4d3487b31037b1bdbf424d97687c1747ce4ff2895795c9bf69", - "sha256:c79ebe8f3676a4c6630fd3f777f3cfecf9289666c84e775a67d1d358578dc2e3", - "sha256:c97528e64cb9ebeff9701e7938653a9951922f2a38bd847787d4a8e498cc83ae", - "sha256:d0611a0a2a518464c05ddd5a3a1a0e856ccc10e67079bb17f265ad19ab3c7597", - "sha256:d06adcfa62a4431d404c31216f0f8ac97397d799cd53800e9d3efc2fbb3cf14e", - "sha256:d41997519fcba4a1e46eb4a2fe31bc12f0ff957b2b81bac28db24744f333e955", - "sha256:d5b61785a9ce44e5a4b880272baa7cf6c8f48a5180c3e81c59553ba0cb0821ca", - "sha256:da152d8cdcab0e56e4f45eb08b9aea6455845ec83172092f09b0e077ece2cf7a", - "sha256:da7e547706e69e45d95e116e6939488d62174e033b763ab1496b4c29b76fabea", - "sha256:db5283d90da4174865d520e7366801a93777201e91e79bacbac6e6927cbceede", - "sha256:db608a6757adabb32f1cfe6066e39b3706d8c3aa69bbc353a5b61edad36a5cb4", - "sha256:e0ea21f66820452a3f5d1655f8704a60d66ba1191359b96541eaf457710a5fc6", - "sha256:e7da3fec7408813a7cebc9e4ec55afed2d0fd65c4754bc376bf03498d4e92686", - "sha256:e92a513161077b53447160b9bd8f522edfbed4bd9759e4c18ab05d7ef7e49408", - "sha256:ecb1fa0db7bf4cff9dac752abb19505a233c7f16684c5826d1f11ebd9472b871", - "sha256:efda5fc8cc1c61e4f639b8067d118e742b812c930f708e6667a5ce0d13499e29", - "sha256:f0a1dbdb5ecbef0d34eb77e56fcb3e95bbd7e50835d9782a45df81cc46949750", - "sha256:f0a71d85ecdd570ded8ac3d1c0f480842f49a40beb423bb8014539a9f32a5897", - "sha256:f4f270de01dd3e129a72efad823da90cc4d6aafb64c410c9033aba70db9f1ff0", - "sha256:f6cb459eea32a4e2cf18ba5fcece2dbdf496384413bc1bae15583f19e567f3b2", - "sha256:f8ad8285b01b0d4695102546b342b493b3ccc6781fc28c8c6a1bb63e95d22f09", - "sha256:f9f39e2f049db33a908319cf46624a569b36983c7c78318e9726a4cb8923b26c" - ], - "markers": "python_version >= '3.7'", - "version": "==1.4.4" - }, - "matplotlib": { - "hashes": [ - "sha256:0844523dfaaff566e39dbfa74e6f6dc42e92f7a365ce80929c5030b84caa563a", - "sha256:0eda9d1b43f265da91fb9ae10d6922b5a986e2234470a524e6b18f14095b20d2", - "sha256:168093410b99f647ba61361b208f7b0d64dde1172b5b1796d765cd243cadb501", - "sha256:1836f366272b1557a613f8265db220eb8dd883202bbbabe01bad5a4eadfd0c95", - "sha256:19d61ee6414c44a04addbe33005ab1f87539d9f395e25afcbe9a3c50ce77c65c", - "sha256:252957e208c23db72ca9918cb33e160c7833faebf295aaedb43f5b083832a267", - "sha256:32d29c8c26362169c80c5718ce367e8c64f4dd068a424e7110df1dd2ed7bd428", - "sha256:380d48c15ec41102a2b70858ab1dedfa33eb77b2c0982cb65a200ae67a48e9cb", - "sha256:3964934731fd7a289a91d315919cf757f293969a4244941ab10513d2351b4e83", - "sha256:3cef89888a466228fc4e4b2954e740ce8e9afde7c4315fdd18caa1b8de58ca17", - "sha256:4426c74761790bff46e3d906c14c7aab727543293eed5a924300a952e1a3a3c1", - "sha256:5024b8ed83d7f8809982d095d8ab0b179bebc07616a9713f86d30cf4944acb73", - "sha256:52c2bdd7cd0bf9d5ccdf9c1816568fd4ccd51a4d82419cc5480f548981b47dd0", - "sha256:54fa9fe27f5466b86126ff38123261188bed568c1019e4716af01f97a12fe812", - "sha256:5ba73aa3aca35d2981e0b31230d58abb7b5d7ca104e543ae49709208d8ce706a", - "sha256:5e16dcaecffd55b955aa5e2b8a804379789c15987e8ebd2f32f01398a81e975b", - "sha256:5ecfc6559132116dedfc482d0ad9df8a89dc5909eebffd22f3deb684132d002f", - "sha256:74153008bd24366cf099d1f1e83808d179d618c4e32edb0d489d526523a94d9f", - "sha256:78ec3c3412cf277e6252764ee4acbdbec6920cc87ad65862272aaa0e24381eee", - "sha256:795ad83940732b45d39b82571f87af0081c120feff2b12e748d96bb191169e33", - "sha256:7f716b6af94dc1b6b97c46401774472f0867e44595990fe80a8ba390f7a0a028", - "sha256:83dc89c5fd728fdb03b76f122f43b4dcee8c61f1489e232d9ad0f58020523e1c", - "sha256:8a0ae37576ed444fe853709bdceb2be4c7df6f7acae17b8378765bd28e61b3ae", - "sha256:8a8dbe2cb7f33ff54b16bb5c500673502a35f18ac1ed48625e997d40c922f9cc", - "sha256:8a9d899953c722b9afd7e88dbefd8fb276c686c3116a43c577cfabf636180558", - "sha256:8d0068e40837c1d0df6e3abf1cdc9a34a6d2611d90e29610fa1d2455aeb4e2e5", - "sha256:9347cc6822f38db2b1d1ce992f375289670e595a2d1c15961aacbe0977407dfc", - "sha256:9f335e5625feb90e323d7e3868ec337f7b9ad88b5d633f876e3b778813021dab", - "sha256:b03fd10a1709d0101c054883b550f7c4c5e974f751e2680318759af005964990", - "sha256:b0ca2c60d3966dfd6608f5f8c49b8a0fcf76de6654f2eda55fc6ef038d5a6f27", - "sha256:b2604c6450f9dd2c42e223b1f5dca9643a23cfecc9fde4a94bb38e0d2693b136", - "sha256:ca0e7a658fbafcddcaefaa07ba8dae9384be2343468a8e011061791588d839fa", - "sha256:d0e9ac04065a814d4cf2c6791a2ad563f739ae3ae830d716d54245c2b96fead6", - "sha256:d50e8c1e571ee39b5dfbc295c11ad65988879f68009dd281a6e1edbc2ff6c18c", - "sha256:d840adcad7354be6f2ec28d0706528b0026e4c3934cc6566b84eac18633eab1b", - "sha256:e0bbee6c2a5bf2a0017a9b5e397babb88f230e6f07c3cdff4a4c4bc75ed7c617", - "sha256:e5afe0a7ea0e3a7a257907060bee6724a6002b7eec55d0db16fd32409795f3e1", - "sha256:e68be81cd8c22b029924b6d0ee814c337c0e706b8d88495a617319e5dd5441c3", - "sha256:ec9be0f4826cdb3a3a517509dcc5f87f370251b76362051ab59e42b6b765f8c4", - "sha256:f04f97797df35e442ed09f529ad1235d1f1c0f30878e2fe09a2676b71a8801e0", - "sha256:f41e57ad63d336fe50d3a67bb8eaa26c09f6dda6a59f76777a99b8ccd8e26aec" - ], - "index": "pypi", - "version": "==3.6.2" - }, - "numpy": { - "hashes": [ - "sha256:01dd17cbb340bf0fc23981e52e1d18a9d4050792e8fb8363cecbf066a84b827d", - "sha256:06005a2ef6014e9956c09ba07654f9837d9e26696a0470e42beedadb78c11b07", - "sha256:09b7847f7e83ca37c6e627682f145856de331049013853f344f37b0c9690e3df", - "sha256:0aaee12d8883552fadfc41e96b4c82ee7d794949e2a7c3b3a7201e968c7ecab9", - "sha256:0cbe9848fad08baf71de1a39e12d1b6310f1d5b2d0ea4de051058e6e1076852d", - "sha256:1b1766d6f397c18153d40015ddfc79ddb715cabadc04d2d228d4e5a8bc4ded1a", - "sha256:33161613d2269025873025b33e879825ec7b1d831317e68f4f2f0f84ed14c719", - "sha256:5039f55555e1eab31124a5768898c9e22c25a65c1e0037f4d7c495a45778c9f2", - "sha256:522e26bbf6377e4d76403826ed689c295b0b238f46c28a7251ab94716da0b280", - "sha256:56e454c7833e94ec9769fa0f86e6ff8e42ee38ce0ce1fa4cbb747ea7e06d56aa", - "sha256:58f545efd1108e647604a1b5aa809591ccd2540f468a880bedb97247e72db387", - "sha256:5e05b1c973a9f858c74367553e236f287e749465f773328c8ef31abe18f691e1", - "sha256:7903ba8ab592b82014713c491f6c5d3a1cde5b4a3bf116404e08f5b52f6daf43", - "sha256:8969bfd28e85c81f3f94eb4a66bc2cf1dbdc5c18efc320af34bffc54d6b1e38f", - "sha256:92c8c1e89a1f5028a4c6d9e3ccbe311b6ba53694811269b992c0b224269e2398", - "sha256:9c88793f78fca17da0145455f0d7826bcb9f37da4764af27ac945488116efe63", - "sha256:a7ac231a08bb37f852849bbb387a20a57574a97cfc7b6cabb488a4fc8be176de", - "sha256:abdde9f795cf292fb9651ed48185503a2ff29be87770c3b8e2a14b0cd7aa16f8", - "sha256:af1da88f6bc3d2338ebbf0e22fe487821ea4d8e89053e25fa59d1d79786e7481", - "sha256:b2a9ab7c279c91974f756c84c365a669a887efa287365a8e2c418f8b3ba73fb0", - "sha256:bf837dc63ba5c06dc8797c398db1e223a466c7ece27a1f7b5232ba3466aafe3d", - "sha256:ca51fcfcc5f9354c45f400059e88bc09215fb71a48d3768fb80e357f3b457e1e", - "sha256:ce571367b6dfe60af04e04a1834ca2dc5f46004ac1cc756fb95319f64c095a96", - "sha256:d208a0f8729f3fb790ed18a003f3a57895b989b40ea4dce4717e9cf4af62c6bb", - "sha256:dbee87b469018961d1ad79b1a5d50c0ae850000b639bcb1b694e9981083243b6", - "sha256:e9f4c4e51567b616be64e05d517c79a8a22f3606499941d97bb76f2ca59f982d", - "sha256:f063b69b090c9d918f9df0a12116029e274daf0181df392839661c4c7ec9018a", - "sha256:f9a909a8bae284d46bbfdefbdd4a262ba19d3bc9921b1e76126b1d21c3c34135" - ], - "index": "pypi", - "version": "==1.23.5" - }, - "packaging": { - "hashes": [ - "sha256:dd47c42927d89ab911e606518907cc2d3a1f38bbd026385970643f9c5b8ecfeb", - "sha256:ef103e05f519cdc783ae24ea4e2e0f508a9c99b2d4969652eed6a2e1ea5bd522" - ], - "markers": "python_version >= '3.6'", - "version": "==21.3" - }, - "pandas": { - "hashes": [ - "sha256:0183cb04a057cc38fde5244909fca9826d5d57c4a5b7390c0cc3fa7acd9fa883", - "sha256:1fc87eac0541a7d24648a001d553406f4256e744d92df1df8ebe41829a915028", - "sha256:220b98d15cee0b2cd839a6358bd1f273d0356bf964c1a1aeb32d47db0215488b", - "sha256:2552bffc808641c6eb471e55aa6899fa002ac94e4eebfa9ec058649122db5824", - "sha256:315e19a3e5c2ab47a67467fc0362cb36c7c60a93b6457f675d7d9615edad2ebe", - "sha256:344021ed3e639e017b452aa8f5f6bf38a8806f5852e217a7594417fb9bbfa00e", - "sha256:375262829c8c700c3e7cbb336810b94367b9c4889818bbd910d0ecb4e45dc261", - "sha256:457d8c3d42314ff47cc2d6c54f8fc0d23954b47977b2caed09cd9635cb75388b", - "sha256:4aed257c7484d01c9a194d9a94758b37d3d751849c05a0050c087a358c41ad1f", - "sha256:530948945e7b6c95e6fa7aa4be2be25764af53fba93fe76d912e35d1c9ee46f5", - "sha256:5ae7e989f12628f41e804847a8cc2943d362440132919a69429d4dea1f164da0", - "sha256:71f510b0efe1629bf2f7c0eadb1ff0b9cf611e87b73cd017e6b7d6adb40e2b3a", - "sha256:73f219fdc1777cf3c45fde7f0708732ec6950dfc598afc50588d0d285fddaefc", - "sha256:8092a368d3eb7116e270525329a3e5c15ae796ccdf7ccb17839a73b4f5084a39", - "sha256:82ae615826da838a8e5d4d630eb70c993ab8636f0eff13cb28aafc4291b632b5", - "sha256:9608000a5a45f663be6af5c70c3cbe634fa19243e720eb380c0d378666bc7702", - "sha256:a40dd1e9f22e01e66ed534d6a965eb99546b41d4d52dbdb66565608fde48203f", - "sha256:b4f5a82afa4f1ff482ab8ded2ae8a453a2cdfde2001567b3ca24a4c5c5ca0db3", - "sha256:c009a92e81ce836212ce7aa98b219db7961a8b95999b97af566b8dc8c33e9519", - "sha256:c218796d59d5abd8780170c937b812c9637e84c32f8271bbf9845970f8c1351f", - "sha256:cc3cd122bea268998b79adebbb8343b735a5511ec14efb70a39e7acbc11ccbdc", - "sha256:d0d8fd58df5d17ddb8c72a5075d87cd80d71b542571b5f78178fb067fa4e9c72", - "sha256:e18bc3764cbb5e118be139b3b611bc3fbc5d3be42a7e827d1096f46087b395eb", - "sha256:e2b83abd292194f350bb04e188f9379d36b8dfac24dd445d5c87575f3beaf789", - "sha256:e7469271497960b6a781eaa930cba8af400dd59b62ec9ca2f4d31a19f2f91090", - "sha256:e9dbacd22555c2d47f262ef96bb4e30880e5956169741400af8b306bbb24a273", - "sha256:f6257b314fc14958f8122779e5a1557517b0f8e500cfb2bd53fa1f75a8ad0af2" - ], - "index": "pypi", - "version": "==1.5.2" - }, - "pillow": { - "hashes": [ - "sha256:03150abd92771742d4a8cd6f2fa6246d847dcd2e332a18d0c15cc75bf6703040", - "sha256:073adb2ae23431d3b9bcbcff3fe698b62ed47211d0716b067385538a1b0f28b8", - "sha256:0b07fffc13f474264c336298d1b4ce01d9c5a011415b79d4ee5527bb69ae6f65", - "sha256:0b7257127d646ff8676ec8a15520013a698d1fdc48bc2a79ba4e53df792526f2", - "sha256:12ce4932caf2ddf3e41d17fc9c02d67126935a44b86df6a206cf0d7161548627", - "sha256:15c42fb9dea42465dfd902fb0ecf584b8848ceb28b41ee2b58f866411be33f07", - "sha256:18498994b29e1cf86d505edcb7edbe814d133d2232d256db8c7a8ceb34d18cef", - "sha256:1c7c8ae3864846fc95f4611c78129301e203aaa2af813b703c55d10cc1628535", - "sha256:22b012ea2d065fd163ca096f4e37e47cd8b59cf4b0fd47bfca6abb93df70b34c", - "sha256:276a5ca930c913f714e372b2591a22c4bd3b81a418c0f6635ba832daec1cbcfc", - "sha256:2e0918e03aa0c72ea56edbb00d4d664294815aa11291a11504a377ea018330d3", - "sha256:3033fbe1feb1b59394615a1cafaee85e49d01b51d54de0cbf6aa8e64182518a1", - "sha256:3168434d303babf495d4ba58fc22d6604f6e2afb97adc6a423e917dab828939c", - "sha256:32a44128c4bdca7f31de5be641187367fe2a450ad83b833ef78910397db491aa", - "sha256:3dd6caf940756101205dffc5367babf288a30043d35f80936f9bfb37f8355b32", - "sha256:40e1ce476a7804b0fb74bcfa80b0a2206ea6a882938eaba917f7a0f004b42502", - "sha256:41e0051336807468be450d52b8edd12ac60bebaa97fe10c8b660f116e50b30e4", - "sha256:4390e9ce199fc1951fcfa65795f239a8a4944117b5935a9317fb320e7767b40f", - "sha256:502526a2cbfa431d9fc2a079bdd9061a2397b842bb6bc4239bb176da00993812", - "sha256:51e0e543a33ed92db9f5ef69a0356e0b1a7a6b6a71b80df99f1d181ae5875636", - "sha256:57751894f6618fd4308ed8e0c36c333e2f5469744c34729a27532b3db106ee20", - "sha256:5d77adcd56a42d00cc1be30843d3426aa4e660cab4a61021dc84467123f7a00c", - "sha256:655a83b0058ba47c7c52e4e2df5ecf484c1b0b0349805896dd350cbc416bdd91", - "sha256:68943d632f1f9e3dce98908e873b3a090f6cba1cbb1b892a9e8d97c938871fbe", - "sha256:6c738585d7a9961d8c2821a1eb3dcb978d14e238be3d70f0a706f7fa9316946b", - "sha256:73bd195e43f3fadecfc50c682f5055ec32ee2c933243cafbfdec69ab1aa87cad", - "sha256:772a91fc0e03eaf922c63badeca75e91baa80fe2f5f87bdaed4280662aad25c9", - "sha256:77ec3e7be99629898c9a6d24a09de089fa5356ee408cdffffe62d67bb75fdd72", - "sha256:7db8b751ad307d7cf238f02101e8e36a128a6cb199326e867d1398067381bff4", - "sha256:801ec82e4188e935c7f5e22e006d01611d6b41661bba9fe45b60e7ac1a8f84de", - "sha256:82409ffe29d70fd733ff3c1025a602abb3e67405d41b9403b00b01debc4c9a29", - "sha256:828989c45c245518065a110434246c44a56a8b2b2f6347d1409c787e6e4651ee", - "sha256:829f97c8e258593b9daa80638aee3789b7df9da5cf1336035016d76f03b8860c", - "sha256:871b72c3643e516db4ecf20efe735deb27fe30ca17800e661d769faab45a18d7", - "sha256:89dca0ce00a2b49024df6325925555d406b14aa3efc2f752dbb5940c52c56b11", - "sha256:90fb88843d3902fe7c9586d439d1e8c05258f41da473952aa8b328d8b907498c", - "sha256:97aabc5c50312afa5e0a2b07c17d4ac5e865b250986f8afe2b02d772567a380c", - "sha256:9aaa107275d8527e9d6e7670b64aabaaa36e5b6bd71a1015ddd21da0d4e06448", - "sha256:9f47eabcd2ded7698106b05c2c338672d16a6f2a485e74481f524e2a23c2794b", - "sha256:a0a06a052c5f37b4ed81c613a455a81f9a3a69429b4fd7bb913c3fa98abefc20", - "sha256:ab388aaa3f6ce52ac1cb8e122c4bd46657c15905904b3120a6248b5b8b0bc228", - "sha256:ad58d27a5b0262c0c19b47d54c5802db9b34d38bbf886665b626aff83c74bacd", - "sha256:ae5331c23ce118c53b172fa64a4c037eb83c9165aba3a7ba9ddd3ec9fa64a699", - "sha256:af0372acb5d3598f36ec0914deed2a63f6bcdb7b606da04dc19a88d31bf0c05b", - "sha256:afa4107d1b306cdf8953edde0534562607fe8811b6c4d9a486298ad31de733b2", - "sha256:b03ae6f1a1878233ac620c98f3459f79fd77c7e3c2b20d460284e1fb370557d4", - "sha256:b0915e734b33a474d76c28e07292f196cdf2a590a0d25bcc06e64e545f2d146c", - "sha256:b4012d06c846dc2b80651b120e2cdd787b013deb39c09f407727ba90015c684f", - "sha256:b472b5ea442148d1c3e2209f20f1e0bb0eb556538690fa70b5e1f79fa0ba8dc2", - "sha256:b59430236b8e58840a0dfb4099a0e8717ffb779c952426a69ae435ca1f57210c", - "sha256:b90f7616ea170e92820775ed47e136208e04c967271c9ef615b6fbd08d9af0e3", - "sha256:b9a65733d103311331875c1dca05cb4606997fd33d6acfed695b1232ba1df193", - "sha256:bac18ab8d2d1e6b4ce25e3424f709aceef668347db8637c2296bcf41acb7cf48", - "sha256:bca31dd6014cb8b0b2db1e46081b0ca7d936f856da3b39744aef499db5d84d02", - "sha256:be55f8457cd1eac957af0c3f5ece7bc3f033f89b114ef30f710882717670b2a8", - "sha256:c7025dce65566eb6e89f56c9509d4f628fddcedb131d9465cacd3d8bac337e7e", - "sha256:c935a22a557a560108d780f9a0fc426dd7459940dc54faa49d83249c8d3e760f", - "sha256:dbb8e7f2abee51cef77673be97760abff1674ed32847ce04b4af90f610144c7b", - "sha256:e6ea6b856a74d560d9326c0f5895ef8050126acfdc7ca08ad703eb0081e82b74", - "sha256:ebf2029c1f464c59b8bdbe5143c79fa2045a581ac53679733d3a91d400ff9efb", - "sha256:f1ff2ee69f10f13a9596480335f406dd1f70c3650349e2be67ca3139280cade0" - ], - "markers": "python_version >= '3.7'", - "version": "==9.3.0" - }, - "pyparsing": { - "hashes": [ - "sha256:2b020ecf7d21b687f219b71ecad3631f644a47f01403fa1d1036b0c6416d70fb", - "sha256:5026bae9a10eeaefb61dab2f09052b9f4307d44aee4eda64b309723d8d206bbc" - ], - "markers": "python_full_version >= '3.6.8'", - "version": "==3.0.9" - }, - "python-dateutil": { - "hashes": [ - "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86", - "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==2.8.2" - }, - "pytz": { - "hashes": [ - "sha256:222439474e9c98fced559f1709d89e6c9cbf8d79c794ff3eb9f8800064291427", - "sha256:e89512406b793ca39f5971bc999cc538ce125c0e51c27941bef4568b460095e2" - ], - "version": "==2022.6" - }, - "six": { - "hashes": [ - "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926", - "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==1.16.0" - } - }, - "develop": {} -} diff --git a/scripts/visualize-pop-results.py b/scripts/visualize-pop-results.py deleted file mode 100644 index 5bd0143..0000000 --- a/scripts/visualize-pop-results.py +++ /dev/null @@ -1,20 +0,0 @@ -from matplotlib import pyplot as plt -import pandas as pd - -with open("../pop-balances-out-inheritance.csv", "r") as file: - pop_inheritance_results = pd.read_csv(file) - -plt.hist(pop_inheritance_results.loc[:,"Balance"].sort_values(), bins=30) -plt.title("Wealth distribution (Inheritance)") -plt.xlabel("dollarydoos") -plt.ylabel("participants") -plt.show() - -with open("../pop-balances-out-redist.csv", "r") as file: - pop_redist_results = pd.read_csv(file) - -plt.hist(pop_redist_results.loc[:,"Balance"].sort_values(), bins=30) -plt.title("Wealth distribution (") -plt.xlabel("dollarydoos") -plt.ylabel("participants") -plt.show() diff --git a/sim.i b/sim.i new file mode 100644 index 0000000..c0d6a1c --- /dev/null +++ b/sim.i @@ -0,0 +1,5 @@ +%module sim +%{ +#include "pop-simple.hpp" +%} +%include "pop-simple.hpp"