Hello,
In the detours argument of FWAction, it says you can give a list of FWs/WFs. I am trying to insert a mini-workflow dynamically but something is wrong.
This workflow runs just fine.
···
from fireworks import Firework, Workflow, LaunchPad, ScriptTask, PyTask
from fireworks.core.rocket_launcher import rapidfire
launchpad = LaunchPad()
launchpad.reset(’’, require_password=False)
create the individual FireWorks and Workflow
#fw0 = Firework(ScriptTask.from_str(“echo start”), name = “start”)
#fw1 = Firework(WorkflowDetourClass(), name = “split”)
#fw2 = Firework(ScriptTask.from_str(“echo finish”), name = “finish”)
#wf = Workflow([fw0, fw1, fw2], {fw0 : [fw1], fw1: [fw2], }, name=“test workflow”)
links = {}
new_fws_lst = []
for i in range(3):
hello_fw = Firework(ScriptTask.from_str("echo hello " + str(i)))
goodbye_fw = Firework(ScriptTask.from_str("echo goodbye " + str(i)))
new_fws_lst.append(hello_fw)
new_fws_lst.append(goodbye_fw)
links.update({hello_fw : [goodbye_fw]})
wf = Workflow(new_fws_lst, links)
launchpad.add_wf(wf)
rapidfire(launchpad)
But if the same workflow is inserted in another workflow through detours, this error is thrown:
File “.local/lib/python3.5/site-packages/fireworks/core/launchpad.py”, line 1467, in _refresh_wf
updated_ids = wf.refresh(fw_id)
File “.local/lib/python3.5/site-packages/fireworks/core/firework.py”, line 1005, in refresh
updated_ids = updated_ids.union(self.apply_action(m_action, fw.fw_id))
File “.local/lib/python3.5/site-packages/fireworks/core/firework.py”, line 834, in apply_action
new_updates = self.append_wf(wf, [fw_id], detour=True, pull_spec_mods=False)
File “.local/lib/python3.5/site-packages/fireworks/core/firework.py”, line 947, in append_wf
updated_ids = self.refresh(new_fw.fw_id, set(updated_ids))
File “.local/lib/python3.5/site-packages/fireworks/core/firework.py”, line 979, in refresh
if self.fw_states[parent] not in completed_parent_states:
KeyError: -8
from fireworks import explicit_serialize, FiretaskBase, FWAction, ScriptTask
import sys
from fireworks import Workflow, Firework
@explicit_serialize
class WorkflowDetourClass(FiretaskBase):
_fw_name = ‘WorkflowDetourTask’
required_params = []
optional_params = []
def run_task(self, fw_spec):
links = {}
new_fws_lst = []
for i in range(3):
hello_fw = Firework(ScriptTask.from_str("echo hello " + str(i)))
goodbye_fw = Firework(ScriptTask.from_str("echo goodbye " + str(i)))
new_fws_lst.append(hello_fw)
new_fws_lst.append(goodbye_fw)
links.update({hello_fw : [goodbye_fw]})
wf = Workflow(new_fws_lst, links)
return FWAction(detours = wf)
fw0 = Firework(ScriptTask.from_str(“echo start”), name = “start”)
fw1 = Firework(WorkflowDetourClass(), name = “split”)
fw2 = Firework(ScriptTask.from_str(“echo finish”), name = “finish”)
wf = Workflow([fw0, fw1, fw2], {fw0 : [fw1], fw1: [fw2], }, name=“test workflow”)
What am I doing wrong here? Does anyone have a working example of an inserted workflow?
Cheers
Marc