#![cfg_attr(feature = "no_std", no_std)]
#[cfg(feature = "no_std")]
extern crate alloc;
#[cfg(feature = "no_std")]
use alloc::{vec, vec::Vec};
pub mod micro_inference;
pub mod quantized;
pub mod model;
pub mod attention;
pub mod embedding;
pub mod optimizations;
#[cfg(feature = "federation")]
pub mod federation;
#[cfg(feature = "federation")]
pub mod ruvector;
pub use micro_inference::{MicroEngine, InferenceConfig, InferenceResult};
pub use quantized::{QuantizedTensor, QuantizationType};
pub use model::{TinyModel, ModelConfig};
pub use optimizations::{
BinaryVector, BinaryEmbedding, hamming_distance, hamming_similarity,
ProductQuantizer, PQCode,
SoftmaxLUT, ExpLUT, DistanceLUT,
MicroLoRA, LoRAConfig,
SparseAttention, AttentionPattern,
LayerPruner, PruningConfig,
};
#[cfg(feature = "federation")]
pub use federation::{
FederationConfig, FederationMode, FederationSpeedup,
PipelineNode, PipelineConfig, PipelineRole,
FederationMessage, MessageType, ChipId,
FederationCoordinator, ClusterTopology,
MicroFastGRNN, MicroGRNNConfig,
SpeculativeDecoder, DraftVerifyConfig,
};
#[derive(Debug, Clone, Copy)]
pub enum Esp32Variant {
Esp32,
Esp32S2,
Esp32S3,
Esp32C3,
Esp32C6,
}
impl Esp32Variant {
pub const fn sram_bytes(&self) -> usize {
match self {
Self::Esp32 => 520 * 1024,
Self::Esp32S2 => 320 * 1024,
Self::Esp32S3 => 512 * 1024,
Self::Esp32C3 => 400 * 1024,
Self::Esp32C6 => 512 * 1024,
}
}
pub const fn has_fpu(&self) -> bool {
match self {
Self::Esp32 => false,
Self::Esp32S2 => false,
Self::Esp32S3 => true,
Self::Esp32C3 => false,
Self::Esp32C6 => false,
}
}
pub const fn has_simd(&self) -> bool {
matches!(self, Self::Esp32S3)
}
pub const fn max_model_ram(&self) -> usize {
self.sram_bytes().saturating_sub(200 * 1024)
}
}
#[derive(Debug, Clone)]
pub enum Error {
ModelTooLarge { required: usize, available: usize },
InvalidModel(&'static str),
QuantizationError(&'static str),
BufferOverflow,
InferenceFailed(&'static str),
UnsupportedFeature(&'static str),
}
impl core::fmt::Display for Error {
fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
match self {
Error::ModelTooLarge { required, available } => {
write!(f, "Model too large: requires {} bytes, only {} available", required, available)
}
Error::InvalidModel(msg) => write!(f, "Invalid model: {}", msg),
Error::QuantizationError(msg) => write!(f, "Quantization error: {}", msg),
Error::BufferOverflow => write!(f, "Buffer overflow"),
Error::InferenceFailed(msg) => write!(f, "Inference failed: {}", msg),
Error::UnsupportedFeature(msg) => write!(f, "Unsupported feature: {}", msg),
}
}
}
#[cfg(feature = "host-test")]
impl std::error::Error for Error {}
pub type Result<T> = core::result::Result<T, Error>;
pub mod prelude {
pub use crate::{
MicroEngine, InferenceConfig, InferenceResult,
QuantizedTensor, QuantizationType,
TinyModel, ModelConfig,
Esp32Variant, Error, Result,
};
}