| 546 | |
| 547 | #[test] |
| 548 | fn test_discrete_kernel() { |
| 549 | let n = 10000; |
| 550 | let h = 0.025; |
| 551 | |
| 552 | let discrete_kernel = DiscreteSquaredDistanceCubicKernel::new::<f64>(n, h); |
| 553 | let kernel = CubicSplineKernel::new(h); |
| 554 | |
| 555 | // Test the pre-computed values using a linear stepping |
| 556 | let dr = h / (n as f64); |
| 557 | for i in 0..n { |
| 558 | let r = (i as f64) * dr; |
| 559 | let rr = r * r; |
| 560 | |
| 561 | let discrete = discrete_kernel.evaluate(rr); |
| 562 | let continuous = kernel.evaluate(r); |
| 563 | |
| 564 | let diff = (discrete - continuous).abs(); |
| 565 | let rel_diff = diff / continuous; |
| 566 | if rel_diff > 5e-2 && diff > 1e-1 { |
| 567 | eprintln!( |
| 568 | "at r={}, r/h={}, discrete: {}, continuous: {}, diff: {}, rel_diff: {}", |
| 569 | r, |
| 570 | r / h, |
| 571 | discrete, |
| 572 | continuous, |
| 573 | diff, |
| 574 | rel_diff |
| 575 | ); |
| 576 | assert!(false); |
| 577 | } |
| 578 | } |
| 579 | } |