test_additional_functions/
test_additional_functions.rs

1//! Test script for additional SFU optimization functions
2//!
3//! This example tests all the newly added functions beyond the core SFU set
4
5use math_audio_test_functions::*;
6use ndarray::Array1;
7
8fn main() {
9    println!("Testing additional optimization functions:");
10    println!("{}", "=".repeat(60));
11
12    // Test Xin-She Yang N.1 Function - 2D
13    let x_xsy1 = Array1::from_vec(vec![0.0, 0.0]);
14    let f_xsy1 = xin_she_yang_n1(&x_xsy1);
15    println!("Xin-She Yang N.1 Function:");
16    println!("  x = [{:.1}, {:.1}]", x_xsy1[0], x_xsy1[1]);
17    println!("  f(x) = {:.6} (expected = 0.0)", f_xsy1);
18    println!();
19
20    // Test Discus Function - 2D
21    let x_discus = Array1::from_vec(vec![0.0, 0.0]);
22    let f_discus = discus(&x_discus);
23    println!("Discus Function:");
24    println!("  x = [{:.1}, {:.1}]", x_discus[0], x_discus[1]);
25    println!("  f(x) = {:.6} (expected = 0.0)", f_discus);
26
27    // Test with non-zero to see ill-conditioning
28    let x_discus2 = Array1::from_vec(vec![0.1, 0.1]);
29    let f_discus2 = discus(&x_discus2);
30    println!("  x = [{:.1}, {:.1}]", x_discus2[0], x_discus2[1]);
31    println!("  f(x) = {:.6} (1e6*0.1² + 0.1² = 10000.01)", f_discus2);
32    println!();
33
34    // Test Elliptic Function - 2D
35    let x_elliptic = Array1::from_vec(vec![0.0, 0.0]);
36    let f_elliptic = elliptic(&x_elliptic);
37    println!("Elliptic Function:");
38    println!("  x = [{:.1}, {:.1}]", x_elliptic[0], x_elliptic[1]);
39    println!("  f(x) = {:.6} (expected = 0.0)", f_elliptic);
40    println!();
41
42    // Test Cigar Function - 2D
43    let x_cigar = Array1::from_vec(vec![0.0, 0.0]);
44    let f_cigar = cigar(&x_cigar);
45    println!("Cigar Function:");
46    println!("  x = [{:.1}, {:.1}]", x_cigar[0], x_cigar[1]);
47    println!("  f(x) = {:.6} (expected = 0.0)", f_cigar);
48    println!();
49
50    // Test Tablet Function - 2D
51    let x_tablet = Array1::from_vec(vec![0.0, 0.0]);
52    let f_tablet = tablet(&x_tablet);
53    println!("Tablet Function:");
54    println!("  x = [{:.1}, {:.1}]", x_tablet[0], x_tablet[1]);
55    println!("  f(x) = {:.6} (expected = 0.0)", f_tablet);
56    println!();
57
58    // Test Different Powers Function - 2D
59    let x_diffpow = Array1::from_vec(vec![0.0, 0.0]);
60    let f_diffpow = different_powers(&x_diffpow);
61    println!("Different Powers Function:");
62    println!("  x = [{:.1}, {:.1}]", x_diffpow[0], x_diffpow[1]);
63    println!("  f(x) = {:.6} (expected = 0.0)", f_diffpow);
64    println!();
65
66    // Test Ridge Function - 2D
67    let x_ridge = Array1::from_vec(vec![0.0, 0.0]);
68    let f_ridge = ridge(&x_ridge);
69    println!("Ridge Function:");
70    println!("  x = [{:.1}, {:.1}]", x_ridge[0], x_ridge[1]);
71    println!("  f(x) = {:.6} (expected = 0.0)", f_ridge);
72    println!();
73
74    // Test Sharp Ridge Function - 2D
75    let x_sharpridge = Array1::from_vec(vec![0.0, 0.0]);
76    let f_sharpridge = sharp_ridge(&x_sharpridge);
77    println!("Sharp Ridge Function:");
78    println!("  x = [{:.1}, {:.1}]", x_sharpridge[0], x_sharpridge[1]);
79    println!("  f(x) = {:.6} (expected = 0.0)", f_sharpridge);
80    println!();
81
82    // Test Katsuura Function - 2D
83    let x_katsuura = Array1::from_vec(vec![0.0, 0.0]);
84    let f_katsuura = katsuura(&x_katsuura);
85    println!("Katsuura Function:");
86    println!("  x = [{:.1}, {:.1}]", x_katsuura[0], x_katsuura[1]);
87    println!("  f(x) = {:.6} (expected ≈ 1.0)", f_katsuura);
88    println!();
89
90    // Test HappyCat Function - 2D
91    let x_happycat = Array1::from_vec(vec![-1.0, -1.0]);
92    let f_happycat = happycat(&x_happycat);
93    println!("HappyCat Function:");
94    println!("  x = [{:.1}, {:.1}]", x_happycat[0], x_happycat[1]);
95    println!("  f(x) = {:.6} (expected = 0.0)", f_happycat);
96    println!();
97
98    // Test Expanded Griewank-Rosenbrock Function - 2D
99    let x_egr = Array1::from_vec(vec![1.0, 1.0]);
100    let f_egr = expanded_griewank_rosenbrock(&x_egr);
101    println!("Expanded Griewank-Rosenbrock Function:");
102    println!("  x = [{:.1}, {:.1}]", x_egr[0], x_egr[1]);
103    println!("  f(x) = {:.6} (expected ≈ 0.0)", f_egr);
104    println!();
105
106    // Test Alternative Gramacy & Lee Function - 1D
107    let x_gramacy_alt = Array1::from_vec(vec![0.3]);
108    let f_gramacy_alt = gramacy_lee_function(&x_gramacy_alt);
109    println!("Alternative Gramacy & Lee Function:");
110    println!("  x = [{:.1}]", x_gramacy_alt[0]);
111    println!("  f(x) = {:.6}", f_gramacy_alt);
112    println!();
113
114    // Test function metadata retrieval for new functions
115    println!("Testing function metadata for additional functions:");
116    let metadata = get_function_metadata();
117
118    let new_functions = [
119        "xin_she_yang_n1",
120        "discus",
121        "elliptic",
122        "cigar",
123        "tablet",
124        "different_powers",
125        "ridge",
126        "sharp_ridge",
127        "katsuura",
128        "happycat",
129        "expanded_griewank_rosenbrock",
130    ];
131
132    for func_name in &new_functions {
133        if let Some(meta) = metadata.get(*func_name) {
134            println!(
135                "  {}: {} ({} dimensions available)",
136                meta.name,
137                if meta.multimodal {
138                    "multimodal"
139                } else {
140                    "unimodal"
141                },
142                meta.dimensions.len()
143            );
144        }
145    }
146
147    println!("\nTotal functions in metadata: {}", metadata.len());
148}