cecile_supercool_tracker/
lib.rs1pub mod distance;
12
13pub mod examples;
16
17pub mod prelude;
20
21pub mod track;
27
28pub mod trackers;
31
32pub mod utils;
35
36pub use track::store;
37pub use track::voting;
38
39use thiserror::Error;
40
41#[derive(Error, Debug, Clone)]
44pub enum Errors {
45 #[error("Attributes are incompatible between tracks and cannot be used in calculations.")]
47 IncompatibleAttributes,
48 #[error("Requested observations for class={2} are missing in track={0} or track={1} - distance cannot be calculated.")]
51 ObservationForClassNotFound(u64, u64, u64),
52 #[error("Missing track={0}.")]
55 TrackNotFound(u64),
56
57 #[error("Missing requested tracks.")]
58 TracksNotFound,
59
60 #[error("Calculation with self id={0} not permitted")]
63 SameTrackCalculation(u64),
64
65 #[error("Duplicate track id={0}")]
68 DuplicateTrackId(u64),
69
70 #[error("Generic BBox cannot be converted to a requested type")]
73 GenericBBoxConversionError,
74
75 #[error("The index is out of range")]
77 OutOfRange,
78}
79
80pub const EPS: f32 = 0.00001;
81
82#[cfg(feature = "python")]
83mod python {
84 use crate::trackers::batch::python::PyPredictionBatchResult;
85 use crate::trackers::sort::batch_api::python::{PyBatchSort, PySortPredictionBatchRequest};
86 use crate::trackers::sort::python::{PyPositionalMetricType, PySortTrack, PyWastedSortTrack};
87 use crate::trackers::sort::simple_api::python::PySort;
88 use crate::trackers::spatio_temporal_constraints::python::PySpatioTemporalConstraints;
89 use crate::trackers::visual_sort::batch_api::python::{
90 PyBatchVisualSort, PyVisualSortPredictionBatchRequest,
91 };
92 use crate::trackers::visual_sort::metric::python::PyVisualSortMetricType;
93 use crate::trackers::visual_sort::options::python::PyVisualSortOptions;
94 use crate::trackers::visual_sort::python::{
95 PyVisualSortObservation, PyVisualSortObservationSet, PyWastedVisualSortTrack,
96 };
97 use crate::trackers::visual_sort::simple_api::python::PyVisualSort;
98 use crate::utils::bbox::python::{PyBoundingBox, PyUniversal2DBox};
99 use crate::utils::clipping::clipping_py::{
100 intersection_area_py, sutherland_hodgman_clip_py, PyPolygon,
101 };
102 use crate::utils::kalman::kalman_2d_box::python::{
103 PyUniversal2DBoxKalmanFilter, PyUniversal2DBoxKalmanFilterState,
104 };
105 use crate::utils::kalman::kalman_2d_point::python::{
106 PyPoint2DKalmanFilter, PyPoint2DKalmanFilterState,
107 };
108 use crate::utils::kalman::kalman_2d_point_vec::python::PyVec2DKalmanFilter;
109 use crate::utils::nms::nms_py::nms_py;
110 use pyo3::prelude::*;
111
112 #[pyfunction]
113 pub fn version() -> String {
114 env!("CARGO_PKG_VERSION").to_string()
115 }
116
117 #[pymodule]
118 #[pyo3(name = "similari")]
119 fn similari(_py: Python, m: &PyModule) -> PyResult<()> {
120 pyo3_log::init();
121
122 m.add_class::<PyBoundingBox>()?;
123 m.add_class::<PyUniversal2DBox>()?;
124 m.add_class::<PyPolygon>()?;
125 m.add_class::<PySortTrack>()?;
126 m.add_class::<PyWastedSortTrack>()?;
127
128 m.add_class::<PyUniversal2DBoxKalmanFilterState>()?;
129 m.add_class::<PyUniversal2DBoxKalmanFilter>()?;
130
131 m.add_class::<PyPoint2DKalmanFilterState>()?;
132 m.add_class::<PyPoint2DKalmanFilter>()?;
133
134 m.add_class::<PyVec2DKalmanFilter>()?;
135
136 m.add_class::<PySortPredictionBatchRequest>()?;
137 m.add_class::<PySpatioTemporalConstraints>()?;
138 m.add_class::<PySort>()?;
139
140 m.add_class::<PyPositionalMetricType>()?;
141 m.add_class::<PyVisualSortMetricType>()?;
142 m.add_class::<PyVisualSortOptions>()?;
143 m.add_class::<PyVisualSortObservation>()?;
144 m.add_class::<PyVisualSortObservationSet>()?;
145 m.add_class::<PyVisualSortPredictionBatchRequest>()?;
146 m.add_class::<PyWastedVisualSortTrack>()?;
147 m.add_class::<PyVisualSort>()?;
148
149 m.add_class::<PyPredictionBatchResult>()?;
150
151 m.add_class::<PySortPredictionBatchRequest>()?;
152 m.add_class::<PyBatchSort>()?;
153
154 m.add_class::<PyBatchVisualSort>()?;
155
156 m.add_function(wrap_pyfunction!(version, m)?)?;
157 m.add_function(wrap_pyfunction!(nms_py, m)?)?;
158 m.add_function(wrap_pyfunction!(sutherland_hodgman_clip_py, m)?)?;
159 m.add_function(wrap_pyfunction!(intersection_area_py, m)?)?;
160 Ok(())
161 }
162}