Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 10 additions & 2 deletions src/pyrecest/filters/tracklet_viterbi.py
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,13 @@ class TrackletAssociationCandidate:
velocity: Any | None = None
metadata: Mapping[str, Any] = field(default_factory=dict)

def __post_init__(self) -> None:
object.__setattr__(
self,
"unary_cost",
_as_scalar_float(self.unary_cost, "unary_cost"),
)


@dataclass(frozen=True)
class TrackletViterbiConfig:
Expand Down Expand Up @@ -283,12 +290,13 @@ def _solve_tracklet_viterbi(
for previous_miss_streak, previous_cost in state_costs[-1][
previous_index
].items():
transition_value = float(
transition_value = _as_scalar_float(
transition(
previous_node.candidate,
current_node.candidate,
previous_miss_streak,
)
),
"transition_cost",
)
current_miss_streak = (
previous_miss_streak + 1 if current_node.is_miss else 0
Expand Down
27 changes: 27 additions & 0 deletions tests/filters/test_tracklet_viterbi.py
Original file line number Diff line number Diff line change
Expand Up @@ -268,3 +268,30 @@ def transition(previous, current, miss_streak):
(1,),
(2,),
]


@pytest.mark.parametrize("invalid_cost", [np.nan, np.inf, -np.inf])
def test_tracklet_candidate_rejects_nonfinite_unary_costs(invalid_cost):
with pytest.raises(ValueError, match="unary_cost must be finite"):
TrackletAssociationCandidate("invalid", unary_cost=invalid_cost)


@pytest.mark.parametrize("invalid_cost", [np.nan, np.inf, -np.inf])
def test_tracklet_viterbi_solvers_reject_nonfinite_transition_costs(invalid_cost):
frames = [
[TrackletAssociationCandidate("a", unary_cost=0.0)],
[TrackletAssociationCandidate("b", unary_cost=0.0)],
]

def transition(_previous, _current, _miss_streak):
return invalid_cost

with pytest.raises(ValueError, match="transition_cost must be finite"):
solve_tracklet_viterbi(frames, transition_cost=transition)

with pytest.raises(ValueError, match="transition_cost must be finite"):
solve_fixed_lag_tracklet_viterbi(
frames,
lag_s=0.1,
transition_cost=transition,
)
Loading