mod builders;
mod sections;
mod state;
#[cfg(test)]
mod tests;
pub mod writer;
pub use state::{extract_mps_name, parse_mps};
use crate::lexer::RawCoefficient;
use crate::model::SOSType;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub(super) enum MpsSection {
Name,
ObjSense,
Rows,
Columns,
Rhs,
Ranges,
Bounds,
Sos,
Unsupported,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub(super) enum RowType {
N,
L,
G,
E,
}
#[derive(Debug, Default)]
pub(super) struct BoundAccumulator {
pub(super) lower: Option<f64>,
pub(super) upper: Option<f64>,
pub(super) fixed: Option<f64>,
pub(super) free: bool,
pub(super) binary: bool,
}
pub(super) const MAX_FIELDS: usize = 8;
pub(super) fn split_fields(line: &str) -> ([&str; MAX_FIELDS], usize) {
debug_assert!(!line.is_empty(), "split_fields called with empty line");
let mut buf = [""; MAX_FIELDS];
let mut len = 0;
for field in line.split_whitespace() {
if field.starts_with('$') || len == MAX_FIELDS {
break;
}
buf[len] = field;
len += 1;
}
debug_assert!(len <= MAX_FIELDS, "field count cannot exceed buffer length");
(buf, len)
}