diff --git a/binarycpython/utils/grid.py b/binarycpython/utils/grid.py index fb24d0661b9496b7f611be79e72956f1e8c30371..f762a75fb26bd3db6ae93c0f29f8db1b94dce4b8 100644 --- a/binarycpython/utils/grid.py +++ b/binarycpython/utils/grid.py @@ -685,6 +685,130 @@ class Population(object): # Testing functions ################################################### + def test_evolve_population(self): + """ + The to test running a population + """ + + import time + import multiprocessing as mp + from pathos.multiprocessing import ProcessingPool as Pool + import random + + ####################### + ### Custom logging code: + self.set_custom_logging() + + ### Load store + self.grid_options["store_memaddr"] = binary_c_python_api.return_store("") + + + ####################### + # Dry run and getting starcount + self.generate_grid_code(dry_run=True) + + self.load_grid_function() + + self.dry_run() + + print(self.grid_options['total_starcount']) + + + ####################### + # Linear run + self.generate_grid_code(dry_run=False) + + self.load_grid_function() + + for i, system in enumerate(self.grid_options["system_generator"](self)): + full_system_dict = self.bse_options.copy() + full_system_dict.update(system) + + binary_cmdline_string = self.return_argline(full_system_dict) + print(i+1, binary_cmdline_string) + + ####################### + # MP run + start_mp = time.time() + + self.generate_grid_code(dry_run=False) + + self.load_grid_function() + + def evolve_system(system): + full_system_dict = self.bse_options.copy() + full_system_dict.update(system) + + binary_cmdline_string = self.return_argline(full_system_dict) + print(binary_cmdline_string) + + # self.set_bse_option("M_1", mass) + # out = binary_c_python_api.run_population( + # self.return_argline(), + # self.grid_options["custom_logging_func_memaddr"], + # self.grid_options["store_memaddr"], + # ) + # # parse_function(self, out) + + def yield_system(): + for i, system in enumerate(self.grid_options["system_generator"](self)): + print(i+1) + yield system + print("generator done") + + # Create pool + p = Pool(nodes=self.grid_options["amt_cores"]) + + # Execute + r = list(p.imap(evolve_system, yield_system())) + + stop_mp = time.time() + + # Give feedback + + print( + "with mp: {} systems took {}s using {} cores".format( + self.grid_options['total_starcount'], + stop_mp - start_mp, + self.grid_options["amt_cores"], + ) + ) + + quit() + ######################## + + # evolve with mp + start_mp = time.time() + + def evolve_mp(mass): + self.set_bse_option("M_1", mass) + out = binary_c_python_api.run_population( + self.return_argline(), + self.grid_options["custom_logging_func_memaddr"], + self.grid_options["store_memaddr"], + ) + parse_function(self, out) + + p = Pool(nodes=self.grid_options["amt_cores"]) + + def g(mass_distribution): + masses = mass_distribution + for mass in masses: + yield mass + print("generator done") + + r = list(p.imap(evolve_mp, g(mass_distribution))) + stop_mp = time.time() + + print( + "with mp: {} systems took {}s using {} cores".format( + len(mass_distribution), + stop_mp - start_mp, + self.grid_options["amt_cores"], + ) + ) + + def test_evolve_single(self): """ Function to test the evolution of a system. Calls the api binding directly. @@ -740,6 +864,8 @@ class Population(object): """ Function that generates the code from which the population will be made. + dry_run: when True, it will return the starcount at the end so that we know what the total amount of systems is. + The phasevol values are handled by generating a second array @@ -1076,6 +1202,12 @@ class Population(object): indent * (depth + 1) + "print('with a total probability of {}'.format(2))\n" ) + if dry_run: + code_string += ( + indent * (depth + 1) + "return total_starcount\n" + ) + + ################################################################################# # Stop of code generation. Here the code is saved and written @@ -1104,6 +1236,8 @@ class Population(object): - reset values to 0 - remove grid file - unload grid function/module + - remove dry grid file + - unload dry grid function/module """ pass @@ -1125,23 +1259,28 @@ class Population(object): spec = importlib.util.spec_from_file_location( "binary_c_python_grid", - os.path.join(self.grid_options["tmp_dir"], "example_grid.py"), + os.path.join(self.grid_options["gridcode_filename"]), ) grid_file = importlib.util.module_from_spec(spec) spec.loader.exec_module(grid_file) - generator = grid_file.grid_code(self) + generator = grid_file.grid_code self.grid_options["system_generator"] = generator if self.grid_options["verbose"] > 0: print("Grid code loaded") - # for el in generator: - # print(el) + def dry_run(self): + """ + Function to dry run the grid and know how many stars it will run + + Requires the grid to be built as a dry run grid + """ + + system_generator = self.grid_options["system_generator"] + total_starcount = system_generator(self) + self.grid_options['total_starcount'] = total_starcount - # print(next(generator)) - # print(next(generator)) - # print(next(generator)) def write_binary_c_calls_to_file(self, output_dir=None, output_filename=None): """ diff --git a/tests/population/grid_tests.py b/tests/population/grid_tests.py index 986fdca4dd0d51f3dec4cafd821d49dc37f23a6f..a0f4e976138fabddc82c211f8eddc688727b5304 100644 --- a/tests/population/grid_tests.py +++ b/tests/population/grid_tests.py @@ -213,6 +213,84 @@ test_pop.set( ### Grid generating testing +# test_pop.add_grid_variable( +# name="lnm1", +# longname="log primary mass", +# valuerange=[10, 20], +# resolution="10", +# spacingfunc="np.linspace(0.213, 10.2, 10)", +# precode="M_1=math.exp(lnm1)", +# probdist="flat(M_1)", +# # probdist='self.custom_options["extra_prob_function"](M_1)', +# dphasevol="", +# parameter_name="M_1", +# condition="", +# ) + +# ### Grid generating test. +# test_pop.add_grid_variable( +# name="period", +# longname="period", +# valuerange=["M_1", 20], +# resolution="10", +# spacingfunc="np.linspace(1, 10, 10)", +# precode="orbital_period = period**2", +# probdist="flat(orbital_period)", +# parameter_name="orbital_period", +# dphasevol="", +# condition='self.grid_options["binary"]==0', +# ) + +# test_pop.generate_grid_code() + +# test_pop.load_grid_function() + +# test_pop.write_binary_c_calls_to_file(output_dir="/home/david/Desktop") + + +# print(test_pop.grid_options["code_string"]) + +#### +# Dry run: +# test_pop.set(verbose=1) +# test_pop.add_grid_variable( +# name="lnm1", +# longname="log primary mass", +# valuerange=[10, 20], +# resolution="10", +# spacingfunc="np.linspace(0.213, 10.2, 10)", +# precode="M_1=math.exp(lnm1)", +# probdist="flat(M_1)", +# # probdist='self.custom_options["extra_prob_function"](M_1)', +# dphasevol="", +# parameter_name="M_1", +# condition="", +# ) + +# ### Grid generating test. +# test_pop.add_grid_variable( +# name="period", +# longname="period", +# valuerange=["M_1", 20], +# resolution="10", +# spacingfunc="np.linspace(1, 10, 10)", +# precode="orbital_period = period**2", +# probdist="flat(orbital_period)", +# parameter_name="orbital_period", +# dphasevol="", +# condition='self.grid_options["binary"]==0', +# ) + +# test_pop.generate_grid_code(dry_run=True) + +# test_pop.load_grid_function() + +# test_pop.dry_run() + +#### +# testing population: + +test_pop.set(verbose=1, amt_cores=4) test_pop.add_grid_variable( name="lnm1", longname="log primary mass", @@ -241,11 +319,5 @@ test_pop.add_grid_variable( condition='self.grid_options["binary"]==0', ) -test_pop.generate_grid_code() - -test_pop.load_grid_function() - -test_pop.write_binary_c_calls_to_file(output_dir="/home/david/Desktop") - - -# print(test_pop.grid_options["code_string"]) +test_pop.test_evolve_population() +# test_pop.generate_grid_code(dry_run=True)