...
Code Block |
---|
def actor_name(code_args = None, xml_parameters = None, job_settings = None): return None. # no returned values! |
Assumptions:
General:
- Python version 3.6+
- Programming conventions (PEP 8?)
- NO BACKWARD COMPATIBILITY - Incompatibility with existing Python actors!
- All input arguments (user method arg and info determining how to launch job ) 'structured' within classes
- Classes will be defined for:
- user code arguments - autogenerated
- XML input parameters
- job settings
- The order of arguments will be arbitrary - implemented as arguments list (*args) or keyword arguments list (**kwargs)
- All arguments will be optional. If object of given class will be not provided - default values will be used.
...
Arguments required by user C++/F method
Info | ||
---|---|---|
| ||
All code samples below use |
- All arguments 'packed' within a class <ActorName>Arguments
- Class will be automatically generated, and copied to a wrapper package
- Order of attributes corresponds to order of user function arguments
- Every attribute is a class ToolNameArgument <ToolName>Argument keeping not only value but also metadata describing argument:
- Name
- Type of value
- Value
- IN or OUT
- Attributes' setters/getters will be overridden - user will set only value of argument
- To reduce complexity visible by user
- To check if arg type is correct
Code Block | ||
---|---|---|
| ||
# AUTO GENERATED ! class <ActorName>Arguments : def __init__(self): self.arg1 = ToolNameArgument<ToolName>Argument( 'InVar', int, None, IN) self.arg2 = ToolNameArgument<ToolName>Argument( 'OutVar', double, None, OUT) self.diagnostic_info = ToolNameDiagnosticInfo<ToolName>DiagnosticInfo() # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # class ToolNameArgument<ToolName>Argument : def __init__(self, name, type, sub_type, intent): self.name = name #'argument name' READ ONLY self.type = type # (INT, DOUBLE, STRING, COMPLEX, IDS) READ ONLY self.sub_type = sub_type #'equilibrium' for IDSes only READ ONLY self.intent = intent # (IN/OUT) READ ONLY self.value = 7. # to be set by user # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # class ToolNameDiagnosticInfo<ToolName>DiagnosticInfo : def __init__(self): self.status self.message |
...
- Not passed as wrapper argument
- Defined (path to XML file) at the time of actor creation by ToolName <ToolName>
Code Block |
---|
class ToolNameXMLParamaters<ToolName>XMLParamaters : def __init__(self): self.parameters = # file name or string or... (?) self.default_parameters = # file name or string or ... (?) self.schema = # file name or string or ... (?) |
Job settings
- A class passed as wrapper arguments
- Tree (of classes) describing job settings
- ToolNameJobSettings class:
- batch_job -
class ToolNameBatchJob:
- queue
- ???
- debug -
class ToolNameDebug:
- debugger - TotalView/gdb
- mode - attach/standalone
- mpi -
class ToolNameMPI:
- mpi parameters - TBD
- ???
- open_mp -
class ToolNameOpenMP
- openMP parameters - TBD
- ???
- sandbox -
class ToolNameSandbox
- path to sandbox
- sandbox 'lifetime'
- batch_job -
Code Block | ||
---|---|---|
| ||
class ToolNameJobSettings<ToolName>JobSettings : def __init__(self): self.batch_job = ToolNameBatchJob<ToolName>BatchJob() self.debug = ToolNameDebug<ToolName>Debug() self.mpi = ToolNameMPI<ToolName>MPI() self.open_mp = ToolNameOpenMP<ToolName>OpenMP() self.sandbox = ToolNameSandbox<ToolName>Sandbox() self.????? #any other info needed? # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # class ToolNameBatchJob<ToolName>BatchJob : def __init__(self): self.queue = self.TBD # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # class ToolNameDebug<ToolName>Debug : def __init__(self): self.debugger #TotalView/gdb self.mode #attach/standalone self.TBD # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # class ToolNameMPI<ToolName>MPI : def __init__(self): self.TBD self.debug_switch # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # class ToolNameOpenMP<ToolName>OpenMP : def __init__(self): self.TBD # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # class ToolNameSandbox<ToolName>Sandbox : def __init__(self): self.path self.lifetime self.TBD |
...
- OUT arguments - wrapper will update fields of <ActorName>Arguments class
Open points
...
Example
Code Block | ||
---|---|---|
| ||
from my_test.wrapper import my_test_actor
# # # # # JOB SETTINGS # # # # # # #
job_settings = <ToolName>JobSettings()
#batch job
job_settings.batch_job.queue = 'gw_default"
#debugging
# no debugging for batch jobs
#mpi
job_settings.mpi.nodes = 5
#OpenMP
# it is not OpenMP job
# Sandbox
job_settings.sandbox.lifetime = LIFTIME_WORKFLOW
job_settings.sandbox.clean_up = True
# # # # # CODE ARGUMENTS # # # # # # #
arguments = <ActorName>Arguments()
self.my_in_arg_01.value = 5
self.my_in_arg_02.value = 0.123
self.my_in_core_profiles_01.value = in_cp_obj
self.my_in_core_profiles_02.value = in_cp_metadata #object keeping shot/run/user
# # # # # RUNNING ACTOR # # # # # # #
my_test(code_args = arguments, job_settings = job_settings)
# # # # # RETURN # # # # # # #
ret_eq = arguments.my_out_equilibrium_02.value |
Open points
...
- Only IN and OUT arguments (no INOUT arguments)
- Arrays as an inout of user method- only "dynamic" - i.e. of variable size
- Wrapper results:
- OUT arguments - wrapper will update fields of <ActorName>Arguments class
- INCOMPATIBILITY
- Diagnostic info
- Info returned from user method
- status flag
- user defined message
- 'Q: can it be mandatory in user sbrt?
- Info returned from user method
- Sandbox:
- Do we need this feature?
- Alternative library:
- Do we need this feature?
...