#[derive(Debug, Clone, Copy, PartialEq, Eq, serde::Serialize)]
pub enum ModelType {
Cp,
Lp,
}
#[derive(Debug, Clone, PartialEq, serde::Serialize)]
pub struct JiaModel {
pub model_type: Option<ModelType>,
pub name: String,
pub variables: Vec<VarDecl>,
pub domains: Vec<DomainStmt>,
pub constraints: Vec<Constraint>,
pub objective: Option<Objective>,
}
#[derive(Debug, Clone, PartialEq, serde::Serialize)]
pub struct VarDecl {
pub names: Vec<String>,
pub var_type: VarType,
}
#[derive(Debug, Clone, PartialEq, Eq, serde::Serialize)]
pub enum VarType {
Interval,
Integer,
Real,
SetInterval,
SetInteger,
}
#[derive(Debug, Clone, PartialEq, serde::Serialize)]
pub enum DomainStmt {
IntervalDuration {
intervals: Vec<String>,
domain: Domain,
},
IntervalStart {
intervals: Vec<String>,
domain: Domain,
},
IntervalEnd {
intervals: Vec<String>,
domain: Domain,
},
IntervalOptional {
intervals: Vec<String>,
},
IntegerDomain {
name: String,
domain: Domain,
},
SetDomain {
name: String,
members: Vec<String>,
},
RealDomain {
name: String,
domain: Domain,
},
Demand {
interval: String,
set: String,
value: i64,
},
}
#[derive(Debug, Clone, PartialEq, serde::Serialize)]
pub enum Domain {
Fixed(i64),
Range {
min: i64,
max: i64,
},
Enumerated(Vec<i64>),
RealFixed(f64),
RealRange {
min: f64,
max: f64,
},
}
#[derive(Debug, Clone, PartialEq, serde::Serialize)]
pub enum Constraint {
NoOverlap {
intervals: Vec<String>,
},
Cumulative {
set: String,
capacity: Expr,
},
Span {
parent: String,
set: String,
},
Alternative {
parent: String,
set: String,
},
Comparison {
left: Expr,
op: CmpOp,
right: Expr,
},
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, serde::Serialize)]
pub enum CmpOp {
Lt,
Le,
Gt,
Ge,
Eq,
Ne,
}
#[derive(Debug, Clone, PartialEq, serde::Serialize)]
pub enum Expr {
Number(i64),
Float(f64),
Var(String),
StartOf(String),
EndOf(String),
DurationOf(String),
PresentOf(String),
BinaryOp {
op: ArithOp,
left: Box<Expr>,
right: Box<Expr>,
},
Negate(Box<Expr>),
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, serde::Serialize)]
pub enum ArithOp {
Add,
Sub,
Mul,
Div,
}
#[derive(Debug, Clone, PartialEq, serde::Serialize)]
pub struct Objective {
pub direction: OptDirection,
pub expr: Expr,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, serde::Serialize)]
pub enum OptDirection {
Minimize,
Maximize,
}
impl std::fmt::Display for CmpOp {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
CmpOp::Lt => write!(f, "<"),
CmpOp::Le => write!(f, "<="),
CmpOp::Gt => write!(f, ">"),
CmpOp::Ge => write!(f, ">="),
CmpOp::Eq => write!(f, "=="),
CmpOp::Ne => write!(f, "!="),
}
}
}
impl std::fmt::Display for ArithOp {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
ArithOp::Add => write!(f, "+"),
ArithOp::Sub => write!(f, "-"),
ArithOp::Mul => write!(f, "*"),
ArithOp::Div => write!(f, "/"),
}
}
}