use crate::composition::Composition;
use crate::evidence::PlanningEvidence;
use crate::precursor::PrecursorSelection;
use crate::process::{PlannedStep, RouteFamily};
use crate::provenance::PlanningProvenance;
use crate::reaction::BalancedReaction;
use crate::rejection::RejectedCandidate;
use crate::route_suitability::{RouteSuitabilityAssessment, SuitabilityFinding};
use crate::score::{ConfidenceAssessment, PlanScoreBreakdown, PlanningAssumption};
pub const SCHEMA_VERSION: u32 = 1;
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct TargetSummary {
pub composition: Composition,
pub structure_present: bool,
pub desired_phase: Option<String>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum ApplicabilityLevel {
InDomain,
PartiallyInDomain,
OutOfDomain,
}
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct ApplicabilityAssessment {
pub level: ApplicabilityLevel,
pub rationale: Vec<String>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum WarningSeverity {
Info,
Caution,
Severe,
}
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct PlanningWarning {
pub message: String,
pub severity: WarningSeverity,
}
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct UnresolvedRequirement {
pub description: String,
pub reason: String,
}
#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct PlanId(pub String);
impl std::fmt::Display for PlanId {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.write_str(&self.0)
}
}
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct SynthesisPlan {
pub plan_id: PlanId,
pub route_family: RouteFamily,
pub precursors: Vec<PrecursorSelection>,
pub balanced_reaction: Option<BalancedReaction>,
pub steps: Vec<PlannedStep>,
pub score: PlanScoreBreakdown,
pub confidence: ConfidenceAssessment,
pub applicability: ApplicabilityAssessment,
pub evidence: Vec<PlanningEvidence>,
pub warnings: Vec<PlanningWarning>,
pub assumptions: Vec<PlanningAssumption>,
pub unresolved: Vec<UnresolvedRequirement>,
pub manual_review_required: bool,
}
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct NotRecommendedPlan {
pub plan: SynthesisPlan,
pub contradicting_findings: Vec<SuitabilityFinding>,
}
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct SynthesisPlanningReport {
pub schema_version: u32,
pub target: TargetSummary,
pub applicability: ApplicabilityAssessment,
pub route_suitability: Vec<RouteSuitabilityAssessment>,
pub plans: Vec<SynthesisPlan>,
pub not_recommended: Vec<NotRecommendedPlan>,
pub rejected_candidates: Vec<RejectedCandidate>,
pub unresolved: Vec<UnresolvedRequirement>,
pub warnings: Vec<PlanningWarning>,
pub provenance: PlanningProvenance,
}