entrenar/citl/trainer/citl/types.rs
1//! Type definitions for the CITL trainer
2
3use super::super::stats::Session;
4use super::super::{CITLConfig, DecisionStats};
5use crate::citl::DecisionPatternStore;
6use std::collections::HashMap;
7
8/// Compiler-in-the-Loop (CITL) trainer
9///
10/// Correlates compiler decision traces with compilation outcomes
11/// to identify error-contributing decisions and suggest fixes.
12///
13/// # Example
14///
15/// ```ignore
16/// use entrenar::citl::{DecisionCITL, DecisionTrace, CompilationOutcome, SourceSpan};
17///
18/// let mut trainer = DecisionCITL::new()?;
19///
20/// // Ingest a failed session
21/// let traces = vec![
22/// DecisionTrace::new("d1", "type_inference", "Inferred type i32")
23/// .with_span(SourceSpan::line("main.rs", 5)),
24/// ];
25/// let outcome = CompilationOutcome::failure(
26/// vec!["E0308".to_string()],
27/// vec![SourceSpan::line("main.rs", 5)],
28/// vec!["mismatched types".to_string()],
29/// );
30///
31/// trainer.ingest_session(traces, outcome, None)?;
32///
33/// // Correlate errors
34/// let correlations = trainer.correlate_error("E0308", &SourceSpan::line("main.rs", 5))?;
35/// ```
36pub struct DecisionCITL {
37 /// Pattern store for fix suggestions
38 pub(crate) pattern_store: DecisionPatternStore,
39 /// Sessions indexed by outcome type
40 pub(crate) success_sessions: Vec<Session>,
41 pub(crate) failed_sessions: Vec<Session>,
42 /// Decision frequency in successful vs failed sessions (for Tarantula)
43 pub(crate) decision_stats: HashMap<String, DecisionStats>,
44 /// Configuration
45 pub(crate) config: CITLConfig,
46 /// Session counter
47 pub(crate) session_counter: u64,
48}
49
50impl std::fmt::Debug for DecisionCITL {
51 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
52 f.debug_struct("DecisionCITL")
53 .field("success_sessions", &self.success_sessions.len())
54 .field("failed_sessions", &self.failed_sessions.len())
55 .field("decision_types", &self.decision_stats.len())
56 .field("patterns", &self.pattern_store.len())
57 .field("config", &self.config)
58 .finish_non_exhaustive()
59 }
60}