def predict_transitions(self, tier_keys: sppasTier, tier_segments: sppasTier) -> tuple:
"""Return the predicted position transitions and shape transitions.
The two returned lists contain:
- the estimated m1 and m2 values (in seconds), or d1 and d2;
- the transition position in a tuple with origin and target; and
- the origin/target annotation identifiers.
:param tier_keys: (sppasTier)
:param tier_segments: (sppasTier) Tier with name 'CS-PhonSegments', phonemes of each key
:return: tuple(PredictedWhenHand, PredictedWhenHand)
:raises: sppasCuedRulesValueError
"""
pos_moves = PredictedWhenHand()
shp_moves = PredictedWhenHand()
self.asset_a1a3(tier_keys)
ann = tier_keys[0]
labels = ann.get_labels()
prev_shape = labels[0].copy()
prev_pos = labels[1].copy()
interval = ann.get_location()
key_rank_ipu = 1
prev_phns = self.__get_phones(tier_segments, interval)
for ii in range(1, len(tier_keys)):
ann = tier_keys[ii]
labels = ann.get_labels()
cur_shape = labels[0].copy()
cur_pos = labels[1].copy()
cur_phns = self.__get_phones(tier_segments, ann.get_location())
interval = ann.get_location()
a1 = interval.get_lowest_localization().get_midpoint()
a3 = interval.get_highest_localization().get_midpoint()
if self.position_is_neutral(cur_pos.get_best().get_content()) is True:
key_rank_ipu = 0
self.__transitions.set_a(a1, a3, store=False)
if prev_pos != cur_pos or (prev_pos == cur_pos and prev_pos != 's') or (prev_pos == cur_pos and prev_pos == 's' and (prev_shape == cur_shape)):
(m1, m2) = self.__transitions.predict_m(rank=key_rank_ipu, is_nil_shape=self.has_nil_shape(cur_phns), is_nil_pos=self.has_nil_pos(cur_phns))
prev_pos.set_key(prev_phns)
cur_pos.set_key(cur_phns)
pos_moves.append(m1, m2, (prev_pos, cur_pos), tier_keys[ii - 1].get_id(), ann.get_id())
if cur_shape != prev_shape:
(d1, d2) = self.__transitions.predict_d(rank=key_rank_ipu, is_nil_shape=self.has_nil_shape(cur_phns), is_nil_pos=self.has_nil_pos(cur_phns))
shp_moves.append(d1, d2, (prev_shape, cur_shape), tier_keys[ii - 1].get_id(), ann.get_id())
prev_shape = cur_shape
prev_pos = cur_pos
prev_phns = cur_phns
key_rank_ipu += 1
return (pos_moves, shp_moves)