Source code for pyiron_base.jobs.flex.factory

from typing import Callable, Dict, Optional

from pyiron_base.utils.instance import static_isinstance


[docs] def create_job_factory( executable_str: str, write_input_funct: Optional[Callable] = None, collect_output_funct: Optional[Callable] = None, default_input_dict: Optional[Dict] = None, ) -> callable: """ Create a new job class based on pre-defined write_input() and collect_output() function plus a dictionary of default inputs and an executable string. Args: executable_str (str): Call to an external executable write_input_funct (callable): The write input function write_input(input_dict, working_directory) collect_output_funct (callable): The collect output function collect_output(working_directory) default_input_dict (dict/None): Default input for the newly created job class Example: >>> def write_input(input_dict, working_directory="."): >>> with open(os.path.join(working_directory, "input_file"), "w") as f: >>> f.write(str(input_dict["energy"])) >>> >>> >>> def collect_output(working_directory="."): >>> with open(os.path.join(working_directory, "output_file"), "r") as f: >>> return {"energy": float(f.readline())} >>> >>> >>> from pyiron_base import Project, create_job_factory >>> pr = Project("test") >>> create_catjob = create_job_factory( >>> write_input_funct=write_input, >>> collect_output_funct=collect_output, >>> default_input_dict={"energy": 1.0}, >>> executable_str="cat input_file > output_file", >>> ) >>> job = create_catjob(project=pr, job_name="job_test") >>> job.input["energy"] = 2.0 >>> job.run() >>> job.output """ def job_factory(project, job_name): """ Create a job based on the previously defined write_input(), collect_output() and the executable string. Args: project (ProjectHDFio/ Project): ProjectHDFio instance which points to the HDF5 file the job is stored in job_name (str): name of the job, which has to be unique within the project Returns: pyiron_base.jobs.flex.executablecontainer.ExecutableContainerJob: pyiron job object """ if static_isinstance(project, "pyiron_base.project.generic.Project"): job = project.create.job.ExecutableContainerJob(job_name=job_name) elif static_isinstance(project, "pyiron_base.storage.hdfio.ProjectHDFio"): job = project.project.create.job.ExecutableContainerJob(job_name=job_name) else: raise TypeError( "Expected ProjectHDFio/ Project but recieved", type(project) ) job.set_job_type( write_input_funct=write_input_funct, collect_output_funct=collect_output_funct, default_input_dict=default_input_dict, executable_str=executable_str, ) return job return job_factory