"""Parallel Action."""
from finesse.solutions import BaseSolution
from .base import Action, convert_str_to_parameter
import logging
LOGGER = logging.getLogger(__name__)
[docs]
class ParallelSolution(BaseSolution):
    pass 
# IMPORTANT: renaming this class impacts the katscript spec and should be avoided!
[docs]
class Parallel(Action):
    def __init__(self, *actions):
        super().__init__("parallel", True)
        self.actions = actions
    def _do(self, state):
        sols = ParallelSolution("parallel")
        for action in self.actions:
            # Need to loop through all the actions that we want to run
            # And build new states to feed into them.
            newstate = state._split()
            if not action.analysis_state_manager:
                # If the next action is managing the state then it should either
                # be building a simulation or passing the state on to something that
                # does. If the next action isn't, like an Xaxis, we should build it
                # so that it can work with it.
                rq = action.get_requests(newstate.model)
                params = tuple(
                    convert_str_to_parameter(newstate.model, _)
                    for _ in rq["changing_parameters"]
                )
                newstate.build_model(params, rq["input_nodes"], rq["output_nodes"])
            sol = newstate.apply(action)
            if sol is not None:
                sols.add(sol)
        return sols
    def _requests(self, model, memo, first=True):
        # Parallel by it's nature has to deepcopy the model
        # that has been passed into it, otherwise there will
        # be all sort of clashes that will be hard to resolve.
        pass