from abc import abstractmethod
from ..base import Base, Property
from ..types.track import Track
from ..types.update import Update
[docs]
class Deleter(Base):
"""Deleter base class.
Proposes tracks for deletion.
"""
delete_last_pred: bool = Property(default=False, doc="Remove the state that caused a track to "
"be deleted if it is a prediction.")
[docs]
@abstractmethod
def check_for_deletion(self, track: Track, **kwargs) -> bool:
"""Check if a given track should be deleted.
Parameters
----------
track : Track
A track object to be checked for deletion.
Returns
-------
bool
`True` if track should be deleted, `False` otherwise.
"""
pass
[docs]
def delete_tracks(self, tracks: set[Track], **kwargs) -> set[Track]:
"""Generic/Base track deletion method.
Iterates through all tracks in a given list and calls
:meth:`~check_for_deletion` to determine which
tracks should be deleted and which should survive.
Parameters
----------
tracks : set of :class:`~.Track`
A set of :class:`~.Track` objects
Returns
-------
: set of :class:`~.Track`
Set of tracks proposed for deletion.
"""
tracks_to_delete = {track for track in tracks if self.check_for_deletion(track, **kwargs)}
if self.delete_last_pred:
for track in tracks_to_delete:
if not isinstance(track[-1], Update):
del track[-1]
del track.metadatas[-1]
return tracks_to_delete