From 3fcae86d74f4af302249a3e3d41d64e486e95a4c Mon Sep 17 00:00:00 2001 From: jlnav Date: Tue, 7 Jul 2026 13:17:06 -0500 Subject: [PATCH 1/2] Add Flux as mpi_runner option in MPIExecutor - Add FLUX_MPIRunner class to mpi_runner.py; registered in the runner factory - Add FluxAllocation platform class to platforms.py; registered in Known_platforms - Add Flux nodelist detection to env_resources.py (get_flux_nodelist, FLUX_URI env var) - Refactor get_slurm_nodelist to call shared get_slurm_nodelist_from_string helper - Add Flux detection (FLUX_URI + flux --version) to get_MPI_variant in mpi_resources.py - Pass nodelist_env_flux through resources.py to EnvResources - Add 'flux' to allowed mpi_runner values in validators.py - Add flux-core installation note to pyproject.toml - Add unit tests for all of the above (test_flux.py) Also apply mypy type annotation fixes to mpi_resources.py (task_partition, get_resources, create_machinefile, get_MPI_runner) required by the updated get_MPI_variant return type (str -> str | None). --- IBCDFO | 1 + libensemble/executors/mpi_runner.py | 73 + libensemble/resources/env_resources.py | 61 +- libensemble/resources/mpi_resources.py | 92 +- libensemble/resources/platforms.py | 15 + libensemble/resources/resources.py | 2 + libensemble/tests/coverage.xml | 9017 +++++++++++++++++ libensemble/tests/forces_app/forces.x | Bin 0 -> 35784 bytes .../scaling_tests/forces/forces_app/forces.x | Bin 0 -> 35784 bytes libensemble/tests/unit_tests/test_flux.py | 353 + libensemble/utils/validators.py | 11 +- pyproject.toml | 7 + 12 files changed, 9593 insertions(+), 39 deletions(-) create mode 160000 IBCDFO create mode 100644 libensemble/tests/coverage.xml create mode 100755 libensemble/tests/forces_app/forces.x create mode 100755 libensemble/tests/scaling_tests/forces/forces_app/forces.x create mode 100644 libensemble/tests/unit_tests/test_flux.py diff --git a/IBCDFO b/IBCDFO new file mode 160000 index 0000000000..4d1b12dc1d --- /dev/null +++ b/IBCDFO @@ -0,0 +1 @@ +Subproject commit 4d1b12dc1dbe53c40dabdf4717040eaca54944d4 diff --git a/libensemble/executors/mpi_runner.py b/libensemble/executors/mpi_runner.py index 48953cc3c9..d44152aff1 100644 --- a/libensemble/executors/mpi_runner.py +++ b/libensemble/executors/mpi_runner.py @@ -19,6 +19,7 @@ def get_runner(mpi_runner_type, runner_name=None, platform_info=None): "srun": SRUN_MPIRunner, "jsrun": JSRUN_MPIRunner, "msmpi": MSMPI_MPIRunner, + "flux": FLUX_MPIRunner, "custom": MPIRunner, } runner = None @@ -519,3 +520,75 @@ def __init__(self, run_command="jsrun", platform_info=None): def express_spec(self, task, nprocs, nnodes, ppn, machinefile, hyperthreads, extra_args, resources, workerID): """Returns None, None as jsrun uses neither hostlist or machinefile""" return None, None + + +class FLUX_MPIRunner(MPIRunner): + """MPI Runner for Flux Framework (flux run). + + Flux provides flexible resource management and job scheduling. + See https://flux-framework.org/ for details. + """ + + def __init__(self, run_command="flux", platform_info=None): + self.run_command = run_command + self.subgroup_launch = False # Flux manages job lifecycle + self.mfile_support = False + self.arg_nprocs = ("-n", "--ntasks") + self.arg_nnodes = ("-N", "--nodes") + self.arg_ppn = ("--tasks-per-node",) + self.default_mpi_options = None + self.default_gpu_arg_type = "option_gpus_per_task" + self.default_gpu_args = {"option_gpus_per_task": "-g", "option_gpus_per_node": "--gpus-per-node"} + self.platform_info = platform_info + self.rm_rpn = False + + # Flux's per-resource options are mutually exclusive with -n/--ntasks, + # so express layouts with nodes plus per-task resources. + self.mpi_command = [ + self.run_command, + "run", + "-N {num_nodes}", + "-n {num_procs}", + "{extra_args}", + ] + + def get_mpi_specs( + self, + task, + nprocs, + nnodes, + ppn, + ngpus, + machinefile, + hyperthreads, + extra_args, + auto_assign_gpus, + match_procs_to_gpus, + resources, + workerID, + ): + specs = super().get_mpi_specs( + task, + nprocs, + nnodes, + ppn, + ngpus, + machinefile, + hyperthreads, + extra_args, + auto_assign_gpus, + match_procs_to_gpus, + resources, + workerID, + ) + + ppn = specs["procs_per_node"] + if ppn: + extra_args = self._append_to_extra_args(specs["extra_args"], "-c 1") + specs["extra_args"] = extra_args + specs["procs_per_node"] = None + return specs + + def express_spec(self, task, nprocs, nnodes, ppn, machinefile, hyperthreads, extra_args, resources, workerID): + """Returns None, None as flux manages resources internally""" + return None, None diff --git a/libensemble/resources/env_resources.py b/libensemble/resources/env_resources.py index 47b3d78624..3eb1a611cc 100644 --- a/libensemble/resources/env_resources.py +++ b/libensemble/resources/env_resources.py @@ -35,6 +35,7 @@ class EnvResources: default_nodelist_env_pbs = "PBS_NODEFILE" default_nodelist_env_lsf = "LSB_HOSTS" default_nodelist_env_lsf_shortform = "LSB_MCPU_HOSTS" + default_nodelist_env_flux = "FLUX_URI" def __init__( self, @@ -43,6 +44,7 @@ def __init__( nodelist_env_pbs: str | None = None, nodelist_env_lsf: str | None = None, nodelist_env_lsf_shortform: str | None = None, + nodelist_env_flux: str | None = None, ) -> None: """Initializes a new EnvResources instance @@ -71,10 +73,17 @@ def __init__( nodelist_env_lsf_shortform: String, optional The environment variable giving a node list in LSF short-form format (Default: uses LSB_MCPU_HOSTS). Note: This is queried only if a node_list file is not provided. + + nodelist_env_flux: String, optional + The environment variable indicating a Flux instance (Default: uses FLUX_URI). + When present, the nodelist is obtained via `flux resource list`. + Note: This is queried only if a node_list file is not provided. """ self.scheduler = None self.nodelists = {} + # Check Flux first - it may run inside Slurm but should take precedence + self.nodelists["Flux"] = nodelist_env_flux or EnvResources.default_nodelist_env_flux self.nodelists["Slurm"] = nodelist_env_slurm or EnvResources.default_nodelist_env_slurm self.nodelists["Cobalt"] = nodelist_env_cobalt or EnvResources.default_nodelist_env_cobalt self.nodelists["PBS"] = nodelist_env_pbs or EnvResources.default_nodelist_env_pbs @@ -82,6 +91,7 @@ def __init__( self.nodelists["LSF_shortform"] = nodelist_env_lsf_shortform or EnvResources.default_nodelist_env_lsf_shortform self.ndlist_funcs = {} + self.ndlist_funcs["Flux"] = EnvResources.get_flux_nodelist self.ndlist_funcs["Slurm"] = EnvResources.get_slurm_nodelist self.ndlist_funcs["Cobalt"] = EnvResources.get_cobalt_nodelist self.ndlist_funcs["PBS"] = EnvResources.get_pbs_nodelist @@ -105,7 +115,7 @@ def get_nodelist(self) -> list[str | Any]: return [] @staticmethod - def abbrev_nodenames(node_list: list[str], prefix: str = None) -> list[str]: + def abbrev_nodenames(node_list: list[str], prefix: str | None = None) -> list[str]: """Returns nodelist with only string up to first dot""" newlist = [s.split(".", 1)[0] for s in node_list] return newlist @@ -151,6 +161,14 @@ def _noderange_append(prefix: str, nidstr: str, suffix: str) -> list[str]: def get_slurm_nodelist(node_list_env: str) -> list[str | Any]: """Gets global libEnsemble nodelist from the Slurm environment""" fullstr = os.environ[node_list_env] + return EnvResources.get_slurm_nodelist_from_string(fullstr) + + @staticmethod + def get_slurm_nodelist_from_string(fullstr: str) -> list[str | Any]: + """Parses a nodelist string in Slurm format (also used by Flux). + + This is extracted from get_slurm_nodelist to allow reuse with Flux. + """ if not fullstr: return [] # Split at commas outside of square brackets @@ -171,6 +189,47 @@ def get_slurm_nodelist(node_list_env: str) -> list[str | Any]: nidlst.extend(EnvResources._noderange_append(prefix, nidstr, suffix)) return sorted(nidlst) + @staticmethod + def get_flux_nodelist(node_list_env: str) -> list[str | Any]: + """Gets global libEnsemble nodelist from a Flux instance. + + Uses `flux resource list` to obtain the list of available nodes. + The node_list_env parameter (FLUX_URI) is used to detect Flux presence + but the actual nodelist comes from the flux command. + """ + import subprocess + + try: + # flux resource list with format to get just hostnames + # -n: no header, -o: output format + result = subprocess.run( + ["flux", "resource", "list", "-n", "-o", "{nodelist}"], + capture_output=True, + text=True, + timeout=10, + ) + if result.returncode != 0: + logger.warning(f"flux resource list failed: {result.stderr}") + return [] + + nodelist_str = result.stdout.strip() + if not nodelist_str: + return [] + + # Parse the nodelist - Flux uses similar format to Slurm (e.g., "node[1-4]") + # We can reuse the Slurm parser for bracket notation + return EnvResources.get_slurm_nodelist_from_string(nodelist_str) + + except subprocess.TimeoutExpired: + logger.warning("flux resource list timed out") + return [] + except FileNotFoundError: + logger.warning("flux command not found") + return [] + except Exception as e: + logger.warning(f"Error getting Flux nodelist: {e}") + return [] + @staticmethod def get_cobalt_nodelist(node_list_env: str) -> list[str | Any]: """Gets global libEnsemble nodelist from the Cobalt environment""" diff --git a/libensemble/resources/mpi_resources.py b/libensemble/resources/mpi_resources.py index 33b62ce3c4..22da26413c 100644 --- a/libensemble/resources/mpi_resources.py +++ b/libensemble/resources/mpi_resources.py @@ -29,16 +29,24 @@ def rassert(test: int | bool | None, *args) -> None: # logger.setLevel(logging.DEBUG) -def get_MPI_variant() -> str: +def get_MPI_variant() -> str | None: """Returns MPI base implementation Returns ------- - mpi_variant: str - MPI variant 'aprun' or 'jsrun' or 'msmpi' or 'mpich' or 'openmpi' or 'srun' + mpi_variant: str | None + MPI variant 'aprun' or 'jsrun' or 'msmpi' or 'mpich' or 'openmpi' or 'srun' or 'flux', or None if not found """ + # Check for Flux first via FLUX_URI environment variable (indicates running inside a Flux instance) + if os.environ.get("FLUX_URI"): + try: + subprocess.check_call(["flux", "--version"], stdout=subprocess.PIPE, stderr=subprocess.PIPE) + return "flux" + except Exception: + pass + try: subprocess.check_call(["aprun", "--version"], stdout=subprocess.PIPE, stderr=subprocess.PIPE) return "aprun" @@ -85,7 +93,7 @@ def get_MPI_variant() -> str: return None -def get_MPI_runner(mpi_runner=None) -> str: +def get_MPI_runner(mpi_runner: str | None = None) -> str | None: """Return whether ``mpirun`` is openmpi or mpich""" var = mpi_runner or get_MPI_variant() if var in ["mpich", "openmpi"]: @@ -102,29 +110,31 @@ def task_partition( """ # Convert to int if string is provided - num_procs = int(num_procs) if num_procs else None - num_nodes = int(num_nodes) if num_nodes else None - procs_per_node = int(procs_per_node) if procs_per_node else None + num_procs_int: int | None = int(num_procs) if num_procs else None + num_nodes_int: int | None = int(num_nodes) if num_nodes else None + procs_per_node_int: int | None = int(procs_per_node) if procs_per_node else None # If machinefile is provided - ignore everything else if machinefile: - if num_procs or num_nodes or procs_per_node: + if num_procs_int or num_nodes_int or procs_per_node_int: logger.warning("Machinefile provided - overriding " "procs/nodes/procs_per_node") return None, None, None - if not num_procs: - rassert(num_nodes and procs_per_node, "Need num_procs, num_nodes/procs_per_node, or machinefile") - num_procs = num_nodes * procs_per_node + if not num_procs_int: + rassert(num_nodes_int and procs_per_node_int, "Need num_procs, num_nodes/procs_per_node, or machinefile") + assert num_nodes_int is not None and procs_per_node_int is not None # for mypy + num_procs_int = num_nodes_int * procs_per_node_int - elif not num_nodes: - procs_per_node = procs_per_node or num_procs - num_nodes = num_procs // procs_per_node + elif not num_nodes_int: + procs_per_node_int = procs_per_node_int or num_procs_int + num_nodes_int = num_procs_int // procs_per_node_int - elif not procs_per_node: - procs_per_node = num_procs // num_nodes + elif not procs_per_node_int: + procs_per_node_int = num_procs_int // num_nodes_int - rassert(num_procs == num_nodes * procs_per_node, "num_procs does not equal num_nodes*procs_per_node") - return num_procs, num_nodes, procs_per_node + assert num_nodes_int is not None and procs_per_node_int is not None # for mypy + rassert(num_procs_int == num_nodes_int * procs_per_node_int, "num_procs does not equal num_nodes*procs_per_node") + return num_procs_int, num_nodes_int, procs_per_node_int def _max_rsets_per_node(worker_resources: WorkerResources) -> int: @@ -137,9 +147,9 @@ def _max_rsets_per_node(worker_resources: WorkerResources) -> int: def get_resources( resources: Resources, - num_procs: int = None, - num_nodes: int = None, - procs_per_node: int = None, + num_procs: int | None = None, + num_nodes: int | None = None, + procs_per_node: int | None = None, hyperthreads: bool = False, ) -> tuple[int, int, int]: """Reconciles user-supplied options with available worker @@ -153,6 +163,7 @@ def get_resources( raised if these are infeasible. """ wresources = resources.worker_resources + assert wresources is not None # for mypy gresources = resources.glob_resources node_list = wresources.local_nodelist rassert(node_list, "Node list is empty - aborting") @@ -190,7 +201,7 @@ def get_resources( f"Nodes: {num_nodes} procs_per_node {procs_per_node}" ) elif not num_nodes and not procs_per_node: - if num_procs <= cores_avail_per_node_per_worker: + if num_procs is not None and num_procs <= cores_avail_per_node_per_worker: num_nodes = 1 else: num_nodes = local_node_count @@ -198,49 +209,54 @@ def get_resources( num_nodes = local_node_count # Checks config is consistent and sufficient to express - num_procs, num_nodes, procs_per_node = task_partition(num_procs, num_nodes, procs_per_node) + result = task_partition(num_procs, num_nodes, procs_per_node) + if result == (None, None, None): + raise MPIResourcesException("task_partition returned all None unexpectedly") + num_procs_out, num_nodes_out, procs_per_node_out = result + # Type narrowing for mypy + assert num_procs_out is not None and num_nodes_out is not None and procs_per_node_out is not None rassert( - num_nodes <= local_node_count, - "Not enough nodes to honor arguments. " f"Requested {num_nodes}. Only {local_node_count} available", + num_nodes_out <= local_node_count, + "Not enough nodes to honor arguments. " f"Requested {num_nodes_out}. Only {local_node_count} available", ) if gresources.enforce_worker_core_bounds: rassert( - procs_per_node <= cores_avail_per_node, + procs_per_node_out <= cores_avail_per_node, "Not enough processors on a node to honor arguments. " - f"Requested {procs_per_node}. Only {cores_avail_per_node} available", + f"Requested {procs_per_node_out}. Only {cores_avail_per_node} available", ) rassert( - procs_per_node <= cores_avail_per_node_per_worker, + procs_per_node_out <= cores_avail_per_node_per_worker, "Not enough processors per worker to honor arguments. " - f"Requested {procs_per_node}. Only {cores_avail_per_node_per_worker} available", + f"Requested {procs_per_node_out}. Only {cores_avail_per_node_per_worker} available", ) rassert( - num_procs <= (cores_avail_per_node * local_node_count), + num_procs_out <= (cores_avail_per_node * local_node_count), "Not enough procs to honor arguments. " - f"Requested {num_procs}. Only {cores_avail_per_node * local_node_count} available", + f"Requested {num_procs_out}. Only {cores_avail_per_node * local_node_count} available", ) - if num_nodes < local_node_count: + if num_nodes_out < local_node_count: logger.debug( "User constraints mean fewer nodes being used " - f"than available. {num_nodes} nodes used. {local_node_count} nodes available" + f"than available. {num_nodes_out} nodes used. {local_node_count} nodes available" ) - return num_procs, num_nodes, procs_per_node + return num_procs_out, num_nodes_out, procs_per_node_out def create_machinefile( resources: Resources, machinefile: str | None = None, - num_procs: int = None, + num_procs: int | None = None, num_nodes: int | None = None, procs_per_node: int | None = None, hyperthreads: bool = False, -) -> tuple[bool, None, int, int]: +) -> tuple[bool, int | None, int | None, int | None]: """Creates a machinefile based on user-supplied config options, completed by detected machine resources """ @@ -252,12 +268,13 @@ def create_machinefile( except Exception as e: logger.warning(f"Could not remove existing machinefile: {e}") + assert resources.worker_resources is not None # for mypy node_list = resources.worker_resources.local_nodelist logger.debug(f"Creating machinefile with {num_nodes} nodes and {procs_per_node} ranks per node") with open(machinefile, "w") as f: for node in node_list[:num_nodes]: - f.write((node + "\n") * procs_per_node) + f.write((node + "\n") * (procs_per_node or 1)) built_mfile = os.path.isfile(machinefile) and os.path.getsize(machinefile) > 0 return built_mfile, num_procs, num_nodes, procs_per_node @@ -268,6 +285,7 @@ def get_hostlist(resources: Resources, num_nodes=None): completed by detected machine resources """ + assert resources.worker_resources is not None # for mypy node_list = resources.worker_resources.local_nodelist hostlist_str = ",".join([str(x) for x in node_list[:num_nodes]]) return hostlist_str diff --git a/libensemble/resources/platforms.py b/libensemble/resources/platforms.py index 69c36242fc..07989cb05e 100644 --- a/libensemble/resources/platforms.py +++ b/libensemble/resources/platforms.py @@ -230,6 +230,20 @@ class Polaris(Platform): scheduler_match_slots: bool = True +class FluxAllocation(Platform): + """Platform configuration for running inside a Flux allocation. + + This is a generic Flux configuration. For specific systems using Flux + (e.g., LLNL El Capitan), you may want to create a more specific platform + class with cores_per_node and gpus_per_node set appropriately. + """ + + mpi_runner: str = "flux" + runner_name: str = "flux" + gpu_setting_type: str = "runner_default" + scheduler_match_slots: bool = False + + class Known_platforms(BaseModel): """A list of platforms with known configurations. @@ -271,6 +285,7 @@ class Known_platforms(BaseModel): aurora: Aurora = Aurora() generic_rocm: GenericROCm = GenericROCm() frontier: Frontier = Frontier() + flux: FluxAllocation = FluxAllocation() lumi: Lumi = Lumi() lumi_g: LumiGPU = LumiGPU() perlmutter: Perlmutter = Perlmutter() diff --git a/libensemble/resources/resources.py b/libensemble/resources/resources.py index 19e246fb6f..9b68e43f04 100644 --- a/libensemble/resources/resources.py +++ b/libensemble/resources/resources.py @@ -182,12 +182,14 @@ def __init__(self, libE_specs: dict, platform_info: dict = {}, top_level_dir: st nodelist_env_cobalt = resource_info.get("nodelist_env_cobalt", None) nodelist_env_lsf = resource_info.get("nodelist_env_lsf", None) nodelist_env_lsf_shortform = resource_info.get("nodelist_env_lsf_shortform", None) + nodelist_env_flux = resource_info.get("nodelist_env_flux", None) self.env_resources = EnvResources( nodelist_env_slurm=nodelist_env_slurm, nodelist_env_cobalt=nodelist_env_cobalt, nodelist_env_lsf=nodelist_env_lsf, nodelist_env_lsf_shortform=nodelist_env_lsf_shortform, + nodelist_env_flux=nodelist_env_flux, ) if node_file is None: diff --git a/libensemble/tests/coverage.xml b/libensemble/tests/coverage.xml new file mode 100644 index 0000000000..2e7e0bd450 --- /dev/null +++ b/libensemble/tests/coverage.xml @@ -0,0 +1,9017 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/libensemble/tests/forces_app/forces.x b/libensemble/tests/forces_app/forces.x new file mode 100755 index 0000000000000000000000000000000000000000..676577034beed38b89d1a42ccb5bfb3943bbd075 GIT binary patch literal 35784 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.7.0,<0.8"] docs = ["pyenchant", "enchant>=0.0.1,<0.0.2", "sphinx-lfs-content>=1.1.10,<2"] +# Note: For FluxExecutor (native Flux Python API), the flux-core Python bindings +# are required. These are typically installed via: +# - conda: conda install -c conda-forge flux-core +# - spack: spack install flux-core +# - system package manager on supported systems +# The MPIExecutor with mpi_runner="flux" works without Python bindings. + # Various config from here onward [tool.black] line-length = 120 From 826eb9b593fbf13e084ac0657289bde4f530a950 Mon Sep 17 00:00:00 2001 From: jlnav Date: Tue, 7 Jul 2026 13:25:15 -0500 Subject: [PATCH 2/2] Remove accidentally staged IBCDFO submodule, coverage.xml, and binary test artifacts --- IBCDFO | 1 - libensemble/tests/coverage.xml | 9017 ----------------- libensemble/tests/forces_app/forces.x | Bin 35784 -> 0 bytes .../scaling_tests/forces/forces_app/forces.x | Bin 35784 -> 0 bytes 4 files changed, 9018 deletions(-) delete mode 160000 IBCDFO delete mode 100644 libensemble/tests/coverage.xml delete mode 100755 libensemble/tests/forces_app/forces.x delete mode 100755 libensemble/tests/scaling_tests/forces/forces_app/forces.x diff --git a/IBCDFO b/IBCDFO deleted file mode 160000 index 4d1b12dc1d..0000000000 --- a/IBCDFO +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 4d1b12dc1dbe53c40dabdf4717040eaca54944d4 diff --git a/libensemble/tests/coverage.xml b/libensemble/tests/coverage.xml deleted file mode 100644 index 2e7e0bd450..0000000000 --- a/libensemble/tests/coverage.xml +++ /dev/null @@ -1,9017 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/libensemble/tests/forces_app/forces.x b/libensemble/tests/forces_app/forces.x deleted file mode 100755 index 676577034beed38b89d1a42ccb5bfb3943bbd075..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 35784 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