Source code for watts.plugin_pyarc
# SPDX-FileCopyrightText: 2022-2023 UChicago Argonne, LLC
# SPDX-License-Identifier: MIT
from pathlib import Path
import os
import sys
import tempfile
from typing import Mapping, List, Optional
from .fileutils import PathLike
from .parameters import Parameters
from .plugin import PluginGeneric, _find_executable
from .results import Results, ExecInfo
[docs]
class ResultsPyARC(Results):
"""PyARC simulation results
Parameters
----------
params
Parameters used to generate inputs
exec_info
Execution information (job ID, plugin name, time, etc.)
inputs
List of input files
outputs
List of output files
results_data
PyARC results
"""
def __init__(self, params: Parameters, exec_info: ExecInfo,
inputs: List[Path], outputs: List[Path], results_data: dict):
super().__init__(params, exec_info, inputs, outputs)
self.results_data = results_data
[docs]
class PluginPyARC(PluginGeneric):
"""Plugin for running PyARC
Parameters
----------
template_file
Templated PyARC input
executable
Path to PyARC.py script
extra_inputs
List of extra (non-templated) input files that are needed
extra_template_inputs
Extra templated input files
show_stdout
Whether to display output from stdout when PyARC is run
show_stderr
Whether to display output from stderr when PyARC is run
Attributes
----------
executable
Path to PyARC executable
"""
def __init__(
self,
template_file: str,
executable: PathLike = 'PyARC.py',
extra_inputs: Optional[List[str]] = None,
extra_template_inputs: Optional[List[PathLike]] = None,
show_stdout: bool = False,
show_stderr: bool = False
):
executable = _find_executable(executable, 'PyARC_DIR')
super().__init__(executable, None, template_file, extra_inputs,
extra_template_inputs, "PyARC", show_stdout, show_stderr)
self.input_name = "pyarc_input.son"
@PluginGeneric.executable.setter
def executable(self, exe: PathLike):
if not exe.is_file():
raise RuntimeError(
f"{self.plugin_name} module '{exe}' does not exist. The "
"PyARC_DIR environment variable needs to be set to a directory "
"containing the PyARC.py module."
)
self._executable = Path(exe)
[docs]
def run(self, **kwargs: Mapping):
"""Run PyARC
Parameters
----------
**kwargs
Keyword arguments passed on to :func:`pyarc.execute`
"""
sys.path.insert(0, f'{self.executable.parent}')
import PyARC
self.pyarc = PyARC.PyARC()
self.pyarc.user_object.do_run = True
self.pyarc.user_object.do_postrun = True
od = Path.cwd()
with tempfile.TemporaryDirectory() as tmpdir:
self.pyarc.execute(["-i", self.input_name, "-w", tmpdir, "-o", str(od)], **kwargs)
sys.path.pop(0) # Restore sys.path to original state
os.chdir(od) # TODO: I don't know why but I keep going to self.executable after execution - this is very wierd!
[docs]
def postrun(self, params: Parameters, exec_info: ExecInfo) -> ResultsPyARC:
"""Collect information from PyARC and create results object
Parameters
----------
params
Parameters used to create PyARC model
exec_info
Execution information
Returns
-------
PyARC results object
"""
return super().postrun(params, exec_info, results_data=self.pyarc.user_object.results)