mod brick_tuner;
mod data_collector;
pub mod error;
mod evolution;
mod features;
pub(crate) mod helpers;
mod models;
pub mod pretrained;
mod types;
pub use brick_tuner::{BrickTuner, ExperimentSuggestion, TunerRecommendation};
pub use data_collector::{
ConceptDriftStatus, TrainingSample, TrainingStats, TunerDataCollector, UserFeedback,
};
pub use error::TunerError;
pub use evolution::{CalibrationResult, KernelArm, KernelBandit, OnlineLearner};
pub use features::{FeatureExtractor, RunConfig, TunerFeatures, TunerFeaturesBuilder};
pub use models::{
BottleneckClassifier, BottleneckPrediction, KernelClassifier, KernelRecommendation,
ThroughputPrediction, ThroughputRegressor,
};
pub use types::{BottleneckClass, KernelType, QuantType};
#[cfg(test)]
pub(crate) use helpers::{chrono_lite_now, pad_right};
use crate::brick::BrickProfiler;
impl BrickProfiler {
pub fn get_tuner_recommendations(&self, config: &RunConfig) -> Option<TunerRecommendation> {
if !self.is_enabled() {
return None;
}
let extractor = FeatureExtractor::new();
let features = extractor.extract(self, config);
let tuner = BrickTuner::new();
Some(tuner.recommend(&features))
}
pub fn print_tuner_recommendations(&self, config: &RunConfig) {
if let Some(rec) = self.get_tuner_recommendations(config) {
let tuner = BrickTuner::new();
tuner.print_recommendation(&rec);
} else {
println!("Tuner recommendations not available (profiler disabled)");
}
}
pub fn tokens_per_sec(&self) -> Option<f32> {
let total_ns = self.total_ns();
let total_tokens = self.total_tokens();
if total_ns == 0 || total_tokens == 0 {
return None;
}
Some(total_tokens as f32 * 1e9 / total_ns as f32)
}
}
#[cfg(test)]
mod tests;