Spaces:
Running
Running
Update cubic_cpp.cpp
Browse files- cubic_cpp.cpp +35 -1
cubic_cpp.cpp
CHANGED
@@ -363,7 +363,41 @@ std::tuple<double, double> compute_eigenvalues_for_beta(double z_a, double y, do
|
|
363 |
// Return min and max
|
364 |
return std::make_tuple(eigenvalues.front(), eigenvalues.back());
|
365 |
}
|
366 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
367 |
// Fast computation of eigenvalue support boundaries
|
368 |
std::tuple<std::vector<double>, std::vector<double>, std::vector<double>, std::vector<double>>
|
369 |
compute_eigenvalue_support_boundaries(double z_a, double y, const std::vector<double>& beta_values,
|
|
|
363 |
// Return min and max
|
364 |
return std::make_tuple(eigenvalues.front(), eigenvalues.back());
|
365 |
}
|
366 |
+
// Compute derivatives - implementation matching Python's gradient
|
367 |
+
std::tuple<std::vector<double>, std::vector<double>>
|
368 |
+
compute_derivatives(const std::vector<double>& curve, const std::vector<double>& betas) {
|
369 |
+
size_t n = curve.size();
|
370 |
+
std::vector<double> d1(n, 0.0);
|
371 |
+
std::vector<double> d2(n, 0.0);
|
372 |
+
|
373 |
+
if (n < 2 || n != betas.size()) {
|
374 |
+
return std::make_tuple(d1, d2); // Return zeros if invalid input
|
375 |
+
}
|
376 |
+
|
377 |
+
// First derivative using central differences
|
378 |
+
for (size_t i = 1; i < n-1; i++) {
|
379 |
+
d1[i] = (curve[i+1] - curve[i-1]) / (betas[i+1] - betas[i-1]);
|
380 |
+
}
|
381 |
+
|
382 |
+
// Edge cases using forward/backward differences
|
383 |
+
if (n > 1) {
|
384 |
+
d1[0] = (curve[1] - curve[0]) / (betas[1] - betas[0]);
|
385 |
+
d1[n-1] = (curve[n-1] - curve[n-2]) / (betas[n-1] - betas[n-2]);
|
386 |
+
}
|
387 |
+
|
388 |
+
// Second derivative using the same method applied to first derivative
|
389 |
+
for (size_t i = 1; i < n-1; i++) {
|
390 |
+
d2[i] = (d1[i+1] - d1[i-1]) / (betas[i+1] - betas[i-1]);
|
391 |
+
}
|
392 |
+
|
393 |
+
// Edge cases for second derivative
|
394 |
+
if (n > 1) {
|
395 |
+
d2[0] = (d1[1] - d1[0]) / (betas[1] - betas[0]);
|
396 |
+
d2[n-1] = (d1[n-1] - d1[n-2]) / (betas[n-1] - betas[n-2]);
|
397 |
+
}
|
398 |
+
|
399 |
+
return std::make_tuple(d1, d2);
|
400 |
+
}
|
401 |
// Fast computation of eigenvalue support boundaries
|
402 |
std::tuple<std::vector<double>, std::vector<double>, std::vector<double>, std::vector<double>>
|
403 |
compute_eigenvalue_support_boundaries(double z_a, double y, const std::vector<double>& beta_values,
|