ommx 2.5.1

Open Mathematical prograMming eXchange (OMMX)
Documentation
use super::*;
use crate::{v1, Message, Parse};
use anyhow::Result;

impl NamedFunction {
    pub fn to_bytes(&self) -> Vec<u8> {
        let v1_named_function = v1::NamedFunction::from(self.clone());
        v1_named_function.encode_to_vec()
    }

    pub fn from_bytes(bytes: &[u8]) -> Result<Self> {
        let inner = v1::NamedFunction::decode(bytes)?;
        Ok(Parse::parse(inner, &())?)
    }
}

impl EvaluatedNamedFunction {
    pub fn to_bytes(&self) -> Vec<u8> {
        let v1_evaluated_named_function = v1::EvaluatedNamedFunction::from(self.clone());
        v1_evaluated_named_function.encode_to_vec()
    }

    pub fn from_bytes(bytes: &[u8]) -> Result<Self> {
        let inner = v1::EvaluatedNamedFunction::decode(bytes)?;
        Ok(Parse::parse(inner, &())?)
    }
}

impl SampledNamedFunction {
    pub fn to_bytes(&self) -> Vec<u8> {
        let v1_sampled_named_function = v1::SampledNamedFunction::from(self.clone());
        v1_sampled_named_function.encode_to_vec()
    }

    pub fn from_bytes(bytes: &[u8]) -> Result<Self> {
        let inner = v1::SampledNamedFunction::decode(bytes)?;
        Ok(Parse::parse(inner, &())?)
    }
}

#[cfg(test)]
mod tests {
    use super::*;
    use crate::{Coefficient, Function};

    #[test]
    fn test_named_function_bytes_roundtrip() {
        let nf = NamedFunction {
            id: NamedFunctionID::from(5),
            function: Function::Constant(Coefficient::try_from(3.14).unwrap()),
            name: Some("test_func".to_string()),
            subscripts: vec![1, 2, 3],
            parameters: {
                let mut params = fnv::FnvHashMap::default();
                params.insert("key".to_string(), "value".to_string());
                params
            },
            description: Some("roundtrip test".to_string()),
        };

        let bytes = nf.to_bytes();
        let restored = NamedFunction::from_bytes(&bytes).unwrap();

        assert_eq!(nf, restored);
    }

    #[test]
    fn test_evaluated_named_function_bytes_roundtrip() {
        let enf = EvaluatedNamedFunction {
            id: NamedFunctionID::from(10),
            evaluated_value: 99.5,
            name: Some("eval_func".to_string()),
            subscripts: vec![4, 5],
            parameters: Default::default(),
            description: Some("evaluated roundtrip".to_string()),
            used_decision_variable_ids: [crate::VariableID::from(1), crate::VariableID::from(2)]
                .into_iter()
                .collect(),
        };

        let bytes = enf.to_bytes();
        let restored = EvaluatedNamedFunction::from_bytes(&bytes).unwrap();

        assert_eq!(enf, restored);
    }

    #[test]
    fn test_sampled_named_function_bytes_roundtrip() {
        let mut evaluated_values = crate::Sampled::default();
        evaluated_values
            .append([crate::SampleID::from(0)], 1.0)
            .unwrap();
        evaluated_values
            .append([crate::SampleID::from(1)], 2.0)
            .unwrap();

        let snf = SampledNamedFunction {
            id: NamedFunctionID::from(15),
            evaluated_values,
            name: Some("sampled_func".to_string()),
            subscripts: vec![7, 8, 9],
            parameters: {
                let mut params = fnv::FnvHashMap::default();
                params.insert("sample_key".to_string(), "sample_value".to_string());
                params
            },
            description: Some("sampled roundtrip".to_string()),
            used_decision_variable_ids: [crate::VariableID::from(3), crate::VariableID::from(4)]
                .into_iter()
                .collect(),
        };

        let bytes = snf.to_bytes();
        let restored = SampledNamedFunction::from_bytes(&bytes).unwrap();

        assert_eq!(snf, restored);
    }
}