use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct SortDiscoveryRequest {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub max_concepts: Option<u32>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub min_extent_size: Option<u32>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub min_intent_size: Option<u32>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub max_terms: Option<u32>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub min_confidence: Option<f64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub auto_create_sorts: Option<bool>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub auto_create_threshold: Option<f64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub fuzzy_thresholds: Option<Vec<f64>>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SortRecommendation {
pub sort_name: String,
#[serde(default)]
pub features: Vec<String>,
pub term_count: u64,
pub confidence: f64,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub parent_sort: Option<String>,
pub explanation: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct FuzzyConceptLevel {
pub alpha: f64,
pub concept_count: u64,
pub novel_at_this_level: u64,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct SortDiscoveryResponse {
pub success: bool,
#[serde(default)]
pub terms_analyzed: u64,
#[serde(default)]
pub total_concepts: u64,
#[serde(default)]
pub concepts_matching_existing: u64,
#[serde(default)]
pub novel_concepts_discovered: u64,
#[serde(default)]
pub sorts_created: Vec<String>,
#[serde(default)]
pub recommendations: Vec<SortRecommendation>,
#[serde(default)]
pub processing_time_ms: u64,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub fuzzy_levels: Option<Vec<serde_json::Value>>,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct StartExplorationRequest {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub max_concepts: Option<u32>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub min_extent_size: Option<u32>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub min_intent_size: Option<u32>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub max_terms: Option<u32>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ExplorationQuestion {
pub premise: Vec<String>,
pub conclusion: Vec<String>,
pub question_text: String,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct StartExplorationResponse {
pub session_id: String,
pub attribute_count: u64,
pub object_count: u64,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub question: Option<ExplorationQuestion>,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct ExplorationProgress {
pub implications_confirmed: u64,
pub implications_refuted: u64,
pub counterexamples_added: u64,
pub is_complete: bool,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct ConfirmResponse {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub next_question: Option<ExplorationQuestion>,
pub progress: ExplorationProgress,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct RefuteRequest {
pub label: String,
pub features: Vec<String>,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct RefuteResponse {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub next_question: Option<ExplorationQuestion>,
pub progress: ExplorationProgress,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Implication {
pub premise: Vec<String>,
pub conclusion: Vec<String>,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct ExplorationStatusResponse {
pub session_id: String,
pub progress: ExplorationProgress,
#[serde(default)]
pub confirmed_implications: Vec<Implication>,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct ExplorationCompleteResponse {
pub total_implications: u64,
#[serde(default)]
pub implications: Vec<Implication>,
pub counterexamples_added: u64,
pub rules_created: u64,
}