Compare commits

...
Sign in to create a new pull request.

6 commits

Author SHA1 Message Date
1b6f67a671 stop useless wait 2025-04-16 21:05:28 +02:00
cfb14571e8 bugfix limit_slurm 2025-04-16 21:05:18 +02:00
748ebdd398 slurm submission limited to array < 800 2025-04-16 20:54:21 +02:00
438f3f024e small fix 2025-04-10 17:19:25 +02:00
7b1e7af3c5 minor changes 2025-04-09 15:03:57 +02:00
d1e695e7e3 fixed fnl=0 2025-04-09 15:03:53 +02:00
8 changed files with 52 additions and 22 deletions

View file

@ -83,15 +83,28 @@ def plot_imshow_with_reference( data_list,
axes[1, i].text(0.5, 0.9, f"Score: {score(data, reference):.2e}", fontsize=10, transform=axes[1, i].transAxes, color='white')
# plt.tight_layout()
else:
for i, data in enumerate(data_list):
im = axes[i].imshow(data, cmap=cmap, origin='lower', vmin=vmin, vmax=vmax)
axes[i].set_title(titles[i], fontsize=fs_titles)
axes[i].set_xticks(ticks[i])
axes[i].set_yticks(ticks[i])
axes[i].set_xticklabels(tick_labels[i])
axes[i].set_yticklabels(tick_labels[i])
axes[i].set_xlabel('Mpc/h')
fig.colorbar(im, ax=axes[:], orientation='vertical')
if len(data_list) == 1:
data_list = data_list[0]
im = axes.imshow(data_list, cmap=cmap, origin='lower', vmin=vmin, vmax=vmax)
axes.set_title(titles[0], fontsize=fs_titles)
axes.set_xticks(ticks[0])
axes.set_yticks(ticks[0])
axes.set_xticklabels(tick_labels[0])
axes.set_yticklabels(tick_labels[0])
axes.set_xlabel('Mpc/h')
fig.colorbar(im, ax=axes, orientation='vertical')
else:
for i, data in enumerate(data_list):
im = axes[i].imshow(data, cmap=cmap, origin='lower', vmin=vmin, vmax=vmax)
axes[i].set_title(titles[i], fontsize=fs_titles)
axes[i].set_xticks(ticks[i])
axes[i].set_yticks(ticks[i])
axes[i].set_xticklabels(tick_labels[i])
axes[i].set_yticklabels(tick_labels[i])
axes[i].set_xlabel('Mpc/h')
fig.colorbar(im, ax=axes[:], orientation='vertical')
return fig, axes

View file

@ -19,7 +19,7 @@ def register_arguments_cosmo(parser:ArgumentParser):
parser.add_argument("--m_nu3", type=float, default=0.0, help="Mass of the third neutrino species.")
parser.add_argument("--w_0", type=float, default=-1.0, help="Dark energy equation of state parameter.")
parser.add_argument("--w_a", type=float, default=0.0, help="Dark energy equation of state parameter.")
parser.add_argument("--fnl", type=float, default=100.0, help="Local non-Gaussianity parameter.")
parser.add_argument("--fnl", type=float, default=0.0, help="Local non-Gaussianity parameter.")
parser.add_argument("--gnl", type=float, default=0.0, help="Equilateral non-Gaussianity parameter.")
@ -84,7 +84,7 @@ cosmo_defaults = {
"m_nu3": 0.0,
"w_0": -1.0,
"w_a": 0.0,
"fnl": 100.0,
"fnl": 0.0,
"gnl": 0.0,
"k_max":10.0,
"tau_reio":0.06,

View file

@ -237,7 +237,6 @@ def progress_bar_from_logfile(filename:str, desc:str="", verbose:int=1, **kwargs
k=0
limit=600
update_interval=0.2
sleep(2) # Wait for the process to be launched, and for the previous log file to be overwritten if necessary.
wait_until_file_exists(filename, verbose=verbose, limit=limit)
current_operation, total_operations = get_progress_from_logfile(filename)
previous_operation = 0
@ -266,4 +265,4 @@ def progress_bar_from_logfile(filename:str, desc:str="", verbose:int=1, **kwargs
if k*update_interval >= limit:
print_message(f"Progress bar timed out after {limit} seconds.", 3, "low level", verbose=verbose)
return
return

View file

@ -136,7 +136,7 @@ def main(parsed_args):
from parameters_card import parse_arguments_card, main_parameter_card
from timestepping import main_timestepping
from ICs import main_ICs
from scola import main_scola, main_pre_scola, main_post_scola
from scola import main_scola, main_pre_scola, main_post_scola, have_all_tiles
card_dict = main_parameter_card(parsed_args)
@ -177,7 +177,7 @@ def main(parsed_args):
print_message("Running sCOLA.", 1, "control", verbose=parsed_args.verbose)
main_scola(parsed_args)
if parsed_args.execution == "slurm":
if parsed_args.execution == "slurm" and not have_all_tiles(parsed_args):
from tqdm import tqdm
from low_level import progress_bar_from_logfile
for b in tqdm(range(1,parsed_args.N_tiles**3+1), desc="sCOLA", unit="box", disable=(parsed_args.verbose==0)):

View file

@ -9,6 +9,7 @@ def main_monofonic(parsed_args):
print_starting_module("monofonic", verbose=parsed_args.verbose)
monofonic_dict=main_parameters_monofonic(parsed_args)
# raise SystemExit # Exit the program after writing the config file to avoid running monofonic
if parsed_args.execution == "local":
print_message("Running monofonic in local mode.", 1, "monofonic", verbose=parsed_args.verbose)

View file

@ -140,7 +140,6 @@ def main_parameters_monofonic(parsed_args):
return monofonic_dict
create_monofonic_config(monofonic_dict["config"], get_config_from_dict(monofonic_dict))
print_message(f"Configuration file written to {monofonic_dict["config"]}", 2, "monofonic", verbose=parsed_args.verbose)
return monofonic_dict

View file

@ -1,3 +1,5 @@
def main_scola(parsed_args):
from args_main import parse_arguments_main
from low_level import print_starting_module, print_message, print_ending_module, progress_bar_from_logfile, wait_until_file_exists
@ -50,14 +52,16 @@ def main_scola(parsed_args):
print_message("sCOLA finished.", 1, "scola", verbose=parsed_args.verbose)
elif parsed_args.execution == "slurm":
from slurm_submission import create_slurm_script, parse_arguments_slurm
from slurm_submission import create_slurm_script, parse_arguments_slurm, limit_slurm_arrays
from args_main import parse_arguments_main
from parameters_card import parse_arguments_card
import os
print_message("Running scola in slurm mode.", 1, "scola", verbose=parsed_args.verbose)
slurm_dict=parse_arguments_slurm(parsed_args)
main_dict=parse_arguments_main(parsed_args)
card_dict=parse_arguments_card(parsed_args)
if have_no_tiles(parsed_args) or parsed_args.force:
if (have_no_tiles(parsed_args) or parsed_args.force) and card_dict["N_tiles"]**3 < limit_slurm_arrays :
## Submit all boxes
print_message("Submitting all boxes.", 2, "scola", verbose=parsed_args.verbose)
slurm_script = slurm_dict["scripts"]+"scola_"+main_dict["simname"]+".sh"
@ -93,6 +97,7 @@ def main_scola(parsed_args):
else:
## Submit missing boxes
from time import sleep
missing_tiles_arrays = get_missing_tiles_arrays(parsed_args)
print_message(f"Submitting missing boxes: {missing_tiles_arrays}.", 2, "scola", verbose=parsed_args.verbose)
@ -127,6 +132,7 @@ def main_scola(parsed_args):
subprocess.run(command_args)
print_message("sCOLA job submitted.", 2, "scola", verbose=parsed_args.verbose)
sleep((missing_tiles[1]-missing_tiles[0])*1.0) # Sleep for a bit to avoid overloading the scheduler
os.remove(slurm_script) # Remove the script after submission (because it is specific to the missing tiles)
@ -224,16 +230,23 @@ def have_no_tiles(parsed_args):
def get_missing_tiles_arrays(parsed_args):
from os.path import isfile
from parameters_card import parse_arguments_card
from slurm_submission import limit_slurm_arrays
card_dict = parse_arguments_card(parsed_args)
nboxes_tot = int(parsed_args.N_tiles**3)
missing_tiles_arrays = []
in_sequence_of_missing = False
len_sequence_of_missing = 0
for b in range(1,nboxes_tot+1):
if not isfile(card_dict["OutputTilesBase"]+str(b)+".h5"):
len_sequence_of_missing += 1
if not in_sequence_of_missing:
missing_tiles_arrays.append([b])
in_sequence_of_missing = True
len_sequence_of_missing = 1
if b%limit_slurm_arrays==limit_slurm_arrays-1:
missing_tiles_arrays[-1].append(b)
in_sequence_of_missing = False
elif in_sequence_of_missing:
missing_tiles_arrays[-1].append(b-1)
in_sequence_of_missing = False
@ -274,4 +287,4 @@ if __name__ == "__main__":
if parsed_args.execution == "slurm":
for b in range(1,nboxes_tot+1):
wait_until_file_exists(f"{card_dict['OutputTilesBase']}{b}.h5", verbose=parsed_args.verbose, limit=5*60)
main_post_scola(parsed_args)
main_post_scola(parsed_args)

View file

@ -2,6 +2,7 @@ from argparse import ArgumentParser
from args_main import parse_arguments_main
path_to_monofonic_binary = "/home/aubin/monofonic/build/monofonIC"
limit_slurm_arrays=799
def register_arguments_slurm(parser:ArgumentParser):
"""
@ -133,12 +134,16 @@ def create_slurm_script(slurm_template:str,
- simbelmyne
- scola
"""
index_sub=0
if array is not None and job != "scola":
raise ValueError(f"Array job range provided for job type {job}.")
if array is None and job == "scola":
raise ValueError(f"Array job range not provided for job type {job}.")
else:
index_sub=array[0]//limit_slurm_arrays
array=(array[0]%limit_slurm_arrays, array[1]%limit_slurm_arrays)
from os.path import isfile
if not isfile(slurm_template):
raise FileNotFoundError(f"SLURM template {slurm_template} does not exist.")
@ -155,7 +160,7 @@ def create_slurm_script(slurm_template:str,
case "simbelmyne":
command_line = f"{job} {job_config_file} {job_log}"
case "scola":
command_line = f"{job} {job_config_file} {job_log} "+"-b ${SLURM_ARRAY_TASK_ID}"
command_line = f"{job} {job_config_file} {job_log} "+f"-b $(({index_sub*limit_slurm_arrays} + $SLURM_ARRAY_TASK_ID))"
case _:
raise ValueError(f"Job type {job} not recognized.")
@ -163,7 +168,7 @@ def create_slurm_script(slurm_template:str,
with open(slurm_script, "w") as f:
for line in template:
if job_name is not None and "--job-name" in line:
line = f"#SBATCH --job-name={job_name}\n"
line = f"#SBATCH --job-name={index_sub if index_sub!=0 else ''}{job_name}\n"
if array is not None and "--array" in line:
line = f"#SBATCH --array={array[0]}-{array[1]}\n"
if array is not None and ("--output" in line or "--error" in line):