diff --git a/src/pace/parameters/tree_decomposition.rs b/src/pace/parameters/tree_decomposition.rs index acd182c..e5422b9 100644 --- a/src/pace/parameters/tree_decomposition.rs +++ b/src/pace/parameters/tree_decomposition.rs @@ -1,4 +1,6 @@ use serde::de::{self, Deserialize, Deserializer, SeqAccess, Visitor}; +use serde::ser::SerializeSeq; +use serde::{Serialize, Serializer}; use std::fmt; type Node = u32; @@ -13,6 +15,22 @@ pub struct TreeDecomposition { pub edges: Vec<(Node, Node)>, } +impl Serialize for TreeDecomposition { + fn serialize(&self, serializer: S) -> Result + where + S: Serializer, + { + // 3-element tuple + let mut seq = serializer.serialize_seq(Some(3))?; + + seq.serialize_element(&self.treewidth)?; + seq.serialize_element(&self.bags)?; + seq.serialize_element(&self.edges)?; + + seq.end() + } +} + impl<'de> Deserialize<'de> for TreeDecomposition { fn deserialize(deserializer: D) -> Result where @@ -58,14 +76,22 @@ impl<'de> Deserialize<'de> for TreeDecomposition { #[cfg(test)] mod test { use crate::pace::parameters::tree_decomposition::TreeDecomposition; + const JSON: &str = "[2,[[8,16],[8,11,16],[1,11,15],[2,11,16],[7,8,11],[8,10,16],[3,10,13],[4,10,16],[8,9],[5,9,14],[6,9,12]],[[1,2],[1,6],[1,9],[2,3],[2,4],[2,5],[6,7],[6,8],[9,10],[9,11]]]"; #[test] - fn json_to_tree_decomp() { - const JSON: &str = "[2,[[8,16],[8,11,16],[1,11,15],[2,11,16],[7,8,11],[8,10,16],[3,10,13],[4,10,16],[8,9],[5,9,14],[6,9,12]],[[1,2],[1,6],[1,9],[2,3],[2,4],[2,5],[6,7],[6,8],[9,10],[9,11]]]"; + fn deserialize() { let td: TreeDecomposition = serde_json::from_str(JSON).unwrap(); assert_eq!(td.treewidth, 2); assert_eq!(td.bags.len(), 11); assert_eq!(td.edges.len(), 10); } + + #[test] + fn serialize() { + let td: TreeDecomposition = serde_json::from_str(JSON).unwrap(); + let serialized = serde_json::to_string(&td).unwrap(); + + assert_eq!(serialized, JSON); + } }