#[cfg(feature = "wasm")]
use crate::{Result, TensorError};
#[cfg(feature = "wasm")]
use super::compression::CompressionConfig;
#[cfg(feature = "wasm")]
use super::performance::WasmOptimizationReport;
#[cfg(feature = "wasm")]
pub struct WasmBundleOptimizer {
pub optimizations: WasmOptimizationConfig,
pub code_splitting: CodeSplittingConfig,
pub tree_shaking: TreeShakingConfig,
pub compression: CompressionConfig,
}
#[cfg(feature = "wasm")]
#[derive(Debug, Clone)]
pub struct WasmOptimizationConfig {
pub dead_code_elimination: bool,
pub function_inlining: bool,
pub constant_folding: bool,
pub loop_unrolling: bool,
pub optimization_level: u8,
pub lto: bool,
}
#[cfg(feature = "wasm")]
#[derive(Debug, Clone)]
pub struct CodeSplittingConfig {
pub split_layers: bool,
pub split_operations: bool,
pub min_chunk_size: usize,
pub max_chunk_size: usize,
pub dynamic_imports: bool,
}
#[cfg(feature = "wasm")]
#[derive(Debug, Clone)]
pub struct TreeShakingConfig {
pub remove_unused_ops: bool,
pub remove_unused_dtypes: bool,
pub remove_unused_backends: bool,
pub aggressive: bool,
}
#[cfg(feature = "wasm")]
impl WasmBundleOptimizer {
pub fn new() -> Self {
Self {
optimizations: WasmOptimizationConfig {
dead_code_elimination: true,
function_inlining: true,
constant_folding: true,
loop_unrolling: false,
optimization_level: 3,
lto: true,
},
code_splitting: CodeSplittingConfig {
split_layers: true,
split_operations: true,
min_chunk_size: 50 * 1024, max_chunk_size: 500 * 1024, dynamic_imports: true,
},
tree_shaking: TreeShakingConfig {
remove_unused_ops: true,
remove_unused_dtypes: true,
remove_unused_backends: true,
aggressive: true,
},
compression: CompressionConfig::default(),
}
}
pub fn optimize_for_edge(&self) -> Result<WasmOptimizationReport> {
Err(TensorError::not_implemented_simple(
"WasmBundleOptimizer::optimize_for_edge: real WASM bundle-size \
analysis is not implemented. This optimizer never receives a \
compiled .wasm binary to analyze -- it only holds optimization \
preferences -- so any 'bytes saved' figure it returned would be \
fabricated rather than measured. Provide real compiled WASM \
bytes to a binary-level size analyzer (e.g. one that parses \
section headers and diffs sizes before/after a real \
transformation) to get genuine numbers."
.to_string(),
))
}
pub fn optimize_for_minimal_size(&mut self) -> Result<WasmOptimizationReport> {
Err(TensorError::not_implemented_simple(
"WasmBundleOptimizer::optimize_for_minimal_size: real WASM \
bundle-size analysis is not implemented. This optimizer never \
receives a compiled .wasm binary to analyze, so \
symbol-stripping, inlining, constant-folding, and \
instruction/memory-layout savings cannot be honestly computed \
here. Provide real compiled WASM bytes to a binary-level size \
analyzer to get genuine numbers."
.to_string(),
))
}
pub fn create_ultra_minimal_config() -> (
WasmOptimizationConfig,
CodeSplittingConfig,
TreeShakingConfig,
) {
let optimization = WasmOptimizationConfig {
dead_code_elimination: true,
function_inlining: true,
constant_folding: true,
loop_unrolling: false, optimization_level: 3,
lto: true,
};
let code_splitting = CodeSplittingConfig {
split_layers: true,
split_operations: true,
min_chunk_size: 10 * 1024, max_chunk_size: 100 * 1024, dynamic_imports: true,
};
let tree_shaking = TreeShakingConfig {
remove_unused_ops: true,
remove_unused_dtypes: true,
remove_unused_backends: true,
aggressive: true,
};
(optimization, code_splitting, tree_shaking)
}
pub fn detect_simd_support(&self) -> Result<bool> {
Err(TensorError::not_implemented_simple(
"WasmBundleOptimizer::detect_simd_support: no real SIMD \
capability probe is wired into this optimizer. See \
wasm_optimization::device::WasmDeviceCapabilities::detect for a \
genuine (wasm32-only) runtime feature check; integrating it \
here would require passing device capabilities into \
WasmBundleOptimizer, which is out of scope for this fix."
.to_string(),
))
}
}
#[cfg(feature = "wasm")]
impl Default for WasmBundleOptimizer {
fn default() -> Self {
Self::new()
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
#[cfg(feature = "wasm")]
fn test_bundle_optimizer() {
let optimizer = WasmBundleOptimizer::new();
assert!(optimizer.optimizations.dead_code_elimination);
assert!(optimizer.optimizations.lto);
}
#[test]
#[cfg(feature = "wasm")]
fn test_ultra_minimal_config() {
let (opt, code_split, tree_shake) = WasmBundleOptimizer::create_ultra_minimal_config();
assert!(opt.dead_code_elimination);
assert!(!opt.loop_unrolling);
assert_eq!(code_split.min_chunk_size, 10 * 1024);
assert!(tree_shake.aggressive);
}
#[test]
#[cfg(feature = "wasm")]
fn test_optimize_for_edge_returns_honest_error() {
let optimizer = WasmBundleOptimizer::new();
let result = optimizer.optimize_for_edge();
assert!(result.is_err());
let message = result.unwrap_err().to_string();
assert!(message.contains("not implemented"));
assert!(message.contains("optimize_for_edge"));
}
#[test]
#[cfg(feature = "wasm")]
fn test_optimize_for_minimal_size_returns_honest_error() {
let mut optimizer = WasmBundleOptimizer::new();
let result = optimizer.optimize_for_minimal_size();
assert!(result.is_err());
let message = result.unwrap_err().to_string();
assert!(message.contains("not implemented"));
assert!(message.contains("optimize_for_minimal_size"));
}
#[test]
#[cfg(feature = "wasm")]
fn test_detect_simd_support_returns_honest_error() {
let optimizer = WasmBundleOptimizer::new();
let result = optimizer.detect_simd_support();
assert!(result.is_err());
let message = result.unwrap_err().to_string();
assert!(message.contains("not implemented"));
assert!(message.contains("detect_simd_support"));
}
#[test]
#[cfg(feature = "wasm")]
fn test_default_matches_new() {
let default_optimizer = WasmBundleOptimizer::default();
assert!(default_optimizer.optimizations.dead_code_elimination);
assert!(default_optimizer.tree_shaking.aggressive);
assert!(default_optimizer.compression.brotli);
}
}