1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
//! # traj-dist-rs
//!
//! `traj-dist-rs` is a high-performance trajectory distance and similarity measurement library implemented in Rust.
//! It provides efficient implementations of various trajectory distance algorithms with both
//! Rust native APIs and Python bindings.
//!
//! ## Overview
//!
//! This crate implements multiple trajectory distance algorithms including:
//!
//! - SSPD (Symmetric Segment-Path Distance)
//! - DTW (Dynamic Time Warping)
//! - Hausdorff Distance
//! - LCSS (Longest Common Subsequence)
//! - EDR (Edit Distance on Real sequence)
//! - ERP (Edit distance with Real Penalty)
//! - Frechet Distance (Continuous) - Euclidean only
//! - Discrete Frechet Distance
//! - EDwP (Edit Distance with Projections) - Euclidean only
//! - SOWD (One-Way Distance) (planned)
//!
//! Trajectory similarity is often measured via trajectory distances such as DTW, LCSS, EDR, ERP, EDwP, Hausdorff, (Discrete) Fréchet, and SSPD.
//!
//! ## Features
//!
//! - High-performance Rust implementations
//! - Support for both Euclidean and Spherical(Haversine / great-circle) distance calculations
//! - Python bindings via PyO3
//! - Compatible with the original `traj-dist` library
//! - Support for various trajectory distance algorithms
//! - Batch computation functions (pdist, cdist) with parallel processing
//! - Zero-copy NumPy array support for Python bindings
//!
//! ## Similarity vs Distance
//!
//! This library computes trajectory **distances**, which can be easily converted to **similarity scores**:
//!
//! - **Similarity = 1 / (1 + distance)**: Commonly used for similarity scoring
//! - **Similarity = exp(-distance / σ)**: Gaussian kernel similarity, where σ controls the sensitivity
//! - **Normalized LCSS/EDR**: These algorithms can return normalized scores in [0, 1] range
//!
//! For example, if DTW distance is 2.0:
//! ```rust
//! let distance = 2.0;
//! let similarity = 1.0 / (1.0 + distance); // similarity = 0.333
//! ```
//!
//! ## Use Cases and Applications
//!
//! This library is useful for various trajectory analysis tasks:
//!
//! - **Trajectory similarity search**: Find similar trajectories from a database via kNN and pdist/cdist
//! - **Nearest neighbor retrieval**: Query by example trajectory
//! - **Trajectory clustering**: Group similar trajectories together
//! - **Map-matching preprocessing**: Match GPS traces to road networks
//! - **Anomaly detection**: Identify unusual trajectory patterns
//! - **Route pattern mining**: Discover common movement patterns
//! - **Mobility data analysis**: Analyze GPS traces and movement data
//! - **Time series similarity**: Treat trajectories as 2D time series
//!
//! ## Glossary and Terminology
//!
//! - **Trajectory similarity / distance / dissimilarity**: Related concepts for measuring how alike two trajectories are
//! - **Sequence alignment**: Matching elements between two sequences (e.g., DTW, LCSS)
//! - **Warping / matching**: Non-linear alignment between sequences (DTW concept)
//! - **Spatiotemporal trajectories / GPS traces**: Trajectories with both spatial (location) and temporal (time) information
//!
//! ## Usage
//!
//! ```rust
//! use traj_dist_rs::distance::sspd::sspd;
//! use traj_dist_rs::distance::distance_type::DistanceType;
//!
//! let traj1 = vec![[0.0, 0.0], [1.0, 1.0]];
//! let traj2 = vec![[0.0, 1.0], [1.0, 0.0]];
//!
//! let distance = sspd(&traj1, &traj2, DistanceType::Euclidean);
//! println!("SSPD distance: {}", distance);
//!
//! // Convert to similarity score
//! let similarity = 1.0 / (1.0 + distance);
//! println!("SSPD similarity: {}", similarity);
//! ```
use *;
/// Trajectory distance calculation library