use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default, Serialize, Deserialize)]
#[serde(rename_all = "lowercase")]
pub enum AffectValence {
Positive,
Negative,
#[default]
Neutral,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct AffectState {
pub arousal: f64,
pub valence: AffectValence,
pub certainty: f64,
pub sustained: f64,
}
impl Default for AffectState {
fn default() -> Self {
Self {
arousal: 0.0,
valence: AffectValence::Neutral,
certainty: 0.5,
sustained: 1.0,
}
}
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct TopicBeliefs {
pub current: Vec<String>,
pub predicted: Vec<String>,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct Predictions {
pub next_topics: Vec<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SharedBeliefState {
pub affect: AffectState,
pub topic: TopicBeliefs,
pub predictions: Predictions,
pub turn: u32,
pub conversation_id: String,
}
impl SharedBeliefState {
pub fn new(conversation_id: String) -> Self {
Self {
affect: AffectState::default(),
topic: TopicBeliefs::default(),
predictions: Predictions::default(),
turn: 0,
conversation_id,
}
}
pub fn is_high_arousal(&self) -> bool {
self.affect.arousal >= 0.6
}
}
pub const LOW_AROUSAL_CERTAINTY: f64 = 0.3;
pub const HIGH_AROUSAL_CERTAINTY: f64 = 0.8;
pub const PREDICTION_TOPIC_COUNT: usize = 5;