def required_track_score( *, confirmed, is_switch_candidate, weak_reacq_guard, acquire_floor=0.08, reacquire_floor=0.07, switch_floor=0.10, ): if not confirmed: return float(acquire_floor) floor = float(reacquire_floor) if weak_reacq_guard: floor = max(floor, float(reacquire_floor)) if is_switch_candidate: floor = max(floor, float(switch_floor)) return float(floor) def track_passes_score_gate( *, track_score, confirmed, is_switch_candidate, weak_reacq_guard, acquire_floor=0.08, reacquire_floor=0.07, switch_floor=0.10, ): return float(track_score) >= required_track_score( confirmed=confirmed, is_switch_candidate=is_switch_candidate, weak_reacq_guard=weak_reacq_guard, acquire_floor=acquire_floor, reacquire_floor=reacquire_floor, switch_floor=switch_floor, ) def initial_candidate_score( *, track_score, track_hits, residual_motion, appearance=0.0, wavelet_bonus=0.0, physics_bonus=0.0, ): persistence = min(max(int(track_hits) - 1, 0), 5) / 5.0 return ( 0.55 * float(track_score) + 0.15 * persistence + 0.12 * float(bool(residual_motion)) + 0.90 * float(appearance) + float(wavelet_bonus) + float(physics_bonus) )