reasoninglayer 0.2.1

Rust client SDK for the Reasoning Layer API
Documentation
//! Analysis / FCA DTOs.

use serde::{Deserialize, Serialize};

// ─── Sort discovery ──────────────────────────────────────────────────────────

#[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>>,
}

// ─── Attribute exploration ───────────────────────────────────────────────────

#[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,
}