Skip to content
Snippets Groups Projects
Commit 43f777a1 authored by David Hendriks's avatar David Hendriks
Browse files

Merge branch 'population' of gitlab.eps.surrey.ac.uk:ri0005/binary_c-python into population

parents 590e02f4 5cea5aed
No related branches found
No related tags found
No related merge requests found
......@@ -433,7 +433,7 @@ class Population(object):
# Get argument line
argline = self.return_argline(self.bse_options)
print('Running {}'.format(argline))
# Run system
out = binary_c_python_api.run_system(
argline,
......@@ -552,16 +552,17 @@ class Population(object):
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)
#full_system_dict = self.bse_options.copy()
#full_system_dict.update(system)
binary_cmdline_string = self.return_argline(full_system_dict)
out = binary_c_python_api.run_population(
binary_cmdline_string,
self.grid_options["custom_logging_func_memaddr"],
self.grid_options["store_memaddr"],
)
print("{}/{}".format(i+1, total_starcount_run), binary_cmdline_string)
#binary_cmdline_string = self.return_argline(full_system_dict)
pass
# out = binary_c_python_api.run_population(
# binary_cmdline_string,
# self.grid_options["custom_logging_func_memaddr"],
# self.grid_options["store_memaddr"],
# )
# print("{}/{}".format(i+1, total_starcount_run), binary_cmdline_string)
stop_lin = time.time()
......@@ -617,11 +618,12 @@ class Population(object):
# pass
# print('next')
# self.set_bse_option("M_1", mass)
out = binary_c_python_api.run_population(
binary_cmdline_string,
self.grid_options["custom_logging_func_memaddr"],
self.grid_options["store_memaddr"],
)
# out = binary_c_python_api.run_population(
# binary_cmdline_string,
# self.grid_options["custom_logging_func_memaddr"],
# self.grid_options["store_memaddr"],
# )
pass
# # parse_function(self, out)
def yield_system():
......@@ -630,9 +632,9 @@ class Population(object):
full_system_dict.update(system)
binary_cmdline_string = self.return_argline(full_system_dict)
print("{}/{}".format(i+1, total_starcount_run), binary_cmdline_string)
# print("{}/{}".format(i+1, total_starcount_run), binary_cmdline_string)
yield binary_cmdline_string
# yield i
print("generator done")
# Create pool
......@@ -654,6 +656,95 @@ class Population(object):
return stop_mp - start_mp
def test_evolve_population_mp_chunks(self):
"""
Test function to evolve a population in a parallel way.
returns total time spent on the actual interfacing with binaryc
"""
import time
import multiprocessing as mp
# from pathos.multiprocessing import ProcessingPool as Pool
from pathos.pools import _ProcessPool as Pool
#######################
### 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.grid_options['probtot'] = 0
self.generate_grid_code(dry_run=True)
self.load_grid_function()
self.dry_run()
total_starcount_run = self.grid_options['total_starcount']
print("Total starcount for this run will be: {}".format(total_starcount_run))
#######################
# MP run
self.grid_options['probtot'] = 0 # To make sure that the values are reset. TODO: fix this in a cleaner way
start_mp = time.time()
self.generate_grid_code(dry_run=False)
self.load_grid_function()
def evolve_system(binary_cmdline_string):
# print(binary_cmdline_string)
# pass
# print('next')
# self.set_bse_option("M_1", mass)
# out = binary_c_python_api.run_population(
# binary_cmdline_string,
# self.grid_options["custom_logging_func_memaddr"],
# self.grid_options["store_memaddr"],
# )
pass
# # parse_function(self, out)
def yield_system():
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("{}/{}".format(i+1, total_starcount_run), binary_cmdline_string)
yield binary_cmdline_string
# yield i
print("generator done")
# Create pool
p = Pool(processes=self.grid_options["amt_cores"])
# Execute
r = list(p.imap_unordered(evolve_system, yield_system(), chunksize=100))
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"],
)
)
return stop_mp - start_mp
def test_evolve_single(self):
"""
Function to test the evolution of a system. Calls the api binding directly.
......@@ -953,7 +1044,7 @@ class Population(object):
code_string += indent * (depth + 1) + "# Setting probabilities\n"
code_string += (
indent * (depth + 1)
+ "d{} = {}".format(grid_variable["name"], grid_variable["probdist"])
+ "d{} = phasevol_{} * {}".format(grid_variable["name"], grid_variable["name"], grid_variable["probdist"])
+ "\n"
)
......
......@@ -304,7 +304,7 @@ test_pop.add_grid_variable(
# precode="M_1=math.exp(lnm1)",
probdist="flat(M_1)",
# probdist='self.custom_options["extra_prob_function"](M_1)',
dphasevol="dlnm1",
dphasevol="dM_1",
parameter_name="M_1",
condition="",
)
......@@ -329,7 +329,7 @@ test_pop.set(verbose=1,
)
test_pop.test_evolve_population()
test_pop.test_evolve_population_mp()
# print(test_pop.grid_options["probtot"])
# print(test_pop.grid_options["count"])
\ No newline at end of file
......@@ -121,6 +121,18 @@ test_pop.add_grid_variable(
condition='self.grid_options["binary"]==1',
)
# MP
total_mp_start = time.time()
# evolve_mp_time = test_pop.test_evolve_population_mp()
evolve_mp_time = test_pop.test_evolve_population_mp_chunks()
total_mp_stop = time.time()
total_mp = total_mp_stop - total_mp_start
print("MP ({} nodes) run with {} systems: {} of which {} spent on evolving the systems".format(AMT_CORES, total_systems, total_mp, evolve_mp_time))
# Lin
total_lin_start = time.time()
......@@ -132,22 +144,13 @@ total_lin = total_lin_stop - total_lin_start
print("linear run with {} systems: {} of which {} spent on evolving the systems".format(total_systems, total_lin, evolve_lin_time))
# MP
total_mp_start = time.time()
evolve_mp_time = test_pop.test_evolve_population_mp()
total_mp_stop = time.time()
total_mp = total_mp_stop - total_mp_start
print("MP ({} nodes) run with {} systems: {} of which {} spent on evolving the systems".format(AMT_CORES, total_systems, total_mp, evolve_mp_time))
####
speed_up = total_lin/total_mp
print("The speed up by using MP is: {}".format(total_lin/total_mp))
# Write to file:
# amt_cores, amt_systems, total_time_lin, total_time_mp, speedup
with open(os.path.join(result_dir, "comparison_result_{}.dat".format(name_testcase)), "a") as f:
res = (AMT_CORES, total_systems, total_lin, total_mp, speed_up)
f.write(str(res) + "\n")
\ No newline at end of file
#with open(os.path.join(result_dir, "comparison_result_{}.dat".format(name_testcase)), "a") as f:
# res = (AMT_CORES, total_systems, total_lin, total_mp, speed_up)
# f.write(str(res) + "\n")
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment