1
use oxidd::ManagerRef;
2
use oxidd::ldd::LDDFunction;
3
use oxidd::ldd::LDDManagerRef;
4
use oxidd::ldd::Value;
5
use rand::Rng;
6
use rand::RngExt;
7
use std::collections::HashSet;
8

            
9
/// Returns a vector of the given length with random u64 values (from 0..max_value).
10
132600
pub fn random_vector<R: Rng>(rng: &mut R, length: usize, max_value: Value) -> Vec<Value> {
11
132600
    let mut vector: Vec<Value> = Vec::new();
12
1290320
    for _ in 0..length {
13
1290320
        vector.push(rng.random_range(0..max_value));
14
1290320
    }
15

            
16
132600
    vector
17
132600
}
18

            
19
/// Returns a set of 'amount' vectors where every vector has the given length.
20
4700
pub fn random_vector_set<R: Rng>(rng: &mut R, amount: usize, length: usize, max_value: Value) -> HashSet<Vec<Value>> {
21
4700
    let mut result: HashSet<Vec<Value>> = HashSet::new();
22

            
23
    // Insert 'amount' number of vectors into the result.
24
132600
    for _ in 0..amount {
25
132600
        result.insert(random_vector(rng, length, max_value));
26
132600
    }
27

            
28
4700
    result
29
4700
}
30

            
31
/// Returns an LDD containing all elements of the given iterator over vectors.
32
4708
pub fn from_iter<'a, I>(manager: &LDDManagerRef, iter: I) -> LDDFunction
33
4708
where
34
4708
    I: Iterator<Item = &'a Vec<Value>>,
35
{
36
4708
    let mut result = manager
37
4708
        .with_manager_shared(|m| LDDFunction::empty_set(m))
38
4708
        .expect("Failed to create the empty set");
39

            
40
91936
    for vector in iter {
41
91936
        let single = manager
42
91936
            .with_manager_shared(|m| LDDFunction::singleton(m, vector))
43
91936
            .expect("Failed to create a singleton");
44
91936
        result = result.union(&single).expect("Failed to compute the union");
45
    }
46

            
47
4708
    result
48
4708
}