use crate::descriptor::from_nat;
use crate::{CombinationSpace, RankAdapterError};
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct CombinationSpaceDemo {
pub descriptor_id: &'static str,
pub n: usize,
pub k: usize,
pub combination: Vec<usize>,
pub rank: String,
pub unranked: Vec<usize>,
}
pub fn combination_space_demo() -> Result<CombinationSpaceDemo, RankAdapterError> {
let space = CombinationSpace { n: 6, k: 3 };
let descriptor = space.descriptor();
let combination = vec![0, 2, 4];
let rank = space.rank(&combination)?;
let unranked = space.unrank(&rank)?;
Ok(CombinationSpaceDemo {
descriptor_id: descriptor.id,
n: space.n,
k: space.k,
combination,
rank: from_nat(&rank).to_string(),
unranked,
})
}
#[cfg(test)]
mod tests {
use super::*;
use sim_lib_rank::Nat;
#[test]
fn combination_space_demo_round_trips_rank() {
let demo = combination_space_demo().expect("valid combination space demo");
assert_eq!(demo.descriptor_id, "rank/discrete/combination");
assert_eq!(demo.unranked, demo.combination);
let ordinal = demo.rank.parse::<u64>().expect("rank is a u64 fixture");
assert_eq!(
CombinationSpace {
n: demo.n,
k: demo.k
}
.unrank(&Nat::from(ordinal))
.unwrap(),
demo.combination
);
}
}