@@ -48,6 +48,40 @@ static dtwc::Data make_random_data(int N, int L, unsigned base_seed = 100)
4848 return dtwc::Data (std::move (vecs), std::move (names));
4949}
5050
51+ static void configure_problem_variant (dtwc::Problem &prob, int variant_code)
52+ {
53+ dtwc::core::DTWVariantParams params;
54+ switch (variant_code) {
55+ case 1 :
56+ params.variant = dtwc::core::DTWVariant::WDTW;
57+ params.wdtw_g = 0.05 ;
58+ break ;
59+ case 2 :
60+ params.variant = dtwc::core::DTWVariant::DDTW;
61+ break ;
62+ case 3 :
63+ params.variant = dtwc::core::DTWVariant::ADTW;
64+ params.adtw_penalty = 1.0 ;
65+ break ;
66+ case 0 :
67+ default :
68+ params.variant = dtwc::core::DTWVariant::Standard;
69+ break ;
70+ }
71+ prob.set_variant (params);
72+ }
73+
74+ static const char *variant_name (int variant_code)
75+ {
76+ switch (variant_code) {
77+ case 1 : return " WDTW" ;
78+ case 2 : return " DDTW" ;
79+ case 3 : return " ADTW" ;
80+ case 0 :
81+ default : return " Standard" ;
82+ }
83+ }
84+
5185// ---------------------------------------------------------------------------
5286// BM_dtwFull — full O(n*m) DTW for varying series lengths
5387// ---------------------------------------------------------------------------
@@ -135,6 +169,135 @@ BENCHMARK(BM_dtwBanded_fullFallback)
135169 ->Arg(1000 )
136170 ->Unit(benchmark::kMicrosecond );
137171
172+ // ---------------------------------------------------------------------------
173+ // BM_wdtwBanded_g — WDTW banded path that recomputes weights every call
174+ // ---------------------------------------------------------------------------
175+ static void BM_wdtwBanded_g (benchmark::State &state)
176+ {
177+ const auto len = static_cast <size_t >(state.range (0 ));
178+ const int band = static_cast <int >(state.range (1 ));
179+ constexpr double g = 0.05 ;
180+ auto x = random_series (len, 42 );
181+ auto y = random_series (len, 43 );
182+ for (auto _ : state) {
183+ benchmark::DoNotOptimize (dtwc::wdtwBanded<double >(x, y, band, g));
184+ }
185+ state.SetItemsProcessed (static_cast <int64_t >(state.iterations ()));
186+ }
187+ BENCHMARK (BM_wdtwBanded_g)
188+ ->Args({1000 , 10 })
189+ ->Args({1000 , 50 })
190+ ->Args({4000 , 50 })
191+ ->Unit(benchmark::kMicrosecond );
192+
193+ // ---------------------------------------------------------------------------
194+ // BM_wdtwBanded_precomputed — WDTW banded path with reused weight vector
195+ // ---------------------------------------------------------------------------
196+ static void BM_wdtwBanded_precomputed (benchmark::State &state)
197+ {
198+ const auto len = static_cast <size_t >(state.range (0 ));
199+ const int band = static_cast <int >(state.range (1 ));
200+ constexpr double g = 0.05 ;
201+ auto x = random_series (len, 42 );
202+ auto y = random_series (len, 43 );
203+ const int max_dev = static_cast <int >(std::max (x.size (), y.size ()));
204+ const auto weights = dtwc::wdtw_weights<double >(max_dev, g);
205+ for (auto _ : state) {
206+ benchmark::DoNotOptimize (dtwc::wdtwBanded<double >(x, y, weights, band));
207+ }
208+ state.SetItemsProcessed (static_cast <int64_t >(state.iterations ()));
209+ }
210+ BENCHMARK (BM_wdtwBanded_precomputed)
211+ ->Args({1000 , 10 })
212+ ->Args({1000 , 50 })
213+ ->Args({4000 , 50 })
214+ ->Unit(benchmark::kMicrosecond );
215+
216+ // ---------------------------------------------------------------------------
217+ // BM_ddtwBanded — DDTW banded path including derivative preprocessing
218+ // ---------------------------------------------------------------------------
219+ static void BM_ddtwBanded (benchmark::State &state)
220+ {
221+ const auto len = static_cast <size_t >(state.range (0 ));
222+ const int band = static_cast <int >(state.range (1 ));
223+ auto x = random_series (len, 42 );
224+ auto y = random_series (len, 43 );
225+ for (auto _ : state) {
226+ benchmark::DoNotOptimize (dtwc::ddtwBanded<double >(x, y, band));
227+ }
228+ state.SetItemsProcessed (static_cast <int64_t >(state.iterations ()));
229+ }
230+ BENCHMARK (BM_ddtwBanded)
231+ ->Args({1000 , 10 })
232+ ->Args({1000 , 50 })
233+ ->Args({4000 , 50 })
234+ ->Unit(benchmark::kMicrosecond );
235+
236+ // ---------------------------------------------------------------------------
237+ // BM_adtwBanded — ADTW banded path
238+ // ---------------------------------------------------------------------------
239+ static void BM_adtwBanded (benchmark::State &state)
240+ {
241+ const auto len = static_cast <size_t >(state.range (0 ));
242+ const int band = static_cast <int >(state.range (1 ));
243+ constexpr double penalty = 1.0 ;
244+ auto x = random_series (len, 42 );
245+ auto y = random_series (len, 43 );
246+ for (auto _ : state) {
247+ benchmark::DoNotOptimize (dtwc::adtwBanded<double >(x, y, band, penalty));
248+ }
249+ state.SetItemsProcessed (static_cast <int64_t >(state.iterations ()));
250+ }
251+ BENCHMARK (BM_adtwBanded)
252+ ->Args({1000 , 10 })
253+ ->Args({1000 , 50 })
254+ ->Args({4000 , 50 })
255+ ->Unit(benchmark::kMicrosecond );
256+
257+ // ---------------------------------------------------------------------------
258+ // BM_wdtwBanded_mv_ndim1 — MV WDTW ndim==1 scalar fallback path
259+ // ---------------------------------------------------------------------------
260+ static void BM_wdtwBanded_mv_ndim1 (benchmark::State &state)
261+ {
262+ const auto len = static_cast <size_t >(state.range (0 ));
263+ const int band = static_cast <int >(state.range (1 ));
264+ constexpr double g = 0.05 ;
265+ auto x = random_series (len, 42 );
266+ auto y = random_series (len, 43 );
267+ for (auto _ : state) {
268+ benchmark::DoNotOptimize (
269+ dtwc::wdtwBanded_mv<double >(x.data (), x.size (), y.data (), y.size (), 1 , band, g));
270+ }
271+ state.SetItemsProcessed (static_cast <int64_t >(state.iterations ()));
272+ }
273+ BENCHMARK (BM_wdtwBanded_mv_ndim1)
274+ ->Args({1000 , 10 })
275+ ->Args({1000 , 50 })
276+ ->Args({4000 , 50 })
277+ ->Unit(benchmark::kMicrosecond );
278+
279+ // ---------------------------------------------------------------------------
280+ // BM_adtwBanded_mv_ndim1 — MV ADTW ndim==1 scalar fallback path
281+ // ---------------------------------------------------------------------------
282+ static void BM_adtwBanded_mv_ndim1 (benchmark::State &state)
283+ {
284+ const auto len = static_cast <size_t >(state.range (0 ));
285+ const int band = static_cast <int >(state.range (1 ));
286+ constexpr double penalty = 1.0 ;
287+ auto x = random_series (len, 42 );
288+ auto y = random_series (len, 43 );
289+ for (auto _ : state) {
290+ benchmark::DoNotOptimize (
291+ dtwc::adtwBanded_mv<double >(x.data (), x.size (), y.data (), y.size (), 1 , band, penalty));
292+ }
293+ state.SetItemsProcessed (static_cast <int64_t >(state.iterations ()));
294+ }
295+ BENCHMARK (BM_adtwBanded_mv_ndim1)
296+ ->Args({1000 , 10 })
297+ ->Args({1000 , 50 })
298+ ->Args({4000 , 50 })
299+ ->Unit(benchmark::kMicrosecond );
300+
138301// ---------------------------------------------------------------------------
139302// BM_fillDistanceMatrix — end-to-end distance matrix build
140303// Args: (N_series, series_length, band) where band=-1 means full DTW
@@ -170,6 +333,39 @@ BENCHMARK(BM_fillDistanceMatrix)
170333 ->Args({100 , 1000 , -1 })
171334 ->Unit(benchmark::kMillisecond );
172335
336+ // ---------------------------------------------------------------------------
337+ // BM_fillDistanceMatrix_variant — end-to-end Problem path by variant
338+ // Args: (N_series, series_length, band, variant_code)
339+ // ---------------------------------------------------------------------------
340+ static void BM_fillDistanceMatrix_variant (benchmark::State &state)
341+ {
342+ const int N = static_cast <int >(state.range (0 ));
343+ const int L = static_cast <int >(state.range (1 ));
344+ const int band = static_cast <int >(state.range (2 ));
345+ const int variant = static_cast <int >(state.range (3 ));
346+ state.SetLabel (variant_name (variant));
347+
348+ for (auto _ : state) {
349+ state.PauseTiming ();
350+ dtwc::Problem prob (" bench_variant" );
351+ prob.set_data (make_random_data (N, L));
352+ prob.band = band;
353+ configure_problem_variant (prob, variant);
354+ state.ResumeTiming ();
355+
356+ prob.fillDistanceMatrix ();
357+ }
358+
359+ state.SetItemsProcessed (static_cast <int64_t >(state.iterations ())
360+ * static_cast <int64_t >(N) * (N - 1 ) / 2 );
361+ }
362+ BENCHMARK (BM_fillDistanceMatrix_variant)
363+ ->Args({50 , 500 , 50 , 0 })
364+ ->Args({50 , 500 , 50 , 1 })
365+ ->Args({50 , 500 , 50 , 2 })
366+ ->Args({50 , 500 , 50 , 3 })
367+ ->Unit(benchmark::kMillisecond );
368+
173369// ---------------------------------------------------------------------------
174370// BM_lb_keogh — LB_Keogh lower bound for varying lengths
175371// ---------------------------------------------------------------------------
0 commit comments