euler314 commited on
Commit
7ad38fe
·
verified ·
1 Parent(s): f24adf5

Update cubic_cpp.cpp

Browse files
Files changed (1) hide show
  1. 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,