Skip to content

Commit c2d63d7

Browse files
committed
moving _removed_repeated to State
1 parent b492e43 commit c2d63d7

File tree

2 files changed

+83
-87
lines changed

2 files changed

+83
-87
lines changed

pydra/engine/helpers_state.py

Lines changed: 0 additions & 83 deletions
Original file line numberDiff line numberDiff line change
@@ -255,89 +255,6 @@ def remove_inp_from_splitter_rpn(splitter_rpn, inputs_to_remove):
255255
return splitter_rpn_combined
256256

257257

258-
def removed_previous_repeated(previous_splitters, other_states):
259-
"""removing states from previous tasks that are repeated either directly or indirectly"""
260-
for el in previous_splitters:
261-
if el[1:] not in other_states:
262-
raise PydraStateError(
263-
f"can't ask for splitter from {el[1:]}, other nodes that are connected: {other_states}"
264-
)
265-
266-
repeated = set(
267-
[
268-
(el, previous_splitters.count(el))
269-
for el in previous_splitters
270-
if previous_splitters.count(el) > 1
271-
]
272-
)
273-
if repeated:
274-
# assuming that I want to remove fro right
275-
previous_splitters.reverse()
276-
for el, cnt in repeated:
277-
for ii in range(cnt):
278-
previous_splitters.remove(el)
279-
previous_splitters.reverse()
280-
281-
el_state = []
282-
el_connect = []
283-
el_state_connect = []
284-
for el in previous_splitters:
285-
nm = el[1:]
286-
st = other_states[nm][0]
287-
if not st.other_states:
288-
# states that has no other connections
289-
el_state.append(el)
290-
else: # element has previous_connection
291-
if st.current_splitter: # final?
292-
# states that has previous connections and it's own splitter
293-
el_state_connect.append((el, st.prev_state_splitter))
294-
else:
295-
# states with previous connections but no additional splitter
296-
el_connect.append((el, st.prev_state_splitter))
297-
298-
for el in el_connect:
299-
nm = el[0][1:]
300-
repeated_prev = set(ensure_list(el[1])).intersection(el_state)
301-
if repeated_prev:
302-
for r_el in repeated_prev:
303-
r_nm = r_el[1:]
304-
other_states[r_nm] = (
305-
other_states[r_nm][0],
306-
other_states[r_nm][1] + other_states[nm][1],
307-
)
308-
new_st = set(ensure_list(el[1])) - set(el_state)
309-
if not new_st:
310-
previous_splitters.remove(el[0])
311-
else:
312-
for n_el in new_st:
313-
n_nm = n_el[1:]
314-
other_states[n_nm] = (
315-
other_states[nm][0].other_states[n_nm][0],
316-
other_states[nm][1],
317-
)
318-
ind = previous_splitters.index(el[0])
319-
if ind == len(previous_splitters) - 1:
320-
previous_splitters = previous_splitters[:-1] + list(new_st)
321-
else:
322-
previous_splitters = (
323-
previous_splitters[:ind]
324-
+ list(new_st)
325-
+ previous_splitters[ind + 1 :]
326-
)
327-
328-
# TODO: this part is not tested, needs more work
329-
for el in el_state_connect:
330-
repeated_prev = set(ensure_list(el[1])).intersection(el_state)
331-
if repeated_prev:
332-
for r_el in repeated_prev:
333-
previous_splitters.remove(r_el)
334-
335-
if len(previous_splitters) == 1:
336-
return previous_splitters[0], other_states
337-
else:
338-
return previous_splitters, other_states
339-
340-
341258
def rpn2splitter(splitter_rpn):
342259
"""
343260
Convert from splitter_rpn to splitter.

pydra/engine/state.py

Lines changed: 83 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -395,12 +395,91 @@ def _complete_prev_state(self, prev_state=None):
395395
prev_state = prev_state[0]
396396

397397
if isinstance(prev_state, list):
398-
prev_state, self.other_states = hlpst.removed_previous_repeated(
399-
prev_state, self.other_states
400-
)
401-
398+
prev_state = self._removed_repeated(prev_state)
402399
return prev_state
403400

401+
def _removed_repeated(self, previous_splitters):
402+
"""removing states from previous tasks that are repeated either directly or indirectly"""
403+
for el in previous_splitters:
404+
if el[1:] not in self.other_states:
405+
raise hlpst.PydraStateError(
406+
f"can't ask for splitter from {el[1:]}, other nodes that are connected: {self.other_states}"
407+
)
408+
409+
repeated = set(
410+
[
411+
(el, previous_splitters.count(el))
412+
for el in previous_splitters
413+
if previous_splitters.count(el) > 1
414+
]
415+
)
416+
if repeated:
417+
# assuming that I want to remove fro right
418+
previous_splitters.reverse()
419+
for el, cnt in repeated:
420+
for ii in range(cnt):
421+
previous_splitters.remove(el)
422+
previous_splitters.reverse()
423+
424+
el_state = []
425+
el_connect = []
426+
el_state_connect = []
427+
for el in previous_splitters:
428+
nm = el[1:]
429+
st = self.other_states[nm][0]
430+
if not st.other_states:
431+
# states that has no other connections
432+
el_state.append(el)
433+
else: # element has previous_connection
434+
if st.current_splitter: # final?
435+
# states that has previous connections and it's own splitter
436+
el_state_connect.append((el, st.prev_state_splitter))
437+
else:
438+
# states with previous connections but no additional splitter
439+
el_connect.append((el, st.prev_state_splitter))
440+
441+
for el in el_connect:
442+
nm = el[0][1:]
443+
repeated_prev = set(ensure_list(el[1])).intersection(el_state)
444+
if repeated_prev:
445+
for r_el in repeated_prev:
446+
r_nm = r_el[1:]
447+
self.other_states[r_nm] = (
448+
self.other_states[r_nm][0],
449+
self.other_states[r_nm][1] + self.other_states[nm][1],
450+
)
451+
new_st = set(ensure_list(el[1])) - set(el_state)
452+
if not new_st:
453+
previous_splitters.remove(el[0])
454+
else:
455+
for n_el in new_st:
456+
n_nm = n_el[1:]
457+
self.other_states[n_nm] = (
458+
self.other_states[nm][0].other_states[n_nm][0],
459+
self.other_states[nm][1],
460+
)
461+
# removing el of the splitter and adding new_st instead
462+
ind = previous_splitters.index(el[0])
463+
if ind == len(previous_splitters) - 1:
464+
previous_splitters = previous_splitters[:-1] + list(new_st)
465+
else:
466+
previous_splitters = (
467+
previous_splitters[:ind]
468+
+ list(new_st)
469+
+ previous_splitters[ind + 1 :]
470+
)
471+
# TODO: this part is not tested, needs more work
472+
for el in el_state_connect:
473+
repeated_prev = set(ensure_list(el[1])).intersection(el_state)
474+
if repeated_prev:
475+
for r_el in repeated_prev:
476+
previous_splitters.remove(r_el)
477+
478+
if len(previous_splitters) == 1:
479+
return previous_splitters[0]
480+
else:
481+
return previous_splitters
482+
404483
def _prevst_current_check(self, splitter_part, check_nested=True):
405484
"""
406485
Check if splitter_part is purely prev-state part, the current part,

0 commit comments

Comments
 (0)