use std::collections::BTreeMap;
use serde::{Deserialize, Serialize};
use super::homoiconic::{PsiTermDto, TermInputDto};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct BindingDto {
pub variable_term_id: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub variable_name: Option<String>,
pub bound_to_term_id: String,
pub bound_to_display: String,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct HomoiconicSubstitutionDto {
#[serde(default)]
pub bindings: Vec<BindingDto>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ProofDto {
pub goal_term_id: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub rule_term_id: Option<String>,
pub substitution: HomoiconicSubstitutionDto,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub subproofs: Vec<ProofDto>,
pub certainty: f64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ProvenanceTagDto {
pub fact_index: u64,
pub confidence: f64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SolutionDto {
pub substitution: HomoiconicSubstitutionDto,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub proof: Option<ProofDto>,
pub certainty: f64,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub evidence_matched: Option<u64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub evidence_ratio: Option<f64>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub residuated_sorts: Vec<String>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum GuardOp {
Lt,
Lte,
Gt,
Gte,
Eq,
Ne,
}
impl GuardOp {
pub fn as_str(&self) -> &'static str {
match self {
Self::Lt => "lt",
Self::Lte => "lte",
Self::Gt => "gt",
Self::Gte => "gte",
Self::Eq => "eq",
Self::Ne => "ne",
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum AllenRelation {
Before,
After,
Meets,
MetBy,
Overlaps,
OverlappedBy,
During,
Contains,
Starts,
StartedBy,
Finishes,
FinishedBy,
Equals,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(tag = "type")]
pub enum ConstraintInputDto {
Guard {
left: String,
op: String,
right: String,
},
Equality {
var1: String,
var2: String,
},
Disequality {
var1: String,
var2: String,
},
Allen {
interval_a: String,
interval_b_term_id: String,
relation: String,
},
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct LiteralInputDto {
pub term: TermInputDto,
#[serde(default, skip_serializing_if = "std::ops::Not::not")]
pub negated: bool,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct BackwardChainRequest {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub goal: Option<TermInputDto>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub goal_id: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub save_goal: Option<bool>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub open_world: Option<bool>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub max_depth: Option<u32>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub max_solutions: Option<u32>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub min_certainty: Option<f64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub timeout_ms: Option<u64>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub constraints: Vec<ConstraintInputDto>,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct BackwardChainResponse {
#[serde(default)]
pub solutions: Vec<SolutionDto>,
#[serde(default)]
pub query_time_ms: u64,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub goal_id: Option<String>,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct ForwardChainRequest {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub initial_facts: Option<Vec<TermInputDto>>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub persist_derived: Option<bool>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub enable_provenance_tags: Option<bool>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub max_iterations: Option<u32>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub max_facts: Option<u32>,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct ForwardChainResponse {
#[serde(default)]
pub derived_facts: Vec<PsiTermDto>,
#[serde(default)]
pub derived_count: u64,
#[serde(default)]
pub iterations: u32,
#[serde(default)]
pub total_facts: u64,
#[serde(default)]
pub materialization_time_ms: u64,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub persisted_count: Option<u64>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub provenance_tags: Vec<ProvenanceTagDto>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct AddRuleRequest {
pub term: TermInputDto,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub antecedents: Vec<TermInputDto>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub certainty: Option<f64>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct AddFactRequest {
pub term: TermInputDto,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct BulkAddRulesRequest {
pub rules: Vec<AddRuleRequest>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct BulkAddFactsRequest {
pub facts: Vec<TermInputDto>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct AddFactResponse {
pub term: PsiTermDto,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct AddRuleResponse {
pub term: PsiTermDto,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct BulkAddRulesResponse {
#[serde(default)]
pub rule_term_ids: Vec<String>,
#[serde(default)]
pub rules_added: u64,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct BulkAddFactsResponse {
#[serde(default)]
pub facts_added: u64,
#[serde(default)]
pub term_ids: Vec<String>,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct GetFactsResponse {
#[serde(default)]
pub count: u64,
#[serde(default)]
pub facts: Vec<PsiTermDto>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ClearFactsResponse {
pub facts_cleared: u64,
pub message: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct GoalDto {
pub sort: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub sort_id: Option<String>,
#[serde(default, skip_serializing_if = "BTreeMap::is_empty")]
pub features: BTreeMap<String, serde_json::Value>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CreateGoalRequest {
pub clauses: Vec<TermInputDto>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub constraints: Vec<ConstraintInputDto>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub min_degree: Option<f64>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CreateGoalResponse {
pub goal_id: String,
pub goal: PsiTermDto,
pub clause_count: u64,
pub constraint_count: u64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct DeleteGoalResponse {
pub deleted: bool,
pub goal_id: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub references_deleted: Option<u64>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct GoalSummaryDto {
pub goal_id: String,
pub clause_count: u64,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub min_degree: Option<f64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub created_at: Option<String>,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct ListGoalsResponse {
pub count: u64,
#[serde(default)]
pub goals: Vec<GoalSummaryDto>,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct FuzzyProveRequest {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub goal: Option<TermInputDto>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub goal_id: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub min_degree: Option<f64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub max_solutions: Option<u32>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub open_world: Option<bool>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub save_goal: Option<bool>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub tnorm: Option<String>,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct FuzzyProveResponse {
#[serde(default)]
pub solutions: Vec<SolutionDto>,
#[serde(default)]
pub query_time_ms: u64,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub goal_id: Option<String>,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct BulkFuzzyProveRequest {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub goal_ids: Option<Vec<String>>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub goals: Vec<TermInputDto>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub max_depth: Option<u32>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub max_solutions: Option<u32>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub min_degree: Option<f64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub save_goals: Option<bool>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub tnorm: Option<String>,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct BulkFuzzyProveResponse {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub goal_ids: Option<Vec<String>>,
#[serde(default)]
pub results: Vec<FuzzyProveResponse>,
#[serde(default)]
pub total_time_ms: u64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(tag = "shape", rename_all = "lowercase")]
pub enum BayesianEffectDto {
Gaussian { mean: f64, std_dev: f64 },
Triangular { a: f64, b: f64, c: f64 },
Trapezoidal { a: f64, b: f64, c: f64, d: f64 },
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct BayesianPredictRequest {
pub effect_var: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub goal: Option<TermInputDto>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub goal_id: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub max_depth: Option<u32>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub min_degree: Option<f64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub conformal: Option<f64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub robust: Option<bool>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub save_goal: Option<bool>,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct BayesianPredictResponse {
#[serde(default)]
pub degree: f64,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub effect: Option<BayesianEffectDto>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub goal_id: Option<String>,
#[serde(default)]
pub proof_trace: Vec<String>,
#[serde(default)]
pub query_time_ms: u64,
#[serde(default)]
pub sources_merged: u64,
#[serde(default)]
pub success: bool,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct NafProveRequest {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub literals: Option<Vec<LiteralInputDto>>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub goal_id: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub max_depth: Option<u32>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub max_solutions: Option<u32>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub save_goal: Option<bool>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub timeout_ms: Option<u64>,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct NafProveResponse {
#[serde(default)]
pub solutions: Vec<SolutionDto>,
#[serde(default)]
pub query_time_ms: u64,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub goal_id: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct FactConfidenceEntry {
pub term_id: String,
pub confidence: f64,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct TaggedForwardChainRequest {
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub fact_confidences: Vec<FactConfidenceEntry>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub max_facts: Option<u32>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub max_iterations: Option<u32>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct TaggedDerivedFact {
pub term_id: String,
pub confidence: f64,
pub is_initial: bool,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub sort_name: Option<String>,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct TaggedForwardChainResponse {
#[serde(default)]
pub derived_count: u64,
#[serde(default)]
pub execution_time_ms: u64,
#[serde(default)]
pub facts: Vec<TaggedDerivedFact>,
#[serde(default)]
pub fixpoint_reached: bool,
#[serde(default)]
pub iterations: u32,
#[serde(default)]
pub total_facts: u64,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(transparent)]
pub struct MetaSortsResponse {
pub meta_sorts: BTreeMap<String, String>,
}
impl MetaSortsResponse {
pub fn get(&self, name: &str) -> Option<&str> {
self.meta_sorts.get(name).map(String::as_str)
}
}