use std::collections::BTreeMap;
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct RlPolicyConfigDto {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub discount_factor: Option<f64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub exploration_decay: Option<f64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub exploration_rate: Option<f64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub learning_rate: Option<f64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub min_exploration: Option<f64>,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct RlTrainRequest {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub curiosity_bonus_amount: Option<f64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub enable_auto_curriculum: Option<bool>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub enable_cognitive_cycle: Option<bool>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub enable_curiosity_bonus: Option<bool>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub enable_deliberation_scaling: Option<bool>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub enable_expert_gating: Option<bool>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub enable_imagination_learning: Option<bool>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub enable_neural_dqn: Option<bool>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub enable_ontological_grounding: Option<bool>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub enable_plasticity_schedule: Option<bool>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub enable_self_play: Option<bool>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub enable_state_encoder: Option<bool>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub enable_world_model: Option<bool>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub encoding_dim: Option<u32>,
pub environment_name: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub expert_gate_entropy_coefficient: Option<f64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub expert_gate_learning_rate: Option<f64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub expert_gate_temperature: Option<f64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub hidden_dim: Option<u32>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub max_steps_per_episode: Option<u32>,
pub num_episodes: u32,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub rl_config: Option<RlPolicyConfigDto>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub self_play_exchange_mode: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub self_play_num_agents: Option<u32>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub self_play_num_rounds: Option<u32>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub self_play_quality_threshold: Option<f64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub self_play_social_observation: Option<bool>,
pub tenant_id: String,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct RlTrainResponse {
#[serde(default)]
pub avg_reward_last_10: f64,
#[serde(default)]
pub cognitive_cycles_run: u64,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub collapse_episodes: Option<Vec<u64>>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub contrastive_losses: Option<Vec<f64>>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub curriculum_adjustments: Option<u64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub curriculum_backtracks: Option<u64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub curriculum_stage_reached: Option<u64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub deliberative_decisions: Option<u64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub dynamics_losses: Option<Vec<f64>>,
#[serde(default)]
pub episode_rewards: Vec<f64>,
#[serde(default)]
pub episode_steps: Vec<u64>,
#[serde(default)]
pub episodes_completed: u64,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub expert_avg_entropy: Option<f64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub expert_avg_weights: Option<BTreeMap<String, f64>>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub expert_collapse_recoveries: Option<u64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub expert_final_weights: Option<BTreeMap<String, f64>>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub final_contrastive_temperature: Option<f64>,
#[serde(default)]
pub final_exploration_rate: f64,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub final_imagination_steps: Option<u64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub imagination_transitions: Option<u64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub mode_distribution: Option<BTreeMap<String, f64>>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub peer_demonstrations_consumed: Option<u64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub plasticity_phase_transitions: Option<Vec<Vec<serde_json::Value>>>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub reactive_decisions: Option<u64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub self_play_agent_fitnesses: Option<Vec<Vec<f64>>>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub self_play_best_fitness: Option<f64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub self_play_mean_fitness_per_round: Option<Vec<f64>>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub sort_aware_training_steps: Option<u64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub sorts_discovered: Option<u64>,
#[serde(default)]
pub total_transitions: u64,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub trajectories_exchanged: Option<u64>,
}