@@ -96,20 +96,31 @@ def __init__(self, name, splitter=None, combiner=None, other_states=None):
96
96
self .missing_connections = False
97
97
self .other_states = other_states
98
98
self .splitter = splitter
99
+ # temporary combiner
100
+ self ._combiner = combiner
99
101
# if missing_connections, we can't continue, should wait for updates
100
- # TODO: should find a better way, so it's not in the init, but combiner complicates
101
102
if not self .missing_connections :
102
- self ._connect_splitters ()
103
- self .combiner = combiner
104
- self .inner_inputs = {}
105
- for name , (st , inp ) in self .other_states .items ():
106
- if f"_{ st .name } " in self .splitter_rpn_compact :
107
- self .inner_inputs [f"{ self .name } .{ inp } " ] = st
108
- self .set_input_groups ()
109
- self .set_splitter_final ()
110
- self .states_val = []
111
- self .inputs_ind = []
112
- self .final_combined_ind_mapping = {}
103
+ self .update_connections ()
104
+
105
+ def update_connections (self , new_other_states = None , new_combiner = None ):
106
+ if new_other_states :
107
+ self .missing_connections = False
108
+ self .other_states = new_other_states
109
+ self .splitter = self ._splitter
110
+ self ._connect_splitters ()
111
+ if new_combiner :
112
+ self .combiner = new_combiner
113
+ else :
114
+ self .combiner = self ._combiner
115
+ self .inner_inputs = {}
116
+ for name , (st , inp ) in self .other_states .items ():
117
+ if f"_{ st .name } " in self .splitter_rpn_compact :
118
+ self .inner_inputs [f"{ self .name } .{ inp } " ] = st
119
+ self .set_input_groups ()
120
+ self .set_splitter_final ()
121
+ self .states_val = []
122
+ self .inputs_ind = []
123
+ self .final_combined_ind_mapping = {}
113
124
114
125
def __str__ (self ):
115
126
"""Generate a string representation of the object."""
@@ -175,24 +186,31 @@ def combiner(self):
175
186
176
187
@combiner .setter
177
188
def combiner (self , combiner ):
178
- if combiner :
179
- if not self .splitter :
180
- raise Exception ("splitter has to be set before setting combiner" )
181
- if not isinstance (combiner , (str , list )):
182
- raise Exception ("combiner has to be a string or a list" )
183
- self ._combiner = hlpst .add_name_combiner (ensure_list (combiner ), self .name )
184
- if set (self ._combiner ) - set (self .splitter_rpn ):
185
- raise Exception ("all combiners have to be in the splitter" )
186
- # combiners from the current fields: i.e. {self.name}.input
187
- self ._right_combiner = [
188
- comb for comb in self ._combiner if self .name in comb
189
- ]
190
- # combiners from the previous states
191
- self ._left_combiner = list (set (self ._combiner ) - set (self ._right_combiner ))
189
+ if self .missing_connections or not self .splitter :
190
+ self ._combiner = combiner
192
191
else :
193
- self ._combiner = []
194
- self ._left_combiner = []
195
- self ._right_combiner = []
192
+ if combiner :
193
+ if not self .splitter :
194
+ raise Exception ("splitter has to be set before setting combiner" )
195
+ if not isinstance (combiner , (str , list )):
196
+ raise Exception ("combiner has to be a string or a list" )
197
+ self ._combiner = hlpst .add_name_combiner (
198
+ ensure_list (combiner ), self .name
199
+ )
200
+ if set (self ._combiner ) - set (self .splitter_rpn ):
201
+ raise Exception ("all combiners have to be in the splitter" )
202
+ # combiners from the current fields: i.e. {self.name}.input
203
+ self ._right_combiner = [
204
+ comb for comb in self ._combiner if self .name in comb
205
+ ]
206
+ # combiners from the previous states
207
+ self ._left_combiner = list (
208
+ set (self ._combiner ) - set (self ._right_combiner )
209
+ )
210
+ else :
211
+ self ._combiner = []
212
+ self ._left_combiner = []
213
+ self ._right_combiner = []
196
214
197
215
def _connect_splitters (self ):
198
216
"""
@@ -276,7 +294,7 @@ def _complete_left(self, left=None):
276
294
left = left [0 ]
277
295
return left
278
296
279
- def _left_right_check (self , splitter_part , rec_lev = 0 ):
297
+ def _left_right_check (self , splitter_part , check_nested = True ):
280
298
"""
281
299
Check if splitter_part is purely Left, Right
282
300
or [Left, Right] if the splitter_part is a list (outer splitter)
@@ -299,9 +317,9 @@ def _left_right_check(self, splitter_part, rec_lev=0):
299
317
return "Right"
300
318
elif (
301
319
isinstance (self .splitter , list )
302
- and rec_lev == 0
303
- and self ._left_right_check (self .splitter [0 ], rec_lev = 1 ) == "Left"
304
- and self ._left_right_check (self .splitter [1 ], rec_lev = 1 ) == "Right"
320
+ and check_nested
321
+ and self ._left_right_check (self .splitter [0 ], check_nested = False ) == "Left"
322
+ and self ._left_right_check (self .splitter [1 ], check_nested = False ) == "Right"
305
323
):
306
324
return "[Left, Right]" # Left and Right parts separated in outer scalar
307
325
else :
@@ -339,11 +357,11 @@ def set_input_groups(self):
339
357
340
358
def connect_groups (self ):
341
359
""""Connect previous states and evaluate the final groups."""
342
- self .merge_previous_states ()
360
+ self ._merge_previous_states ()
343
361
if self ._right_splitter : # if Right part, adding groups from current st
344
362
self .push_new_states ()
345
363
346
- def merge_previous_states (self ):
364
+ def _merge_previous_states (self ):
347
365
"""Merge groups from all previous nodes."""
348
366
last_gr = 0
349
367
self .groups_stack_final = []
0 commit comments