Skip to content

Commit 5c24edb

Browse files
committed
Codex upgrade
1 parent 90e1067 commit 5c24edb

File tree

10 files changed

+2603
-105
lines changed

10 files changed

+2603
-105
lines changed

.claude/reports/memory-and-design-audit.md

Lines changed: 632 additions & 0 deletions
Large diffs are not rendered by default.

benchmarks/bench_dtw_baseline.cpp

Lines changed: 196 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)