Skip to main content

problemreductions/
config.rs

1//! Configuration utilities for problem solving.
2
3/// Convert a configuration index to a configuration vector.
4///
5/// The index is treated as a number in base `num_flavors`.
6pub fn index_to_config(index: usize, num_variables: usize, num_flavors: usize) -> Vec<usize> {
7    let mut config = vec![0; num_variables];
8    let mut remaining = index;
9    for i in (0..num_variables).rev() {
10        config[i] = remaining % num_flavors;
11        remaining /= num_flavors;
12    }
13    config
14}
15
16/// Convert a configuration vector to an index.
17///
18/// The configuration is treated as digits in base `num_flavors`.
19pub fn config_to_index(config: &[usize], num_flavors: usize) -> usize {
20    let mut index = 0;
21    for &value in config {
22        index = index * num_flavors + value;
23    }
24    index
25}
26
27/// Convert a binary configuration to a bitvec-style representation.
28pub(crate) fn config_to_bits(config: &[usize]) -> Vec<bool> {
29    config.iter().map(|&v| v != 0).collect()
30}
31
32/// Convert a bitvec-style representation to a binary configuration.
33pub(crate) fn bits_to_config(bits: &[bool]) -> Vec<usize> {
34    bits.iter().map(|&b| if b { 1 } else { 0 }).collect()
35}
36
37#[cfg(test)]
38#[path = "unit_tests/config.rs"]
39mod tests;