use serde::{Deserialize, Serialize};
pub type BreedName = String;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct BreedNodeConfig {
pub breed: BreedName,
pub params: serde_json::Value,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct BreedPipeline {
pub id: String,
pub nodes: Vec<BreedNodeConfig>,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub enum PipelineBoundedStatus {
Admitted,
Partial,
Unknown,
Refused,
Blocked,
}
impl PipelineBoundedStatus {
pub fn as_str(&self) -> &'static str {
match self {
Self::Admitted => "ADMITTED",
Self::Partial => "PARTIAL",
Self::Unknown => "UNKNOWN",
Self::Refused => "REFUSED",
Self::Blocked => "BLOCKED",
}
}
}
impl std::fmt::Display for PipelineBoundedStatus {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.write_str(self.as_str())
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct PipelineEvalResult {
pub pipeline_id: String,
pub fitness: f64,
pub status: PipelineBoundedStatus,
pub node_statuses: Vec<BreedNodeStatus>,
pub summary: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct BreedNodeStatus {
pub breed: BreedName,
pub status: PipelineBoundedStatus,
pub detail: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct PipelineSearchConfig {
pub population_size: usize,
pub generations: usize,
pub mutation_rate: f64,
pub admission_threshold: f64,
pub max_pipeline_length: usize,
pub min_pipeline_length: usize,
}
impl Default for PipelineSearchConfig {
fn default() -> Self {
Self {
population_size: 20,
generations: 10,
mutation_rate: 0.1,
admission_threshold: 0.7,
max_pipeline_length: 5,
min_pipeline_length: 1,
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct PipelineSearchResult {
pub status: PipelineBoundedStatus,
pub best_pipeline: Option<BreedPipeline>,
pub best_fitness: f64,
pub generations_run: usize,
pub evaluations: usize,
pub summary: String,
}