From aeda145febd2dd19d429508fab5e780652d2d3a3 Mon Sep 17 00:00:00 2001 From: David Hendriks <davidhendriks93@gmail.com> Date: Fri, 6 Sep 2019 13:43:18 +0100 Subject: [PATCH] Trying out things with automatic reading of the output line and parameter names. Also, trying to fix that the import binaryc works as its supposed --- README.md | 19 +- build/temp.linux-x86_64-3.6/binary_c_python.o | Bin 49752 -> 50096 bytes .../example_notebook-checkpoint.ipynb | 165 ++++++++++++++++++ examples/example_notebook.ipynb | 165 ++++++++++++++++++ examples/full_evolution_with_plot.py | 7 +- examples/log_filename_test.py | 43 +++++ test_david.py => examples/loop_system.py | 57 ++---- examples/single_system.py | 40 +++++ .../test_noteboo-checkpoint.ipynb | 6 + tests_david/test_david.py | 36 ++++ tests_david/test_import.py | 5 + tests_david/test_noteboo.ipynb | 41 +++++ tests_david/testing_automatic_log_readout.py | 13 ++ utils/__pycache__/defaults.cpython-35.pyc | Bin 0 -> 5550 bytes utils/__pycache__/defaults.cpython-36.pyc | Bin 4891 -> 4887 bytes utils/__pycache__/functions.cpython-35.pyc | Bin 0 -> 461 bytes utils/__pycache__/functions.cpython-36.pyc | Bin 405 -> 438 bytes utils/functions.py | 6 +- 18 files changed, 549 insertions(+), 54 deletions(-) create mode 100644 examples/.ipynb_checkpoints/example_notebook-checkpoint.ipynb create mode 100644 examples/example_notebook.ipynb create mode 100644 examples/log_filename_test.py rename test_david.py => examples/loop_system.py (55%) create mode 100644 examples/single_system.py create mode 100644 tests_david/.ipynb_checkpoints/test_noteboo-checkpoint.ipynb create mode 100644 tests_david/test_david.py create mode 100644 tests_david/test_import.py create mode 100644 tests_david/test_noteboo.ipynb create mode 100644 tests_david/testing_automatic_log_readout.py create mode 100644 utils/__pycache__/defaults.cpython-35.pyc create mode 100644 utils/__pycache__/functions.cpython-35.pyc diff --git a/README.md b/README.md index 90c0ef452..b35e63ada 100644 --- a/README.md +++ b/README.md @@ -39,14 +39,31 @@ You will require whatever libraries with which binary_c was compiled, as well as If you want to be able to import the binary_c module correctly for child directories (or anywhere for that matter), execute or put the following code in your .bashrc/.zshrc: ``` -export LD_LIBRARY_PATH=<full path to directory containing libbinary_c_api.so> +export LD_LIBRARY_PATH=<full path to directory containing libbinary_c_api.so>:$LD_LIBRARY_PATH +export PYTHONPATH=<full path to directory containing libbinary_c_api.so>:$PYTHONPATH ``` +Usage notes +--------------------- +When running a jupyter notebook and importing binary_c, it might happen that the module binary_c cannot be found. I experienced this when I executed Jupyter Notebook from a virtual environment which didnt use the same python (version/binary/shim) as the one I built this library with. Make sure jupyter does use the same underlying python version/binary/shim. That resolved the issue for me. + +Also: I figured that having binaryc output the log like "<LOG HEADER> t=10e4 ..." (i.e. printing the parameter names as well as their values) would be useful because in that way one can easily have python read that out automatically instead of having to manually copy the list of parameter names. + + + TODO --------------------- +General: - ?Put the header and src files in a dedicated directory. - ?Have the compiled files be written into build +- Get a more reliable way of loading the default values (running a ./tbse echo or something?) +- make routine that reads out all the lines, splits them into pieces and reads out the correct key +- Add PYTHONPATH thing to readme +- Make sure importing binary_c is not a problem + +If we're going to do populations: - Use sphinx for auto generation of docs - Use queueing system/asynchronous task queue - Make some parse-data that can be easily used - Make some simple script to assign probabilities +- rebuild all perl stuff into a python grid code. \ No newline at end of file diff --git a/build/temp.linux-x86_64-3.6/binary_c_python.o b/build/temp.linux-x86_64-3.6/binary_c_python.o index ca9e7c36ab4089a52d0b5498471952e18df97964..af46f6afbc91b58d8074d7de4f69635428a0328d 100644 GIT binary patch literal 50096 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 literal 49752 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 NBIx?6DbPUg{{WP3_b~tf diff --git a/examples/.ipynb_checkpoints/example_notebook-checkpoint.ipynb b/examples/.ipynb_checkpoints/example_notebook-checkpoint.ipynb new file mode 100644 index 000000000..f9db89b13 --- /dev/null +++ b/examples/.ipynb_checkpoints/example_notebook-checkpoint.ipynb @@ -0,0 +1,165 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Example notebook binarypy" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "/user/HS128/dh00601/.pyenv/versions/3.6.4/envs/binaryc_py3.6.4/bin/python\n" + ] + } + ], + "source": [ + "import os, sys\n", + "import matplotlib.pyplot as plt\n", + "import pandas as pd\n", + "\n", + "# Append root dir of this project to include functionality\n", + "print(sys.executable)\n", + "sys.path.append(os.path.dirname(os.getcwd()))\n", + "import binary_c\n", + "from utils.defaults import physics_defaults\n", + "from utils.functions import create_arg_string" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "def example_with_loading_default_args():\n", + " \"\"\"\n", + " Example function loading the default physics args for a binary_c system. Got\n", + " it from the binary_grid2 perl module\n", + "\n", + " This function works if binary_c is set to log something every timestep so that we can plot the evolution of a system\n", + " \"\"\"\n", + "\n", + " # Load args\n", + " physics_args = physics_defaults.copy()\n", + "\n", + " # Manually set M_1, M_2, orbital_period and separation values:\n", + " physics_args['M_1'] = 20\n", + " physics_args['M_2'] = 15\n", + " physics_args['separation'] = 0 # 0 = ignored, use period\n", + " physics_args['orbital_period'] = 4530.0\n", + "\n", + " arg_string = create_arg_string(physics_args)\n", + " arg_string = 'binary_c {arg_string}'.format(arg_string=arg_string)\n", + "\n", + " buffer = \"\"\n", + "\n", + " output = binary_c.run_binary(arg_string)\n", + "\n", + " # Make some \n", + " results = {}\n", + " time_arr = []\n", + " mass_arr = []\n", + " mass_2_arr = []\n", + "\n", + " # split output on newlines\n", + " for line in output.split('\\n'):\n", + " # Skip any blank lines\n", + " if not line=='':\n", + " split_line = line.split()\n", + " header = split_line[0]\n", + " value_array = split_line[1:]\n", + "\n", + " # Use parse data here:\n", + " if header=='TESTLOG':\n", + " # Add values to lists\n", + " time_arr.append(float(value_array[0]))\n", + " mass_arr.append(float(value_array[1]))\n", + " mass_2_arr.append(float(value_array[4]))\n", + "\n", + " # Save in results dir\n", + " results['time'] = time_arr\n", + " results['mass'] = mass_arr\n", + " results['mass2'] = mass_2_arr\n", + "\n", + " return results\n" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [], + "source": [ + "results = example_with_loading_default_args()\n", + "df = pd.DataFrame.from_dict(results)" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "<Figure size 720x720 with 1 Axes>" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "min_time = 1e-1\n", + "max_time = 3000\n", + "# Plot some stuff\n", + "plt.figure(figsize=[10,10])\n", + "plt.plot(df[(df.time>min_time) & (df.time<max_time)]['time'], df[(df.time>min_time) & (df.time<max_time)]['mass'])\n", + "plt.plot(df[(df.time>min_time) & (df.time<max_time)]['time'], df[(df.time>min_time) & (df.time<max_time)]['mass2'])\n", + "plt.xscale('log')\n", + "plt.ylabel(r'Mass $M_{\\odot}$')\n", + "plt.xlabel('time (MYr)')\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.6.4" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/examples/example_notebook.ipynb b/examples/example_notebook.ipynb new file mode 100644 index 000000000..f9db89b13 --- /dev/null +++ b/examples/example_notebook.ipynb @@ -0,0 +1,165 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Example notebook binarypy" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "/user/HS128/dh00601/.pyenv/versions/3.6.4/envs/binaryc_py3.6.4/bin/python\n" + ] + } + ], + "source": [ + "import os, sys\n", + "import matplotlib.pyplot as plt\n", + "import pandas as pd\n", + "\n", + "# Append root dir of this project to include functionality\n", + "print(sys.executable)\n", + "sys.path.append(os.path.dirname(os.getcwd()))\n", + "import binary_c\n", + "from utils.defaults import physics_defaults\n", + "from utils.functions import create_arg_string" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "def example_with_loading_default_args():\n", + " \"\"\"\n", + " Example function loading the default physics args for a binary_c system. Got\n", + " it from the binary_grid2 perl module\n", + "\n", + " This function works if binary_c is set to log something every timestep so that we can plot the evolution of a system\n", + " \"\"\"\n", + "\n", + " # Load args\n", + " physics_args = physics_defaults.copy()\n", + "\n", + " # Manually set M_1, M_2, orbital_period and separation values:\n", + " physics_args['M_1'] = 20\n", + " physics_args['M_2'] = 15\n", + " physics_args['separation'] = 0 # 0 = ignored, use period\n", + " physics_args['orbital_period'] = 4530.0\n", + "\n", + " arg_string = create_arg_string(physics_args)\n", + " arg_string = 'binary_c {arg_string}'.format(arg_string=arg_string)\n", + "\n", + " buffer = \"\"\n", + "\n", + " output = binary_c.run_binary(arg_string)\n", + "\n", + " # Make some \n", + " results = {}\n", + " time_arr = []\n", + " mass_arr = []\n", + " mass_2_arr = []\n", + "\n", + " # split output on newlines\n", + " for line in output.split('\\n'):\n", + " # Skip any blank lines\n", + " if not line=='':\n", + " split_line = line.split()\n", + " header = split_line[0]\n", + " value_array = split_line[1:]\n", + "\n", + " # Use parse data here:\n", + " if header=='TESTLOG':\n", + " # Add values to lists\n", + " time_arr.append(float(value_array[0]))\n", + " mass_arr.append(float(value_array[1]))\n", + " mass_2_arr.append(float(value_array[4]))\n", + "\n", + " # Save in results dir\n", + " results['time'] = time_arr\n", + " results['mass'] = mass_arr\n", + " results['mass2'] = mass_2_arr\n", + "\n", + " return results\n" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [], + "source": [ + "results = example_with_loading_default_args()\n", + "df = pd.DataFrame.from_dict(results)" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "<Figure size 720x720 with 1 Axes>" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "min_time = 1e-1\n", + "max_time = 3000\n", + "# Plot some stuff\n", + "plt.figure(figsize=[10,10])\n", + "plt.plot(df[(df.time>min_time) & (df.time<max_time)]['time'], df[(df.time>min_time) & (df.time<max_time)]['mass'])\n", + "plt.plot(df[(df.time>min_time) & (df.time<max_time)]['time'], df[(df.time>min_time) & (df.time<max_time)]['mass2'])\n", + "plt.xscale('log')\n", + "plt.ylabel(r'Mass $M_{\\odot}$')\n", + "plt.xlabel('time (MYr)')\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.6.4" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/examples/full_evolution_with_plot.py b/examples/full_evolution_with_plot.py index 02cf4fd51..96a8af73f 100644 --- a/examples/full_evolution_with_plot.py +++ b/examples/full_evolution_with_plot.py @@ -1,16 +1,12 @@ import os, sys import matplotlib.pyplot as plt -import binary_c - # Append root dir of this project to include functionality sys.path.append(os.path.dirname(os.getcwd())) +import binary_c from utils.defaults import physics_defaults from utils.functions import create_arg_string - - - def example_with_loading_default_args(): """ Example function loading the default physics args for a binary_c system. Got @@ -29,7 +25,6 @@ def example_with_loading_default_args(): physics_args['orbital_period'] = 4530.0 arg_string = create_arg_string(physics_args) - arg_string = f'binary_c {arg_string}' buffer = "" diff --git a/examples/log_filename_test.py b/examples/log_filename_test.py new file mode 100644 index 000000000..80d244bac --- /dev/null +++ b/examples/log_filename_test.py @@ -0,0 +1,43 @@ +import os, sys +import matplotlib.pyplot as plt + +# Append root dir of this project to include functionality +sys.path.append(os.path.dirname(os.getcwd())) +import binary_c +from utils.defaults import physics_defaults +from utils.functions import create_arg_string + +""" +This script is intended to have the logfile of a binary system being outputted to a given directory so that we can use that logfile for other purposes +Like plotting/visualizing the general evolution of that system using e.g. Mirons script +""" + +def example_with_loading_default_args(): + """ + Example function loading the default physics args for a binary_c system. Got + it from the binary_grid2 perl module + + This function works if binary_c is set to log something every timestep so that we can plot the evolution of a system + """ + + # Load args + physics_args = physics_defaults.copy() + + # Manually set M_1, M_2, orbital_period and separation values: + physics_args['M_1'] = 20 + physics_args['M_2'] = 15 + physics_args['separation'] = 0 # 0 = ignored, use period + physics_args['orbital_period'] = 4530.0 + + physics_args['log_filename'] = os.path.join(os.getcwd(), 'test.log') + print(physics_args['log_filename']) + + arg_string = create_arg_string(physics_args) + arg_string = f'binary_c {arg_string}' + + buffer = "" + + print(arg_string) + + output = binary_c.run_binary(arg_string) +example_with_loading_default_args() \ No newline at end of file diff --git a/test_david.py b/examples/loop_system.py similarity index 55% rename from test_david.py rename to examples/loop_system.py index 99f0154fa..622b9c75c 100644 --- a/test_david.py +++ b/examples/loop_system.py @@ -1,32 +1,19 @@ -#!/usr/bin/python3 -import os -import binary_c +import os, sys import matplotlib.pyplot as plt -from defaults import physics_defaults - -############################################################ -# Test script to run a binary using the binary_c Python -# module. -############################################################ +# Append root dir of this project to include functionality +sys.path.append(os.path.dirname(os.getcwd())) +import binary_c +from utils.defaults import physics_defaults +from utils.functions import create_arg_string -def run_test_binary(): - m1 = 15.0 # Msun - m2 = 14.0 # Msun - separation = 0 # 0 = ignored, use period - orbital_period = 4530.0 # days - eccentricity = 0.0 - metallicity = 0.02 - max_evolution_time = 15000 - buffer = "" - # argstring = "binary_c M_1 {0:g} M_2 {1:g} separation {2:g} orbital_period {3:g} eccentricity {4:g} metallicity {5:g} max_evolution_time {6:g} ".format(m1,m2,separation,orbital_period,eccentricity,metallicity,max_evolution_time) - - argstring = f"binary_c M_1 {m1} M_2 {m2} separation {separation} orbital_period {orbital_period} eccentricity {eccentricity} metallicity {metallicity} max_evolution_time {max_evolution_time}" +""" +This script is an example of running a group of binary systems using a loop. For big grids this is not wise, the grid functionality will be built later - output = binary_c.run_binary(argstring) +I made this script to with the logging of binaryc set to log only one line per system (when a certain requirement is met). - # print ("Binary_c output:\n\n") - print (output) +You can either capture the data and print it, or write it to a file +""" def run_simple_loop_binary(): # Some simple function with a loop @@ -76,24 +63,4 @@ def run_simple_loop_binary(): print('mass1:', mass_1) print('zams_mass1:' ,initial_m1) - print('time:', time) - -# print("Current binary_c object class functions: ") -# print(dir(binary_c)) - -# print("Current binary_c.new_system object class functions: ") -# print(dir(binary_c.new_system())) -## WHat is the use of new_system? - -# print("Current binary_c.run_binary object class functions: ") -# print(dir(binary_c.run_binary())) - -# binary_star=binary_c.new_system() -# print(binary_star) -# print(dir(binary_star)) - -# Test single system -# run_test_binary() - -# Test grid-like -# run_simple_loop_binary() \ No newline at end of file + print('time:', time) \ No newline at end of file diff --git a/examples/single_system.py b/examples/single_system.py new file mode 100644 index 000000000..561a0fd0e --- /dev/null +++ b/examples/single_system.py @@ -0,0 +1,40 @@ +import os, sys + +# Append root dir of this project to include functionality +sys.path.append(os.path.dirname(os.getcwd())) +import binary_c + + +""" +Example script for running a single system. This is a very simple set up. +For a different way of inputting arg strings: + +from utils.defaults import physics_defaults +from utils.functions import create_arg_string + +physics_args = physics_defaults.copy() +physics_args['orbital_period'] = 4530.0 + +arg_string = create_arg_string(physics_args) +arg_string = f'binary_c {arg_string}' + +Other examples can be found using this method +""" + +def run_test_binary(): + m1 = 15.0 # Msun + m2 = 14.0 # Msun + separation = 0 # 0 = ignored, use period + orbital_period = 4530.0 # days + eccentricity = 0.0 + metallicity = 0.02 + max_evolution_time = 15000 + buffer = "" + # argstring = "binary_c M_1 {0:g} M_2 {1:g} separation {2:g} orbital_period {3:g} eccentricity {4:g} metallicity {5:g} max_evolution_time {6:g} ".format(m1,m2,separation,orbital_period,eccentricity,metallicity,max_evolution_time) + + argstring = f"binary_c M_1 {m1} M_2 {m2} separation {separation} orbital_period {orbital_period} eccentricity {eccentricity} metallicity {metallicity} max_evolution_time {max_evolution_time}" + + output = binary_c.run_binary(argstring) + + # print ("Binary_c output:\n\n") + print (output) \ No newline at end of file diff --git a/tests_david/.ipynb_checkpoints/test_noteboo-checkpoint.ipynb b/tests_david/.ipynb_checkpoints/test_noteboo-checkpoint.ipynb new file mode 100644 index 000000000..2fd64429b --- /dev/null +++ b/tests_david/.ipynb_checkpoints/test_noteboo-checkpoint.ipynb @@ -0,0 +1,6 @@ +{ + "cells": [], + "metadata": {}, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/tests_david/test_david.py b/tests_david/test_david.py new file mode 100644 index 000000000..3b9509991 --- /dev/null +++ b/tests_david/test_david.py @@ -0,0 +1,36 @@ +#!/usr/bin/python3 +import os +import binary_c +import matplotlib.pyplot as plt + +from utils.defaults import physics_defaults + +############################################################ +# Test script to run a binary using the binary_c Python +# module. +############################################################ + + + +print(binary_c) + + +# print("Current binary_c object class functions: ") +# print(dir(binary_c)) + +# print("Current binary_c.new_system object class functions: ") +# print(dir(binary_c.new_system())) +## WHat is the use of new_system? + +# print("Current binary_c.run_binary object class functions: ") +# print(dir(binary_c.run_binary())) + +# binary_star=binary_c.new_system() +# print(binary_star) +# print(dir(binary_star)) + +# Test single system +# run_test_binary() + +# Test grid-like +# run_simple_loop_binary() \ No newline at end of file diff --git a/tests_david/test_import.py b/tests_david/test_import.py new file mode 100644 index 000000000..848cfc72e --- /dev/null +++ b/tests_david/test_import.py @@ -0,0 +1,5 @@ +import os, sys +import binary_c +# sys.path.append(os.path.dirname(file)) +print(os.getenv('PYTHONPATH')) +#paths = os.getenv('PYTHONPATH').split(':' if os.name=='posix' else ';') \ No newline at end of file diff --git a/tests_david/test_noteboo.ipynb b/tests_david/test_noteboo.ipynb new file mode 100644 index 000000000..6592ec55f --- /dev/null +++ b/tests_david/test_noteboo.ipynb @@ -0,0 +1,41 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "import binary_c" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.6.4" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/tests_david/testing_automatic_log_readout.py b/tests_david/testing_automatic_log_readout.py new file mode 100644 index 000000000..cbd50cfdb --- /dev/null +++ b/tests_david/testing_automatic_log_readout.py @@ -0,0 +1,13 @@ +import os, sys +import matplotlib.pyplot as plt + +# # Append root dir of this project to include functionality +# sys.path.append(os.path.dirname(os.getcwd())) +# print(sys.path) +# quit() + +import binary_c +from utils.defaults import physics_defaults +from utils.functions import create_arg_string + + diff --git a/utils/__pycache__/defaults.cpython-35.pyc b/utils/__pycache__/defaults.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a32ade99bbfa82a830d3b87e46bc48ee0ce68ab5 GIT binary patch literal 5550 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 literal 0 HcmV?d00001 diff --git a/utils/__pycache__/defaults.cpython-36.pyc b/utils/__pycache__/defaults.cpython-36.pyc index d364497266246ceb5cb898c81ad256338ab74946..66affbd99df305c1259678cf298c21735745c30f 100644 GIT binary patch delta 139 zcmbQOHeHR)n3tF9?w5^hx0x7kZGOZwgNf}HQ%-r5{N#nKVw<P2HnX#FFfcF_ac-99 zUCG4AwfQ7}0;4lGNC-r{{P+L=|8yV&2tMow3xNqu##;gf8I{GE$;I(0scDI&IVHs_ c8H)IT%D}`gx5+tzrYxl;nK_$R3KlT}0JE$r82|tP delta 143 zcmbQPHd~F&n3tF9@vV()x0x8DHa}vT!NeBDlv5rhKY1am*yd@h&FpM!3=9lK?3?9z zS28hjY(B}K!05~g5&{t~|NZ~}KOM*bf)D$_LSRCZ@s>bAMrCnka&df0YFc7xPD$}f fh9VxIGBEMWYjTdDDMwmqUUErhe%|J#f<=q~)=?^- diff --git a/utils/__pycache__/functions.cpython-35.pyc b/utils/__pycache__/functions.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..62464c4667b48e168d6014c7ba2aa05b6cfb2208 GIT binary patch literal 461 zcmYjN!AiqG6nvXBr3NcXQSg?72szkX1TP{&MNfLL2cb|x%x;^sX%crg#k9?-{)}Ja zeXssSPrgkH_OWkvhMn2G>{+{Q|7>1|rv%^^_R2thk1dW7C@unD00Sfj^j$MVe_bYG z3%iFco)OSk5%|1@6~F{w4e&6$gvx*w(b);22`d9=LpzY1ufe#%$VUg>&@(Y~1~u}& zYc0CAgY{UXp^UTCkx?L>kh4HCfr2>!A3H+wI33qU1&gEQl$DjUoCit4Do2?pl~pU( zR1H)@HAfkr1yWf$n!Dzph4=V04yCd++uq3aD|`djKe&1F=2_z9kr&`$=7$+&9*tN^ zc{~-~dz=Qm40pR9Ugf2XveYYNoCt5U8((zuQk`ta_y516A5+)}U^PjHT#!S;wR~~6 Wdp*D&9N?L1-Oe&vB<!wE>+m1?J8{7P literal 0 HcmV?d00001 diff --git a/utils/__pycache__/functions.cpython-36.pyc b/utils/__pycache__/functions.cpython-36.pyc index 16a46b9804ec090a27bc98609a51840fce995f10..7aae7529a0a2c7d369cbd2ff93845ac4b5687f1f 100644 GIT binary patch delta 186 zcmbQryp5U5n3tF9o@Y_41mi?52RjP}28I;ITE+^s8ip)}W(F6ASgBg38paf+EXEq9 z8ipDsNrn{WUM6#fTE;@YaE2PjET(24yM{5CL6c=-myuo-Uv+kBWvxPWSz=CUYOR7M z(=BG8z%5oVUz7P33y@cQi!Cj`C^xZW;&FM-A|{}vD;bJ7Cce*8l49gwEaCzR_-R7u PA`T!2iQt@E&nN}}P=YRC delta 154 zcmdnSJe8Ttn3tF9@Qa|>p9~YZ92~3|7#LC*YZ)svY8bK@ni*UeVr6QXY8Y#nW;3KP z)iBgBNiu*~b6Lz8Y8eap!Wn89vlyF!>>9>k22JLP9Y);07!@>`Zn0#iRu)fuA<ub> m8OU16P{cl2fH6-=hLMA@h!bdwpC*JZVh3`N2#(1M7{vg!V<Wl% diff --git a/utils/functions.py b/utils/functions.py index a116cd908..2d4a479ea 100644 --- a/utils/functions.py +++ b/utils/functions.py @@ -5,6 +5,8 @@ def create_arg_string(arg_dict): arg_string = '' for key in arg_dict.keys(): - arg_string += f'{key} {arg_dict[key]} ' + arg_string += "{key} {value} ".format(key=key, value=arg_dict[key]) arg_string = arg_string.strip() - return arg_string \ No newline at end of file + return arg_string + + -- GitLab