From dbf1bc237bfe67ed71b26c976bdfc38efa681534 Mon Sep 17 00:00:00 2001 From: "Casper V. Kristensen" Date: Wed, 5 Sep 2018 13:16:44 +0200 Subject: [PATCH] Lol --- .gitignore | 244 +++++++++++++++++++++++++++++++++++++++++++++++ big_static_n.log | 3 +- heatmap.png | Bin 0 -> 37788 bytes plotter.py | 160 ++++++++++++++++--------------- 4 files changed, 329 insertions(+), 78 deletions(-) create mode 100644 .gitignore create mode 100644 heatmap.png diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..17e588c --- /dev/null +++ b/.gitignore @@ -0,0 +1,244 @@ + +# Created by https://www.gitignore.io/api/python,pycharm,pycharm+all,pycharm+iml + +### PyCharm ### +# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio and Webstorm +# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839 + +# User-specific stuff: +.idea/**/workspace.xml +.idea/**/tasks.xml +.idea/dictionaries + +# Sensitive or high-churn files: +.idea/**/dataSources/ +.idea/**/dataSources.ids +.idea/**/dataSources.xml +.idea/**/dataSources.local.xml +.idea/**/sqlDataSources.xml +.idea/**/dynamic.xml +.idea/**/uiDesigner.xml + +# Gradle: +.idea/**/gradle.xml +.idea/**/libraries + +# CMake +cmake-build-debug/ + +# Mongo Explorer plugin: +.idea/**/mongoSettings.xml + +## File-based project format: +*.iws + +## Plugin-specific files: + +# IntelliJ +/out/ + +# mpeltonen/sbt-idea plugin +.idea_modules/ + +# JIRA plugin +atlassian-ide-plugin.xml + +# Cursive Clojure plugin +.idea/replstate.xml + +# Ruby plugin and RubyMine +/.rakeTasks + +# Crashlytics plugin (for Android Studio and IntelliJ) +com_crashlytics_export_strings.xml +crashlytics.properties +crashlytics-build.properties +fabric.properties + +### PyCharm Patch ### +# Comment Reason: https://github.com/joeblau/gitignore.io/issues/186#issuecomment-215987721 + +# *.iml +# modules.xml +# .idea/misc.xml +# *.ipr + +# Sonarlint plugin +.idea/sonarlint + +### PyCharm+all ### +# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio and Webstorm +# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839 + +# User-specific stuff: + +# Sensitive or high-churn files: + +# Gradle: + +# CMake + +# Mongo Explorer plugin: + +## File-based project format: + +## Plugin-specific files: + +# IntelliJ + +# mpeltonen/sbt-idea plugin + +# JIRA plugin + +# Cursive Clojure plugin + +# Ruby plugin and RubyMine + +# Crashlytics plugin (for Android Studio and IntelliJ) + +### PyCharm+all Patch ### +# Ignores the whole idea folder +# See https://github.com/joeblau/gitignore.io/issues/186 and https://github.com/joeblau/gitignore.io/issues/360 + +.idea/ + +### PyCharm+iml ### +# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio and Webstorm +# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839 + +# User-specific stuff: + +# Sensitive or high-churn files: + +# Gradle: + +# CMake + +# Mongo Explorer plugin: + +## File-based project format: + +## Plugin-specific files: + +# IntelliJ + +# mpeltonen/sbt-idea plugin + +# JIRA plugin + +# Cursive Clojure plugin + +# Ruby plugin and RubyMine + +# Crashlytics plugin (for Android Studio and IntelliJ) + +### PyCharm+iml Patch ### +# Reason: https://github.com/joeblau/gitignore.io/issues/186#issuecomment-249601023 + +*.iml +modules.xml +.idea/misc.xml +*.ipr + +### Python ### +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +*.egg-info/ +.installed.cfg +*.egg + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.coverage +.coverage.* +.cache +.pytest_cache/ +nosetests.xml +coverage.xml +*.cover +.hypothesis/ + +# Translations +*.mo +*.pot + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# pyenv +.python-version + +# celery beat schedule file +celerybeat-schedule.* + +# SageMath parsed files +*.sage.py + +# Environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ + + +# End of https://www.gitignore.io/api/python,pycharm,pycharm+all,pycharm+iml \ No newline at end of file diff --git a/big_static_n.log b/big_static_n.log index 710e75d..761f838 100644 --- a/big_static_n.log +++ b/big_static_n.log @@ -375,5 +375,4 @@ size: 536870912, step: 8388608 and time Elapsed: 70 milliseconds size: 536870912, step: 16777216 and time Elapsed: 48 milliseconds size: 536870912, step: 33554432 and time Elapsed: 93 milliseconds size: 536870912, step: 67108864 and time Elapsed: 71 milliseconds -size: 536870912, step: 134217728 and time Elapsed: 78 milliseconds - +size: 536870912, step: 134217728 and time Elapsed: 78 milliseconds \ No newline at end of file diff --git a/heatmap.png b/heatmap.png new file mode 100644 index 0000000000000000000000000000000000000000..b5c1e4a744f4bee8ec971ca594e811c372b5c69c GIT binary patch literal 37788 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 Mk-6c8g-*Nw52R~NC;$Ke literal 0 HcmV?d00001 diff --git a/plotter.py b/plotter.py index a09660d..a4b56f7 100644 --- a/plotter.py +++ b/plotter.py @@ -1,76 +1,84 @@ -import subprocess -import tempfile -import re -import matplotlib.pyplot as plt -from collections import defaultdict -import argparse -from math import log2 -import pandas as pd - - - -parser = argparse.ArgumentParser(description='Read data from a data file and plot this.') - -parser.add_argument('--data_file', action='store', dest='data_file', default='plot_data.txt', - help='The desired data to be plotted.') -parser.add_argument('--static_n', action='store_true', - help="Is the n variable static in the data file?") -parser.add_argument('--static_step', action='store_true', - help="Is the step variable static in the data file?") - - -args = parser.parse_args() - -data = open(args.data_file).read() - - -# d = {'static variable' : {step : time, step : time}} - - -def prep_data(static_var, data): - non_static_var = (static_var + 1) % 2 # if 0 then 1, if 1 then 0 - #non_static_var = 1 - static_var #rip :( - - lines = data.split('\n') - static_vars = set() - - data = defaultdict(dict) - - for line in lines[0:-1]: - all_vars = re.findall(r"\d+", line) - - static = int(all_vars[static_var]) - non_static = int(all_vars[non_static_var]) - time = int(all_vars[2]) - - static_vars.add(static) - data[static][non_static] = time - - return data - - - - -static_var = 0 if args.static_n else 1 -plot_data = prep_data(static_var, data) -df = pd.DataFrame(data=plot_data) -print(df) - -plt.imshow(df, cmap='hot') -plt.show() - - -#first = plot_data[list(plot_data.keys())[2]] - -#plt.plot(first[0], first[1]) - -#for static, plotting_data in plot_data.items(): -# x_axis = [log2(x) for x in plotting_data[0]] -# plt.plot(x_axis, plotting_data[1], marker="o", label = static) - - -#plt.xticks([2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26], ["$log2(2^2)$", "log2(2^4)", "log2(2^6)", "log2(2^8)", "log2(2^10)", "log2(2^12)", "log2(2^14)", "log2(2^16)", "log2(2^18)", "log2(2^20)", "log2(2^22)", "log2(2^24)", "log2(2^26)"]) -#plt.legend(loc=1, borderaxespad=0.) -#plt.ylabel('time/ms') -#plt.xlabel('log(step)') -#plt.show() +import math +import subprocess +import tempfile +import re +import matplotlib.pyplot as plt +from collections import defaultdict +import argparse +from math import log2 +import pandas as pd +import seaborn as sns + + +parser = argparse.ArgumentParser(description='Read data from a data file and plot this.') + +parser.add_argument('--data_file', action='store', dest='data_file', default='plot_data.txt', + help='The desired data to be plotted.') +parser.add_argument('--static_n', action='store_true', + help="Is the n variable static in the data file?") +parser.add_argument('--static_step', action='store_true', + help="Is the step variable static in the data file?") + + +args = parser.parse_args() + +data = open(args.data_file).read() + + +# d = {'static variable' : {step : time, step : time}} + + +def prep_data(static_var, data): + non_static_var = (static_var + 1) % 2 # if 0 then 1, if 1 then 0 + #non_static_var = 1 - static_var #rip :( + + lines = data.split('\n') + static_vars = set() + + data = defaultdict(dict) + + for line in lines[0:-1]: + all_vars = re.findall(r"\d+", line) + + static = int(all_vars[static_var]) + non_static = int(all_vars[non_static_var]) + time = int(all_vars[2]) + + static_vars.add(static) + data[static][non_static] = time + + return data + + + + +static_var = 0 if args.static_n else 1 +plot_data = prep_data(static_var, data) +df = pd.DataFrame(data=plot_data) +print(df) + +hm = sns.heatmap(df, annot=False, square=False, cmap=sns.cm.rocket_r) +hm.invert_yaxis() + +# fix xtics +locs, labels = plt.xticks() +plt.xticks(locs, [f"$2^{{{int(math.log2(int(i.get_text())))}}}$" for i in labels]) +locs, labels = plt.yticks() +plt.yticks(locs, [f"$2^{{{int(math.log2(int(i.get_text())))}}}$" for i in labels]) + +plt.show() + +#first = plot_data[list(plot_data.keys())[2]] + +#plt.plot(first[0], first[1]) + +#for static, plotting_data in plot_data.items(): +# x_axis = [log2(x) for x in plotting_data[0]] +# plt.plot(x_axis, plotting_data[1], marker="o", label = static) + + +#plt.xticks([2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26], ["$log2(2^2)$", "log2(2^4)", "log2(2^6)", "log2(2^8)", "log2(2^10)", "log2(2^12)", "log2(2^14)", "log2(2^16)", "log2(2^18)", "log2(2^20)", "log2(2^22)", "log2(2^24)", "log2(2^26)"]) +#plt.legend(loc=1, borderaxespad=0.) +#plt.ylabel('time/ms') +#plt.xlabel('log(step)') +#plt.show()