Skip to content

Commit 11c9a15

Browse files
committed
feat(wasm): add comprehensive WASM bindings for all algorithms
- Add BitStringOptimizer for binary optimization with custom JS fitness - Add PermutationOptimizer for ordering problems (TSP, scheduling) - Add Nsga2Optimizer for multi-objective optimization with Pareto fronts - Add custom JS fitness function support to RealVectorOptimizer - Feature-gate Send+Sync trait bounds for WASM compatibility: - Fitness trait in fitness/traits.rs - CmaEsFitness trait in algorithms/cmaes.rs - MultiObjectiveFitness trait in algorithms/nsga2.rs - EvolutionStrategy build/run methods in algorithms/evolution_strategy.rs - Add new result types: BitStringResult, PermutationResult, MultiObjectiveResult - All optimizers support custom fitness functions via JS callbacks
1 parent 1afce96 commit 11c9a15

8 files changed

Lines changed: 1323 additions & 17 deletions

File tree

crates/fugue-evo-wasm/src/error.rs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,11 @@ pub fn evolution_error_to_js(err: fugue_evo::error::EvolutionError) -> JsValue {
1818

1919
let obj = js_sys::Object::new();
2020
let _ = js_sys::Reflect::set(&obj, &"type".into(), &JsValue::from_str(error_type));
21-
let _ = js_sys::Reflect::set(&obj, &"message".into(), &JsValue::from_str(&err.to_string()));
21+
let _ = js_sys::Reflect::set(
22+
&obj,
23+
&"message".into(),
24+
&JsValue::from_str(&err.to_string()),
25+
);
2226
obj.into()
2327
}
2428

crates/fugue-evo-wasm/src/fitness.rs

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
//! Fitness function support for WASM
22
3+
use fugue_evo::algorithms::cmaes::CmaEsFitness;
34
use fugue_evo::fitness::benchmarks::{Rastrigin, Rosenbrock, Sphere};
45
use fugue_evo::fitness::traits::Fitness;
56
use fugue_evo::genome::real_vector::RealVector;
@@ -95,3 +96,22 @@ pub fn get_available_fitness_functions() -> Vec<String> {
9596
"rosenbrock".to_string(),
9697
]
9798
}
99+
100+
/// CMA-ES fitness wrapper (CMA-ES minimizes, so we negate)
101+
pub struct CmaEsFitnessWrapper {
102+
wrapper: FitnessWrapper,
103+
}
104+
105+
impl CmaEsFitnessWrapper {
106+
pub fn new(wrapper: FitnessWrapper) -> Self {
107+
Self { wrapper }
108+
}
109+
}
110+
111+
impl CmaEsFitness for CmaEsFitnessWrapper {
112+
fn evaluate(&self, x: &RealVector) -> f64 {
113+
// CMA-ES minimizes, our FitnessWrapper negates for maximization
114+
// So we negate back to get minimization values
115+
-self.wrapper.evaluate(x)
116+
}
117+
}

0 commit comments

Comments
 (0)