From c161c780fa410f61a517e3b888e19c50289227dd Mon Sep 17 00:00:00 2001
From: David Hendriks <davidhendriks93@gmail.com>
Date: Mon, 13 Jan 2020 22:21:35 +0000
Subject: [PATCH] added scripts for population

---
 binarycpython/utils/NULL                     | Bin 0 -> 1186600 bytes
 binarycpython/utils/grid.py                  | 216 ++++++++++++++++++-
 binarycpython/utils/grid_options_defaults.py |   3 +
 3 files changed, 208 insertions(+), 11 deletions(-)
 create mode 100644 binarycpython/utils/NULL
 create mode 100644 binarycpython/utils/grid_options_defaults.py

diff --git a/binarycpython/utils/NULL b/binarycpython/utils/NULL
new file mode 100644
index 0000000000000000000000000000000000000000..a087085a1d94db519d7f5e429e17cce682acc6b8
GIT binary patch
literal 1186600
zcmeI*3Am1B-T?4JDMDmRMnjf{%0W^Q?gvG?7Fvync10y5B2j8ApGKA<3el7$(->Jg
zWGPEU653EBD$9{Is`H)Yea^`#>ig!aYrdJ^b6uVPdoR!bx$obz9Ovr3o;OcYQc_y_
zcHdp?Zo2ulyKZWiUbYb+K!5-N0t5&UAV7cs0RsP?0;ea}Og{79b82QqfB*pk1PBly
zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF
z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk
z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs
z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ
zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U
zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7
z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N
z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+
z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly
zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF
z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk
z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs
z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ
zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U
zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7
z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N
z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+
z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly
zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF
z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk
z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs
z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ
zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U
zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7
z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N
z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+
z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly
zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF
z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk
z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs
z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ
zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U
zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7
z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N
z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+
z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly
zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF
z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk
z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs
z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ
zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U
zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7
z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N
z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+
z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly
zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF
z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk
z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs
z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ
zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U
zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7
z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N
z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+
z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly
zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF
z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk
z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs
z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ
zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U
zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7
z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N
z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+
z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly
zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF
z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk
z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs
z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ
zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U
zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7
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
KO3ZdkeE4sbvRCT>

literal 0
HcmV?d00001

diff --git a/binarycpython/utils/grid.py b/binarycpython/utils/grid.py
index bf2ecd3f3..caf425b34 100644
--- a/binarycpython/utils/grid.py
+++ b/binarycpython/utils/grid.py
@@ -1,9 +1,31 @@
+import os
+import copy
+import json
+
 import binary_c_python_api
 
 from binarycpython.utils.functions import get_defaults
 
 import binarycpython
 
+from grid_options_defaults import grid_options_defaults_dict
+
+
+
+# TODO: add functionality to 'on-init' set arguments
+# TODO: add functionality to export the arg string.
+# TODO: add functionality to export all the options
+# TODO: add functionality to create the dict that goes into the arg line. 
+# TODO: add functionality to return the initial_abundance_hash
+# TODO: add functionality to return the isotope_hash
+# TODO: add functionality to return the isotope_list
+# TODO: add functionality to return the nuclear_mass_hash
+# TODO: add functionality to return the nuclear_mass_list
+# TODO: add functionality to return the source_list
+# TODO: add functionality to return the ensemble_list
+# TODO: add functionality to return the evcode_version_string
+# TODO: add functionality to return the evcode_args_list
+
 
 class Population(object):
     def __init__(self):
@@ -12,28 +34,200 @@ class Population(object):
         """
 
         self.defaults = get_defaults()
-        pass
+
+        # Different sections of options
+        self.bse_options = self.defaults.copy()
+        self.grid_options = grid_options_defaults_dict.copy()
+        self.custom_options = {}
+
+        # Argline dict
+        self.argline_dict = {}
+
+    def return_options(self):
+        """
+        Function that returns all the options that have been set.
+
+        Can be combined with json to make a nice file. 
+        """
+
+        options = {
+            'bse_options': self.bse_options,
+            'grid_options': self.grid_options,
+            'custom_options': self.custom_options,
+        }
+
+        return options
+
+
+    def create_argline_dict(self, print_excluded=False):
+        """
+        Function to prepare the dictionary of options that go into the argument line for the binary_c call.
+
+        This function 
+        """
+
+        self.argline_dict = {}
+
+        # Lists to store indices of parameters that have been included and excluded. 
+        included, excluded = [], []
+
+        # Go over the parameters.    
+        for i, param_name in enumerate(sorted(self.bse_options)):
+            # We need to filter out some parameters:
+            # Filter out those that have an literal empty value. The argument parser of binary_c doesnt work properly with that.
+            # Filter out those that have value Function. adding these to the argument will execute the function instead of evolving the system
+            # Filter out those that have value NULL. In general these only come from the defaults of binary_c itself. 
+            #   What I do here is comparing whether the value of the bse_option is NULL currently AND as a default. In that way one could set some other part to NULL (don't know what situation that would be tho..) 
+
+
+            if (not ((self.bse_options[param_name] == 'NULL') and (self.bse_options[param_name] == self.defaults[param_name]))) \
+            and (not self.bse_options[param_name] == "") and (not self.bse_options[param_name] == "Function"):
+                self.argline_dict[param_name] = self.bse_options[param_name]
+                # print("{} {} ".format(param_name, self.bse_options[param_name]))
+                included.append(i)
+            else:
+                # print("{} {} ".format(param_name, repr(self.bse_options[param_name])))
+                excluded.append(i)
+
+        common = set(included).intersection(excluded)
+        combined = set(included).union(excluded)
+
+        if print_excluded:
+            print("Total parameters included in the argument: {}. Total excluded: {}. ".format(len(included), len(excluded)))
+            print([sorted(self.bse_options)[i] for i in excluded])
+
+
+    def create_argline(self, option_dict):
+        """
+        Function to create the string for the arg line
+        """
+
+        argline = "binary_c "
+        for param_name in sorted(option_dict):
+            argline += "{} {} ".format(param_name, self.argline_dict[param_name])
+        argline = argline.strip()
+        return argline
+
+    def return_argline(self, print_excluded=False):
+        """
+        Function to return the argline that is used in the binary_c api call:
+        be aware that some of the parameters vary: M1 M2 period etc because these are set by distributions.
+
+        """
+
+        self.create_argline_dict(print_excluded)
+
+        argline = "binary_c "
+        for param_name in sorted(self.argline_dict.keys()):
+            argline += "{} {} ".format(param_name, self.argline_dict[param_name])
+
+        argline = argline.strip()
+        return argline
+
+    def set(self, **kwargs):
+        """
+        Function to set the values of the population
+
+        The input (as kwargs) is checked compared to the available bse_options and grid options.
+        if the parameter name is not included in either of those, then it will be stored in an custom_options dict.
+        """
+
+        for key in kwargs.keys():
+            # Filter out keys for the bse_options
+            if key in self.bse_options.keys():
+                self.bse_options[key] = kwargs[key]
+            # Filter out keys for the grid_options
+            elif key in self.grid_options.keys():
+                self.grid_options[key] = kwargs[key]
+            # The of the keys go into a custom_options dict
+            else:
+                self.custom_options[key] = kwargs[key]
 
     def evolve(self):
         pass
 
+
+
     def evolve_single(self):
-        arg_string = "binary_c "
-        for param in self.defaults.keys():
-            print(param, self.defaults[param])
-            if self.defaults[param] == "":
-                print(self.defaults[param])
+        """
+        Function to run a single system
+        """
+
+        self.create_argline_dict()        
 
-            # arg_string += "{} {} ".format(param, self.defaults[param])
+        argline = self.create_argline(self.argline_dict)
 
-        # arg_string = arg_string.strip()
-        out = binary_c_python_api.run_binary(arg_string)
+        out = binary_c_python_api.run_binary(argline)
+        # out = binary_c_python_api.run_binary('binary_c M_1 15 M_2 14 separation 0 orbital_period 4530 eccentricity 0 metallicity 0.02 max_evolution_time 15000')
         print(out)
-        # print(  arg_string)
 
 
+    def return_binary_c_version_info(self):
+        """
+        Function that returns the version information of binary_c
+        """
+
+        out = binary_c_python_api.run_binary('binary_c version')
+        return out
+
+    def test_evolve_single(self):
+        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
+        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,
+        )
+
+        output = binary_c_python_api.run_binary(argstring)
+
+        print("\n\nBinary_c output:")
+        print(output)
+
+
+
+
+
+################################################################################################ 
 test_pop = Population()
 
-# print(test_pop.defaults)
+# Setting values
+# print(test_pop.bse_options['M_1'])
+# print(test_pop.bse_options['M_2'])
+# test_pop.set(M_1=10, M_2=500)
+# print(test_pop.bse_options['M_1'])
+# print(test_pop.bse_options['M_2'])
+test_pop.set(M_1=10, separation=0, orbital_period=4580, max_evolution_time=15000, eccentricity=0.02, )
+
 
+
+# Testing single evolution
 test_pop.evolve_single()
+# test_pop.test_evolve_single()
+
+## Setting custom value
+# test_pop.set(data_dir=os.path.join(os.environ['BINARYC_DATA_ROOT'], 'development_example'))
+# print(test_pop.custom_options['data_dir'])
+
+# printing all options
+# print(json.dumps(test_pop.return_options(), indent=4))
+
+# return arglines:
+# test_pop.set(M_1=10, M_2=500)
+print(test_pop.return_argline())
+# test_pop.return_argline(print_excluded=True)
+
+#print(test_pop.bse_options)
+
+# return version info
+a = str(test_pop.return_binary_c_version_info())
+print(a)
\ No newline at end of file
diff --git a/binarycpython/utils/grid_options_defaults.py b/binarycpython/utils/grid_options_defaults.py
new file mode 100644
index 000000000..a426a8814
--- /dev/null
+++ b/binarycpython/utils/grid_options_defaults.py
@@ -0,0 +1,3 @@
+grid_options_defaults_dict = {
+    'custom_logging_function': None,
+}
\ No newline at end of file
-- 
GitLab